Skip to content

Instantly share code, notes, and snippets.

@nicain
Created August 3, 2017 20:09
Show Gist options
  • Save nicain/9f03154823678fc74fed674913fb08ee to your computer and use it in GitHub Desktop.
Save nicain/9f03154823678fc74fed674913fb08ee to your computer and use it in GitHub Desktop.
NWBGroupSpec example
from pynwb import NWBNamespaceBuilder, NWBGroupSpec, NWBAttributeSpec
import numpy as np
from pynwb import get_class, load_namespaces
from datetime import datetime
from pynwb import NWBFile
from form.backends.hdf5 import HDF5IO
from pynwb import get_build_manager
ns_path = "mylab.namespace.yaml"
ext_source = "mylab.extensions.yaml"
nwb_as = NWBAttributeSpec('data', 'int', 'gid')
ns_builder = NWBNamespaceBuilder('Extension for use in my Lab', "mylab")
ext = NWBGroupSpec('A custom TimeSeries for my lab',
attributes=[nwb_as],
dtype='float',
neurodata_type_inc='TimeSeries',
neurodata_type_def='PopulationSpikeTrain')
ns_builder.add_spec(ext_source, ext)
ns_builder.export(ns_path)
ns_path = "mylab.namespace.yaml"
load_namespaces(ns_path)
PopulationSpikeTrain = get_class('PopulationSpikeTrain', 'mylab')
fs = PopulationSpikeTrain(data=(10*np.random.random(5)).astype(np.int),
name='my_population',
source='acquisition',
unit='second',
timestamps=np.random.rand(5))
f = NWBFile('tmp.nwb',
'my first synthetic recording',
'EXAMPLE_ID',
datetime.now(),
experimenter='Dr. Bilbo Baggins',
lab='Bag End Labatory',
institution='University of Middle Earth at the Shire',
experiment_description='empty',
session_id='LONELYMTN')
f.add_raw_timeseries(fs)
manager = get_build_manager()
io = HDF5IO('tmp.nwb', manager, mode='w')
io.write(f)
@nicain
Copy link
Author

nicain commented Aug 3, 2017

Warning                                   Traceback (most recent call last)
<ipython-input-26-466658e10216> in <module>()
----> 1 io.write(f)

/data/mat/nicholasc/pynwb/src/form/utils.py in func_call(*args, **kwargs)
    269                 if parse_err:
    270                     raise TypeError(', '.join(parse_err)) from None
--> 271                 return func(self, **parsed['args'])
    272         else:
    273             def func_call(*args, **kwargs):

/data/mat/nicholasc/pynwb/src/form/backends/io.py in write(self, **kwargs)
     22     def write(self, **kwargs):
     23         container = getargs('container', kwargs)
---> 24         f_builder = self.__manager.build(container, source=self.__source)
     25         self.write_builder(f_builder)
     26 

/data/mat/nicholasc/pynwb/src/form/utils.py in func_call(*args, **kwargs)
    269                 if parse_err:
    270                     raise TypeError(', '.join(parse_err)) from None
--> 271                 return func(self, **parsed['args'])
    272         else:
    273             def func_call(*args, **kwargs):

/data/mat/nicholasc/pynwb/src/form/build/map.py in build(self, **kwargs)
     27         result = self.__builders.get(container_id)
     28         if result is None:
---> 29             result = self.__type_map.build(container, self, source=getargs('source', kwargs))
     30             self.prebuilt(container, result)
     31         return result

/data/mat/nicholasc/pynwb/src/form/utils.py in func_call(*args, **kwargs)
    269                 if parse_err:
    270                     raise TypeError(', '.join(parse_err)) from None
--> 271                 return func(self, **parsed['args'])
    272         else:
    273             def func_call(*args, **kwargs):

/data/mat/nicholasc/pynwb/src/form/build/map.py in build(self, **kwargs)
    811             raise ValueError('No ObjectMapper found for container of type %s' % str(container.__class__.__name__))
    812         else:
--> 813             builder = attr_map.build(container, manager, source=getargs('source', kwargs))
    814         namespace, data_type = self.__get_container_ns_dt(container)
    815         builder.set_attribute('namespace', namespace)

/data/mat/nicholasc/pynwb/src/form/utils.py in func_call(*args, **kwargs)
    269                 if parse_err:
    270                     raise TypeError(', '.join(parse_err)) from None
--> 271                 return func(self, **parsed['args'])
    272         else:
    273             def func_call(*args, **kwargs):

/data/mat/nicholasc/pynwb/src/form/build/map.py in build(self, **kwargs)
    353             builder = GroupBuilder(name, parent=parent, source=source)
    354             self.__add_datasets(builder, self.__spec.datasets, container, manager)
