Hi guys,
I’m trying to compute peaks from an SH function with two very clear/distinct lobes (see screenshot #1), but sometimes major peaks are missed in place of much smaller ones (see screenshot #2). The SH functions were estimated with TODI (i.e. tckmap … -tod …) from the ground-truth streamlines of a numerical phantom, and I tried changing several settings, e.g., lmax, -stat_vox, -precise, -numetc in both tckmap and sh2peaks, but many major peaks are always missed. Is there something I can fine-tune to improve results?
I fear the same problem happens in the line-propagation of SD_STREAM and, sometimes, streamlines are interrupted or deflected (even though a lobe aligned with the current streamline tangent seems present, see screenshots #3 and #4) without no apparent reason (I checked masks, cutoffs etc). NB: screenshots #1 and #2 refer to different locations inside the phantom than screenshots #3 and #4.
Any clues or tricks?
Wow, that looks pretty serious. Are you able to provide a (partial) fODF field that we can use to reproduce this?
Also, can you confirm that you are using a recent version?
Hi Ben,
Yes, I’m using version 3.0.8. If I enable debug messages I get [DEBUG] failed to find SH peak! many times. I tried to go through the code to understand why this happens, but it’s way too complex for me, sorry… 
Sure, I can prepare a minimal working example. How can I share it then? Here or via email?
Any way you are comfortable with!
I cropped my dataset to 3x3x5 voxels, and included the fODF field computed with TODI and a (silly) WM mask. I run tracking as follows:
tckgen -algorithm SD_STREAM fODF.nii.gz SDSTREAM.tck -select 100 -seed_image wm.nii.gz -mask wm.nii.gz -minlen 0.5
I cannot upload the files as the system does not allow me, so I uploaded them to my public Dropbox.
Can you spot anything wrong on my side?
Thanks!
Ale
Not sure if this helps, but I debugged the SH::get_peak() function and found that some peaks are missed because the ANGLE_TOLERANCE is not met (see screenshot #5). Here, the amplitude=1.11897 corresponds to the single-lobe peak in a voxel with a single-fiber population, so it should be recognized as a peak. But dt never falls below the ANGLE_TOLERANCE threshold and, thus, the peak is not found and SD_STREAM tracking is halted for that streamline, even though a peak/lobe to follow is there.
Can an additional convergence criterion be added (on the amplitude?), or a global parameter to control ANGLE_TOLERANCE in all functions that use the SH::get_peak() function?
PS: I have to admit that I didn’t fully understand the function (SH derivatives etc), so take my comments with caution… 
Thanks for reporting, Ale! I’ll need to dig out my notes from 20 years ago, when I did all these derivations… Won’t have time to look into it till next week though… 
Cheers!
Donald.
1 Like