SIFT or SIFT2 in connectome generation

Dear all,

Following the newest BATMAN protocol, the SIFT rather than SIFT2 is used after tckgen.
Is there any advantage to use SIFT2 instead of SIFT?
The data is not acquired through bi-directional way, but single direction.


Yes: you don’t need to generate as many streamlines, only to discard the vast majority (which is how SIFT works). This is what we would now recommend for pretty much any quantitative connectomics analysis. The only case where SIFT is still required is for the statistics in fixel-based analysis (when performed on the template), but I have a feeling that may also change soon. No doubt @rsmith will clarify if I’ve forgotten situations where that’s not the case.

I’m not sure what you’re referring to here. Presumably you’re talking about the absence of reversed phase-encoded data to perform distortion correction…?

Thanks for your clear explanation.
I am following the latest BATMAN protocol.
so the commnad is like below.
Shall I just use tcksift2 instead tcksift or is there recommendations needed when adopt sift2 rather than sift?

tcksift -act Sub-001/5tt_coreg.mif -term_number 10000000 Sub-001/tracks_100mio.tck Sub-001/wmfod_norm.mif Sub-001/sift_1mio.tck

It’s not that simple unfortunately. Once you start using SIFT2, you’ll need to adjust downstream processes to ensure they handle the data correctly, since it’s provided in a different form. With ‘regular’ SIFT, you’d get a (much) smaller tck file, but it was nonetheless just a standalone tck file. With SIFT2, your input tck file remains unmodified, but the command will provide you with an associated weights file (just a text file with one weight per streamline). This additional file needs to be provided alongside your tck file in any command that needs to process it, via the -tck_weights_in option (e.g. for tck2connectome) – otherwise it’ll just process your original tck file unmodified, completely unaware of the existence of the SIFT2 weights.

Also, if you need to filter the streamlines in some way that modifies either the number or order of the streamlines, you’ll need to pass in the weights of the input tck file using the -tck_weights_in option, and produce the corresponding weights for the output file using the -tck_weights_out option (e.g. in tckedit).

We need to spend some time documenting all this properly, there’s admittedly very little information about this in the official docs at the moment…

Thank you so much for your detailed explanation. I couldn’t find any documentation contains full pipeline using tcksift2. (And papers usually never contains the command used in the study.)
Currently, I am planning to just create connectome matrix, and I will gladly test sift2 and tck2connectome with -tck_weights_in option. Do you think it’s an acceptable approach?

Well, I think it’s a good idea to investigate – but hard to me to say whether it’s acceptable, that would depend on exactly what you’re doing with it. But by all means try it out and see!

The only cases where I would advocate the use of SIFT in isolation is where utilisation of per-streamline weights is simply not possible. Currently, this is in construction of the fixel-fixel connectivity matrix as part of the Fixel-Based Analysis pipeline (which in 3.1.0 will become compatible with SIFT2, and in streamline visualisation where the SIFT2 weights are not the principal quantity of interest (e.g. displaying FBA results using streamlines). The BATMAN tutorial will also use SIFT2 rather than SIFT in a future iteration.

I have the same question and want to know the detailed difference between SIFT and SIFT2.
Recently, I read a paper listed below, I think this paper could give additional information besides what has been posted here already.


Jörgens, Daniel, Maxime Descoteaux, and Rodrigo Moreno. “Challenges for tractogram filtering.” Anisotropy Across Fields and Scales (2021): 149.