Source code for bmtk.simulator.bionet.nml_reader

[docs]class NMLTree(object): nml_ns = '{http://www.neuroml.org/schema/neuroml2}' element_registry = {} def __init__(self, nml_path): from xml.etree import ElementTree self._nml_path = nml_path self._nml_root = ElementTree.parse(nml_path).getroot() #self._relevant_elements = { # NMLTree.ns_name('channelDensity'): ChannelDensity, # NMLTree.ns_name('resistivity'): Resistivity #} # For each section store a list of all the NML elements include self._soma_props = {} self._axon_props = {} self._dend_props = {} self._apic_props = {} # For lookup by segmentGroup attribute, include common synonyms for diff sections self._section_maps = { 'soma': self._soma_props, 'somatic': self._soma_props, 'axon': self._axon_props, 'axonal': self._axon_props, 'dend': self._dend_props, 'basal': self._dend_props, 'dendritic': self._dend_props, 'apic': self._apic_props, 'apical': self._apic_props } self._parse_root(self._nml_root)
[docs] @classmethod def ns_name(cls, name): return '{}{}'.format(cls.nml_ns, name)
[docs] @staticmethod def common_name(elem): if '}' in elem: return elem.split('}')[-1] else: return elem
[docs] @staticmethod def parse_value(value): val_list = value.split(' ') if len(val_list) == 2: return float(val_list[0]), val_list[1] elif len(val_list) == 1: return float(val_list[0]), 'NONE' else: raise Exception('Cannot parse value {}'.format(value))
[docs] @classmethod def register_module(cls, element_cls): cls.element_registry[cls.ns_name(element_cls.element_tag())] = element_cls return element_cls
def _parse_root(self, root): for elem in root.iter(): if elem.tag in NMLTree.element_registry: nml_element = NMLTree.element_registry[elem.tag](elem) self._add_param(nml_element) def _add_param(self, nml_element): seggroup_str = nml_element.section if seggroup_str is None: raise Exception('Error: tag {} in {} is missing segmentGroup'.format(nml_element.id, self._nml_path)) elif seggroup_str.lower() == 'all': sections = ['soma', 'axon', 'apic', 'dend'] else: sections = [seggroup_str.lower()] for sec_name in sections: param_table = self._section_maps[sec_name] if sec_name in param_table: raise Exception('Error: {} already has a {} element in {}.'.format(nml_element.id, sec_name, self._nml_path)) self._section_maps[sec_name][nml_element.id] = nml_element def __getitem__(self, section_name): return self._section_maps[section_name]
[docs]class NMLElement(object): def __init__(self, nml_element): self._elem = nml_element self._attribs = nml_element.attrib self.tag_name = NMLTree.common_name(self._elem.tag) self.section = self._attribs.get('segmentGroup', None) self.id = self._attribs.get('id', self.tag_name)
[docs] @staticmethod def element_tag(): raise NotImplementedError()
[docs]@NMLTree.register_module class ChannelDensity(NMLElement): def __init__(self, nml_element): super(ChannelDensity, self).__init__(nml_element) self.ion = self._attribs['ion'] self.ion_channel = self._attribs['ionChannel'] if 'erev' in self._attribs: v_list = NMLTree.parse_value(self._attribs['erev']) self.erev = v_list[0] self.erev_units = v_list[1] else: self.erev = None v_list = NMLTree.parse_value(self._attribs['condDensity']) self.cond_density = v_list[0] self.cond_density_units = v_list[1]
[docs] @staticmethod def element_tag(): return 'channelDensity'
[docs]@NMLTree.register_module class ChannelDensityNernst(ChannelDensity):
[docs] @staticmethod def element_tag(): return 'channelDensityNernst'
[docs]@NMLTree.register_module class Resistivity(NMLElement): def __init__(self, nml_element): super(Resistivity, self).__init__(nml_element) v_list = NMLTree.parse_value(self._attribs['value']) self.value = v_list[0] self.value_units = v_list[1]
[docs] @staticmethod def element_tag(): return 'resistivity'
[docs]@NMLTree.register_module class SpecificCapacitance(NMLElement): def __init__(self, nml_element): super(SpecificCapacitance, self).__init__(nml_element) v_list = NMLTree.parse_value(self._attribs['value']) self.value = v_list[0] self.value_units = v_list[1]
[docs] @staticmethod def element_tag(): return 'specificCapacitance'
[docs]@NMLTree.register_module class ConcentrationModel(NMLElement): def __init__(self, nml_element): super(ConcentrationModel, self).__init__(nml_element) self.type = self._attribs['type'] v_list = NMLTree.parse_value(self._attribs['decay']) self.decay = v_list[0] self.decay_units = v_list[1] v_list = NMLTree.parse_value(self._attribs['gamma']) self.gamma = v_list[0] self.gamma_units = v_list[1]
[docs] @staticmethod def element_tag(): return 'concentrationModel'