Parallel Transport Tractography#

Parallel Transport Tractography (PTT) [Aydogan2021]

Let’s start by importing the necessary modules.

from dipy.io.streamline import save_trk
from dipy.io.stateful_tractogram import Space, StatefulTractogram
from dipy.data import get_sphere
from dipy.direction import PTTDirectionGetter
from dipy.reconst.shm import CsaOdfModel
from dipy.core.gradients import gradient_table
from dipy.data import get_fnames
from dipy.io.gradients import read_bvals_bvecs
from dipy.io.image import load_nifti, load_nifti_data
from dipy.reconst.csdeconv import (ConstrainedSphericalDeconvModel,
                                   auto_response_ssst)
from dipy.tracking import utils
from dipy.tracking.local_tracking import LocalTracking
from dipy.tracking.streamline import Streamlines
from dipy.tracking.stopping_criterion import ThresholdStoppingCriterion
from dipy.viz import window, actor, colormap, has_fury


# Enables/disables interactive visualization
interactive = False

hardi_fname, hardi_bval_fname, hardi_bvec_fname = get_fnames('stanford_hardi')
label_fname = get_fnames('stanford_labels')

data, affine, hardi_img = load_nifti(hardi_fname, return_img=True)
labels = load_nifti_data(label_fname)
bvals, bvecs = read_bvals_bvecs(hardi_bval_fname, hardi_bvec_fname)
gtab = gradient_table(bvals, bvecs)

seed_mask = (labels == 2)
white_matter = (labels == 1) | (labels == 2)
seeds = utils.seeds_from_mask(seed_mask, affine, density=1)

