From ce31460ca1a74170492fb0baff217fd0e7a40b80 Mon Sep 17 00:00:00 2001 From: Patrick Sadil Date: Tue, 1 Oct 2024 22:32:48 -0400 Subject: [PATCH] FIX: Repair search for precomputed transforms (#3369) --- fmriprep/data/io_spec.json | 4 +-- fmriprep/utils/bids.py | 17 ++++++--- fmriprep/utils/tests/test_derivative_cache.py | 36 +++++++++++++++++++ 3 files changed, 50 insertions(+), 7 deletions(-) create mode 100644 fmriprep/utils/tests/test_derivative_cache.py diff --git a/fmriprep/data/io_spec.json b/fmriprep/data/io_spec.json index 5d90f184c..364cff7e3 100644 --- a/fmriprep/data/io_spec.json +++ b/fmriprep/data/io_spec.json @@ -33,7 +33,7 @@ }, "boldref2anat": { "datatype": "func", - "from": "orig", + "from": "boldref", "to": "anat", "mode": "image", "suffix": "xfm", @@ -41,7 +41,7 @@ }, "boldref2fmap": { "datatype": "func", - "from": "orig", + "from": "boldref", "mode": "image", "suffix": "xfm", "extension": ".txt" diff --git a/fmriprep/utils/bids.py b/fmriprep/utils/bids.py index 0bdc03ff1..b29275475 100644 --- a/fmriprep/utils/bids.py +++ b/fmriprep/utils/bids.py @@ -68,14 +68,21 @@ def collect_derivatives( continue derivs_cache[f'{k}_boldref'] = item[0] if len(item) == 1 else item + transforms_cache = {} for xfm, q in spec['transforms'].items(): - query = {**q, **entities} - if xfm == 'boldref2fmap': - query['to'] = fieldmap_id - item = layout.get(return_type='filename', **q) + # Transform extension will often not match provided entities + # (e.g., ".nii.gz" vs ".txt"). + # And transform suffixes will be "xfm", + # whereas relevant src file will be "bold". + query = {**entities, **q} + if xfm == 'boldref2fmap' and fieldmap_id: + # fieldmaps have ids like auto_00000 + query['to'] = fieldmap_id.replace('_', '') + item = layout.get(return_type='filename', **query) if not item: continue - derivs_cache[xfm] = item[0] if len(item) == 1 else item + transforms_cache[xfm] = item[0] if len(item) == 1 else item + derivs_cache['transforms'] = transforms_cache return derivs_cache diff --git a/fmriprep/utils/tests/test_derivative_cache.py b/fmriprep/utils/tests/test_derivative_cache.py new file mode 100644 index 000000000..1a2c59acc --- /dev/null +++ b/fmriprep/utils/tests/test_derivative_cache.py @@ -0,0 +1,36 @@ +from pathlib import Path + +import pytest + +from fmriprep.utils import bids + + +@pytest.mark.parametrize('xfm', ['boldref2fmap', 'boldref2anat', 'hmc']) +def test_transforms_found_as_str(tmp_path: Path, xfm: str): + subject = '0' + task = 'rest' + fromto = { + 'hmc': 'from-orig_to-boldref', + 'boldref2fmap': 'from-boldref_to-auto00000', + 'boldref2anat': 'from-boldref_to-anat', + }[xfm] + + to_find = tmp_path.joinpath( + f'sub-{subject}', 'func', f'sub-{subject}_task-{task}_{fromto}_mode-image_xfm.txt' + ) + to_find.parent.mkdir(parents=True) + to_find.touch() + + entities = { + 'subject': subject, + 'task': task, + 'suffix': 'bold', + 'extension': '.nii.gz', + } + + derivs = bids.collect_derivatives( + derivatives_dir=tmp_path, + entities=entities, + fieldmap_id='auto_00000', + ) + assert derivs == {'transforms': {xfm: str(to_find)}}