Skip to content

Commit d24f585

Browse files
authored
Exclude echo entity from optimally combined derivatives (#3166)
Closes #3165. - Ensure that the echo entity is removed from CIFTI optimally combined derivatives. - Ensure that the echo entity is _retained_ in derivatives when `--echo-idx` is used to process multi-echo data like single-echo. - I initially ran the ds210 test with `--echo-idx 1` to determine if `echo` was being retained in the filenames. It wasn't, but the `dismiss_echo` function fixed that. - Add function, `fmriprep.utils.bids.dismiss_echo`, to include `echo` in `dismiss_entities` parameters only when applicable, based on the config.
2 parents 3c836e8 + fa402de commit d24f585

File tree

6 files changed

+49
-25
lines changed

6 files changed

+49
-25
lines changed

fmriprep/utils/bids.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
from bids.utils import listify
3535
from packaging.version import Version
3636

37+
from .. import config
3738
from ..data import load as load_data
3839

3940

@@ -324,3 +325,15 @@ def _unique(inlist):
324325
return inlist
325326

326327
return {k: _unique(v) for k, v in entities.items()}
328+
329+
330+
def dismiss_echo(entities=None):
331+
"""Set entities to dismiss in a DerivativesDataSink."""
332+
if entities is None:
333+
entities = []
334+
335+
echo_idx = config.execution.echo_idx
336+
if echo_idx is None or len(listify(echo_idx)) > 2:
337+
entities.append("echo")
338+
339+
return entities

fmriprep/workflows/base.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
from .. import config
4444
from ..interfaces import DerivativesDataSink
4545
from ..interfaces.reports import AboutSummary, SubjectSummary
46+
from ..utils.bids import dismiss_echo
4647

4748

4849
def init_fmriprep_wf():
@@ -296,7 +297,7 @@ def init_single_subject_wf(subject_id: str):
296297
base_directory=config.execution.fmriprep_dir,
297298
desc='summary',
298299
datatype="figures",
299-
dismiss_entities=("echo",),
300+
dismiss_entities=dismiss_echo(),
300301
),
301302
name='ds_report_summary',
302303
run_without_submitting=True,
@@ -307,7 +308,7 @@ def init_single_subject_wf(subject_id: str):
307308
base_directory=config.execution.fmriprep_dir,
308309
desc='about',
309310
datatype="figures",
310-
dismiss_entities=("echo",),
311+
dismiss_entities=dismiss_echo(),
311312
),
312313
name='ds_report_about',
313314
run_without_submitting=True,

fmriprep/workflows/bold/base.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939

4040
from ... import config
4141
from ...interfaces import DerivativesDataSink
42+
from ...utils.bids import dismiss_echo
4243
from ...utils.misc import estimate_bold_mem_usage
4344

