Tck2fixel , fixel2voxel , tract properties

Hi!

and pardon my maybe naive question. I’m trying to quantify specific tracts obtained from whole brain tractography followed by anatomic cropping. My approach is to compute a fixel ‘image’ using > tck2fixel, aggregate fixel information using fixel2voxel, and then sample the volumes along the tracts (in matlab) from the volumes.
Now, I have a couple of questions:

  1. going from tract to fixel to voxel to tract seems wrong. Is there another command to aggregate these values along a tract?

  2. to my understanding, tck2fixel considers only the lobes of the FOD ‘used’ by a tract - is this correct? Eg. does tck2fixel , fixel2voxel mean result in a different average than fod2fixel, fixel2voxel mean ?

  3. Finally, does this whole processing actually make any sense on (really bad) single shell 30 directional DWI? (+ T1 weighted image for distortion correction / tissue segmentation)

and thanks a bunch for the fantastic software!

1 Like

Hi @mrburnst,

No judgement for naive questions; better to have issues addressed at the commencement of an experiment than at the endpoint!

  1. going from tract to fixel to voxel to tract seems wrong.

Indeed it does. It’s not clear exactly what you’re trying to achieve here. Perhaps you’re trying to make use of the tck2fixel command when it’s in fact not relevant for your experiment. It might help us if you try to describe exactly what you’re trying to quantify, independently of any particular MRtrix3 commands; we can then instruct on the appropriate commands for the experiment.

Is there another command to aggregate these values along a tract?

I suspect what you’re looking for is tcksample. Indeed I suspect that this one command may do the vast majority of what you’re currently trying to achieve: Sample image volumes along a tract. I don’t currently see why you are trying to use fixel information whatsoever.

  1. to my understanding, tck2fixel considers only the lobes of the FOD ‘used’ by a tract - is this correct?

tck2fixel will map tracks to the FOD lobes they traverse. I wouldn’t say that it “considers” only those lobes “used”. It’s possible that there’s a misunderstanding about the function of the tck2fixel command: It’s basically an intermediate solution for calculating the streamlines density within each fixel, until I can finish and merge a bunch of changes that will (among other things) expand tckmap to be able to handle a fixel image as the mapping template instead of a 3D image only.

does tck2fixel , fixel2voxel mean result in a different average than fod2fixel, fixel2voxel mean ?

  • tck2fixel | fixel2voxel mean is kind of a strange operation. You’re getting the mean streamlines density across those fixels within a voxel; so more streamlines means more voxel-wise streamlines density, but if the number of fixels increases, the mean density per fixel will decrease. Densities are usually additive; but tck2fixel | fixel2voxel sum should give you the same result as just tckmap with a voxel image template (hence why I’m confused about your use of fixels at all).

  • tck2fixel gives a streamlines density, whereas fod2fixel gives a fibre density as estimated by the diffusion model. Ideally these are equivalent, but it requires explicit handling, and they will never be numerically precisely equal. I would strongly suggest also reading this article.

  1. Finally, does this whole processing actually make any sense on (really bad) single shell 30 directional DWI? (+ T1 weighted image for distortion correction / tissue segmentation)

You can always run any data through a pipeline and get something; the question is whether or not that something is of any use. E.g. I’m guessing that with 30 directions you’ve probably also got b~1000, which means AFD isn’t interpretable as intra-cellular volume fraction; but you can still quantify it and do stats on it, it just confounds your interpretation of any result. You can do tracking and get something from it, but any result needs to be considered in the context of data quality. If you’re sampling image values underlying specific tracts, any result will depend on the robustness or biological interpretability of the imaging measure being quantified along those tracts.

Hope that sets you off on a useful path!

Cheers
Rob

