TractSeg icon indicating copy to clipboard operation
TractSeg copied to clipboard

different dimensions of FA and bundle segmentations

Open slusna-dominika opened this issue 3 years ago • 10 comments

Hi all,

In an earlier version of TractSeg, one of the program outputs was a FA_MNI_isoxfm.nii (88 x 106 x 88, voxel size 2.04 isotropic) that matched voxel dimensions of bundle segmentations. Having downloaded the most recent version on my Mac a couple of weeks ago, I no longer get this output, but only FA.nii and FA_MNI.nii. The problem is that none of the FA maps matches in voxel dimensions the bundle segmentations. Here are the dimensions I get for FA and bundle segmentations in subject and MNI space:

Subject space: FA.nii (116 x 116 x 64, voxel size 1.98 x 1.98 x 2) vs. e.g. AF.nii.gz from bundle segmentations (116 x 116 x 64, voxel size 1.98 x 1.98 x 1.98) MNI space: FA_MNI.nii (145 x 174 x 145, voxel size 1.25 x 1.25 x 1.25) vs. e.g. AF.nii.gz from bundle segmentation_MNI (91 x 109 x 91, voxel size 1.98 x 1.98 x 1.98)

Thank you for any help, Dominika

slusna-dominika avatar Aug 18 '22 10:08 slusna-dominika

What command are you using to run TractSeg?

wasserth avatar Aug 18 '22 11:08 wasserth

I run this sequence of steps:

echo "Step (1) Preprocessing the diffusion data: Motion and eddy current correction" eddy_correct $data_base/$subject_i/data/dwi.nii $data_base/$subject_i/data/eddy_corrected_data.nii.gz 0 cp $data_base/$subject_i/data/dwi_bvals $data_base/$subject_i/data/eddy_corrected_data.bvals cp $data_base/$subject_i/data/dwi_bvecs $data_base/$subject_i/data/eddy_corrected_data.bvecs

echo "Step (2) Creating a brain mask" bet $data_base/$subject_i/data/eddy_corrected_data $data_base/$subject_i/data/eddy_corrected_data_brain -m -R -f 0.3 cp $data_base/$subject_i/data/eddy_corrected_data_brain.nii.gz $data_base/$subject_i/data/nodif_brain_mask.nii.gz

echo "Step (3) Computing the diffusion tensor and derived metrics (i.e., FA, etc)" dtifit -k $data_base/$subject_i/data/eddy_corrected_data -o $data_base/$subject_i/data/recon -m $data_base/$subject_i/data/nodif_brain_mask -r $data_base/$subject_i/data/eddy_corrected_data.bvecs -b $data_base/$subject_i/data/eddy_corrected_data.bvals -w -V cp $data_base/$subject_i/data/recon_FA.nii.gz $data_base/$subject_i/data/FA.nii.gz cp $data_base/$subject_i/data/recon_MD.nii.gz $data_base/$subject_i/data/MD.nii.gz

echo "Step (4) Custom input and output path and preprocessing" TractSeg -i $data_base/$subject_i/dataS/eddy_corrected_data.nii.gz -o $data_base/$subject_i/tractseg_output --raw_diffusion_input --preprocess --preview --verbose --csd_type csd_msmt --brain_mask $data_base/$subject_i/data/nodif_brain_mask.nii.gz --output_type tract_segmentation --keep_intermediate_files --nr_cpus $ncpus

echo "Step (5) Create segmentation of start and end regions of bundles" TractSeg -i $data_base/$subject_i/tractseg_output/peaks.nii.gz -o $data_base/$subject_i/tractseg_output --output_type endings_segmentation --preprocess --verbose --nr_cpus $ncpus

echo "Step (6) Create Tract Orientation Maps and use them to do bundle-specific tracking" TractSeg -i $data_base/$subject_i/tractseg_output/peaks.nii.gz -o $data_base/$subject_i/tractseg_output --preprocess --output_type TOM --verbose --nr_cpus $ncpus

echo Step (7) Run fiber tracking" Tracking -i $data_base/$subject_i/tractseg_output/peaks.nii.gz -o $data_base/$subject_i/tractseg_output --tracking_dilation 1 --nr_fibers 10000 --verbose --tracking_format trk --nr_cpus $ncpus

slusna-dominika avatar Aug 18 '22 20:08 slusna-dominika

Unfortunately I have no idea what the problem might be. Could you share your data so I can try to reproduce the problem?

wasserth avatar Aug 31 '22 14:08 wasserth

I think I found the problem. I am working on a fix.

wasserth avatar Aug 31 '22 14:08 wasserth

I just pushed a fix to the newest master. Now it should work.

wasserth avatar Aug 31 '22 15:08 wasserth

Dear Jakob,

Could it be that with the new master branch, there is a new error which results in: This issue has already appeared in https://github.com/MIC-DKFZ/TractSeg/issues/80

Step (7) Run fiber tracking 11%|██████████████████▍ | 8/72 [05:59<47:52, 44.89s/it] multiprocessing.pool.RemoteTraceback: """ Traceback (most recent call last): File "/home/dominika/miniconda3/lib/python3.9/multiprocessing/pool.py", line 125, in worker result = (True, func(*args, **kwds)) File "/home/dominika/miniconda3/lib/python3.9/multiprocessing/pool.py", line 48, in mapstar return list(map(*args)) File "/home/dominika/miniconda3/lib/python3.9/site-packages/tractseg/libs/tractseg_prob_tracking.py", line 157, in process_seedpoint streamline_part1, length_1 = process_one_way(peaks, streamline1, max_nr_steps, step_size, probabilistic, File "/home/dominika/miniconda3/lib/python3.9/site-packages/tractseg/libs/tractseg_prob_tracking.py", line 52, in process_one_way dir_raw = get_at_idx(peaks, (last_point[0], last_point[1], last_point[2])) File "/home/dominika/miniconda3/lib/python3.9/site-packages/tractseg/libs/tractseg_prob_tracking.py", line 43, in get_at_idx return img[int(idx[0]), int(idx[1]), int(idx[2])] IndexError: index 64 is out of bounds for axis 2 with size 64 """

