Skip to content

Commit 42cb1a2

Browse files
committed
ENH: Generalize require for all image types
1 parent 9d82f5a commit 42cb1a2

File tree

2 files changed

+39
-40
lines changed

2 files changed

+39
-40
lines changed

niworkflows/interfaces/bids.py

Lines changed: 24 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -261,47 +261,41 @@ class BIDSDataGrabber(SimpleInterface):
261261
input_spec = _BIDSDataGrabberInputSpec
262262
output_spec = _BIDSDataGrabberOutputSpec
263263

264-
def __init__(self, *args, **kwargs):
265-
anat_only = kwargs.pop('anat_only', None)
266-
anat_derivatives = kwargs.pop('anat_derivatives', None)
267-
require_t1w = kwargs.pop('require_t1w', True)
268-
require_funcs = kwargs.pop('require_funcs', True)
269-
require_pet = kwargs.pop('require_pet', False)
270-
super().__init__(*args, **kwargs)
271-
264+
_image_types = {'asl', 'bold', 'dwi', 'flair', 'fmap', 'pet', 'roi', 'sbref', 't1w', 't2w'}
265+
266+
def __init__(
267+
self,
268+
anat_only=False,
269+
anat_derivatives=None,
270+
*args,
271+
**kwargs,
272+
):
273+
default_required = {'t1w', 'bold'}
274+
275+
for imtype in self._image_types:
276+
kwarg = f'require_{imtype}'
277+
val = kwargs.pop(kwarg, True if imtype in default_required else False)
278+
setattr(self, f'_{kwarg}', val)
279+
280+
self._require_t1w = self._require_t1w and anat_derivatives is None
272281
if anat_only:
273-
self._require_funcs = False
282+
self._require_bold = False
274283
self._require_pet = False
275-
else:
276-
self._require_funcs = False if require_pet else require_funcs
277-
self._require_pet = require_pet
278284

279-
self._require_t1w = require_t1w and anat_derivatives is None
285+
super().__init__(*args, **kwargs)
280286

281287
def _run_interface(self, runtime):
282288
bids_dict = self.inputs.subject_data
283289

284290
self._results['out_dict'] = bids_dict
285291
self._results.update(bids_dict)
286292

287-
if self._require_t1w and not bids_dict['t1w']:
288-
raise FileNotFoundError(
289-
f'No T1w images found for subject sub-{self.inputs.subject_id}'
290-
)
291-
292-
if self._require_funcs and not bids_dict['bold']:
293-
raise FileNotFoundError(
294-
f'No functional images found for subject sub-{self.inputs.subject_id}'
295-
)
296-
297-
if self._require_pet and not bids_dict.get('pet'):
298-
raise FileNotFoundError(
299-
f'No PET images found for subject sub-{self.inputs.subject_id}'
300-
)
301-
302-
for imtype in ['t2w', 'flair', 'fmap', 'sbref', 'roi', 'pet', 'asl']:
293+
for imtype in self._image_types:
303294
if not bids_dict[imtype]:
304-
LOGGER.info('No "%s" images found for sub-%s', imtype, self.inputs.subject_id)
295+
msg = f'No "{imtype}" images found for sub-{self.inputs.subject_id}'
296+
if getattr(self, f'_require_{imtype}', False): # only raise if image is required
297+
raise FileNotFoundError(msg)
298+
LOGGER.info(msg)
305299

306300
return runtime
307301

niworkflows/interfaces/tests/test_bids.py

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -798,20 +798,21 @@ def test_fsdir_min_version(tmp_path, min_version):
798798
def test_BIDSDataGrabber():
799799
x = bintfs.BIDSDataGrabber(anat_only=True)
800800
assert x._require_t1w is True
801-
assert x._require_funcs is False
801+
assert x._require_bold is False
802802

803803
x = bintfs.BIDSDataGrabber(anat_only=False, require_t1w=False)
804804
assert x._require_t1w is False
805-
assert x._require_funcs is True
805+
assert x._require_bold is True
806806

807807
x = bintfs.BIDSDataGrabber(anat_derivatives='derivatives')
808808
assert x._require_t1w is False
809809

810810

811-
def test_require_func_pet_behavior():
812-
from niworkflows.interfaces.bids import BIDSDataGrabber
811+
def test_require_bold_pet_behavior():
813812
import pytest
814813

814+
from niworkflows.interfaces.bids import BIDSDataGrabber
815+
815816
subject_data_pet = {
816817
't1w': ['t1.nii'],
817818
'bold': [],
@@ -822,6 +823,7 @@ def test_require_func_pet_behavior():
822823
'sbref': [],
823824
'roi': [],
824825
'asl': [],
826+
'dwi': [],
825827
}
826828

827829
subject_data_bold = {
@@ -834,20 +836,23 @@ def test_require_func_pet_behavior():
834836
'sbref': [],
835837
'roi': [],
836838
'asl': [],
839+
'dwi': [],
837840
}
838841

839842
# PET present, functional not required
840-
grabber_pet = BIDSDataGrabber(subject_data=subject_data_pet, subject_id='01', require_pet=True)
841-
assert grabber_pet._require_funcs is False
843+
grabber_pet = BIDSDataGrabber(
844+
subject_data=subject_data_pet, subject_id='01', require_pet=True, require_bold=False
845+
)
846+
assert grabber_pet._require_bold is False
842847
assert grabber_pet._require_pet is True
843848
grabber_pet.run() # Should succeed without bold data
844849

845850
# PET absent, functional required by default
846851
grabber_func = BIDSDataGrabber(subject_data=subject_data_bold, subject_id='01')
847-
assert grabber_func._require_funcs is True
848-
grabber_func.run() # Should succeed with bold data
852+
assert grabber_func._require_bold is True
853+
assert grabber_func.run().outputs.bold == 'bold.nii'
849854

850855
# Fail when bold is required but missing
851856
grabber_fail = BIDSDataGrabber(subject_data=subject_data_pet, subject_id='01')
852-
with pytest.raises(FileNotFoundError, match='No functional images found'):
853-
grabber_fail.run()
857+
with pytest.raises(FileNotFoundError, match='No "bold" images found'):
858+
grabber_fail.run()

0 commit comments

Comments
 (0)