This library is a collection of Bash scripts, Slurm scripts, and R functions written for the processing of diffusion weighted imaging (DWI) and resting-state fMRI (rs-fMRI) data. The scripts start with just the raw DICOM images and perform steps up to network creation, based on the results from probtrackx2 for DWI and other methods for rs-fMRI. The Slurm scripts are appropriate for use on a high performance computing (HPC) system/cluster; I use the Texas Advanced Computing Center (TACC) systems.
The code has been written to work with projects following the
Brain Imaging Data Structure (BIDS).
That is, if you only supply a tar.gz file with DICOM images, the appropriate
BIDS-compliant directories will be created.
Note that this only applies to inputs or minimal processing (e.g., conversion to NIfTI);
while there are some BIDS Derivatives
proposals, nothing has found consistent use (to my knowledge). So I place some
output directories which will be described later.
The project directory is where all scripts will be run from;
its variable is ${projdir} and is automatically set as the working directory.
It is the top-level directory for your project; i.e., all relevant data should
be accessible from here.
When running the initial scripts, you will need to provide one of the following:
-
A
sourcedatadirectory, which contains BIDS-compliant subject directories and the DICOM files in${target}_dicom.tar.gzwithin that directory tree. In this case, you would not use the--tgzoption todti_dicom2nifti_bet.sh.Here, the
${target}variable should follow the BIDS spec; for example (with optional information in square brackets):sub-<studyID>[_ses-<sessionID>][_acq-<acquisition>]_dwi_dicom.tar.gz sub-<studyID>[_ses-<sessionID>]_task-rest[_acq-<acquisition>][_run-<runID>]_dicom.tar.gz
-
A
.tar.gzthat you provide as input to the initial script,dti_dicom2nifti_bet.sh. This.tar.gzfile MUST be either directly in${projdir}or you must provide the full path. This will be renamed to${target}_dicom.tar.gz(see above) and placed under thesourcedatadirectory.
To perform the most basic QC check — checking that image dimensions match — there must be a simple text file for each acquisition.
For example, if your DWI acquisition matrix is 96 x 96, there are 65 slices,
and 32 diffusion-weighted volumes + 1 non-diffusion weighted volume:
cat ${projdir}/data/sizes/dwi_size.txt
96 96 65 33If the files do not exist, the initial script will exit with an error.
If the files do exist, and the dimensions do not match, the data will be moved to the ${projdir}/unusable directory.
Subject-specific parcellations will be used as the sources/targets of the network (at least for DTI tractography).
The results from Freesurfer's recon-all should be in ${projdir}/freesurfer.
In addition to good-quality T1-weighted and DWI data, some software requirements are:
dcmtkfor reading from the DICOM headers- A recent version of
dcm2niix- The version I used at the time of writing is
v1.0.20181125 GCC4.8.5 (64-bit Linux)
- The version I used at the time of writing is
jofor writing out JSON files containing the parameters used for each tool. For example, it will record the-fvalue used withbet.jqalso processes JSON files.- FSL version >= 6.0.0
- The ImageMagick suite
- Available in the repositories for Red Hat-based systems (RHEL, CentOS, Scientific Linux)
Xvfb, the X Virtual Frame Buffereddyqc(bundled with FSL since v6.0.0)- Freesurfer version >= 5.3.0
- Required for parcellation, the results of which will be used in the tractography step
- R is required for
eddy-related movement QC.Ris available on all major OS's. Necessary packages include: - (Optional) A CUDA-capable GPU
(for
eddy_cudaandbedpostx_gpu)- If you don't have this, you can use
eddy_openmpand the regularbedpostxinstead; you'll have to change the code accordingly. - To run
bedpostxon a SLURM system without a GPU, you will need thelauncherutility
- If you don't have this, you can use
You can simply clone the repository and add it to your search path. Example:
git clone https://github.com/cwatson/mri_library.git
echo "export PATH=PATH:${PWD}/mri_library/bin" >> ~/.bash_profileIf you are on a cluster or other system that uses, e.g., .bashrc instead, you may have to add the path manually.
For CentOS 7, at least, this is available in the nux-dextop repository. If you don't already have this repo, run the following as root:
yum -y install http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
yum install dcmtk\*The version I use at the time of writing is v3.6.0.
If you are on Debian: sudo apt install dcmtk.
For other systems, you will probably have to install from source. See the DCMTK site for more information.
I prefer to clone the Github repository.
cd /usr/local
git clone git://github.com/rordenlab/dcm2niix.git
cd dcm2niix
mkdir build && cd build
cmake ..
make installThis utility can generate JSON from the command line.
To install it, follow the instructions on the jo repository page.
You will also need automake and autoconf.
cd /usr/local
git clone git://github.com/jpmens/jo.git
cd jo
autoreconf -i
./configure
make check
make installIf you are running CentOS 6, you will have to install the autoconf268 package, and then call autoreconf268 instead.
This should be in repositories for all major Linux OS's.
For both CentOS 6 and CentOS 7, it is in the epel repository,
with versions v1.3.2 and v1.5.1, respectively.
There should be a package readily available on most systems. On CentOS, it is called xorg-x11-server-Xvfb.
To install the latest version of FSL (which is v6.0.0 as of October 2018), you simply run their installer. This requires that you already have an older version of FSL on your system.
cd ${FSLDIR}
python fslinstaller.pyYou can find download and install instructions at the Freesurfer wiki.
The scripts will perform the following steps. Freesurfer's recon-all should be run before this (or before step 5, at least).
-
Run
dti_dicom2nift_bet.shto extract DICOM files and convert to NIfTI usingdcm2niix, skullstrip, and create images for QC purposes.- Renames and moves the
tgzfile to the correct, BIDS-compatible filename and location (if necessary) - Extracts the DICOM files from the
tgzfile and convert to NIfTI (usingdcm2niix) - Moves the
nii.gz,bvecs,bvals, andjsonfiles to the appropriate subject directory underrawdata. - Checks the image dimensions against the study's dimensions (specified by the user in a text file) via
qc_basic.sh. If this fails, the subject's data are moved to a directory calledunusable. - If there are multiple b0 volumes, they will be averaged when creating
nodif.nii.gz - Skullstrips the data using
bet. - Runs
dti_qc_bet.shto generate screenshots of the skullstripped data. See example images.
dti_dicom2nifti_bet.sh -s s001 --acq multishell --tgz s001_dicom.tar.gz # Creates the files: ${projdir}/rawdir/sub-s001/dwi/sub-s001_acq-multishell_dwi.{nii.gz,bval,bvec,json} # Creates the directory: ${projdir}/tractography/sub-s001/dwi/qc/bet/
- Renames and moves the
-
(manual) Check the quality of
betby viewing the images in${resdir}/qc/bet.- Re-run Step 1 if the skullstrip wasn't acceptable.
Do this by passing the
--rerunand-t|--thresholdoptions todti_dicom2nifti_bet.sh.
For example,
eog tractography/sub-s001/dwi/qc/bet/*.png dti_dicom2nifti_bet.sh -s s001 --acq multishell --rerun -t 0.4 - Re-run Step 1 if the skullstrip wasn't acceptable.
Do this by passing the
-
Run
eddyviadti_eddy.sh.- Also calculates
eddy-specific QC metrics viaeddy_quadfromeddyqc.
dti_eddy.sh -s s001 -acq multishell
- Also calculates
-
If you do not have a GPU but do have a SLURM scheduler, run BEDPOSTX via
dti_bedpostx_run.sh.- You will then also need to run
dti_bedpostx_postproc.sh. - If you do have a GPU, you can run
bedpostx_gpuon${projdir}/${resdir}. - If you have a system with an SGE scheduler, you can run
bedpostxnormally.
- You will then also need to run
-
Run the setup script
dti_reg_FS_to_diff.shto register the Freesurfer parcellation to diffusion space. -
Check the quality of the registration/parcellation by viewing the images produced from Step 5. See an example image.
-
Run the tractography via
dti_probtrackx2_run.sh. You can choose to use the GPU version, or you can run it in parallel (which requiresGNU parallel. -
Create connectivity matrices in which the entries are the estimated streamline counts between all region pairs, using the
Rscriptfsl_fdt_matrix.R. This creates a file calledfdt_network_matrix(assuming you haven't already runprobtrackx2in network mode). -
Create connectivity matrices in which the entries are the mean of some microstructural measure (e.g., FA) along the top
N% of streamlines. The default is to use the top 10%.
The following variables are exported by setup_vars.sh and are used to create the
appropriate directory and filename targets that conform to the BIDS standard
See the code block following the list for examples.
- projdir
- The project's top-level directory. All preprocessing scripts must be called from this directory.
- target
- The character string for the subject (plus the session and acquisition, if applicable).
Directories and filenames will both be generated using this variable. - srcdir
- The directory that holds the "source" data. Here, "source" indicates data that came directly from the scanner; i.e., DICOM files, PAR/REC files (for Philips data), Siemens mosaic, etc.
- rawdir
- The directory that will hold the "raw" data. Here, "raw" simply indicates that no preprocessing has been applied to them.
- fs_sub_dir
- The name of the directories containing Freesurfer results.
Since Freesurfer's
SUBJECTS_DIRis "flat" (i.e., all data must be in a single directory), if the study is longitudinal then the_ses-${session}will be in the directory names. - resdir
- The directory where results will be stored. For DWI data, this will be
${projdir}/tractography(containing the results from bothbedpostxandprobtrackx2).
For example, in a theoretical test-retest study, the outputs might look like the following.
The directories live directly under ${projdir}.
${target} sub-s001_ses-retest_acq-highres_T1w
sub-s001_ses-retest_acq-multishell_dwi
sub-s001_ses-retest_task-rest_bold
${srcdir} sourcedata/sub-s001/ses-retest/{anat,dwi,func}
`- ${target}_dicom.tar.gz
${rawdir} rawdata/sub-s001/ses-retest/dwi
`- ${target}.{bvals,bvecs,json,nii.gz}
${resdir} tractography/sub-s001/ses-retest/dwi
${fs_sub_dir} freesurfer/sub-s001_ses-retestIt seems that GE and Philips do not record the SliceTiming information
which is necessary for eddy's slice-to-volume motion correction.
There isn't a foolproof way of getting this information, aside from at the scanner console itself.
From this thread, helpful DICOM tags are:
0020,1002ImagesInAcquisition-- should be equal for all in a single acquisition0020,9057InStackPositionNumber-- the slice number for each volume0020,0013InstanceNumber-- slice number in the whole acquisition0020,1041SliceLocation
That thread links to another thread which references some more DICOM tags, and links to a Github repo that may be able to find out this information.
In FSL v6.0.0, fslroi has undesired behavior; for some files, it remapped voxel values so that the nodif images were completely wrong. A temporary workaround is to use fslmaths to change the image type of dwi_orig.nii.gz to float. This bug should be fixed in v6.0.1.
The QC script for Freesurfer to diffusion space relies on xvfb-run.
The argument -n allows you to specify a specific server number, but sometimes this still results in errors.
The SLURM script (dti_reg.launcher.slurm) will automatically increment this from 0 for each subject,
but if you have more than 100 subjects processed at once, there might be an error.