Thanks for the reply! You’re right, I should explain what I’m actually trying to do here first. Basically, I want to analyse individual fiber tracts (resp. their 'lateralisation‘, eg. how much their contralateral equivalents differ) under ‘some measure’. I know that my data quality won’t allow for complex models to be reliable/meaningful (eg. AFD), but locating the tracts should still be possible.

My thought was that I could use

  • The number of voxels or some other form of hull of the tract as a rough proxy for tract volume

  • The ((relative) ‘energy/amplitude’ of the) lobes of the FOD traversed during tractography as a replacement for longitudinal diffusivity, so as to counter the effects of crossing fibers.
    I don’t know if I’m explaining this well. The idea was maybe similar to the ‘reverse’ of what you did in Sparse re-parametrization of continuous Fibre Orientation Distributions using spherical harmonic delta functions , where you segment the FOD to get the fibers - I thought of using the fibers (from tractography) to pick the lobes of the FOD and aggregate their values (eg ‘lobe amplitude’, the scaling factor sz_f of the delta function in the decomposition at a given location, but take the mean/max/min … should be the same because ideally all tracts ‘used’ the same lobe).
    But if I’m reading your answer correctly, tck2fixel does not really do that ‘segmented’ mapping from fiber to lobe, does it? I thought it corresponds to something along the lines of the ‘integral over the peak’ of a lobe as in Beyond fractional anisotropy: Extraction of bundle-specific structural metrics from crossing fiber models.

The number of voxels or some other form of hull of the tract as a rough proxy for tract volume

When it comes to assessing “connectivity” of a tract, generally we aim to characterise the cross-sectional area rather than the volume. The latter scales linearly with the length of the pathway, but changing the length of a pathway doesn’t really change its ability to transfer information. This is the kind of measure that the SIFT and SIFT2 methods aim to capture; as does the afdconnectivity command (though this is prone to non-ideal behaviours, as I will eventually demonstrate in an article).

The ((relative) ‘energy/amplitude’ of the) lobes of the FOD traversed during tractography as a replacement for longitudinal diffusivity, so as to counter the effects of crossing fibers.

This sounds like you’re trying to re-invent Apparent Fibre Density (AFD) - specifically the modern definition of such.

The idea was maybe similar to the ‘reverse’ of what you did in Sparse re-parametrization of continuous Fibre Orientation Distributions using spherical harmonic delta functions, where you segment the FOD to get the fibers - I thought of using the fibers (from tractography) to pick the lobes of the FOD and aggregate their values (eg ‘lobe amplitude’, the scaling factor sz_f of the delta function in the decomposition at a given location, but take the mean/max/min … should be the same because ideally all tracts ‘used’ the same lobe).

I don’t think you’re looking for the “reverse” of that method: I think what you’re wanting is to perform FOD segmentation, but then use tractography to select which FOD lobes you wish to include in your calculation.

  • The fod2fixel command is the one responsible for performing the FOD segmentation. It uses the algorithm described in the appendix of the SIFT paper. The ISMRM abstract you linked to is intended to be a “more advanced” version of this segmentation, which captures acute crossings and dispersion parameters, but is not yet available in MRtrix3. Nevertheless, the existing algorithm already provides the FOD “integral over the peak” as the measure of fibre density.

  • The tck2fixel command will give you a streamline count per fixel. You can then apply a threshold to this to derive a “fixel mask”. This is the set of fixels from which you are going to sample / aggregate your measure of interest.

  • When aggregating such a measure along the volume of a tract, even if providing fixel specificity (i.e. not just taking some measure per voxel, but sampling only the appropriate FOD lobes), it’s still important to understand exactly what this measure represents. The FOD amplitude is not a measure of “anisotropy” analogous to FA that should be averaged across a tract; you can certainly do the mathematical operation and get a result, but that result does not represent a “mean anisotropy” of a tract. Each FOD lobe integral is (ideally) proportional to the volume of fibres oriented in that direction within the voxel. Therefore, taking the mean of such across a tract would give you something proportional to the mean volume of fibres within a voxel volume, averaged across those voxels where the fibre volume is non-zero. So it’s dependent on a lot of things…
    The sum of those values would give you a tract volume that is not a straight 3D mask volume, but takes into account the potential presence of crossing fibres, and potential inhomogeneity in microscopic fibre density in different parts of the tract. This is actually how the afdconnectivity command works. It is however a volume, which has the aforementioned pathway length dependence; hence why afdconnectivity divides this volume by the mean streamline length.

But if I’m reading your answer correctly, tck2fixel does not really do that ‘segmented’ mapping from fiber to lobe, does it?

No, tck2fixel maps tracks to fixels. You first need to have a set of fixels defined, which (typically) come from fod2fixel.

Note that tck2fixel doesn’t fit ideally with the MRtrix3 command naming convention here, since it doesn’t “produce” fixels from tracks. It’s a useful temporary solution until tckmap gets the capability to map streamlines to fixels.

Thanks Robert - I’m slowly getting the hang of the mrtrix-world.

My initial thought was to use SIFT / SIFT2 as a quantitative measure, but I’m a bit reluctant to do so because of the poor data quality - in my initial experiments, it seemed as though I couldn’t get an accurate whole-brain tractogram, so I was reluctant to go with it.

The same goes with AFD - since that relies on group-wise registration, I figured it will be even more susceptible to data quality and variance (I’m looking at a pediatric population, so large morphological variability here), which is why my initial feeling was to stick to a patient-specific analysis instead.

As for

The sum of those values would give you a tract volume that is not a straight 3D mask volume, but takes into account the potential presence of crossing fibres, and potential inhomogeneity in microscopic fibre density in different parts of the tract. This is actually how the afdconnectivity command works. It is however a volume, which has the aforementioned pathway length dependence; hence why afdconnectivity divides this volume by the mean streamline length.

this would be what I’m looking for - a replacement for FA that takes advantage of the FOD model (rather than tensors) - modulo the bad estimates of FOD, the possibly bad lobe segmentation and erroneous tractography due to image quality.

Am I then right to conclude that

  • SIFT on whole brain tractogram, dissect tract of interest, count streamlines
  • SIFT2 on whole brain tractogram, dissect tract of interest, sum SIFT2 weights in dissected tract
  • dissect tract, afdconnectivity of dissected tract -wbft whole brain tractogram

should give similar results?