From fc808259005f10b269e00b2a78d287e788952987 Mon Sep 17 00:00:00 2001 From: ThoumyreStanislas Date: Wed, 7 Feb 2024 16:49:39 -0500 Subject: [PATCH 1/3] add t1 option in fslbetcrop module --- modules/nf-scil/betcrop/fslbetcrop/main.nf | 52 +++++++++++++------ modules/nf-scil/betcrop/fslbetcrop/meta.yml | 30 ++++++++--- .../nf-scil/betcrop/fslbetcrop/main.nf | 23 +++++++- 3 files changed, 81 insertions(+), 24 deletions(-) diff --git a/modules/nf-scil/betcrop/fslbetcrop/main.nf b/modules/nf-scil/betcrop/fslbetcrop/main.nf index f1acaee0..b2eba490 100644 --- a/modules/nf-scil/betcrop/fslbetcrop/main.nf +++ b/modules/nf-scil/betcrop/fslbetcrop/main.nf @@ -8,12 +8,12 @@ process BETCROP_FSLBETCROP { 'scilus/scilus:1.6.0' }" input: - tuple val(meta), path(dwi), path(bval), path(bvec) + tuple val(meta), path(image), path(bval), path(bvec), path(template), path(map) output: - tuple val(meta), path("*dwi_bet_cropped.nii.gz") , emit: dwi - tuple val(meta), path("*dwi_bet_cropped_mask.nii.gz") , emit: mask - tuple val(meta), path("*dwi_boundingBox.pkl") , emit: bbox + tuple val(meta), path("*_bet_cropped.nii.gz") , emit: image + tuple val(meta), path("*_bet_cropped_mask.nii.gz") , emit: mask + tuple val(meta), path("*_boundingBox.pkl") , emit: bbox path "versions.yml" , emit: versions when: @@ -30,24 +30,44 @@ process BETCROP_FSLBETCROP { export OMP_NUM_THREADS=1 export OPENBLAS_NUM_THREADS=1 - scil_extract_b0.py $dwi $bval $bvec ${prefix}__b0.nii.gz --mean \ - $b0_thr --force_b0_threshold - bet ${prefix}__b0.nii.gz ${prefix}__b0_bet.nii.gz -m -R $bet_dwi_f - scil_image_math.py convert ${prefix}__b0_bet_mask.nii.gz ${prefix}__b0_bet_mask.nii.gz --data_type uint8 -f - mrcalc $dwi ${prefix}__b0_bet_mask.nii.gz -mult ${prefix}__dwi_bet.nii.gz -quiet -nthreads 1 + if [[ -v $bval && -v $bvec ]] + then + scil_extract_b0.py $image $bval $bvec ${prefix}__b0.nii.gz --mean \ + $b0_thr --force_b0_threshold + bet ${prefix}__b0.nii.gz ${prefix}__b0_bet.nii.gz -m -R $bet_dwi_f + scil_image_math.py convert ${prefix}__b0_bet_mask.nii.gz ${prefix}__b0_bet_mask.nii.gz --data_type uint8 -f + mrcalc $image ${prefix}__b0_bet_mask.nii.gz -mult ${prefix}__dwi_bet.nii.gz -quiet -nthreads 1 - scil_crop_volume.py $dwi ${prefix}__dwi_bet_cropped.nii.gz -f \ - --output_bbox ${prefix}__dwi_boundingBox.pkl -f - scil_crop_volume.py ${prefix}__b0_bet_mask.nii.gz ${prefix}__dwi_bet_cropped_mask.nii.gz -f\ - --input_bbox ${prefix}__dwi_boundingBox.pkl -f - scil_image_math.py convert ${prefix}__dwi_bet_cropped_mask.nii.gz ${prefix}__dwi_bet_cropped_mask.nii.gz \ - --data_type uint8 -f + scil_crop_volume.py $image ${prefix}__dwi_bet_cropped.nii.gz -f \ + --output_bbox ${prefix}__dwi_boundingBox.pkl -f + scil_crop_volume.py ${prefix}__b0_bet_mask.nii.gz ${prefix}__dwi_bet_cropped_mask.nii.gz -f\ + --input_bbox ${prefix}__dwi_boundingBox.pkl -f + scil_image_math.py convert ${prefix}__dwi_bet_cropped_mask.nii.gz ${prefix}__dwi_bet_cropped_mask.nii.gz \ + --data_type uint8 -f + + else + export ANTS_RANDOM_SEED=1234 + + antsBrainExtraction.sh -d 3 -a $image -e $template\ + -o bet/ -m $map -u 0 + scil_image_math.py convert bet/BrainExtractionMask.nii.gz ${prefix}__t1_bet_mask.nii.gz --data_type uint8 + mrcalc $image ${prefix}__t1_bet_mask.nii.gz -mult ${prefix}__t1_bet.nii.gz -nthreads 1 + + scil_crop_volume.py $image ${prefix}__t1_bet_cropped.nii.gz\ + --output_bbox t1_boundingBox.pkl -f + scil_crop_volume.py ${prefix}__t1_bet_mask.nii.gz ${prefix}__t1_bet_mask_cropped.nii.gz\ + --input_bbox t1_boundingBox.pkl -f + scil_image_math.py convert ${prefix}__t1_bet_mask_cropped.nii.gz ${prefix}__t1_bet_mask_cropped.nii.gz --data_type uint8 -f + + fi cat <<-END_VERSIONS > versions.yml "${task.process}": scilpy: 1.6.0 mrtrix: \$(mrcalc -version 2>&1 | sed -n 's/== mrcalc \\([0-9.]\\+\\).*/\\1/p') fsl: \$(flirt -version 2>&1 | sed -n 's/FLIRT version \\([0-9.]\\+\\)/\\1/p') + ants: 2.4.3 + END_VERSIONS """ @@ -64,12 +84,14 @@ process BETCROP_FSLBETCROP { touch ${prefix}__dwi_bet_cropped.nii.gz touch ${prefix}__dwi_bet_cropped_mask.nii.gz + touch ${prefix}__dwi_boundingBox.pkl cat <<-END_VERSIONS > versions.yml "${task.process}": scilpy: 1.6.0 mrtrix: \$(mrcalc -version 2>&1 | sed -n 's/== mrcalc \\([0-9.]\\+\\).*/\\1/p') fsl: \$(flirt -version 2>&1 | sed -n 's/FLIRT version \\([0-9.]\\+\\)/\\1/p') + ants: 2.4.3 END_VERSIONS """ } diff --git a/modules/nf-scil/betcrop/fslbetcrop/meta.yml b/modules/nf-scil/betcrop/fslbetcrop/meta.yml index a047812b..ab3143f0 100644 --- a/modules/nf-scil/betcrop/fslbetcrop/meta.yml +++ b/modules/nf-scil/betcrop/fslbetcrop/meta.yml @@ -4,6 +4,7 @@ name: "betcrop_fslbetcrop" description: Perform Brain extraction using FSL BET followed by cropping empty planes around the data. keywords: - DWI + - T1 - BET - Crop tools: @@ -16,6 +17,9 @@ tools: - "MRtrix3": description: "Toolbox for image processing, analysis and visualisation of dMRI." homepage: "https://mrtrix.readthedocs.io/en/latest/" + - "ANTs": + description: "Advanced Normalization Tools" + homepage: "https://github.com/ANTsX/ANTs" input: - meta: @@ -24,9 +28,9 @@ input: Groovy Map containing sample information e.g. `[ id:'test', single_end:false ]` - - dwi: + - image: type: file - description: Nifti DWI volume to perform BET + crop. + description: Nifti image volume to perform BET + crop. pattern: "*.{nii,nii.gz}" - bval: @@ -39,6 +43,16 @@ input: description: B-vectors in FSL format. pattern: "*.bvec" + - template: + type: file + description: Anatomical template for Brain extraction template. + pattern: "*.{nii,nii.gz}" + + - map: + type: file + description: Brain probability mask, with intensity range 1 (definitely brain) to 0 (definitely background). + pattern: "*.{nii,nii.gz}" + output: - meta: type: map @@ -46,19 +60,19 @@ output: Groovy Map containing sample information e.g. `[ id:'test', single_end:false ]` - - dwi: + - image: type: file - description: Nifti DWI volume brain-extracted and cropped. - pattern: "*dwi_bet_cropped.{nii,nii.gz}" + description: Nifti volume brain-extracted and cropped. + pattern: "*_bet_cropped.{nii,nii.gz}" - mask: type: file - description: DWI mask brain-extracted and cropped. - pattern: "*dwi_bet_cropped_mask.{nii,nii.gz}" + description: mask brain-extracted and cropped. + pattern: "*_bet_cropped_mask.{nii,nii.gz}" - bbox: type: file - description: DWI BoundingBox used for cropping. + description: BoundingBox used for cropping. pattern: "*dwi_boundingBox.pkl" - versions: diff --git a/tests/modules/nf-scil/betcrop/fslbetcrop/main.nf b/tests/modules/nf-scil/betcrop/fslbetcrop/main.nf index d123784f..14071fe1 100644 --- a/tests/modules/nf-scil/betcrop/fslbetcrop/main.nf +++ b/tests/modules/nf-scil/betcrop/fslbetcrop/main.nf @@ -3,8 +3,9 @@ nextflow.enable.dsl = 2 include { BETCROP_FSLBETCROP } from '../../../../../modules/nf-scil/betcrop/fslbetcrop/main.nf' +include { LOAD_TEST_DATA } from '../../../../../subworkflows/nf-scil/load_test_data/main' -workflow test_betcrop_fslbetcrop { +workflow test_betcrop_fslbetcrop_dwi { input = [ [ id:'test', single_end:false ], // meta map @@ -15,3 +16,23 @@ workflow test_betcrop_fslbetcrop { BETCROP_FSLBETCROP ( input ) } + +workflow test_betcrop_fslbetcrop_t1 { + + input_fetch = Channel.from( [ "others.zip" ] ) + + LOAD_TEST_DATA ( input_fetch, "test.test_betcrop_fslbetcrop_t1" ) + + input = LOAD_TEST_DATA.out.test_data_directory + .map{ test_data_directory -> [ + [ id:'test', single_end:false ], // meta map + file("${test_data_directory}/t1.nii.gz"), + [], + [], + file("${test_data_directory}/t1_template.nii.gz"), + file("${test_data_directory}/t1_brain_probability_map.nii.gz") + + ]} + + BETCROP_FSLBETCROP ( input ) +} \ No newline at end of file From 07a0e035785ad063c3f67d00d4d2918d0d32cd1c Mon Sep 17 00:00:00 2001 From: ThoumyreStanislas Date: Thu, 8 Feb 2024 11:24:25 -0500 Subject: [PATCH 2/3] change for fslbet for t1 and add crop in option --- modules/nf-scil/betcrop/fslbetcrop/main.nf | 53 ++++++++++--------- modules/nf-scil/betcrop/fslbetcrop/meta.yml | 13 ----- .../nf-scil/betcrop/fslbetcrop/main.nf | 6 +-- .../betcrop/fslbetcrop/nextflow.config | 8 ++- 4 files changed, 35 insertions(+), 45 deletions(-) diff --git a/modules/nf-scil/betcrop/fslbetcrop/main.nf b/modules/nf-scil/betcrop/fslbetcrop/main.nf index b2eba490..565695d9 100644 --- a/modules/nf-scil/betcrop/fslbetcrop/main.nf +++ b/modules/nf-scil/betcrop/fslbetcrop/main.nf @@ -8,13 +8,13 @@ process BETCROP_FSLBETCROP { 'scilus/scilus:1.6.0' }" input: - tuple val(meta), path(image), path(bval), path(bvec), path(template), path(map) + tuple val(meta), path(image), path(bval), path(bvec) output: tuple val(meta), path("*_bet_cropped.nii.gz") , emit: image tuple val(meta), path("*_bet_cropped_mask.nii.gz") , emit: mask tuple val(meta), path("*_boundingBox.pkl") , emit: bbox - path "versions.yml" , emit: versions + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -23,7 +23,7 @@ process BETCROP_FSLBETCROP { def prefix = task.ext.prefix ?: "${meta.id}" def b0_thr = task.ext.b0_thr ? "--b0_thr " + task.ext.b0_thr : "" - def bet_dwi_f = task.ext.bet_dwi_f ? "-f " + task.ext.bet_dwi_f : "" + def bet_f = task.ext.bet_f ? "-f " + task.ext.bet_f : "" """ export ITK_GLOBAL_DEFAULT_NUMBER_OF_THREADS=1 @@ -34,31 +34,34 @@ process BETCROP_FSLBETCROP { then scil_extract_b0.py $image $bval $bvec ${prefix}__b0.nii.gz --mean \ $b0_thr --force_b0_threshold - bet ${prefix}__b0.nii.gz ${prefix}__b0_bet.nii.gz -m -R $bet_dwi_f + + bet ${prefix}__b0.nii.gz ${prefix}__b0_bet.nii.gz -m -R $bet_f scil_image_math.py convert ${prefix}__b0_bet_mask.nii.gz ${prefix}__b0_bet_mask.nii.gz --data_type uint8 -f mrcalc $image ${prefix}__b0_bet_mask.nii.gz -mult ${prefix}__dwi_bet.nii.gz -quiet -nthreads 1 - scil_crop_volume.py $image ${prefix}__dwi_bet_cropped.nii.gz -f \ - --output_bbox ${prefix}__dwi_boundingBox.pkl -f - scil_crop_volume.py ${prefix}__b0_bet_mask.nii.gz ${prefix}__dwi_bet_cropped_mask.nii.gz -f\ - --input_bbox ${prefix}__dwi_boundingBox.pkl -f - scil_image_math.py convert ${prefix}__dwi_bet_cropped_mask.nii.gz ${prefix}__dwi_bet_cropped_mask.nii.gz \ - --data_type uint8 -f - - else - export ANTS_RANDOM_SEED=1234 - - antsBrainExtraction.sh -d 3 -a $image -e $template\ - -o bet/ -m $map -u 0 - scil_image_math.py convert bet/BrainExtractionMask.nii.gz ${prefix}__t1_bet_mask.nii.gz --data_type uint8 - mrcalc $image ${prefix}__t1_bet_mask.nii.gz -mult ${prefix}__t1_bet.nii.gz -nthreads 1 - - scil_crop_volume.py $image ${prefix}__t1_bet_cropped.nii.gz\ - --output_bbox t1_boundingBox.pkl -f - scil_crop_volume.py ${prefix}__t1_bet_mask.nii.gz ${prefix}__t1_bet_mask_cropped.nii.gz\ - --input_bbox t1_boundingBox.pkl -f - scil_image_math.py convert ${prefix}__t1_bet_mask_cropped.nii.gz ${prefix}__t1_bet_mask_cropped.nii.gz --data_type uint8 -f + if ( "$task.ext.crop" = true ); + then + scil_crop_volume.py $image ${prefix}__dwi_bet_cropped.nii.gz -f \ + --output_bbox ${prefix}__dwi_boundingBox.pkl -f + scil_crop_volume.py ${prefix}__b0_bet_mask.nii.gz ${prefix}__dwi_bet_cropped_mask.nii.gz -f\ + --input_bbox ${prefix}__dwi_boundingBox.pkl -f + scil_image_math.py convert ${prefix}__dwi_bet_cropped_mask.nii.gz ${prefix}__dwi_bet_cropped_mask.nii.gz \ + --data_type uint8 -f + fi + else + bet $image ${prefix}__t1_bet.nii.gz -m -R $bet_f + scil_image_math.py convert ${prefix}__t1_bet_mask.nii.gz ${prefix}__t1_bet_mask.nii.gz --data_type uint8 -f + + if ( "$task.ext.crop" = true ); + then + scil_crop_volume.py $image ${prefix}__t1_bet_cropped.nii.gz -f \ + --output_bbox ${prefix}__t1_boundingBox.pkl -f + scil_crop_volume.py ${prefix}__t1_bet_mask.nii.gz ${prefix}__t1_bet_cropped_mask.nii.gz -f\ + --input_bbox ${prefix}__dwi_boundingBox.pkl -f + scil_image_math.py convert ${prefix}__t1_bet_cropped_mask.nii.gz ${prefix}__t1_bet_cropped_mask.nii.gz \ + --data_type uint8 -f + fi fi cat <<-END_VERSIONS > versions.yml @@ -66,7 +69,6 @@ process BETCROP_FSLBETCROP { scilpy: 1.6.0 mrtrix: \$(mrcalc -version 2>&1 | sed -n 's/== mrcalc \\([0-9.]\\+\\).*/\\1/p') fsl: \$(flirt -version 2>&1 | sed -n 's/FLIRT version \\([0-9.]\\+\\)/\\1/p') - ants: 2.4.3 END_VERSIONS """ @@ -91,7 +93,6 @@ process BETCROP_FSLBETCROP { scilpy: 1.6.0 mrtrix: \$(mrcalc -version 2>&1 | sed -n 's/== mrcalc \\([0-9.]\\+\\).*/\\1/p') fsl: \$(flirt -version 2>&1 | sed -n 's/FLIRT version \\([0-9.]\\+\\)/\\1/p') - ants: 2.4.3 END_VERSIONS """ } diff --git a/modules/nf-scil/betcrop/fslbetcrop/meta.yml b/modules/nf-scil/betcrop/fslbetcrop/meta.yml index ab3143f0..ec47b41f 100644 --- a/modules/nf-scil/betcrop/fslbetcrop/meta.yml +++ b/modules/nf-scil/betcrop/fslbetcrop/meta.yml @@ -17,9 +17,6 @@ tools: - "MRtrix3": description: "Toolbox for image processing, analysis and visualisation of dMRI." homepage: "https://mrtrix.readthedocs.io/en/latest/" - - "ANTs": - description: "Advanced Normalization Tools" - homepage: "https://github.com/ANTsX/ANTs" input: - meta: @@ -43,16 +40,6 @@ input: description: B-vectors in FSL format. pattern: "*.bvec" - - template: - type: file - description: Anatomical template for Brain extraction template. - pattern: "*.{nii,nii.gz}" - - - map: - type: file - description: Brain probability mask, with intensity range 1 (definitely brain) to 0 (definitely background). - pattern: "*.{nii,nii.gz}" - output: - meta: type: map diff --git a/tests/modules/nf-scil/betcrop/fslbetcrop/main.nf b/tests/modules/nf-scil/betcrop/fslbetcrop/main.nf index 14071fe1..25b8483d 100644 --- a/tests/modules/nf-scil/betcrop/fslbetcrop/main.nf +++ b/tests/modules/nf-scil/betcrop/fslbetcrop/main.nf @@ -26,11 +26,7 @@ workflow test_betcrop_fslbetcrop_t1 { input = LOAD_TEST_DATA.out.test_data_directory .map{ test_data_directory -> [ [ id:'test', single_end:false ], // meta map - file("${test_data_directory}/t1.nii.gz"), - [], - [], - file("${test_data_directory}/t1_template.nii.gz"), - file("${test_data_directory}/t1_brain_probability_map.nii.gz") + file("${test_data_directory}/t1.nii.gz") ]} diff --git a/tests/modules/nf-scil/betcrop/fslbetcrop/nextflow.config b/tests/modules/nf-scil/betcrop/fslbetcrop/nextflow.config index 32f7bc96..950c9829 100644 --- a/tests/modules/nf-scil/betcrop/fslbetcrop/nextflow.config +++ b/tests/modules/nf-scil/betcrop/fslbetcrop/nextflow.config @@ -3,7 +3,13 @@ process { publishDir = { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" } withName: "BETCROP_FSLBETCROP" { - ext.bet_dwi_f = 0.16 + ext.bet_f = 0.16 ext.b0_thr = 10 + ext.crop = false + } + + withName: "workflow test_betcrop_fslbetcrop_t1:BETCROP_FSLBETCROP" { + ext.bet_f = 0.5 + ext.crop = true } } From e4459d0a16c6ff76ee7a72e1bbfd92043d0d8ddf Mon Sep 17 00:00:00 2001 From: ThoumyreStanislas Date: Thu, 8 Feb 2024 11:50:01 -0500 Subject: [PATCH 3/3] change the token --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d6a3dd29..5e92f311 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -78,7 +78,7 @@ jobs: id: filter with: filters: "tests/config/pytest_modules.yml" - token: "" + token: "${{ secrets.GITHUB_TOKEN }}" nf-core-lint: runs-on: scilus-nf-scil-runners