Source code for allensdk.brain_observatory.nwb.metadata
import os
from pynwb import get_type_map, NWBFile, register_class, docval, load_namespaces, popargs, get_class
from pynwb.spec import NWBNamespaceBuilder, NWBGroupSpec, NWBAttributeSpec, NWBDatasetSpec
from pynwb.file import LabMetaData
from marshmallow import fields
from allensdk.brain_observatory.behavior.schemas import OphysBehaviorMetaDataSchema, OphysBehaviorTaskParametersSchema, STYPE_DICT, TYPE_DICT
[docs]def extract_from_schema(schema):
# Extract fields from Schema:
docval_list = [{'name': 'name', 'type': str, 'doc': 'name'}]
attributes = []
nwbfields_list = []
for name, val in schema().fields.items():
if type(val) == fields.List:
attributes.append(NWBAttributeSpec(name=name, dtype=STYPE_DICT[type(val)], doc=val.metadata['doc'], shape=val.metadata['shape']))
else:
attributes.append(NWBAttributeSpec(name=name, dtype=STYPE_DICT[type(val)], doc=val.metadata['doc']))
docval_list.append({'name': name, 'type': TYPE_DICT[type(val)], 'doc': val.metadata['doc']})
nwbfields_list.append(name)
return docval_list, attributes, nwbfields_list
[docs]def load_LabMetaData_extension(schema, prefix):
docval_list, attributes, nwbfields_list = extract_from_schema(schema)
neurodata_type = schema.neurodata_type
outdir = os.path.abspath(os.path.dirname(__file__))
ns_path = '%s_namespace.yaml' % prefix
# Read spec and load namespace:
ns_abs_path = os.path.join(outdir, ns_path)
load_namespaces(ns_abs_path)
@register_class(neurodata_type, prefix)
class ExtensionClass(LabMetaData):
__nwbfields__ = tuple(nwbfields_list)
@docval(*docval_list)
def __init__(self, **kwargs):
name = kwargs.pop('name')
super(ExtensionClass, self).__init__(name=name)
for attr, val in kwargs.items():
setattr(self, attr, val)
return ExtensionClass
[docs]def create_LabMetaData_extension_from_schemas(schema_list, prefix):
# Initializations:
outdir = os.path.abspath(os.path.dirname(__file__))
ext_source = '%s_extension.yaml' % prefix
ns_path = '%s_namespace.yaml' % prefix
neurodata_type_list_as_str = str([schema.neurodata_type for schema in schema_list])
extension_doc = 'LabMetaData extensions: {neurodata_type_list_as_str} ({prefix})'.format(neurodata_type_list_as_str=neurodata_type_list_as_str, prefix=prefix)
ns_builder = NWBNamespaceBuilder(extension_doc, prefix)
for schema in schema_list:
docval_list, attributes, nwbfields_list = extract_from_schema(schema)
neurodata_type = schema.neurodata_type
# Build the spec:
ext_group_spec = NWBGroupSpec(
neurodata_type_def=neurodata_type,
neurodata_type_inc='LabMetaData',
doc=extension_doc,
attributes=attributes)
# Add spec to builder:
ns_builder.add_spec(ext_source, ext_group_spec)
# Export spec
ns_builder.export(ns_path, outdir=outdir)
if __name__ == "__main__":
# Run this module to regenerate the extension yaml files into this dir:
prefix = 'AIBS_ophys_behavior'
create_LabMetaData_extension_from_schemas([OphysBehaviorMetaDataSchema, OphysBehaviorTaskParametersSchema], prefix)