Skip to content

Commit e791f85

Browse files
committed
FIX: Normalize BIDS-URIs to subject-relative
1 parent 18e5e95 commit e791f85

File tree

2 files changed

+48
-4
lines changed

2 files changed

+48
-4
lines changed

sdcflows/utils/tests/test_wrangler.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1-
import pytest
1+
import re
2+
from pathlib import Path
23
from shutil import rmtree
34

5+
import pytest
6+
47
from niworkflows.utils.testing import generate_bids_skeleton
58

69
from sdcflows.utils.wrangler import find_estimators
7-
from sdcflows.fieldmaps import clear_registry
10+
from sdcflows.fieldmaps import clear_registry, get_identifier
811

912

1013
def gen_layout(bids_dir, database_dir=None):
@@ -339,6 +342,12 @@ def test_wrangler_URIs(tmpdir, name, skeleton, session, estimations, total_estim
339342
sessions=[session] if session else None,
340343
)
341344
assert len(est) == estimations or total_estimations
345+
if session:
346+
bold = layout.get(session=session, suffix="bold", extension=".nii.gz")[0]
347+
intended_rel = re.sub(r'^sub-[a-zA-Z0-9]*/', '', str(Path(bold).relative_to(layout.root)))
348+
b0_id = get_identifier(intended_rel)
349+
assert b0_id == ('auto_00000',)
350+
342351
clear_registry()
343352

344353

sdcflows/utils/wrangler.py

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,23 @@
3434
from .. import fieldmaps as fm
3535

3636

37+
def _normalize_intent(
38+
intent: str,
39+
layout: BIDSLayout,
40+
subject: str
41+
) -> str | None:
42+
"""Convert BIDS-URI intent to subject-relative intent
43+
44+
SDCFlows currently makes strong assumptions about old-style intents,
45+
and a change to that needs to be carefully considered and tested.
46+
"""
47+
if intent.startswith("bids::"):
48+
# bids::sub-<subject>/
49+
# ^- 10 ^- 11
50+
return intent[11 + len(subject):]
51+
return intent
52+
53+
3754
def _resolve_intent(
3855
intent: str,
3956
layout: BIDSLayout,
@@ -47,6 +64,18 @@ def _resolve_intent(
4764
return intent
4865

4966

67+
def _filter_metadata(
68+
metadata: Dict[str, Any],
69+
layout: BIDSLayout,
70+
subject: str
71+
) -> Dict[str, Any]:
72+
intents = metadata.get("IntendedFor")
73+
if intents:
74+
updated = [_normalize_intent(intent, layout, subject) for intent in listify(intents)]
75+
return {**metadata, "IntendedFor": updated}
76+
return metadata
77+
78+
5079
def find_estimators(
5180
*,
5281
layout: BIDSLayout,
@@ -377,7 +406,10 @@ def find_estimators(
377406
):
378407
try:
379408
e = fm.FieldmapEstimation(
380-
fm.FieldmapFile(fmap.path, metadata=fmap.get_metadata())
409+
fm.FieldmapFile(
410+
fmap.path,
411+
metadata=_filter_metadata(fmap.get_metadata(), layout, subject),
412+
)
381413
)
382414
except (ValueError, TypeError) as err:
383415
_log_debug_estimator_fail(
@@ -405,7 +437,10 @@ def find_estimators(
405437
if len(dirs) > 1:
406438
by_intent = {}
407439
for fmap in layout.get(**{**entities, **{'direction': dirs}}):
408-
fmapfile = fm.FieldmapFile(fmap.path, metadata=fmap.get_metadata())
440+
fmapfile = fm.FieldmapFile(
441+
fmap.path,
442+
metadata=_filter_metadata(fmap.get_metadata(), layout, subject),
443+
)
409444
by_intent.setdefault(
410445
tuple(fmapfile.metadata.get('IntendedFor', ())), []
411446
).append(fmapfile)

0 commit comments

Comments
 (0)