Skip to content

Commit b40d23a

Browse files
authored
Merge pull request #312 from effigies/enh/decouple_epi
ENH: Split SyN fieldmap estimates per-EPI
2 parents 014da25 + f091c80 commit b40d23a

File tree

1 file changed

+40
-33
lines changed

1 file changed

+40
-33
lines changed

sdcflows/utils/wrangler.py

Lines changed: 40 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -182,9 +182,11 @@ def find_estimators(
182182
... force_fmapless=True,
183183
... ) # doctest: +ELLIPSIS
184184
[FieldmapEstimation(sources=<3 files>, method=<EstimatorType.PHASEDIFF: 3>,
185-
bids_id='auto_00000'),
186-
FieldmapEstimation(sources=<3 files>, method=<EstimatorType.ANAT: 5>,
187-
bids_id='auto_00001')]
185+
bids_id='auto_...'),
186+
FieldmapEstimation(sources=<2 files>, method=<EstimatorType.ANAT: 5>,
187+
bids_id='auto_...'),
188+
FieldmapEstimation(sources=<2 files>, method=<EstimatorType.ANAT: 5>,
189+
bids_id='auto_...')]
188190
189191
Likewise in a more comprehensive dataset:
190192
@@ -194,13 +196,23 @@ def find_estimators(
194196
... force_fmapless=True,
195197
... ) # doctest: +ELLIPSIS
196198
[FieldmapEstimation(sources=<4 files>, method=<EstimatorType.PEPOLAR: 2>,
197-
bids_id='auto_00002'),
198-
FieldmapEstimation(sources=<7 files>, method=<EstimatorType.ANAT: 5>,
199-
bids_id='auto_00003'),
199+
bids_id='auto_...'),
200+
FieldmapEstimation(sources=<2 files>, method=<EstimatorType.ANAT: 5>,
201+
bids_id='auto_...'),
202+
FieldmapEstimation(sources=<2 files>, method=<EstimatorType.ANAT: 5>,
203+
bids_id='auto_...'),
200204
FieldmapEstimation(sources=<2 files>, method=<EstimatorType.ANAT: 5>,
201-
bids_id='auto_00004'),
205+
bids_id='auto_...'),
202206
FieldmapEstimation(sources=<2 files>, method=<EstimatorType.ANAT: 5>,
203-
bids_id='auto_00005')]
207+
bids_id='auto_...'),
208+
FieldmapEstimation(sources=<2 files>, method=<EstimatorType.ANAT: 5>,
209+
bids_id='auto_...'),
210+
FieldmapEstimation(sources=<2 files>, method=<EstimatorType.ANAT: 5>,
211+
bids_id='auto_...'),
212+
FieldmapEstimation(sources=<2 files>, method=<EstimatorType.ANAT: 5>,
213+
bids_id='auto_...'),
214+
FieldmapEstimation(sources=<2 files>, method=<EstimatorType.ANAT: 5>,
215+
bids_id='auto_...')]
204216
205217
Because "*dataset A*" contains very few metadata fields available, "*fieldmap-less*"
206218
heuristics come back empty (BOLD and DWI files are missing
@@ -239,9 +251,9 @@ def find_estimators(
239251
... force_fmapless=False,
240252
... ) # doctest: +ELLIPSIS
241253
[FieldmapEstimation(sources=<2 files>, method=<EstimatorType.ANAT: 5>,
242-
bids_id='auto_00011'),
254+
bids_id='auto_...'),
243255
FieldmapEstimation(sources=<2 files>, method=<EstimatorType.ANAT: 5>,
244-
bids_id='auto_00012')]
256+
bids_id='auto_...')]
245257
246258
When the ``B0FieldIdentifier`` metadata is set for one or more fieldmaps, then
247259
the heuristics that use ``IntendedFor`` are dismissed:
@@ -266,7 +278,7 @@ def find_estimators(
266278
[FieldmapEstimation(sources=<5 files>, method=<EstimatorType.PEPOLAR: 2>,
267279
bids_id='pepolar4pe'),
268280
FieldmapEstimation(sources=<2 files>, method=<EstimatorType.ANAT: 5>,
269-
bids_id='auto_00000')]
281+
bids_id='auto_...')]
270282
271283
"""
272284
from .misc import create_logger
@@ -503,28 +515,23 @@ def find_estimators(
503515
meta.update({"TotalReadoutTime": ro})
504516
epi_targets.append(fm.FieldmapFile(candidate.path, metadata=meta))
505517

506-
for pe_dir in sorted(set(pe_dirs)):
507-
pe_ro = [ro for ro, pe in zip(ro_totals, pe_dirs) if pe == pe_dir]
508-
for ro_time in sorted(set(pe_ro)):
509-
fmfiles, fmpaths = tuple(
510-
zip(
511-
*[
512-
(target, str(Path(target.path).relative_to(subject_root)))
513-
for i, target in enumerate(epi_targets)
514-
if pe_dirs[i] == pe_dir and ro_totals[i] == ro_time
515-
]
516-
)
517-
)
518-
e = fm.FieldmapEstimation(
519-
[
520-
fm.FieldmapFile(
521-
anat_file[0], metadata={"IntendedFor": fmpaths}
522-
),
523-
*fmfiles,
524-
]
525-
)
526-
_log_debug_estimation(logger, e, layout.root)
527-
estimators.append(e)
518+
trivial_estimators = [
519+
[
520+
fm.FieldmapFile(
521+
anat_file[0],
522+
metadata={"IntendedFor": str(Path(epi.path).relative_to(subject_root))},
523+
),
524+
epi,
525+
] for epi in epi_targets
526+
]
527+
528+
# TODO: Grouping could be done here; previously we grouped by (pe_dir, ro_time) pairs
529+
syn_estimators = [fm.FieldmapEstimation(e) for e in trivial_estimators]
530+
531+
for e in syn_estimators:
532+
_log_debug_estimation(logger, e, layout.root)
533+
534+
estimators.extend(syn_estimators)
528535

529536
return estimators
530537

0 commit comments

Comments
 (0)