Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions sdcflows/utils/tests/test_wrangler.py
Original file line number Diff line number Diff line change
Expand Up @@ -496,6 +496,26 @@ def test_wrangler_URIs(tmpdir, name, skeleton, session, estimations, total_estim
clear_registry()


@pytest.mark.parametrize('bids_filters', [None, {'datatype': 'fmap'}])
def test_sessionwise_queries(tmp_path, bids_filters):
"""One query per session must find that session's fieldmap."""
bids_dir = tmp_path / 'bids'
generate_bids_skeleton(bids_dir, phasediff)
layout = gen_layout(bids_dir)

for session in ('01', '02', '03'):
est = find_estimators(
layout=layout,
subject='01',
sessions=[session],
bids_filters=bids_filters,
)
assert len(est) == 1
assert all(f'ses-{session}' in str(source.path) for source in est[0].sources)

clear_registry()


def test_single_reverse_pedir(tmp_path):
bids_dir = tmp_path / 'bids'
generate_bids_skeleton(bids_dir, pepolar)
Expand Down
27 changes: 18 additions & 9 deletions sdcflows/utils/wrangler.py
Original file line number Diff line number Diff line change
Expand Up @@ -332,9 +332,10 @@ def find_estimators(

if bids_filters:
filters = bids_filters.copy() # copy to avoid altering in place
if 'session' in bids_filters and sessions is not None:
raise ValueError('Filters include session, but session is already defined.')
sessions = listify(filters.pop('session', None))
if 'session' in filters:
if sessions is not None:
raise ValueError('Filters include session, but session is already defined.')
sessions = listify(filters.pop('session'))
base_entities.update(filters)

subject_root = Path(layout.root) / f'sub-{subject}'
Expand Down Expand Up @@ -363,9 +364,6 @@ def find_estimators(

for b0_id in b0_ids:
# Found B0FieldIdentifier metadata entries
b0_entities = base_entities.copy()
b0_entities['B0FieldIdentifier'] = b0_id

bare_ids = layout.get(**base_entities, B0FieldIdentifier=b0_id)
listed_ids = layout.get(
**base_entities,
Expand All @@ -382,7 +380,12 @@ def find_estimators(
)
except (ValueError, TypeError) as err:
_log_debug_estimator_fail(
logger, b0_id, bare_ids + listed_ids, layout.root, str(err)
logger,
b0_id,
bare_ids + listed_ids,
layout.root,
str(err),
level=logging.WARNING,
)
else:
_log_debug_estimation(logger, e, layout.root)
Expand Down Expand Up @@ -645,10 +648,16 @@ def _log_debug_estimation(


def _log_debug_estimator_fail(
logger: logging.Logger, b0_id: str, files: list[BIDSFile], bids_root: str, message: str
logger: logging.Logger,
b0_id: str,
files: list[BIDSFile],
bids_root: str,
message: str,
level: int = logging.DEBUG,
) -> None:
"""A helper function to log failures to build an estimator when running with verbosity."""
logger.debug(
logger.log(
level,
'Failed to construct %s estimation from %d sources:\n- %s\nError: %s',
b0_id,
len(files),
Expand Down
Loading