Note
Go to the end to download the full example code
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)
Corpus Callosum using ptt direction getter from PMF
References#
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)