4445
# BOLD workflows
@@ -367,7 +368,7 @@ def init_bold_wf(
367368
DerivativesDataSink(
368369
desc="t2scomp",
369370
datatype="figures",
370-
dismiss_entities=("echo",),
371+
dismiss_entities=dismiss_echo(),
371372
),
372373
name="ds_report_t2scomp",
373374
run_without_submitting=True,
@@ -377,7 +378,7 @@ def init_bold_wf(
377378
DerivativesDataSink(
378379
desc="t2starhist",
379380
datatype="figures",
380-
dismiss_entities=("echo",),
381+
dismiss_entities=dismiss_echo(),
381382
),
382383
name="ds_report_t2star_hist",
383384
run_without_submitting=True,
@@ -532,6 +533,7 @@ def init_bold_wf(
532533
ds_bold_cifti = pe.Node(
533534
DerivativesDataSink(
534535
base_directory=fmriprep_dir,
536+
dismiss_entities=dismiss_echo(),
535537
space='fsLR',
536538
density=config.workflow.cifti_output,
537539
suffix='bold',
@@ -603,7 +605,7 @@ def init_bold_wf(
603605
base_directory=fmriprep_dir,
604606
desc='confounds',
605607
suffix='timeseries',
606-
dismiss_entities=("echo",),
608+
dismiss_entities=dismiss_echo(),
607609
),
608610
name="ds_confounds",
609611
run_without_submitting=True,

fmriprep/workflows/bold/confounds.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
GatherConfounds,
4141
RenameACompCor,
4242
)
43+
from ...utils.bids import dismiss_echo
4344

4445

4546
def init_bold_confs_wf(
@@ -442,7 +443,7 @@ def init_bold_confs_wf(
442443
)
443444

444445
ds_report_bold_rois = pe.Node(
445-
DerivativesDataSink(desc="rois", datatype="figures", dismiss_entities=("echo",)),
446+
DerivativesDataSink(desc="rois", datatype="figures", dismiss_entities=dismiss_echo()),
446447
name="ds_report_bold_rois",
447448
run_without_submitting=True,
448449
mem_gb=DEFAULT_MEMORY_MIN_GB,
@@ -461,7 +462,9 @@ def init_bold_confs_wf(
461462
)
462463

463464
ds_report_compcor = pe.Node(
464-
DerivativesDataSink(desc="compcorvar", datatype="figures", dismiss_entities=("echo",)),
465+
DerivativesDataSink(
466+
desc="compcorvar", datatype="figures", dismiss_entities=dismiss_echo()
467+
),
465468
name="ds_report_compcor",
466469
run_without_submitting=True,
467470
mem_gb=DEFAULT_MEMORY_MIN_GB,
@@ -473,7 +476,9 @@ def init_bold_confs_wf(
473476
name="conf_corr_plot",
474477
)
475478
ds_report_conf_corr = pe.Node(
476-
DerivativesDataSink(desc="confoundcorr", datatype="figures", dismiss_entities=("echo",)),
479+
DerivativesDataSink(
480+
desc="confoundcorr", datatype="figures", dismiss_entities=dismiss_echo()
481+
),
477482
name="ds_report_conf_corr",
478483
run_without_submitting=True,
479484
mem_gb=DEFAULT_MEMORY_MIN_GB,
@@ -683,7 +688,7 @@ def init_carpetplot_wf(
683688
)
684689
ds_report_bold_conf = pe.Node(
685690
DerivativesDataSink(
686-
desc="carpetplot", datatype="figures", extension="svg", dismiss_entities=("echo",)
691+
desc="carpetplot", datatype="figures", extension="svg", dismiss_entities=dismiss_echo()
687692
),
688693
name="ds_report_bold_conf",
689694
run_without_submitting=True,

fmriprep/workflows/bold/outputs.py

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
from fmriprep import config
3636
from fmriprep.config import DEFAULT_MEMORY_MIN_GB
3737
from fmriprep.interfaces import DerivativesDataSink
38+
from fmriprep.utils.bids import dismiss_echo
3839

3940

4041
def prepare_timing_parameters(metadata: dict):
@@ -217,7 +218,7 @@ def init_func_fit_reports_wf(
217218
base_directory=output_dir,
218219
desc="summary",
219220
datatype="figures",
220-
dismiss_entities=("echo",),
221+
dismiss_entities=dismiss_echo(),
221222
),
222223
name="ds_report_summary",
223224
run_without_submitting=True,
@@ -229,7 +230,7 @@ def init_func_fit_reports_wf(
229230
base_directory=output_dir,
230231
desc="validation",
231232
datatype="figures",
232-
dismiss_entities=("echo",),
233+
dismiss_entities=dismiss_echo(),
233234
),
234235
name="ds_report_validation",
235236
run_without_submitting=True,
@@ -333,7 +334,7 @@ def init_func_fit_reports_wf(
333334
desc="fmapCoreg",
334335
suffix="bold",
335336
datatype="figures",
336-
dismiss_entities=("echo",),
337+
dismiss_entities=dismiss_echo(),
337338
),
338339
name="ds_sdcreg_report",
339340
)
@@ -355,7 +356,7 @@ def init_func_fit_reports_wf(
355356
desc="sdc",
356357
suffix="bold",
357358
datatype="figures",
358-
dismiss_entities=("echo",),
359+
dismiss_entities=dismiss_echo(),
359360
),
360361
name="ds_sdc_report",
361362
)
@@ -404,7 +405,7 @@ def init_func_fit_reports_wf(
404405
desc="coreg",
405406
suffix="bold",
406407
datatype="figures",
407-
dismiss_entities=("echo",),
408+
dismiss_entities=dismiss_echo(),
408409
),
409410
name="ds_epi_t1_report",
410411
)
@@ -446,7 +447,7 @@ def init_ds_boldref_wf(
446447
desc=desc,
447448
suffix="boldref",
448449
compress=True,
449-
dismiss_entities=("echo",),
450+
dismiss_entities=dismiss_echo(),
450451
),
451452
name="ds_boldref",
452453
run_without_submitting=True,
@@ -490,7 +491,7 @@ def init_ds_registration_wf(
490491
mode='image',
491492
suffix='xfm',
492493
extension='.txt',
493-
dismiss_entities=('echo', 'part'),
494+
dismiss_entities=dismiss_echo(["part"]),
494495
**{'from': source, 'to': dest},
495496
),
496497
name='ds_xform',
@@ -535,7 +536,7 @@ def init_ds_hmc_wf(
535536
suffix="xfm",
536537
extension=".txt",
537538
compress=True,
538-
dismiss_entities=("echo",),
539+
dismiss_entities=dismiss_echo(),
539540
**{"from": "orig", "to": "boldref"},
540541
),
541542
name="ds_xforms",
@@ -593,7 +594,7 @@ def init_ds_bold_native_wf(
593594
desc='brain',
594595
suffix='mask',
595596
compress=True,
596-
dismiss_entities=("echo",),
597+
dismiss_entities=dismiss_echo(),
597598
),
598599
name='ds_bold_mask',
599600
run_without_submitting=True,
@@ -615,7 +616,7 @@ def init_ds_bold_native_wf(
615616
compress=True,
616617
SkullStripped=multiecho,
617618
TaskName=metadata.get('TaskName'),
618-
dismiss_entities=("echo",),
619+
dismiss_entities=dismiss_echo(),
619620
**timing_parameters,
620621
),
621622
name='ds_bold',
@@ -640,7 +641,7 @@ def init_ds_bold_native_wf(
640641
space='boldref',
641642
suffix='T2starmap',
642643
compress=True,
643-
dismiss_entities=("echo",),
644+
dismiss_entities=dismiss_echo(),
644645
**t2star_meta,
645646
),
646647
name='ds_t2star_bold',
@@ -726,7 +727,7 @@ def init_ds_volumes_wf(
726727
compress=True,
727728
SkullStripped=multiecho,
728729
TaskName=metadata.get('TaskName'),
729-
dismiss_entities=("echo",),
730+
dismiss_entities=dismiss_echo(),
730731
**timing_parameters,
731732
),
732733
name='ds_bold',
@@ -769,7 +770,7 @@ def init_ds_volumes_wf(
769770
base_directory=output_dir,
770771
suffix='boldref',
771772
compress=True,
772-
dismiss_entities=("echo",),
773+
dismiss_entities=dismiss_echo(),
773774
),
774775
name='ds_ref',
775776
run_without_submitting=True,
@@ -781,7 +782,7 @@ def init_ds_volumes_wf(
781782
desc='brain',
782783
suffix='mask',
783784
compress=True,
784-
dismiss_entities=("echo",),
785+
dismiss_entities=dismiss_echo(),
785786
),
786787
name='ds_mask',
787788
run_without_submitting=True,
@@ -809,7 +810,7 @@ def init_ds_volumes_wf(
809810
base_directory=output_dir,
810811
suffix='T2starmap',
811812
compress=True,
812-
dismiss_entities=("echo",),
813+
dismiss_entities=dismiss_echo(),
813814
**t2star_meta,
814815
),
815816
name='ds_t2star_std',
@@ -905,7 +906,7 @@ def init_bold_preproc_report_wf(
905906
base_directory=reportlets_dir,
906907
desc='preproc',
907908
datatype="figures",
908-
dismiss_entities=("echo",),
909+
dismiss_entities=dismiss_echo(),
909910
),
910911
name='ds_report_bold',
911912
mem_gb=DEFAULT_MEMORY_MIN_GB,

fmriprep/workflows/bold/resampling.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444

4545
from ...config import DEFAULT_MEMORY_MIN_GB
4646
from ...interfaces.workbench import MetricDilate, MetricMask, MetricResample
47+
from ...utils.bids import dismiss_echo
4748
from .outputs import prepare_timing_parameters
4849

4950

@@ -181,6 +182,7 @@ def select_target(subject_id, space):
181182
DerivativesDataSink(
182183
base_directory=output_dir,
183184
extension=".func.gii",
185+
dismiss_entities=dismiss_echo(),
184186
TaskName=metadata.get('TaskName'),
185187
**timing_parameters,
186188
),

0 commit comments

Comments
 (0)