Skip to content

Commit 2d348dd

Browse files
authored
Merge pull request #368 from arnaudbore/update_extract_b0
[ENH] Use extract_b0 to get bval bvec for preproc_dwi and tractoflow
2 parents 2bd1329 + 42ddcc7 commit 2d348dd

10 files changed

Lines changed: 200 additions & 38 deletions

File tree

‎modules/nf-neuro/utils/extractb0/main.nf‎

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@ process UTILS_EXTRACTB0 {
88
tuple val(meta), path(dwi), path(bval), path(bvec)
99

1010
output:
11-
tuple val(meta), path("*_b0*.nii.gz"), emit: b0
12-
path "versions.yml" , emit: versions
11+
tuple val(meta), path("*_b0.nii.gz"), emit: b0
12+
tuple val(meta), path("*_copy_dwi.bval"), emit: bval, optional: true
13+
tuple val(meta), path("*_copy_dwi.bvec"), emit: bvec, optional: true
14+
path "versions.yml", emit: versions
1315

1416
when:
1517
task.ext.when == null || task.ext.when
@@ -19,13 +21,19 @@ process UTILS_EXTRACTB0 {
1921
def extraction_strategy = task.ext.b0_extraction_strategy ? "--$task.ext.b0_extraction_strategy" : "--mean"
2022
def b0_threshold = task.ext.b0_threshold ? "--b0_threshold $task.ext.b0_threshold" : ""
2123
def output_series = task.ext.output_series ? "" : "--single-image"
22-
24+
def extract_bval_bvec = task.ext.extract_bval_bvec ?: ""
2325
"""
2426
export OMP_NUM_THREADS=${task.ext.single_thread ? 1 : task.cpus}
2527
2628
scil_dwi_extract_b0 $dwi $bval $bvec ${prefix}_b0.nii.gz \
2729
$output_series $extraction_strategy $b0_threshold --skip_b0_check
2830
31+
if [[ "$extract_bval_bvec" ]];
32+
then
33+
cp $bval ${prefix}_copy_dwi.bval
34+
cp $bvec ${prefix}_copy_dwi.bvec
35+
fi
36+
2937
cat <<-END_VERSIONS > versions.yml
3038
"${task.process}":
3139
scilpy: \$(uv pip -q -n list | grep scilpy | tr -s ' ' | cut -d' ' -f2)
@@ -34,12 +42,19 @@ process UTILS_EXTRACTB0 {
3442

3543
stub:
3644
def prefix = task.ext.prefix ?: "${meta.id}"
45+
def extract_bval_bvec = task.ext.extract_bval_bvec ?: ""
3746

3847
"""
3948
scil_dwi_extract_b0 -h
4049
4150
touch ${prefix}_b0.nii.gz
4251
52+
if [[ "$extract_bval_bvec" ]];
53+
then
54+
touch ${prefix}_copy_dwi.bval
55+
touch ${prefix}_copy_dwi.bvec
56+
fi
57+
4358
cat <<-END_VERSIONS > versions.yml
4459
"${task.process}":
4560
scilpy: \$(uv pip -q -n list | grep scilpy | tr -s ' ' | cut -d' ' -f2)

‎modules/nf-neuro/utils/extractb0/meta.yml‎

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@ args:
5555
If output b0 volume has multiple time points, only outputs a single
5656
image instead of a numbered series of images.scil_dwi_extract_b0
5757
default: false
58+
- extract_bval_bvec:
59+
type: boolean
60+
description: If true, the command will also output bval and bvec files.
61+
default: false
5862
- single_thread:
5963
type: boolean
6064
description: If true, the command will be run in single-threaded mode. By default, the command will use multiple threads based on the number of CPUs allocated to the task.
@@ -66,12 +70,34 @@ output:
6670
description: |
6771
Groovy Map containing sample information
6872
e.g. `[ id:'test', single_end:false ]`
69-
- "*_b0*.nii.gz":
73+
- "*_b0.nii.gz":
7074
type: file
7175
description: b0 image(s) extracted from the DWI
7276
pattern: "*_b0*.{nii,nii.gz}"
7377
ontologies:
7478
- edam: http://edamontology.org/format_4001 # NIFTI format
79+
bval:
80+
- - meta:
81+
type: map
82+
description: |
83+
Groovy Map containing sample information
84+
e.g. `[ id:'test', single_end:false ]`
85+
- "*_copy_dwi.bval":
86+
type: file
87+
description: B-values corrected in FSL format
88+
pattern: "*_copy_dwi.bval"
89+
ontologies: []
90+
bvec:
91+
- - meta:
92+
type: map
93+
description: |
94+
Groovy Map containing sample information
95+
e.g. `[ id:'test', single_end:false ]`
96+
- "*_copy_dwi.bvec":
97+
type: file
98+
description: B-vectors corrected in FSL format
99+
pattern: "*_copy_dwi.bvec"
100+
ontologies: []
75101
versions:
76102
- versions.yml:
77103
type: file

‎modules/nf-neuro/utils/extractb0/tests/main.nf.test.snap‎

Lines changed: 126 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,24 @@
1212
]
1313
],
1414
"1": [
15+
[
16+
{
17+
"id": "test",
18+
"single_end": false
19+
},
20+
"test_copy_dwi.bval:md5,8192e97b08e8032382397bb844b31892"
21+
]
22+
],
23+
"2": [
24+
[
25+
{
26+
"id": "test",
27+
"single_end": false
28+
},
29+
"test_copy_dwi.bvec:md5,26483c1152a76a40bbfafdf81c7c491a"
30+
]
31+
],
32+
"3": [
1533
"versions.yml:md5,fad61b149ccbcf6af7c461efe4dbfdb8"
1634
],
1735
"b0": [
@@ -23,6 +41,24 @@
2341
"test_b0.nii.gz:md5,91288914a80e7866ef8b08a363d617f9"
2442
]
2543
],
44+
"bval": [
45+
[
46+
{
47+
"id": "test",
48+
"single_end": false
49+
},
50+
"test_copy_dwi.bval:md5,8192e97b08e8032382397bb844b31892"
51+
]
52+
],
53+
"bvec": [
54+
[
55+
{
56+
"id": "test",
57+
"single_end": false
58+
},
59+
"test_copy_dwi.bvec:md5,26483c1152a76a40bbfafdf81c7c491a"
60+
]
61+
],
2662
"versions": [
2763
"versions.yml:md5,fad61b149ccbcf6af7c461efe4dbfdb8"
2864
]
@@ -32,7 +68,7 @@
3268
"nf-test": "0.9.3",
3369
"nextflow": "25.10.2"
3470
},
35-
"timestamp": "2026-02-26T21:46:05.442335114"
71+
"timestamp": "2026-06-03T14:13:14.445764448"
3672
},
3773
"utils - extractb0 - all4d": {
3874
"content": [
@@ -47,6 +83,12 @@
4783
]
4884
],
4985
"1": [
86+
87+
],
88+
"2": [
89+
90+
],
91+
"3": [
5092
"versions.yml:md5,fad61b149ccbcf6af7c461efe4dbfdb8"
5193
],
5294
"b0": [
@@ -57,6 +99,12 @@
5799
},
58100
"test_b0.nii.gz:md5,2066111f2b964735a168d6c653ba1a8b"
59101
]
102+
],
103+
"bval": [
104+
105+
],
106+
"bvec": [
107+
60108
],
61109
"versions": [
62110
"versions.yml:md5,fad61b149ccbcf6af7c461efe4dbfdb8"
@@ -67,7 +115,7 @@
67115
"nf-test": "0.9.3",
68116
"nextflow": "25.10.2"
69117
},
70-
"timestamp": "2026-02-26T21:45:45.438834491"
118+
"timestamp": "2026-06-03T13:03:53.409721493"
71119
},
72120
"utils - extractb0 - stub-run": {
73121
"content": [
@@ -94,6 +142,12 @@
94142
]
95143
],
96144
"1": [
145+
146+
],
147+
"2": [
148+
149+
],
150+
"3": [
97151
"versions.yml:md5,fad61b149ccbcf6af7c461efe4dbfdb8"
98152
],
99153
"b0": [
@@ -104,6 +158,12 @@
104158
},
105159
"test_b0.nii.gz:md5,91288914a80e7866ef8b08a363d617f9"
106160
]
161+
],
162+
"bval": [
163+
164+
],
165+
"bvec": [
166+
107167
],
108168
"versions": [
109169
"versions.yml:md5,fad61b149ccbcf6af7c461efe4dbfdb8"
@@ -114,7 +174,7 @@
114174
"nf-test": "0.9.3",
115175
"nextflow": "25.10.2"
116176
},
117-
"timestamp": "2026-02-26T21:45:40.460043521"
177+
"timestamp": "2026-06-03T13:03:43.568800984"
118178
},
119179
"utils - extractb0 - clustermean": {
120180
"content": [
@@ -129,6 +189,24 @@
129189
]
130190
],
131191
"1": [
192+
[
193+
{
194+
"id": "test",
195+
"single_end": false
196+
},
197+
"test_copy_dwi.bval:md5,8192e97b08e8032382397bb844b31892"
198+
]
199+
],
200+
"2": [
201+
[
202+
{
203+
"id": "test",
204+
"single_end": false
205+
},
206+
"test_copy_dwi.bvec:md5,26483c1152a76a40bbfafdf81c7c491a"
207+
]
208+
],
209+
"3": [
132210
"versions.yml:md5,fad61b149ccbcf6af7c461efe4dbfdb8"
133211
],
134212
"b0": [
@@ -140,6 +218,24 @@
140218
"test_b0.nii.gz:md5,feb9010e5b72fc6f0c814f9dd54cb710"
141219
]
142220
],
221+
"bval": [
222+
[
223+
{
224+
"id": "test",
225+
"single_end": false
226+
},
227+
"test_copy_dwi.bval:md5,8192e97b08e8032382397bb844b31892"
228+
]
229+
],
230+
"bvec": [
231+
[
232+
{
233+
"id": "test",
234+
"single_end": false
235+
},
236+
"test_copy_dwi.bvec:md5,26483c1152a76a40bbfafdf81c7c491a"
237+
]
238+
],
143239
"versions": [
144240
"versions.yml:md5,fad61b149ccbcf6af7c461efe4dbfdb8"
145241
]
@@ -149,7 +245,7 @@
149245
"nf-test": "0.9.3",
150246
"nextflow": "25.10.2"
151247
},
152-
"timestamp": "2026-02-26T21:46:00.444860018"
248+
"timestamp": "2026-06-03T13:06:52.578633203"
153249
},
154250
"utils - extractb0 - clusterfirst": {
155251
"content": [
@@ -164,6 +260,12 @@
164260
]
165261
],
166262
"1": [
263+
264+
],
265+
"2": [
266+
267+
],
268+
"3": [
167269
"versions.yml:md5,fad61b149ccbcf6af7c461efe4dbfdb8"
168270
],
169271
"b0": [
@@ -174,6 +276,12 @@
174276
},
175277
"test_b0.nii.gz:md5,27e4aa847d60b2154d8865d19ba3e06e"
176278
]
279+
],
280+
"bval": [
281+
282+
],
283+
"bvec": [
284+
177285
],
178286
"versions": [
179287
"versions.yml:md5,fad61b149ccbcf6af7c461efe4dbfdb8"
@@ -184,7 +292,7 @@
184292
"nf-test": "0.9.3",
185293
"nextflow": "25.10.2"
186294
},
187-
"timestamp": "2026-02-26T21:45:55.406228795"
295+
"timestamp": "2026-06-03T13:04:13.598400748"
188296
},
189297
"utils - extractb0 - allseries": {
190298
"content": [
@@ -199,6 +307,12 @@
199307
]
200308
],
201309
"1": [
310+
311+
],
312+
"2": [
313+
314+
],
315+
"3": [
202316
"versions.yml:md5,fad61b149ccbcf6af7c461efe4dbfdb8"
203317
],
204318
"b0": [
@@ -209,6 +323,12 @@
209323
},
210324
"test_b0.nii.gz:md5,2066111f2b964735a168d6c653ba1a8b"
211325
]
326+
],
327+
"bval": [
328+
329+
],
330+
"bvec": [
331+
212332
],
213333
"versions": [
214334
"versions.yml:md5,fad61b149ccbcf6af7c461efe4dbfdb8"
@@ -219,6 +339,6 @@
219339
"nf-test": "0.9.3",
220340
"nextflow": "25.10.2"
221341
},
222-
"timestamp": "2026-02-26T21:45:50.479400627"
342+
"timestamp": "2026-06-03T13:04:03.466640917"
223343
}
224344
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
process {
22
withName: "UTILS_EXTRACTB0" {
33
ext.b0_extraction_strategy = "cluster-mean"
4+
ext.extract_bval_bvec = true
45
}
56
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
process {
22
withName: "UTILS_EXTRACTB0" {
33
ext.b0_extraction_strategy = "mean"
4+
ext.extract_bval_bvec = true
45
}
56
}

‎subworkflows/nf-neuro/preproc_dwi/main.nf‎

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -274,18 +274,12 @@ workflow PREPROC_DWI {
274274
ch_dwi_preproc = ch_dwi
275275
.map{ meta, dwi, _bval, _bvec -> [ meta, dwi ] }
276276

277-
ch_bval = ch_dwi
278-
.map{ meta, _dwi, bval, _bvec -> [ meta, bval ] }
279-
280-
ch_bvec = ch_dwi
281-
.map{ meta, _dwi, _bval, bvec -> [ meta, bvec ] }
282-
283277
emit:
284278
dwi = ch_dwi_preproc // channel: [ val(meta), dwi-preproc ]
285-
bval = ch_bval // channel: [ val(meta), bval-corrected ]
286-
bvec = ch_bvec // channel: [ val(meta), bvec-corrected ]
279+
bval = EXTRACT_B0.out.bval // channel: [ val(meta), bval-corrected ]
280+
bvec = EXTRACT_B0.out.bvec // channel: [ val(meta), bvec-corrected ]
287281
pwd_avg = ch_pwd_avg // channel: [ val(meta), pwd-avg ]
288-
b0 = EXTRACT_B0.out.b0 // channel: [ val(meta), b0-preproc ]
282+
b0 = EXTRACT_B0.out.b0 // channel: [ val(meta), b0-preproc ]
289283
b0_mask = ch_mask // channel: [ val(meta), b0-mask ]
290284
dwi_bounding_box = ch_bbox // channel: [ val(meta), dwi-bounding-box ]
291285
mqc = ch_multiqc_files // channel: [ val(meta), mqc ]

0 commit comments

Comments
 (0)