MASILab / Synb0-DISCO

Distortion correction of diffusion weighted MRI without reverse phase-encoding scans or field-maps
https://my.vanderbilt.edu/masi
57 stars 28 forks source link

Eddy error post topup #31

Closed hwbchen closed 1 year ago

hwbchen commented 2 years ago

Hi all,

I was able to get all the files needed for eddy, but when I attempted to run, I kept getting this error message:

TopupFileIO:: msg=TopupFileReader::MovePar: Index i out of bound

This is my eddy line: eddy_cuda9.1 --imain=${eddydir}/Neg.nii.gz --mask=${eddydir}/nodif_brain_mask.nii.gz --acqp=${eddydir}/acqparams.txt --index=${eddydir}/index.txt --bvecs=${eddydir}/Neg.bvec --bvals=${eddydir}/Neg.bval --topup=${eddydir}/b0_all_topup --repol --cnr_maps --residuals --mporder=6 --slspec=${scripts}/slspec_mco.txt --estimate_move_by_susceptibility --out=${eddydir}/eddy_corrected_data_synb0

My nodif_brain_mask.nii.gz was generated from bet of the b0.nii.gz image that I fed into Synb0. I am using the same acqparams.txt as the one that I fed into Synb0. Below is my acqparams.txt:

0 -1 0 .107280 0 -1 0 0

My original data were collected in the AP direction.

Any help would be appreciated! Thanks!

yannquide commented 1 year ago

Hi team,

Love the tool. However, I have a similar error. See below. I am working on a windows 10 machine, running Ubuntu 22.04 LTS WSL. I have the latest version of FSL installed. I followed the FSL instruction RE using eddy_cuda (ln -sf ${FSLDIR}/bin/eddy_cuda9.1 ${FSLDIR}/bin/eddy_cuda).

My acqparams.txt file looks like 0 -1 0 0.05 0 -1 0 0

Any idea of what could go wrong?

Thanks in advance,

Yann

eddy_cuda --imain=$(pwd)/INPUTS/dwi.nii.gz --mask=$(pwd)/INPUTS/brainmask.nii.gz \ acqp=$(> --acqp=$(pwd)/INPUTS/acqparams.txt --index=$(pwd)/INPUTS/index.txt \

--bvecs=$(pwd)/INPUTS/dwi.bvec --bvals=$(pwd)/INPUTS/dwi.bval \ --topup=$(pwd)/OUTPUTS/b0_all_topup --out=$(pwd)/eddy_output/eddy_unwarped_images

Warning: An input intended to be a single 3D volume has multiple timepoints. Input will be truncated to first volume, but this functionality is deprecated and will be removed in a future release. Warning: An input intended to be a single 3D volume has multiple timepoints. Input will be truncated to first volume, but this functionality is deprecated and will be removed in a future release. TopupFileIO:: msg=TopupFileReader::MovePar: Index i out of bound EDDY::: Eddy failed with message EDDY::: ECScanClasses.cpp::: EDDY::ECScanManager::ECScanManager(const string&, const string&, const string&, const string&, const string&, const string&, const string&, const string&, EDDY::ECModel, EDDY::ECModel, const std::vector&, const EDDY::PolationPara&, EDDY::MultiBandGroups, bool): Exception thrown

schillkg commented 1 year ago

Hi all - this seems to be an issue with running eddy (which is outside of the Synb0 container). It appears to suggest that maybe your index file is incorrect? Does your index file have the value 1, repeating for every volume in your dwi.nii.gz image?

yannquide commented 1 year ago

Thanks for your response. Yes my index file has 1s for each volume. If the error is not related to the synb0 topup output (I thought it would be because of TopupFileIO:: msg=TopupFileReader::MovePar: Index i out of bound ), I willask the FSL team. Any suggestion is welcome though! Thanks again for your time.

schillkg commented 1 year ago

For synb0 - we recommend QA in a few steps. First, look at b0_all.nii.gz. The first volume will be your distorted b0 image, the second will be the synthesized. Check that the synthesized image looks reasonable (i.e., b0 contrast, but T1 geometry, or undistorted). Second, check the b0_all_topup.nii.gz. This is what a traditional output of topup would look like, and the first volume will now be your undistorted b0 image (which should now match the second volume). You can additionally open the topup field coefficients, but they are in a different space, with arbitrary units so they are a bit unintuitive to QA. If the field coefficients and movement parameters exist, and the b0_all_topup looks reasonable, then we consider Synb0 successful. The error you got does indeed appear to be specific to EDDY. The first "warning" isn't a big issue and is probably because your mask is written as a 4D instead of 3D volume. The second error seems to not read topup output correctly. Try "--topup=$(pwd)/OUTPUTS/topup", you may just be pointing to the incorrect files. Hope that helps!

yannquide commented 1 year ago

Thanks Kurt. I will check the files. I quickly re-ran my eddy command using And indeed, there was no more topup-related error... only errors with eddy. I copied the error below, for your information (and if someone experience a similar issue!). But will also double check with the FSL team, as it looks like an eddy-only error (specifically cuda-related?). Thanks again so much for your time.

eddy_cuda --imain=$(pwd)/INPUTS/dwi.nii.gz --mask=$(pwd)/INPUTS/brainmask.nii.gz --acqp=$(pwd)/INPUTS/acqparams.txt --index=$(pwd)/INPUTS/index.txt --bvecs=$(pwd)/INPUTS/dwi.bvec --bvals=$(pwd)/INPUTS/dwi.bval --topup=$(pwd)/OUTPUTS/topup --out=$(pwd)/eddy_output/eddy_unwarped_images EDDY::: EddyCudaHelperFunctions::InitGpu: cudaGetDevice returned an error: cudaError_t = 35, cudaErrorName = cudaErrorInsufficientDriver, cudaErrorString = CUDA driver version is insufficient for CUDA runtime version EDDY::: cuda/EddyCudaHelperFunctions.cu::: static void EDDY::EddyCudaHelperFunctions::InitGpu(bool): Exception thrown EDDY::: cuda/EddyGpuUtils.cu::: static std::shared_ptr EDDY::EddyGpuUtils::LoadPredictionMaker(const EDDY::EddyCommandLineOptions&, EDDY::ScanType, const EDDY::ECScanManager&, unsigned int, float, NEWIMAGE::volume&, bool): Exception thrown EDDY::: eddy.cpp::: EDDY::ReplacementManager EDDY::Register(const EDDY::EddyCommandLineOptions&, EDDY::ScanType, unsigned int, const std::vector<float, std::allocator >&, EDDY::SecondLevelECModel, bool, EDDY::ECScanManager&, EDDY::ReplacementManager, NEWMAT::Matrix&, NEWMAT::Matrix&): Exception thrown EDDY::: Eddy failed with message EDDY::: eddy.cpp::: EDDY::ReplacementManager* EDDY::DoVolumeToVolumeRegistration(const EDDY::EddyCommandLineOptions&, EDDY::ECScanManager&): Exception thrown