From 41dff109a5400f74cc010a195ca2dd8bb88bcb35 Mon Sep 17 00:00:00 2001 From: Robert Smith Date: Mon, 18 Nov 2024 00:56:24 +1100 Subject: [PATCH] Multiple fixes - Pull in latest code changes at https://github.com/MRtrix3/mrtrix3/pull/3011 to ensure no regression has occurred in fixing other issues. - Fix invocation of peakscheck for dwi2tensor outputs. - Fix container entrypoint. - Fix README to include invocation of container and reflect fix to container entrypoint. --- Dockerfile | 7 ++++--- README.md | 7 ++++--- dwi_metadata/fsl/fsl.py | 18 +++++++++++++++--- dwi_metadata/mrtrix3/dwi2tensor.py | 2 +- dwi_metadata/mrtrix3/mrtrix3.py | 7 ++++++- dwi_metadata/tests.py | 4 ++-- 6 files changed, 32 insertions(+), 13 deletions(-) diff --git a/Dockerfile b/Dockerfile index bd7b20c..bd8bc91 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,8 +18,8 @@ RUN apt-get -qq update \ FROM mrtrix3-builder AS mrtrix3-eval-builder # Version of MRtrix3 to be evaluated -# This is branch "dwi_metadata_master" as at 2024-09-19 -ARG MRTRIX3_GIT_COMMITISH="01a09b8985568b52ad81fd1a499c3feab872881b" +# This is branch "dwi_metadata_master" as at 2024-11-16 +ARG MRTRIX3_GIT_COMMITISH="fc0e8f144b161a594eda733ebc9cb4eb6b72e8cb" #ARG MRTRIX3_GIT_COMMITISH="dwi_metadata_master" # Command-line arguments for `./configure` ARG MRTRIX3_CONFIGURE_FLAGS="-nogui" @@ -146,4 +146,5 @@ ENV FSLDIR="/opt/fsl" \ FSLWISH="/opt/fsl/bin/fslwish" \ PATH="/opt/mrtrix3/bin:/opt/peakscmds/build/bin:/opt/dcm2niix/build/bin:/opt/fsl/share/fsl/bin:$PATH" -CMD ["/main.py"] +ENTRYPOINT ["/main.py"] + diff --git a/README.md b/README.md index d8b97d3..33199ea 100644 --- a/README.md +++ b/README.md @@ -11,13 +11,14 @@ This can be done via eg.: ```ShellSession docker build . -t dwi_metadata:latest mkdir scratch -docker run -it --rm -v $(pwd)/scratch:/scratch /main.py /data /scratch /scratch/log.log +docker run -it --rm -v $(pwd)/scratch:/scratch dwi_metadata:latest /data /scratch /scratch/log.log ``` -The `main.py` script currently expects all relevant commands to be present in `PATH`. +The execution scripts expect all relevant commands to be present in `PATH`. This includes the `peakscheck` and `peaksconvert` commands proposed for *MRtrix3*, which currently necessitates installation of the following branch: -https://github.com/MRtrix3/mrtrix3/pull/2918 +https://github.com/MRtrix3/mrtrix3/pull/2918. +The container environment ensures that this is all set up as required. ## Software dependencies diff --git a/dwi_metadata/fsl/fsl.py b/dwi_metadata/fsl/fsl.py index ead5641..5940a19 100755 --- a/dwi_metadata/fsl/fsl.py +++ b/dwi_metadata/fsl/fsl.py @@ -14,7 +14,11 @@ def execute(inputname, inputdir, maskdir, scratchdir): dtifit.run(inputdir, maskdir, dtifitdir) conversiondir = op.join(scratchdir, f'dtifit_{op.basename(inputdir)}_to_scannerspace') dtifit.convert(dtifitdir, conversiondir) - tests.peaks(f'FSL dtifit from {inputname}', conversiondir, maskdir, 'nii') + tests.peaks(f'FSL dtifit from {inputname}', + conversiondir, + maskdir, + 'mif', + 'nii') execute('dcm2niix', op.join(scratchdir, 'dcm2niix'), op.join(scratchdir, 'mask_dcm2niix'), @@ -39,10 +43,18 @@ def execute(inputname, inputdir, maskdir, scratchdir): bedpostx.run(inputdir, maskdir, bedpostxdir) conversiondir = op.join(scratchdir, f'bedpostx_from_{op.basename(inputdir)}_sph2peaks') bedpostx.convert(bedpostxdir, conversiondir, False) - tests.peaks(f'bedpostx from {inputname}; spherical coordinates', conversiondir, maskdir, 'nii') + tests.peaks(f'bedpostx from {inputname}; spherical coordinates', + conversiondir, + maskdir, + 'mif', + 'nii') conversiondir = op.join(scratchdir, f'bedpostx_from_{op.basename(inputdir)}_dyads2peaks') bedpostx.convert(bedpostxdir, conversiondir, True) - tests.peaks(f'bedpostx from {inputname}; 3-vectors', conversiondir, maskdir, 'nii') + tests.peaks(f'bedpostx from {inputname}; 3-vectors', + conversiondir, + maskdir, + 'mif', + 'nii') execute('dcm2niix', op.join(scratchdir, 'dcm2niix'), op.join(scratchdir, 'mask_dcm2niix'), diff --git a/dwi_metadata/mrtrix3/dwi2tensor.py b/dwi_metadata/mrtrix3/dwi2tensor.py index 7b10eda..3d461e5 100755 --- a/dwi_metadata/mrtrix3/dwi2tensor.py +++ b/dwi_metadata/mrtrix3/dwi2tensor.py @@ -32,7 +32,7 @@ def run(indir, extensions, maskdir, dwi2tensordir): + grad_option, check=True) subprocess.run(['tensor2metric', tensor_image_path, - '-vector', op.join(dwi2tensordir, f'{v}_vector.{extensions[0]}'), + '-vector', op.join(dwi2tensordir, f'{v}.{extensions[0]}'), '-mask', mask_path, '-modulate', 'fa', '-quiet'], diff --git a/dwi_metadata/mrtrix3/mrtrix3.py b/dwi_metadata/mrtrix3/mrtrix3.py index d458012..9448c3c 100755 --- a/dwi_metadata/mrtrix3/mrtrix3.py +++ b/dwi_metadata/mrtrix3/mrtrix3.py @@ -115,6 +115,7 @@ def test_dwi2tensor(scratchdir): tests.peaks(f'MRtrix3 dwi2tensor from dcm2niix', op.join(scratchdir, 'dwi2tensor_from_dcm2niix'), op.join(scratchdir, 'mask_dcm2niix'), + 'nii', 'nii') for extensions, reorient in tqdm(itertools.product(EXTENSIONS, (False, True)), desc='Running MRtrix3 dwi2tensor on MRtrix3 mrconvert outputs', @@ -126,5 +127,9 @@ def test_dwi2tensor(scratchdir): extensions, maskdir, outdir) - tests.peaks(f'MRtrix3 dwi2tensor from mrconvert {version_string}', outdir, maskdir, extensions[0]) + tests.peaks(f'MRtrix3 dwi2tensor from mrconvert {version_string}', + outdir, + maskdir, + extensions[0], + extensions[0]) diff --git a/dwi_metadata/tests.py b/dwi_metadata/tests.py index 89d308b..2c7beb8 100755 --- a/dwi_metadata/tests.py +++ b/dwi_metadata/tests.py @@ -179,7 +179,7 @@ def metadata(testname, inputdir, file_extensions): -def peaks(testname, inputdir, maskdir, mask_extension): +def peaks(testname, inputdir, maskdir, image_extension, mask_extension): errors = [] logger.info(f'Verifying peak orientations for {testname}') for v in tqdm(VARIANTS, desc=f'Verifying peak orientations for {testname}', leave=False): @@ -189,7 +189,7 @@ def peaks(testname, inputdir, maskdir, mask_extension): '-npass', '2', '-config', 'RealignTransform', 'False', '-quiet']) - proc = subprocess.run(['peakscheck', op.join(inputdir, f'{v}.mif'), + proc = subprocess.run(['peakscheck', op.join(inputdir, f'{v}.{image_extension}'), '-mask', maskpath, '-quiet'], capture_output=True)