diff --git a/fmriprep/workflows/base.py b/fmriprep/workflows/base.py index a27a04157..44368f1d4 100644 --- a/fmriprep/workflows/base.py +++ b/fmriprep/workflows/base.py @@ -429,10 +429,20 @@ def init_single_subject_wf(subject_id: str): fmap_estimators = [fmap for fmap in fmap_estimators if fmap.bids_id in used_estimators] + # Simplification: Unused estimators are removed from registry + # This fiddles with a private attribute, so it may break in future + # versions. However, it does mean the BOLD workflow doesn't need to + # replicate the logic that got us to the pared down set of estimators + # here. + final_ids = {fmap.bids_id for fmap in fmap_estimators} + unused_ids = fm._estimators.keys() - final_ids + for bids_id in unused_ids: + del fm._estimators[bids_id] + if fmap_estimators: config.loggers.workflow.info( "B0 field inhomogeneity map will be estimated with " - f" the following {len(fmap_estimators)} estimators: " + f"the following {len(fmap_estimators)} estimator(s): " f"{[e.method for e in fmap_estimators]}." ) @@ -563,8 +573,8 @@ def init_single_subject_wf(subject_id: str): elif estimator.method == fm.EstimatorType.ANAT: from sdcflows.workflows.fit.syn import init_syn_preprocessing_wf - sources = [str(s.path) for s in estimator.sources if s.suffix == "bold"] - source_meta = [s.metadata for s in estimator.sources if s.suffix == "bold"] + sources = [str(s.path) for s in estimator.sources if s.suffix in ("bold", "sbref")] + source_meta = [s.metadata for s in estimator.sources if s.suffix in ("bold", "sbref")] syn_preprocessing_wf = init_syn_preprocessing_wf( omp_nthreads=config.nipype.omp_nthreads, debug=config.execution.sloppy, diff --git a/fmriprep/workflows/bold/base.py b/fmriprep/workflows/bold/base.py index ab6cdc1ee..aabe49c9e 100644 --- a/fmriprep/workflows/bold/base.py +++ b/fmriprep/workflows/bold/base.py @@ -289,7 +289,14 @@ def init_func_preproc_wf(bold_file, has_fieldmap=False): config.loggers.workflow.info(sbref_msg) if has_fieldmap: - estimator_key = get_estimator(layout, bold_file if not multiecho else bold_file[0]) + from sdcflows import fieldmaps as fm + + # We may have pruned the estimator collection due to `--ignore fieldmaps` + estimator_key = [ + key + for key in get_estimator(layout, bold_file if not multiecho else bold_file[0]) + if key in fm._estimators + ] if not estimator_key: has_fieldmap = False