Skip to content

Commit bebfbcf

Browse files
authored
Merge pull request #952 from nipreps/fix/collect-data-sessions
FIX: Do not allow filters to overwrite participant / session
2 parents 2a10a59 + 6e9caff commit bebfbcf

File tree

1 file changed

+24
-1
lines changed

1 file changed

+24
-1
lines changed

niworkflows/utils/bids.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,15 @@
2222
#
2323
"""Helpers for handling BIDS-like neuroimaging structures."""
2424

25+
import copy
2526
import json
2627
import re
2728
import warnings
2829
from pathlib import Path
2930

3031
from bids import BIDSLayout
3132
from bids.layout import Query
33+
from bids.utils import listify
3234
from packaging.version import Version
3335

3436
DEFAULT_BIDS_QUERIES = {
@@ -226,22 +228,43 @@ def collect_data(
226228
>>> bids_root['t1w'] # doctest: +ELLIPSIS
227229
['.../ds051/sub-01/anat/sub-01_run-01_T1w.nii.gz']
228230
231+
>>> bids_root, _ = collect_data(
232+
... str(datadir / 'ds114'),
233+
... '01',
234+
... bids_validate=False,
235+
... session_id='retest',
236+
... bids_filters={'bold': {'session': 'madeup'}}) # doctest: +ELLIPSIS
237+
Traceback (most recent call last):
238+
...
239+
ValueError: Conflicting entities for "session" found: madeup // retest
240+
229241
"""
230242
if isinstance(bids_dir, BIDSLayout):
231243
layout = bids_dir
232244
else:
233245
layout = BIDSLayout(str(bids_dir), validate=bids_validate)
234246

247+
if not queries:
248+
queries = copy.deepcopy(DEFAULT_BIDS_QUERIES)
249+
235250
layout_get_kwargs = {
236251
'return_type': 'file',
237252
'subject': participant_label,
238253
'extension': ['.nii', '.nii.gz'],
239254
'session': session_id or Query.OPTIONAL,
240255
}
241256

242-
queries = queries or DEFAULT_BIDS_QUERIES
257+
reserved_entities = [('subject', participant_label), ('session', session_id)]
258+
243259
bids_filters = bids_filters or {}
244260
for acq, entities in bids_filters.items():
261+
# BIDS filters will not be able to override subject / session entities
262+
for entity, param in reserved_entities:
263+
if entity in entities and listify(param) != listify(entities[entity]):
264+
raise ValueError(
265+
f'Conflicting entities for "{entity}" found: {entities[entity]} // {param}'
266+
)
267+
245268
queries[acq].update(entities)
246269
for entity in list(layout_get_kwargs.keys()):
247270
if entity in entities:

0 commit comments

Comments
 (0)