From 220fc20cffc53fd10e2da1cbc41120356263af1f Mon Sep 17 00:00:00 2001 From: Michiel Cottaar Date: Mon, 2 Sep 2019 18:52:23 +0200 Subject: [PATCH 01/18] BUG: only include voxels fully within the FOV in every volume --- .../scripts/DiffusionToStructural.sh | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh index fca2fab5c..e50235d5e 100755 --- a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh +++ b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh @@ -103,15 +103,26 @@ if [ ${GdcorrectionFlag} -eq 1 ]; then ${FSLDIR}/bin/convertwarp --rel --relout --warp1="$DataDirectory"/warped/fullWarp --postmat="$WorkingDirectory"/diff2str.mat --ref="$T1wRestoreImage"_${DiffRes} --out="$WorkingDirectory"/grad_unwarp_diff2str ${FSLDIR}/bin/applywarp --rel -i "$DataDirectory"/warped/data_warped -r "$T1wRestoreImage"_${DiffRes} -w "$WorkingDirectory"/grad_unwarp_diff2str --interp=spline -o "$T1wOutputDirectory"/data + #Create a mask covering voxels within the field of view for all volumes + ${FSLDIR}/bin/fslmaths "$DataDirectory"/warped/data_warped -Tmin -bin "$DataDirectory"/warped/fov_mask + ${FSLDIR}/bin/applywarp --rel -i "$DataDirectory"/warped/fov_mask -r "$T1wRestoreImage"_${DiffRes} -w "$WorkingDirectory"/grad_unwarp_diff2str --interp=trilinear -o "$T1wOutputDirectory"/fov_mask + #Now register the grad_dev tensor ${FSLDIR}/bin/vecreg -i "$DataDirectory"/grad_dev -o "$T1wOutputDirectory"/grad_dev -r "$T1wRestoreImage"_${DiffRes} -t "$WorkingDirectory"/diff2str.mat --interp=spline ${FSLDIR}/bin/fslmaths "$T1wOutputDirectory"/grad_dev -mas "$T1wOutputDirectory"/nodif_brain_mask_temp "$T1wOutputDirectory"/grad_dev #Mask-out values outside the brain else #Register diffusion data to T1w space without considering gradient nonlinearities ${FSLDIR}/bin/flirt -in "$DataDirectory"/data -ref "$T1wRestoreImage"_${DiffRes} -applyxfm -init "$WorkingDirectory"/diff2str.mat -interp spline -out "$T1wOutputDirectory"/data + + #Create a mask covering voxels within the field of view for all volumes + ${FSLDIR}/bin/fslmaths "$DataDirectory"/data -Tmin -bin "$DataDirectory"/fov_mask + ${FSLDIR}/bin/flirt -in "$DataDirectory"/fov_mask -ref "$T1wRestoreImage"_${DiffRes} -applyxfm -init "$WorkingDirectory"/diff2str.mat -interp trilinear -out "$T1wOutputDirectory"/fov_mask fi -${FSLDIR}/bin/fslmaths "$T1wOutputDirectory"/data -mas "$T1wOutputDirectory"/nodif_brain_mask_temp "$T1wOutputDirectory"/data #Mask-out data outside the brain +# only include voxels fully(!) within the field of view for every volume +${FSLDIR}/bin/fslmaths "$T1wOutputDirectory"/fov_mask -thr 1 -bin "$T1wOutputDirectory"/fov_mask + +${FSLDIR}/bin/fslmaths "$T1wOutputDirectory"/data -mas "$T1wOutputDirectory"/nodif_brain_mask_temp -mas "$T1wOutputDirectory"/fov_mask "$T1wOutputDirectory"/data #Mask-out data outside the brain ${FSLDIR}/bin/fslmaths "$T1wOutputDirectory"/data -thr 0 "$T1wOutputDirectory"/data #Remove negative intensity values (caused by spline interpolation) from final data ${FSLDIR}/bin/imrm "$T1wOutputDirectory"/nodif_brain_mask_temp From afcc633f482ebb0761350cf30ecb6c633169f143 Mon Sep 17 00:00:00 2001 From: Michiel Cottaar Date: Mon, 9 Sep 2019 14:29:01 +0100 Subject: [PATCH 02/18] BUG: only zero-values are outside FOV, not negative values --- DiffusionPreprocessing/scripts/DiffusionToStructural.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh index e50235d5e..7d9c3baa9 100755 --- a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh +++ b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh @@ -104,7 +104,7 @@ if [ ${GdcorrectionFlag} -eq 1 ]; then ${FSLDIR}/bin/applywarp --rel -i "$DataDirectory"/warped/data_warped -r "$T1wRestoreImage"_${DiffRes} -w "$WorkingDirectory"/grad_unwarp_diff2str --interp=spline -o "$T1wOutputDirectory"/data #Create a mask covering voxels within the field of view for all volumes - ${FSLDIR}/bin/fslmaths "$DataDirectory"/warped/data_warped -Tmin -bin "$DataDirectory"/warped/fov_mask + ${FSLDIR}/bin/fslmaths "$DataDirectory"/warped/data_warped -abs -Tmin -bin "$DataDirectory"/warped/fov_mask ${FSLDIR}/bin/applywarp --rel -i "$DataDirectory"/warped/fov_mask -r "$T1wRestoreImage"_${DiffRes} -w "$WorkingDirectory"/grad_unwarp_diff2str --interp=trilinear -o "$T1wOutputDirectory"/fov_mask #Now register the grad_dev tensor @@ -115,7 +115,7 @@ else ${FSLDIR}/bin/flirt -in "$DataDirectory"/data -ref "$T1wRestoreImage"_${DiffRes} -applyxfm -init "$WorkingDirectory"/diff2str.mat -interp spline -out "$T1wOutputDirectory"/data #Create a mask covering voxels within the field of view for all volumes - ${FSLDIR}/bin/fslmaths "$DataDirectory"/data -Tmin -bin "$DataDirectory"/fov_mask + ${FSLDIR}/bin/fslmaths "$DataDirectory"/data -abs -Tmin -bin "$DataDirectory"/fov_mask ${FSLDIR}/bin/flirt -in "$DataDirectory"/fov_mask -ref "$T1wRestoreImage"_${DiffRes} -applyxfm -init "$WorkingDirectory"/diff2str.mat -interp trilinear -out "$T1wOutputDirectory"/fov_mask fi From 0b9f1333c1f21242a35361f69108ef4b78776228 Mon Sep 17 00:00:00 2001 From: Michiel Cottaar Date: Tue, 10 Sep 2019 09:46:06 +0100 Subject: [PATCH 03/18] Change threshold for floating point rounding error As suggested by Tim Coalson. Not sure if it is needed, but might as well. --- DiffusionPreprocessing/scripts/DiffusionToStructural.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh index 7d9c3baa9..2bbd49409 100755 --- a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh +++ b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh @@ -120,7 +120,7 @@ else fi # only include voxels fully(!) within the field of view for every volume -${FSLDIR}/bin/fslmaths "$T1wOutputDirectory"/fov_mask -thr 1 -bin "$T1wOutputDirectory"/fov_mask +${FSLDIR}/bin/fslmaths "$T1wOutputDirectory"/fov_mask -thr 0.999 -bin "$T1wOutputDirectory"/fov_mask ${FSLDIR}/bin/fslmaths "$T1wOutputDirectory"/data -mas "$T1wOutputDirectory"/nodif_brain_mask_temp -mas "$T1wOutputDirectory"/fov_mask "$T1wOutputDirectory"/data #Mask-out data outside the brain ${FSLDIR}/bin/fslmaths "$T1wOutputDirectory"/data -thr 0 "$T1wOutputDirectory"/data #Remove negative intensity values (caused by spline interpolation) from final data From d84edef16550eea6b67130c5164ef3c878d71f22 Mon Sep 17 00:00:00 2001 From: Michiel Cottaar Date: Tue, 24 Sep 2019 10:36:54 +0100 Subject: [PATCH 04/18] OPT: use first volume to extract FOV mask Gives equivalent results, but is faster --- DiffusionPreprocessing/scripts/DiffusionToStructural.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh index 2bbd49409..1c8dee3ba 100755 --- a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh +++ b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh @@ -104,7 +104,8 @@ if [ ${GdcorrectionFlag} -eq 1 ]; then ${FSLDIR}/bin/applywarp --rel -i "$DataDirectory"/warped/data_warped -r "$T1wRestoreImage"_${DiffRes} -w "$WorkingDirectory"/grad_unwarp_diff2str --interp=spline -o "$T1wOutputDirectory"/data #Create a mask covering voxels within the field of view for all volumes - ${FSLDIR}/bin/fslmaths "$DataDirectory"/warped/data_warped -abs -Tmin -bin "$DataDirectory"/warped/fov_mask + ${FSLDIR}/bin/fslroi "$DataDirectory"/warped/data_warped "$DataDirectory"/warped/nodif_warped + ${FSLDIR}/bin/fslmaths "$DataDirectory"/warped/nodif_warped -abs -bin "$DataDirectory"/warped/fov_mask ${FSLDIR}/bin/applywarp --rel -i "$DataDirectory"/warped/fov_mask -r "$T1wRestoreImage"_${DiffRes} -w "$WorkingDirectory"/grad_unwarp_diff2str --interp=trilinear -o "$T1wOutputDirectory"/fov_mask #Now register the grad_dev tensor @@ -115,7 +116,7 @@ else ${FSLDIR}/bin/flirt -in "$DataDirectory"/data -ref "$T1wRestoreImage"_${DiffRes} -applyxfm -init "$WorkingDirectory"/diff2str.mat -interp spline -out "$T1wOutputDirectory"/data #Create a mask covering voxels within the field of view for all volumes - ${FSLDIR}/bin/fslmaths "$DataDirectory"/data -abs -Tmin -bin "$DataDirectory"/fov_mask + ${FSLDIR}/bin/fslmaths "$DataDirectory"/nodif -abs -bin "$DataDirectory"/fov_mask ${FSLDIR}/bin/flirt -in "$DataDirectory"/fov_mask -ref "$T1wRestoreImage"_${DiffRes} -applyxfm -init "$WorkingDirectory"/diff2str.mat -interp trilinear -out "$T1wOutputDirectory"/fov_mask fi From da6baaf301c8e82f4b2623f21c468ddde98d292a Mon Sep 17 00:00:00 2001 From: Michiel Cottaar Date: Tue, 24 Sep 2019 10:46:39 +0100 Subject: [PATCH 05/18] BUG: dilate the diffusion data before spline interpolation --- .../scripts/DiffusionToStructural.sh | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh index 1c8dee3ba..6a61774d2 100755 --- a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh +++ b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh @@ -97,11 +97,14 @@ done ${GlobalScripts}/Rotate_bvecs.sh "$DataDirectory"/bvecs "$WorkingDirectory"/diff2str.mat "$T1wOutputDirectory"/bvecs cp "$DataDirectory"/bvals "$T1wOutputDirectory"/bvals +DILATE_DISTANCE=echo "$DiffRes * 12" # Extrapolates the diffusion data up to 12 voxels outside of the FOV + #Register diffusion data to T1w space. Account for gradient nonlinearities if requested if [ ${GdcorrectionFlag} -eq 1 ]; then echo "Correcting Diffusion data for gradient nonlinearities and registering to structural space" ${FSLDIR}/bin/convertwarp --rel --relout --warp1="$DataDirectory"/warped/fullWarp --postmat="$WorkingDirectory"/diff2str.mat --ref="$T1wRestoreImage"_${DiffRes} --out="$WorkingDirectory"/grad_unwarp_diff2str - ${FSLDIR}/bin/applywarp --rel -i "$DataDirectory"/warped/data_warped -r "$T1wRestoreImage"_${DiffRes} -w "$WorkingDirectory"/grad_unwarp_diff2str --interp=spline -o "$T1wOutputDirectory"/data + ${CARET7DIR}/wb_command -volume_dilate $DataDirectory/warped/data_warped $DILATE_DISTANCE NEAREST $DataDirectory/warped/data_warped_dilated + ${FSLDIR}/bin/applywarp --rel -i "$DataDirectory"/warped/data_warped_dilated -r "$T1wRestoreImage"_${DiffRes} -w "$WorkingDirectory"/grad_unwarp_diff2str --interp=spline -o "$T1wOutputDirectory"/data #Create a mask covering voxels within the field of view for all volumes ${FSLDIR}/bin/fslroi "$DataDirectory"/warped/data_warped "$DataDirectory"/warped/nodif_warped @@ -113,7 +116,8 @@ if [ ${GdcorrectionFlag} -eq 1 ]; then ${FSLDIR}/bin/fslmaths "$T1wOutputDirectory"/grad_dev -mas "$T1wOutputDirectory"/nodif_brain_mask_temp "$T1wOutputDirectory"/grad_dev #Mask-out values outside the brain else #Register diffusion data to T1w space without considering gradient nonlinearities - ${FSLDIR}/bin/flirt -in "$DataDirectory"/data -ref "$T1wRestoreImage"_${DiffRes} -applyxfm -init "$WorkingDirectory"/diff2str.mat -interp spline -out "$T1wOutputDirectory"/data + ${CARET7DIR}/wb_command -volume_dilate $DataDirectory/data $DILATE_DISTANCE NEAREST $DataDirectory/data_dilated + ${FSLDIR}/bin/flirt -in "$DataDirectory"/data_dilated -ref "$T1wRestoreImage"_${DiffRes} -applyxfm -init "$WorkingDirectory"/diff2str.mat -interp spline -out "$T1wOutputDirectory"/data #Create a mask covering voxels within the field of view for all volumes ${FSLDIR}/bin/fslmaths "$DataDirectory"/nodif -abs -bin "$DataDirectory"/fov_mask @@ -132,5 +136,11 @@ ${FSLDIR}/bin/immv "$T1wOutputDirectory"/nodif_brain_mask.nii.gz "$T1wOutputDire ${FSLDIR}/bin/fslmaths "$T1wOutputDirectory"/nodif_brain_mask_old.nii.gz -mas "$T1wOutputDirectory"/temp "$T1wOutputDirectory"/nodif_brain_mask ${FSLDIR}/bin/imrm "$T1wOutputDirectory"/temp ${FSLDIR}/bin/imrm "$T1wOutputDirectory"/nodif_brain_mask_old +${FSLDIR}/bin/imrm "$T1wOutputDirectory"/fov_mask +if [ ${GdcorrectionFlag} -eq 1 ]; then + ${FSLDIR}/bin/imrm $DataDirectory/warped/data_warped_dilated +else + ${FSLDIR}/bin/imrm $DataDirectory/data_dilated +fi echo " END: DiffusionToStructural" From 05f42c296f27035c1c60e59dbba34229d7478997 Mon Sep 17 00:00:00 2001 From: Michiel Cottaar Date: Wed, 25 Sep 2019 09:56:14 +0100 Subject: [PATCH 06/18] Typo: -volume_dilate -> -volume-dilate --- DiffusionPreprocessing/scripts/DiffusionToStructural.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh index 6a61774d2..2aa058bfe 100755 --- a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh +++ b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh @@ -103,7 +103,7 @@ DILATE_DISTANCE=echo "$DiffRes * 12" # Extrapolates the diffusion data up to 12 if [ ${GdcorrectionFlag} -eq 1 ]; then echo "Correcting Diffusion data for gradient nonlinearities and registering to structural space" ${FSLDIR}/bin/convertwarp --rel --relout --warp1="$DataDirectory"/warped/fullWarp --postmat="$WorkingDirectory"/diff2str.mat --ref="$T1wRestoreImage"_${DiffRes} --out="$WorkingDirectory"/grad_unwarp_diff2str - ${CARET7DIR}/wb_command -volume_dilate $DataDirectory/warped/data_warped $DILATE_DISTANCE NEAREST $DataDirectory/warped/data_warped_dilated + ${CARET7DIR}/wb_command -volume-dilate $DataDirectory/warped/data_warped $DILATE_DISTANCE NEAREST $DataDirectory/warped/data_warped_dilated ${FSLDIR}/bin/applywarp --rel -i "$DataDirectory"/warped/data_warped_dilated -r "$T1wRestoreImage"_${DiffRes} -w "$WorkingDirectory"/grad_unwarp_diff2str --interp=spline -o "$T1wOutputDirectory"/data #Create a mask covering voxels within the field of view for all volumes @@ -116,7 +116,7 @@ if [ ${GdcorrectionFlag} -eq 1 ]; then ${FSLDIR}/bin/fslmaths "$T1wOutputDirectory"/grad_dev -mas "$T1wOutputDirectory"/nodif_brain_mask_temp "$T1wOutputDirectory"/grad_dev #Mask-out values outside the brain else #Register diffusion data to T1w space without considering gradient nonlinearities - ${CARET7DIR}/wb_command -volume_dilate $DataDirectory/data $DILATE_DISTANCE NEAREST $DataDirectory/data_dilated + ${CARET7DIR}/wb_command -volume-dilate $DataDirectory/data $DILATE_DISTANCE NEAREST $DataDirectory/data_dilated ${FSLDIR}/bin/flirt -in "$DataDirectory"/data_dilated -ref "$T1wRestoreImage"_${DiffRes} -applyxfm -init "$WorkingDirectory"/diff2str.mat -interp spline -out "$T1wOutputDirectory"/data #Create a mask covering voxels within the field of view for all volumes From b161b1dab4d4a0bdfebd13ae5af59355a8db579f Mon Sep 17 00:00:00 2001 From: Michiel Cottaar Date: Wed, 25 Sep 2019 10:01:47 +0100 Subject: [PATCH 07/18] BUG: added extensions to filenames for wb_command --- DiffusionPreprocessing/scripts/DiffusionToStructural.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh index 2aa058bfe..eda85b204 100755 --- a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh +++ b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh @@ -103,7 +103,7 @@ DILATE_DISTANCE=echo "$DiffRes * 12" # Extrapolates the diffusion data up to 12 if [ ${GdcorrectionFlag} -eq 1 ]; then echo "Correcting Diffusion data for gradient nonlinearities and registering to structural space" ${FSLDIR}/bin/convertwarp --rel --relout --warp1="$DataDirectory"/warped/fullWarp --postmat="$WorkingDirectory"/diff2str.mat --ref="$T1wRestoreImage"_${DiffRes} --out="$WorkingDirectory"/grad_unwarp_diff2str - ${CARET7DIR}/wb_command -volume-dilate $DataDirectory/warped/data_warped $DILATE_DISTANCE NEAREST $DataDirectory/warped/data_warped_dilated + ${CARET7DIR}/wb_command -volume-dilate $DataDirectory/warped/data_warped.nii.gz $DILATE_DISTANCE NEAREST $DataDirectory/warped/data_warped_dilated.nii.gz ${FSLDIR}/bin/applywarp --rel -i "$DataDirectory"/warped/data_warped_dilated -r "$T1wRestoreImage"_${DiffRes} -w "$WorkingDirectory"/grad_unwarp_diff2str --interp=spline -o "$T1wOutputDirectory"/data #Create a mask covering voxels within the field of view for all volumes @@ -116,7 +116,7 @@ if [ ${GdcorrectionFlag} -eq 1 ]; then ${FSLDIR}/bin/fslmaths "$T1wOutputDirectory"/grad_dev -mas "$T1wOutputDirectory"/nodif_brain_mask_temp "$T1wOutputDirectory"/grad_dev #Mask-out values outside the brain else #Register diffusion data to T1w space without considering gradient nonlinearities - ${CARET7DIR}/wb_command -volume-dilate $DataDirectory/data $DILATE_DISTANCE NEAREST $DataDirectory/data_dilated + ${CARET7DIR}/wb_command -volume-dilate $DataDirectory/data.nii.gz $DILATE_DISTANCE NEAREST $DataDirectory/data_dilated.nii.gz ${FSLDIR}/bin/flirt -in "$DataDirectory"/data_dilated -ref "$T1wRestoreImage"_${DiffRes} -applyxfm -init "$WorkingDirectory"/diff2str.mat -interp spline -out "$T1wOutputDirectory"/data #Create a mask covering voxels within the field of view for all volumes From 26108f6ac57db74707af1aabcb63c838f11bc682 Mon Sep 17 00:00:00 2001 From: Michiel Cottaar Date: Sun, 6 Oct 2019 12:26:32 +0100 Subject: [PATCH 08/18] ENH: added text file with percentage of brain mask in final mask --- DiffusionPreprocessing/scripts/DiffusionToStructural.sh | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh index eda85b204..5a470a30b 100755 --- a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh +++ b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh @@ -134,6 +134,14 @@ ${FSLDIR}/bin/imrm "$T1wOutputDirectory"/nodif_brain_mask_temp ${FSLDIR}/bin/fslmaths "$T1wOutputDirectory"/data -Tmean "$T1wOutputDirectory"/temp ${FSLDIR}/bin/immv "$T1wOutputDirectory"/nodif_brain_mask.nii.gz "$T1wOutputDirectory"/nodif_brain_mask_old.nii.gz ${FSLDIR}/bin/fslmaths "$T1wOutputDirectory"/nodif_brain_mask_old.nii.gz -mas "$T1wOutputDirectory"/temp "$T1wOutputDirectory"/nodif_brain_mask + +# Create a simple summary text file of the percentage of spatial coverage of the dMRI data inside the FS-derived brain mask +NvoxBrainMask=`fslstats -V "$T1wOutputDirectory"/nodif_brain_mask_old | awk '{print $1}'` +NvoxFinalMask=`fslstats -V "$T1wOutputDirectory"/nodif_brain_mask | awk '{print $1}'` +PctCoverage=`echo "scale=4; 100 * ${NvoxFinalMask} / ${NvoxBrainMask}" | bc -l` +echo "PctCoverage, NvoxFinalMask, NvoxBrainMask" >| "$T1wOutputDirectory"/nodif_brain_mask.stats.txt +echo "${PctCoverage}, ${NvoxFinalMask}, ${NvoxBrainMask}" >> fov_mask.stats.txt + ${FSLDIR}/bin/imrm "$T1wOutputDirectory"/temp ${FSLDIR}/bin/imrm "$T1wOutputDirectory"/nodif_brain_mask_old ${FSLDIR}/bin/imrm "$T1wOutputDirectory"/fov_mask From 33afc22a521d6c1ff027f0af3c267c881e6f6fd6 Mon Sep 17 00:00:00 2001 From: Michiel Cottaar Date: Sun, 6 Oct 2019 12:33:20 +0100 Subject: [PATCH 09/18] BUG: reduce number of voxels to dilate --- DiffusionPreprocessing/scripts/DiffusionToStructural.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh index 5a470a30b..3a9d3d412 100755 --- a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh +++ b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh @@ -97,7 +97,7 @@ done ${GlobalScripts}/Rotate_bvecs.sh "$DataDirectory"/bvecs "$WorkingDirectory"/diff2str.mat "$T1wOutputDirectory"/bvecs cp "$DataDirectory"/bvals "$T1wOutputDirectory"/bvals -DILATE_DISTANCE=echo "$DiffRes * 12" # Extrapolates the diffusion data up to 12 voxels outside of the FOV +DILATE_DISTANCE=echo "$DiffRes * 4" | bc # Extrapolates the diffusion data up to 4 voxels outside of the FOV #Register diffusion data to T1w space. Account for gradient nonlinearities if requested if [ ${GdcorrectionFlag} -eq 1 ]; then From 76578cad252381d7dff314fdd4dea0da466cf7d0 Mon Sep 17 00:00:00 2001 From: Michiel Cottaar Date: Fri, 11 Oct 2019 14:41:04 +0100 Subject: [PATCH 10/18] BUG: fixed several typos preventing code to run --- .../scripts/DiffusionToStructural.sh | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh index 3a9d3d412..4d6d4d673 100755 --- a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh +++ b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh @@ -46,8 +46,6 @@ QAImage=`getopt1 "--QAimage" $@` # "$14" #Temporary file for s # Set default option values dof=`defaultopt $dof 6` -echo $T1wOutputDirectory - # Paths for scripts etc (uses variables defined in SetUpHCPPipeline.sh) GlobalScripts=${HCPPIPEDIR_Global} @@ -97,7 +95,7 @@ done ${GlobalScripts}/Rotate_bvecs.sh "$DataDirectory"/bvecs "$WorkingDirectory"/diff2str.mat "$T1wOutputDirectory"/bvecs cp "$DataDirectory"/bvals "$T1wOutputDirectory"/bvals -DILATE_DISTANCE=echo "$DiffRes * 4" | bc # Extrapolates the diffusion data up to 4 voxels outside of the FOV +DILATE_DISTANCE=`echo "$DiffRes * 4" | bc` # Extrapolates the diffusion data up to 4 voxels outside of the FOV #Register diffusion data to T1w space. Account for gradient nonlinearities if requested if [ ${GdcorrectionFlag} -eq 1 ]; then @@ -107,7 +105,7 @@ if [ ${GdcorrectionFlag} -eq 1 ]; then ${FSLDIR}/bin/applywarp --rel -i "$DataDirectory"/warped/data_warped_dilated -r "$T1wRestoreImage"_${DiffRes} -w "$WorkingDirectory"/grad_unwarp_diff2str --interp=spline -o "$T1wOutputDirectory"/data #Create a mask covering voxels within the field of view for all volumes - ${FSLDIR}/bin/fslroi "$DataDirectory"/warped/data_warped "$DataDirectory"/warped/nodif_warped + ${FSLDIR}/bin/fslroi "$DataDirectory"/warped/data_warped "$DataDirectory"/warped/nodif_warped 0 1 ${FSLDIR}/bin/fslmaths "$DataDirectory"/warped/nodif_warped -abs -bin "$DataDirectory"/warped/fov_mask ${FSLDIR}/bin/applywarp --rel -i "$DataDirectory"/warped/fov_mask -r "$T1wRestoreImage"_${DiffRes} -w "$WorkingDirectory"/grad_unwarp_diff2str --interp=trilinear -o "$T1wOutputDirectory"/fov_mask @@ -136,11 +134,11 @@ ${FSLDIR}/bin/immv "$T1wOutputDirectory"/nodif_brain_mask.nii.gz "$T1wOutputDire ${FSLDIR}/bin/fslmaths "$T1wOutputDirectory"/nodif_brain_mask_old.nii.gz -mas "$T1wOutputDirectory"/temp "$T1wOutputDirectory"/nodif_brain_mask # Create a simple summary text file of the percentage of spatial coverage of the dMRI data inside the FS-derived brain mask -NvoxBrainMask=`fslstats -V "$T1wOutputDirectory"/nodif_brain_mask_old | awk '{print $1}'` -NvoxFinalMask=`fslstats -V "$T1wOutputDirectory"/nodif_brain_mask | awk '{print $1}'` +NvoxBrainMask=`fslstats "$T1wOutputDirectory"/nodif_brain_mask_old -V | awk '{print $1}'` +NvoxFinalMask=`fslstats "$T1wOutputDirectory"/nodif_brain_mask -V | awk '{print $1}'` PctCoverage=`echo "scale=4; 100 * ${NvoxFinalMask} / ${NvoxBrainMask}" | bc -l` echo "PctCoverage, NvoxFinalMask, NvoxBrainMask" >| "$T1wOutputDirectory"/nodif_brain_mask.stats.txt -echo "${PctCoverage}, ${NvoxFinalMask}, ${NvoxBrainMask}" >> fov_mask.stats.txt +echo "${PctCoverage}, ${NvoxFinalMask}, ${NvoxBrainMask}" >> "$T1wOutputDirectory"/nodif_brain_mask.stats.txt ${FSLDIR}/bin/imrm "$T1wOutputDirectory"/temp ${FSLDIR}/bin/imrm "$T1wOutputDirectory"/nodif_brain_mask_old From cfe5076ae6971d192d9bab74cf17aad7a85a7b36 Mon Sep 17 00:00:00 2001 From: Michiel Cottaar Date: Fri, 11 Oct 2019 14:43:28 +0100 Subject: [PATCH 11/18] BUG: use fslmaths data -abs -Tmax -bin to only mask out data where all data is zero --- DiffusionPreprocessing/scripts/DiffusionToStructural.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh index 4d6d4d673..7cc4aebb7 100755 --- a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh +++ b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh @@ -105,8 +105,7 @@ if [ ${GdcorrectionFlag} -eq 1 ]; then ${FSLDIR}/bin/applywarp --rel -i "$DataDirectory"/warped/data_warped_dilated -r "$T1wRestoreImage"_${DiffRes} -w "$WorkingDirectory"/grad_unwarp_diff2str --interp=spline -o "$T1wOutputDirectory"/data #Create a mask covering voxels within the field of view for all volumes - ${FSLDIR}/bin/fslroi "$DataDirectory"/warped/data_warped "$DataDirectory"/warped/nodif_warped 0 1 - ${FSLDIR}/bin/fslmaths "$DataDirectory"/warped/nodif_warped -abs -bin "$DataDirectory"/warped/fov_mask + ${FSLDIR}/bin/fslmaths "$DataDirectory"/warped/data_warped -abs -Tmax -bin "$DataDirectory"/warped/fov_mask ${FSLDIR}/bin/applywarp --rel -i "$DataDirectory"/warped/fov_mask -r "$T1wRestoreImage"_${DiffRes} -w "$WorkingDirectory"/grad_unwarp_diff2str --interp=trilinear -o "$T1wOutputDirectory"/fov_mask #Now register the grad_dev tensor @@ -118,7 +117,7 @@ else ${FSLDIR}/bin/flirt -in "$DataDirectory"/data_dilated -ref "$T1wRestoreImage"_${DiffRes} -applyxfm -init "$WorkingDirectory"/diff2str.mat -interp spline -out "$T1wOutputDirectory"/data #Create a mask covering voxels within the field of view for all volumes - ${FSLDIR}/bin/fslmaths "$DataDirectory"/nodif -abs -bin "$DataDirectory"/fov_mask + ${FSLDIR}/bin/fslmaths "$DataDirectory"/data -abs -Tmax -bin "$DataDirectory"/fov_mask ${FSLDIR}/bin/flirt -in "$DataDirectory"/fov_mask -ref "$T1wRestoreImage"_${DiffRes} -applyxfm -init "$WorkingDirectory"/diff2str.mat -interp trilinear -out "$T1wOutputDirectory"/fov_mask fi From 6c3d36083395623eadfc4fd932021f412631a410 Mon Sep 17 00:00:00 2001 From: Michiel Cottaar Date: Fri, 11 Oct 2019 16:19:15 +0100 Subject: [PATCH 12/18] REF: rename DILATE_DISTANCE to DilateDistance --- DiffusionPreprocessing/scripts/DiffusionToStructural.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh index 7cc4aebb7..3b259575c 100755 --- a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh +++ b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh @@ -95,13 +95,13 @@ done ${GlobalScripts}/Rotate_bvecs.sh "$DataDirectory"/bvecs "$WorkingDirectory"/diff2str.mat "$T1wOutputDirectory"/bvecs cp "$DataDirectory"/bvals "$T1wOutputDirectory"/bvals -DILATE_DISTANCE=`echo "$DiffRes * 4" | bc` # Extrapolates the diffusion data up to 4 voxels outside of the FOV +DilateDistance=`echo "$DiffRes * 4" | bc` # Extrapolates the diffusion data up to 4 voxels outside of the FOV #Register diffusion data to T1w space. Account for gradient nonlinearities if requested if [ ${GdcorrectionFlag} -eq 1 ]; then echo "Correcting Diffusion data for gradient nonlinearities and registering to structural space" ${FSLDIR}/bin/convertwarp --rel --relout --warp1="$DataDirectory"/warped/fullWarp --postmat="$WorkingDirectory"/diff2str.mat --ref="$T1wRestoreImage"_${DiffRes} --out="$WorkingDirectory"/grad_unwarp_diff2str - ${CARET7DIR}/wb_command -volume-dilate $DataDirectory/warped/data_warped.nii.gz $DILATE_DISTANCE NEAREST $DataDirectory/warped/data_warped_dilated.nii.gz + ${CARET7DIR}/wb_command -volume-dilate $DataDirectory/warped/data_warped.nii.gz $DilateDistance NEAREST $DataDirectory/warped/data_warped_dilated.nii.gz ${FSLDIR}/bin/applywarp --rel -i "$DataDirectory"/warped/data_warped_dilated -r "$T1wRestoreImage"_${DiffRes} -w "$WorkingDirectory"/grad_unwarp_diff2str --interp=spline -o "$T1wOutputDirectory"/data #Create a mask covering voxels within the field of view for all volumes @@ -113,7 +113,7 @@ if [ ${GdcorrectionFlag} -eq 1 ]; then ${FSLDIR}/bin/fslmaths "$T1wOutputDirectory"/grad_dev -mas "$T1wOutputDirectory"/nodif_brain_mask_temp "$T1wOutputDirectory"/grad_dev #Mask-out values outside the brain else #Register diffusion data to T1w space without considering gradient nonlinearities - ${CARET7DIR}/wb_command -volume-dilate $DataDirectory/data.nii.gz $DILATE_DISTANCE NEAREST $DataDirectory/data_dilated.nii.gz + ${CARET7DIR}/wb_command -volume-dilate $DataDirectory/data.nii.gz $DilateDistance NEAREST $DataDirectory/data_dilated.nii.gz ${FSLDIR}/bin/flirt -in "$DataDirectory"/data_dilated -ref "$T1wRestoreImage"_${DiffRes} -applyxfm -init "$WorkingDirectory"/diff2str.mat -interp spline -out "$T1wOutputDirectory"/data #Create a mask covering voxels within the field of view for all volumes From ddcad3b8b39df95351a59f412b482e988cfcf629 Mon Sep 17 00:00:00 2001 From: Michiel Cottaar Date: Sat, 12 Oct 2019 14:19:14 +0100 Subject: [PATCH 13/18] Back to using Tmin, but now filling holes Adding -fillh should fill up any internal holes due to voxels being zero for some other reason than being marked like that by eddy. --- DiffusionPreprocessing/scripts/DiffusionToStructural.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh index be021a468..b49587d74 100755 --- a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh +++ b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh @@ -107,7 +107,7 @@ if [ ${GdcorrectionFlag} -eq 1 ]; then ${FSLDIR}/bin/applywarp --rel -i "$DataDirectory"/warped/data_warped_dilated -r "$T1wRestoreImage"_${DiffRes} -w "$WorkingDirectory"/grad_unwarp_diff2str --interp=spline -o "$T1wOutputDirectory"/data #Create a mask covering voxels within the field of view for all volumes - ${FSLDIR}/bin/fslmaths "$DataDirectory"/warped/data_warped -abs -Tmax -bin "$DataDirectory"/warped/fov_mask + ${FSLDIR}/bin/fslmaths "$DataDirectory"/warped/data_warped -abs -Tmin -bin -fillh "$DataDirectory"/warped/fov_mask ${FSLDIR}/bin/applywarp --rel -i "$DataDirectory"/warped/fov_mask -r "$T1wRestoreImage"_${DiffRes} -w "$WorkingDirectory"/grad_unwarp_diff2str --interp=trilinear -o "$T1wOutputDirectory"/fov_mask #Now register the grad_dev tensor @@ -119,7 +119,7 @@ else ${FSLDIR}/bin/flirt -in "$DataDirectory"/data_dilated -ref "$T1wRestoreImage"_${DiffRes} -applyxfm -init "$WorkingDirectory"/diff2str.mat -interp spline -out "$T1wOutputDirectory"/data #Create a mask covering voxels within the field of view for all volumes - ${FSLDIR}/bin/fslmaths "$DataDirectory"/data -abs -Tmax -bin "$DataDirectory"/fov_mask + ${FSLDIR}/bin/fslmaths "$DataDirectory"/data -abs -Tmin -bin -fillh "$DataDirectory"/fov_mask ${FSLDIR}/bin/flirt -in "$DataDirectory"/fov_mask -ref "$T1wRestoreImage"_${DiffRes} -applyxfm -init "$WorkingDirectory"/diff2str.mat -interp trilinear -out "$T1wOutputDirectory"/fov_mask fi From 588eb5e8659e4d5b8310ef2037e547d38018c1d7 Mon Sep 17 00:00:00 2001 From: Michiel Cottaar Date: Sat, 12 Oct 2019 14:24:23 +0100 Subject: [PATCH 14/18] Fixed comments as suggested by @mharms --- DiffusionPreprocessing/scripts/DiffusionToStructural.sh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh index b49587d74..f7de73e47 100755 --- a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh +++ b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh @@ -103,10 +103,11 @@ if [ ${GdcorrectionFlag} -eq 1 ]; then # We combine the GDC warp with the diff2str affine, and apply to warped/data_warped (i.e., the post-eddy, pre-GDC data) # so that we can have a one-step resampling following 'eddy' ${FSLDIR}/bin/convertwarp --rel --relout --warp1="$DataDirectory"/warped/fullWarp --postmat="$WorkingDirectory"/diff2str.mat --ref="$T1wRestoreImage"_${DiffRes} --out="$WorkingDirectory"/grad_unwarp_diff2str + # Dilation outside of the field of view to minimise the effect of the hard field of view edge on the interpolation ${CARET7DIR}/wb_command -volume-dilate $DataDirectory/warped/data_warped.nii.gz $DilateDistance NEAREST $DataDirectory/warped/data_warped_dilated.nii.gz ${FSLDIR}/bin/applywarp --rel -i "$DataDirectory"/warped/data_warped_dilated -r "$T1wRestoreImage"_${DiffRes} -w "$WorkingDirectory"/grad_unwarp_diff2str --interp=spline -o "$T1wOutputDirectory"/data - #Create a mask covering voxels within the field of view for all volumes + #Create a mask representing voxels within the field of view for all volumes prior to dilation ${FSLDIR}/bin/fslmaths "$DataDirectory"/warped/data_warped -abs -Tmin -bin -fillh "$DataDirectory"/warped/fov_mask ${FSLDIR}/bin/applywarp --rel -i "$DataDirectory"/warped/fov_mask -r "$T1wRestoreImage"_${DiffRes} -w "$WorkingDirectory"/grad_unwarp_diff2str --interp=trilinear -o "$T1wOutputDirectory"/fov_mask @@ -114,11 +115,12 @@ if [ ${GdcorrectionFlag} -eq 1 ]; then ${FSLDIR}/bin/vecreg -i "$DataDirectory"/grad_dev -o "$T1wOutputDirectory"/grad_dev -r "$T1wRestoreImage"_${DiffRes} -t "$WorkingDirectory"/diff2str.mat --interp=spline ${FSLDIR}/bin/fslmaths "$T1wOutputDirectory"/grad_dev -mas "$T1wOutputDirectory"/nodif_brain_mask_temp "$T1wOutputDirectory"/grad_dev #Mask-out values outside the brain else - #Register diffusion data to T1w space without considering gradient nonlinearities + # Dilation outside of the field of view to minimise the effect of the hard field of view edge on the interpolation ${CARET7DIR}/wb_command -volume-dilate $DataDirectory/data.nii.gz $DilateDistance NEAREST $DataDirectory/data_dilated.nii.gz + #Register diffusion data to T1w space without considering gradient nonlinearities ${FSLDIR}/bin/flirt -in "$DataDirectory"/data_dilated -ref "$T1wRestoreImage"_${DiffRes} -applyxfm -init "$WorkingDirectory"/diff2str.mat -interp spline -out "$T1wOutputDirectory"/data - #Create a mask covering voxels within the field of view for all volumes + #Create a mask representing voxels within the field of view for all volumes prior to dilation ${FSLDIR}/bin/fslmaths "$DataDirectory"/data -abs -Tmin -bin -fillh "$DataDirectory"/fov_mask ${FSLDIR}/bin/flirt -in "$DataDirectory"/fov_mask -ref "$T1wRestoreImage"_${DiffRes} -applyxfm -init "$WorkingDirectory"/diff2str.mat -interp trilinear -out "$T1wOutputDirectory"/fov_mask fi From b40903b8094abc92b6dd6affa52b3415113ad227 Mon Sep 17 00:00:00 2001 From: Michiel Cottaar Date: Sat, 12 Oct 2019 14:24:42 +0100 Subject: [PATCH 15/18] Do not remove the field of view mask --- DiffusionPreprocessing/scripts/DiffusionToStructural.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh index f7de73e47..1cb1f7fdf 100755 --- a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh +++ b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh @@ -146,7 +146,6 @@ echo "${PctCoverage}, ${NvoxFinalMask}, ${NvoxBrainMask}" >> "$T1wOutputDirector ${FSLDIR}/bin/imrm "$T1wOutputDirectory"/temp ${FSLDIR}/bin/imrm "$T1wOutputDirectory"/nodif_brain_mask_old -${FSLDIR}/bin/imrm "$T1wOutputDirectory"/fov_mask if [ ${GdcorrectionFlag} -eq 1 ]; then ${FSLDIR}/bin/imrm $DataDirectory/warped/data_warped_dilated else From 39c59ced6f84fe4d986905aeaebf3179875f4920 Mon Sep 17 00:00:00 2001 From: Michiel Cottaar Date: Thu, 17 Oct 2019 15:31:09 +0100 Subject: [PATCH 16/18] REF: compute fov_mask in eddy_postproc rather than Diffusion2Structural --- .../scripts/DiffusionToStructural.sh | 10 ++++---- .../scripts/eddy_postproc.sh | 24 +++++++++++++++++-- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh index 1cb1f7fdf..50f25ff43 100755 --- a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh +++ b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh @@ -107,21 +107,19 @@ if [ ${GdcorrectionFlag} -eq 1 ]; then ${CARET7DIR}/wb_command -volume-dilate $DataDirectory/warped/data_warped.nii.gz $DilateDistance NEAREST $DataDirectory/warped/data_warped_dilated.nii.gz ${FSLDIR}/bin/applywarp --rel -i "$DataDirectory"/warped/data_warped_dilated -r "$T1wRestoreImage"_${DiffRes} -w "$WorkingDirectory"/grad_unwarp_diff2str --interp=spline -o "$T1wOutputDirectory"/data - #Create a mask representing voxels within the field of view for all volumes prior to dilation - ${FSLDIR}/bin/fslmaths "$DataDirectory"/warped/data_warped -abs -Tmin -bin -fillh "$DataDirectory"/warped/fov_mask + # Transforms field of view mask to T1-weighted space ${FSLDIR}/bin/applywarp --rel -i "$DataDirectory"/warped/fov_mask -r "$T1wRestoreImage"_${DiffRes} -w "$WorkingDirectory"/grad_unwarp_diff2str --interp=trilinear -o "$T1wOutputDirectory"/fov_mask - #Now register the grad_dev tensor + # Now register the grad_dev tensor ${FSLDIR}/bin/vecreg -i "$DataDirectory"/grad_dev -o "$T1wOutputDirectory"/grad_dev -r "$T1wRestoreImage"_${DiffRes} -t "$WorkingDirectory"/diff2str.mat --interp=spline ${FSLDIR}/bin/fslmaths "$T1wOutputDirectory"/grad_dev -mas "$T1wOutputDirectory"/nodif_brain_mask_temp "$T1wOutputDirectory"/grad_dev #Mask-out values outside the brain else # Dilation outside of the field of view to minimise the effect of the hard field of view edge on the interpolation ${CARET7DIR}/wb_command -volume-dilate $DataDirectory/data.nii.gz $DilateDistance NEAREST $DataDirectory/data_dilated.nii.gz - #Register diffusion data to T1w space without considering gradient nonlinearities + # Register diffusion data to T1w space without considering gradient nonlinearities ${FSLDIR}/bin/flirt -in "$DataDirectory"/data_dilated -ref "$T1wRestoreImage"_${DiffRes} -applyxfm -init "$WorkingDirectory"/diff2str.mat -interp spline -out "$T1wOutputDirectory"/data - #Create a mask representing voxels within the field of view for all volumes prior to dilation - ${FSLDIR}/bin/fslmaths "$DataDirectory"/data -abs -Tmin -bin -fillh "$DataDirectory"/fov_mask + # Transforms field of view mask to T1-weighted space ${FSLDIR}/bin/flirt -in "$DataDirectory"/fov_mask -ref "$T1wRestoreImage"_${DiffRes} -applyxfm -init "$WorkingDirectory"/diff2str.mat -interp trilinear -out "$T1wOutputDirectory"/fov_mask fi diff --git a/DiffusionPreprocessing/scripts/eddy_postproc.sh b/DiffusionPreprocessing/scripts/eddy_postproc.sh index 97c7ae2d2..b29721256 100755 --- a/DiffusionPreprocessing/scripts/eddy_postproc.sh +++ b/DiffusionPreprocessing/scripts/eddy_postproc.sh @@ -87,13 +87,31 @@ else fi #fi + +#Create a mask representing voxels within the field of view for all volumes prior to dilation +${FSLDIR}/bin/fslmaths ${datadir}/data -abs -Tmin -bin -fillh ${datadir}/fov_mask + if [ ! $GdCoeffs = "NONE" ] ; then echo "Correcting for gradient nonlinearities" # Note: "data_warped" is eddy-current and suspectibility distortion corrected (via 'eddy'), but prior to gradient distortion correction # i.e., "data_posteddy_preGDC" would be another way to think of it ${FSLDIR}/bin/immv ${datadir}/data ${datadir}/data_warped - ${globalscriptsdir}/GradientDistortionUnwarp.sh --workingdir="${datadir}" --coeffs="${GdCoeffs}" --in="${datadir}/data_warped" --out="${datadir}/data" --owarp="${datadir}/fullWarp" + + # Dilation outside of the field of view to minimise the effect of the hard field of view edge on the interpolation + DiffRes=`${FSLDIR}/bin/fslval ${datadir}/data pixdim1` + DilateDistance=`echo "$DiffRes * 4" | bc` # Extrapolates the diffusion data up to 4 voxels outside of the FOV + ${CARET7DIR}/wb_command -volume-dilate ${datadir}/warped/data_warped.nii.gz $DilateDistance NEAREST ${datadir}/warped/data_warped_dilated.nii.gz + + # apply gradient distortion correction + ${globalscriptsdir}/GradientDistortionUnwarp.sh --workingdir="${datadir}" --coeffs="${GdCoeffs}" --in="${datadir}/data_warped_dilated" --out="${datadir}/data" --owarp="${datadir}/fullWarp" + + # Transform field of view mask (using conservative trilinear interolation with high threshold) + ${FSLDIR}/bin/immv ${datadir}/fov_mask ${datadir}/fov_mask_warped + ${FSLDIR}/bin/applywarp --rel --interp=trilinear -i ${datadir}/fov_mask_warped -r ${datadir}/fov_mask_warped -w ${datadir}/fullWarp -o ${datadir}/fov_mask + ${FSLDIR}/bin/fslmaths ${datadir}/fov_mask -thr 0.999 -bin ${datadir}/fov_mask + # mask out any data outside the field of view + ${FSLDIR}/bin/fslmaths ${datadir}/data -mas ${datadir}/fov_mask ${datadir}/data echo "Computing gradient coil tensor to correct for gradient nonlinearities" ${FSLDIR}/bin/calc_grad_perc_dev --fullwarp=${datadir}/fullWarp -o ${datadir}/grad_dev @@ -102,10 +120,12 @@ if [ ! $GdCoeffs = "NONE" ] ; then ${FSLDIR}/bin/imrm ${datadir}/grad_dev_? ${FSLDIR}/bin/imrm ${datadir}/trilinear ${FSLDIR}/bin/imrm ${datadir}/data_warped_vol1 - + ${FSLDIR}/bin/imrm ${datadir}/data_warped_dilated + #Keep the original warped data and warp fields mkdir -p ${datadir}/warped ${FSLDIR}/bin/immv ${datadir}/data_warped ${datadir}/warped + ${FSLDIR}/bin/immv ${datadir}/fov_mask_warped ${datadir}/warped ${FSLDIR}/bin/immv ${datadir}/fullWarp ${datadir}/warped ${FSLDIR}/bin/immv ${datadir}/fullWarp_abs ${datadir}/warped fi From 1b5ca7997b1217477c854d5780e16250dd5dc436 Mon Sep 17 00:00:00 2001 From: Michiel Cottaar Date: Fri, 18 Oct 2019 09:43:32 +0100 Subject: [PATCH 17/18] Updated comments and other minor changes suggested by @mharms --- .../scripts/DiffusionToStructural.sh | 15 +++++++-------- DiffusionPreprocessing/scripts/eddy_postproc.sh | 12 +++++++----- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh index 50f25ff43..64aba6b2b 100755 --- a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh +++ b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh @@ -97,7 +97,7 @@ cp "$DataDirectory"/bvals "$T1wOutputDirectory"/bvals DilateDistance=`echo "$DiffRes * 4" | bc` # Extrapolates the diffusion data up to 4 voxels outside of the FOV -#Register diffusion data to T1w space. Account for gradient nonlinearities if requested +# Register diffusion data to T1w space. Account for gradient nonlinearities (using one-step resampling) if requested if [ ${GdcorrectionFlag} -eq 1 ]; then echo "Correcting Diffusion data for gradient nonlinearities and registering to structural space" # We combine the GDC warp with the diff2str affine, and apply to warped/data_warped (i.e., the post-eddy, pre-GDC data) @@ -108,11 +108,13 @@ if [ ${GdcorrectionFlag} -eq 1 ]; then ${FSLDIR}/bin/applywarp --rel -i "$DataDirectory"/warped/data_warped_dilated -r "$T1wRestoreImage"_${DiffRes} -w "$WorkingDirectory"/grad_unwarp_diff2str --interp=spline -o "$T1wOutputDirectory"/data # Transforms field of view mask to T1-weighted space + # (Be sure to use the fov_mask derived prior to application of GDC) ${FSLDIR}/bin/applywarp --rel -i "$DataDirectory"/warped/fov_mask -r "$T1wRestoreImage"_${DiffRes} -w "$WorkingDirectory"/grad_unwarp_diff2str --interp=trilinear -o "$T1wOutputDirectory"/fov_mask # Now register the grad_dev tensor ${FSLDIR}/bin/vecreg -i "$DataDirectory"/grad_dev -o "$T1wOutputDirectory"/grad_dev -r "$T1wRestoreImage"_${DiffRes} -t "$WorkingDirectory"/diff2str.mat --interp=spline ${FSLDIR}/bin/fslmaths "$T1wOutputDirectory"/grad_dev -mas "$T1wOutputDirectory"/nodif_brain_mask_temp "$T1wOutputDirectory"/grad_dev #Mask-out values outside the brain + ${FSLDIR}/bin/imrm $DataDirectory/warped/data_warped_dilated else # Dilation outside of the field of view to minimise the effect of the hard field of view edge on the interpolation ${CARET7DIR}/wb_command -volume-dilate $DataDirectory/data.nii.gz $DilateDistance NEAREST $DataDirectory/data_dilated.nii.gz @@ -121,13 +123,15 @@ else # Transforms field of view mask to T1-weighted space ${FSLDIR}/bin/flirt -in "$DataDirectory"/fov_mask -ref "$T1wRestoreImage"_${DiffRes} -applyxfm -init "$WorkingDirectory"/diff2str.mat -interp trilinear -out "$T1wOutputDirectory"/fov_mask + ${FSLDIR}/bin/imrm $DataDirectory/data_dilated fi # only include voxels fully(!) within the field of view for every volume ${FSLDIR}/bin/fslmaths "$T1wOutputDirectory"/fov_mask -thr 0.999 -bin "$T1wOutputDirectory"/fov_mask -${FSLDIR}/bin/fslmaths "$T1wOutputDirectory"/data -mas "$T1wOutputDirectory"/nodif_brain_mask_temp -mas "$T1wOutputDirectory"/fov_mask "$T1wOutputDirectory"/data #Mask-out data outside the brain -${FSLDIR}/bin/fslmaths "$T1wOutputDirectory"/data -thr 0 "$T1wOutputDirectory"/data #Remove negative intensity values (caused by spline interpolation) from final data +# Mask out data outside the brain adn outside the fov +${FSLDIR}/bin/fslmaths "$T1wOutputDirectory"/data -mas "$T1wOutputDirectory"/nodif_brain_mask_temp -mas "$T1wOutputDirectory"/fov_mask "$T1wOutputDirectory"/data +${FSLDIR}/bin/fslmaths "$T1wOutputDirectory"/data -thr 0 "$T1wOutputDirectory"/data #Remove negative intensity values (from eddy) from final data ${FSLDIR}/bin/imrm "$T1wOutputDirectory"/nodif_brain_mask_temp # Identify any voxels that are zeros across all frames and remove those from the final nodif_brain_mask @@ -144,10 +148,5 @@ echo "${PctCoverage}, ${NvoxFinalMask}, ${NvoxBrainMask}" >> "$T1wOutputDirector ${FSLDIR}/bin/imrm "$T1wOutputDirectory"/temp ${FSLDIR}/bin/imrm "$T1wOutputDirectory"/nodif_brain_mask_old -if [ ${GdcorrectionFlag} -eq 1 ]; then - ${FSLDIR}/bin/imrm $DataDirectory/warped/data_warped_dilated -else - ${FSLDIR}/bin/imrm $DataDirectory/data_dilated -fi echo " END: DiffusionToStructural" diff --git a/DiffusionPreprocessing/scripts/eddy_postproc.sh b/DiffusionPreprocessing/scripts/eddy_postproc.sh index b29721256..9a7b509f2 100755 --- a/DiffusionPreprocessing/scripts/eddy_postproc.sh +++ b/DiffusionPreprocessing/scripts/eddy_postproc.sh @@ -88,7 +88,8 @@ fi #fi -#Create a mask representing voxels within the field of view for all volumes prior to dilation +# Create a mask representing voxels within the field of view for all volumes prior to dilation +# 'eddy' can return negative values in some low signal locations, so use -abs for determining the fov mask ${FSLDIR}/bin/fslmaths ${datadir}/data -abs -Tmin -bin -fillh ${datadir}/fov_mask @@ -106,12 +107,10 @@ if [ ! $GdCoeffs = "NONE" ] ; then # apply gradient distortion correction ${globalscriptsdir}/GradientDistortionUnwarp.sh --workingdir="${datadir}" --coeffs="${GdCoeffs}" --in="${datadir}/data_warped_dilated" --out="${datadir}/data" --owarp="${datadir}/fullWarp" - # Transform field of view mask (using conservative trilinear interolation with high threshold) + # Transform field of view mask (using conservative trilinear interpolation with high threshold) ${FSLDIR}/bin/immv ${datadir}/fov_mask ${datadir}/fov_mask_warped ${FSLDIR}/bin/applywarp --rel --interp=trilinear -i ${datadir}/fov_mask_warped -r ${datadir}/fov_mask_warped -w ${datadir}/fullWarp -o ${datadir}/fov_mask ${FSLDIR}/bin/fslmaths ${datadir}/fov_mask -thr 0.999 -bin ${datadir}/fov_mask - # mask out any data outside the field of view - ${FSLDIR}/bin/fslmaths ${datadir}/data -mas ${datadir}/fov_mask ${datadir}/data echo "Computing gradient coil tensor to correct for gradient nonlinearities" ${FSLDIR}/bin/calc_grad_perc_dev --fullwarp=${datadir}/fullWarp -o ${datadir}/grad_dev @@ -130,7 +129,10 @@ if [ ! $GdCoeffs = "NONE" ] ; then ${FSLDIR}/bin/immv ${datadir}/fullWarp_abs ${datadir}/warped fi -#Remove negative intensity values (caused by spline interpolation) from final data +# mask out any data outside the field of view +${FSLDIR}/bin/fslmaths ${datadir}/data -mas ${datadir}/fov_mask ${datadir}/data + +# Remove negative intensity values (from eddy) from final data ${FSLDIR}/bin/fslmaths ${datadir}/data -thr 0 ${datadir}/data ${FSLDIR}/bin/fslroi ${datadir}/data ${datadir}/nodif 0 1 ${FSLDIR}/bin/bet ${datadir}/nodif ${datadir}/nodif_brain -m -f 0.1 From 56972db77beca41f3543c2e597cc1c0be525de9e Mon Sep 17 00:00:00 2001 From: Michiel Cottaar Date: Sat, 26 Oct 2019 21:28:52 +0100 Subject: [PATCH 18/18] Several last bug fixes --- DiffusionPreprocessing/scripts/DiffusionToStructural.sh | 4 ++-- DiffusionPreprocessing/scripts/eddy_postproc.sh | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh index 64aba6b2b..9ca1dc8b1 100755 --- a/DiffusionPreprocessing/scripts/DiffusionToStructural.sh +++ b/DiffusionPreprocessing/scripts/DiffusionToStructural.sh @@ -109,7 +109,7 @@ if [ ${GdcorrectionFlag} -eq 1 ]; then # Transforms field of view mask to T1-weighted space # (Be sure to use the fov_mask derived prior to application of GDC) - ${FSLDIR}/bin/applywarp --rel -i "$DataDirectory"/warped/fov_mask -r "$T1wRestoreImage"_${DiffRes} -w "$WorkingDirectory"/grad_unwarp_diff2str --interp=trilinear -o "$T1wOutputDirectory"/fov_mask + ${FSLDIR}/bin/applywarp --rel -i "$DataDirectory"/warped/fov_mask_warped -r "$T1wRestoreImage"_${DiffRes} -w "$WorkingDirectory"/grad_unwarp_diff2str --interp=trilinear -o "$T1wOutputDirectory"/fov_mask # Now register the grad_dev tensor ${FSLDIR}/bin/vecreg -i "$DataDirectory"/grad_dev -o "$T1wOutputDirectory"/grad_dev -r "$T1wRestoreImage"_${DiffRes} -t "$WorkingDirectory"/diff2str.mat --interp=spline @@ -129,7 +129,7 @@ fi # only include voxels fully(!) within the field of view for every volume ${FSLDIR}/bin/fslmaths "$T1wOutputDirectory"/fov_mask -thr 0.999 -bin "$T1wOutputDirectory"/fov_mask -# Mask out data outside the brain adn outside the fov +# Mask out data outside the brain and outside the fov ${FSLDIR}/bin/fslmaths "$T1wOutputDirectory"/data -mas "$T1wOutputDirectory"/nodif_brain_mask_temp -mas "$T1wOutputDirectory"/fov_mask "$T1wOutputDirectory"/data ${FSLDIR}/bin/fslmaths "$T1wOutputDirectory"/data -thr 0 "$T1wOutputDirectory"/data #Remove negative intensity values (from eddy) from final data ${FSLDIR}/bin/imrm "$T1wOutputDirectory"/nodif_brain_mask_temp diff --git a/DiffusionPreprocessing/scripts/eddy_postproc.sh b/DiffusionPreprocessing/scripts/eddy_postproc.sh index 9a7b509f2..8d9580139 100755 --- a/DiffusionPreprocessing/scripts/eddy_postproc.sh +++ b/DiffusionPreprocessing/scripts/eddy_postproc.sh @@ -100,9 +100,9 @@ if [ ! $GdCoeffs = "NONE" ] ; then ${FSLDIR}/bin/immv ${datadir}/data ${datadir}/data_warped # Dilation outside of the field of view to minimise the effect of the hard field of view edge on the interpolation - DiffRes=`${FSLDIR}/bin/fslval ${datadir}/data pixdim1` + DiffRes=`${FSLDIR}/bin/fslval ${datadir}/data_warped pixdim1` DilateDistance=`echo "$DiffRes * 4" | bc` # Extrapolates the diffusion data up to 4 voxels outside of the FOV - ${CARET7DIR}/wb_command -volume-dilate ${datadir}/warped/data_warped.nii.gz $DilateDistance NEAREST ${datadir}/warped/data_warped_dilated.nii.gz + ${CARET7DIR}/wb_command -volume-dilate ${datadir}/data_warped.nii.gz $DilateDistance NEAREST ${datadir}/data_warped_dilated.nii.gz # apply gradient distortion correction ${globalscriptsdir}/GradientDistortionUnwarp.sh --workingdir="${datadir}" --coeffs="${GdCoeffs}" --in="${datadir}/data_warped_dilated" --out="${datadir}/data" --owarp="${datadir}/fullWarp"