Tractography

In the last article I introduced Extended Streamline Tractography (XST). In this article I will talk talk about the best practices and supporting softwares when applying XST to real MR data.

The Pipline

  1. Preprocess DWI images
  2. Generate seeding coordinates from ROI mask
  3. Running XST
  4. Embedd diffusivity metrics onto the tractography model

Requirements

The following are required to run the supporting scripts:

PyNRRD:

git clone https://github.com/sinkpoint/pynrrd.git
python setup.py install

Scripts:

git clone https://github.com/sinkpoint/neuro-scripts.git

Then make sure to add the neuro-script repo dir to the path in .bashrc. If you are on OSX then add it to .bash_profile.

export path=$PATH:/my/neuro-script

Preprocess DWI images

Diffusion weighted image (DWI) preprocessing involves a number of steps, including motion and eddy-current corrections, possibly reverse-phase encoding corrections, resampling, etc, that are outside the scope of this article. Here I’ll outline the XST specific steps. For for information on general DWI preprocessing, refer to the FSL EDDY and TOPUP documentations.

Truncate b=0 volumes

XST requires each DWI image to have only one b=0 volume. If there are more than one, you should either discard all but the last b=0, or average the volumes. A script is provided to perform this step:

b0avg.py -i raw_dwi.nhdr -o b0truncate_dwi.nhdr 

If you prefer to average the b0s instead, you can do:

b0avg.py -i raw_dwi.nhdr -g -o b0avged_dwi.nhdr 

Usually DWI images are given as a WxIxJxK array, where W is the weighted indices. Sometimes however they can be given as IxJxKxW as well. In these cases, you can specify the W dimension index by:

b0avg.py -i raw_dwi.nhdr -a 3 -g -o b0avged_dwi.nhdr 

Where the -a parameter specifies the W index, starting at 0.

Correct header orientation to RAS

The XST library expects the NRRD headers to be given in RAS (Right-anterior-superior) space.

You can use my PyNRRD library to correct any NRRD files to the correct RAS orientation. You can correct the header by writing a python script with:

    import pynrrd as nrd
    reader = nrd.NrrdReader()
    header, binary = reader.load('file.nhdr')
    header.correctSpaceRas() # convert spacing to RAS, this is needed for xst, else geometry will be inverted.
    writer = NrrdWriter()
    writer.write(header, 'output.nhdr')    

Generate seed points

A list of seed coordinates need to be generated from a ROI mask image. You can do this with the seedTend2Points.py script. Here’s an example of performing uniform random seeding with 10 points per voxel.

seedTend2Points.py -i ROI.nrrd -r -n 10 -m myrois

The script will create a xst folder, where .txt files will be created with the seeding coordinates for each label.

Alternatively, you can generate points on a grid pattern with a set spacing in image space.

seedTend2Points.py -i ROI.nrrd -s 0.3 -m myrois

Embed data onto tract model

One of the interesting feature of tractography is the ability to embed measures onto the model. This has a number of potential uses, for example it allows one to visualize how fractional anisotropy changes along the model.

copyScalarsToVtk.py -i tracts.vtk -m fa.nii.gz -n FA -o tracts_w_fa.vtp

Note that the output file is in the vtk XML format (.vtp).

Here’s an example of the final output when loaded into 3D Slicer:

Output Example