From e779d08b7c464fdbe1ee6fed7b200a7bb4793f03 Mon Sep 17 00:00:00 2001 From: Anthony Gagnon Date: Sat, 28 Dec 2024 03:00:10 +0000 Subject: [PATCH] added test with multiple subjects + update more modules with patch files. --- .github/workflows/ci.yml | 1 + modules.json | 171 +++++-- .../betcrop/synthbet/betcrop-synthbet.diff | 35 +- modules/nf-neuro/betcrop/synthbet/main.nf | 9 +- modules/nf-neuro/preproc/eddy/main.nf | 30 +- .../nf-neuro/preproc/eddy/preproc-eddy.diff | 22 +- .../nf-neuro/preproc/eddy/tests/main.nf.test | 30 ++ .../preproc/eddy/tests/main.nf.test.snap | 12 + modules/nf-neuro/preproc/topup/main.nf | 21 +- .../nf-neuro/preproc/topup/preproc-topup.diff | 25 +- .../nf-neuro/preproc/topup/tests/main.nf.test | 28 ++ .../preproc/topup/tests/main.nf.test.snap | 12 + .../nf-core/utils_nfcore_pipeline/main.nf | 28 +- .../tests/main.function.nf.test | 44 ++ .../nf-neuro/preproc_dwi/preproc_dwi.diff | 84 ++-- .../nf-neuro/preproc_t1/preproc_t1.diff | 25 + tests/data/samplesheet_multisubject.csv | 3 + .../data/samplesheet_multisubject_infant.csv | 3 + tests/multisubjects.nf.test | 82 ++++ tests/multisubjects.nf.test.snap | 442 ++++++++++++++++++ 20 files changed, 955 insertions(+), 152 deletions(-) create mode 100644 subworkflows/nf-neuro/preproc_t1/preproc_t1.diff create mode 100644 tests/data/samplesheet_multisubject.csv create mode 100644 tests/data/samplesheet_multisubject_infant.csv create mode 100644 tests/multisubjects.nf.test create mode 100644 tests/multisubjects.nf.test.snap diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 231632e..04f832a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -40,6 +40,7 @@ jobs: - "connectomics.nf.test" - "tracking.nf.test" - "freesurfer.nf.test" + - "multisubjects.nf.test" isMaster: - ${{ github.base_ref == 'master' }} # Exclude conda and singularity on dev diff --git a/modules.json b/modules.json index 6829e0a..d568e3e 100644 --- a/modules.json +++ b/modules.json @@ -8,7 +8,9 @@ "multiqc": { "branch": "master", "git_sha": "cf17ca47590cc578dfb47db1c2a44ef86f89976d", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/multiqc/multiqc.diff" } } @@ -18,17 +20,23 @@ "utils_nextflow_pipeline": { "branch": "master", "git_sha": "c2b22d85f30a706a3073387f30380704fcae013b", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nfcore_pipeline": { "branch": "master", - "git_sha": "d588e574e40a8aeba3636e2b766358091bfa3aa0", - "installed_by": ["subworkflows"] + "git_sha": "51ae5406a030d4da1e49e4dab49756844fdd6c7a", + "installed_by": [ + "subworkflows" + ] }, "utils_nfschema_plugin": { "branch": "master", "git_sha": "2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] } } } @@ -39,161 +47,227 @@ "betcrop/antsbet": { "branch": "main", "git_sha": "e97572d08357c6b3eb22e96b5adbb660d64f18e3", - "installed_by": ["preproc_dwi", "preproc_t1"], + "installed_by": [ + "preproc_dwi", + "preproc_t1" + ], "patch": "modules/nf-neuro/betcrop/antsbet/betcrop-antsbet.diff" }, "betcrop/cropvolume": { "branch": "main", "git_sha": "9f12f6cb6245d1cb633ccdc11593524a5befc0dc", - "installed_by": ["preproc_dwi", "preproc_t1"] + "installed_by": [ + "preproc_dwi", + "preproc_t1" + ] }, "betcrop/fslbetcrop": { "branch": "main", "git_sha": "d51aa53995a45009b8e077cfc41c7335a87ae1db", - "installed_by": ["preproc_dwi"], + "installed_by": [ + "preproc_dwi" + ], "patch": "modules/nf-neuro/betcrop/fslbetcrop/betcrop-fslbetcrop.diff" }, "betcrop/synthbet": { "branch": "main", "git_sha": "dca20370d97a69c6a91c80843f417206212568e6", - "installed_by": ["preproc_dwi", "preproc_t1"], + "installed_by": [ + "preproc_dwi", + "preproc_t1" + ], "patch": "modules/nf-neuro/betcrop/synthbet/betcrop-synthbet.diff" }, "denoising/mppca": { "branch": "main", "git_sha": "2e222d18c89e5547a6bf5c0c74673baeb63bcd52", - "installed_by": ["preproc_dwi"] + "installed_by": [ + "preproc_dwi" + ] }, "denoising/nlmeans": { "branch": "main", "git_sha": "261a7e0606645eeaf863e401cb9fc99c130b3a19", - "installed_by": ["preproc_t1"] + "installed_by": [ + "preproc_t1" + ] }, "image/applymask": { "branch": "main", "git_sha": "384d444c001f9cfb23432cb03d94fa03cdc2c24a", - "installed_by": ["preproc_dwi"] + "installed_by": [ + "preproc_dwi" + ] }, "image/convert": { "branch": "main", "git_sha": "b610d377e095aa88ab73d1ceaa90e94162cea153", - "installed_by": ["preproc_dwi"] + "installed_by": [ + "preproc_dwi" + ] }, "image/powderaverage": { "branch": "main", "git_sha": "9146c628d9a47e36deb507ae026c96877b9db436", - "installed_by": ["preproc_dwi"] + "installed_by": [ + "preproc_dwi" + ] }, "image/resample": { "branch": "main", "git_sha": "36e010a236a0bd86334ab99b0cac4f7c4ff51532", - "installed_by": ["preproc_dwi", "preproc_t1"] + "installed_by": [ + "preproc_dwi", + "preproc_t1" + ] }, "preproc/eddy": { "branch": "main", - "git_sha": "03e403148bdaadc6a537277b30a59adc6ac9cd21", - "installed_by": ["topup_eddy"], + "git_sha": "7b8fb95e764e220967c4ae2414184c4f9dad5aaa", + "installed_by": [ + "topup_eddy" + ], "patch": "modules/nf-neuro/preproc/eddy/preproc-eddy.diff" }, "preproc/n4": { "branch": "main", "git_sha": "18273a2cef9ffdaf7088e305b9c4ebf4dd439079", - "installed_by": ["preproc_dwi", "preproc_t1"] + "installed_by": [ + "preproc_dwi", + "preproc_t1" + ] }, "preproc/normalize": { "branch": "main", "git_sha": "d367837de6a230f133549831b7199789b592d33e", - "installed_by": ["preproc_dwi"] + "installed_by": [ + "preproc_dwi" + ] }, "preproc/topup": { "branch": "main", - "git_sha": "baf69f6658ab3874264d2081aeb5a2388f861bb2", - "installed_by": ["topup_eddy"], + "git_sha": "7b8fb95e764e220967c4ae2414184c4f9dad5aaa", + "installed_by": [ + "topup_eddy" + ], "patch": "modules/nf-neuro/preproc/topup/preproc-topup.diff" }, "reconst/dtimetrics": { "branch": "main", "git_sha": "072538948dd406f6a88cdcf456dc3b132b66e5b6", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "reconst/fodf": { "branch": "main", "git_sha": "c2980ddb3d3d0be27b36f06282360728fbb63d42", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "reconst/frf": { "branch": "main", "git_sha": "0bf60b4365fa8e0605436114caf380dac9ee38b8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "reconst/meanfrf": { "branch": "main", "git_sha": "d22a074b33a7672ba7aa473fe93db07468fb50b5", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "registration/anattodwi": { "branch": "main", "git_sha": "18b6dda83876e34717c48a60ff87249357c49a06", - "installed_by": ["registration"] + "installed_by": [ + "registration" + ] }, "registration/ants": { "branch": "main", "git_sha": "43ec7aa8c9b19bcb2fde3999e9bb71e674130d5d", - "installed_by": ["registration"] + "installed_by": [ + "registration" + ] }, "registration/antsapplytransforms": { "branch": "main", "git_sha": "89c21b369e7e48b4ae1549e68c7977d405cf837b", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "registration/easyreg": { "branch": "main", "git_sha": "47cd7af16914614d41cee6099aa994d04a6f8380", - "installed_by": ["registration"] + "installed_by": [ + "registration" + ] }, "segmentation/fastseg": { "branch": "main", "git_sha": "072538948dd406f6a88cdcf456dc3b132b66e5b6", - "installed_by": ["anatomical_segmentation"], + "installed_by": [ + "anatomical_segmentation" + ], "patch": "modules/nf-neuro/segmentation/fastseg/segmentation-fastseg.diff" }, "segmentation/fastsurfer": { "branch": "main", "git_sha": "072538948dd406f6a88cdcf456dc3b132b66e5b6", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-neuro/segmentation/fastsurfer/segmentation-fastsurfer.diff" }, "segmentation/freesurferseg": { "branch": "main", "git_sha": "72c629dd20bf72ae4c580717123ff57516d24f3d", - "installed_by": ["anatomical_segmentation"] + "installed_by": [ + "anatomical_segmentation" + ] }, "segmentation/fsreconall": { "branch": "main", "git_sha": "72c629dd20bf72ae4c580717123ff57516d24f3d", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-neuro/segmentation/fsreconall/segmentation-fsreconall.diff" }, "segmentation/synthseg": { "branch": "main", "git_sha": "b041bd20d966f5e87bb528f500ccd3cfb1245f3d", - "installed_by": ["anatomical_segmentation"] + "installed_by": [ + "anatomical_segmentation" + ] }, "tracking/localtracking": { "branch": "main", "git_sha": "162124f316f48c93ca2c2649c756da382c73a806", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "tracking/pfttracking": { "branch": "main", "git_sha": "162124f316f48c93ca2c2649c756da382c73a806", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-neuro/tracking/pfttracking/tracking-pfttracking.diff" }, "utils/extractb0": { "branch": "main", "git_sha": "baf69f6658ab3874264d2081aeb5a2388f861bb2", - "installed_by": ["preproc_dwi", "topup_eddy"], + "installed_by": [ + "preproc_dwi", + "topup_eddy" + ], "patch": "modules/nf-neuro/utils/extractb0/utils-extractb0.diff" } } @@ -203,31 +277,42 @@ "anatomical_segmentation": { "branch": "main", "git_sha": "72c629dd20bf72ae4c580717123ff57516d24f3d", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "preproc_dwi": { "branch": "main", "git_sha": "2e222d18c89e5547a6bf5c0c74673baeb63bcd52", - "installed_by": ["subworkflows"], + "installed_by": [ + "subworkflows" + ], "patch": "subworkflows/nf-neuro/preproc_dwi/preproc_dwi.diff" }, "preproc_t1": { "branch": "main", "git_sha": "e373a0b34ed9ee306b91a618a4dc75df7c226cc3", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ], + "patch": "subworkflows/nf-neuro/preproc_t1/preproc_t1.diff" }, "registration": { "branch": "main", "git_sha": "f03a3543def8882203ae21c96cb64fa0176a8161", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "topup_eddy": { "branch": "main", "git_sha": "e088076166c27704c22be0c45f03bc727d1f1d7d", - "installed_by": ["preproc_dwi"] + "installed_by": [ + "preproc_dwi" + ] } } } } } -} +} \ No newline at end of file diff --git a/modules/nf-neuro/betcrop/synthbet/betcrop-synthbet.diff b/modules/nf-neuro/betcrop/synthbet/betcrop-synthbet.diff index 74d4be2..61b8ddf 100644 --- a/modules/nf-neuro/betcrop/synthbet/betcrop-synthbet.diff +++ b/modules/nf-neuro/betcrop/synthbet/betcrop-synthbet.diff @@ -1,18 +1,39 @@ -Changes in module 'nf-neuro/betcrop/synthbet' +Changes in component 'nf-neuro/betcrop/synthbet' 'modules/nf-neuro/betcrop/synthbet/environment.yml' is unchanged 'modules/nf-neuro/betcrop/synthbet/meta.yml' is unchanged Changes in 'betcrop/synthbet/main.nf': --- modules/nf-neuro/betcrop/synthbet/main.nf +++ modules/nf-neuro/betcrop/synthbet/main.nf -@@ -40,7 +40,7 @@ - def prefix = task.ext.prefix ?: "${meta.id}" +@@ -2,7 +2,10 @@ + tag "$meta.id" + label 'process_single' +- container "freesurfer/freesurfer:7.4.1" ++ container "freesurfer/synthstrip:1.5" ++ containerOptions { ++ (workflow.containerEngine == 'docker') ? '--entrypoint ""': '' ++ } + + input: + tuple val(meta), path(image), path(weights) /* optional, input = [] */ +@@ -32,7 +35,7 @@ + + cat <<-END_VERSIONS > versions.yml + "${task.process}": +- Freesurfer: \$(mri_convert -version | grep "freesurfer" | sed -E 's/.* ([0-9]+\\.[0-9]+\\.[0-9]+).*/\\1/') ++ synthstrip: 1.5 + END_VERSIONS """ -- mri_synthstrip -h -+ #mri_synthstrip -h - touch ${prefix}__bet_image.nii.gz - touch ${prefix}__brain_mask.nii.gz +@@ -45,7 +48,7 @@ + + cat <<-END_VERSIONS > versions.yml + "${task.process}": +- Freesurfer: \$(mri_convert -version | grep "freesurfer" | sed -E 's/.* ([0-9]+\\.[0-9]+\\.[0-9]+).*/\\1/') ++ synthstrip: 1.5 + END_VERSIONS + + function handle_code () { 'modules/nf-neuro/betcrop/synthbet/tests/main.nf.test.snap' is unchanged 'modules/nf-neuro/betcrop/synthbet/tests/tags.yml' is unchanged diff --git a/modules/nf-neuro/betcrop/synthbet/main.nf b/modules/nf-neuro/betcrop/synthbet/main.nf index cbbedde..a9ce3a3 100644 --- a/modules/nf-neuro/betcrop/synthbet/main.nf +++ b/modules/nf-neuro/betcrop/synthbet/main.nf @@ -2,7 +2,10 @@ process BETCROP_SYNTHBET { tag "$meta.id" label 'process_single' - container "freesurfer/freesurfer:7.4.1" + container "freesurfer/synthstrip:1.5" + containerOptions { + (workflow.containerEngine == 'docker') ? '--entrypoint ""': '' + } input: tuple val(meta), path(image), path(weights) /* optional, input = [] */ @@ -32,7 +35,7 @@ process BETCROP_SYNTHBET { cat <<-END_VERSIONS > versions.yml "${task.process}": - Freesurfer: \$(mri_convert -version | grep "freesurfer" | sed -E 's/.* ([0-9]+\\.[0-9]+\\.[0-9]+).*/\\1/') + synthstrip: 1.5 END_VERSIONS """ @@ -45,7 +48,7 @@ process BETCROP_SYNTHBET { cat <<-END_VERSIONS > versions.yml "${task.process}": - Freesurfer: \$(mri_convert -version | grep "freesurfer" | sed -E 's/.* ([0-9]+\\.[0-9]+\\.[0-9]+).*/\\1/') + synthstrip: 1.5 END_VERSIONS function handle_code () { diff --git a/modules/nf-neuro/preproc/eddy/main.nf b/modules/nf-neuro/preproc/eddy/main.nf index fdf8864..9e6eda0 100644 --- a/modules/nf-neuro/preproc/eddy/main.nf +++ b/modules/nf-neuro/preproc/eddy/main.nf @@ -114,32 +114,36 @@ process PREPROC_EDDY { """ stub: - def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" """ - scil_volume_math.py -h - #maskfilter -h - #bet -h - scil_dwi_extract_b0.py -h - scil_gradients_validate_correct_eddy.py -h - scil_dwi_concatenate.py -h - mrconvert -h - scil_dwi_prepare_eddy_command.py -h - scil_header_print_info.py -h - touch ${prefix}__dwi_corrected.nii.gz touch ${prefix}__dwi_eddy_corrected.bval touch ${prefix}__dwi_eddy_corrected.bvec touch ${prefix}__b0_bet_mask.nii.gz - cat <<-END_VERSIONS > versions.yml "${task.process}": scilpy: \$(pip list | grep scilpy | tr -s ' ' | cut -d' ' -f2) mrtrix: \$(dwidenoise -version 2>&1 | sed -n 's/== dwidenoise \\([0-9.]\\+\\).*/\\1/p') fsl: \$(flirt -version 2>&1 | sed -n 's/FLIRT version \\([0-9.]\\+\\)/\\1/p') - END_VERSIONS + + function handle_code () { + local code=\$? + ignore=( 1 ) + exit \$([[ " \${ignore[@]} " =~ " \$code " ]] && echo 0 || echo \$code) + } + trap 'handle_code' ERR + + scil_volume_math.py -h + maskfilter -h + bet -h + scil_dwi_extract_b0.py -h + scil_gradients_validate_correct_eddy.py -h + scil_dwi_concatenate.py -h + mrconvert -h + scil_dwi_prepare_eddy_command.py -h + scil_header_print_info.py -h """ } diff --git a/modules/nf-neuro/preproc/eddy/preproc-eddy.diff b/modules/nf-neuro/preproc/eddy/preproc-eddy.diff index 9f1a0a1..8610a4a 100644 --- a/modules/nf-neuro/preproc/eddy/preproc-eddy.diff +++ b/modules/nf-neuro/preproc/eddy/preproc-eddy.diff @@ -1,20 +1,20 @@ -Changes in module 'nf-neuro/preproc/eddy' +Changes in component 'nf-neuro/preproc/eddy' 'modules/nf-neuro/preproc/eddy/environment.yml' is unchanged 'modules/nf-neuro/preproc/eddy/meta.yml' is unchanged Changes in 'preproc/eddy/main.nf': --- modules/nf-neuro/preproc/eddy/main.nf +++ modules/nf-neuro/preproc/eddy/main.nf -@@ -119,8 +119,8 @@ +@@ -3,8 +3,8 @@ + label 'process_high' - """ - scil_volume_math.py -h -- maskfilter -h -- bet -h -+ #maskfilter -h -+ #bet -h - scil_dwi_extract_b0.py -h - scil_gradients_validate_correct_eddy.py -h - scil_dwi_concatenate.py -h + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? +- "https://scil.usherbrooke.ca/containers/scilus_2.0.2.sif": +- "scilus/scilus:2.0.2"}" ++ 'https://scil.usherbrooke.ca/containers/scilus_2.0.2.sif': ++ 'scilus/scilus:2.0.2' }" + + input: + tuple val(meta), path(dwi), path(bval), path(bvec), path(rev_dwi), path(rev_bval), path(rev_bvec), path(corrected_b0s), path(topup_fieldcoef), path(topup_movpart) 'modules/nf-neuro/preproc/eddy/tests/main.nf.test.snap' is unchanged 'modules/nf-neuro/preproc/eddy/tests/tags.yml' is unchanged diff --git a/modules/nf-neuro/preproc/eddy/tests/main.nf.test b/modules/nf-neuro/preproc/eddy/tests/main.nf.test index bfe7eb1..bc5d31a 100644 --- a/modules/nf-neuro/preproc/eddy/tests/main.nf.test +++ b/modules/nf-neuro/preproc/eddy/tests/main.nf.test @@ -93,4 +93,34 @@ nextflow_process { ) } } + + test("eddy - stub-run") { + options "-stub-run" + when { + process { + """ + input[0] = LOAD_DATA.out.test_data_directory + .map{ test_data_directory -> [ + [ id:'test', single_end:false ], // meta map + file("\${test_data_directory}/sub-01_dir-AP_dwi.nii.gz", checkIfExists: true), + file("\${test_data_directory}/sub-01_dir-AP_dwi.bval", checkIfExists: true), + file("\${test_data_directory}/sub-01_dir-AP_dwi.bvec", checkIfExists: true), + file("\${test_data_directory}/sub-01_dir-PA_dwi.nii.gz", checkIfExists: true), + file("\${test_data_directory}/sub-01_dir-PA_dwi.bval", checkIfExists: true), + file("\${test_data_directory}/sub-01_dir-PA_dwi.bvec", checkIfExists: true), + file("\${test_data_directory}/sub-01__corrected_b0s.nii.gz", checkIfExists: true), + file("\${test_data_directory}/topup_results_fieldcoef.nii.gz", checkIfExists: true), + file("\${test_data_directory}/topup_results_movpar.txt", checkIfExists: true) + ] + } + """ + } + } + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.versions).match() } + ) + } + } } diff --git a/modules/nf-neuro/preproc/eddy/tests/main.nf.test.snap b/modules/nf-neuro/preproc/eddy/tests/main.nf.test.snap index 239baba..617a401 100644 --- a/modules/nf-neuro/preproc/eddy/tests/main.nf.test.snap +++ b/modules/nf-neuro/preproc/eddy/tests/main.nf.test.snap @@ -62,5 +62,17 @@ "nextflow": "24.04.4" }, "timestamp": "2024-11-21T19:53:14.315721034" + }, + "eddy - stub-run": { + "content": [ + [ + "versions.yml:md5,137e3ce0fd25e5b16de2d8cc5a5aefca" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.10.1" + }, + "timestamp": "2024-12-12T12:50:30.654366" } } \ No newline at end of file diff --git a/modules/nf-neuro/preproc/topup/main.nf b/modules/nf-neuro/preproc/topup/main.nf index d63d2d6..0f94acd 100644 --- a/modules/nf-neuro/preproc/topup/main.nf +++ b/modules/nf-neuro/preproc/topup/main.nf @@ -8,7 +8,7 @@ process PREPROC_TOPUP { input: tuple val(meta), path(dwi), path(bval), path(bvec), path(b0), path(rev_dwi), path(rev_bval), path(rev_bvec), path(rev_b0) - val(config_topup) + each config_topup output: tuple val(meta), path("*__corrected_b0s.nii.gz"), emit: topup_corrected_b0s @@ -73,16 +73,10 @@ process PREPROC_TOPUP { """ stub: - def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def prefix_topup = task.ext.prefix_topup ? task.ext.prefix_topup : "" """ - scil_volume_math.py -h - scil_dwi_extract_b0.py -h - #antsRegistrationSyNQuick.sh - scil_dwi_prepare_topup_command.py -h - touch ${prefix}__corrected_b0s.nii.gz touch ${prefix}__rev_b0_warped.nii.gz touch ${prefix}__rev_b0_mean.nii.gz @@ -95,7 +89,18 @@ process PREPROC_TOPUP { scilpy: \$(pip list | grep scilpy | tr -s ' ' | cut -d' ' -f2) antsRegistration: \$(antsRegistration --version | grep "Version" | sed -E 's/.*v([0-9]+\\+\\).*/\\1/') fsl: \$(flirt -version 2>&1 | sed -n 's/FLIRT version \\([0-9.]\\+\\)/\\1/p') - END_VERSIONS + + function handle_code () { + local code=\$? + ignore=( 1 ) + exit \$([[ " \${ignore[@]} " =~ " \$code " ]] && echo 0 || echo \$code) + } + trap 'handle_code' ERR + + scil_volume_math.py -h + scil_dwi_extract_b0.py -h + antsRegistrationSyNQuick.sh + scil_dwi_prepare_topup_command.py -h """ } diff --git a/modules/nf-neuro/preproc/topup/preproc-topup.diff b/modules/nf-neuro/preproc/topup/preproc-topup.diff index dac5f02..1af023f 100644 --- a/modules/nf-neuro/preproc/topup/preproc-topup.diff +++ b/modules/nf-neuro/preproc/topup/preproc-topup.diff @@ -1,18 +1,25 @@ -Changes in module 'nf-neuro/preproc/topup' +Changes in component 'nf-neuro/preproc/topup' 'modules/nf-neuro/preproc/topup/environment.yml' is unchanged 'modules/nf-neuro/preproc/topup/meta.yml' is unchanged Changes in 'preproc/topup/main.nf': --- modules/nf-neuro/preproc/topup/main.nf +++ modules/nf-neuro/preproc/topup/main.nf -@@ -80,7 +80,7 @@ - """ - scil_volume_math.py -h - scil_dwi_extract_b0.py -h -- antsRegistrationSyNQuick.sh -h -+ #antsRegistrationSyNQuick.sh - scil_dwi_prepare_topup_command.py -h +@@ -3,12 +3,12 @@ + label 'process_single' - touch ${prefix}__corrected_b0s.nii.gz + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? +- "https://scil.usherbrooke.ca/containers/scilus_2.0.2.sif": +- "scilus/scilus:2.0.2"}" ++ 'https://scil.usherbrooke.ca/containers/scilus_2.0.2.sif': ++ 'scilus/scilus:2.0.2' }" + + input: + tuple val(meta), path(dwi), path(bval), path(bvec), path(b0), path(rev_dwi), path(rev_bval), path(rev_bvec), path(rev_b0) +- val(config_topup) ++ each config_topup + + output: + tuple val(meta), path("*__corrected_b0s.nii.gz"), emit: topup_corrected_b0s 'modules/nf-neuro/preproc/topup/tests/main.nf.test.snap' is unchanged 'modules/nf-neuro/preproc/topup/tests/tags.yml' is unchanged diff --git a/modules/nf-neuro/preproc/topup/tests/main.nf.test b/modules/nf-neuro/preproc/topup/tests/main.nf.test index f404355..146ceb9 100644 --- a/modules/nf-neuro/preproc/topup/tests/main.nf.test +++ b/modules/nf-neuro/preproc/topup/tests/main.nf.test @@ -95,4 +95,32 @@ nextflow_process { ) } } + + test("topup - stub-run") { + options "-stub-run" + when { + process { + """ + input[0] = LOAD_DATA.out.test_data_directory + .map{ test_data_directory -> [ + [ id:'test', single_end:false ], // meta map + file("\${test_data_directory}/sub-01_dir-AP_dwi.nii.gz", checkIfExists: true), + file("\${test_data_directory}/sub-01_dir-AP_dwi.bval", checkIfExists: true), + file("\${test_data_directory}/sub-01_dir-AP_dwi.bvec", checkIfExists: true), + file("\${test_data_directory}/sub-01_dir-AP_sbref.nii.gz", checkIfExists: true), + file("\${test_data_directory}/sub-01_dir-PA_dwi.nii.gz", checkIfExists: true), + file("\${test_data_directory}/sub-01_dir-PA_dwi.bval", checkIfExists: true), + file("\${test_data_directory}/sub-01_dir-PA_dwi.bvec", checkIfExists: true), + file("\${test_data_directory}/sub-01_dir-PA_sbref.nii.gz", checkIfExists: true)]} + input[1] = [] + """ + } + } + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.versions).match() } + ) + } + } } diff --git a/modules/nf-neuro/preproc/topup/tests/main.nf.test.snap b/modules/nf-neuro/preproc/topup/tests/main.nf.test.snap index efe2084..171632b 100644 --- a/modules/nf-neuro/preproc/topup/tests/main.nf.test.snap +++ b/modules/nf-neuro/preproc/topup/tests/main.nf.test.snap @@ -33,6 +33,18 @@ }, "timestamp": "2024-11-01T16:21:18.752887499" }, + "topup - stub-run": { + "content": [ + [ + "versions.yml:md5,1e46217f093e27a6a26cd479f074296b" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.10.1" + }, + "timestamp": "2024-12-12T11:56:01.860981" + }, "topup_light": { "content": [ "test__corrected_b0s.nii.gz", diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf index c2926b4..bfd2587 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf +++ b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf @@ -206,22 +206,20 @@ def logColours(monochrome_logs=true) { // Return a single report from an object that may be a Path or List // def getSingleReport(multiqc_reports) { - switch (multiqc_reports) { - case Path: - return multiqc_reports - case List: - switch (multiqc_reports.size()) { - case 0: - log.warn("[${workflow.manifest.name}] No reports found from process 'MULTIQC'") - return null - case 1: - return multiqc_reports.first() - default: - log.warn("[${workflow.manifest.name}] Found multiple reports from process 'MULTIQC', will use only one") - return multiqc_reports.first() - } - default: + if (multiqc_reports instanceof Path) { + return multiqc_reports + } else if (multiqc_reports instanceof List) { + if (multiqc_reports.size() == 0) { + log.warn("[${workflow.manifest.name}] No reports found from process 'MULTIQC'") return null + } else if (multiqc_reports.size() == 1) { + return multiqc_reports.first() + } else { + log.warn("[${workflow.manifest.name}] Found multiple reports from process 'MULTIQC', will use only one") + return multiqc_reports.first() + } + } else { + return null } } diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test index e43d208..f117040 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test +++ b/subworkflows/nf-core/utils_nfcore_pipeline/tests/main.function.nf.test @@ -79,4 +79,48 @@ nextflow_function { ) } } + + test("Test Function getSingleReport with a single file") { + function "getSingleReport" + + when { + function { + """ + input[0] = file(params.modules_testdata_base_path + '/generic/tsv/test.tsv', checkIfExists: true) + """ + } + } + + then { + assertAll( + { assert function.success }, + { assert function.result.contains("test.tsv") } + ) + } + } + + test("Test Function getSingleReport with multiple files") { + function "getSingleReport" + + when { + function { + """ + input[0] = [ + file(params.modules_testdata_base_path + '/generic/tsv/test.tsv', checkIfExists: true), + file(params.modules_testdata_base_path + '/generic/tsv/network.tsv', checkIfExists: true), + file(params.modules_testdata_base_path + '/generic/tsv/expression.tsv', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert function.success }, + { assert function.result.contains("test.tsv") }, + { assert !function.result.contains("network.tsv") }, + { assert !function.result.contains("expression.tsv") } + ) + } + } } diff --git a/subworkflows/nf-neuro/preproc_dwi/preproc_dwi.diff b/subworkflows/nf-neuro/preproc_dwi/preproc_dwi.diff index 9090792..48e8596 100644 --- a/subworkflows/nf-neuro/preproc_dwi/preproc_dwi.diff +++ b/subworkflows/nf-neuro/preproc_dwi/preproc_dwi.diff @@ -18,28 +18,25 @@ Changes in 'preproc_dwi/main.nf': include { PREPROC_N4 as N4_DWI } from '../../../modules/nf-neuro/preproc/n4/main' include { PREPROC_NORMALIZE as NORMALIZE_DWI } from '../../../modules/nf-neuro/preproc/normalize/main' include { IMAGE_RESAMPLE as RESAMPLE_DWI } from '../../../modules/nf-neuro/image/resample/main' -@@ -9,6 +15,7 @@ - include { UTILS_EXTRACTB0 as EXTRACTB0_RESAMPLE } from '../../../modules/nf-neuro/utils/extractb0/main' - include { UTILS_EXTRACTB0 as EXTRACTB0_TOPUP } from '../../../modules/nf-neuro/utils/extractb0/main' - include { TOPUP_EDDY } from '../topup_eddy/main' -+include { BETCROP_ANTSBET } from '../../../modules/nf-neuro/betcrop/antsbet/main.nf' - - - workflow PREPROC_DWI { -@@ -19,6 +26,7 @@ - ch_b0 // Channel: [ val(meta), [ b0 ] ], optional - ch_rev_b0 // channel: [ val(meta), [ reverse b0 ] ], optional - ch_config_topup // channel: [ 'config_topup' ], optional +@@ -19,6 +25,7 @@ + ch_b0 // Channel: [ val(meta), b0 ], optional + ch_rev_b0 // channel: [ val(meta), rev-b0 ], optional + ch_config_topup // channel: [ 'topup.cnf' ], optional + ch_weights // channel: [ 'weights' ], optional main: -@@ -73,22 +81,72 @@ +@@ -67,24 +74,71 @@ ch_versions = ch_versions.mix(TOPUP_EDDY.out.versions.first()) // ** Bet-crop DWI ** // +- ch_betcrop_dwi = TOPUP_EDDY.out.dwi +- .join(TOPUP_EDDY.out.bval) +- .join(TOPUP_EDDY.out.bvec) + if ( params.dwi_run_synthstrip ) { -+ + +- BETCROP_FSLBETCROP ( ch_betcrop_dwi ) +- ch_versions = ch_versions.mix(BETCROP_FSLBETCROP.out.versions.first()) + ch_pwd_avg = TOPUP_EDDY.out.dwi + .join(TOPUP_EDDY.out.bval) + .map{ it + [[]] } @@ -79,24 +76,24 @@ Changes in 'preproc_dwi/main.nf': + + } else { + -+ ch_pwdavg = Channel.empty() ++ ch_pwdavg = Channel.empty() ++ ch_betcrop_dwi = TOPUP_EDDY.out.dwi ++ .join(TOPUP_EDDY.out.bval) ++ .join(TOPUP_EDDY.out.bvec) + - ch_betcrop_dwi = TOPUP_EDDY.out.dwi - .join(TOPUP_EDDY.out.bval) - .join(TOPUP_EDDY.out.bvec) ++ BETCROP_FSLBETCROP ( ch_betcrop_dwi ) ++ ch_versions = ch_versions.mix(BETCROP_FSLBETCROP.out.versions.first()) + - BETCROP_FSLBETCROP ( ch_betcrop_dwi ) - ch_versions = ch_versions.mix(BETCROP_FSLBETCROP.out.versions.first()) - -+ ch_dwi = BETCROP_FSLBETCROP.out.image -+ ch_mask = BETCROP_FSLBETCROP.out.mask -+ ch_bbox = BETCROP_FSLBETCROP.out.bbox ++ ch_dwi = BETCROP_FSLBETCROP.out.image ++ ch_mask = BETCROP_FSLBETCROP.out.mask ++ ch_bbox = BETCROP_FSLBETCROP.out.bbox + + } -+ + // ** Crop b0 ** // ch_crop_b0 = TOPUP_EDDY.out.b0 - .join(BETCROP_FSLBETCROP.out.bbox) +- - BETCROP_CROPVOLUME ( ch_crop_b0 ) - ch_versions = ch_versions.mix(BETCROP_CROPVOLUME.out.versions.first()) + .join(ch_bbox) @@ -110,39 +107,40 @@ Changes in 'preproc_dwi/main.nf': + ch_N4 = ch_dwi + .join(CROPB0.out.image) + .join(ch_mask) + N4_DWI ( ch_N4 ) ch_versions = ch_versions.mix(N4_DWI.out.versions.first()) - -@@ -96,7 +154,7 @@ +@@ -93,7 +147,7 @@ ch_normalize = N4_DWI.out.image .join(TOPUP_EDDY.out.bval) .join(TOPUP_EDDY.out.bvec) - .join(BETCROP_FSLBETCROP.out.mask) + .join(ch_mask) + NORMALIZE_DWI ( ch_normalize ) ch_versions = ch_versions.mix(NORMALIZE_DWI.out.versions.first()) - -@@ -114,7 +172,7 @@ +@@ -114,8 +168,7 @@ ch_versions = ch_versions.mix(EXTRACTB0_RESAMPLE.out.versions.first()) // ** Resample mask ** // -- ch_resample_mask = BETCROP_FSLBETCROP.out.mask.map{ it + [[]] } +- ch_resample_mask = BETCROP_FSLBETCROP.out.mask +- .map{ it + [[]] } + ch_resample_mask = ch_mask.map{ it + [[]] } + RESAMPLE_MASK ( ch_resample_mask ) ch_versions = ch_versions.mix(RESAMPLE_MASK.out.versions.first()) - -@@ -122,9 +180,10 @@ - dwi_resample = RESAMPLE_DWI.out.image // channel: [ val(meta), [ dwi_resample ] ] - bval = TOPUP_EDDY.out.bval // channel: [ val(meta), [ bval_corrected ] ] - bvec = TOPUP_EDDY.out.bvec // channel: [ val(meta), [ bvec_corrected ] ] -+ pwdavg = ch_pwdavg // channel: [ val(meta), [ pwdavg ] ] - b0 = EXTRACTB0_RESAMPLE.out.b0 // channel: [ val(meta), [ b0 ] ] - b0_mask = RESAMPLE_MASK.out.image // channel: [ val(meta), [ b0_mask ] ] -- dwi_bounding_box = BETCROP_FSLBETCROP.out.bbox // channel: [ val(meta), [ dwi_bounding_box ] ] -+ dwi_bounding_box = ch_bbox // channel: [ val(meta), [ dwi_bounding_box ] ] - dwi_topup_eddy = TOPUP_EDDY.out.dwi // channel: [ val(meta), [ dwi_topup_eddy ] ] - dwi_n4 = N4_DWI.out.image // channel: [ val(meta), [ dwi_n4 ] ] - versions = ch_versions // channel: [ versions.yml ] +@@ -124,9 +177,10 @@ + dwi_resample = RESAMPLE_DWI.out.image // channel: [ val(meta), dwi-resampled ] + bval = TOPUP_EDDY.out.bval // channel: [ val(meta), bval-corrected ] + bvec = TOPUP_EDDY.out.bvec // channel: [ val(meta), bvec-corrected ] ++ pwdavg = ch_pwdavg // channel: [ val(meta), [ pwdavg ] ] + b0 = EXTRACTB0_RESAMPLE.out.b0 // channel: [ val(meta), b0-resampled ] + b0_mask = RESAMPLE_MASK.out.image // channel: [ val(meta), b0-mask ] +- dwi_bounding_box = BETCROP_FSLBETCROP.out.bbox // channel: [ val(meta), dwi-bounding-box ] ++ dwi_bounding_box = ch_bbox // channel: [ val(meta), [ dwi_bounding_box ] ] + dwi_topup_eddy = TOPUP_EDDY.out.dwi // channel: [ val(meta), dwi-after-topup-eddy ] + dwi_n4 = N4_DWI.out.image // channel: [ val(meta), dwi-after-n4 ] + versions = ch_versions // channel: [ versions.yml ] 'subworkflows/nf-neuro/preproc_dwi/tests/main.nf.test.snap' is unchanged 'subworkflows/nf-neuro/preproc_dwi/tests/tags.yml' is unchanged diff --git a/subworkflows/nf-neuro/preproc_t1/preproc_t1.diff b/subworkflows/nf-neuro/preproc_t1/preproc_t1.diff new file mode 100644 index 0000000..dc38d6a --- /dev/null +++ b/subworkflows/nf-neuro/preproc_t1/preproc_t1.diff @@ -0,0 +1,25 @@ +Changes in component 'nf-neuro/preproc_t1' +'subworkflows/nf-neuro/preproc_t1/meta.yml' is unchanged +Changes in 'preproc_t1/main.nf': +--- subworkflows/nf-neuro/preproc_t1/main.nf ++++ subworkflows/nf-neuro/preproc_t1/main.nf +@@ -88,9 +88,10 @@ + // The template and probability maps are mandatory if running antsBET. Since the + // error message from nextflow when they are absent is either non-informative or + // missing, we use ifEmpty to provide a more informative one. ++ // Remove this error message for now, as it is buggy. + ch_bet = IMAGE_RESAMPLE.out.image +- .join(ch_template.ifEmpty{ error("ANTS BET needs a template") }) +- .join(ch_probability_map.ifEmpty{ error("ANTS BET needs a tissue probability map") }) ++ .join(ch_template) ++ .join(ch_probability_map) + + BETCROP_ANTSBET ( ch_bet ) + ch_versions = ch_versions.mix(BETCROP_ANTSBET.out.versions.first()) + +'subworkflows/nf-neuro/preproc_t1/tests/main.nf.test.snap' is unchanged +'subworkflows/nf-neuro/preproc_t1/tests/nextflow_synthbet.config' is unchanged +'subworkflows/nf-neuro/preproc_t1/tests/tags.yml' is unchanged +'subworkflows/nf-neuro/preproc_t1/tests/nextflow.config' is unchanged +'subworkflows/nf-neuro/preproc_t1/tests/main.nf.test' is unchanged +************************************************************ diff --git a/tests/data/samplesheet_multisubject.csv b/tests/data/samplesheet_multisubject.csv new file mode 100644 index 0000000..9d78df4 --- /dev/null +++ b/tests/data/samplesheet_multisubject.csv @@ -0,0 +1,3 @@ +subject,t1,t2,dwi,bval,bvec,rev_b0,labels,wmparc,trk,peaks,fodf,mat,warp,metrics +sub-test1,"https://github.com/scilus/nf-pediatric/blob/main/tests/data/sub-test/t1.nii.gz",,"https://github.com/scilus/nf-pediatric/blob/main/tests/data/sub-test/dwi.nii.gz","https://github.com/scilus/nf-pediatric/blob/main/tests/data/sub-test/dwi.bval","https://github.com/scilus/nf-pediatric/blob/main/tests/data/sub-test/dwi.bvec","https://github.com/scilus/nf-pediatric/blob/main/tests/data/sub-test/rev_b0.nii.gz",,,,,,,,, +sub-test2,"https://github.com/scilus/nf-pediatric/blob/main/tests/data/sub-test/t1.nii.gz",,"https://github.com/scilus/nf-pediatric/blob/main/tests/data/sub-test/dwi.nii.gz","https://github.com/scilus/nf-pediatric/blob/main/tests/data/sub-test/dwi.bval","https://github.com/scilus/nf-pediatric/blob/main/tests/data/sub-test/dwi.bvec","https://github.com/scilus/nf-pediatric/blob/main/tests/data/sub-test/rev_b0.nii.gz",,,,,,,,, diff --git a/tests/data/samplesheet_multisubject_infant.csv b/tests/data/samplesheet_multisubject_infant.csv new file mode 100644 index 0000000..8ae6882 --- /dev/null +++ b/tests/data/samplesheet_multisubject_infant.csv @@ -0,0 +1,3 @@ +subject,t1,t2,dwi,bval,bvec,rev_b0,labels,wmparc,trk,peaks,fodf,mat,warp,metrics +sub-test1,,"https://github.com/scilus/nf-pediatric/blob/main/tests/data/sub-test/t2.nii.gz","https://github.com/scilus/nf-pediatric/blob/main/tests/data/sub-test/dwi.nii.gz","https://github.com/scilus/nf-pediatric/blob/main/tests/data/sub-test/dwi.bval","https://github.com/scilus/nf-pediatric/blob/main/tests/data/sub-test/dwi.bvec","https://github.com/scilus/nf-pediatric/blob/main/tests/data/sub-test/rev_b0.nii.gz","https://github.com/scilus/nf-pediatric/blob/main/tests/data/sub-test/labels.nii.gz","https://github.com/scilus/nf-pediatric/blob/main/tests/data/sub-test/wm_mask.nii.gz",,,,,,, +sub-test2,,"https://github.com/scilus/nf-pediatric/blob/main/tests/data/sub-test/t2.nii.gz","https://github.com/scilus/nf-pediatric/blob/main/tests/data/sub-test/dwi.nii.gz","https://github.com/scilus/nf-pediatric/blob/main/tests/data/sub-test/dwi.bval","https://github.com/scilus/nf-pediatric/blob/main/tests/data/sub-test/dwi.bvec","https://github.com/scilus/nf-pediatric/blob/main/tests/data/sub-test/rev_b0.nii.gz","https://github.com/scilus/nf-pediatric/blob/main/tests/data/sub-test/labels.nii.gz","https://github.com/scilus/nf-pediatric/blob/main/tests/data/sub-test/wm_mask.nii.gz",,,,,,, diff --git a/tests/multisubjects.nf.test b/tests/multisubjects.nf.test new file mode 100644 index 0000000..ab49399 --- /dev/null +++ b/tests/multisubjects.nf.test @@ -0,0 +1,82 @@ +nextflow_pipeline { + + options "-stub-run" + + name "Test nf-pediatric all profiles with multiple subjects." + script "../main.nf" + + test("All profiles with multiple subjects - should run successfully") { + + when { + params { + + params.input = "$projectDir/tests/data/samplesheet_multisubject.csv" + params.outdir = "$outputDir" + + params.connectomics = true + params.tracking = true + params.freesurfer = true + params.fs_license = "https://www.dropbox.com/scl/fi/0s8lp6lydyd0rxawxb4jm/license.txt?rlkey=hz54oc0d4sor69avqphtrjvgn&st=9e0yij97&dl=0" + + } + } + + then { + // stable name: All files + folders in ${params.outdir}/ with a stable name. + def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) + assertAll { + assert workflow.success + assert snapshot( + // Number of successfully completed tasks + workflow.trace.succeeded().size(), + // Remove the nextflow version from the versions.yml because we test it using different nextflow versions. + removeNextflowVersion("$outputDir/pipeline_info/pipeline_software_mqc_versions.yml"), + // All stable name. + stable_name + ).match() + } + } + } + + test("All profiles with multiple subjects - infant - should run successfully") { + + when { + params { + + params.input = "$projectDir/tests/data/samplesheet_multisubject_infant.csv" + params.outdir = "$outputDir" + + params.connectomics = true + params.tracking = true + params.infant = true + + // ** Infant specific parameters ** // + params.dwi_run_synthstrip = true + params.dwi_normalize_fa_mask_threshold = 0.10 + params.fodf_max_fa_threshold = 0.01 + params.fodf_min_md_threshold = 0.00185 + params.frf_manual_frf = "12,5,5" + params.run_pft_tracking = false + params.local_min_len = 15 + params.local_fa_seeding_mask_threshold = 0.10 + + } + } + + then { + // stable name: All files + folders in ${params.outdir}/ with a stable name. + def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) + assertAll { + assert workflow.success + assert snapshot( + // Number of successfully completed tasks + workflow.trace.succeeded().size(), + // Remove the nextflow version from the versions.yml because we test it using different nextflow versions. + removeNextflowVersion("$outputDir/pipeline_info/pipeline_software_mqc_versions.yml"), + // All stable name. + stable_name + ).match() + } + } + } +} diff --git a/tests/multisubjects.nf.test.snap b/tests/multisubjects.nf.test.snap new file mode 100644 index 0000000..9f63ffd --- /dev/null +++ b/tests/multisubjects.nf.test.snap @@ -0,0 +1,442 @@ +{ + "All profiles with multiple subjects - infant - should run successfully": { + "content": [ + 77, + { + "CONNECTIVITY_AFDFIXEL": { + "scilpy": 1.6 + }, + "CONNECTIVITY_METRICS": { + "scilpy": "2.0.2" + }, + "CONNECTIVITY_VISUALIZE": { + "scilpy": "2.0.2" + }, + "CROPT2": { + "scilpy": "2.0.2" + }, + "CROPWMMASK": { + "scilpy": "2.0.2" + }, + "DENOISE_DWI": { + "mrtrix": "3.0.4" + }, + "FILTERING_COMMIT": { + "scilpy": 1.6 + }, + "MASK_COMBINE": { + "scilpy": "2.0.2", + "mrtrix": "== mrthreshold 3.0.4 ==", + "fsl": 6.0 + }, + "RECONST_DTIMETRICS": { + "scilpy": "2.0.2" + }, + "RECONST_FODF": { + "scilpy": "2.0.2" + }, + "RECONST_FRF": { + "scilpy": "2.0.2" + }, + "REGISTRATION_ANATTODWI": { + "ants": "2.4.3" + }, + "REGISTRATION_ANTSAPPLYTRANSFORMS": { + "ants": "2.4.3" + }, + "RESAMPLE_T2": { + "scilpy": "2.0.2" + }, + "RESAMPLE_WMMASK": { + "scilpy": "2.0.2" + }, + "TRACKING_LOCALTRACKING": { + "scilpy": "2.0.2" + }, + "TRACTOGRAM_DECOMPOSE": { + "scilpy": "2.0.2" + }, + "TRANSFORM_LABELS": { + "ants": "2.4.3" + }, + "Workflow": { + "nf/pediatric": "v1.0dev" + } + }, + [ + "multiqc", + "multiqc/global_multiqc_data", + "multiqc/global_multiqc_plots", + "multiqc/global_multiqc_report.html", + "pipeline_info", + "pipeline_info/pipeline_software_mqc_versions.yml", + "sub-test1", + "sub-test1/anat", + "sub-test1/anat/sub-test1_from-T2w_to-dwi_affine.mat", + "sub-test1/anat/sub-test1_from-T2w_to-dwi_warp.nii.gz", + "sub-test1/anat/sub-test1_from-dwi_to-T2w_warp.nii.gz", + "sub-test1/anat/sub-test1_space-diff_desc-preproc_T2w.nii.gz", + "sub-test1/anat/sub-test1_space-diff_label-WM_desc-seeding_mask.nii.gz", + "sub-test1/anat/sub-test1_space-diff_seg-BrainnetomeChild_dseg.nii.gz", + "sub-test1/anat/sub-test1_space-orig_desc-T2w_boundingbox.pkl", + "sub-test1/anat/sub-test1_space-orig_desc-preproc_T2w.nii.gz", + "sub-test1/anat/sub-test1_space-orig_label-WM_desc-seeding_mask.nii.gz", + "sub-test1/anat/sub-test1_space-orig_label-WM_mask.nii.gz", + "sub-test1/dwi", + "sub-test1/dwi/sub-test1__ad.npy", + "sub-test1/dwi/sub-test1__ad.npy.png", + "sub-test1/dwi/sub-test1__afd_total.npy", + "sub-test1/dwi/sub-test1__afd_total.npy.png", + "sub-test1/dwi/sub-test1__fa.npy", + "sub-test1/dwi/sub-test1__fa.npy.png", + "sub-test1/dwi/sub-test1__md.npy", + "sub-test1/dwi/sub-test1__md.npy.png", + "sub-test1/dwi/sub-test1__mode.npy", + "sub-test1/dwi/sub-test1__mode.npy.png", + "sub-test1/dwi/sub-test1__nufo.npy", + "sub-test1/dwi/sub-test1__nufo.npy.png", + "sub-test1/dwi/sub-test1__rd.npy", + "sub-test1/dwi/sub-test1__rd.npy.png", + "sub-test1/dwi/sub-test1_frf.txt", + "sub-test1/dwi/sub-test1_space-diff_desc-local_tracking.trk", + "sub-test1/dwi/sub-test1_space-diff_label-seeding_desc-local_mask.nii.gz", + "sub-test1/dwi/sub-test1_space-diff_label-tracking_desc-local_mask.nii.gz", + "sub-test1/dwi/sub-test1_space-orig_ad.nii.gz", + "sub-test1/dwi/sub-test1_space-orig_afd_max.nii.gz", + "sub-test1/dwi/sub-test1_space-orig_afd_sum.nii.gz", + "sub-test1/dwi/sub-test1_space-orig_afd_total.nii.gz", + "sub-test1/dwi/sub-test1_space-orig_desc-brain_mask.nii.gz", + "sub-test1/dwi/sub-test1_space-orig_desc-filtered_tracking.trk", + "sub-test1/dwi/sub-test1_space-orig_desc-preproc_b0.nii.gz", + "sub-test1/dwi/sub-test1_space-orig_desc-preproc_dwi.bval", + "sub-test1/dwi/sub-test1_space-orig_desc-preproc_dwi.bvec", + "sub-test1/dwi/sub-test1_space-orig_desc-preproc_dwi.nii.gz", + "sub-test1/dwi/sub-test1_space-orig_desc-preproc_tracking.h5", + "sub-test1/dwi/sub-test1_space-orig_desc-pwdavg_dwi.nii.gz", + "sub-test1/dwi/sub-test1_space-orig_fa.nii.gz", + "sub-test1/dwi/sub-test1_space-orig_fodf.nii.gz", + "sub-test1/dwi/sub-test1_space-orig_ga.nii.gz", + "sub-test1/dwi/sub-test1_space-orig_md.nii.gz", + "sub-test1/dwi/sub-test1_space-orig_mode.nii.gz", + "sub-test1/dwi/sub-test1_space-orig_nufo.nii.gz", + "sub-test1/dwi/sub-test1_space-orig_peaks.nii.gz", + "sub-test1/dwi/sub-test1_space-orig_rd.nii.gz", + "sub-test1/dwi/sub-test1_space-orig_rgb.nii.gz", + "sub-test1/dwi/sub-test1_space-orig_tensor.nii.gz", + "sub-test1/figures", + "sub-test1/figures/sub-test1__coverage_overlay_mqc.png", + "sub-test1/figures/sub-test1_gradients_mqc.png", + "sub-test1/figures/sub-test1_labels_mqc.png", + "sub-test1/figures/sub-test1_metrics_mqc.png", + "sub-test1/multiqc", + "sub-test1/multiqc/sub-test1_multiqc_data", + "sub-test1/multiqc/sub-test1_multiqc_plots", + "sub-test1/multiqc/sub-test1_multiqc_report.html", + "sub-test2", + "sub-test2/anat", + "sub-test2/anat/sub-test2_from-T2w_to-dwi_affine.mat", + "sub-test2/anat/sub-test2_from-T2w_to-dwi_warp.nii.gz", + "sub-test2/anat/sub-test2_from-dwi_to-T2w_warp.nii.gz", + "sub-test2/anat/sub-test2_space-diff_desc-preproc_T2w.nii.gz", + "sub-test2/anat/sub-test2_space-diff_label-WM_desc-seeding_mask.nii.gz", + "sub-test2/anat/sub-test2_space-diff_seg-BrainnetomeChild_dseg.nii.gz", + "sub-test2/anat/sub-test2_space-orig_desc-T2w_boundingbox.pkl", + "sub-test2/anat/sub-test2_space-orig_desc-preproc_T2w.nii.gz", + "sub-test2/anat/sub-test2_space-orig_label-WM_desc-seeding_mask.nii.gz", + "sub-test2/anat/sub-test2_space-orig_label-WM_mask.nii.gz", + "sub-test2/dwi", + "sub-test2/dwi/sub-test2__ad.npy", + "sub-test2/dwi/sub-test2__ad.npy.png", + "sub-test2/dwi/sub-test2__afd_total.npy", + "sub-test2/dwi/sub-test2__afd_total.npy.png", + "sub-test2/dwi/sub-test2__fa.npy", + "sub-test2/dwi/sub-test2__fa.npy.png", + "sub-test2/dwi/sub-test2__md.npy", + "sub-test2/dwi/sub-test2__md.npy.png", + "sub-test2/dwi/sub-test2__mode.npy", + "sub-test2/dwi/sub-test2__mode.npy.png", + "sub-test2/dwi/sub-test2__nufo.npy", + "sub-test2/dwi/sub-test2__nufo.npy.png", + "sub-test2/dwi/sub-test2__rd.npy", + "sub-test2/dwi/sub-test2__rd.npy.png", + "sub-test2/dwi/sub-test2_frf.txt", + "sub-test2/dwi/sub-test2_space-diff_desc-local_tracking.trk", + "sub-test2/dwi/sub-test2_space-diff_label-seeding_desc-local_mask.nii.gz", + "sub-test2/dwi/sub-test2_space-diff_label-tracking_desc-local_mask.nii.gz", + "sub-test2/dwi/sub-test2_space-orig_ad.nii.gz", + "sub-test2/dwi/sub-test2_space-orig_afd_max.nii.gz", + "sub-test2/dwi/sub-test2_space-orig_afd_sum.nii.gz", + "sub-test2/dwi/sub-test2_space-orig_afd_total.nii.gz", + "sub-test2/dwi/sub-test2_space-orig_desc-brain_mask.nii.gz", + "sub-test2/dwi/sub-test2_space-orig_desc-filtered_tracking.trk", + "sub-test2/dwi/sub-test2_space-orig_desc-preproc_b0.nii.gz", + "sub-test2/dwi/sub-test2_space-orig_desc-preproc_dwi.bval", + "sub-test2/dwi/sub-test2_space-orig_desc-preproc_dwi.bvec", + "sub-test2/dwi/sub-test2_space-orig_desc-preproc_dwi.nii.gz", + "sub-test2/dwi/sub-test2_space-orig_desc-preproc_tracking.h5", + "sub-test2/dwi/sub-test2_space-orig_desc-pwdavg_dwi.nii.gz", + "sub-test2/dwi/sub-test2_space-orig_fa.nii.gz", + "sub-test2/dwi/sub-test2_space-orig_fodf.nii.gz", + "sub-test2/dwi/sub-test2_space-orig_ga.nii.gz", + "sub-test2/dwi/sub-test2_space-orig_md.nii.gz", + "sub-test2/dwi/sub-test2_space-orig_mode.nii.gz", + "sub-test2/dwi/sub-test2_space-orig_nufo.nii.gz", + "sub-test2/dwi/sub-test2_space-orig_peaks.nii.gz", + "sub-test2/dwi/sub-test2_space-orig_rd.nii.gz", + "sub-test2/dwi/sub-test2_space-orig_rgb.nii.gz", + "sub-test2/dwi/sub-test2_space-orig_tensor.nii.gz", + "sub-test2/figures", + "sub-test2/figures/sub-test2__coverage_overlay_mqc.png", + "sub-test2/figures/sub-test2_gradients_mqc.png", + "sub-test2/figures/sub-test2_labels_mqc.png", + "sub-test2/figures/sub-test2_metrics_mqc.png", + "sub-test2/multiqc", + "sub-test2/multiqc/sub-test2_multiqc_data", + "sub-test2/multiqc/sub-test2_multiqc_plots", + "sub-test2/multiqc/sub-test2_multiqc_report.html" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.1" + }, + "timestamp": "2024-12-27T21:31:12.360693" + }, + "All profiles with multiple subjects - should run successfully": { + "content": [ + 66, + { + "CONNECTIVITY_AFDFIXEL": { + "scilpy": 1.6 + }, + "CONNECTIVITY_METRICS": { + "scilpy": "2.0.2" + }, + "CONNECTIVITY_VISUALIZE": { + "scilpy": "2.0.2" + }, + "DENOISE_DWI": { + "mrtrix": "3.0.4" + }, + "FASTSURFER": { + "fastsurfer": "2.3.3+0000000" + }, + "FILTERING_COMMIT": { + "scilpy": 1.6 + }, + "RECONST_DTIMETRICS": { + "scilpy": "2.0.2" + }, + "RECONST_FODF": { + "scilpy": "2.0.2" + }, + "RECONST_FRF": { + "scilpy": "2.0.2" + }, + "REGISTRATION_ANATTODWI": { + "ants": "2.4.3" + }, + "SEGMENTATION_FASTSEG": { + "scilpy": "2.0.0", + "fsl": 6.0 + }, + "TRACKING_LOCALTRACKING": { + "scilpy": "2.0.2" + }, + "TRACKING_PFTTRACKING": { + "scilpy": "2.0.2", + "mrtrix": "3.0.4" + }, + "TRACTOGRAM_DECOMPOSE": { + "scilpy": "2.0.2" + }, + "TRANSFORM_LABELS": { + "ants": "2.4.3" + }, + "Workflow": { + "nf/pediatric": "v1.0dev" + } + }, + [ + "cortical_area_lh.tsv", + "cortical_area_rh.tsv", + "cortical_thickness_lh.tsv", + "cortical_thickness_rh.tsv", + "cortical_volume_lh.tsv", + "cortical_volume_rh.tsv", + "multiqc", + "multiqc/global_multiqc_data", + "multiqc/global_multiqc_plots", + "multiqc/global_multiqc_report.html", + "pipeline_info", + "pipeline_info/pipeline_software_mqc_versions.yml", + "sub-test1", + "sub-test1/anat", + "sub-test1/anat/sub-test1_fastsurfer", + "sub-test1/anat/sub-test1_from-T1w_to-dwi_affine.mat", + "sub-test1/anat/sub-test1_from-T1w_to-dwi_warp.nii.gz", + "sub-test1/anat/sub-test1_from-dwi_to-T1w_warp.nii.gz", + "sub-test1/anat/sub-test1_space-diff_desc-preproc_T1w.nii.gz", + "sub-test1/anat/sub-test1_space-diff_label-CSF_mask.nii.gz", + "sub-test1/anat/sub-test1_space-diff_label-CSF_probseg.nii.gz", + "sub-test1/anat/sub-test1_space-diff_label-GM_mask.nii.gz", + "sub-test1/anat/sub-test1_space-diff_label-GM_probseg.nii.gz", + "sub-test1/anat/sub-test1_space-diff_label-WM_mask.nii.gz", + "sub-test1/anat/sub-test1_space-diff_label-WM_probseg.nii.gz", + "sub-test1/anat/sub-test1_space-diff_seg-BrainnetomeChild_dseg.nii.gz", + "sub-test1/anat/sub-test1_space-orig_desc-preproc_T1w.nii.gz", + "sub-test1/anat/sub-test1_space-orig_seg-BrainnetomeChild_desc-labels.json", + "sub-test1/anat/sub-test1_space-orig_seg-BrainnetomeChild_desc-labels.txt", + "sub-test1/anat/sub-test1_space-orig_seg-BrainnetomeChild_dseg.nii.gz", + "sub-test1/anat/sub-test1_space-orig_seg-BrainnetomeChild_dseg_dilated.nii.gz", + "sub-test1/anat/sub-test1_space-orig_seg-BrainnetomeChild_stat-lh_area.tsv", + "sub-test1/anat/sub-test1_space-orig_seg-BrainnetomeChild_stat-lh_thickness.tsv", + "sub-test1/anat/sub-test1_space-orig_seg-BrainnetomeChild_stat-lh_volume.tsv", + "sub-test1/anat/sub-test1_space-orig_seg-BrainnetomeChild_stat-rh_area.tsv", + "sub-test1/anat/sub-test1_space-orig_seg-BrainnetomeChild_stat-rh_thickness.tsv", + "sub-test1/anat/sub-test1_space-orig_seg-BrainnetomeChild_stat-rh_volume.tsv", + "sub-test1/anat/sub-test1_space-orig_seg-BrainnetomeChild_stat-subcortical.tsv", + "sub-test1/dwi", + "sub-test1/dwi/sub-test1__ad.npy", + "sub-test1/dwi/sub-test1__ad.npy.png", + "sub-test1/dwi/sub-test1__afd_total.npy", + "sub-test1/dwi/sub-test1__afd_total.npy.png", + "sub-test1/dwi/sub-test1__fa.npy", + "sub-test1/dwi/sub-test1__fa.npy.png", + "sub-test1/dwi/sub-test1__md.npy", + "sub-test1/dwi/sub-test1__md.npy.png", + "sub-test1/dwi/sub-test1__mode.npy", + "sub-test1/dwi/sub-test1__mode.npy.png", + "sub-test1/dwi/sub-test1__nufo.npy", + "sub-test1/dwi/sub-test1__nufo.npy.png", + "sub-test1/dwi/sub-test1__rd.npy", + "sub-test1/dwi/sub-test1__rd.npy.png", + "sub-test1/dwi/sub-test1_frf.txt", + "sub-test1/dwi/sub-test1_space-diff_desc-local_tracking.trk", + "sub-test1/dwi/sub-test1_space-diff_label-exclude_desc-pft_probseg.nii.gz", + "sub-test1/dwi/sub-test1_space-diff_label-include_desc-pft_probseg.nii.gz", + "sub-test1/dwi/sub-test1_space-diff_label-seeding_desc-local_mask.nii.gz", + "sub-test1/dwi/sub-test1_space-diff_label-seeding_desc-pft_mask.nii.gz", + "sub-test1/dwi/sub-test1_space-diff_label-tracking_desc-local_mask.nii.gz", + "sub-test1/dwi/sub-test1_space-orig_ad.nii.gz", + "sub-test1/dwi/sub-test1_space-orig_afd_max.nii.gz", + "sub-test1/dwi/sub-test1_space-orig_afd_sum.nii.gz", + "sub-test1/dwi/sub-test1_space-orig_afd_total.nii.gz", + "sub-test1/dwi/sub-test1_space-orig_desc-brain_mask.nii.gz", + "sub-test1/dwi/sub-test1_space-orig_desc-filtered_tracking.trk", + "sub-test1/dwi/sub-test1_space-orig_desc-pft_tracking.trk", + "sub-test1/dwi/sub-test1_space-orig_desc-preproc_b0.nii.gz", + "sub-test1/dwi/sub-test1_space-orig_desc-preproc_dwi.bval", + "sub-test1/dwi/sub-test1_space-orig_desc-preproc_dwi.bvec", + "sub-test1/dwi/sub-test1_space-orig_desc-preproc_dwi.nii.gz", + "sub-test1/dwi/sub-test1_space-orig_desc-preproc_tracking.h5", + "sub-test1/dwi/sub-test1_space-orig_fa.nii.gz", + "sub-test1/dwi/sub-test1_space-orig_fodf.nii.gz", + "sub-test1/dwi/sub-test1_space-orig_ga.nii.gz", + "sub-test1/dwi/sub-test1_space-orig_md.nii.gz", + "sub-test1/dwi/sub-test1_space-orig_mode.nii.gz", + "sub-test1/dwi/sub-test1_space-orig_nufo.nii.gz", + "sub-test1/dwi/sub-test1_space-orig_peaks.nii.gz", + "sub-test1/dwi/sub-test1_space-orig_rd.nii.gz", + "sub-test1/dwi/sub-test1_space-orig_rgb.nii.gz", + "sub-test1/dwi/sub-test1_space-orig_tensor.nii.gz", + "sub-test1/figures", + "sub-test1/figures/sub-test1__coverage_overlay_mqc.png", + "sub-test1/figures/sub-test1_gradients_mqc.png", + "sub-test1/figures/sub-test1_labels_mqc.png", + "sub-test1/figures/sub-test1_metrics_mqc.png", + "sub-test1/figures/sub-test1_tissue_segmentation_mqc.png", + "sub-test1/multiqc", + "sub-test1/multiqc/sub-test1_multiqc_data", + "sub-test1/multiqc/sub-test1_multiqc_plots", + "sub-test1/multiqc/sub-test1_multiqc_report.html", + "sub-test2", + "sub-test2/anat", + "sub-test2/anat/sub-test2_fastsurfer", + "sub-test2/anat/sub-test2_from-T1w_to-dwi_affine.mat", + "sub-test2/anat/sub-test2_from-T1w_to-dwi_warp.nii.gz", + "sub-test2/anat/sub-test2_from-dwi_to-T1w_warp.nii.gz", + "sub-test2/anat/sub-test2_space-diff_desc-preproc_T1w.nii.gz", + "sub-test2/anat/sub-test2_space-diff_label-CSF_mask.nii.gz", + "sub-test2/anat/sub-test2_space-diff_label-CSF_probseg.nii.gz", + "sub-test2/anat/sub-test2_space-diff_label-GM_mask.nii.gz", + "sub-test2/anat/sub-test2_space-diff_label-GM_probseg.nii.gz", + "sub-test2/anat/sub-test2_space-diff_label-WM_mask.nii.gz", + "sub-test2/anat/sub-test2_space-diff_label-WM_probseg.nii.gz", + "sub-test2/anat/sub-test2_space-diff_seg-BrainnetomeChild_dseg.nii.gz", + "sub-test2/anat/sub-test2_space-orig_desc-preproc_T1w.nii.gz", + "sub-test2/anat/sub-test2_space-orig_seg-BrainnetomeChild_desc-labels.json", + "sub-test2/anat/sub-test2_space-orig_seg-BrainnetomeChild_desc-labels.txt", + "sub-test2/anat/sub-test2_space-orig_seg-BrainnetomeChild_dseg.nii.gz", + "sub-test2/anat/sub-test2_space-orig_seg-BrainnetomeChild_dseg_dilated.nii.gz", + "sub-test2/anat/sub-test2_space-orig_seg-BrainnetomeChild_stat-lh_area.tsv", + "sub-test2/anat/sub-test2_space-orig_seg-BrainnetomeChild_stat-lh_thickness.tsv", + "sub-test2/anat/sub-test2_space-orig_seg-BrainnetomeChild_stat-lh_volume.tsv", + "sub-test2/anat/sub-test2_space-orig_seg-BrainnetomeChild_stat-rh_area.tsv", + "sub-test2/anat/sub-test2_space-orig_seg-BrainnetomeChild_stat-rh_thickness.tsv", + "sub-test2/anat/sub-test2_space-orig_seg-BrainnetomeChild_stat-rh_volume.tsv", + "sub-test2/anat/sub-test2_space-orig_seg-BrainnetomeChild_stat-subcortical.tsv", + "sub-test2/dwi", + "sub-test2/dwi/sub-test2__ad.npy", + "sub-test2/dwi/sub-test2__ad.npy.png", + "sub-test2/dwi/sub-test2__afd_total.npy", + "sub-test2/dwi/sub-test2__afd_total.npy.png", + "sub-test2/dwi/sub-test2__fa.npy", + "sub-test2/dwi/sub-test2__fa.npy.png", + "sub-test2/dwi/sub-test2__md.npy", + "sub-test2/dwi/sub-test2__md.npy.png", + "sub-test2/dwi/sub-test2__mode.npy", + "sub-test2/dwi/sub-test2__mode.npy.png", + "sub-test2/dwi/sub-test2__nufo.npy", + "sub-test2/dwi/sub-test2__nufo.npy.png", + "sub-test2/dwi/sub-test2__rd.npy", + "sub-test2/dwi/sub-test2__rd.npy.png", + "sub-test2/dwi/sub-test2_frf.txt", + "sub-test2/dwi/sub-test2_space-diff_desc-local_tracking.trk", + "sub-test2/dwi/sub-test2_space-diff_label-exclude_desc-pft_probseg.nii.gz", + "sub-test2/dwi/sub-test2_space-diff_label-include_desc-pft_probseg.nii.gz", + "sub-test2/dwi/sub-test2_space-diff_label-seeding_desc-local_mask.nii.gz", + "sub-test2/dwi/sub-test2_space-diff_label-seeding_desc-pft_mask.nii.gz", + "sub-test2/dwi/sub-test2_space-diff_label-tracking_desc-local_mask.nii.gz", + "sub-test2/dwi/sub-test2_space-orig_ad.nii.gz", + "sub-test2/dwi/sub-test2_space-orig_afd_max.nii.gz", + "sub-test2/dwi/sub-test2_space-orig_afd_sum.nii.gz", + "sub-test2/dwi/sub-test2_space-orig_afd_total.nii.gz", + "sub-test2/dwi/sub-test2_space-orig_desc-brain_mask.nii.gz", + "sub-test2/dwi/sub-test2_space-orig_desc-filtered_tracking.trk", + "sub-test2/dwi/sub-test2_space-orig_desc-pft_tracking.trk", + "sub-test2/dwi/sub-test2_space-orig_desc-preproc_b0.nii.gz", + "sub-test2/dwi/sub-test2_space-orig_desc-preproc_dwi.bval", + "sub-test2/dwi/sub-test2_space-orig_desc-preproc_dwi.bvec", + "sub-test2/dwi/sub-test2_space-orig_desc-preproc_dwi.nii.gz", + "sub-test2/dwi/sub-test2_space-orig_desc-preproc_tracking.h5", + "sub-test2/dwi/sub-test2_space-orig_fa.nii.gz", + "sub-test2/dwi/sub-test2_space-orig_fodf.nii.gz", + "sub-test2/dwi/sub-test2_space-orig_ga.nii.gz", + "sub-test2/dwi/sub-test2_space-orig_md.nii.gz", + "sub-test2/dwi/sub-test2_space-orig_mode.nii.gz", + "sub-test2/dwi/sub-test2_space-orig_nufo.nii.gz", + "sub-test2/dwi/sub-test2_space-orig_peaks.nii.gz", + "sub-test2/dwi/sub-test2_space-orig_rd.nii.gz", + "sub-test2/dwi/sub-test2_space-orig_rgb.nii.gz", + "sub-test2/dwi/sub-test2_space-orig_tensor.nii.gz", + "sub-test2/figures", + "sub-test2/figures/sub-test2__coverage_overlay_mqc.png", + "sub-test2/figures/sub-test2_gradients_mqc.png", + "sub-test2/figures/sub-test2_labels_mqc.png", + "sub-test2/figures/sub-test2_metrics_mqc.png", + "sub-test2/figures/sub-test2_tissue_segmentation_mqc.png", + "sub-test2/multiqc", + "sub-test2/multiqc/sub-test2_multiqc_data", + "sub-test2/multiqc/sub-test2_multiqc_plots", + "sub-test2/multiqc/sub-test2_multiqc_report.html", + "subcortical_volumes.tsv" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.1" + }, + "timestamp": "2024-12-27T21:05:13.694372" + } +} \ No newline at end of file