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 (beta)

Note that BIDS support is very new and very limited. It does not support the entire BIDS specification. If you’re interested in helping out, please fork the project and submit a merge request through GitHub!

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 most flexible way involves supplying a simple YAML formatted configuation file. Here is an example

func:
  bold:
    - scan: 12
      task: REST
      run: 1
      id: rest_1
    - scan: 16
      task: REST
      run: 2
      id: rest_2
    - scan: 28
      task: LANG
      run: 1
    - scan: 30
      task: LANG
      run: 2
fmap:
  epi:
    - scan: 24
      run: 1
      direction: LP
      intended for:
        - rest_1
        - rest_2
  magnitude1:
    - scan: 33
      run: 1
  phasediff:
    - scan: 34
      run: 1
anat:
  T1w:
    - scan: 10
      run: 1
    - scan: 36
      run: 2
  T2w:
    - scan: 12
      run: 1

If you’re familiar with the BIDS specification, the fields in the configuration file above should be self-explanatory. The only part I’ll explain is how to define the fieldmap IntendedFor field. For any fmap scan, you can insert an intended for field, followed by a list of references to any id fields under any of the func scans.

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