response, ratio = auto_response_ssst(gtab, data, roi_radii=10, fa_thr=0.7)
csd_model = ConstrainedSphericalDeconvModel(gtab, response, sh_order_max=6)
csd_fit = csd_model.fit(data, mask=white_matter)
  0%|                                                                                                                                                  | 0/58788 [00:00<?, ?it/s]
  1%|█▏                                                                                                                                    | 521/58788 [00:00<00:12, 4762.18it/s]
  2%|███                                                                                                                                  | 1367/58788 [00:00<00:08, 6511.70it/s]
  4%|█████                                                                                                                                | 2238/58788 [00:00<00:07, 7174.56it/s]
  5%|███████                                                                                                                              | 3111/58788 [00:00<00:07, 7492.37it/s]
  7%|█████████                                                                                                                            | 3999/58788 [00:00<00:07, 7718.99it/s]
  8%|██████████▉                                                                                                                          | 4849/58788 [00:00<00:06, 7736.12it/s]
 10%|████████████▉                                                                                                                        | 5701/58788 [00:00<00:06, 7753.53it/s]
 11%|██████████████▋                                                                                                                      | 6516/58788 [00:00<00:06, 7657.53it/s]
 13%|████████████████▊                                                                                                                    | 7451/58788 [00:00<00:06, 7936.60it/s]
 14%|██████████████████▉                                                                                                                  | 8351/58788 [00:01<00:06, 8026.04it/s]
 16%|████████████████████▉                                                                                                                | 9254/58788 [00:01<00:06, 8096.38it/s]
 17%|██████████████████████▉                                                                                                             | 10203/58788 [00:01<00:05, 8272.78it/s]
 19%|████████████████████████▉                                                                                                           | 11105/58788 [00:01<00:05, 8264.95it/s]
 20%|██████████████████████████▉                                                                                                         | 12013/58788 [00:01<00:05, 8276.23it/s]
 22%|█████████████████████████████                                                                                                       | 12928/58788 [00:01<00:05, 8303.02it/s]
 24%|███████████████████████████████                                                                                                     | 13848/58788 [00:01<00:05, 8336.30it/s]
 25%|█████████████████████████████████▏                                                                                                  | 14773/58788 [00:01<00:05, 8371.86it/s]
 27%|███████████████████████████████████▏                                                                                                | 15680/58788 [00:01<00:05, 8348.23it/s]
 28%|█████████████████████████████████████                                                                                               | 16515/58788 [00:02<00:05, 7799.42it/s]
 30%|██████████████████████████████████████▉                                                                                             | 17366/58788 [00:02<00:05, 7794.03it/s]
 31%|█████████████████████████████████████████▏                                                                                          | 18336/58788 [00:02<00:04, 8109.50it/s]
 33%|███████████████████████████████████████████▏                                                                                        | 19260/58788 [00:02<00:04, 8209.33it/s]
 34%|█████████████████████████████████████████████▎                                                                                      | 20159/58788 [00:02<00:04, 8211.92it/s]
 36%|███████████████████████████████████████████████▎                                                                                    | 21080/58788 [00:02<00:04, 8274.44it/s]
 37%|█████████████████████████████████████████████████▎                                                                                  | 21945/58788 [00:02<00:04, 8165.24it/s]
 39%|███████████████████████████████████████████████████▍                                                                                | 22882/58788 [00:02<00:04, 8285.34it/s]
 40%|█████████████████████████████████████████████████████▎                                                                              | 23718/58788 [00:02<00:04, 8093.07it/s]
 42%|███████████████████████████████████████████████████████                                                                             | 24545/58788 [00:03<00:04, 7933.80it/s]
 43%|████████████████████████████████████████████████████████▉                                                                           | 25357/58788 [00:03<00:04, 7781.02it/s]
 45%|██████████████████████████████████████████████████████████▉                                                                         | 26226/58788 [00:03<00:04, 7830.77it/s]
 46%|████████████████████████████████████████████████████████████▋                                                                       | 27011/58788 [00:03<00:04, 7634.82it/s]
 47%|██████████████████████████████████████████████████████████████▎                                                                     | 27775/58788 [00:03<00:04, 7439.38it/s]
 49%|████████████████████████████████████████████████████████████████                                                                    | 28519/58788 [00:03<00:04, 7248.81it/s]
 50%|█████████████████████████████████████████████████████████████████▉                                                                  | 29362/58788 [00:03<00:03, 7385.82it/s]
 51%|███████████████████████████████████████████████████████████████████▋                                                                | 30145/58788 [00:03<00:03, 7317.84it/s]
 53%|█████████████████████████████████████████████████████████████████████▋                                                              | 31041/58788 [00:03<00:03, 7579.90it/s]
 54%|███████████████████████████████████████████████████████████████████████▍                                                            | 31799/58788 [00:04<00:03, 7385.13it/s]
 56%|█████████████████████████████████████████████████████████████████████████▎                                                          | 32638/58788 [00:04<00:03, 7471.29it/s]
 57%|███████████████████████████████████████████████████████████████████████████▎                                                        | 33563/58788 [00:04<00:03, 7767.04it/s]
 59%|█████████████████████████████████████████████████████████████████████████████▎                                                      | 34448/58788 [00:04<00:03, 7863.80it/s]
 60%|███████████████████████████████████████████████████████████████████████████████▎                                                    | 35346/58788 [00:04<00:02, 7967.70it/s]
 62%|█████████████████████████████████████████████████████████████████████████████████▍                                                  | 36280/58788 [00:04<00:02, 8139.24it/s]
 63%|███████████████████████████████████████████████████████████████████████████████████▌                                                | 37206/58788 [00:04<00:02, 8237.21it/s]
 65%|█████████████████████████████████████████████████████████████████████████████████████▋                                              | 38135/58788 [00:04<00:02, 8314.09it/s]
 66%|███████████████████████████████████████████████████████████████████████████████████████▋                                            | 39062/58788 [00:04<00:02, 8362.42it/s]
 68%|█████████████████████████████████████████████████████████████████████████████████████████▊                                          | 39974/58788 [00:05<00:02, 8355.20it/s]
 70%|███████████████████████████████████████████████████████████████████████████████████████████▉                                        | 40936/58788 [00:05<00:02, 8487.15it/s]
 71%|██████████████████████████████████████████████████████████████████████████████████████████████                                      | 41897/58788 [00:05<00:01, 8576.74it/s]
 73%|████████████████████████████████████████████████████████████████████████████████████████████████▏                                   | 42854/58788 [00:05<00:01, 8628.73it/s]
 74%|██████████████████████████████████████████████████████████████████████████████████████████████████▎                                 | 43757/58788 [00:05<00:01, 8516.87it/s]
 76%|████████████████████████████████████████████████████████████████████████████████████████████████████▍                               | 44708/58788 [00:05<00:01, 8570.18it/s]
 78%|██████████████████████████████████████████████████████████████████████████████████████████████████████▌                             | 45666/58788 [00:05<00:01, 8627.07it/s]
 79%|████████████████████████████████████████████████████████████████████████████████████████████████████████▊                           | 46661/58788 [00:05<00:01, 8768.02it/s]
 81%|██████████████████████████████████████████████████████████████████████████████████████████████████████████▊                         | 47589/58788 [00:05<00:01, 8683.46it/s]
 83%|████████████████████████████████████████████████████████████████████████████████████████████████████████████▉                       | 48530/58788 [00:06<00:01, 8658.70it/s]
 84%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████▏                    | 49514/58788 [00:06<00:01, 8760.25it/s]
 86%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎                  | 50463/58788 [00:06<00:00, 8735.71it/s]
 88%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌                | 51440/58788 [00:06<00:00, 8793.92it/s]
 89%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋              | 52396/58788 [00:06<00:00, 8777.03it/s]
 91%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋            | 53286/58788 [00:06<00:00, 8586.20it/s]
 92%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌          | 54145/58788 [00:06<00:00, 8366.30it/s]
 94%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌        | 55029/58788 [00:06<00:00, 8281.33it/s]
 95%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋      | 55969/58788 [00:06<00:00, 8375.71it/s]
 97%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊    | 56923/58788 [00:07<00:00, 8478.93it/s]
 98%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊  | 57823/58788 [00:07<00:00, 8404.54it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋| 58664/58788 [00:07<00:00, 8189.90it/s]
100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 58788/58788 [00:07<00:00, 8073.78it/s]

We use the GFA of the CSA model to build a stopping criterion.

csa_model = CsaOdfModel(gtab, sh_order_max=6)
gfa = csa_model.fit(data, mask=white_matter).gfa
stopping_criterion = ThresholdStoppingCriterion(gfa, .25)

Prepare the PTT direction getter using the fiber ODF (FOD) obtain with CSD. Start the local tractography using PTT direction getter.

sphere = get_sphere(name='repulsion724')
fod = csd_fit.odf(sphere)
pmf = fod.clip(min=0)
ptt_dg = PTTDirectionGetter.from_pmf(pmf, max_angle=15, probe_length=0.5,
                                     sphere=sphere)

# Parallel Transport Tractography
streamline_generator = LocalTracking(direction_getter=ptt_dg,
                                     stopping_criterion=stopping_criterion,
                                     seeds=seeds,
                                     affine=affine,
                                     step_size=0.2)
streamlines = Streamlines(streamline_generator)
sft = StatefulTractogram(streamlines, hardi_img, Space.RASMM)
save_trk(sft, "tractogram_ptt_dg_pmf.trk")

if has_fury:
    scene = window.Scene()
    scene.add(actor.line(streamlines, colormap.line_colors(streamlines)))
    window.record(scene, out_path='tractogram_ptt_dg_pmf.png',
                  size=(800, 800))
    if interactive:
        window.show(scene)
tracking ptt

Corpus Callosum using ptt direction getter from PMF

References#

[Aydogan2021]

Aydogan DB, Shi Y. Parallel Transport Tractography. IEEE Trans Med Imaging. 2021 Feb;40(2):635-647. doi: 10.1109/TMI.2020.3034038. Epub 2021 Feb 2. PMID: 33104507; PMCID: PMC7931442.

Total running time of the script: (0 minutes 46.792 seconds)

Gallery generated by Sphinx-Gallery