The above exception was the direct cause of the following exception:

Traceback (most recent call last): File "/home/dominika/miniconda3/bin/Tracking", line 168, in main() File "/home/dominika/miniconda3/bin/Tracking", line 158, in main tracking.track(bundle, input_path, Config.PREDICT_IMG_OUTPUT, File "/home/dominika/miniconda3/lib/python3.9/site-packages/tractseg/libs/tracking.py", line 220, in track streamlines = tractseg_prob_tracking.track(tom_peaks, max_nr_fibers=nr_fibers, smooth=5, File "/home/dominika/miniconda3/lib/python3.9/site-packages/tractseg/libs/tractseg_prob_tracking.py", line 263, in track streamlines_tmp = pool.map(partial(process_seedpoint, next_step_displacement_std=next_step_displacement_std, File "/home/dominika/miniconda3/lib/python3.9/multiprocessing/pool.py", line 364, in map return self._map_async(func, iterable, mapstar, chunksize).get() File "/home/dominika/miniconda3/lib/python3.9/multiprocessing/pool.py", line 771, in get raise self._value IndexError: index 64 is out of bounds for axis 2 with size 64

Thank you, Dominika!

slusna-dominika avatar Sep 23 '22 15:09 slusna-dominika

Interesting. You would have to send me the data again so I can try to reproduce the error.

wasserth avatar Sep 26 '22 11:09 wasserth

Sure! I pushed my data to this repository and added you as a collaborator. Thank you!

slusna-dominika avatar Sep 27 '22 10:09 slusna-dominika

The --preprocess option does not properly work with TOMs unfortunately. Therefore I would recommend the following: Either register your images manually to MNI space and then run TractSeg on those images (without --preprocess) or just try in subject space without --preprocess and see if the results are good. If the images in subject space are relatively close to MNI space then this should also work well.

wasserth avatar Sep 29 '22 12:09 wasserth

Hello Jakob,

I am sorry to open up this issue again, but regardless of the newest master, the FA_MNI.nii.gz and any other output image in MNI still do not coincide in dimensions. It is strange because I used the FA_2_MNI transformation matrix to register DWI to MNI space.

I have uploaded the TractSeg output to this repository which also contains raw dwi data that were added previously for the same participant.

I have used your DWI-to-MNI part of the preprocesssing script:

calc_FA dwi_denoise_unr_eddy_bias_brain nodif_brain_mask.nii.gz  # calc_FA is part of TractSeg
    dwi_spacing=$(get_image_spacing dwi.nii.gz)  # get_image_spacing is part of TractSeg
    atlas=$FSLDIR/data/standard/FMRIB58_FA_1mm.nii.gz

    #B0 2mm to MNI - mutualinfo working better
    flirt -ref $atlas -in FA.nii.gz \
    -out FA_MNI.nii.gz -omat FA_2_MNI.mat -dof 6 -cost mutualinfo -searchcost mutualinfo -interp spline

    #Register DWI to MNI
    flirt -ref $atlas \
    -in dwi_denoise_unr_eddy_bias_brain.nii.gz -out dwi_denoise_unr_eddy_bias_brain_MNI.nii.gz \
    -applyisoxfm "$dwi_spacing" -init FA_2_MNI.mat -dof 6 -interp spline
    cp -v dwi_denoise_unr_eddy_bias_brain.bvals dwi_denoise_unr_eddy_bias_brain_MNI.bvals
    rotate_bvecs dwi_denoise_unr_eddy_bias_brain.bvecs FA_2_MNI.mat \
    dwi_denoise_unr_eddy_bias_brain_MNI.bvecs

    #Transform brain mask to MNI with T1 2mm transform
    flirt -ref $atlas -in nodif_brain_mask.nii.gz \
    -out nodif_brain_mask_MNI.nii.gz -applyisoxfm "$dwi_spacing" -init FA_2_MNI.mat -dof 6
    fslmaths nodif_brain_mask_MNI.nii.gz -thr 0.5 -bin nodif_brain_mask_MNI.nii.gz

    #Remove negative values (introduced by spline interpolation)
    remove_negative_values dwi_denoise_unr_eddy_bias_brain_MNI.nii.gz \
    dwi_denoise_unr_eddy_bias_brain_MNI.nii.gz  # remove_negative_values is part of TractSeg

    #Get final files
    cp -v dwi_denoise_unr_eddy_bias_brain_MNI.bvals ../dwi.bvals
    cp -v dwi_denoise_unr_eddy_bias_brain_MNI.bvecs ../dwi.bvecs
    cp -v dwi_denoise_unr_eddy_bias_brain_MNI.nii.gz ../dwi.nii.gz
    cp -v nodif_brain_mask_MNI.nii.gz ../nodif_brain_mask.nii.gz

Thank you for all your help, Dominika

slusna-dominika avatar Oct 13 '22 09:10 slusna-dominika