Are SIFT2 weights still interpretable following non-linear transformation?


I was wondering whether the output of tcksift2 generated for tracts before this transformation still represents the correct values for the tracts after transformation.

In other words:
I want to use the sift values in tck2connectome, so do I need to regenerate the sift values with the transformed tracts or would the same sift values (generated for the tracts before transformation) work as well?

Please let me know.


Tagging more active responders for visibility.
Could you please help me here, @jdtournier @bjeurissen ?


Hi @man-shu,

I must admit I’ve never thought about that, but mostly because I haven’t thought of a situation where this would be required (?). But my instinctive reaction here is that this can’t work – but as is so often the case, this depends on why you’re doing this.

In general, no. If you look at the relationship that underpins SIFT/SIFT2, it’s trying to explain the measured fODF in each voxel as a combination of the streamlines segments that pass through it, assuming each contributes the same amount or or not at all (SIFT); or each contributes a variable amount (SIFT2). From that point of view, the SIFT2 weights represent the contribution of each streamline to the fODF (itself proportional to the DW signal), in units proportional to (very roughly) apparent fibre cross-sectional area – in other words, the apparent volume of white matter per unit length, for that streamline (though I have a feeling @rsmith may wish to comment on that interpretation, it’s hard to nail it down precisely…).

As soon as you apply non-rigid warps to your streamlines, you will be modifying the length of the streamline segments in ways that vary even along a single streamline, destroying that relationship. You will also be modifying the cross-sectional areas across the streamlines, stretching spreading their contributions across into adjacent voxels, and again destroying that relationship.

So from that point of view, I don’t think it makes sense to expect the SIFT2 weights to still carry their original meaning once transformed.

You may however find that the relationship to the transformed and modulated fODF is preserved, since the effects of the warp on the apparent fibre density are exactly what the modulation tries to account for – though I’d be wary of introducing errors in the process.

Another possibility might be if your intention was for example to compute the SIFT2 weights per subject and transform all of these weighted tractograms into some template space to perform some kind of inter-subject analysis, then this might make sense: in this case, the SIFT2 weights retain their original meaning. This would in many ways resemble an FBA analysis, but might make sense depending on the question…

So in short: depends on what you plan to do and what interpretation that implies for the transformed streamlines & their weights… :man_shrugging:

Hope that kinda vaguely helps…
All the best,


Hello @jdtournier,

Thanks a lot for the detailed response. It was very helpful. I think I understand the problem better now.

Please allow me to explain my use case.

I am using the SIFT2 weights with the -tck_weights_in parameter of tck2connectome to create an unbiased connectivity matrix like this:

tck2connectome -force -symmetric -zero_diagonal -scale_invnodevol -tck_weights_in {sift2_weights} {tck} {atlas} {connectivity_matrix} -out_assignments {inverse_connectivity_matrix}

So if the same SIFT2 weights from before the transformation do not make any sense for the transformed tracks, then I would have to calculate the weights again in the standard space. This means I would have to calculate the white matter fiber orientation densities again using bvecs, bvals and denoised and eddy-corrected DWI, all transformed to standard space (if at all that is possible). Did I understand that correctly?

Or is it so that calculating SIFT2 weights in the standard space itself does not make any sense (given the non-rigid transformations involved)?

Please let me know.
And thanks again for your response.


Hi @man-shu,

I split off your post to a fresh topic to keep the original wiki on-topic – hope you don’t mind.

Given your workflow, I think that does make sense: you want to compute the connectivity values for each subject, as computed in their own standard space, but with regions defined on some template atlas. The normal workflow would be to warp the template ROIs to each subject’s own space, but here you’re proposing to warp the subject’s streamlines to the template atlas and compute the connectivity values there. I think in this case using the original SIFT2 weights as computed in the subjects’ space is the right thing to do. :+1:

One thing to bear in mind though is that this only applies if you’re using the per-bundle sum of SIFT2 weights as your connectivity measure – we conceptualise this as a proxy marker of the ‘fibre bundle capacity’ (see this preprint for details). I don’t think it necessarily works for other metrics.

I also note you’re adding the -scale_invnodevol option, which I think would invalidate the interpretation of your connectivity values in terms of ‘fibre bundle capacity’. This might not be a problem depending on what you want to do, but bear in mind this is not necessarily what we might recommend by default (@rsmith: you may want to comment on this point).


1 Like