Skip to content

ENH: More flexible BIDSDataGrabber creation #2228

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Oct 16, 2017
Merged
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
34 changes: 12 additions & 22 deletions nipype/interfaces/bids_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@

LOGGER = logging.getLogger('workflows')


class BIDSDataGrabberInputSpec(DynamicTraitedSpec):
base_dir = Directory(exists=True,
desc='Path to BIDS Directory.',
Expand Down Expand Up @@ -91,7 +92,7 @@ class BIDSDataGrabber(BaseInterface):
output_spec = DynamicTraitedSpec
_always_run = True

def __init__(self, infields=None, outfields=None, **kwargs):
def __init__(self, infields=None, **kwargs):
"""
Parameters
----------
Expand All @@ -104,17 +105,13 @@ def __init__(self, infields=None, outfields=None, **kwargs):
"""
super(BIDSDataGrabber, self).__init__(**kwargs)
if not have_pybids:
raise ImportError("The BIDSEventsGrabber interface requires pybids."
" Please make sure it is installed.")

# If outfields is None use anat and func as default
if outfields is None:
outfields = ['func', 'anat']
self.inputs.output_query = {
"func": {"modality": "func"},
"anat": {"modality": "anat"}}
else:
self.inputs.output_query = {}
raise ImportError(
"The BIDSEventsGrabber interface requires pybids."
" Please make sure it is installed.")

if not isdefined(self.inputs.output_query):
self.inputs.output_query = {"func": {"modality": "func"},
"anat": {"modality": "anat"}}

# If infields is None, use all BIDS entities
if infields is None:
Expand All @@ -123,13 +120,12 @@ def __init__(self, infields=None, outfields=None, **kwargs):
infields = [i['name'] for i in bids_config['entities']]

self._infields = infields
self._outfields = outfields

# used for mandatory inputs check
undefined_traits = {}
for key in infields:
self.inputs.add_trait(key, traits.Any)
undefined_traits[key] = Undefined
undefined_traits[key] = kwargs[key] if key in kwargs else Undefined

self.inputs.trait_set(trait_change_notify=False, **undefined_traits)

Expand All @@ -139,10 +135,6 @@ def _run_interface(self, runtime):
def _list_outputs(self):
layout = gb.BIDSLayout(self.inputs.base_dir)

for key in self._outfields:
if key not in self.inputs.output_query:
raise ValueError("Define query for all outputs")

# If infield is not given nm input value, silently ignore
filters = {}
for key in self._infields:
Expand All @@ -154,11 +146,9 @@ def _list_outputs(self):
for key, query in self.inputs.output_query.items():
args = query.copy()
args.update(filters)
filelist = layout.get(return_type=self.inputs.return_type,
**args)
filelist = layout.get(return_type=self.inputs.return_type, **args)
if len(filelist) == 0:
msg = 'Output key: %s returned no files' % (
key)
msg = 'Output key: %s returned no files' % key
if self.inputs.raise_on_empty:
raise IOError(msg)
else:
Expand Down
28 changes: 28 additions & 0 deletions nipype/interfaces/tests/test_auto_BIDSDataGrabber.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# AUTO-GENERATED by tools/checkspecs.py - DO NOT EDIT
from __future__ import unicode_literals
from ..bids_utils import BIDSDataGrabber


def test_BIDSDataGrabber_inputs():
input_map = dict(base_dir=dict(mandatory=True,
),
output_query=dict(),
raise_on_empty=dict(usedefault=True,
),
return_type=dict(usedefault=True,
),
)
inputs = BIDSDataGrabber.input_spec()

for key, metadata in list(input_map.items()):
for metakey, value in list(metadata.items()):
assert getattr(inputs.traits()[key], metakey) == value


def test_BIDSDataGrabber_outputs():
output_map = dict()
outputs = BIDSDataGrabber.output_spec()

for key, metadata in list(output_map.items()):
for metakey, value in list(metadata.items()):
assert getattr(outputs.traits()[key], metakey) == value