diff --git a/.circleci/AllFieldmaps.sh b/.circleci/AllFieldmaps.sh deleted file mode 100644 index 3ba6c289..00000000 --- a/.circleci/AllFieldmaps.sh +++ /dev/null @@ -1,64 +0,0 @@ -#!/bin/bash - -cat << DOC - -AllFieldmaps test -================= - -Instead of running full workflows, this test checks that workflows can -be built for all sorts of fieldmap configurations. - -This tests the following features: - - Blip-up + Blip-down DWI series for TOPUP/Eddy - - Eddy is run on a CPU - - Denoising is skipped - - A follow-up reconstruction using the dsi_studio_gqi workflow - -Inputs: -------- - - - DSDTI BIDS data (data/DSDTI_fmap) - -DOC -set +e -source ./get_data.sh -TESTDIR=${PWD} -get_config_data ${TESTDIR} -CFG=${TESTDIR}/data/nipype.cfg -EDDY_CFG=${TESTDIR}/data/eddy_config.json -export FS_LICENSE=${TESTDIR}/data/license.txt -get_bids_data ${TESTDIR} fmaps - -# Test blip-up blip-down shelled series (TOPUP/eddy) -TESTNAME=DTI_SDC -setup_dir ${TESTDIR}/${TESTNAME} -TEMPDIR=${TESTDIR}/${TESTNAME}/work -OUTPUT_DIR=${TESTDIR}/${TESTNAME}/derivatives -BIDS_INPUT_DIR=${TESTDIR}/data/fmaptests/DSDTI_fmap -QSIRECON_CMD=$(run_qsirecon_cmd ${BIDS_INPUT_DIR} ${OUTPUT_DIR}) - -${QSIRECON_CMD} \ - -w ${TEMPDIR} \ - --boilerplate \ - --sloppy --write-graph --mem_mb 4096 \ - -vv --output-resolution 5 - -# Test blip-up blip-down non-shelled series (SHORELine/sdcflows) -TESTNAME=DSI_SDC -setup_dir ${TESTDIR}/${TESTNAME} -TEMPDIR=${TESTDIR}/${TESTNAME}/work -OUTPUT_DIR=${TESTDIR}/${TESTNAME}/derivatives -BIDS_INPUT_DIR=${TESTDIR}/data/fmaptests/DSCSDSI_fmap -QSIRECON_CMD=$(run_qsirecon_cmd ${BIDS_INPUT_DIR} ${OUTPUT_DIR}) - -# Test blip-up blip-down shelled series (TOPUP/eddy) -${QSIRECON_CMD} \ - -w ${TEMPDIR} \ - --boilerplate \ - --hmc-model 3dSHORE \ - --sloppy --write-graph --mem_mb 4096 \ - -vv --output-resolution 5 - - - - diff --git a/.circleci/DRBUDDI_SHORELine_epi.sh b/.circleci/DRBUDDI_SHORELine_epi.sh deleted file mode 100644 index 5f96db3a..00000000 --- a/.circleci/DRBUDDI_SHORELine_epi.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash - -cat << DOC - -Test EPI fieldmap correction with SHORELine + DRBUDDI -===================================================== - -This tests the following features: - - SHORELine (here, just b=0 registration) motion correction - - - -DOC - -set +e -source ./get_data.sh -TESTDIR=${PWD} -TESTNAME=DRBUDDI_SHORELINE_EPI -get_config_data ${TESTDIR} -get_bids_data ${TESTDIR} drbuddi_epi -CFG=${TESTDIR}/data/nipype.cfg - -# For the run -setup_dir ${TESTDIR}/${TESTNAME} -TEMPDIR=${TESTDIR}/${TESTNAME}/work -OUTPUT_DIR=${TESTDIR}/${TESTNAME}/derivatives -BIDS_INPUT_DIR=${TESTDIR}/data/tinytensor_epi -export FS_LICENSE=${TESTDIR}/data/license.txt -QSIRECON_CMD=$(run_qsirecon_cmd ${BIDS_INPUT_DIR} ${OUTPUT_DIR}) - -# Do the anatomical run on its own -${QSIRECON_CMD} \ - -w ${TEMPDIR} \ - --sloppy \ - --anat-modality none \ - --denoise-method none \ - --b1-biascorrect-stage none \ - --pepolar-method DRBUDDI \ - --hmc-model none \ - --output-resolution 2 \ - --shoreline-iters 1 \ - -vv --stop-on-first-crash - - diff --git a/.circleci/DRBUDDI_TENSORLine_epi.sh b/.circleci/DRBUDDI_TENSORLine_epi.sh deleted file mode 100644 index 7d6fd48c..00000000 --- a/.circleci/DRBUDDI_TENSORLine_epi.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/bash - -cat << DOC - -Test EPI fieldmap correction with TENSORLine + DRBUDDI -====================================================== - -This tests the following features: - - TENSORLine (tensor-based) motion correction - -DOC - -set +e -source ./get_data.sh -TESTDIR=${PWD} -TESTNAME=DRBUDDI_TENSORLINE_EPI -get_config_data ${TESTDIR} -get_bids_data ${TESTDIR} DSDTI -CFG=${TESTDIR}/data/nipype.cfg - -# For the run -setup_dir ${TESTDIR}/${TESTNAME} -TEMPDIR=${TESTDIR}/${TESTNAME}/work -OUTPUT_DIR=${TESTDIR}/${TESTNAME}/derivatives -BIDS_INPUT_DIR=${TESTDIR}/data/DSDTI -export FS_LICENSE=${TESTDIR}/data/license.txt -QSIRECON_CMD=$(run_qsirecon_cmd ${BIDS_INPUT_DIR} ${OUTPUT_DIR}) - -# Do the anatomical run on its own -${QSIRECON_CMD} \ - -w ${TEMPDIR} \ - --sloppy \ - --anat-modality none \ - --denoise-method none \ - --b1-biascorrect-stage none \ - --pepolar-method DRBUDDI \ - --hmc-model tensor \ - --output-resolution 2 \ - --shoreline-iters 1 \ - -vv --stop-on-first-crash \ No newline at end of file diff --git a/.circleci/DRBUDDI_eddy_rpe_series.sh b/.circleci/DRBUDDI_eddy_rpe_series.sh deleted file mode 100644 index 7583bd6f..00000000 --- a/.circleci/DRBUDDI_eddy_rpe_series.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash - -cat << DOC - -Test paired DWI series with DRBUDDI -=================================== - -This tests the following features: - - Eddy is run on a CPU - - DRBUDDI is run with two DWI series - -DOC - -set +e -source ./get_data.sh -TESTDIR=${PWD} -TESTNAME=DRBUDDI_RPE -get_config_data ${TESTDIR} -get_bids_data ${TESTDIR} drbuddi_rpe_series -CFG=${TESTDIR}/data/nipype.cfg -EDDY_CFG=${TESTDIR}/data/eddy_config.json - -# For the run -setup_dir ${TESTDIR}/${TESTNAME} -TEMPDIR=${TESTDIR}/${TESTNAME}/work -OUTPUT_DIR=${TESTDIR}/${TESTNAME}/derivatives -BIDS_INPUT_DIR=${TESTDIR}/data/tinytensor_rpe_series -export FS_LICENSE=${TESTDIR}/data/license.txt -QSIRECON_CMD=$(run_qsirecon_cmd ${BIDS_INPUT_DIR} ${OUTPUT_DIR}) - -# Do the anatomical run on its own -${QSIRECON_CMD} \ - -w ${TEMPDIR} \ - --sloppy \ - --anat-modality none \ - --denoise-method none \ - --b1_biascorrect_stage none \ - --pepolar-method DRBUDDI \ - --eddy_config ${EDDY_CFG} \ - --output-resolution 5 \ - -vv --stop-on-first-crash - - diff --git a/.circleci/DSCSDSI.sh b/.circleci/DSCSDSI.sh deleted file mode 100644 index 7c192888..00000000 --- a/.circleci/DSCSDSI.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/bash - -cat << DOC - -DSCSDSI test -============ - -This tests the following features: - - Whether the --anat-only workflow is successful - - Whether the regular qsirecon workflow can resume using the - working directory from --anat-only - - The SHORELine motion correction workflow - - Skipping B1 biascorrection - - Using the SyN-SDC distortion correction method - -Inputs: -------- - - - DSCSDSI BIDS data (data/DSCSDSI_nofmap) - -DOC -set +e -# Setup environment and get data -source ./get_data.sh -TESTDIR=${PWD} -TESTNAME=DSCSDSI -get_config_data ${TESTDIR} -get_bids_data ${TESTDIR} DSCSDSI -CFG=${TESTDIR}/data/nipype.cfg - -# For the run -setup_dir ${TESTDIR}/${TESTNAME} -TEMPDIR=${TESTDIR}/${TESTNAME}/work -OUTPUT_DIR=${TESTDIR}/${TESTNAME}/derivatives -BIDS_INPUT_DIR=${TESTDIR}/data/DSCSDSI_nofmap -export FS_LICENSE=${TESTDIR}/data/license.txt -QSIRECON_CMD=$(run_qsirecon_cmd ${BIDS_INPUT_DIR} ${OUTPUT_DIR}) - -# name: Run full qsirecon on DSCSDSI -${QSIRECON_CMD} \ - -w ${TEMPDIR} \ - --sloppy --write-graph --use-syn-sdc \ - --force-syn \ - --b1_biascorrect_stage none \ - --hmc_model 3dSHORE \ - --hmc-transform Rigid \ - --shoreline_iters 1 \ - --output-resolution 5 \ - --stop-on-first-crash \ - -vv - diff --git a/.circleci/DSCSDSI_outputs.txt b/.circleci/DSCSDSI_outputs.txt deleted file mode 100644 index dbc0cfca..00000000 --- a/.circleci/DSCSDSI_outputs.txt +++ /dev/null @@ -1,48 +0,0 @@ -qsirecon -qsirecon/dataset_description.json -qsirecon/dwiqc.json -qsirecon/logs -qsirecon/logs/CITATION.html -qsirecon/logs/CITATION.md -qsirecon/logs/CITATION.tex -qsirecon/sub-tester -qsirecon/sub-tester/anat -qsirecon/sub-tester/anat/sub-tester_desc-brain_mask.nii.gz -qsirecon/sub-tester/anat/sub-tester_desc-preproc_T1w.nii.gz -qsirecon/sub-tester/anat/sub-tester_dseg.nii.gz -qsirecon/sub-tester/anat/sub-tester_from-MNI152NLin2009cAsym_to-T1w_mode-image_xfm.h5 -qsirecon/sub-tester/anat/sub-tester_from-orig_to-T1w_mode-image_xfm.txt -qsirecon/sub-tester/anat/sub-tester_from-T1w_to-MNI152NLin2009cAsym_mode-image_xfm.h5 -qsirecon/sub-tester/anat/sub-tester_label-CSF_probseg.nii.gz -qsirecon/sub-tester/anat/sub-tester_label-GM_probseg.nii.gz -qsirecon/sub-tester/anat/sub-tester_label-WM_probseg.nii.gz -qsirecon/sub-tester/anat/sub-tester_space-MNI152NLin2009cAsym_desc-brain_mask.nii.gz -qsirecon/sub-tester/anat/sub-tester_space-MNI152NLin2009cAsym_desc-preproc_T1w.nii.gz -qsirecon/sub-tester/anat/sub-tester_space-MNI152NLin2009cAsym_dseg.nii.gz -qsirecon/sub-tester/anat/sub-tester_space-MNI152NLin2009cAsym_label-CSF_probseg.nii.gz -qsirecon/sub-tester/anat/sub-tester_space-MNI152NLin2009cAsym_label-GM_probseg.nii.gz -qsirecon/sub-tester/anat/sub-tester_space-MNI152NLin2009cAsym_label-WM_probseg.nii.gz -qsirecon/sub-tester/dwi -qsirecon/sub-tester/dwi/sub-tester_acq-HASC55AP_confounds.tsv -qsirecon/sub-tester/dwi/sub-tester_acq-HASC55AP_desc-ImageQC_dwi.csv -qsirecon/sub-tester/dwi/sub-tester_acq-HASC55AP_desc-SliceQC_dwi.json -qsirecon/sub-tester/dwi/sub-tester_acq-HASC55AP_dwiqc.json -qsirecon/sub-tester/dwi/sub-tester_acq-HASC55AP_space-T1w_desc-3dSHORE_cnr.nii.gz -qsirecon/sub-tester/dwi/sub-tester_acq-HASC55AP_space-T1w_desc-brain_mask.nii.gz -qsirecon/sub-tester/dwi/sub-tester_acq-HASC55AP_space-T1w_desc-preproc_dwi.b -qsirecon/sub-tester/dwi/sub-tester_acq-HASC55AP_space-T1w_desc-preproc_dwi.bval -qsirecon/sub-tester/dwi/sub-tester_acq-HASC55AP_space-T1w_desc-preproc_dwi.bvec -qsirecon/sub-tester/dwi/sub-tester_acq-HASC55AP_space-T1w_desc-preproc_dwi.nii.gz -qsirecon/sub-tester/dwi/sub-tester_acq-HASC55AP_space-T1w_dwiref.nii.gz -qsirecon/sub-tester/figures -qsirecon/sub-tester/figures/sub-tester_acq-HASC55AP_carpetplot.svg -qsirecon/sub-tester/figures/sub-tester_acq-HASC55AP_coreg.svg -qsirecon/sub-tester/figures/sub-tester_acq-HASC55AP_desc-resampled_b0ref.svg -qsirecon/sub-tester/figures/sub-tester_acq-HASC55AP_desc-sdc_b0.svg -qsirecon/sub-tester/figures/sub-tester_acq-HASC55AP_dwi_denoise_acq_HASC55AP_dwi_wf_denoising.svg -qsirecon/sub-tester/figures/sub-tester_acq-HASC55AP_sampling_scheme.gif -qsirecon/sub-tester/figures/sub-tester_acq-HASC55AP_shoreline_animation.gif -qsirecon/sub-tester/figures/sub-tester_seg_brainmask.svg -qsirecon/sub-tester/figures/sub-tester_t1_2_mni.svg -qsirecon/sub-tester.html -/tmp/DSCSDSI/derivatives diff --git a/.circleci/DSDTI_TOPUP.sh b/.circleci/DSDTI_TOPUP.sh deleted file mode 100644 index 9fb4beb4..00000000 --- a/.circleci/DSDTI_TOPUP.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/bash - -cat << DOC - -DSCDTI_TOPUP test -================= - -This tests the following features: - - TOPUP on a single-shell sequence - - Eddy is run on a CPU - - mrdegibbs is run - - A follow-up reconstruction using the dsi_studio_gqi workflow - -Inputs: -------- - - - DSDTI BIDS data (data/DSDTI) - -DOC - -set +e -source ./get_data.sh -TESTDIR=${PWD} -TESTNAME=DSDTI_TOPUP -get_config_data ${TESTDIR} -get_bids_data ${TESTDIR} DSDTI -CFG=${TESTDIR}/data/nipype.cfg -EDDY_CFG=${TESTDIR}/data/eddy_config.json - -# For the run -setup_dir ${TESTDIR}/${TESTNAME} -TEMPDIR=${TESTDIR}/${TESTNAME}/work -OUTPUT_DIR=${TESTDIR}/${TESTNAME}/derivatives -BIDS_INPUT_DIR=${TESTDIR}/data/DSDTI -export FS_LICENSE=${TESTDIR}/data/license.txt -QSIRECON_CMD=$(run_qsirecon_cmd ${BIDS_INPUT_DIR} ${OUTPUT_DIR}) - -# Do the anatomical run on its own -${QSIRECON_CMD} \ - -w ${TEMPDIR} \ - --sloppy \ - --unringing-method mrdegibbs \ - --b1-biascorrect-stage legacy \ - --recon-spec dsi_studio_gqi \ - --eddy_config ${EDDY_CFG} \ - --output-resolution 5 \ - -vv - - diff --git a/.circleci/DSDTI_nofmap.sh b/.circleci/DSDTI_nofmap.sh deleted file mode 100644 index a334ed0b..00000000 --- a/.circleci/DSDTI_nofmap.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/bash - -cat << DOC - -DSCDTI_nofmap test -================== - -This tests the following features: - - A workflow with no distortion correction followed by eddy - - Eddy is run on a CPU - - Denoising is skipped - - A follow-up reconstruction using the dsi_studio_gqi workflow - -Inputs: -------- - - - DSDTI BIDS data (data/DSDTI) - -DOC -set +e -source ./get_data.sh -TESTDIR=${PWD} -TESTNAME=DSDTI_nofmap -get_config_data ${TESTDIR} -get_bids_data ${TESTDIR} DSDTI -CFG=${TESTDIR}/data/nipype.cfg -EDDY_CFG=${TESTDIR}/data/eddy_config.json - -# For the run -setup_dir ${TESTDIR}/${TESTNAME} -TEMPDIR=${TESTDIR}/${TESTNAME}/work -OUTPUT_DIR=${TESTDIR}/${TESTNAME}/derivatives -BIDS_INPUT_DIR=${TESTDIR}/data/DSDTI -export FS_LICENSE=${TESTDIR}/data/license.txt -QSIRECON_CMD=$(run_qsirecon_cmd ${BIDS_INPUT_DIR} ${OUTPUT_DIR}) - -# CRITICAL: delete the fieldmap data -rm -rf data/DSDTI/sub-PNC/fmap - -# Do the anatomical run on its own -${QSIRECON_CMD} \ - -w ${TEMPDIR} \ - --eddy-config ${EDDY_CFG} \ - --denoise-method none \ - --unringing-method rpg \ - --b1-biascorrect-stage none \ - --sloppy \ - --output-resolution 5 \ - -vv diff --git a/.circleci/DSDTI_nofmap_outputs.txt b/.circleci/DSDTI_nofmap_outputs.txt deleted file mode 100644 index ed902888..00000000 --- a/.circleci/DSDTI_nofmap_outputs.txt +++ /dev/null @@ -1,48 +0,0 @@ -qsirecon -qsirecon/dataset_description.json -qsirecon/dwiqc.json -qsirecon/logs -qsirecon/logs/CITATION.html -qsirecon/logs/CITATION.md -qsirecon/logs/CITATION.tex -qsirecon/sub-PNC -qsirecon/sub-PNC/anat -qsirecon/sub-PNC/anat/sub-PNC_desc-brain_mask.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_desc-preproc_T1w.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_dseg.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_from-MNI152NLin2009cAsym_to-T1w_mode-image_xfm.h5 -qsirecon/sub-PNC/anat/sub-PNC_from-orig_to-T1w_mode-image_xfm.txt -qsirecon/sub-PNC/anat/sub-PNC_from-T1w_to-MNI152NLin2009cAsym_mode-image_xfm.h5 -qsirecon/sub-PNC/anat/sub-PNC_label-CSF_probseg.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_label-GM_probseg.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_label-WM_probseg.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_space-MNI152NLin2009cAsym_desc-brain_mask.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_space-MNI152NLin2009cAsym_desc-preproc_T1w.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_space-MNI152NLin2009cAsym_dseg.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_space-MNI152NLin2009cAsym_label-CSF_probseg.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_space-MNI152NLin2009cAsym_label-GM_probseg.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_space-MNI152NLin2009cAsym_label-WM_probseg.nii.gz -qsirecon/sub-PNC/dwi -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_confounds.tsv -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_desc-ImageQC_dwi.csv -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_desc-SliceQC_dwi.json -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_dwiqc.json -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-brain_mask.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-eddy_cnr.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_dwi.b -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_dwi.bval -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_dwi.bvec -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_dwi.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_dwiref.nii.gz -qsirecon/sub-PNC/figures -qsirecon/sub-PNC/figures/sub-PNC_acq-realistic_carpetplot.svg -qsirecon/sub-PNC/figures/sub-PNC_acq-realistic_coreg.svg -qsirecon/sub-PNC/figures/sub-PNC_acq-realistic_desc-resampled_b0ref.svg -qsirecon/sub-PNC/figures/sub-PNC_acq-realistic_desc-sdc_b0.svg -qsirecon/sub-PNC/figures/sub-PNC_acq-realistic_dwi_denoise_acq_realistic_dwi_wf_biascorr.svg -qsirecon/sub-PNC/figures/sub-PNC_acq-realistic_dwi_denoise_acq_realistic_dwi_wf_denoising.svg -qsirecon/sub-PNC/figures/sub-PNC_acq-realistic_sampling_scheme.gif -qsirecon/sub-PNC/figures/sub-PNC_seg_brainmask.svg -qsirecon/sub-PNC/figures/sub-PNC_t1_2_mni.svg -qsirecon/sub-PNC.html -/tmp/DSDTI/nofmap_derivatives diff --git a/.circleci/DSDTI_outputs.txt b/.circleci/DSDTI_outputs.txt deleted file mode 100644 index cfec9cc2..00000000 --- a/.circleci/DSDTI_outputs.txt +++ /dev/null @@ -1,117 +0,0 @@ -qsirecon -qsirecon/dataset_description.json -qsirecon/dwiqc.json -qsirecon/logs -qsirecon/logs/CITATION.html -qsirecon/logs/CITATION.md -qsirecon/logs/CITATION.tex -qsirecon/sub-PNC -qsirecon/sub-PNC/anat -qsirecon/sub-PNC/anat/sub-PNC_desc-brain_mask.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_desc-preproc_T1w.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_dseg.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_from-MNI152NLin2009cAsym_to-T1w_mode-image_xfm.h5 -qsirecon/sub-PNC/anat/sub-PNC_from-orig_to-T1w_mode-image_xfm.txt -qsirecon/sub-PNC/anat/sub-PNC_from-T1w_to-MNI152NLin2009cAsym_mode-image_xfm.h5 -qsirecon/sub-PNC/anat/sub-PNC_label-CSF_probseg.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_label-GM_probseg.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_label-WM_probseg.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_space-MNI152NLin2009cAsym_desc-brain_mask.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_space-MNI152NLin2009cAsym_desc-preproc_T1w.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_space-MNI152NLin2009cAsym_dseg.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_space-MNI152NLin2009cAsym_label-CSF_probseg.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_space-MNI152NLin2009cAsym_label-GM_probseg.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_space-MNI152NLin2009cAsym_label-WM_probseg.nii.gz -qsirecon/sub-PNC/dwi -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_confounds.tsv -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_desc-ImageQC_dwi.csv -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_desc-SliceQC_dwi.json -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_dwiqc.json -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-brain_mask.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-eddy_cnr.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_dwi.b -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_dwi.bval -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_dwi.bvec -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_dwi.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_dwiref.nii.gz -qsirecon/sub-PNC/figures -qsirecon/sub-PNC/figures/sub-PNC_acq-realistic_carpetplot.svg -qsirecon/sub-PNC/figures/sub-PNC_acq-realistic_coreg.svg -qsirecon/sub-PNC/figures/sub-PNC_acq-realistic_desc-resampled_b0ref.svg -qsirecon/sub-PNC/figures/sub-PNC_acq-realistic_desc-sdc_b0.svg -qsirecon/sub-PNC/figures/sub-PNC_acq-realistic_dwi_denoise_acq_realistic_dwi_wf_biascorr.svg -qsirecon/sub-PNC/figures/sub-PNC_acq-realistic_dwi_denoise_acq_realistic_dwi_wf_denoising.svg -qsirecon/sub-PNC/figures/sub-PNC_acq-realistic_dwi_denoise_acq_realistic_dwi_wf_unringing.svg -qsirecon/sub-PNC/figures/sub-PNC_acq-realistic_sampling_scheme.gif -qsirecon/sub-PNC/figures/sub-PNC_seg_brainmask.svg -qsirecon/sub-PNC/figures/sub-PNC_t1_2_mni.svg -qsirecon/sub-PNC.html -qsirecon -qsirecon/dwiqc.json -qsirecon/logs -qsirecon/logs/CITATION.html -qsirecon/logs/CITATION.md -qsirecon/logs/CITATION.tex -qsirecon/sub-PNC -qsirecon/sub-PNC/dwi -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-aal116_atlas.mif.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-aal116_atlas.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-aal116_mrtrixLUT.txt -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-aal116_origLUT.txt -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-ad_gqiscalar.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-aicha384_atlas.mif.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-aicha384_atlas.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-aicha384_mrtrixLUT.txt -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-aicha384_origLUT.txt -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-brainnetome246_atlas.mif.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-brainnetome246_atlas.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-brainnetome246_mrtrixLUT.txt -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-brainnetome246_origLUT.txt -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-dti_fa_gqiscalar.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-fa0_gqiscalar.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-fa1_gqiscalar.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-fa2_gqiscalar.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-gfa_gqiscalar.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-gordon333_atlas.mif.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-gordon333_atlas.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-gordon333_mrtrixLUT.txt -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-gordon333_origLUT.txt -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-iso_gqiscalar.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-md_gqiscalar.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-power264_atlas.mif.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-power264_atlas.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-power264_mrtrixLUT.txt -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-power264_origLUT.txt -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-rd_gqiscalar.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-schaefer100x17_atlas.mif.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-schaefer100x17_atlas.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-schaefer100x17_mrtrixLUT.txt -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-schaefer100x17_origLUT.txt -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-schaefer100x7_atlas.mif.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-schaefer100x7_atlas.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-schaefer100x7_mrtrixLUT.txt -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-schaefer100x7_origLUT.txt -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-schaefer200x17_atlas.mif.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-schaefer200x17_atlas.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-schaefer200x17_mrtrixLUT.txt -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-schaefer200x17_origLUT.txt -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-schaefer200x7_atlas.mif.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-schaefer200x7_atlas.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-schaefer200x7_mrtrixLUT.txt -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-schaefer200x7_origLUT.txt -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-schaefer400x17_atlas.mif.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-schaefer400x17_atlas.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-schaefer400x17_mrtrixLUT.txt -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-schaefer400x17_origLUT.txt -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-schaefer400x7_atlas.mif.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-schaefer400x7_atlas.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-schaefer400x7_mrtrixLUT.txt -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-schaefer400x7_origLUT.txt -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_gqi.fib.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_gqinetwork.mat -qsirecon/sub-PNC/figures -qsirecon/sub-PNC/figures/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-DSIStudioConnectivity_matrices.svg -qsirecon/sub-PNC/figures/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-GQIODF_odfs.png -qsirecon/sub-PNC/figures/sub-PNC_acq-realistic_space-T1w_desc-preproc_space-T1w_desc-GQIODF_peaks.png -qsirecon/sub-PNC.html -/tmp/DSDTI/derivatives diff --git a/.circleci/DSDTI_synfmap.sh b/.circleci/DSDTI_synfmap.sh deleted file mode 100644 index f1fc48aa..00000000 --- a/.circleci/DSDTI_synfmap.sh +++ /dev/null @@ -1,53 +0,0 @@ -#!/bin/bash - -cat << DOC - -DSCDTI_nofmap test -================== - -This tests the following features: - - A workflow with no distortion correction followed by eddy - - Eddy is run on a CPU - - Denoising is skipped - - A follow-up reconstruction using the dsi_studio_gqi workflow - -Inputs: -------- - - - DSDTI BIDS data (data/DSDTI) - -DOC -set +e - -source ./get_data.sh -TESTDIR=${PWD} -TESTNAME=DSDTI_nofmap -get_config_data ${TESTDIR} -get_bids_data ${TESTDIR} DSDTI -CFG=${TESTDIR}/data/nipype.cfg -EDDY_CFG=${TESTDIR}/data/eddy_config.json - -# For the run -setup_dir ${TESTDIR}/${TESTNAME} -TEMPDIR=${TESTDIR}/${TESTNAME}/work -OUTPUT_DIR=${TESTDIR}/${TESTNAME}/derivatives -BIDS_INPUT_DIR=${TESTDIR}/data/DSDTI -export FS_LICENSE=${TESTDIR}/data/license.txt -QSIRECON_CMD=$(run_qsirecon_cmd ${BIDS_INPUT_DIR} ${OUTPUT_DIR}) - -# CRITICAL: delete the fieldmap data -rm -rf data/DSDTI/sub-PNC/fmap - - -${QSIRECON_CMD} \ - -w ${TEMPDIR} \ - --eddy-config ${EDDY_CFG} \ - --sloppy \ - --force-syn \ - --b1-biascorrect-stage final \ - --denoise-method none \ - --output-resolution 5 \ - -vv - - - diff --git a/.circleci/DSDTI_synsdc_outputs.txt b/.circleci/DSDTI_synsdc_outputs.txt deleted file mode 100644 index a94a9fac..00000000 --- a/.circleci/DSDTI_synsdc_outputs.txt +++ /dev/null @@ -1,48 +0,0 @@ -qsirecon -qsirecon/dataset_description.json -qsirecon/dwiqc.json -qsirecon/logs -qsirecon/logs/CITATION.html -qsirecon/logs/CITATION.md -qsirecon/logs/CITATION.tex -qsirecon/sub-PNC -qsirecon/sub-PNC/anat -qsirecon/sub-PNC/anat/sub-PNC_desc-brain_mask.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_desc-preproc_T1w.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_dseg.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_from-MNI152NLin2009cAsym_to-T1w_mode-image_xfm.h5 -qsirecon/sub-PNC/anat/sub-PNC_from-orig_to-T1w_mode-image_xfm.txt -qsirecon/sub-PNC/anat/sub-PNC_from-T1w_to-MNI152NLin2009cAsym_mode-image_xfm.h5 -qsirecon/sub-PNC/anat/sub-PNC_label-CSF_probseg.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_label-GM_probseg.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_label-WM_probseg.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_space-MNI152NLin2009cAsym_desc-brain_mask.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_space-MNI152NLin2009cAsym_desc-preproc_T1w.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_space-MNI152NLin2009cAsym_dseg.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_space-MNI152NLin2009cAsym_label-CSF_probseg.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_space-MNI152NLin2009cAsym_label-GM_probseg.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_space-MNI152NLin2009cAsym_label-WM_probseg.nii.gz -qsirecon/sub-PNC/dwi -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_confounds.tsv -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_desc-ImageQC_dwi.csv -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_desc-SliceQC_dwi.json -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_dwiqc.json -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-brain_mask.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-eddy_cnr.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_dwi.b -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_dwi.bval -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_dwi.bvec -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_dwi.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_dwiref.nii.gz -qsirecon/sub-PNC/figures -qsirecon/sub-PNC/figures/sub-PNC_acq-realistic_carpetplot.svg -qsirecon/sub-PNC/figures/sub-PNC_acq-realistic_coreg.svg -qsirecon/sub-PNC/figures/sub-PNC_acq-realistic_desc-resampled_b0ref.svg -qsirecon/sub-PNC/figures/sub-PNC_acq-realistic_desc-sdc_b0.svg -qsirecon/sub-PNC/figures/sub-PNC_acq-realistic_dwi_denoise_acq_realistic_dwi_wf_biascorr.svg -qsirecon/sub-PNC/figures/sub-PNC_acq-realistic_dwi_denoise_acq_realistic_dwi_wf_denoising.svg -qsirecon/sub-PNC/figures/sub-PNC_acq-realistic_sampling_scheme.gif -qsirecon/sub-PNC/figures/sub-PNC_seg_brainmask.svg -qsirecon/sub-PNC/figures/sub-PNC_t1_2_mni.svg -qsirecon/sub-PNC.html -/tmp/DSDTI/synfmap_derivatives diff --git a/.circleci/HBCD_preproc.sh b/.circleci/HBCD_preproc.sh deleted file mode 100644 index 6767ecde..00000000 --- a/.circleci/HBCD_preproc.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/bash - -cat << DOC - -Test paired DWI series with DRBUDDI -=================================== - -This tests the following features: - - Eddy is run on a CPU - - DRBUDDI is run with two DWI series - -DOC - -set +e -source ./get_data.sh -TESTDIR=${PWD} -TESTNAME=HBCD -get_config_data ${TESTDIR} -get_bids_data ${TESTDIR} HBCD -CFG=${TESTDIR}/data/nipype.cfg -EDDY_CFG=${TESTDIR}/data/eddy_config.json - -# For the run -setup_dir ${TESTDIR}/${TESTNAME} -TEMPDIR=${TESTDIR}/${TESTNAME}/work -OUTPUT_DIR=${TESTDIR}/${TESTNAME}/derivatives -BIDS_INPUT_DIR=${TESTDIR}/data/hbcd_sim -export FS_LICENSE=${TESTDIR}/data/license.txt -QSIRECON_CMD=$(run_qsirecon_cmd ${BIDS_INPUT_DIR} ${OUTPUT_DIR}) - -# Do the HBCD-style run -${QSIRECON_CMD} \ - -w ${TEMPDIR} \ - --sloppy \ - --anat-modality T2w \ - --infant \ - --denoise-method dwidenoise \ - --b1_biascorrect_stage none \ - --pepolar-method DRBUDDI \ - --eddy_config ${EDDY_CFG} \ - --output-resolution 5 \ - -vv --stop-on-first-crash - - diff --git a/.circleci/IntramodalTemplate.sh b/.circleci/IntramodalTemplate.sh deleted file mode 100644 index 42afef6d..00000000 --- a/.circleci/IntramodalTemplate.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/bash - -cat << DOC - -IntramodalTemplate test -======================= - -A two-session dataset is used to create an intramodal template. - -This tests the following features: - - Blip-up + Blip-down DWI series for TOPUP/Eddy - - Eddy is run on a CPU - - Denoising is skipped - - A follow-up reconstruction using the dsi_studio_gqi workflow - -Inputs: -------- - - - twoses BIDS data (data/DSDTI_fmap) - -DOC -set +e - -source ./get_data.sh -TESTDIR=${PWD} -get_config_data ${TESTDIR} -get_bids_data ${TESTDIR} twoses -CFG=${TESTDIR}/data/nipype.cfg -EDDY_CFG=${TESTDIR}/data/eddy_config.json -export FS_LICENSE=${TESTDIR}/data/license.txt - -# Test blip-up blip-down shelled series (TOPUP/eddy) -TESTNAME=imtemplate -setup_dir ${TESTDIR}/${TESTNAME} -TEMPDIR=${TESTDIR}/${TESTNAME}/work -OUTPUT_DIR=${TESTDIR}/${TESTNAME}/derivatives -BIDS_INPUT_DIR=${TESTDIR}/data/twoses -QSIRECON_CMD=$(run_qsirecon_cmd ${BIDS_INPUT_DIR} ${OUTPUT_DIR}) - -${QSIRECON_CMD} \ - -w ${TEMPDIR} \ - --sloppy \ - --b1_biascorrect_stage none \ - --hmc_model none \ - --b0-motion-corr-to first \ - --output-resolution 5 \ - --intramodal-template-transform BSplineSyN \ - --intramodal-template-iters 2 \ - -vv diff --git a/.circleci/IntramodalTemplate_outputs.txt b/.circleci/IntramodalTemplate_outputs.txt deleted file mode 100644 index a7519928..00000000 --- a/.circleci/IntramodalTemplate_outputs.txt +++ /dev/null @@ -1,69 +0,0 @@ -qsirecon -qsirecon/dataset_description.json -qsirecon/dwiqc.json -qsirecon/logs -qsirecon/logs/CITATION.html -qsirecon/logs/CITATION.md -qsirecon/logs/CITATION.tex -qsirecon/sub-tester -qsirecon/sub-tester/anat -qsirecon/sub-tester/anat/sub-tester_desc-brain_mask.nii.gz -qsirecon/sub-tester/anat/sub-tester_desc-preproc_T1w.nii.gz -qsirecon/sub-tester/anat/sub-tester_dseg.nii.gz -qsirecon/sub-tester/anat/sub-tester_from-MNI152NLin2009cAsym_to-T1w_mode-image_xfm.h5 -qsirecon/sub-tester/anat/sub-tester_from-T1w_to-MNI152NLin2009cAsym_mode-image_xfm.h5 -qsirecon/sub-tester/anat/sub-tester_label-CSF_probseg.nii.gz -qsirecon/sub-tester/anat/sub-tester_label-GM_probseg.nii.gz -qsirecon/sub-tester/anat/sub-tester_label-WM_probseg.nii.gz -qsirecon/sub-tester/anat/sub-tester_space-MNI152NLin2009cAsym_desc-brain_mask.nii.gz -qsirecon/sub-tester/anat/sub-tester_space-MNI152NLin2009cAsym_desc-preproc_T1w.nii.gz -qsirecon/sub-tester/anat/sub-tester_space-MNI152NLin2009cAsym_dseg.nii.gz -qsirecon/sub-tester/anat/sub-tester_space-MNI152NLin2009cAsym_label-CSF_probseg.nii.gz -qsirecon/sub-tester/anat/sub-tester_space-MNI152NLin2009cAsym_label-GM_probseg.nii.gz -qsirecon/sub-tester/anat/sub-tester_space-MNI152NLin2009cAsym_label-WM_probseg.nii.gz -qsirecon/sub-tester/figures -qsirecon/sub-tester/figures/sub-tester_imtcoreg.svg -qsirecon/sub-tester/figures/sub-tester_seg_brainmask.svg -qsirecon/sub-tester/figures/sub-tester_ses-1_acq-HASC55PA_carpetplot.svg -qsirecon/sub-tester/figures/sub-tester_ses-1_acq-HASC55PA_coreg.svg -qsirecon/sub-tester/figures/sub-tester_ses-1_acq-HASC55PA_desc-resampled_b0ref.svg -qsirecon/sub-tester/figures/sub-tester_ses-1_acq-HASC55PA_dwi_denoise_ses_1_acq_HASC55PA_dwi_wf_biascorr.svg -qsirecon/sub-tester/figures/sub-tester_ses-1_acq-HASC55PA_sampling_scheme.gif -qsirecon/sub-tester/figures/sub-tester_ses-1_acq-HASC55PA_tointramodal.svg -qsirecon/sub-tester/figures/sub-tester_ses-2_acq-HASC55AP_carpetplot.svg -qsirecon/sub-tester/figures/sub-tester_ses-2_acq-HASC55AP_coreg.svg -qsirecon/sub-tester/figures/sub-tester_ses-2_acq-HASC55AP_desc-resampled_b0ref.svg -qsirecon/sub-tester/figures/sub-tester_ses-2_acq-HASC55AP_dwi_denoise_ses_2_acq_HASC55AP_dwi_wf_biascorr.svg -qsirecon/sub-tester/figures/sub-tester_ses-2_acq-HASC55AP_sampling_scheme.gif -qsirecon/sub-tester/figures/sub-tester_ses-2_acq-HASC55AP_tointramodal.svg -qsirecon/sub-tester/figures/sub-tester_t1_2_mni.svg -qsirecon/sub-tester.html -qsirecon/sub-tester/ses-1 -qsirecon/sub-tester/ses-1/anat -qsirecon/sub-tester/ses-1/anat/sub-tester_ses-1_from-orig_to-T1w_mode-image_xfm.txt -qsirecon/sub-tester/ses-1/dwi -qsirecon/sub-tester/ses-1/dwi/sub-tester_ses-1_acq-HASC55PA_confounds.tsv -qsirecon/sub-tester/ses-1/dwi/sub-tester_ses-1_acq-HASC55PA_desc-ImageQC_dwi.csv -qsirecon/sub-tester/ses-1/dwi/sub-tester_ses-1_acq-HASC55PA_desc-SliceQC_dwi.json -qsirecon/sub-tester/ses-1/dwi/sub-tester_ses-1_acq-HASC55PA_dwiqc.json -qsirecon/sub-tester/ses-1/dwi/sub-tester_ses-1_acq-HASC55PA_space-T1w_desc-brain_mask.nii.gz -qsirecon/sub-tester/ses-1/dwi/sub-tester_ses-1_acq-HASC55PA_space-T1w_desc-none_cnr.nii.gz -qsirecon/sub-tester/ses-1/dwi/sub-tester_ses-1_acq-HASC55PA_space-T1w_desc-preproc_dwi.b -qsirecon/sub-tester/ses-1/dwi/sub-tester_ses-1_acq-HASC55PA_space-T1w_desc-preproc_dwi.bval -qsirecon/sub-tester/ses-1/dwi/sub-tester_ses-1_acq-HASC55PA_space-T1w_desc-preproc_dwi.bvec -qsirecon/sub-tester/ses-1/dwi/sub-tester_ses-1_acq-HASC55PA_space-T1w_desc-preproc_dwi.nii.gz -qsirecon/sub-tester/ses-1/dwi/sub-tester_ses-1_acq-HASC55PA_space-T1w_dwiref.nii.gz -qsirecon/sub-tester/ses-2 -qsirecon/sub-tester/ses-2/dwi -qsirecon/sub-tester/ses-2/dwi/sub-tester_ses-2_acq-HASC55AP_confounds.tsv -qsirecon/sub-tester/ses-2/dwi/sub-tester_ses-2_acq-HASC55AP_desc-ImageQC_dwi.csv -qsirecon/sub-tester/ses-2/dwi/sub-tester_ses-2_acq-HASC55AP_desc-SliceQC_dwi.json -qsirecon/sub-tester/ses-2/dwi/sub-tester_ses-2_acq-HASC55AP_dwiqc.json -qsirecon/sub-tester/ses-2/dwi/sub-tester_ses-2_acq-HASC55AP_space-T1w_desc-brain_mask.nii.gz -qsirecon/sub-tester/ses-2/dwi/sub-tester_ses-2_acq-HASC55AP_space-T1w_desc-none_cnr.nii.gz -qsirecon/sub-tester/ses-2/dwi/sub-tester_ses-2_acq-HASC55AP_space-T1w_desc-preproc_dwi.b -qsirecon/sub-tester/ses-2/dwi/sub-tester_ses-2_acq-HASC55AP_space-T1w_desc-preproc_dwi.bval -qsirecon/sub-tester/ses-2/dwi/sub-tester_ses-2_acq-HASC55AP_space-T1w_desc-preproc_dwi.bvec -qsirecon/sub-tester/ses-2/dwi/sub-tester_ses-2_acq-HASC55AP_space-T1w_desc-preproc_dwi.nii.gz -qsirecon/sub-tester/ses-2/dwi/sub-tester_ses-2_acq-HASC55AP_space-T1w_dwiref.nii.gz -/tmp/twoses/derivatives diff --git a/.circleci/MultiT1w.sh b/.circleci/MultiT1w.sh deleted file mode 100644 index ac0566b9..00000000 --- a/.circleci/MultiT1w.sh +++ /dev/null @@ -1,87 +0,0 @@ -#!/bin/bash - -cat << DOC - -MultiT1w test -================== - -This tests the following features: - - freesurfer's robust template - -Inputs: -------- - - - DSDTI BIDS data (data/DSDTI) - -DOC -set +e - -source ./get_data.sh -TESTDIR=${PWD} -TESTNAME=MultiT1w -get_config_data ${TESTDIR} -get_bids_data ${TESTDIR} DSDTI -CFG=${TESTDIR}/data/nipype.cfg -EDDY_CFG=${TESTDIR}/data/eddy_config.json - -# For the run -setup_dir ${TESTDIR}/${TESTNAME} -TEMPDIR=${TESTDIR}/${TESTNAME}/work -OUTPUT_DIR=${TESTDIR}/${TESTNAME}/derivatives -BIDS_INPUT_DIR=${TESTDIR}/data/DSDTI -export FS_LICENSE=${TESTDIR}/data/license.txt -QSIRECON_CMD=$(run_qsirecon_cmd ${BIDS_INPUT_DIR} ${OUTPUT_DIR}) - -# CRITICAL: delete the fieldmap data -rm -rf data/DSDTI/sub-PNC/fmap - -# Create a shifted version of the t1w -if [[ "${IN_CI}" = 'true' ]]; then - 3dWarp \ - -matvec_in2out 'MATRIX(1,0,0,2,0,1,0,4,0,0,1,1)' \ - -gridset ${BIDS_INPUT_DIR}/sub-PNC/anat/sub-PNC_T1w.nii.gz \ - -prefix ${BIDS_INPUT_DIR}/sub-PNC/anat/sub-PNC_run-02_T1w.nii.gz \ - ${BIDS_INPUT_DIR}/sub-PNC/anat/sub-PNC_T1w.nii.gz -else - docker run -u $(id -u) \ - -v ${BIDS_INPUT_DIR}:/BIDS \ - --rm -ti --entrypoint 3dWarp \ - ${IMAGE} \ - -matvec_in2out 'MATRIX(1,0,0,2,0,1,0,4,0,0,1,1)' \ - -gridset /BIDS/sub-PNC/anat/sub-PNC_T1w.nii.gz \ - -prefix /BIDS/sub-PNC/anat/sub-PNC_run-02_T1w.nii.gz \ - /BIDS/sub-PNC/anat/sub-PNC_T1w.nii.gz - -fi - -cp ${BIDS_INPUT_DIR}/sub-PNC/anat/sub-PNC_T1w.json \ - ${BIDS_INPUT_DIR}/sub-PNC/anat/sub-PNC_run-02_T1w.json - -# Do the anatomical run on its own -${QSIRECON_CMD} \ - -w ${TEMPDIR} \ - --eddy-config ${EDDY_CFG} \ - --denoise-method none \ - --sloppy \ - --output-resolution 5 \ - --anat-only \ - -vv - - -# Explicitly test --longitudinal -TESTNAME=Longitudinal -setup_dir ${TESTDIR}/${TESTNAME} -TEMPDIR=${TESTDIR}/${TESTNAME}/work -OUTPUT_DIR=${TESTDIR}/${TESTNAME}/derivatives - -${QSIRECON_CMD} \ - -w ${TEMPDIR} \ - --eddy-config ${EDDY_CFG} \ - --denoise-method none \ - --sloppy \ - --output-resolution 5 \ - --anat-only \ - --longitudinal \ - -vv - - diff --git a/.circleci/get_data.sh b/.circleci/get_data.sh index 7c648b1c..938beb13 100644 --- a/.circleci/get_data.sh +++ b/.circleci/get_data.sh @@ -309,8 +309,8 @@ Contents: ^^^^^^^^^ - data/singleshell_output/qsirecon/dataset_description.json - - data/singleshell_output/qsirecon/logs/CITATION.html - - data/singleshell_output/qsirecon/logs/CITATION.md + - data/singleshell_output/logs/CITATION.html + - data/singleshell_output/logs/CITATION.md - data/singleshell_output/qsirecon/logs/CITATION.tex - data/singleshell_output/qsirecon/sub-PNC/anat/sub-PNC_desc-brain_mask.nii.gz - data/singleshell_output/qsirecon/sub-PNC/anat/sub-PNC_desc-preproc_T1w.nii.gz diff --git a/.circleci/testing_eddy_params.json b/.circleci/testing_eddy_params.json deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/reconstruction.rst b/docs/reconstruction.rst index dd6242fd..f1a38364 100644 --- a/docs/reconstruction.rst +++ b/docs/reconstruction.rst @@ -64,8 +64,9 @@ To use a pre-packaged workflow, simply provide the name from the leftmost column ``--recon-spec`` argument. For example:: $ qsirecon-docker \ - /path/to/bids /path/for/reconstruction/outputs participant \ - --recon_input /output/from/qsirecon \ + /output/from/qsiprep \ + /path/for/reconstruction/outputs \ + participant \ --recon_spec dsi_studio_gqi \ --fs-license-file /path/to/license.txt @@ -163,8 +164,7 @@ and from ``qsirecon``:: You can run:: $ qsirecon-docker \ - derivatives/qsirecon derivatives participant \ - --recon_input derivatives/qsirecon \ + derivatives/qsiprep derivatives participant \ --recon_spec mrtrix_multishell_msmt_ACT-hsvs \ --freesurfer-input derivatives/freesurfer \ --fs-license-file /path/to/license.txt @@ -519,8 +519,9 @@ Assuming this file is called ``qgi_scalar_export.json`` and you've installed ``qsirecon-container`` you can execute this pipeline with:: $ qsirecon-docker \ - /path/to/bids /where/my/reconstructed/data/goes participant \ - --recon_input /output/from/qsirecon \ + /output/from/qsiprep \ + /where/my/reconstructed/data/goes \ + participant \ --recon_spec gqi_scalar_export.json \ --fs-license-file /path/to/license.txt diff --git a/docs/usage.rst b/docs/usage.rst index eb6ebf85..9f492653 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -7,10 +7,10 @@ The ``qsirecon`` postprocessing workflow takes as principal input the path of the preprocessing derivatives dataset that is to be processed. The input dataset is required to be in valid :abbr:`BIDS (Brain Imaging Data Structure)` format with at least one -diffusion MRI series. The T1w image and the DWI may be in separate BIDS - folders for a given subject. We highly recommend that you validate -your dataset with the free, online `BIDS Validator -`_. +diffusion MRI series. +The T1w image and the DWI may be in separate BIDS folders for a given subject. +We highly recommend that you validate your dataset with the free, +online `BIDS Validator `_. The exact command to run ``qsirecon`` depends on the Installation_ method. The common parts of the command are similar to the `BIDS-Apps @@ -18,7 +18,7 @@ The common parts of the command are similar to the `BIDS-Apps Example: :: - qsirecon data/bids_root/ out/ participant -w work/ + qsirecon data/bids_root/ out/ participant -w work/ Command-Line Arguments diff --git a/qsirecon/cli/parser.py b/qsirecon/cli/parser.py index 8ea43a31..bfa0119f 100644 --- a/qsirecon/cli/parser.py +++ b/qsirecon/cli/parser.py @@ -24,8 +24,6 @@ # """Parser.""" -import sys - from .. import config @@ -34,52 +32,12 @@ def _build_parser(**kwargs): ``kwargs`` are passed to ``argparse.ArgumentParser`` (mainly useful for debugging). """ - from argparse import Action, ArgumentDefaultsHelpFormatter, ArgumentParser + from argparse import ArgumentDefaultsHelpFormatter, ArgumentParser from functools import partial from pathlib import Path from packaging.version import Version - deprecations = { - # parser attribute name: (replacement flag, version slated to be removed in) - "dwi_only": ("--anat-modality none", "0.23.0"), - "prefer_dedicated_fmaps": (None, "0.23.0"), - "do_reconall": (None, "0.23.0"), - "dwi_no_biascorr": ("--b1-biascorrect-stage none", "0.23.0"), - "recon_only": (None, "0.23.0"), - "b0_motion_corr_to": (None, "0.23.0"), - "b0_to_t1w_transform": ("--b0-t0-anat-transform", "0.23.0"), - } - - class DeprecatedAction(Action): - def __call__(self, parser, namespace, values, option_string=None): - new_opt, rem_vers = deprecations.get(self.dest, (None, None)) - msg = ( - f"{self.option_strings} has been deprecated and will be removed in " - f"{rem_vers or 'a later version'}." - ) - if new_opt: - msg += f" Please use `{new_opt}` instead." - print(msg, file=sys.stderr) - delattr(namespace, self.dest) - - class ToDict(Action): - def __call__(self, parser, namespace, values, option_string=None): - d = {} - for spec in values: - try: - name, loc = spec.split("=") - loc = Path(loc) - except ValueError: - loc = Path(spec) - name = loc.name - - if name in d: - raise ValueError(f"Received duplicate derivative name: {name}") - - d[name] = loc - setattr(namespace, self.dest, d) - def _path_exists(path, parser): """Ensure a given path exists.""" if path is None or not Path(path).exists(): @@ -177,13 +135,6 @@ def _bids_filter(value, parser): ) g_bids = parser.add_argument_group("Options for filtering BIDS queries") - g_bids.add_argument( - "--skip_bids_validation", - "--skip-bids-validation", - action="store_true", - default=False, - help="Assume the input dataset is BIDS compliant and skip the validation", - ) g_bids.add_argument( "--participant-label", "--participant_label", @@ -268,12 +219,6 @@ def _bids_filter(value, parser): ) g_subset = parser.add_argument_group("Options for performing only a subset of the workflow") - g_subset.add_argument("--anat-only", action="store_true", help="Run anatomical workflows only") - g_subset.add_argument( - "--dwi-only", - action="store_true", - help="ignore anatomical (T1w/T2w) data and process DWIs only", - ) g_subset.add_argument( "--boilerplate-only", "--boilerplate_only", @@ -297,16 +242,6 @@ def _bids_filter(value, parser): ) g_conf = parser.add_argument_group("Workflow configuration") - g_conf.add_argument( - "--ignore", - required=False, - action="store", - nargs="+", - default=[], - choices=["fieldmaps", "sbref", "t2w", "flair", "fmap-jacobian"], - help="Ignore selected aspects of the input dataset to disable corresponding " - "parts of the workflow (a space delimited list)", - ) g_conf.add_argument( "--infant", action="store_true", help="configure pipelines to process infant brains" ) @@ -315,22 +250,6 @@ def _bids_filter(value, parser): action="store_true", help="Treat dataset as longitudinal - may increase runtime", ) - g_conf.add_argument( - "--skip-anat-based-spatial-normalization", - action="store_true", - default=False, - help="skip running the anat-based normalization to template space. " - "Default is to run the normalization.", - ) - g_conf.add_argument( - "--anat-modality", - "--anat_modality", - choices=["T1w", "T2w", "none"], - default="T1w", - help="Modality to use as the anatomical reference. Images of this " - "contrast will be skull stripped and segmented for use in the " - "visual reports and reconstruction. If --infant, T2w is forced.", - ) g_conf.add_argument( "--b0-threshold", "--b0_threshold", @@ -341,132 +260,18 @@ def _bids_filter(value, parser): "a b=0 image. Current default threshold = 100; this threshold can be " "lowered or increased. Note, setting this too high can result in inaccurate results.", ) - g_conf.add_argument( - "--dwi_denoise_window", - "--dwi-denoise-window", - action="store", - default="auto", - help='window size in voxels for image-based denoising, integer or "auto".' - 'If "auto", 5 will be used for dwidenoise and auto-configured for ' - "patch2self based on the number of b>0 images.", - ) - g_conf.add_argument( - "--denoise-method", - "--denoise_method", - action="store", - choices=["dwidenoise", "patch2self", "none"], - default="dwidenoise", - help='Image-based denoising method. Either "dwidenoise" (MRtrix), ' - '"patch2self" (DIPY) or none. (default: dwidenoise)', - ) - g_conf.add_argument( - "--unringing-method", - "--unringing_method", - action="store", - choices=["none", "mrdegibbs", "rpg"], - help="Method for Gibbs-ringing removal.\n - none: no action\n - mrdegibbs: " - "use mrdegibbs from mrtrix3\n - rpg: Gibbs from TORTOISE, suggested for partial" - " Fourier acquisitions (default: none).", - ) - g_conf.add_argument( - "--dwi-no-biascorr", - "--dwi_no_biascorr", - action="store_true", - help="DEPRECATED: see --b1-biascorrect-stage", - ) - g_conf.add_argument( - "--b1-biascorrect-stage", - "--b1_biascorrect_stage", - action="store", - choices=["final", "none", "legacy"], - default="final", - help="Which stage to apply B1 bias correction. The default 'final' will " - "apply it after all the data has been resampled to its final space. " - "'none' will skip B1 bias correction and 'legacy' will behave consistent " - "with qsirecon < 0.17.", - ) - g_conf.add_argument( - "--no-b0-harmonization", - "--no_b0_harmonization", - action="store_true", - help="skip re-scaling dwi scans to have matching b=0 intensities", - ) - g_conf.add_argument( - "--denoise-after-combining", - "--denoise_after_combining", - action="store_true", - help="run ``dwidenoise`` after combining dwis, but before motion correction", - ) - g_conf.add_argument( - "--separate_all_dwis", - "--separate-all-dwis", - action="store_true", - help="don't attempt to combine dwis from multiple runs. Each will be " - "processed separately.", - ) - g_conf.add_argument( - "--distortion-group-merge", - "--distortion_group_merge", - action="store", - choices=["concat", "average", "none"], - default="none", - help="How to combine images across distorted groups.\n" - " - concatenate: append images in the 4th dimension\n " - " - average: if a whole sequence was duplicated in both PE\n" - " directions, average the corrected images of the same\n" - " q-space coordinate\n" - " - none: Default. Keep distorted groups separate", - ) - g_conf.add_argument( - "--anatomical-template", - required=False, - action="store", - choices=["MNI152NLin2009cAsym"], - default="MNI152NLin2009cAsym", - help="volume template space (default: MNI152NLin2009cAsym)", - ) g_conf.add_argument( "--output-resolution", "--output_resolution", action="store", # required when not recon-only (which can be specified in sysargs 2 ways) - required=not any(rcn in sys.argv for rcn in ["--recon-only", "--recon_only"]), + required=False, type=float, help="the isotropic voxel size in mm the data will be resampled to " "after preprocessing. If set to a lower value than the original voxel " "size, your data will be upsampled using BSpline interpolation.", ) - g_coreg = parser.add_argument_group("Options for dwi-to-Anatomical coregistration") - g_coreg.add_argument( - "--b0-to-t1w-transform", - "--b0_to_t1w_transform", - action="store", - default="Rigid", - choices=["Rigid", "Affine"], - help="Degrees of freedom when registering b0 to anatomical images. " - "6 degrees (rotation and translation) are used by default.", - ) - g_coreg.add_argument( - "--intramodal-template-iters", - "--intramodal_template_iters", - action="store", - default=0, - type=int, - help="Number of iterations for finding the midpoint image " - "from the b0 templates from all groups. Has no effect if there " - "is only one group. If 0, all b0 templates are directly registered " - "to the t1w image.", - ) - g_coreg.add_argument( - "--intramodal-template-transform", - "--intramodal_template_transform", - default="BSplineSyN", - choices=["Rigid", "Affine", "BSplineSyN", "SyN"], - action="store", - help="Transformation used for building the intramodal template.", - ) - # FreeSurfer options g_fs = parser.add_argument_group("Specific options for FreeSurfer preprocessing") g_fs.add_argument( @@ -478,105 +283,8 @@ def _bids_filter(value, parser): "at https://surfer.nmr.mgh.harvard.edu/registration.html", ) - g_moco = parser.add_argument_group("Specific options for motion correction and coregistration") - g_moco.add_argument( - "--b0-motion-corr-to", - "--bo_motion_corr_to", - action="store", - default="iterative", - choices=["iterative", "first"], - help='align to the "first" b0 volume or do an "iterative" registration' - " of all b0 images to their midpoint image (default: iterative)", - ) - g_moco.add_argument( - "--hmc-transform", - "--hmc_transform", - action="store", - default="Affine", - choices=["Affine", "Rigid"], - help="transformation to be optimized during head motion correction " "(default: affine)", - ) - g_moco.add_argument( - "--hmc_model", - "--hmc-model", - action="store", - default="eddy", - choices=["none", "3dSHORE", "eddy", "tensor"], - help='model used to generate target images for hmc. If "none" the ' - "non-b0 images will be warped using the same transform as their " - 'nearest b0 image. If "3dSHORE", SHORELine will be used. if "tensor", ' - "SHORELine iterations with a tensor model will be used", - ) - g_moco.add_argument( - "--eddy-config", - "--eddy_config", - action="store", - help="path to a json file with settings for the call to eddy. If no " - "json is specified, a default one will be used. The current default " - "json can be found here: " - "https://github.com/PennLINC/qsirecon/blob/main/qsirecon/data/eddy_params.json", - ) - g_moco.add_argument( - "--shoreline_iters", - "--shoreline-iters", - action="store", - type=int, - default=2, - help="number of SHORELine iterations. (default: 2)", - ) - - # Fieldmap options - g_fmap = parser.add_argument_group("Specific options for handling fieldmaps") - g_fmap.add_argument( - "--pepolar-method", - "--pepolar_method", - action="store", - default="TOPUP", - choices=["TOPUP", "DRBUDDI", "TOPUP+DRBUDDI"], - help="select which SDC method to use for PEPOLAR fieldmaps (default: TOPUP)", - ) - g_fmap.add_argument( - "--fmap-bspline", - action="store_true", - default=False, - help="Fit a B-Spline field using least-squares (experimental)", - ) - g_fmap.add_argument( - "--fmap-no-demean", - action="store_false", - default=True, - help="Do not remove median (within mask) from fieldmap", - ) - - # SyN-unwarp options - g_syn = parser.add_argument_group("Specific options for SyN distortion correction") - g_syn.add_argument( - "--use-syn-sdc", - nargs="?", - choices=["warn", "error"], - action="store", - const="error", - default=False, - help="Use fieldmap-less distortion correction based on anatomical image; " - "if unable, error (default) or warn based on optional argument.", - ) - g_syn.add_argument( - "--force-syn", - action="store_true", - default=False, - help="EXPERIMENTAL/TEMPORARY: Use SyN correction in addition to " - "fieldmap correction, if available", - ) - # arguments for reconstructing QSI data g_recon = parser.add_argument_group("Options for reconstructing qsirecon outputs") - g_recon.add_argument( - "--recon-only", - "--recon_only", - action="store_true", - default=False, - help="run only reconstruction, assumes preprocessing has already completed.", - ) g_recon.add_argument( "--recon-spec", "--recon_spec", @@ -584,20 +292,12 @@ def _bids_filter(value, parser): type=str, help="json file specifying a reconstruction pipeline to be run after preprocessing", ) - g_recon.add_argument( - "--recon-input", - "--recon_input", - action="store", - metavar="PATH", - type=Path, - help="use this directory as inputs to qsirecon. This option skips qsirecon.", - ) g_recon.add_argument( "--recon-input-pipeline", "--recon_input_pipeline", action="store", - default="qsirecon", - choices=["qsirecon", "ukb", "hcpya"], + default="qsiprep", + choices=["qsiprep", "ukb", "hcpya"], help="specify which pipeline was used to create the data specified " "as the --recon-input. Not necessary to specify if the data was " 'processed by qsirecon. Other options include "ukb" for data processed ' @@ -667,10 +367,12 @@ def _bids_filter(value, parser): "--notrack", action="store_true", default=False, - help="Opt-out of sending tracking information of this run to " - "the QSIRecon developers. This information helps to " - "improve QSIRecon and provides an indicator of real " - "world usage crucial for obtaining funding.", + help=( + "Opt-out of sending tracking information of this run to " + "the QSIRecon developers. This information helps to " + "improve QSIRecon and provides an indicator of real " + "world usage crucial for obtaining funding." + ), ) g_other.add_argument( "--debug", @@ -743,29 +445,11 @@ def parse_args(args=None, namespace=None): f"total threads (--nthreads/--n_cpus={config.nipype.nprocs})" ) - if config.workflow.recon_spec and not config.execution.recon_input: - build_log.info("Running BOTH preprocessing and recon.") - config.execution.running_preproc_and_recon = True - config.execution.recon_input = config.execution.qsirecon_dir - - # Validate the tricky options here - if config.workflow.dwi_denoise_window != "auto": - try: - _ = int(config.workflow.dwi_denoise_window) - except ValueError: - raise Exception("--dwi-denoise-window must be an integer or 'auto'") - bids_dir = config.execution.bids_dir output_dir = config.execution.output_dir work_dir = config.execution.work_dir version = config.environment.version - if config.execution.qsirecon_dir is None: - config.execution.qsirecon_dir = output_dir / "qsirecon" - - if config.execution.qsirecon_dir is None: - config.execution.qsirecon_dir = output_dir / "qsirecon" - if config.execution.reportlets_dir is None: config.execution.reportlets_dir = work_dir / "reportlets" @@ -791,25 +475,8 @@ def parse_args(args=None, namespace=None): "Please modify the output path." ) - # Validate inputs - if not opts.skip_bids_validation: - if opts.recon_input is not None: - build_log.info("Skipping BIDS validation because inputs are BIDS derivatives") - else: - from ..utils.bids import validate_input_dir - - build_log.info( - "Making sure the input data is BIDS compliant (warnings can be ignored in most " - "cases)." - ) - validate_input_dir( - config.environment.exec_env, - opts.bids_dir, - opts.participant_label, - ) - # Setup directories - config.execution.log_dir = config.execution.qsirecon_dir / "logs" + config.execution.log_dir = config.execution.output_dir / "logs" # Check and create output and working directories config.execution.log_dir.mkdir(exist_ok=True, parents=True) config.execution.reportlets_dir.mkdir(exist_ok=True, parents=True) diff --git a/qsirecon/cli/run.py b/qsirecon/cli/run.py index 43af7891..5e4b87ab 100644 --- a/qsirecon/cli/run.py +++ b/qsirecon/cli/run.py @@ -184,10 +184,10 @@ def main(): ) write_derivative_description( config.execution.bids_dir, - config.execution.qsirecon_dir, + config.execution.output_dir, # dataset_links=config.execution.dataset_links, ) - write_bidsignore(config.execution.qsirecon_dir) + write_bidsignore(config.execution.output_dir) if failed_reports: print(failed_reports) @@ -198,8 +198,6 @@ def main(): # config.loggers.cli.error(msg) # if sentry_sdk is not None: # sentry_sdk.capture_message(msg, level='error') - if not config.execution.run_preproc_and_recon: - sys.exit(int(errno + failed_reports) > 0) # If preprocessing and recon are requested in the same call, start the recon workflow now. if errno > 0: @@ -207,130 +205,5 @@ def main(): config.loggers.workflow.critical( "Errors occurred during preprocessing - Recon will not run." ) - sys.exit(int(errno + failed_reports) > 0) - # POST-PREP RECON - del qsirecon_wf - # CRITICAL Call build_workflow(config_file, retval) in a subprocess. - # Because Python on Linux does not ever free virtual memory (VM), running the - # workflow construction jailed within a process preempts excessive VM buildup. - if "pdb" not in config.execution.debug: - with Manager() as mgr: - retval = mgr.dict() - p = Process(target=build_workflow, args=(str(config_file), "QSIRecon", retval)) - p.start() - p.join() - retval = dict(retval.items()) # Convert to base dictionary - - if p.exitcode: - retval["return_code"] = p.exitcode - - else: - retval = build_workflow(str(config_file), "QSIRecon", {}) - - exitcode = retval.get("return_code", 0) - qsirecon_wf = retval.get("workflow", None) - - # CRITICAL It would be bad to let the config file be changed between prep and recon. - # config.load(config_file) - - if qsirecon_wf and config.execution.write_graph: - qsirecon_wf.write_graph(graph2use="colored", format="svg", simple_form=True) - - exitcode = exitcode or (qsirecon_wf is None) * EX_SOFTWARE - if exitcode != 0: - sys.exit(exitcode) - - # Generate boilerplate - with Manager() as mgr: - from .workflow import build_boilerplate - - p = Process(target=build_boilerplate, args=(str(config_file), qsirecon_wf)) - p.start() - p.join() - - if config.execution.boilerplate_only: - sys.exit(int(exitcode > 0)) - - # Clean up master process before running workflow, which may create forks - gc.collect() - - # Sentry tracking - if sentry_sdk is not None: - with sentry_sdk.configure_scope() as scope: - scope.set_tag("run_uuid", config.execution.run_uuid) - scope.set_tag("npart", len(config.execution.participant_label)) - sentry_sdk.add_breadcrumb(message="QSIPostRecon started", level="info") - sentry_sdk.capture_message("QSIRecon started", level="info") - - config.loggers.workflow.log( - 15, - "\n".join(["QSIRecon config:"] + ["\t\t%s" % s for s in config.dumps().splitlines()]), - ) - config.loggers.workflow.log(25, "QSIRecon started!") - errno = 1 # Default is error exit unless otherwise set - try: - qsirecon_wf.run(**config.nipype.get_plugin()) - except Exception as e: - if not config.execution.notrack: - from ..utils.sentry import process_crashfile - - crashfolders = [ - config.execution.qsirecon_dir / f"sub-{s}" / "log" / config.execution.run_uuid - for s in config.execution.participant_label - ] - for crashfolder in crashfolders: - for crashfile in crashfolder.glob("crash*.*"): - process_crashfile(crashfile) - - if sentry_sdk is not None and "Workflow did not execute cleanly" not in str(e): - sentry_sdk.capture_exception(e) - config.loggers.workflow.critical("QSIRecon failed: %s", e) - raise - else: - config.loggers.workflow.log(25, "QSIRecon finished successfully!") - if sentry_sdk is not None: - success_message = "QSIPostRecon finished without errors" - sentry_sdk.add_breadcrumb(message=success_message, level="info") - sentry_sdk.capture_message(success_message, level="info") - - # Bother users with the boilerplate only iff the workflow went okay. - boiler_file = config.execution.qsirecon_dir / "logs" / "CITATION.md" - if boiler_file.exists(): - if config.environment.exec_env in ( - "singularity", - "docker", - "qsirecon-docker", - ): - boiler_file = Path("") / boiler_file.relative_to( - config.execution.output_dir - ) - config.loggers.workflow.log( - 25, - "Works derived from this QSIRecon execution should include the " - f"boilerplate text found in {boiler_file}.", - ) - - errno = 0 - finally: - - from ..viz.reports import generate_reports - - # Generate reports phase - # session_list = ( - # config.execution.get().get('bids_filters', {}).get('dwi', {}).get('session') - # ) - - failed_reports = generate_reports( - config.execution.participant_label, - # session_list=session_list, - ) - write_derivative_description( - config.execution.bids_dir, - config.execution.qsirecon_dir, - # dataset_links=config.execution.dataset_links, - ) - write_bidsignore(config.execution.qsirecon) - - if failed_reports: - print(failed_reports) + sys.exit(int((errno + failed_reports) > 0)) diff --git a/qsirecon/cli/workflow.py b/qsirecon/cli/workflow.py index cba54128..b37e329f 100644 --- a/qsirecon/cli/workflow.py +++ b/qsirecon/cli/workflow.py @@ -52,7 +52,6 @@ def build_workflow(config_file, retval): config.load(config_file) build_log = config.loggers.workflow - # qsirecon_dir = config.execution.qsirecon_dir version = config.environment.version retval["return_code"] = 1 @@ -69,7 +68,7 @@ def build_workflow(config_file, retval): build_log.log(25, f"\n{' ' * 9}".join(banner)) # warn if older results exist: check for dataset_description.json in output folder - # msg = check_pipeline_version("QSIRecon", version, qsirecon_dir / "dataset_description.json") + # msg = check_pipeline_version("QSIRecon", version, output_dir / "dataset_description.json") # if msg is not None: # build_log.warning(msg) @@ -97,7 +96,7 @@ def build_workflow(config_file, retval): failed_reports = generate_reports( config.execution.participant_label, - config.execution.qsirecon_dir, + config.execution.output_dir, config.execution.run_uuid, session_list=session_list, ) @@ -162,7 +161,7 @@ def build_boilerplate(config_file, workflow): from .. import config config.load(config_file) - logs_path = config.execution.qsirecon_dir / "logs" + logs_path = config.execution.output_dir / "logs" boilerplate = workflow.visit_desc() citation_files = { ext: logs_path / ("CITATION.%s" % ext) for ext in ("bib", "tex", "md", "html") diff --git a/qsirecon/config.py b/qsirecon/config.py index 744b38a6..c08cd119 100644 --- a/qsirecon/config.py +++ b/qsirecon/config.py @@ -28,7 +28,7 @@ This module implements the memory structures to keep a consistent, singleton config. Settings are passed across processes via filesystem, and a copy of the settings for each run and subject is left under -``/sub-/log//qsirecon.toml``. +``/sub-/log//qsirecon.toml``. Settings are stored using :abbr:`ToML (Tom's Markup Language)`. The module has a :py:func:`~qsirecon.config.to_filename` function to allow writing out the settings to hard disk in *ToML* format, which looks like: @@ -412,17 +412,10 @@ class execution(_Config): """Output verbosity.""" low_mem = None """Utilize uncompressed NIfTIs and other tricks to minimize memory allocation.""" - # md_only_boilerplate = False - # """Do not convert boilerplate from MarkDown to LaTex and HTML.""" notrack = False """Do not collect telemetry information for *QSIRecon*.""" output_dir = None """Folder where derivatives will be stored.""" - output_layout = None - """Layout of derivatives within output_dir.""" - # output_spaces = None - # """List of (non)standard spaces designated (with the ``--output-spaces`` flag of - # the command line) as spatial references for outputs.""" reports_only = False """Only build the reports, based on the reportlets found in a cached working directory.""" run_uuid = f"{strftime('%Y%m%d-%H%M%S')}_{uuid4()}" @@ -431,24 +424,10 @@ class execution(_Config): """Disable ODF recon reports.""" participant_label = None """List of participant identifiers that are to be preprocessed.""" - qsirecon_dir = None - """Root of QSIRecon BIDS Derivatives dataset. Depends on output_layout.""" - qsirecon_dir = None - """Root of QSIRecon BIDS Derivatives dataset.""" - recon_input = None - """Directory containing QSIRecon derivatives to run through recon workflows.""" freesurfer_input = None """Directory containing FreeSurfer directories to use for recon workflows.""" - recon_only = False - """Run only recon workflows.""" reportlets_dir = None """Path where reportlets are written.""" - run_preproc_and_recon = False - """Will both preproc and recon be run in a single call?""" - skip_anat_based_spatial_normalization = False - """Should we skip normalizing the anatomical data to a template?""" - task_id = None - """Select a particular task from all available in the dataset.""" templateflow_home = _templateflow_home """The root folder of the TemplateFlow client.""" work_dir = Path("work").absolute() @@ -471,9 +450,6 @@ class execution(_Config): "layout", "log_dir", "output_dir", - "qsirecon_dir", - "qsirecon_dir", - "recon_input", "reportlets_dir", "templateflow_home", "work_dir", @@ -567,83 +543,18 @@ def _process_value(value): class workflow(_Config): """Configure the particular execution graph of this workflow.""" - anat_modality = None - """Modality to use as the anatomical reference. Images of this - contrast will be skull stripped and segmented for use in the - visual reports and reconstruction. If --infant, T2w is forced.""" - anat_only = False - """Execute the anatomical postprocessing only.""" - anatomical_template = None - """Keeps the :py:class:`~niworkflows.utils.spaces.SpatialReferences` - instance keeping standard and nonstandard spaces.""" b0_threshold = None """Any value in the .bval file less than this will be considered a b=0 image.""" - b0_motion_corr_to = None - """Perform SHORELine's initial b=0-based registration to first volume? - Or make a template? Either 'iterative' or 'first'""" - b0_to_t1w_transform = None - """Transformation model for intramodal registration.""" - b1_biascorrect_stage = None - """The stage of processing at which to apply B1 bias correction. Either "final" (after - resampling), "none" (skipped entirely) or "legacy" (before concatenation).""" - cifti_output = None - """Generate HCP Grayordinates, accepts either ``'91k'`` (default) or ``'170k'``.""" - denoise_after_combining = False - """Run ``dwidenoise`` after combining dwis, but before motion correction.""" - denoise_method = None - """Image-based denoising method. Either "dwidenoise" (MRtrix), "patch2self" (DIPY) - or "none".""" - distortion_group_merge = None - """How to combine images across distortion groups (concatenate, average or none).""" - do_reconall = True - """Run FreeSurfer's surface reconstruction (ignored).""" - dwi_denoise_window = None - """Window size in voxels for image-based denoising, integer or "auto".""" - dwi_no_biascorr = None - """DEPRECATED: see --b1-biascorrect-stage.""" - dwi_only = False - """DEPRECATED: True if anat_modality is 'none'.""" - eddy_config = None - """Configuration for running Eddy.""" - fmap_bspline = None - """Regularize fieldmaps with a field of B-Spline basis.""" - fmap_demean = None - """Remove the mean from fieldmaps.""" - force_syn = None - """Run *fieldmap-less* susceptibility-derived distortions estimation.""" - hmc_model = None - """Model used to generate target images for hmc.""" - hmc_transform = None - """Transformation to be used in SHORELine.""" - ignore = None - """Ignore particular steps for *QSIRecon*.""" infant = False """Configure pipelines specifically for infant brains""" - intramodal_template_iters = None - """Number of iterations for intramodal template construction.""" - intramodal_template_transform = None - """Transformation used for building the intramodal template.""" longitudinal = False """Run FreeSurfer ``recon-all`` with the ``-logitudinal`` flag.""" - no_b0_harmonization = False - """Skip re-scaling dwi scans to have matching b=0 intensities.""" - output_resolution = None - """Isotropic voxel size for outputs.""" - pepolar_method = None - """SDC method to be used for PEPOLAR fieldmaps.""" recon_input_pipeline = None - """Specifies which pipeline was used to preprocess data in ``recon_input``""" + """Specifies which pipeline was used to preprocess data in ``bids_dir``.""" recon_spec = None """Recon workflow specification.""" - separate_all_dwis = False - """Process all dwis separately - do not attempt concatenation.""" - shoreline_iters = None - """How many iterations to run SHORELine.""" - unringing_method = None - """Method for Gibbs-ringing removal. Either "none", "mrdegibbs" or "rpg".""" - use_syn_sdc = None - """Run *fieldmap-less* susceptibility-derived distortions estimation - in the absence of any alternatives.""" + output_resolution = None + """Isotropic voxel size for outputs.""" class loggers: @@ -833,14 +744,5 @@ def init_spaces(checkpoint=True): if "MNI152NLin2009cAsym" not in spaces.get_spaces(nonstandard=False, dim=(3,)): spaces.add(Reference("MNI152NLin2009cAsym", {})) - # Ensure user-defined spatial references for outputs are correctly parsed. - # Certain options require normalization to a space not explicitly defined by users. - # These spaces will not be included in the final outputs. - cifti_output = workflow.cifti_output - if cifti_output: - # CIFTI grayordinates to corresponding FSL-MNI resolutions. - vol_res = "2" if cifti_output == "91k" else "1" - spaces.add(Reference("MNI152NLin6Asym", {"res": vol_res})) - # Make the SpatialReferences object available workflow.spaces = spaces diff --git a/qsirecon/interfaces/interchange.py b/qsirecon/interfaces/interchange.py index 50c9c606..55609287 100644 --- a/qsirecon/interfaces/interchange.py +++ b/qsirecon/interfaces/interchange.py @@ -17,14 +17,14 @@ ] CREATEABLE_ANATOMICAL_OUTPUTS = [ "fs_5tt_hsvs", - "qsirecon_5tt_hsvs", - "qsirecon_5tt_fast", - "fs_to_qsirecon_transform_itk", - "fs_to_qsirecon_transform_mrtrix", + "qsiprep_5tt_hsvs", + "qsiprep_5tt_fast", + "fs_to_qsiprep_transform_itk", + "fs_to_qsiprep_transform_mrtrix", ] # These come directly from QSIRecon outputs. They're aligned to the DWIs in AC-PC -qsirecon_highres_anatomical_ingressed_fields = ( +qsiprep_highres_anatomical_ingressed_fields = ( QSIReconAnatomicalIngress.output_spec.class_editable_traits() ) @@ -32,13 +32,13 @@ # anatomical files (segmentations/masks/etc) that can be used downstream. # These are **independent** of the DWI data and handled separately anatomical_workflow_outputs = ( - qsirecon_highres_anatomical_ingressed_fields + qsiprep_highres_anatomical_ingressed_fields + FS_FILES_TO_REGISTER + CREATEABLE_ANATOMICAL_OUTPUTS ) # These are read directly from QSIRecon's dwi results. -qsirecon_output_names = QsiReconDWIIngress().output_spec.class_editable_traits() +qsiprep_output_names = QsiReconDWIIngress().output_spec.class_editable_traits() # dMRI + registered anatomical fields recon_workflow_anatomical_input_fields = anatomical_workflow_outputs + [ @@ -50,14 +50,14 @@ ] # Check that no conflicts have been introduced -overlapping_names = set(qsirecon_output_names).intersection(recon_workflow_anatomical_input_fields) +overlapping_names = set(qsiprep_output_names).intersection(recon_workflow_anatomical_input_fields) if overlapping_names: raise Exception( "Someone has added overlapping outputs between the anatomical " "and dwi inputs: " + " ".join(overlapping_names) ) -recon_workflow_input_fields = qsirecon_output_names + recon_workflow_anatomical_input_fields +recon_workflow_input_fields = qsiprep_output_names + recon_workflow_anatomical_input_fields default_input_set = set(recon_workflow_input_fields) default_connections = [(trait, trait) for trait in recon_workflow_input_fields] diff --git a/qsirecon/tests/data/amico_noddi_outputs.txt b/qsirecon/tests/data/amico_noddi_outputs.txt index 025f72ef..9032b10a 100644 --- a/qsirecon/tests/data/amico_noddi_outputs.txt +++ b/qsirecon/tests/data/amico_noddi_outputs.txt @@ -1,13 +1,10 @@ +dataset_description.json +logs +logs/CITATION.bib +logs/CITATION.html +logs/CITATION.md +logs/CITATION.tex qsirecon -qsirecon/dataset_description.json -qsirecon/dwiqc.json -qsirecon/logs -qsirecon/logs/CITATION.bib -qsirecon/logs/CITATION.html -qsirecon/logs/CITATION.md -qsirecon/logs/CITATION.tex -qsirecon/sub-PNC -qsirecon/sub-PNC.html qsirecon qsirecon-NODDI qsirecon-NODDI/sub-PNC @@ -18,4 +15,8 @@ qsirecon-NODDI/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_model-no qsirecon-NODDI/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_model-noddi_mdp-isovf_dwimap.nii.gz qsirecon-NODDI/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_model-noddi_mdp-od_dwimap.nii.gz qsirecon-NODDI/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_model-noddi_mfp-direction_dwimap.nii.gz +qsirecon/dwiqc.json +qsirecon/sub-PNC qsirecon/sub-PNC +qsirecon/sub-PNC.html +sub-PNC diff --git a/qsirecon/tests/data/autotrack_outputs.txt b/qsirecon/tests/data/autotrack_outputs.txt index 3b6d2a4d..27283456 100644 --- a/qsirecon/tests/data/autotrack_outputs.txt +++ b/qsirecon/tests/data/autotrack_outputs.txt @@ -1,13 +1,10 @@ +dataset_description.json +logs +logs/CITATION.bib +logs/CITATION.html +logs/CITATION.md +logs/CITATION.tex qsirecon -qsirecon/dataset_description.json -qsirecon/dwiqc.json -qsirecon/logs -qsirecon/logs/CITATION.bib -qsirecon/logs/CITATION.html -qsirecon/logs/CITATION.md -qsirecon/logs/CITATION.tex -qsirecon/sub-ABCD -qsirecon/sub-ABCD.html qsirecon qsirecon-DSIStudio qsirecon-DSIStudio/sub-ABCD @@ -17,4 +14,7 @@ qsirecon-DSIStudio/sub-ABCD/dwi/sub-ABCD_acq-10per000_space-T1w_desc-preproc_bun qsirecon-DSIStudio/sub-ABCD/dwi/sub-ABCD_acq-10per000_space-T1w_desc-preproc_bundlestats.csv qsirecon-DSIStudio/sub-ABCD/dwi/sub-ABCD_acq-10per000_space-T1w_desc-preproc_dwimap.fib.gz qsirecon-DSIStudio/sub-ABCD/dwi/sub-ABCD_acq-10per000_space-T1w_desc-preproc_mapping.map.gz +qsirecon/dwiqc.json qsirecon/sub-ABCD +qsirecon/sub-ABCD.html +sub-ABCD diff --git a/qsirecon/tests/data/dipy_dki_outputs.txt b/qsirecon/tests/data/dipy_dki_outputs.txt index 3b26e750..fd7a1eb4 100644 --- a/qsirecon/tests/data/dipy_dki_outputs.txt +++ b/qsirecon/tests/data/dipy_dki_outputs.txt @@ -1,13 +1,10 @@ +dataset_description.json +logs +logs/CITATION.bib +logs/CITATION.html +logs/CITATION.md +logs/CITATION.tex qsirecon -qsirecon/dataset_description.json -qsirecon/dwiqc.json -qsirecon/logs -qsirecon/logs/CITATION.bib -qsirecon/logs/CITATION.html -qsirecon/logs/CITATION.md -qsirecon/logs/CITATION.tex -qsirecon/sub-ABCD -qsirecon/sub-ABCD.html qsirecon qsirecon-DKI qsirecon-DKI/sub-ABCD @@ -21,4 +18,7 @@ qsirecon-DKI/sub-ABCD/dwi/sub-ABCD_acq-10per000_space-T1w_desc-preproc_model-dki qsirecon-DKI/sub-ABCD/dwi/sub-ABCD_acq-10per000_space-T1w_desc-preproc_model-dki_mdp-RD_dwimap.nii.gz qsirecon-DKI/sub-ABCD/dwi/sub-ABCD_acq-10per000_space-T1w_desc-preproc_model-dki_mdp-RK_dwimap.nii.gz qsirecon-DKI/sub-ABCD/dwi/sub-ABCD_acq-10per000_space-T1w_desc-preproc_model-tensor_mdp-FA_dwimap.nii.gz +qsirecon/dwiqc.json qsirecon/sub-ABCD +qsirecon/sub-ABCD.html +sub-ABCD diff --git a/qsirecon/tests/data/dipy_mapmri_outputs.txt b/qsirecon/tests/data/dipy_mapmri_outputs.txt index 1dfe1ec5..916b992a 100644 --- a/qsirecon/tests/data/dipy_mapmri_outputs.txt +++ b/qsirecon/tests/data/dipy_mapmri_outputs.txt @@ -1,13 +1,10 @@ +dataset_description.json +logs +logs/CITATION.bib +logs/CITATION.html +logs/CITATION.md +logs/CITATION.tex qsirecon -qsirecon/dataset_description.json -qsirecon/dwiqc.json -qsirecon/logs -qsirecon/logs/CITATION.bib -qsirecon/logs/CITATION.html -qsirecon/logs/CITATION.md -qsirecon/logs/CITATION.tex -qsirecon/sub-ABCD -qsirecon/sub-ABCD.html qsirecon qsirecon-DIPYMAPMRI qsirecon-DIPYMAPMRI/sub-ABCD @@ -23,4 +20,7 @@ qsirecon-mapmri_recon/sub-ABCD/dwi/sub-ABCD_acq-10per000_space-T1w_desc-preproc_ qsirecon-mapmri_recon/sub-ABCD/dwi/sub-ABCD_acq-10per000_space-T1w_desc-preproc_model-mapmri_mdp-RTOP_dwimap.nii.gz qsirecon-mapmri_recon/sub-ABCD/dwi/sub-ABCD_acq-10per000_space-T1w_desc-preproc_model-mapmri_mdp-RTPP_dwimap.nii.gz qsirecon-mapmri_recon/sub-ABCD/dwi/sub-ABCD_acq-10per000_space-T1w_desc-preproc_model-mapmri_mfp-lapnorm_dwimap.nii.gz +qsirecon/dwiqc.json qsirecon/sub-ABCD +qsirecon/sub-ABCD.html +sub-ABCD diff --git a/qsirecon/tests/data/drbuddi_rpe_outputs.txt b/qsirecon/tests/data/drbuddi_rpe_outputs.txt deleted file mode 100644 index ec6e0747..00000000 --- a/qsirecon/tests/data/drbuddi_rpe_outputs.txt +++ /dev/null @@ -1,23 +0,0 @@ -qsirecon -qsirecon/dataset_description.json -qsirecon/dwiqc.json -qsirecon/logs -qsirecon/logs/CITATION.bib -qsirecon/logs/CITATION.html -qsirecon/logs/CITATION.md -qsirecon/logs/CITATION.tex -qsirecon/sub-tinytensors -qsirecon/sub-tinytensors.html -qsirecon/sub-tinytensors/dwi -qsirecon/sub-tinytensors/dwi/sub-tinytensors_confounds.tsv -qsirecon/sub-tinytensors/dwi/sub-tinytensors_desc-ImageQC_dwi.csv -qsirecon/sub-tinytensors/dwi/sub-tinytensors_desc-SliceQC_dwi.json -qsirecon/sub-tinytensors/dwi/sub-tinytensors_dwiqc.json -qsirecon/sub-tinytensors/dwi/sub-tinytensors_space-T1w_desc-brain_mask.nii.gz -qsirecon/sub-tinytensors/dwi/sub-tinytensors_space-T1w_desc-eddy_cnr.nii.gz -qsirecon/sub-tinytensors/dwi/sub-tinytensors_space-T1w_desc-preproc_dwi.b -qsirecon/sub-tinytensors/dwi/sub-tinytensors_space-T1w_desc-preproc_dwi.bval -qsirecon/sub-tinytensors/dwi/sub-tinytensors_space-T1w_desc-preproc_dwi.bvec -qsirecon/sub-tinytensors/dwi/sub-tinytensors_space-T1w_desc-preproc_dwi.nii.gz -qsirecon/sub-tinytensors/dwi/sub-tinytensors_space-T1w_desc-preproc_dwi.txt -qsirecon/sub-tinytensors/dwi/sub-tinytensors_space-T1w_dwiref.nii.gz diff --git a/qsirecon/tests/data/drbuddi_shoreline_epi_outputs.txt b/qsirecon/tests/data/drbuddi_shoreline_epi_outputs.txt deleted file mode 100644 index 5f60dedb..00000000 --- a/qsirecon/tests/data/drbuddi_shoreline_epi_outputs.txt +++ /dev/null @@ -1,23 +0,0 @@ -qsirecon -qsirecon/dataset_description.json -qsirecon/dwiqc.json -qsirecon/logs -qsirecon/logs/CITATION.bib -qsirecon/logs/CITATION.html -qsirecon/logs/CITATION.md -qsirecon/logs/CITATION.tex -qsirecon/sub-tinytensors -qsirecon/sub-tinytensors.html -qsirecon/sub-tinytensors/dwi -qsirecon/sub-tinytensors/dwi/sub-tinytensors_dir-PA_confounds.tsv -qsirecon/sub-tinytensors/dwi/sub-tinytensors_dir-PA_desc-ImageQC_dwi.csv -qsirecon/sub-tinytensors/dwi/sub-tinytensors_dir-PA_desc-SliceQC_dwi.json -qsirecon/sub-tinytensors/dwi/sub-tinytensors_dir-PA_dwiqc.json -qsirecon/sub-tinytensors/dwi/sub-tinytensors_dir-PA_space-T1w_desc-brain_mask.nii.gz -qsirecon/sub-tinytensors/dwi/sub-tinytensors_dir-PA_space-T1w_desc-none_cnr.nii.gz -qsirecon/sub-tinytensors/dwi/sub-tinytensors_dir-PA_space-T1w_desc-preproc_dwi.b -qsirecon/sub-tinytensors/dwi/sub-tinytensors_dir-PA_space-T1w_desc-preproc_dwi.bval -qsirecon/sub-tinytensors/dwi/sub-tinytensors_dir-PA_space-T1w_desc-preproc_dwi.bvec -qsirecon/sub-tinytensors/dwi/sub-tinytensors_dir-PA_space-T1w_desc-preproc_dwi.nii.gz -qsirecon/sub-tinytensors/dwi/sub-tinytensors_dir-PA_space-T1w_desc-preproc_dwi.txt -qsirecon/sub-tinytensors/dwi/sub-tinytensors_dir-PA_space-T1w_dwiref.nii.gz diff --git a/qsirecon/tests/data/drbuddi_tensorline_epi_outputs.txt b/qsirecon/tests/data/drbuddi_tensorline_epi_outputs.txt deleted file mode 100644 index 724b993a..00000000 --- a/qsirecon/tests/data/drbuddi_tensorline_epi_outputs.txt +++ /dev/null @@ -1,23 +0,0 @@ -qsirecon -qsirecon/dataset_description.json -qsirecon/dwiqc.json -qsirecon/logs -qsirecon/logs/CITATION.bib -qsirecon/logs/CITATION.html -qsirecon/logs/CITATION.md -qsirecon/logs/CITATION.tex -qsirecon/sub-PNC -qsirecon/sub-PNC.html -qsirecon/sub-PNC/dwi -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_confounds.tsv -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_desc-ImageQC_dwi.csv -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_desc-SliceQC_dwi.json -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_dwiqc.json -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-brain_mask.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_dwi.b -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_dwi.bval -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_dwi.bvec -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_dwi.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_dwi.txt -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-tensor_cnr.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_dwiref.nii.gz diff --git a/qsirecon/tests/data/dscsdsi_fmap_outputs.txt b/qsirecon/tests/data/dscsdsi_fmap_outputs.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/qsirecon/tests/data/dscsdsi_outputs.txt b/qsirecon/tests/data/dscsdsi_outputs.txt deleted file mode 100644 index 560273ab..00000000 --- a/qsirecon/tests/data/dscsdsi_outputs.txt +++ /dev/null @@ -1,33 +0,0 @@ -qsirecon -qsirecon/dataset_description.json -qsirecon/dwiqc.json -qsirecon/logs -qsirecon/logs/CITATION.bib -qsirecon/logs/CITATION.html -qsirecon/logs/CITATION.md -qsirecon/logs/CITATION.tex -qsirecon/sub-tester -qsirecon/sub-tester.html -qsirecon/sub-tester/anat -qsirecon/sub-tester/anat/sub-tester_desc-aseg_dseg.nii.gz -qsirecon/sub-tester/anat/sub-tester_desc-brain_mask.nii.gz -qsirecon/sub-tester/anat/sub-tester_desc-preproc_T1w.nii.gz -qsirecon/sub-tester/anat/sub-tester_dseg.nii.gz -qsirecon/sub-tester/anat/sub-tester_from-MNI152NLin2009cAsym_to-T1w_mode-image_xfm.h5 -qsirecon/sub-tester/anat/sub-tester_from-T1wACPC_to-T1wNative_mode-image_xfm.mat -qsirecon/sub-tester/anat/sub-tester_from-T1wNative_to-T1wACPC_mode-image_xfm.mat -qsirecon/sub-tester/anat/sub-tester_from-T1w_to-MNI152NLin2009cAsym_mode-image_xfm.h5 -qsirecon/sub-tester/anat/sub-tester_from-orig_to-T1w_mode-image_xfm.txt -qsirecon/sub-tester/dwi -qsirecon/sub-tester/dwi/sub-tester_acq-HASC55AP_confounds.tsv -qsirecon/sub-tester/dwi/sub-tester_acq-HASC55AP_desc-ImageQC_dwi.csv -qsirecon/sub-tester/dwi/sub-tester_acq-HASC55AP_desc-SliceQC_dwi.json -qsirecon/sub-tester/dwi/sub-tester_acq-HASC55AP_dwiqc.json -qsirecon/sub-tester/dwi/sub-tester_acq-HASC55AP_space-T1w_desc-3dSHORE_cnr.nii.gz -qsirecon/sub-tester/dwi/sub-tester_acq-HASC55AP_space-T1w_desc-brain_mask.nii.gz -qsirecon/sub-tester/dwi/sub-tester_acq-HASC55AP_space-T1w_desc-preproc_dwi.b -qsirecon/sub-tester/dwi/sub-tester_acq-HASC55AP_space-T1w_desc-preproc_dwi.bval -qsirecon/sub-tester/dwi/sub-tester_acq-HASC55AP_space-T1w_desc-preproc_dwi.bvec -qsirecon/sub-tester/dwi/sub-tester_acq-HASC55AP_space-T1w_desc-preproc_dwi.nii.gz -qsirecon/sub-tester/dwi/sub-tester_acq-HASC55AP_space-T1w_desc-preproc_dwi.txt -qsirecon/sub-tester/dwi/sub-tester_acq-HASC55AP_space-T1w_dwiref.nii.gz diff --git a/qsirecon/tests/data/dsdti_fmap_outputs.txt b/qsirecon/tests/data/dsdti_fmap_outputs.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/qsirecon/tests/data/dsdti_nofmap_outputs.txt b/qsirecon/tests/data/dsdti_nofmap_outputs.txt deleted file mode 100644 index bf101d40..00000000 --- a/qsirecon/tests/data/dsdti_nofmap_outputs.txt +++ /dev/null @@ -1,33 +0,0 @@ -qsirecon -qsirecon/dataset_description.json -qsirecon/dwiqc.json -qsirecon/logs -qsirecon/logs/CITATION.bib -qsirecon/logs/CITATION.html -qsirecon/logs/CITATION.md -qsirecon/logs/CITATION.tex -qsirecon/sub-PNC -qsirecon/sub-PNC.html -qsirecon/sub-PNC/anat -qsirecon/sub-PNC/anat/sub-PNC_desc-aseg_dseg.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_desc-brain_mask.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_desc-preproc_T1w.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_dseg.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_from-MNI152NLin2009cAsym_to-T1w_mode-image_xfm.h5 -qsirecon/sub-PNC/anat/sub-PNC_from-T1wACPC_to-T1wNative_mode-image_xfm.mat -qsirecon/sub-PNC/anat/sub-PNC_from-T1wNative_to-T1wACPC_mode-image_xfm.mat -qsirecon/sub-PNC/anat/sub-PNC_from-T1w_to-MNI152NLin2009cAsym_mode-image_xfm.h5 -qsirecon/sub-PNC/anat/sub-PNC_from-orig_to-T1w_mode-image_xfm.txt -qsirecon/sub-PNC/dwi -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_confounds.tsv -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_desc-ImageQC_dwi.csv -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_desc-SliceQC_dwi.json -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_dwiqc.json -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-brain_mask.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-eddy_cnr.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_dwi.b -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_dwi.bval -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_dwi.bvec -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_dwi.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_dwi.txt -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_dwiref.nii.gz diff --git a/qsirecon/tests/data/dsdti_synfmap_outputs.txt b/qsirecon/tests/data/dsdti_synfmap_outputs.txt deleted file mode 100644 index bf101d40..00000000 --- a/qsirecon/tests/data/dsdti_synfmap_outputs.txt +++ /dev/null @@ -1,33 +0,0 @@ -qsirecon -qsirecon/dataset_description.json -qsirecon/dwiqc.json -qsirecon/logs -qsirecon/logs/CITATION.bib -qsirecon/logs/CITATION.html -qsirecon/logs/CITATION.md -qsirecon/logs/CITATION.tex -qsirecon/sub-PNC -qsirecon/sub-PNC.html -qsirecon/sub-PNC/anat -qsirecon/sub-PNC/anat/sub-PNC_desc-aseg_dseg.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_desc-brain_mask.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_desc-preproc_T1w.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_dseg.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_from-MNI152NLin2009cAsym_to-T1w_mode-image_xfm.h5 -qsirecon/sub-PNC/anat/sub-PNC_from-T1wACPC_to-T1wNative_mode-image_xfm.mat -qsirecon/sub-PNC/anat/sub-PNC_from-T1wNative_to-T1wACPC_mode-image_xfm.mat -qsirecon/sub-PNC/anat/sub-PNC_from-T1w_to-MNI152NLin2009cAsym_mode-image_xfm.h5 -qsirecon/sub-PNC/anat/sub-PNC_from-orig_to-T1w_mode-image_xfm.txt -qsirecon/sub-PNC/dwi -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_confounds.tsv -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_desc-ImageQC_dwi.csv -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_desc-SliceQC_dwi.json -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_dwiqc.json -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-brain_mask.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-eddy_cnr.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_dwi.b -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_dwi.bval -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_dwi.bvec -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_dwi.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_dwi.txt -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_dwiref.nii.gz diff --git a/qsirecon/tests/data/dsdti_topup_outputs.txt b/qsirecon/tests/data/dsdti_topup_outputs.txt deleted file mode 100644 index bf101d40..00000000 --- a/qsirecon/tests/data/dsdti_topup_outputs.txt +++ /dev/null @@ -1,33 +0,0 @@ -qsirecon -qsirecon/dataset_description.json -qsirecon/dwiqc.json -qsirecon/logs -qsirecon/logs/CITATION.bib -qsirecon/logs/CITATION.html -qsirecon/logs/CITATION.md -qsirecon/logs/CITATION.tex -qsirecon/sub-PNC -qsirecon/sub-PNC.html -qsirecon/sub-PNC/anat -qsirecon/sub-PNC/anat/sub-PNC_desc-aseg_dseg.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_desc-brain_mask.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_desc-preproc_T1w.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_dseg.nii.gz -qsirecon/sub-PNC/anat/sub-PNC_from-MNI152NLin2009cAsym_to-T1w_mode-image_xfm.h5 -qsirecon/sub-PNC/anat/sub-PNC_from-T1wACPC_to-T1wNative_mode-image_xfm.mat -qsirecon/sub-PNC/anat/sub-PNC_from-T1wNative_to-T1wACPC_mode-image_xfm.mat -qsirecon/sub-PNC/anat/sub-PNC_from-T1w_to-MNI152NLin2009cAsym_mode-image_xfm.h5 -qsirecon/sub-PNC/anat/sub-PNC_from-orig_to-T1w_mode-image_xfm.txt -qsirecon/sub-PNC/dwi -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_confounds.tsv -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_desc-ImageQC_dwi.csv -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_desc-SliceQC_dwi.json -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_dwiqc.json -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-brain_mask.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-eddy_cnr.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_dwi.b -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_dwi.bval -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_dwi.bvec -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_dwi.nii.gz -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_dwi.txt -qsirecon/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_dwiref.nii.gz diff --git a/qsirecon/tests/data/eddy_config.json b/qsirecon/tests/data/eddy_config.json deleted file mode 100644 index 5a6e9f09..00000000 --- a/qsirecon/tests/data/eddy_config.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "flm": "linear", - "slm": "none", - "fep": false, - "interp": "spline", - "nvoxhp": 100, - "fudge_factor": 10, - "dont_sep_offs_move": false, - "dont_peas": false, - "niter": 2, - "method": "jac", - "repol": true, - "num_threads": 1, - "is_shelled": true, - "use_cuda": false, - "cnr_maps": true, - "residuals": false, - "output_type": "NIFTI_GZ", - "args": "" -} \ No newline at end of file diff --git a/qsirecon/tests/data/eddy_cuda_config.json b/qsirecon/tests/data/eddy_cuda_config.json deleted file mode 100644 index 56327416..00000000 --- a/qsirecon/tests/data/eddy_cuda_config.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "flm": "quadratic", - "slm": "none", - "fep": false, - "interp": "spline", - "nvoxhp": 100, - "fudge_factor": 10, - "dont_sep_offs_move": false, - "dont_peas": false, - "niter": 2, - "method": "jac", - "repol": true, - "num_threads": 1, - "is_shelled": true, - "use_cuda": true, - "mporder": 1, - "cnr_maps": true, - "residuals": false, - "output_type": "NIFTI_GZ", - "args": "" -} \ No newline at end of file diff --git a/qsirecon/tests/data/forrest_gump_filter.json b/qsirecon/tests/data/forrest_gump_filter.json deleted file mode 100644 index 42b7af2c..00000000 --- a/qsirecon/tests/data/forrest_gump_filter.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "t1w": { - "reconstruction": "autobox" - }, - "t2w": { - "reconstruction": "autobox" - } -} diff --git a/qsirecon/tests/data/forrest_gump_outputs.txt b/qsirecon/tests/data/forrest_gump_outputs.txt deleted file mode 100644 index a1500936..00000000 --- a/qsirecon/tests/data/forrest_gump_outputs.txt +++ /dev/null @@ -1,35 +0,0 @@ -qsirecon -qsirecon/dataset_description.json -qsirecon/dwiqc.json -qsirecon/logs -qsirecon/logs/CITATION.bib -qsirecon/logs/CITATION.html -qsirecon/logs/CITATION.md -qsirecon/logs/CITATION.tex -qsirecon/sub-01 -qsirecon/sub-01.html -qsirecon/sub-01/anat -qsirecon/sub-01/anat/sub-01_desc-aseg_dseg.nii.gz -qsirecon/sub-01/anat/sub-01_desc-brain_mask.nii.gz -qsirecon/sub-01/anat/sub-01_desc-preproc_T1w.nii.gz -qsirecon/sub-01/anat/sub-01_dseg.nii.gz -qsirecon/sub-01/anat/sub-01_from-MNI152NLin2009cAsym_to-T1w_mode-image_xfm.h5 -qsirecon/sub-01/anat/sub-01_from-T1wACPC_to-T1wNative_mode-image_xfm.mat -qsirecon/sub-01/anat/sub-01_from-T1wNative_to-T1wACPC_mode-image_xfm.mat -qsirecon/sub-01/anat/sub-01_from-T1w_to-MNI152NLin2009cAsym_mode-image_xfm.h5 -qsirecon/sub-01/ses-forrestgump -qsirecon/sub-01/ses-forrestgump/anat -qsirecon/sub-01/ses-forrestgump/anat/sub-01_ses-forrestgump_rec-autobox_from-orig_to-T1w_mode-image_xfm.txt -qsirecon/sub-01/ses-forrestgump/dwi -qsirecon/sub-01/ses-forrestgump/dwi/sub-01_ses-forrestgump_confounds.tsv -qsirecon/sub-01/ses-forrestgump/dwi/sub-01_ses-forrestgump_desc-ImageQC_dwi.csv -qsirecon/sub-01/ses-forrestgump/dwi/sub-01_ses-forrestgump_desc-SliceQC_dwi.json -qsirecon/sub-01/ses-forrestgump/dwi/sub-01_ses-forrestgump_dwiqc.json -qsirecon/sub-01/ses-forrestgump/dwi/sub-01_ses-forrestgump_space-T1w_desc-brain_mask.nii.gz -qsirecon/sub-01/ses-forrestgump/dwi/sub-01_ses-forrestgump_space-T1w_desc-eddy_cnr.nii.gz -qsirecon/sub-01/ses-forrestgump/dwi/sub-01_ses-forrestgump_space-T1w_desc-preproc_dwi.b -qsirecon/sub-01/ses-forrestgump/dwi/sub-01_ses-forrestgump_space-T1w_desc-preproc_dwi.bval -qsirecon/sub-01/ses-forrestgump/dwi/sub-01_ses-forrestgump_space-T1w_desc-preproc_dwi.bvec -qsirecon/sub-01/ses-forrestgump/dwi/sub-01_ses-forrestgump_space-T1w_desc-preproc_dwi.nii.gz -qsirecon/sub-01/ses-forrestgump/dwi/sub-01_ses-forrestgump_space-T1w_desc-preproc_dwi.txt -qsirecon/sub-01/ses-forrestgump/dwi/sub-01_ses-forrestgump_space-T1w_dwiref.nii.gz diff --git a/qsirecon/tests/data/intramodal_template_outputs.txt b/qsirecon/tests/data/intramodal_template_outputs.txt deleted file mode 100644 index ec794e7c..00000000 --- a/qsirecon/tests/data/intramodal_template_outputs.txt +++ /dev/null @@ -1,69 +0,0 @@ -/tmp/twoses/derivatives -qsirecon -qsirecon/dataset_description.json -qsirecon/dwiqc.json -qsirecon/logs -qsirecon/logs/CITATION.html -qsirecon/logs/CITATION.md -qsirecon/logs/CITATION.tex -qsirecon/sub-tester -qsirecon/sub-tester.html -qsirecon/sub-tester/anat -qsirecon/sub-tester/anat/sub-tester_desc-brain_mask.nii.gz -qsirecon/sub-tester/anat/sub-tester_desc-preproc_T1w.nii.gz -qsirecon/sub-tester/anat/sub-tester_dseg.nii.gz -qsirecon/sub-tester/anat/sub-tester_from-MNI152NLin2009cAsym_to-T1w_mode-image_xfm.h5 -qsirecon/sub-tester/anat/sub-tester_from-T1w_to-MNI152NLin2009cAsym_mode-image_xfm.h5 -qsirecon/sub-tester/anat/sub-tester_label-CSF_probseg.nii.gz -qsirecon/sub-tester/anat/sub-tester_label-GM_probseg.nii.gz -qsirecon/sub-tester/anat/sub-tester_label-WM_probseg.nii.gz -qsirecon/sub-tester/anat/sub-tester_space-MNI152NLin2009cAsym_desc-brain_mask.nii.gz -qsirecon/sub-tester/anat/sub-tester_space-MNI152NLin2009cAsym_desc-preproc_T1w.nii.gz -qsirecon/sub-tester/anat/sub-tester_space-MNI152NLin2009cAsym_dseg.nii.gz -qsirecon/sub-tester/anat/sub-tester_space-MNI152NLin2009cAsym_label-CSF_probseg.nii.gz -qsirecon/sub-tester/anat/sub-tester_space-MNI152NLin2009cAsym_label-GM_probseg.nii.gz -qsirecon/sub-tester/anat/sub-tester_space-MNI152NLin2009cAsym_label-WM_probseg.nii.gz -qsirecon/sub-tester/figures -qsirecon/sub-tester/figures/sub-tester_imtcoreg.svg -qsirecon/sub-tester/figures/sub-tester_seg_brainmask.svg -qsirecon/sub-tester/figures/sub-tester_ses-1_acq-HASC55PA_carpetplot.svg -qsirecon/sub-tester/figures/sub-tester_ses-1_acq-HASC55PA_coreg.svg -qsirecon/sub-tester/figures/sub-tester_ses-1_acq-HASC55PA_desc-resampled_b0ref.svg -qsirecon/sub-tester/figures/sub-tester_ses-1_acq-HASC55PA_dwi_denoise_ses_1_acq_HASC55PA_dwi_wf_biascorr.svg -qsirecon/sub-tester/figures/sub-tester_ses-1_acq-HASC55PA_sampling_scheme.gif -qsirecon/sub-tester/figures/sub-tester_ses-1_acq-HASC55PA_tointramodal.svg -qsirecon/sub-tester/figures/sub-tester_ses-2_acq-HASC55AP_carpetplot.svg -qsirecon/sub-tester/figures/sub-tester_ses-2_acq-HASC55AP_coreg.svg -qsirecon/sub-tester/figures/sub-tester_ses-2_acq-HASC55AP_desc-resampled_b0ref.svg -qsirecon/sub-tester/figures/sub-tester_ses-2_acq-HASC55AP_dwi_denoise_ses_2_acq_HASC55AP_dwi_wf_biascorr.svg -qsirecon/sub-tester/figures/sub-tester_ses-2_acq-HASC55AP_sampling_scheme.gif -qsirecon/sub-tester/figures/sub-tester_ses-2_acq-HASC55AP_tointramodal.svg -qsirecon/sub-tester/figures/sub-tester_t1_2_mni.svg -qsirecon/sub-tester/ses-1 -qsirecon/sub-tester/ses-1/anat -qsirecon/sub-tester/ses-1/anat/sub-tester_ses-1_from-orig_to-T1w_mode-image_xfm.txt -qsirecon/sub-tester/ses-1/dwi -qsirecon/sub-tester/ses-1/dwi/sub-tester_ses-1_acq-HASC55PA_confounds.tsv -qsirecon/sub-tester/ses-1/dwi/sub-tester_ses-1_acq-HASC55PA_desc-ImageQC_dwi.csv -qsirecon/sub-tester/ses-1/dwi/sub-tester_ses-1_acq-HASC55PA_desc-SliceQC_dwi.json -qsirecon/sub-tester/ses-1/dwi/sub-tester_ses-1_acq-HASC55PA_dwiqc.json -qsirecon/sub-tester/ses-1/dwi/sub-tester_ses-1_acq-HASC55PA_space-T1w_desc-brain_mask.nii.gz -qsirecon/sub-tester/ses-1/dwi/sub-tester_ses-1_acq-HASC55PA_space-T1w_desc-none_cnr.nii.gz -qsirecon/sub-tester/ses-1/dwi/sub-tester_ses-1_acq-HASC55PA_space-T1w_desc-preproc_dwi.b -qsirecon/sub-tester/ses-1/dwi/sub-tester_ses-1_acq-HASC55PA_space-T1w_desc-preproc_dwi.bval -qsirecon/sub-tester/ses-1/dwi/sub-tester_ses-1_acq-HASC55PA_space-T1w_desc-preproc_dwi.bvec -qsirecon/sub-tester/ses-1/dwi/sub-tester_ses-1_acq-HASC55PA_space-T1w_desc-preproc_dwi.nii.gz -qsirecon/sub-tester/ses-1/dwi/sub-tester_ses-1_acq-HASC55PA_space-T1w_dwiref.nii.gz -qsirecon/sub-tester/ses-2 -qsirecon/sub-tester/ses-2/dwi -qsirecon/sub-tester/ses-2/dwi/sub-tester_ses-2_acq-HASC55AP_confounds.tsv -qsirecon/sub-tester/ses-2/dwi/sub-tester_ses-2_acq-HASC55AP_desc-ImageQC_dwi.csv -qsirecon/sub-tester/ses-2/dwi/sub-tester_ses-2_acq-HASC55AP_desc-SliceQC_dwi.json -qsirecon/sub-tester/ses-2/dwi/sub-tester_ses-2_acq-HASC55AP_dwiqc.json -qsirecon/sub-tester/ses-2/dwi/sub-tester_ses-2_acq-HASC55AP_space-T1w_desc-brain_mask.nii.gz -qsirecon/sub-tester/ses-2/dwi/sub-tester_ses-2_acq-HASC55AP_space-T1w_desc-none_cnr.nii.gz -qsirecon/sub-tester/ses-2/dwi/sub-tester_ses-2_acq-HASC55AP_space-T1w_desc-preproc_dwi.b -qsirecon/sub-tester/ses-2/dwi/sub-tester_ses-2_acq-HASC55AP_space-T1w_desc-preproc_dwi.bval -qsirecon/sub-tester/ses-2/dwi/sub-tester_ses-2_acq-HASC55AP_space-T1w_desc-preproc_dwi.bvec -qsirecon/sub-tester/ses-2/dwi/sub-tester_ses-2_acq-HASC55AP_space-T1w_desc-preproc_dwi.nii.gz -qsirecon/sub-tester/ses-2/dwi/sub-tester_ses-2_acq-HASC55AP_space-T1w_dwiref.nii.gz diff --git a/qsirecon/tests/data/maternal_brain_project_filter.json b/qsirecon/tests/data/maternal_brain_project_filter.json deleted file mode 100644 index bb7f364e..00000000 --- a/qsirecon/tests/data/maternal_brain_project_filter.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "t1w": { - "reconstruction": "autobox" - } -} diff --git a/qsirecon/tests/data/maternal_brain_project_outputs.txt b/qsirecon/tests/data/maternal_brain_project_outputs.txt deleted file mode 100644 index 3d5e359f..00000000 --- a/qsirecon/tests/data/maternal_brain_project_outputs.txt +++ /dev/null @@ -1,36 +0,0 @@ -qsirecon -qsirecon/dataset_description.json -qsirecon/dwiqc.json -qsirecon/logs -qsirecon/logs/CITATION.bib -qsirecon/logs/CITATION.html -qsirecon/logs/CITATION.md -qsirecon/logs/CITATION.tex -qsirecon/sub-01 -qsirecon/sub-01.html -qsirecon/sub-01/anat -qsirecon/sub-01/anat/sub-01_desc-aseg_dseg.nii.gz -qsirecon/sub-01/anat/sub-01_desc-brain_mask.nii.gz -qsirecon/sub-01/anat/sub-01_desc-preproc_T1w.nii.gz -qsirecon/sub-01/anat/sub-01_dseg.nii.gz -qsirecon/sub-01/anat/sub-01_from-MNI152NLin2009cAsym_to-T1w_mode-image_xfm.h5 -qsirecon/sub-01/anat/sub-01_from-T1wACPC_to-T1wNative_mode-image_xfm.mat -qsirecon/sub-01/anat/sub-01_from-T1wNative_to-T1wACPC_mode-image_xfm.mat -qsirecon/sub-01/anat/sub-01_from-T1w_to-MNI152NLin2009cAsym_mode-image_xfm.h5 -qsirecon/sub-01/ses-01 -qsirecon/sub-01/ses-01/anat -qsirecon/sub-01/ses-01/anat/sub-01_ses-01_rec-autobox_from-orig_to-T1w_mode-image_xfm.txt -qsirecon/sub-01/ses-01/dwi -qsirecon/sub-01/ses-01/dwi/sub-01_ses-01_confounds.tsv -qsirecon/sub-01/ses-01/dwi/sub-01_ses-01_desc-ImageQC_dwi.csv -qsirecon/sub-01/ses-01/dwi/sub-01_ses-01_desc-SliceQC_dwi.json -qsirecon/sub-01/ses-01/dwi/sub-01_ses-01_dwiqc.json -qsirecon/sub-01/ses-01/dwi/sub-01_ses-01_hmcOptimization.csv -qsirecon/sub-01/ses-01/dwi/sub-01_ses-01_space-T1w_desc-3dSHORE_cnr.nii.gz -qsirecon/sub-01/ses-01/dwi/sub-01_ses-01_space-T1w_desc-brain_mask.nii.gz -qsirecon/sub-01/ses-01/dwi/sub-01_ses-01_space-T1w_desc-preproc_dwi.b -qsirecon/sub-01/ses-01/dwi/sub-01_ses-01_space-T1w_desc-preproc_dwi.bval -qsirecon/sub-01/ses-01/dwi/sub-01_ses-01_space-T1w_desc-preproc_dwi.bvec -qsirecon/sub-01/ses-01/dwi/sub-01_ses-01_space-T1w_desc-preproc_dwi.nii.gz -qsirecon/sub-01/ses-01/dwi/sub-01_ses-01_space-T1w_desc-preproc_dwi.txt -qsirecon/sub-01/ses-01/dwi/sub-01_ses-01_space-T1w_dwiref.nii.gz diff --git a/qsirecon/tests/data/mrtrix3_recon_outputs.txt b/qsirecon/tests/data/mrtrix3_recon_outputs.txt index a97f5e78..ab52c710 100644 --- a/qsirecon/tests/data/mrtrix3_recon_outputs.txt +++ b/qsirecon/tests/data/mrtrix3_recon_outputs.txt @@ -1,13 +1,10 @@ +dataset_description.json +logs +logs/CITATION.bib +logs/CITATION.html +logs/CITATION.md +logs/CITATION.tex qsirecon -qsirecon/dataset_description.json -qsirecon/dwiqc.json -qsirecon/logs -qsirecon/logs/CITATION.bib -qsirecon/logs/CITATION.html -qsirecon/logs/CITATION.md -qsirecon/logs/CITATION.tex -qsirecon/sub-ABCD -qsirecon/sub-ABCD.html qsirecon qsirecon-MRtrix3_act-FAST qsirecon-MRtrix3_act-FAST/sub-ABCD @@ -49,4 +46,7 @@ qsirecon-anat/sub-ABCD/dwi/sub-ABCD_acq-10per000_space-T1w_desc-preproc_atlas-sc qsirecon-anat/sub-ABCD/dwi/sub-ABCD_acq-10per000_space-T1w_desc-preproc_atlas-schaefer400_dseg.mif.gz qsirecon-anat/sub-ABCD/dwi/sub-ABCD_acq-10per000_space-T1w_desc-preproc_atlas-schaefer400_dseg.nii.gz qsirecon-anat/sub-ABCD/dwi/sub-ABCD_acq-10per000_space-T1w_desc-preproc_atlas-schaefer400_dseg.txt +qsirecon/dwiqc.json qsirecon/sub-ABCD +qsirecon/sub-ABCD.html +sub-ABCD diff --git a/qsirecon/tests/data/mrtrix_singleshell_ss3t_act_outputs.txt b/qsirecon/tests/data/mrtrix_singleshell_ss3t_act_outputs.txt index 56d70350..1cf9586d 100644 --- a/qsirecon/tests/data/mrtrix_singleshell_ss3t_act_outputs.txt +++ b/qsirecon/tests/data/mrtrix_singleshell_ss3t_act_outputs.txt @@ -1,13 +1,10 @@ +dataset_description.json +logs +logs/CITATION.bib +logs/CITATION.html +logs/CITATION.md +logs/CITATION.tex qsirecon -qsirecon/dataset_description.json -qsirecon/dwiqc.json -qsirecon/logs -qsirecon/logs/CITATION.bib -qsirecon/logs/CITATION.html -qsirecon/logs/CITATION.md -qsirecon/logs/CITATION.tex -qsirecon/sub-PNC -qsirecon/sub-PNC.html qsirecon qsirecon-MRtrix3_fork-SS3T_act-FAST qsirecon-MRtrix3_fork-SS3T_act-FAST/sub-PNC @@ -49,4 +46,8 @@ qsirecon-anat/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_atlas-sch qsirecon-anat/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_atlas-schaefer400_dseg.mif.gz qsirecon-anat/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_atlas-schaefer400_dseg.nii.gz qsirecon-anat/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_atlas-schaefer400_dseg.txt +qsirecon/dwiqc.json +qsirecon/sub-PNC qsirecon/sub-PNC +qsirecon/sub-PNC.html +sub-PNC diff --git a/qsirecon/tests/data/mrtrix_singleshell_ss3t_noact_outputs.txt b/qsirecon/tests/data/mrtrix_singleshell_ss3t_noact_outputs.txt index b632f6c1..878e39d2 100644 --- a/qsirecon/tests/data/mrtrix_singleshell_ss3t_noact_outputs.txt +++ b/qsirecon/tests/data/mrtrix_singleshell_ss3t_noact_outputs.txt @@ -1,13 +1,10 @@ +dataset_description.json +logs +logs/CITATION.bib +logs/CITATION.html +logs/CITATION.md +logs/CITATION.tex qsirecon -qsirecon/dataset_description.json -qsirecon/dwiqc.json -qsirecon/logs -qsirecon/logs/CITATION.bib -qsirecon/logs/CITATION.html -qsirecon/logs/CITATION.md -qsirecon/logs/CITATION.tex -qsirecon/sub-PNC -qsirecon/sub-PNC.html qsirecon qsirecon-MRtrix3_fork-SS3T_act-None qsirecon-MRtrix3_fork-SS3T_act-None/sub-PNC @@ -49,4 +46,8 @@ qsirecon-anat/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_atlas-sch qsirecon-anat/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_atlas-schaefer400_dseg.mif.gz qsirecon-anat/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_atlas-schaefer400_dseg.nii.gz qsirecon-anat/sub-PNC/dwi/sub-PNC_acq-realistic_space-T1w_desc-preproc_atlas-schaefer400_dseg.txt +qsirecon/dwiqc.json +qsirecon/sub-PNC qsirecon/sub-PNC +qsirecon/sub-PNC.html +sub-PNC diff --git a/qsirecon/tests/data/multi_t1w_outputs.txt b/qsirecon/tests/data/multi_t1w_outputs.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/qsirecon/tests/data/pyafq_recon_external_trk_outputs.txt b/qsirecon/tests/data/pyafq_recon_external_trk_outputs.txt index 82f7b11d..74d57ded 100644 --- a/qsirecon/tests/data/pyafq_recon_external_trk_outputs.txt +++ b/qsirecon/tests/data/pyafq_recon_external_trk_outputs.txt @@ -1,12 +1,12 @@ qsirecon -qsirecon/dataset_description.json +dataset_description.json qsirecon/dwiqc.json -qsirecon/logs -qsirecon/logs/CITATION.bib -qsirecon/logs/CITATION.html -qsirecon/logs/CITATION.md -qsirecon/logs/CITATION.tex -qsirecon/sub-ABCD +logs +logs/CITATION.bib +logs/CITATION.html +logs/CITATION.md +logs/CITATION.tex +sub-ABCD qsirecon/sub-ABCD.html qsirecon qsirecon-MRtrix3 diff --git a/qsirecon/tests/data/pyafq_recon_full_outputs.txt b/qsirecon/tests/data/pyafq_recon_full_outputs.txt index f0cb7e26..54745c2b 100644 --- a/qsirecon/tests/data/pyafq_recon_full_outputs.txt +++ b/qsirecon/tests/data/pyafq_recon_full_outputs.txt @@ -1,13 +1,10 @@ +dataset_description.json +logs +logs/CITATION.bib +logs/CITATION.html +logs/CITATION.md +logs/CITATION.tex qsirecon -qsirecon/dataset_description.json -qsirecon/dwiqc.json -qsirecon/logs -qsirecon/logs/CITATION.bib -qsirecon/logs/CITATION.html -qsirecon/logs/CITATION.md -qsirecon/logs/CITATION.tex -qsirecon/sub-ABCD -qsirecon/sub-ABCD.html qsirecon qsirecon-PYAFQ qsirecon-PYAFQ/sub-ABCD @@ -111,4 +108,7 @@ qsirecon-PYAFQ/sub-ABCD/dwi/sub-ABCD_acq-10per000_space-T1w_desc-preproc_dwimap/ qsirecon-PYAFQ/sub-ABCD/dwi/sub-ABCD_acq-10per000_space-T1w_desc-preproc_dwimap/viz_core_bundles/sub-ABCD_acq-10per000_coordsys-RASMM_trkmethod-probCSD_recogmethod-AFQ_desc-LeftCorticospinalviz_dwi.html qsirecon-PYAFQ/sub-ABCD/dwi/sub-ABCD_acq-10per000_space-T1w_desc-preproc_dwimap/viz_core_bundles/sub-ABCD_acq-10per000_coordsys-RASMM_trkmethod-probCSD_recogmethod-AFQ_desc-LeftSuperiorLongitudinalviz_dwi.html qsirecon-PYAFQ/sub-ABCD/dwi/sub-ABCD_acq-10per000_space-T1w_desc-preproc_dwimap/viz_core_bundles/sub-ABCD_acq-10per000_coordsys-RASMM_trkmethod-probCSD_recogmethod-AFQ_desc-RightCorticospinalviz_dwi.html +qsirecon/dwiqc.json qsirecon/sub-ABCD +qsirecon/sub-ABCD.html +sub-ABCD diff --git a/qsirecon/tests/data/scalar_mapper_outputs.txt b/qsirecon/tests/data/scalar_mapper_outputs.txt index f6d7b827..c1e51c72 100644 --- a/qsirecon/tests/data/scalar_mapper_outputs.txt +++ b/qsirecon/tests/data/scalar_mapper_outputs.txt @@ -1,13 +1,10 @@ +dataset_description.json +logs +logs/CITATION.bib +logs/CITATION.html +logs/CITATION.md +logs/CITATION.tex qsirecon -qsirecon/dataset_description.json -qsirecon/dwiqc.json -qsirecon/logs -qsirecon/logs/CITATION.bib -qsirecon/logs/CITATION.html -qsirecon/logs/CITATION.md -qsirecon/logs/CITATION.tex -qsirecon/sub-ABCD -qsirecon/sub-ABCD.html qsirecon qsirecon-DIPYDKI qsirecon-DIPYDKI/sub-ABCD @@ -73,4 +70,7 @@ qsirecon-DSIStudio/sub-ABCD/dwi/sub-ABCD_acq-10per000_space-T1w_desc-preproc_mod qsirecon-DSIStudio/sub-ABCD/dwi/sub-ABCD_acq-10per000_space-T1w_desc-preproc_model-tensor_mfp-tyy_dwimap.nii.gz qsirecon-DSIStudio/sub-ABCD/dwi/sub-ABCD_acq-10per000_space-T1w_desc-preproc_model-tensor_mfp-tyz_dwimap.nii.gz qsirecon-DSIStudio/sub-ABCD/dwi/sub-ABCD_acq-10per000_space-T1w_desc-preproc_model-tensor_mfp-tzz_dwimap.nii.gz -qsirecon/sub-ABCD \ No newline at end of file +qsirecon/dwiqc.json +qsirecon/sub-ABCD +qsirecon/sub-ABCD.html +sub-ABCD diff --git a/qsirecon/tests/data/tortoise_recon_outputs.txt b/qsirecon/tests/data/tortoise_recon_outputs.txt index a83328a6..6fe4c50f 100644 --- a/qsirecon/tests/data/tortoise_recon_outputs.txt +++ b/qsirecon/tests/data/tortoise_recon_outputs.txt @@ -1,13 +1,10 @@ +dataset_description.json +logs +logs/CITATION.bib +logs/CITATION.html +logs/CITATION.md +logs/CITATION.tex qsirecon -qsirecon/dataset_description.json -qsirecon/dwiqc.json -qsirecon/logs -qsirecon/logs/CITATION.bib -qsirecon/logs/CITATION.html -qsirecon/logs/CITATION.md -qsirecon/logs/CITATION.tex -qsirecon/sub-ABCD -qsirecon/sub-ABCD.html qsirecon qsirecon-TORTOISE qsirecon-TORTOISE/sub-ABCD @@ -25,4 +22,7 @@ qsirecon-TORTOISE/sub-ABCD/dwi/sub-ABCD_acq-10per000_space-T1w_desc-preproc_mode qsirecon-TORTOISE/sub-ABCD/dwi/sub-ABCD_acq-10per000_space-T1w_desc-preproc_model-tensor_mdp-li_dwimap.nii.gz qsirecon-TORTOISE/sub-ABCD/dwi/sub-ABCD_acq-10per000_space-T1w_desc-preproc_model-tensor_mdp-rd_dwimap.nii.gz qsirecon-TORTOISE/sub-ABCD/dwi/sub-ABCD_acq-10per000_space-T1w_desc-preproc_model-tensor_mfp-AM_dwimap.nii.gz +qsirecon/dwiqc.json qsirecon/sub-ABCD +qsirecon/sub-ABCD.html +sub-ABCD diff --git a/qsirecon/tests/test_cli.py b/qsirecon/tests/test_cli.py index 4a2514da..5bb5572b 100644 --- a/qsirecon/tests/test_cli.py +++ b/qsirecon/tests/test_cli.py @@ -52,11 +52,8 @@ def test_mrtrix_singleshell_ss3t_act(data_dir, output_dir, working_dir): out_dir, "participant", f"-w={work_dir}", - f"--recon-input={dataset_dir}", "--sloppy", "--recon-spec=mrtrix_singleshell_ss3t_ACT-fast", - "--recon-only", - "--output-resolution=5", ] _run_and_generate(TEST_NAME, parameters, test_main=True) @@ -93,11 +90,8 @@ def test_mrtrix_singleshell_ss3t_noact(data_dir, output_dir, working_dir): out_dir, "participant", f"-w={work_dir}", - f"--recon-input={dataset_dir}", "--sloppy", "--recon-spec=mrtrix_singleshell_ss3t_noACT", - "--recon-only", - "--output-resolution=5", ] _run_and_generate(TEST_NAME, parameters, test_main=True) @@ -134,11 +128,8 @@ def test_amico_noddi(data_dir, output_dir, working_dir): out_dir, "participant", f"-w={work_dir}", - f"--recon-input={dataset_dir}", "--sloppy", "--recon-spec=amico_noddi", - "--recon-only", - "--output-resolution=5", ] _run_and_generate(TEST_NAME, parameters, test_main=True) @@ -176,11 +167,8 @@ def test_autotrack(data_dir, output_dir, working_dir): out_dir, "participant", f"-w={work_dir}", - f"--recon-input={dataset_dir}", "--sloppy", "--recon-spec=dsi_studio_autotrack", - "--recon-only", - "--output-resolution=5", ] _run_and_generate(TEST_NAME, parameters, test_main=True) @@ -221,10 +209,7 @@ def test_dipy_mapmri(data_dir, output_dir, working_dir): "participant", f"-w={work_dir}", "--sloppy", - f"--recon-input={dataset_dir}", "--recon-spec=dipy_mapmri", - "--recon-only", - "--output-resolution=5", ] _run_and_generate(TEST_NAME, parameters, test_main=True) @@ -265,10 +250,7 @@ def test_dipy_dki(data_dir, output_dir, working_dir): "participant", f"-w={work_dir}", "--sloppy", - f"--recon-input={dataset_dir}", "--recon-spec=dipy_dki", - "--recon-only", - "--output-resolution=5", ] _run_and_generate(TEST_NAME, parameters, test_main=True) @@ -298,10 +280,8 @@ def test_scalar_mapper(data_dir, output_dir, working_dir): out_dir, "participant", f"-w={work_dir}", - f"--recon-input={dataset_dir}", "--sloppy", "--recon-spec=test_scalar_maps", - "--recon-only", "--output-resolution=3.5", "--nthreads=1", ] @@ -336,11 +316,8 @@ def test_pyafq_recon_external_trk(data_dir, output_dir, working_dir): out_dir, "participant", f"-w={work_dir}", - f"--recon-input={dataset_dir}", "--sloppy", "--recon-spec=mrtrix_multishell_msmt_pyafq_tractometry", - "--recon-only", - "--output-resolution=5", ] _run_and_generate(TEST_NAME, parameters, test_main=True) @@ -373,11 +350,8 @@ def test_pyafq_recon_full(data_dir, output_dir, working_dir): out_dir, "participant", f"-w={work_dir}", - f"--recon-input={dataset_dir}", "--sloppy", "--recon-spec=pyafq_tractometry", - "--recon-only", - "--output-resolution=5", ] _run_and_generate(TEST_NAME, parameters, test_main=True) @@ -414,11 +388,8 @@ def test_mrtrix3_recon(data_dir, output_dir, working_dir): out_dir, "participant", f"-w={work_dir}", - f"--recon-input={dataset_dir}", "--sloppy", "--recon-spec=mrtrix_multishell_msmt_ACT-fast", - "--recon-only", - "--output-resolution=5", ] _run_and_generate(TEST_NAME, parameters, test_main=True) @@ -448,11 +419,8 @@ def test_tortoise_recon(data_dir, output_dir, working_dir): out_dir, "participant", f"-w={work_dir}", - f"--recon-input={dataset_dir}", "--sloppy", "--recon-spec=TORTOISE", - "--recon-only", - "--output-resolution=5", ] _run_and_generate(TEST_NAME, parameters, test_main=True) @@ -484,7 +452,7 @@ def _run_and_generate(test_name, parameters, test_main=True): retval = build_workflow(config_file, retval={}) qsirecon_wf = retval["workflow"] qsirecon_wf.run() - write_derivative_description(config.execution.fmri_dir, config.execution.qsirecon_dir) + write_derivative_description(config.execution.fmri_dir, config.execution.output_dir) build_boilerplate(str(config_file), qsirecon_wf) session_list = ( @@ -494,7 +462,7 @@ def _run_and_generate(test_name, parameters, test_main=True): ) generate_reports( subject_list=config.execution.participant_label, - output_dir=config.execution.qsirecon_dir, + output_dir=config.execution.output_dir, run_uuid=config.execution.run_uuid, session_list=session_list, ) diff --git a/qsirecon/tests/utils.py b/qsirecon/tests/utils.py index a6d44c1f..a333aef8 100644 --- a/qsirecon/tests/utils.py +++ b/qsirecon/tests/utils.py @@ -73,10 +73,10 @@ def get_test_data_path(): return os.path.abspath(os.path.join(os.path.dirname(__file__), "data") + os.path.sep) -def check_generated_files(qsirecon_dir, output_list_file, optional_output_list_file): +def check_generated_files(output_dir, output_list_file, optional_output_list_file): """Compare files generated by qsirecon with a list of expected files.""" - found_files = sorted(glob(os.path.join(qsirecon_dir, "**/*"), recursive=True)) - found_files = [os.path.relpath(f, qsirecon_dir) for f in found_files] + found_files = sorted(glob(os.path.join(output_dir, "**/*"), recursive=True)) + found_files = [os.path.relpath(f, output_dir) for f in found_files] # Ignore figures found_files = sorted(list(set([f for f in found_files if "figures" not in f]))) diff --git a/qsirecon/utils/sentry.py b/qsirecon/utils/sentry.py index 86f9b05d..a1d138ba 100644 --- a/qsirecon/utils/sentry.py +++ b/qsirecon/utils/sentry.py @@ -65,7 +65,6 @@ "participant_label", "bids_database_dir", "bids_filter_file", - "recon_input", "use_plugin", "fs_license_file", "work_dir", diff --git a/qsirecon/workflows/base.py b/qsirecon/workflows/base.py index 915ad6ed..8a4e0ce7 100644 --- a/qsirecon/workflows/base.py +++ b/qsirecon/workflows/base.py @@ -30,32 +30,26 @@ def init_qsirecon_wf(): - """ - This workflow organizes the execution of qsirecon, with a sub-workflow for - each subject. + """Organize the execution of qsirecon, with a sub-workflow for each subject. .. workflow:: :graph2use: orig :simple_form: yes from qsirecon.workflows.base import init_qsirecon_wf - wf = init_qsirecon_wf() - - - Parameters - + wf = init_qsirecon_wf() """ ver = Version(config.environment.version) qsirecon_wf = Workflow(name=f"qsirecon_{ver.major}_{ver.minor}_wf") qsirecon_wf.base_dir = config.execution.work_dir - if config.workflow.recon_input_pipeline not in ("qsirecon", "ukb"): + if config.workflow.recon_input_pipeline not in ("qsiprep", "ukb"): raise NotImplementedError( f"{config.workflow.recon_input_pipeline} is not supported as recon-input yet." ) - if config.workflow.recon_input_pipeline == "qsirecon": + if config.workflow.recon_input_pipeline == "qsiprep": # This should work for --recon-input as long as the same dataset is in bids_dir # or if the call is doing preproc+recon to_recon_list = config.execution.participant_label @@ -72,7 +66,7 @@ def init_qsirecon_wf(): single_subject_wf = init_single_subject_recon_wf(subject_id=subject_id) single_subject_wf.config["execution"]["crashdump_dir"] = str( - config.execution.qsirecon_dir / f"sub-{subject_id}" / "log" / config.execution.run_uuid + config.execution.output_dir / f"sub-{subject_id}" / "log" / config.execution.run_uuid ) for node in single_subject_wf._get_all_nodes(): node.config = deepcopy(single_subject_wf.config) @@ -80,7 +74,7 @@ def init_qsirecon_wf(): # Dump a copy of the config file into the log directory log_dir = ( - config.execution.qsirecon_dir / f"sub-{subject_id}" / "log" / config.execution.run_uuid + config.execution.output_dir / f"sub-{subject_id}" / "log" / config.execution.run_uuid ) log_dir.mkdir(exist_ok=True, parents=True) config.to_filename(log_dir / "qsirecon.toml") @@ -89,21 +83,20 @@ def init_qsirecon_wf(): def init_single_subject_recon_wf(subject_id): - """ - This workflow organizes the reconstruction pipeline for a single subject. + """Organize the reconstruction pipeline for a single subject. + Reconstruction is performed using a separate workflow for each dwi series. Parameters - - subject_id : str - Single subject label - + ---------- + subject_id : str + Single subject label """ from ..interfaces.ingress import QsiReconDWIIngress, UKBioBankDWIIngress from ..interfaces.interchange import ( ReconWorkflowInputs, anatomical_workflow_outputs, - qsirecon_output_names, + qsiprep_output_names, recon_workflow_anatomical_input_fields, recon_workflow_input_fields, ) @@ -147,9 +140,9 @@ def init_single_subject_recon_wf(subject_id): atlas_names = spec.get("atlases", []) needs_t1w_transform = spec_needs_to_template_transform(spec) - # This is here because qsirecon currently only makes one anatomical result per subject + # This is here because qsiprep currently only makes one anatomical result per subject # regardless of sessions. So process it on its - if config.workflow.recon_input_pipeline == "qsirecon": + if config.workflow.recon_input_pipeline == "qsiprep": anat_ingress_node, available_anatomical_data = init_highres_recon_anatomical_wf( subject_id=subject_id, extras_to_make=spec.get("anatomical", []), @@ -173,7 +166,7 @@ def init_single_subject_recon_wf(subject_id): wf_name = _get_wf_name(dwi_file) # Get the preprocessed DWI and all the related preprocessed images - if config.workflow.recon_input_pipeline == "qsirecon": + if config.workflow.recon_input_pipeline == "qsiprep": dwi_ingress_nodes[dwi_file] = pe.Node( QsiReconDWIIngress(dwi_file=dwi_file), name=wf_name + "_ingressed_dwi_data" ) @@ -224,11 +217,11 @@ def init_single_subject_recon_wf(subject_id): workflow.connect([ # The dwi data (dwi_ingress_nodes[dwi_file], recon_full_inputs[dwi_file], [ - (trait, trait) for trait in qsirecon_output_names]), + (trait, trait) for trait in qsiprep_output_names]), # Session-specific anatomical data (dwi_ingress_nodes[dwi_file], dwi_individual_anatomical_wfs[dwi_file], - [(trait, "inputnode." + trait) for trait in qsirecon_output_names]), + [(trait, "inputnode." + trait) for trait in qsiprep_output_names]), # subject dwi-specific anatomical to a special node in recon_full_inputs so # we have a record of what went in. Otherwise it would be lost in an IdentityInterface @@ -239,7 +232,7 @@ def init_single_subject_recon_wf(subject_id): (recon_full_inputs[dwi_file], dwi_recon_wfs[dwi_file], [(trait, "inputnode." + trait) for trait in recon_workflow_input_fields]), - (anat_ingress_node if config.workflow.recon_input_pipeline == "qsirecon" + (anat_ingress_node if config.workflow.recon_input_pipeline == "qsiprep" else anat_ingress_nodes[dwi_file], dwi_individual_anatomical_wfs[dwi_file], [(f"outputnode.{trait}", f"inputnode.{trait}") @@ -308,25 +301,12 @@ def _get_iterable_dwi_inputs(subject_id): """ from ..utils.ingress import create_ukb_layout - recon_input_directory = config.execution.recon_input - if config.workflow.recon_input_pipeline == "qsirecon": - # If recon_input is specified without qsirecon, check if we can find the subject dir - if not (recon_input_directory / f"sub-{subject_id}").exists(): - config.loggers.workflow.info( - "%s not in %s, trying recon_input=%s", - subject_id, - recon_input_directory, - recon_input_directory / "qsirecon", - ) - - recon_input_directory = recon_input_directory / "qsirecon" - if not (recon_input_directory / f"sub-{subject_id}").exists(): - raise Exception( - "Unable to find subject directory in %s or %s" - % (config.execution.recon_input, recon_input_directory) - ) + dwi_dir = config.execution.bids_dir + if config.workflow.recon_input_pipeline == "qsiprep": + if not (dwi_dir / f"sub-{subject_id}").exists(): + raise Exception(f"Unable to find subject directory in {config.execution.bids_dir}") - layout = BIDSLayout(recon_input_directory, validate=False, absolute_paths=True) + layout = BIDSLayout(dwi_dir, validate=False, absolute_paths=True) # Get all the output files that are in this space dwi_files = [ f.path @@ -335,7 +315,7 @@ def _get_iterable_dwi_inputs(subject_id): ) if "space-T1w" in f.filename ] - config.loggers.workflow.info("found %s in %s", dwi_files, recon_input_directory) + config.loggers.workflow.info("found %s in %s", dwi_files, dwi_dir) return [{"bids_dwi_file": dwi_file} for dwi_file in dwi_files] if config.workflow.recon_input_pipeline == "ukb": diff --git a/qsirecon/workflows/recon/anatomical.py b/qsirecon/workflows/recon/anatomical.py index ef93216d..cd1ebde6 100644 --- a/qsirecon/workflows/recon/anatomical.py +++ b/qsirecon/workflows/recon/anatomical.py @@ -35,7 +35,7 @@ from ...interfaces.interchange import ( FS_FILES_TO_REGISTER, anatomical_workflow_outputs, - qsirecon_highres_anatomical_ingressed_fields, + qsiprep_highres_anatomical_ingressed_fields, recon_workflow_input_fields, ) from ...interfaces.mrtrix import GenerateMasked5tt, ITKTransformConvert, TransformHeader @@ -86,19 +86,19 @@ def init_highres_recon_anatomical_wf( ) workflow.__desc__ = "" # "Gather" the input data. ``status`` is a dict that reflects which anatomical data - # are present. The anat_ingress_node is a nipype node that ensures that qsirecon-style - # anatomical data is available. In the case where ``pipeline_source`` is not "qsirecon", - # the data is converted in this node to be qsirecon-like. + # are present. The anat_ingress_node is a nipype node that ensures that qsiprep-style + # anatomical data is available. In the case where ``pipeline_source`` is not "qsiprep", + # the data is converted in this node to be qsiprep-like. pipeline_source = config.workflow.recon_input_pipeline freesurfer_dir = config.execution.freesurfer_input - if pipeline_source == "qsirecon": - anat_ingress_node, status = gather_qsirecon_anatomical_data(subject_id) + if pipeline_source == "qsiprep": + anat_ingress_node, status = gather_qsiprep_anatomical_data(subject_id) elif pipeline_source == "ukb": anat_ingress_node, status = gather_ukb_anatomical_data(subject_id) else: raise Exception(f"Unknown pipeline source '{pipeline_source}'") anat_ingress_node.inputs.infant_mode = config.workflow.infant - if needs_t1w_transform and not status["has_qsirecon_t1w_transforms"]: + if needs_t1w_transform and not status["has_qsiprep_t1w_transforms"]: raise Exception("Cannot compute to-template") # If there is no high-res anat data in the inputs there may still be an image available @@ -107,7 +107,7 @@ def init_highres_recon_anatomical_wf( status["has_freesurfer"] = subject_freesurfer_path is not None # If no high-res are available, we're done here - if not status["has_qsirecon_t1w"] and subject_freesurfer_path is None: + if not status["has_qsiprep_t1w"] and subject_freesurfer_path is None: config.loggers.workflow.warning( f"No high-res anatomical data available directly in recon inputs for {subject_id}." ) @@ -122,7 +122,7 @@ def init_highres_recon_anatomical_wf( ) workflow.connect([ (anat_ingress_node, outputnode, - [(name, name) for name in qsirecon_highres_anatomical_ingressed_fields])]) # fmt:skip + [(name, name) for name in qsiprep_highres_anatomical_ingressed_fields])]) # fmt:skip # grab un-coregistered freesurfer images later use if subject_freesurfer_path is not None: @@ -159,11 +159,11 @@ def init_highres_recon_anatomical_wf( name="create_5tt_hsvs", n_procs=config.nipype.omp_nthreads, ) - ds_qsirecon_5tt_hsvs = pe.Node( + ds_qsiprep_5tt_hsvs = pe.Node( ReconDerivativesDataSink( atlas="hsvs", space="T1w", suffix="dseg", qsirecon_suffix="anat" ), - name="ds_qsirecon_5tt_hsvs", + name="ds_qsiprep_5tt_hsvs", run_without_submitting=True, ) ds_fs_5tt_hsvs = pe.Node( @@ -175,39 +175,39 @@ def init_highres_recon_anatomical_wf( ) workflow.connect([ (anat_ingress_node, ds_fs_5tt_hsvs, [("t1_preproc", "source_file")]), - (anat_ingress_node, ds_qsirecon_5tt_hsvs, [("t1_preproc", "source_file")]), + (anat_ingress_node, ds_qsiprep_5tt_hsvs, [("t1_preproc", "source_file")]), (create_5tt_hsvs, outputnode, [('out_file', 'fs_5tt_hsvs')]), (create_5tt_hsvs, ds_fs_5tt_hsvs, [("out_file", "in_file")]), ]) # fmt:skip # Transform the 5tt image so it's registered to the QSIRecon AC-PC T1w - if status["has_qsirecon_t1w"]: + if status["has_qsiprep_t1w"]: config.loggers.workflow.info( "HSVS 5tt imaged will be registered to the QSIRecon T1w image." ) - status["has_qsirecon_5tt_hsvs"] = True - register_fs_to_qsirecon_wf = init_register_fs_to_qsirecon_wf( - use_qsirecon_reference_mask=True + status["has_qsiprep_5tt_hsvs"] = True + register_fs_to_qsiprep_wf = init_register_fs_to_qsiprep_wf( + use_qsiprep_reference_mask=True ) apply_header_to_5tt = pe.Node(TransformHeader(), name="apply_header_to_5tt") workflow.connect([ - (anat_ingress_node, register_fs_to_qsirecon_wf, [ - ("t1_preproc", "inputnode.qsirecon_reference_image"), - ("t1_brain_mask", "inputnode.qsirecon_reference_mask")]), - (fs_source, register_fs_to_qsirecon_wf, [ + (anat_ingress_node, register_fs_to_qsiprep_wf, [ + ("t1_preproc", "inputnode.qsiprep_reference_image"), + ("t1_brain_mask", "inputnode.qsiprep_reference_mask")]), + (fs_source, register_fs_to_qsiprep_wf, [ (field, "inputnode." + field) for field in FS_FILES_TO_REGISTER]), - (register_fs_to_qsirecon_wf, outputnode, [ - ("outputnode.fs_to_qsirecon_transform_mrtrix", - "fs_to_qsirecon_transform_mrtrix"), - ("outputnode.fs_to_qsirecon_transform_itk", - "fs_to_qsirecon_transform_itk")] + [ + (register_fs_to_qsiprep_wf, outputnode, [ + ("outputnode.fs_to_qsiprep_transform_mrtrix", + "fs_to_qsiprep_transform_mrtrix"), + ("outputnode.fs_to_qsiprep_transform_itk", + "fs_to_qsiprep_transform_itk")] + [ ("outputnode." + field, field) for field in FS_FILES_TO_REGISTER]), (create_5tt_hsvs, apply_header_to_5tt, [("out_file", "in_image")]), - (register_fs_to_qsirecon_wf, apply_header_to_5tt, [ - ("outputnode.fs_to_qsirecon_transform_mrtrix", "transform_file")]), + (register_fs_to_qsiprep_wf, apply_header_to_5tt, [ + ("outputnode.fs_to_qsiprep_transform_mrtrix", "transform_file")]), (apply_header_to_5tt, outputnode, [ - ("out_image", "qsirecon_5tt_hsvs")]), - (apply_header_to_5tt, ds_qsirecon_5tt_hsvs, [("out_image", "in_file")]), + ("out_image", "qsiprep_5tt_hsvs")]), + (apply_header_to_5tt, ds_qsiprep_5tt_hsvs, [("out_image", "in_file")]), ]) # fmt:skip workflow.__desc__ += "A hybrid surface/volume segmentation was created [Smith 2020]." @@ -225,16 +225,16 @@ def gather_ukb_anatomical_data(subject_id): """ status = { - "has_qsirecon_5tt_hsvs": False, + "has_qsiprep_5tt_hsvs": False, "has_freesurfer_5tt_hsvs": False, "has_freesurfer": False, } - recon_input_dir = config.execution.recon_input + recon_input_dir = config.execution.bids_dir # Check to see if we have a T1w preprocessed by QSIRecon missing_ukb_anats = check_ukb_anatomical_outputs(recon_input_dir) has_t1w = not missing_ukb_anats - status["has_qsirecon_t1w"] = has_t1w + status["has_qsiprep_t1w"] = has_t1w if missing_ukb_anats: config.loggers.workflow.info(f"Missing T1w from UKB session: {recon_input_dir}") else: @@ -246,15 +246,15 @@ def gather_ukb_anatomical_data(subject_id): # I couldn't figure out how to convert UKB transforms to ants. So # they're not available for recon workflows for now - status["has_qsirecon_t1w_transforms"] = False + status["has_qsiprep_t1w_transforms"] = False config.loggers.workflow.info("QSIRecon can't read FNIRT transforms from UKB at this time.") return anat_ingress, status -def gather_qsirecon_anatomical_data(subject_id): +def gather_qsiprep_anatomical_data(subject_id): """ - Gathers the anatomical data from a qsirecon input and finds which files are available. + Gathers the anatomical data from a QSIPrep input and finds which files are available. Parameters @@ -264,36 +264,36 @@ def gather_qsirecon_anatomical_data(subject_id): """ status = { - "has_qsirecon_5tt_hsvs": False, + "has_qsiprep_5tt_hsvs": False, "has_freesurfer_5tt_hsvs": False, "has_freesurfer": False, } - recon_input_dir = config.execution.recon_input + recon_input_dir = config.execution.bids_dir # Check to see if we have a T1w preprocessed by QSIRecon - missing_qsirecon_anats = check_qsirecon_anatomical_outputs(recon_input_dir, subject_id, "T1w") - has_qsirecon_t1w = not missing_qsirecon_anats - status["has_qsirecon_t1w"] = has_qsirecon_t1w - if missing_qsirecon_anats: + missing_qsiprep_anats = check_qsiprep_anatomical_outputs(recon_input_dir, subject_id, "T1w") + has_qsiprep_t1w = not missing_qsiprep_anats + status["has_qsiprep_t1w"] = has_qsiprep_t1w + if missing_qsiprep_anats: config.loggers.workflow.info( - "Missing T1w QSIRecon outputs found: %s", " ".join(missing_qsirecon_anats) + "Missing T1w QSIRecon outputs found: %s", " ".join(missing_qsiprep_anats) ) else: config.loggers.workflow.info("Found usable QSIRecon-preprocessed T1w image and mask.") anat_ingress = pe.Node( QSIReconAnatomicalIngress(subject_id=subject_id, recon_input_dir=recon_input_dir), - name="qsirecon_anat_ingress", + name="qsiprep_anat_ingress", ) # Check if the T1w-to-MNI transforms are in the QSIRecon outputs - missing_qsirecon_transforms = check_qsirecon_anatomical_outputs( + missing_qsiprep_transforms = check_qsiprep_anatomical_outputs( recon_input_dir, subject_id, "transforms" ) - has_qsirecon_t1w_transforms = not missing_qsirecon_transforms - status["has_qsirecon_t1w_transforms"] = has_qsirecon_t1w_transforms + has_qsiprep_t1w_transforms = not missing_qsiprep_transforms + status["has_qsiprep_t1w_transforms"] = has_qsiprep_t1w_transforms - if missing_qsirecon_transforms: + if missing_qsiprep_transforms: config.loggers.workflow.info( - "Missing T1w QSIRecon outputs: %s", " ".join(missing_qsirecon_transforms) + "Missing T1w QSIRecon outputs: %s", " ".join(missing_qsiprep_transforms) ) return anat_ingress, status @@ -325,8 +325,8 @@ def _check_zipped_unzipped(path_to_check): return exists -def check_qsirecon_anatomical_outputs(recon_input_dir, subject_id, anat_type): - """Determines whether an aligned T1w exists in a qsirecon derivatives directory. +def check_qsiprep_anatomical_outputs(recon_input_dir, subject_id, anat_type): + """Determines whether an aligned T1w exists in a qsiprep derivatives directory. It is possible that: - ``--dwi-only`` was used, in which case there is NO T1w available @@ -370,20 +370,20 @@ def check_ukb_anatomical_outputs(recon_input_dir): return missing -def init_register_fs_to_qsirecon_wf( - use_qsirecon_reference_mask=False, name="register_fs_to_qsirecon_wf" +def init_register_fs_to_qsiprep_wf( + use_qsiprep_reference_mask=False, name="register_fs_to_qsiprep_wf" ): """Registers a T1w images from freesurfer to another image and transforms""" inputnode = pe.Node( niu.IdentityInterface( - fields=FS_FILES_TO_REGISTER + ["qsirecon_reference_image", "qsirecon_reference_mask"] + fields=FS_FILES_TO_REGISTER + ["qsiprep_reference_image", "qsiprep_reference_mask"] ), name="inputnode", ) outputnode = pe.Node( niu.IdentityInterface( fields=FS_FILES_TO_REGISTER - + ["fs_to_qsirecon_transform_itk", "fs_to_qsirecon_transform_mrtrix"] + + ["fs_to_qsiprep_transform_itk", "fs_to_qsiprep_transform_mrtrix"] ), name="outputnode", ) @@ -397,15 +397,15 @@ def init_register_fs_to_qsirecon_wf( ) # Register the brain to the QSIRecon reference - ants_settings = pkgrf("qsirecon", "data/freesurfer_to_qsirecon.json") - register_to_qsirecon = pe.Node( - ants.Registration(from_file=ants_settings), name="register_to_qsirecon" + ants_settings = pkgrf("qsirecon", "data/freesurfer_to_qsiprep.json") + register_to_qsiprep = pe.Node( + ants.Registration(from_file=ants_settings), name="register_to_qsiprep" ) # If there is a mask for the QSIRecon reference image, use it - if use_qsirecon_reference_mask: - workflow.connect(inputnode, "qsirecon_reference_mask", - register_to_qsirecon, "fixed_image_masks") # fmt:skip + if use_qsiprep_reference_mask: + workflow.connect(inputnode, "qsiprep_reference_mask", + register_to_qsiprep, "fixed_image_masks") # fmt:skip # The more recent ANTs mat format isn't compatible with transformconvert. # So convert it to ANTs text format with ConvertTransform @@ -418,7 +418,7 @@ def init_register_fs_to_qsirecon_wf( ITKTransformConvert(), name="convert_ants_to_mrtrix_transform" ) - # Adjust the headers of all the input images so they're aligned to the qsirecon ref + # Adjust the headers of all the input images so they're aligned to the qsiprep ref transform_nodes = {} for image_name in FS_FILES_TO_REGISTER: transform_nodes[image_name] = pe.Node(TransformHeader(), name="transform_" + image_name) @@ -432,18 +432,18 @@ def init_register_fs_to_qsirecon_wf( workflow.connect([ (inputnode, convert_fs_brain, [ ("brain", "in_file")]), - (inputnode, register_to_qsirecon, [ - ("qsirecon_reference_image", "fixed_image")]), - (convert_fs_brain, register_to_qsirecon, [ + (inputnode, register_to_qsiprep, [ + ("qsiprep_reference_image", "fixed_image")]), + (convert_fs_brain, register_to_qsiprep, [ ("out_file", "moving_image")]), - (register_to_qsirecon, convert_ants_transform, [ + (register_to_qsiprep, convert_ants_transform, [ (("forward_transforms", _get_first), "in_transform")]), - (register_to_qsirecon, outputnode, [ - ("composite_transform", "fs_to_qsirecon_transform_itk")]), + (register_to_qsiprep, outputnode, [ + ("composite_transform", "fs_to_qsiprep_transform_itk")]), (convert_ants_transform, convert_ants_to_mrtrix_transform, [ ("out_transform", "in_transform")]), (convert_ants_to_mrtrix_transform, outputnode, - [("out_transform", "fs_to_qsirecon_transform_mrtrix")]) + [("out_transform", "fs_to_qsiprep_transform_mrtrix")]) ]) # fmt:skip return workflow @@ -451,11 +451,11 @@ def init_register_fs_to_qsirecon_wf( def init_dwi_recon_anatomical_workflow( atlas_names, - has_qsirecon_5tt_hsvs, + has_qsiprep_5tt_hsvs, needs_t1w_transform, has_freesurfer_5tt_hsvs, - has_qsirecon_t1w, - has_qsirecon_t1w_transforms, + has_qsiprep_t1w, + has_qsiprep_t1w_transforms, has_freesurfer, extras_to_make, name, @@ -473,10 +473,10 @@ def init_dwi_recon_anatomical_workflow( Parameters: =========== - has_qsirecon_5tt_hsvs: + has_qsiprep_5tt_hsvs: has_freesurfer_5tt_hsvs: True, - has_qsirecon_t1w: - has_qsirecon_t1w_transforms: True} + has_qsiprep_t1w: + has_qsiprep_t1w_transforms: True} """ # Inputnode holds data from the T1w-based anatomical workflow inputnode = pe.Node( @@ -513,10 +513,10 @@ def _exchange_fields(fields): def _get_status(): return { - "has_qsirecon_5tt_hsvs": has_qsirecon_5tt_hsvs, + "has_qsiprep_5tt_hsvs": has_qsiprep_5tt_hsvs, "has_freesurfer_5tt_hsvs": has_freesurfer_5tt_hsvs, - "has_qsirecon_t1w": has_qsirecon_t1w, - "has_qsirecon_t1w_transforms": has_qsirecon_t1w_transforms, + "has_qsiprep_t1w": has_qsiprep_t1w, + "has_qsiprep_t1w_transforms": has_qsiprep_t1w_transforms, } reference_grid_wf = init_output_grid_wf() @@ -529,7 +529,7 @@ def _get_status(): ]) # fmt:skip # Missing Freesurfer AND QSIRecon T1ws, or the user wants a DWI-based mask - if not (has_qsirecon_t1w or has_freesurfer) or prefer_dwi_mask: + if not (has_qsiprep_t1w or has_freesurfer) or prefer_dwi_mask: desc += ( "No T1w weighted images were available for masking, so a mask " "was estimated based on the b=0 images in the DWI data itself." @@ -548,8 +548,8 @@ def _get_status(): # No data from QSIRecon was available, BUT we have freesurfer! register it and # get the brain, masks and possibly a to-MNI transform. - # --> If has_freesurfer AND has qsirecon_t1w, the necessary files were created earlier - elif has_freesurfer and not has_qsirecon_t1w: + # --> If has_freesurfer AND has qsiprep_t1w, the necessary files were created earlier + elif has_freesurfer and not has_qsiprep_t1w: fs_source = pe.Node( nio.FreeSurferSource(subjects_dir=config.execution.fs_subjects_dir), name="fs_source" ) @@ -566,70 +566,70 @@ def _get_status(): + [ "t1_brain_mask", "t1_preproc", - "fs_to_qsirecon_transform_mrtrix", - "fs_to_qsirecon_transform_itk", + "fs_to_qsiprep_transform_mrtrix", + "fs_to_qsiprep_transform_itk", ] ) # Perform the registration and connect the outputs to buffernode # NOTE: using FreeSurfer "brain" image as t1_preproc and aseg as the brainmask - has_qsirecon_t1w = True - register_fs_to_qsirecon_wf = init_register_fs_to_qsirecon_wf( - use_qsirecon_reference_mask=False + has_qsiprep_t1w = True + register_fs_to_qsiprep_wf = init_register_fs_to_qsiprep_wf( + use_qsiprep_reference_mask=False ) workflow.connect([ (inputnode, fs_source, [("subject_id", "subject_id")]), - (inputnode, register_fs_to_qsirecon_wf, [ - ("dwi_ref", "inputnode.qsirecon_reference_image")]), - (fs_source, register_fs_to_qsirecon_wf, [ + (inputnode, register_fs_to_qsiprep_wf, [ + ("dwi_ref", "inputnode.qsiprep_reference_image")]), + (fs_source, register_fs_to_qsiprep_wf, [ (field, "inputnode." + field) for field in FS_FILES_TO_REGISTER]), - (register_fs_to_qsirecon_wf, buffernode, [ + (register_fs_to_qsiprep_wf, buffernode, [ ("outputnode.brain", "t1_preproc"), ("outputnode.aseg", "t1_brain_mask"), - ("outputnode.fs_to_qsirecon_transform_mrtrix", - "fs_to_qsirecon_transform_mrtrix"), - ("outputnode.fs_to_qsirecon_transform_itk", - "fs_to_qsirecon_transform_itk")] + [ + ("outputnode.fs_to_qsiprep_transform_mrtrix", + "fs_to_qsiprep_transform_mrtrix"), + ("outputnode.fs_to_qsiprep_transform_itk", + "fs_to_qsiprep_transform_itk")] + [ ("outputnode." + field, field) for field in FS_FILES_TO_REGISTER]), ]) # fmt:skip # Do we need to transform the 5tt hsvs from fsnative? - if "mrtrix_5tt_hsvs" in extras_to_make and not has_qsirecon_5tt_hsvs: + if "mrtrix_5tt_hsvs" in extras_to_make and not has_qsiprep_5tt_hsvs: # Transform the 5tt image so it's registered to the QSIRecon AC-PC T1w config.loggers.workflow.info( "HSVS 5tt imaged will be registered to the " "QSIRecon dwiref image." ) - _exchange_fields(["qsirecon_5tt_hsvs"]) + _exchange_fields(["qsiprep_5tt_hsvs"]) if not has_freesurfer_5tt_hsvs: raise Exception("The 5tt image in fsnative should have been created by now") apply_header_to_5tt_hsvs = pe.Node(TransformHeader(), name="apply_header_to_5tt_hsvs") - ds_qsirecon_5tt_hsvs = pe.Node( + ds_qsiprep_5tt_hsvs = pe.Node( ReconDerivativesDataSink( atlas="hsvs", suffix="dseg", qsirecon_suffix="anat", ), - name="ds_qsirecon_5tt_hsvs", + name="ds_qsiprep_5tt_hsvs", run_without_submitting=True, ) workflow.connect([ (inputnode, apply_header_to_5tt_hsvs, [("fs_5tt_hsvs", "in_image")]), (apply_header_to_5tt_hsvs, buffernode, [ - ("out_image", "qsirecon_5tt_hsvs")]), - (apply_header_to_5tt_hsvs, ds_qsirecon_5tt_hsvs, [("out_image", "in_file")]), + ("out_image", "qsiprep_5tt_hsvs")]), + (apply_header_to_5tt_hsvs, ds_qsiprep_5tt_hsvs, [("out_image", "in_file")]), ]) # fmt:skip desc += "A hybrid surface/volume segmentation was created [Smith 2020]." # If we have transforms to the template space, use them to get ROIs/atlases - # if not has_qsirecon_t1w_transforms and has_qsirecon_t1w: + # if not has_qsiprep_t1w_transforms and has_qsiprep_t1w: # desc += "In order to warp brain parcellations from template space into " \ # "alignment with the DWI data, the DWI-aligned FreeSurfer brain was " \ # "registered to template space. " - # # We now have qsirecon t1w and transforms!! - # has_qsirecon_t1w = has_qsirecon_t1w_transforms = True + # # We now have qsiprep t1w and transforms!! + # has_qsiprep_t1w = has_qsiprep_t1w_transforms = True # # Calculate the transforms here: - # has_qsirecon_t1w_transforms = True + # has_qsiprep_t1w_transforms = True # _exchange_fields(['t1_2_mni_forward_transform', 't1_2_mni_reverse_transform']) # t1_2_mni = pe.Node( # get_t1w_registration_node( @@ -646,7 +646,7 @@ def _get_status(): # Check the status of the T1wACPC-to-template transforms if needs_t1w_transform: - if has_qsirecon_t1w_transforms: + if has_qsiprep_t1w_transforms: config.loggers.workflow.info("Found T1w-to-template transforms from QSIRecon") desc += ( "T1w-based spatial normalization calculated during " @@ -661,7 +661,7 @@ def _get_status(): # Simply resample the T1w mask into the DWI resolution. This was the default # up to version 0.14.3 - if has_qsirecon_t1w and not prefer_dwi_mask: + if has_qsiprep_t1w and not prefer_dwi_mask: desc += "Brainmasks from {} were used in all " "subsequent reconstruction steps.".format( skull_strip_method ) @@ -680,7 +680,7 @@ def _get_status(): (resample_mask, buffernode, [("output_image", "dwi_mask")]) ]) # fmt:skip - if has_qsirecon_t1w_transforms: + if has_qsiprep_t1w_transforms: config.loggers.workflow.info("Transforming ODF ROIs into DWI space for visual report.") # Resample ROI targets to DWI resolution for ODF plotting crossing_rois_file = pkgrf("qsirecon", "data/crossing_rois.nii.gz") @@ -786,7 +786,7 @@ def _get_status(): workflow.connect( inputnode, 'dwi_file', workflow.get_node(node), 'source_file') # fmt:skip - if "mrtrix_5tt_hsv" in extras_to_make and not has_qsirecon_5tt_hsvs: + if "mrtrix_5tt_hsv" in extras_to_make and not has_qsiprep_5tt_hsvs: raise Exception("Unable to create a 5tt HSV image given input data.") # Directly connect anything from the inputs that we haven't created here diff --git a/qsirecon/workflows/recon/dipy.py b/qsirecon/workflows/recon/dipy.py index 65a3fa36..5abd3022 100644 --- a/qsirecon/workflows/recon/dipy.py +++ b/qsirecon/workflows/recon/dipy.py @@ -196,7 +196,7 @@ def init_dipy_brainsuite_shore_recon_wf( ]) # fmt:skip # Plot targeted regions - if available_anatomical_data["has_qsirecon_t1w_transforms"] and plot_reports: + if available_anatomical_data["has_qsiprep_t1w_transforms"] and plot_reports: ds_report_odfs = pe.Node( ReconDerivativesDataSink(extension=".png", desc="3dSHOREODF", suffix="odfs"), name="ds_report_odfs", @@ -481,7 +481,7 @@ def init_dipy_mapmri_recon_wf( ]) # fmt:skip # Plot targeted regions - if available_anatomical_data["has_qsirecon_t1w_transforms"] and plot_reports: + if available_anatomical_data["has_qsiprep_t1w_transforms"] and plot_reports: ds_report_odfs = pe.Node( ReconDerivativesDataSink(extension=".png", desc="MAPLMRIODF", suffix="odfs"), name="ds_report_odfs", diff --git a/qsirecon/workflows/recon/dsi_studio.py b/qsirecon/workflows/recon/dsi_studio.py index 7590565f..ec54a790 100644 --- a/qsirecon/workflows/recon/dsi_studio.py +++ b/qsirecon/workflows/recon/dsi_studio.py @@ -116,7 +116,7 @@ def init_dsi_studio_recon_wf( (plot_peaks, ds_report_peaks, [('peak_report', 'in_file')]) ]) # fmt:skip # Plot targeted regions - if available_anatomical_data["has_qsirecon_t1w_transforms"]: + if available_anatomical_data["has_qsiprep_t1w_transforms"]: ds_report_odfs = pe.Node( ReconDerivativesDataSink(extension=".png", desc="GQIODF", suffix="odfs"), name="ds_report_odfs", diff --git a/qsirecon/workflows/recon/mrtrix.py b/qsirecon/workflows/recon/mrtrix.py index 7afd1f2e..8b6497a1 100644 --- a/qsirecon/workflows/recon/mrtrix.py +++ b/qsirecon/workflows/recon/mrtrix.py @@ -58,7 +58,7 @@ def init_mrtrix_csd_recon_wf( *Default qsirecon inputs* - qsirecon_5tt_hsvs + qsiprep_5tt_hsvs A hybrid surface volume segmentation 5tt image aligned with the QSIRecon T1w @@ -170,7 +170,7 @@ def init_mrtrix_csd_recon_wf( if method_5tt == "hsvs": workflow.connect([ (inputnode, estimate_response, [ - ('qsirecon_5tt_hsvs', 'mtt_file')]) + ('qsiprep_5tt_hsvs', 'mtt_file')]) ]) # fmt:skip else: raise Exception("Unrecognized 5tt method: " + method_5tt) @@ -249,7 +249,7 @@ def init_mrtrix_csd_recon_wf( ]) # fmt:skip # Plot targeted regions - if available_anatomical_data["has_qsirecon_t1w_transforms"]: + if available_anatomical_data["has_qsiprep_t1w_transforms"]: ds_report_odfs = pe.Node( ReconDerivativesDataSink(extension=".png", desc="wmFOD", suffix="odfs"), name="ds_report_odfs", @@ -559,7 +559,7 @@ def init_mrtrix_tractography_wf( if use_5tt: if method_5tt == "hsvs": - connect_5tt = "qsirecon_5tt_hsvs" + connect_5tt = "qsiprep_5tt_hsvs" else: raise Exception("Unrecognized 5tt method: " + method_5tt) workflow.connect(inputnode, connect_5tt, diff --git a/qsirecon/workflows/reports.py b/qsirecon/workflows/reports.py new file mode 100644 index 00000000..2708a61c --- /dev/null +++ b/qsirecon/workflows/reports.py @@ -0,0 +1,148 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*- +# vi: set ft=python sts=4 ts=4 sw=4 et: +""" +qsirecon interactive report workflow +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. autofunction:: init_qsirecon_wf + +""" +import logging +from copy import deepcopy + +from nipype.interfaces import utility as niu +from nipype.pipeline import engine as pe +from niworkflows.engine.workflows import LiterateWorkflow as Workflow + +from .. import config +from ..interfaces import DerivativesDataSink +from ..interfaces.ingress import QsiReconDWIIngress +from ..interfaces.interchange import qsiprep_output_names, recon_workflow_input_fields +from ..interfaces.reports import InteractiveReport +from ..utils.bids import collect_data + +LOGGER = logging.getLogger("nipype.workflow") + + +def init_json_preproc_report_wf(subject_list): + """Create a json report for the dmriprep-viewer. + + .. workflow:: + :graph2use: orig + :simple_form: yes + + import os + from qsirecon.workflows.reports import init_json_preproc_report_wf + wf = init_json_preproc_report_wf( + subject_list=['qsirecontest'], + work_dir='.', + output_dir='.') + + + Parameters + ---------- + subject_list : list + List of subject labels + work_dir : str + Directory in which to store workflow execution state and temporary + files + output_dir : str + Directory in which to save derivatives + """ + work_dir = config.execution.work_dir + output_dir = config.execution.output_dir + + qsirecon_wf = Workflow(name="json_reports_wf") + qsirecon_wf.base_dir = work_dir + + for subject_id in subject_list: + single_subject_wf = init_single_subject_json_report_wf( + subject_id=subject_id, + name="single_subject_" + subject_id + "json_report_wf", + output_dir=output_dir, + ) + + for node in single_subject_wf._get_all_nodes(): + node.config = deepcopy(single_subject_wf.config) + qsirecon_wf.add_nodes([single_subject_wf]) + + return qsirecon_wf + + +def init_single_subject_json_report_wf(subject_id, name): + """ + This workflow examines the output of a qsirecon run and creates a json report for + dmriprep-viewer. These are very useful for batch QC-ing QSIRecon runs. + + .. workflow:: + :graph2use: orig + :simple_form: yes + + from qsirecon.workflows.reports import init_single_subject_json_report_wf + + wf = init_single_subject_json_report_wf( + subject_id='test', + name='single_subject_qsirecontest_wf', + reportlets_dir='.', + output_dir='.') + + Parameters + + subject_id : str + List of subject labels + name : str + Name of workflow + output_dir : str + Directory in which to read and save derivatives + + """ + output_dir = config.execution.output_dir + if name in ("single_subject_wf", "single_subject_qsirecontest_wf"): + # for documentation purposes + subject_data = { + "t1w": ["/completely/made/up/path/sub-01_T1w.nii.gz"], + "dwi": ["/completely/made/up/path/sub-01_dwi.nii.gz"], + } + layout = None + LOGGER.warning("Building a test workflow") + else: + subject_data, layout = collect_data(output_dir, subject_id, bids_validate=False) + dwi_files = subject_data["dwi"] + workflow = Workflow(name=name) + scans_iter = pe.Node(niu.IdentityInterface(fields=["dwi_file"]), name="scans_iter") + scans_iter.iterables = ("dwi_file", dwi_files) + inputnode = pe.Node( + niu.IdentityInterface(fields=recon_workflow_input_fields), name="inputnode" + ) + qsirecon_preprocessed_dwi_data = pe.Node( + QsiReconDWIIngress(), name="qsirecon_preprocessed_dwi_data" + ) + + # For doctests + if not name == "fake": + scans_iter.inputs.dwi_file = dwi_files + + interactive_report = pe.Node(InteractiveReport(), name="interactive_report") + + ds_report_json = pe.Node( + DerivativesDataSink(base_directory=output_dir, suffix="viewer"), + name="ds_report_json", + run_without_submitting=True, + ) + + # Connect the collected diffusion data (gradients, etc) to the inputnode + workflow.connect([ + (scans_iter, qsirecon_preprocessed_dwi_data, ([('dwi_file', 'dwi_file')])), + (qsirecon_preprocessed_dwi_data, inputnode, [ + (trait, trait) for trait in qsiprep_output_names]), + (inputnode, interactive_report, [ + ('dwi_file', 'processed_dwi_file'), + ('confounds_file', 'confounds_file'), + ('qc_file', 'qc_file'), + ('mask_file', 'mask_file')]), + (interactive_report, ds_report_json, [('out_report', 'in_file')]) + ]) # fmt:skip + + return workflow diff --git a/tests/get_data.py b/tests/get_data.py index b42b15f8..8dfab30d 100644 --- a/tests/get_data.py +++ b/tests/get_data.py @@ -80,7 +80,6 @@ def get_default_cli_args(): use_syn_sdc=False, force_syn=False, verbose_count=2, - recon_input=None, recon_spec=None, use_plugin=None, nthreads=1, diff --git a/tests/opts_tests.py b/tests/opts_tests.py index 0dab1bdf..c46e549d 100644 --- a/tests/opts_tests.py +++ b/tests/opts_tests.py @@ -1,6 +1,6 @@ import pytest import os -from qsirecon.cli.run import set_freesurfer_license, validate_bids, get_parser +from qsirecon.cli.run import set_freesurfer_license, get_parser base_args = "bids out participant --output_resolution 2.3" @@ -24,15 +24,6 @@ def test_required(): assert pa_fail.value.code == 2 -def test_required_recononly(monkeypatch): - # dont need output_resolution if we have recon_only - base_args = "bids out participant --recon_only" - args = base_args.split(' ') - # sys.argv used to set if output-res required - monkeypatch.setattr('qsirecon.cli.run.sys.argv', args) - get_parser().parse_args(args) - - def test_set_freesurfer_license(tmpdir): """test setting, precedence, and error if DNE""" # create temp file @@ -65,16 +56,3 @@ def test_set_freesurfer_license(tmpdir): opts = get_parser().parse_args(fsarg.split(' ')) set_freesurfer_license(opts) assert os.getenv('FS_LICENSE') == f'{lic3}' - - -@pytest.mark.parametrize("will_validate,opts_str", ( - (True, base_args), # run if base args - (False, base_args + " --skip_bids_validation"), # not if skipped - (False, base_args + " --recon-only"), # or recon all - (False, base_args + " --skip_bids_validation --recon-only") # or both -)) -def test_validate_bids(monkeypatch, opts_str, will_validate): - # from ..utils.bids import validate_input_dir - monkeypatch.setattr("qsirecon.utils.bids.validate_input_dir", lambda *kargs: True) - opts = get_parser().parse_args(opts_str.split(' ')) - assert will_validate == validate_bids(opts) diff --git a/wrapper/qsirecon_container/qsiprep_docker.py b/wrapper/qsirecon_container/qsiprep_docker.py index 1e6b92d6..7062a222 100644 --- a/wrapper/qsirecon_container/qsiprep_docker.py +++ b/wrapper/qsirecon_container/qsiprep_docker.py @@ -233,10 +233,6 @@ def get_parser(): "analysis_level", nargs="?", choices=["participant"], default="participant" ) - # For qsirecon - parser.add_argument( - "--recon-input", "--recon_input", required=False, action="store", type=os.path.abspath - ) # For eddy parser.add_argument( "--eddy-config", "--eddy_config", required=False, action="store", type=os.path.abspath @@ -430,9 +426,6 @@ def main(): main_args = ["/data", "/out", opts.analysis_level] if opts.bids_dir: command.extend(["-v", ":".join((opts.bids_dir, "/data", "ro"))]) - if opts.recon_input: - command.extend(["-v", ":".join((opts.recon_input, "/qsirecon-output", "ro"))]) - main_args.extend(["--recon-input", "/qsirecon-output"]) if opts.freesurfer_input: command.extend(["-v", ":".join((opts.freesurfer_input, "/sngl/freesurfer-input", "ro"))]) main_args.extend(["--freesurfer-input", "/sngl/freesurfer-input"]) diff --git a/wrapper/qsirecon_container/qsiprep_singularity.py b/wrapper/qsirecon_container/qsiprep_singularity.py index 536fe2dd..6bd8d3e1 100644 --- a/wrapper/qsirecon_container/qsiprep_singularity.py +++ b/wrapper/qsirecon_container/qsiprep_singularity.py @@ -216,10 +216,6 @@ def get_parser(): "analysis_level", nargs="?", choices=["participant"], default="participant" ) - # For qsirecon - parser.add_argument( - "--recon-input", "--recon_input", required=False, action="store", type=os.path.abspath - ) parser.add_argument( "--bids-filter-file", "--bids_filter_file", @@ -411,9 +407,6 @@ def main(): main_args.extend(["--fs-license-file", mounted_license]) if opts.bids_dir: command.extend(["-B", ":".join((opts.bids_dir, "/sngl/data"))]) - if opts.recon_input: - command.extend(["-B", ":".join((opts.recon_input, "/sngl/qsirecon-output"))]) - main_args.extend(["--recon-input", "/sngl/qsirecon-output"]) if opts.recon_spec: if os.path.exists(opts.recon_spec): spec_dir, spec_fname = op.split(opts.recon_spec)