Skip to content

Commit 656a51d

Browse files
authored
Merge pull request #458 from effigies/fix/bids-uris-nonepi
FIX: Normalize BIDS-URIs to subject-relative
2 parents 3f4bbf7 + f9ac03c commit 656a51d

File tree

2 files changed

+46
-4
lines changed

2 files changed

+46
-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: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,22 @@
3434
from .. import fieldmaps as fm
3535

3636

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

4965

66+
def _filter_metadata(
67+
metadata: Dict[str, Any],
68+
subject: str
69+
) -> Dict[str, Any]:
70+
intents = metadata.get("IntendedFor")
71+
if intents:
72+
updated = [_normalize_intent(intent, subject) for intent in listify(intents)]
73+
return {**metadata, "IntendedFor": updated}
74+
return metadata
75+
76+
5077
def find_estimators(
5178
*,
5279
layout: BIDSLayout,
@@ -377,7 +404,10 @@ def find_estimators(
377404
):
378405
try:
379406
e = fm.FieldmapEstimation(
380-
fm.FieldmapFile(fmap.path, metadata=fmap.get_metadata())
407+
fm.FieldmapFile(
408+
fmap.path,
409+
metadata=_filter_metadata(fmap.get_metadata(), subject),
410+
)
381411
)
382412
except (ValueError, TypeError) as err:
383413
_log_debug_estimator_fail(
@@ -405,7 +435,10 @@ def find_estimators(
405435
if len(dirs) > 1:
406436
by_intent = {}
407437
for fmap in layout.get(**{**entities, **{'direction': dirs}}):
408-
fmapfile = fm.FieldmapFile(fmap.path, metadata=fmap.get_metadata())
438+
fmapfile = fm.FieldmapFile(
439+
fmap.path,
440+
metadata=_filter_metadata(fmap.get_metadata(), subject),
441+
)
409442
by_intent.setdefault(
410443
tuple(fmapfile.metadata.get('IntendedFor', ())), []
411444
).append(fmapfile)

0 commit comments

Comments
 (0)