3dTrackID no tracts running between ROIs

Would it be wrong to have 0 number of tracts running between 2 ROIs? The grid output will sometimes return a #NT of zero between two ROIs. That implies that there are no structural connections running between a set of ROIs. I know some ROIs are connected through indirect structural connections, but is that the case for ROIs that are not expanded far enough to touch the white matter?

I’m just worried about drawing wrong conclusions from my dataset.

Does that mean I need to increase the inflation value? Is it problematic and inaccurate to claim that there are no tracts running between two ROIs?
Should I just inflate my ROI’s to maximum capacity to ensure that they touch the WM tracts?

I also wanted to add another question. I noticed that in the .grid file output from 3dTrackID there are listed average length in mm of a bundle of tracts. And if we are looking at ROI1 to ROI1 there could be 33mm length of tracts between the same ROI and itself. How does that work? Also, why do we get a value for the number of tracts from ROI1 to ROI1?

Thanks for the clarification in advance. I hope to hear back from you soon .

Hi, Sondos-

No, it is definitely not “wrong” to have 0 tracts between 2 target ROIs. That means that the tracking program found no tracts between those targets. How that relates to physiology could be in two ways:

  1. matching physiology-- there are no real direct tracts between the two targets, or
  2. mismatching physiology-- there are some tracts connecting the targets, gosh darnit!

The second case can happen for many reasons, such as: the tracts are subtle, the data are noisy and/or distorted, voxel size is large, tracking algorithms aren’t perfect. And mostly likely due to some combination of all of those. As you note, as well, if the targets are not bordering on DTI-defined WM (which would be wherever the FA threshold is, typically, and which is often at FA>0.2 for adult humans), then that would also be a reason tracts aren’t found.

As to what to do about not havign tracts found-- well, there are tradeoffs to inflating the ROIs a lot. The main reason for ROI inflation is to not be penalized by smoothing/interpolation effects in transforming/regridding data, or to not be penalized by partial voluming in data sets, or somewhat practical reasons like that. Where are your ROIs coming from? A template atlas, or functional data ROIs, or parcellation like FreeSurfer, or …? Inflating ROIs a large amount can lead to an increase in false positives, so I don’t think it should be done a huge amount.

Interpreting results when no tracts are found is difficult, because many factors could lead to their not being tracts found-- and it might be hard/impossible to say which, definitively. It is first good to check that there are no obvious practical missteps or processing errors that lead to it (e.g., a bad alignment procedure or something). Once those kinds of things are checked, at present, I don’t think there is more to say other than “the tracts weren’t found”-- deciding on the cause being practical with the data or physiological with the brain does not seem possible.

The BL matrix gives the average lengths of all tracts found in that bundle. In “pairwise” connections between distinct ROIs, that can be interpreted as the average length of connections between the targets. The “individual ROI” connections (whose properties are listed on the diagonal) are just the set of all tracts that went through the ROI-- the aren’t connections to/from anything, just ones through that ROI. I don’t know a situation where those are really useful in an analysis, but htey are output in case they are. In most studies I have seen, it is the pairwise connections only that are used. (Someone may find a use for those-- great! It’s just that, at present, that seems to be a rarity.)


Ah, okay thank you for providing that very insightful and clear explanation as to what’s going on.
I was using functional ROI’s at the 3dMatch step, and the majority of my ROI’s are already quite large. I can see how it might be problematic to inflate too much.

Oh, I also noticed that for the 3dTrackID step I was inputting the alg_Thresh_Frac to 0.1(now I can’t seem to find the afni link that had done that earlier).
When I was reading the FATCAT documentation for this argument that are typically set it says: “-alg_Thresh_Frac G: default = 0.001; for higher specificity, a value of 0.01-0.05 would be used”. It makes me think this may be another reason for the 0 values in my data. I could try to tweak this value and see if anything changes. Because the value I picked seems awfully high.

As a follow up question though, when you said: “The “individual ROI” connections (whose properties are listed on the diagonal) are just the set of all tracts that went through the ROI”
Does that logic apply when we are looking at the #NT (number of tracts)? Do the diagonal values involve all the tracts that leave ROI1 (for example)?

If not, how would I get the total number of streamlines leaving ROI1 (to all other ROIs)?

An additional question I have is: I know the default tract control options is to get tracts within and between targets.
However, if I’m interested in getting the distance between ROIs …which I assume to be the #BL (bundle length). Should I instead use the argument -targ_surf_stop? Because the default value will give us a wrong distance(since it includes the distance within the target).
And then let’s say I use targ_surf_stop. If I do that will the number of tracts leaving ROI1 for example, using “default tract control” decrease when I use the targ_surf_stop? Are only the outer voxels considered when tracing the tracts? or does this argument only affect the distance (aka bundle length) outputted only but not the number of tracts leaving the ROI?

I hope what I said makes sense. If something I said wasn’t very clear please let me know and I’ll clarify.

Thank you so much for your time.

Best wishes

Hi, Sondos-

All matrices work the same. Off-diagonal elements apply to connections/WM-ROIs between two separate targets; on-diagonal elements apply to where all tracts through a single target go.

The number of tracts between any pair of targets is given by the off-diagonal elements of the “NT” matrix. You could add up the off-diagonal NT elements for a given target (i.e., sum across its row or column excluding the diagonal), but note that, depending on your targets, some tracts could theoretically go through multiple ROIs.

BL is bundle length, yes. You can choose what you want the length to represent with 4 different options, as described here:
and in particular, this figure is probably the most useful part:
Options are:

Default: only the parts of the tract within and between the targets; that is, parts of the initial tract that stick out away from the partner target are ignored.
    -uncut_at_rois: The whole initial tract: parts of the tract within each target, between the targets, and those endparts sticking out away from each target.
    -targ_surf_stop: only parts of the tract between the targets and just one layer into the target volumes; that is, the target surface stops the tracts after they enter.
    -targ_surf_twixt: only parts of the tract between the targets, stopping just just outside of the target volumes; that is, the tracts are only between (= betwixt) the targets, not overlapping at all.

For any of those, NT should still be the same. NT is number of tracts in a bundle, which is unaffected by that choice of endpoint-trimming. What would be affected is the bundle length measurement (BL), and things like the physical volume (PV) and number of voxels (NV and fNV)