diff --git a/nipype/interfaces/io.py b/nipype/interfaces/io.py index 274fddcccb..7a89675e8d 100644 --- a/nipype/interfaces/io.py +++ b/nipype/interfaces/io.py @@ -2755,6 +2755,8 @@ class BIDSDataGrabberInputSpec(DynamicTraitedSpec): desc='Generate exception if list is empty ' 'for a given field') return_type = traits.Enum('file', 'namedtuple', usedefault=True) + strict = traits.Bool(desc='Return only BIDS "proper" files (e.g., ' + 'ignore derivatives/, sourcedata/, etc.)') class BIDSDataGrabber(IOBase): @@ -2801,8 +2803,10 @@ def __init__(self, infields=None, **kwargs): super(BIDSDataGrabber, self).__init__(**kwargs) if not isdefined(self.inputs.output_query): - self.inputs.output_query = {"func": {"modality": "func"}, - "anat": {"modality": "anat"}} + self.inputs.output_query = { + "func": {"modality": "func", 'extensions': ['nii', '.nii.gz']}, + "anat": {"modality": "anat", 'extensions': ['nii', '.nii.gz']}, + } # If infields is empty, use all BIDS entities if infields is None and have_pybids: @@ -2828,7 +2832,10 @@ def _run_interface(self, runtime): return runtime def _list_outputs(self): - layout = gb.BIDSLayout(self.inputs.base_dir) + exclude = None + if self.inputs.strict: + exclude = ['derivatives/', 'code/', 'sourcedata/'] + layout = gb.BIDSLayout(self.inputs.base_dir, exclude=exclude) # If infield is not given nm input value, silently ignore filters = {} diff --git a/nipype/interfaces/tests/test_io.py b/nipype/interfaces/tests/test_io.py index 1eea2b31f3..abff491f36 100644 --- a/nipype/interfaces/tests/test_io.py +++ b/nipype/interfaces/tests/test_io.py @@ -592,9 +592,9 @@ def test_bids_grabber(tmpdir): bg.inputs.base_dir = os.path.join(datadir, 'ds005') bg.inputs.subject = '01' results = bg.run() - assert os.path.basename(results.outputs.anat[0]) == 'sub-01_T1w.nii.gz' - assert os.path.basename(results.outputs.func[0]) == ( - 'sub-01_task-mixedgamblestask_run-01_bold.nii.gz') + assert 'sub-01_T1w.nii.gz' in map(os.path.basename, results.outputs.anat) + assert 'sub-01_task-mixedgamblestask_run-01_bold.nii.gz' in \ + map(os.path.basename, results.outputs.func) @pytest.mark.skipif(not have_pybids, @@ -610,7 +610,7 @@ def test_bids_fields(tmpdir): bg.inputs.subject = '01' bg.inputs.output_query['dwi'] = dict(modality='dwi') results = bg.run() - assert os.path.basename(results.outputs.dwi[0]) == 'sub-01_dwi.nii.gz' + assert 'sub-01_dwi.nii.gz' in map(os.path.basename, results.outputs.dwi) @pytest.mark.skipif(not have_pybids,