ArcGet.py: yet another XNAT command line downloader


The standard XNAT distribution provides a simple command line tool called ArcGet that helps you download your imaging data from XNAT to your local hard drive. Not surprisingly, the YAXIL version of ArcGet.py does pretty much the same thing, but with a few extra useful nuggets.

Basic Usage

If you want to download all scans for a MR Session, just use this

ArcGet.py -a xnatastic -s LABEL -o ./dicoms

If you know the scan numbers that you want to download, use the -r|--scans argument

ArcGet.py -a xnatastic -s LABEL -r 1 2 3 -o ./dicoms

If you know the scan types that you want to download, use the -t|--types argument

ArcGet.py -a xnatastic -s LABEL -t MEMPRAGE BOLD --output-dir ./dicoms

If you know the tasks that were coded into the scan notes field, use the -k|--tasks argument

ArcGet.py -a xnatastic -s LABEL -k ANAT1 REST1 -o ./dicoms

This functionality should more or less cover what you already know and love from classic ArcGet.

BIDS compatibility

By default ArcGet.py will download your data into a flat unstructured directory. This is nice, but there is a new standard in town when it comes to organizing your neuroimaging data on disk called BIDS.

To be brief, the BIDS specification wants you to store your functional scans in a func folder, your anatomical scans in an anat folder, your field distortion maps in a fmap folder, and so on. BIDS also wants you to convert your files to NIFTI format and name your files with useful pieces of information such as the subject, session, task, run, etc. You can read up on the full specification here.

The YAXIL version of ArcGet.py will help you download and save your data into a proper BIDS structure in two ways. The first way involves supplying a simple YAML formatted configuation file. Here is an example

func:
  bold:
    - scan: 12
      task: REST
      run: 1
    - scan: 16
      task: REST
      run: 2
    - scan: 28
      task: LANG
      run: 1
    - scan: 30
      task: LANG
      run: 2
fmap:
  magnitude1:
    - scan: 33
      run: 1
  phasediff:
    - scan 34
      run: 1
anat:
  T1w:
    - scan: 10
      run: 1
    - scan: 36
      run: 2

When you pass this file to ArcGet.py, you will end up with your data downloaded and converted to a proper BIDS structure

ArcGet.py -a xnatastic -s LABEL -c bids.yaml -o ./bids

Huzzah!

ArcGet.py also supports a second way to output your data to a BIDS structure that does not require a configuration file. By supplying the -b|--bids argument, ArcGet.py will use XNAT scan metadata and additional information coded into the scan note field. If you set your scan note field(s) to ANAT_001, REST_001, FMAPM, etc. these strings will be parsed and used to construct a proper BIDS structure

ArcGet.py -a xnatastic -s LABEL -k ANAT_001 REST_001 FMAPM -b -o ./bids

Internally, the -b|--bids argument will construct a configuration file similar to the one described above. The following table describes how BIDS data types and modalities are determined from scan types and note fields in XNAT

XNAT BIDS
type note type modality task run
ANAT_001 anat T1w
1
BOLD REST_001 func bold REST 1
BOLD REST2 func bold REST 2
FMAPM fmap magnitude1
1
FMAPP fmap phasediff
1