--> 355             self.__add_groups(builder, self.__spec.groups, container, manager)
    356             self.__add_links(builder, self.__spec.links, container, manager)
    357         else:

/data/mat/nicholasc/pynwb/src/form/build/map.py in __add_groups(self, builder, groups, container, build_manager)
    425                             if isinstance(item, Container):
    426                                 self.__add_containers(sub_builder, spec, item, build_manager)
--> 427                 self.__add_groups(sub_builder, spec.groups, container, build_manager)
    428                 empty = sub_builder.is_empty()
    429                 if not empty or (empty and isinstance(spec.quantity, int)):

/data/mat/nicholasc/pynwb/src/form/build/map.py in __add_groups(self, builder, groups, container, build_manager)
    425                             if isinstance(item, Container):
    426                                 self.__add_containers(sub_builder, spec, item, build_manager)
--> 427                 self.__add_groups(sub_builder, spec.groups, container, build_manager)
    428                 empty = sub_builder.is_empty()
    429                 if not empty or (empty and isinstance(spec.quantity, int)):

/data/mat/nicholasc/pynwb/src/form/build/map.py in __add_groups(self, builder, groups, container, build_manager)
    440                     attr_value = getattr(container, attr_name, None)
    441                     if attr_value is not None:
--> 442                         self.__add_containers(builder, spec, attr_value, build_manager)
    443 
    444     def __add_containers(self, builder, spec, value, build_manager):

/data/mat/nicholasc/pynwb/src/form/build/map.py in __add_containers(self, builder, spec, value, build_manager)
    465                 raise ValueError(msg % value.__class__.__name__)
    466             for container in values:
--> 467                 self.__add_containers(builder, spec, container, build_manager)
    468 
    469     def __get_subspec_values(self, builder, spec, manager):

/data/mat/nicholasc/pynwb/src/form/build/map.py in __add_containers(self, builder, spec, value, build_manager)
    444     def __add_containers(self, builder, spec, value, build_manager):
    445         if isinstance(value, Container):
--> 446             rendered_obj = build_manager.build(value)
    447             # use spec to determine what kind of HDF5
    448             # object this Container corresponds to

/data/mat/nicholasc/pynwb/src/form/utils.py in func_call(*args, **kwargs)
    269                 if parse_err:
    270                     raise TypeError(', '.join(parse_err)) from None
--> 271                 return func(self, **parsed['args'])
    272         else:
    273             def func_call(*args, **kwargs):

/data/mat/nicholasc/pynwb/src/form/build/map.py in build(self, **kwargs)
     27         result = self.__builders.get(container_id)
     28         if result is None:
---> 29             result = self.__type_map.build(container, self, source=getargs('source', kwargs))
     30             self.prebuilt(container, result)
     31         return result

/data/mat/nicholasc/pynwb/src/form/utils.py in func_call(*args, **kwargs)
    269                 if parse_err:
    270                     raise TypeError(', '.join(parse_err)) from None
--> 271                 return func(self, **parsed['args'])
    272         else:
    273             def func_call(*args, **kwargs):

/data/mat/nicholasc/pynwb/src/form/build/map.py in build(self, **kwargs)
    811             raise ValueError('No ObjectMapper found for container of type %s' % str(container.__class__.__name__))
    812         else:
--> 813             builder = attr_map.build(container, manager, source=getargs('source', kwargs))
    814         namespace, data_type = self.__get_container_ns_dt(container)
    815         builder.set_attribute('namespace', namespace)

/data/mat/nicholasc/pynwb/src/form/utils.py in func_call(*args, **kwargs)
    269                 if parse_err:
    270                     raise TypeError(', '.join(parse_err)) from None
--> 271                 return func(self, **parsed['args'])
    272         else:
    273             def func_call(*args, **kwargs):

/data/mat/nicholasc/pynwb/src/form/build/map.py in build(self, **kwargs)
    357         else:
    358             builder = DatasetBuilder(name, parent=parent, dtype=self.__spec.dtype)
--> 359         self.__add_attributes(builder, self.__spec.attributes, container)
    360         return builder
    361 

/data/mat/nicholasc/pynwb/src/form/build/map.py in __add_attributes(self, builder, attributes, container)
    379             if attr_value is None:
    380                 if spec.required:
--> 381                     raise Warning("missing required attribute '%s' for '%s'" % (spec.name, builder.name))
    382                 continue
    383             builder.set_attribute(spec.name, attr_value)

Warning: missing required attribute 'data' for 'my_population'```

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment