@@ -67,7 +67,7 @@ def init_sdc_estimate_wf(fmaps, epi_meta, omp_nthreads=1, debug=False, ignore=No
67
67
Outputs
68
68
-------
69
69
epi_file
70
- An unwarped EPI scan reference
70
+ The EPI scan reference after unwarping.
71
71
epi_mask
72
72
The corresponding new mask after unwarping
73
73
epi_brain
@@ -77,6 +77,8 @@ def init_sdc_estimate_wf(fmaps, epi_meta, omp_nthreads=1, debug=False, ignore=No
77
77
syn_ref
78
78
If ``--force-syn``, an unwarped EPI scan reference with this
79
79
method (for reporting purposes)
80
+ method : str
81
+ Short description of the estimation method that was run.
80
82
81
83
"""
82
84
workflow = Workflow (name = 'sdc_estimate_wf' if fmaps else 'sdc_bypass_wf' )
@@ -162,23 +164,37 @@ def init_sdc_estimate_wf(fmaps, epi_meta, omp_nthreads=1, debug=False, ignore=No
162
164
163
165
if 'fieldmap' in fmaps :
164
166
from .fmap import init_fmap_wf
167
+ try :
168
+ fmap , = fmaps ['fieldmap' ]
169
+ except ValueError :
170
+ LOGGER .warning ('Several B0 fieldmaps found for the given target, using '
171
+ 'the first one.' )
172
+ fmap = fmaps ['fieldmap' ][0 ]
173
+
165
174
outputnode .inputs .method = 'FMB (fieldmap-based) - directly measured B0 map'
166
175
fmap_wf = init_fmap_wf (
167
176
omp_nthreads = omp_nthreads ,
168
177
fmap_bspline = False )
169
178
# set inputs
170
179
fmap_wf .inputs .inputnode .magnitude = [
171
- m for m , _ in fmaps [ 'fieldmap' ] ['magnitude' ]]
180
+ m for m , _ in fmap ['magnitude' ]]
172
181
fmap_wf .inputs .inputnode .fieldmap = [
173
- m for m , _ in fmaps [ 'fieldmap' ] ['fieldmap' ]]
182
+ m for m , _ in fmap ['fieldmap' ]]
174
183
elif 'phasediff' in fmaps :
175
184
from .phdiff import init_phdiff_wf
185
+ try :
186
+ fmap , = fmaps ['phasediff' ]
187
+ except ValueError :
188
+ LOGGER .warning ('Several phase-difference maps found for the given target, using '
189
+ 'the first one.' )
190
+ fmap = fmaps ['phasediff' ][0 ]
191
+
176
192
outputnode .inputs .method = 'FMB (fieldmap-based) - phase-difference map'
177
193
fmap_wf = init_phdiff_wf (omp_nthreads = omp_nthreads )
178
194
# set inputs
179
195
fmap_wf .inputs .inputnode .magnitude = [
180
- m for m , _ in fmaps [ 'phasediff' ] ['magnitude' ]]
181
- fmap_wf .inputs .inputnode .phasediff = fmaps [ 'phasediff' ] ['phases' ]
196
+ m for m , _ in fmap ['magnitude' ]]
197
+ fmap_wf .inputs .inputnode .phasediff = fmap ['phases' ]
182
198
183
199
fmap2field_wf = init_fmap2field_wf (omp_nthreads = omp_nthreads , debug = debug )
184
200
fmap2field_wf .inputs .inputnode .metadata = epi_meta
@@ -242,3 +258,38 @@ def init_sdc_estimate_wf(fmaps, epi_meta, omp_nthreads=1, debug=False, ignore=No
242
258
])
243
259
244
260
return workflow
261
+
262
+
263
+ def fieldmap_wrangler (layout , target_image , use_syn = False , force_syn = False ):
264
+ """Query the BIDSLayout for fieldmaps, and arrange them for the orchestration workflow."""
265
+ from collections import defaultdict
266
+ fmap_bids = layout .get_fieldmap (target_image , return_list = True )
267
+ fieldmaps = defaultdict (list )
268
+ for fmap in fmap_bids :
269
+ if fmap ['suffix' ] == 'epi' :
270
+ fieldmaps ['epi' ].append ((fmap ['epi' ], layout .get_metadata (fmap ['epi' ])))
271
+
272
+ if fmap ['suffix' ] == 'fieldmap' :
273
+ fieldmaps ['fieldmap' ].append ({
274
+ 'magnitude' : [(fmap ['magnitude' ], layout .get_metadata (fmap ['magnitude' ]))],
275
+ 'fieldmap' : [(fmap ['fieldmap' ], layout .get_metadata (fmap ['fieldmap' ]))],
276
+ })
277
+
278
+ if fmap ['suffix' ] == 'phasediff' :
279
+ fieldmaps ['phasediff' ].append ({
280
+ 'magnitude' : [(fmap [k ], layout .get_metadata (fmap [k ]))
281
+ for k in sorted (fmap .keys ()) if k .startswith ('magnitude' )],
282
+ 'phases' : [(fmap ['phasediff' ], layout .get_metadata (fmap ['phasediff' ]))],
283
+ })
284
+
285
+ if fmap ['suffix' ] == 'phase' :
286
+ fieldmaps ['phasediff' ].append ({
287
+ 'magnitude' : [(fmap [k ], layout .get_metadata (fmap [k ]))
288
+ for k in sorted (fmap .keys ()) if k .startswith ('magnitude' )],
289
+ 'phases' : [(fmap [k ], layout .get_metadata (fmap [k ]))
290
+ for k in sorted (fmap .keys ()) if k .startswith ('phase' )],
291
+ })
292
+
293
+ if force_syn is True or (not fieldmaps and use_syn is True ):
294
+ fieldmaps ['syn' ] = force_syn
295
+ return fieldmaps
0 commit comments