{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n# Parallel Transport Tractography\nParallel Transport Tractography (PTT) [Aydogan2021]_\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from dipy.direction import peaks_from_model\nfrom dipy.data import default_sphere\nfrom dipy.io.streamline import save_trk\nfrom dipy.io.stateful_tractogram import Space, StatefulTractogram\nfrom dipy.data import get_sphere\nfrom dipy.direction import PTTDirectionGetter\nfrom dipy.reconst.shm import CsaOdfModel\nfrom dipy.core.gradients import gradient_table\nfrom dipy.data import get_fnames\nfrom dipy.io.gradients import read_bvals_bvecs\nfrom dipy.io.image import load_nifti, load_nifti_data\nfrom dipy.reconst.csdeconv import (ConstrainedSphericalDeconvModel,\n auto_response_ssst)\nfrom dipy.tracking import utils\nfrom dipy.tracking.local_tracking import LocalTracking\nfrom dipy.tracking.streamline import Streamlines\nfrom dipy.tracking.stopping_criterion import ThresholdStoppingCriterion\nfrom dipy.viz import window, actor, colormap, has_fury\n\n\n# Enables/disables interactive visualization\ninteractive = False\n\nhardi_fname, hardi_bval_fname, hardi_bvec_fname = get_fnames('stanford_hardi')\nlabel_fname = get_fnames('stanford_labels')\n\ndata, affine, hardi_img = load_nifti(hardi_fname, return_img=True)\nlabels = load_nifti_data(label_fname)\nbvals, bvecs = read_bvals_bvecs(hardi_bval_fname, hardi_bvec_fname)\ngtab = gradient_table(bvals, bvecs)\n\nseed_mask = (labels == 2)\nwhite_matter = (labels == 1) | (labels == 2)\nseeds = utils.seeds_from_mask(seed_mask, affine, density=1)\n\nresponse, ratio = auto_response_ssst(gtab, data, roi_radii=10, fa_thr=0.7)\ncsd_model = ConstrainedSphericalDeconvModel(gtab, response, sh_order=6)\ncsd_fit = csd_model.fit(data, mask=white_matter)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We use the GFA of the CSA model to build a stopping criterion.\n\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "csa_model = CsaOdfModel(gtab, sh_order=6)\ngfa = csa_model.fit(data, mask=white_matter).gfa\nstopping_criterion = ThresholdStoppingCriterion(gfa, .25)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Prepare the PTT direction getter using the fiber ODF (FOD) obtain with CSD.\nStart the local tractography using PTT direction getter.\n\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "sphere = get_sphere(name='repulsion724')\nfod = csd_fit.odf(sphere)\npmf = fod.clip(min=0)\nptt_dg = PTTDirectionGetter.from_pmf(pmf, max_angle=15, probe_length=0.5,\n sphere=sphere)\n\n# Parallel Transport Tractography\nstreamline_generator = LocalTracking(direction_getter=ptt_dg,\n stopping_criterion=stopping_criterion,\n seeds=seeds,\n affine=affine,\n step_size=0.2)\nstreamlines = Streamlines(streamline_generator)\nsft = StatefulTractogram(streamlines, hardi_img, Space.RASMM)\nsave_trk(sft, \"tractogram_ptt_dg_pmf.trk\")\n\nif has_fury:\n scene = window.Scene()\n scene.add(actor.line(streamlines, colormap.line_colors(streamlines)))\n window.record(scene, out_path='tractogram_ptt_dg_pmf.png',\n size=(800, 800))\n if interactive:\n window.show(scene)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ ".. figure:: tractogram_ptt_dg_pmf.png\n :align: center\n\n **Corpus Callosum using ptt direction getter from PMF**\n\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## References\n.. [Aydogan2021] Aydogan DB, Shi Y. Parallel Transport Tractography. IEEE Trans\n Med Imaging. 2021 Feb;40(2):635-647. doi: 10.1109/TMI.2020.3034038.\n Epub 2021 Feb 2. PMID: 33104507; PMCID: PMC7931442.\n\n.. include:: ../links_names.inc\n\n" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.13" } }, "nbformat": 4, "nbformat_minor": 0 }