Skip to content

Commit dd198ad

Browse files
committed
Repair search for precomputed transforms
1 parent f991740 commit dd198ad

File tree

2 files changed

+62
-4
lines changed

2 files changed

+62
-4
lines changed

fmriprep/utils/bids.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,14 +68,28 @@ def collect_derivatives(
6868
continue
6969
derivs_cache[f'{k}_boldref'] = item[0] if len(item) == 1 else item
7070

71+
transforms_cache = {}
7172
for xfm, q in spec['transforms'].items():
72-
query = {**q, **entities}
73+
# Transform extension will often not match provided entities
74+
# (e.g., ".nii.gz" vs ".txt").
75+
# And transform suffixes will be "xfm",
76+
# whereas relevant src file will be "bold".
77+
query = {
78+
**q,
79+
**{
80+
k: v
81+
for k, v in entities.items()
82+
if k not in ['suffix', 'extension']
83+
},
84+
}
7385
if xfm == 'boldref2fmap':
74-
query['to'] = fieldmap_id
75-
item = layout.get(return_type='filename', **q)
86+
# fieldmaps have ids like auto_00000
87+
query['to'] = fieldmap_id.replace('_', '')
88+
item = layout.get(return_type='filename', **query)
7689
if not item:
7790
continue
78-
derivs_cache[xfm] = item[0] if len(item) == 1 else item
91+
transforms_cache[xfm] = item[0] if len(item) == 1 else item
92+
derivs_cache['transforms'] = transforms_cache
7993
return derivs_cache
8094

8195

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import json
2+
from pathlib import Path
3+
4+
import pytest
5+
6+
from fmriprep.data import load as load_data
7+
from fmriprep.utils import bids
8+
9+
10+
@pytest.mark.parametrize('xfm', ['boldref2fmap', 'boldref2anat', 'hmc'])
11+
def test_transforms_found_as_str(tmp_path: Path, xfm: str):
12+
spec = (
13+
json.loads(load_data.readable('io_spec.json').read_text())
14+
.get('queries')
15+
.get('transforms')
16+
.get(xfm)
17+
)
18+
entities = {
19+
'subject': '0',
20+
'task': 'rest',
21+
'suffix': 'bold',
22+
'extension': '.nii.gz',
23+
}
24+
if xfm == 'boldref2fmap':
25+
to_find = f'sub-{entities['subject']}_task-{entities['task']} \
26+
_from-{spec['from']}_to-auto00000_mode-image_xfm.txt'
27+
else:
28+
to_find = f'sub-{entities['subject']}_task-{entities['task']} \
29+
_from-{spec['from']}_to-{spec['to']}_mode-image_xfm.txt'
30+
31+
funcd = tmp_path / f'sub-{entities['subject']}' / 'func'
32+
funcd.mkdir(parents=True)
33+
(funcd / to_find).touch()
34+
35+
derivs = bids.collect_derivatives(
36+
derivatives_dir=tmp_path,
37+
entities=entities,
38+
fieldmap_id='auto_00000',
39+
)
40+
transforms_in_derivs = 'transforms' in derivs
41+
xfm_in_transforms = xfm in derivs.get('transforms')
42+
transform_is_str = isinstance(derivs.get('transforms').get(xfm), str)
43+
assert all((transforms_in_derivs, xfm_in_transforms, transform_is_str))
44+

0 commit comments

Comments
 (0)