User Tools

Site Tools


biac:analysis:topup_correction

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

biac:analysis:topup_correction [2021/08/24 18:26]
cmp12
biac:analysis:topup_correction [2023/02/23 18:43]
Line 1: Line 1:
-====== EPI Correction with polarity images using TOPUP ====== 
- 
-Steps to setup and apply [[https://fsl.fmrib.ox.ac.uk/fsl/fslwiki/topup/TopupUsersGuide/|FSL Topup]] correction on EPI data collected here with the use of your polarity images 
- 
-==== Create your acquisition parameters ==== 
- 
-There will be two series of single timepoint EPI images.  You can grab relevant info to create the acq_params.txt files from your XML header. 
- 
-You need to calculate readout time in seconds of the PEPOLAR images ( the physical time it takes to get the acquisition matrix of a single slice ) and get the polarity direction ( phase encode direction ). 
- 
- 
-the readout time in seconds for the parameter file will be: 
-**For singleband images :** 
-<code> 
-readout = (echospacing * (acquisitionmatrix[0] * (percentsampling/100))) / 1e6  
- 
-echospacing in the BXH header is in microseconds 
-</code> 
- 
- 
-**For mutli-band images the readout calculation is more complex:**  
-<code> 
-readout = ( ( ceil ((1/Round_factor) * AcquisitionMatrixPE / Asset_R_factor ) * Round_factor) - 1 ) * EchoSpacing * 0.000001 
- 
-EffectiveEchoSpacing = TotalReadoutTime/ (reconMatrixPE - 1) 
- 
-AcquisitionMatrixPE = the acquisition size of the data ( acquisitionmatrix[0] ) 
-reconMatrixPE = the size of the reconstructed data ( may be different from acquisition because of FFT rules ) 
-Round_factor = 4 if partial fourier ( PFF is in scanoptions ), 2 if full fourier.  most all scans will be 4 
-Asset_R_factor = the reciprocal of the first value of dcm tag (0043,1083) 
-</code> 
- 
-unfortunately at this point the polarity of the images will have to be determined from visual inspection. we aren't provided enough information in the metadata to give an entry into the BXH file ( yet ). 
- 
-Here is a rough guide to help with inspection.  Take note of the eyeballs being crushed in for AP and stretched out for PA.  Below shows the PEPOLAR images in red/blue on top of a mean functional. 
-{{:biac:analysis:connneuro_func.png?800|}} 
- 
- 
-reverse will be "-1" in the acq_params.txt and regular will be "1" 
- 
-<code> 
- echo '0 1 0 readout' > acq_params.txt 
- echo '0 -1 0 readout' >> acq_params.txt 
- 
-example output: 
-   0 1 0 0.077312 
-   0 -1 0 0.077312 
- 
-</code> 
- 
-==== Create your Blip Up/Down image ==== 
- 
-Merge the two polarity images together into a 4D file with fsl_merge. Put them in the order of your acq_params.txt file.  In the example above, it would be regular, then reversed. 
- 
-<code> 
-fslmerge -t bud ../bia6_00186_006.nii.gz ../bia6_00186_007.nii.gz 
-     
-tesla:00273 cmp12$ fslinfo bud.nii.gz  
-    data_type      INT16 
-    dim1           128 
-    dim2           128 
-    dim3           70 
-    dim4           2 
-</code> 
- 
-{{:biac:analysis:epi_polarity.png?800|}} 
- 
-==== Run topup to calculate the field and coefficients images for correction ==== 
- 
-<code> 
-#run popup calculate the field/coef 
-topup --verbose --imain=bud --datain=acq_params.txt --config=$FSLDIR/src/topup/flirtsch/b02b0.cnf --out=rs_topup --fout=topup_field 
-</code> 
- 
-==== Now apply the correction to your functional runs ==== 
-**inindex** references the "regular" image index from your acq_params.txt file, which is the same phase encode direction of your functional runs  
- 
-<code> 
-#apply it 
-applytopup --imain=../bia6_00186_008_01.nii.gz --inindex=1 --method=jac --datain=acq_params.txt --topup=rs_topup --out=run008 --verbose 
-applytopup --imain=../bia6_00186_009_01.nii.gz --inindex=1 --method=jac --datain=acq_params.txt --topup=rs_topup --out=run009 --verbose 
-applytopup --imain=../bia6_00186_010_01.nii.gz --inindex=1 --method=jac --datain=acq_params.txt --topup=rs_topup --out=run010 --verbose 
-</code> 
- 
-If you have the scenario where the functional data was acquired with acceleration, but the PEPOLAR images were not.  You can create an additional acq_params file with a modified readout time to help prevent over correction.  You will need to divide the echospacing by the sensefactor from your BXH header of the functional run.  If your functional data and PEPOLAR images have the same sensefactor, this compensation is not needed. 
- 
-<code>readout = ((echospacing/sensefactor) * (acquisitionmatrix[0] * (percentsampling/100))) / 1e6  
-echospacing in the BXH header is in microseconds 
-</code> 
- 
-The top two images are an example of the polarity images after correction, which is not necessary. 
-The bottom two images are the mean functional image of a series uncorrected, then corrected by the topup results. 
- 
-{{:biac:analysis:epi_corrected.png?800|}} 
- 
-If you want to re-generate a valid BXH for the corrected data, you can generate a new BXH and merge in the original info 
- 
-<code> 
-fslwrapbxh run008 
-mv run008.bxh tmp.bxh 
-bxh_merge ../bia6_00186_008_01.bxh tmp.bxh run008.bxh  
-rm tmp.bxh 
-</code> 
- 
- 
- 
---------------- 
- 
-====== DWI Correction with RPE B0s using TOPUP ====== 
- 
-Correcting DWI images using reverse phase encoded B0s is almost the same as the above.  Typically you'll have a couple B0s in your normal DWI acquisition, with a separate series of the same number of B0s collected with the phase encoding direction reversed. 
- 
-==== Create your acq_params.txt file === 
- 
-calculate your readout time from above 
- 
-the regular B0s will get the "1" and the reverse phase B0s will get the "-1" 
- 
-<code> 
- echo '0 1 0 [readout]' > acq_params.txt 
- echo '0 1 0 [readout]' >> acq_params.txt 
- echo '0 -1 0 [readout]' >> acq_params.txt 
- echo '0 -1 0 [readout]' >> acq_params.txt 
- 
-example output: 
-   0 1 0 0.10656 
-   0 1 0 0.10656 
-   0 -1 0 0.10656 
-   0 -1 0 0.10656 
-</code> 
- 
-==== Create your Blip Up/Down image ==== 
- 
-First, you'll need to extract your B0s from the regular DWI acquisition. 
- 
-If you look at the gradient directions within the DWI acquisition the B0s will be "0 0 0". 
- 
-Within the BXH the first 2 directions are B0: 
-<code> 
-<datapoints label="diffusiondirection"> 
- <value>0 0 0</value> 
- <value>0 0 0</value> 
- <value>0.707107 0 0</value> <-- not a B0 
-</code> 
- 
-Extract them with bxhselect: 
-<code> 
-bxhselect --timeselect 0:1 bia6_00197_012.bxh bu 
-bxhselect --timeselect 0:1 bia6_00197_013.bxh bd 
-</code> 
- 
-This will create bu.nii.gz / bd.nii.gz with the first 2 gradient directions ( the B0s ) 
- 
-Now merge the extracted B0s from the regular acquisition with the images from the reversed acquisition.  Merge these in the same order of the acq_params.txt file. 
-<code> 
-fslmerge -t bud bu.nii.gz bd.nii.gz 
- 
-tesla:HCP cmp12$ fslinfo bud.nii.gz 
-data_type      INT16 
-dim1           256 
-dim2           256 
-dim3           92 
-dim4           4 
-</code> 
- 
-{{:biac:analysis:dwi_polarity.png?600|}} 
- 
-==== Run topup to calculate the field and coefficients images for correction ==== 
- 
-<code> 
-#run popup calculate the field/coef 
-topup --verbose --imain=bud --datain=acq_params.txt --config=$FSLDIR/src/topup/flirtsch/b02b0.cnf --out=dwi_topup --fout=topup_field 
-</code> 
- 
-==== Now apply the correction to your DWI ==== 
- 
-**inindex** references the "regular" dwi B0s index from your acq_para 
-ms. 
-txt file 
- 
-<code> 
-#apply it 
-applytopup --imain=bia6_00197_012.nii.gz --inindex=1 --method=jac --datain=acq_params.txt --topup=dwi_topup --out=dwi_corrected --verbose 
-</code> 
- 
-{{:biac:analysis:dwi_corrected.png?600|}} 
- 
-If you want to re-generate a valid BXH for the corrected data, you can generate a new BXH and merge in the original info 
- 
-<code> 
-fslwrapbxh dwi_corrected.nii.gz 
-mv dwi_corrected.bxh tmp.bxh 
-bxh_addgradients --fsl tmp.bxh bvecs bvals dwi_corrected.bxh 
-rm tmp.bxh 
-</code> 
- 
- 
---------------- 
- 
-====== DWI Correction with MRTRIX3 and RPE Data ====== 
- 
-[[https://mrtrix.readthedocs.io/en/latest/|mrtrix3]] has a nice wrapper for FSL's eddy/topup/apply_topup that can do the above corrections and along with eddy corrections 
- 
-If you are running dwidenoise, do it BEFORE dwipreproc.  
- 
-==== Calculate your readout time as mentioned above ==== 
- 
-==== Prepare your input datasets ==== 
- 
-there are 2 scenarios that typically apply here 
-1) DWI and a short acquisition with RPE B0s 
-2) 2 entire acquisitions with the same gradient table and reverse phase encoding  
- 
-In both scenarios it is important to create your data with normal phase encoding direction first, followed by reversed. 
- 
-===== Scenario 1 ===== 
- 
-==== Prepare your input datasets ==== 
- 
-Specify that a set of images (typically b=0 volumes) will be provided for use in inhomogeneity field estimation only 
- 
-For scenario 1, create your blip up / blip down B0 data the same way as above. 
-<code> 
-bxhselect --timeselect 0 bia6_00197_012.bxh bu  
-bxhselect --timeselect 0 bia6_00197_013.bxh bd 
-fslmerge -t bud bu.nii.gz bd.nii.gz 
-rm bu.* bd.* 
-</code> 
- 
-Prepare your dwi series for input to mrtrix3.  If you use their mif data format, then the gradient tables will be automatically passed throughout their software with additional flags. 
- 
-<code> 
-#pull the gradient table from BXH in FSL format 
-extractdiffdirs --fsl bia6_00414_013.bxh bvecs bvals 
- 
-#convert nii.gz data into mif while inserting the gradients 
-mrconvert -fslgrad bvecs bvals bia6_00414_013.nii.gz dwi.mif  
- 
-#export the table back out in their format  
-mrinfo dwi.mif -export_grad_mrtrix grads.b 
- 
-#put THOSE back into the mif header 
-mrconvert -grad grads.b dwi.mif dwi.mif -force 
- 
-</code> 
- 
-The last step seems redundant, but there is an issue with how mrtrix3 tools are handling the multi-shell GE data produced on our scanners.  If you data is NOT multi-shell, then you don't need it.  If your data IS multi-shell, then putting it back in can workaround other issues until their RC4 code is released.  [[https://github.com/MRtrix3/mrtrix3/issues/1487|discussion here]] 
- 
-==== Run dwipreproc -rpe_pair ==== 
- 
-Run [[https://mrtrix.readthedocs.io/en/latest/reference/scripts/dwipreproc.html|dwipreproc]] with the "-rpe_pair" option 
- 
-<code> 
-dwifslpreproc dwi.mif dwi_corr.mif -rpe_pair -se_epi bud.nii.gz -pe_dir AP -readout_time 0.10656  -debug 
- 
--rpe_pair specifies you're providing a pair of B0s ( regular, reversed ) 
--se_epi is you bud image 
--pe_dir is your dwi's phase encode direction 
--readout_time is from calculation above 
-</code> 
-  
-dwipreproc will run topup, eddy and apply topup.  eddy will output update diffusion directions and insert them into your dwi_corr.mif output header. 
- 
-You can generate a BXH header for a mif file with: 
-<code> 
-mif2bxh dwi_corr.mif dwi_corr.bxh 
-</code> 
- 
-===== Scenario 2 ===== 
- 
-You have an entire acquisition with the same gradient table as your DWI sequence, but with reverse phase encoding.  This information will be used to perform a recombination of image volumes (each pair of volumes with the same b-vector but different phase encoding directions will be combined together into a single volume). 
- 
-Calculate the readout time in the same way as above 
- 
-==== Prepare your input datasets ==== 
- 
-This time you'll concatenate the 2 DWI acquisitions.  regular, then reversed  
- 
-<code> 
-#concat the 2 series ( regular, reversed )  
-bxh_concat bia6_00260_00 
-7_LAS.bxh bia6_00260_008_LAS.bxh both 
- 
-#extract the gradients 
-extractdiffdirs --fsl both.bxh bvecs bvals 
- 
-#convert to mif 
-mrconvert -fslgrad bvecs bvals both.nii.gz dwi.mif 
- 
-#re-extract table 
-mrinfo dwi.mif -export_grad_mrtrix grads.b 
- 
-#put corrected table back in 
-mrconvert -grad grads.b dwi.mif dwi.mif -force 
- 
-#remove the temporary files ( bvecs, bvals, both.* ) 
-</code> 
- 
- 
-==== Run dwipreproc -rpe_all ==== 
- 
-Run dwipreproc with the "-rpe_all" option 
- 
-<code> 
-dwipreproc dwi.mif dwi_corr.mif -rpe_all -pe_dir AP -readout_time 0.10656 -debug 
- 
-- rpe_all signals that you've replicated ALL the directions with a rpe acquisition 
-- pe_dir is the phase encode direction of your regular acquisition 
-- readout_time from above   
-</code> 
- 
- 
-{{ :biac:analysis:trace_raw_corr.png?800 |}} 
  
biac/analysis/topup_correction.txt · Last modified: 2023/02/23 18:43 (external edit)