def createPopulation(self, population): """Create a population with given cell type """ cellname = population.attrib["cell_type"] populationname = population.attrib["name"] if not moose.exists('/library/'+cellname): ## if cell does not exist in library load it from xml file mmlR = MorphML(self.nml_params) model_filenames = (cellname+'.xml', cellname+'.morph.xml') success = False for model_filename in model_filenames: model_path = find_first_file(model_filename, self.model_dir) if model_path is not None: cellDict = mmlR.readMorphMLFromFile(model_path, self.params) success = True break if not success: raise IOError( 'For cell {0}: files {1} not found under {2}.'.format( cellname, model_filenames, self.model_dir ) ) self.cellSegmentDict.update(cellDict) libcell = moose.Neuron('/library/'+cellname) #added cells as a Neuron class. self.populationDict[populationname] = (cellname,{}) moose.Neutral('/cells') _logger.info( "Creating population {0} of cell type {1}".format( populationname, cellname ) ) for instance in population.findall(".//{"+nml_ns+"}instance"): instanceid = instance.attrib['id'] location = instance.find('./{'+nml_ns+'}location') rotationnote = instance.find('./{'+meta_ns+'}notes') if rotationnote is not None: ## the text in rotationnote is zrotation=xxxxxxx zrotation = float(rotationnote.text.split('=')[1]) else: zrotation = 0 ## deep copies the library cell to an instance under '/cells' named as <arg3> ## /cells is useful for scheduling clocks as all sim elements are in /cells cellid = moose.copy(libcell,moose.Neutral('/cells'),populationname+"_"+instanceid) cell = moose.Neuron(cellid) self.populationDict[populationname][1][int(instanceid)]=cell x = float(location.attrib['x'])*self.length_factor y = float(location.attrib['y'])*self.length_factor z = float(location.attrib['z'])*self.length_factor self.translate_rotate(cell,x,y,z,zrotation)
def createPopulation(self, population): """Create a population with given cell type """ cellname = population.attrib["cell_type"] populationname = population.attrib["name"] if not moose.exists('/library/' + cellname): ## if cell does not exist in library load it from xml file mmlR = MorphML(self.nml_params) model_filenames = (cellname + '.xml', cellname + '.morph.xml') success = False for model_filename in model_filenames: model_path = find_first_file(model_filename, self.model_dir) if model_path is not None: cellDict = mmlR.readMorphMLFromFile( model_path, self.params) success = True break if not success: raise IOError( 'For cell {0}: files {1} not found under {2}.'.format( cellname, model_filenames, self.model_dir)) self.cellSegmentDict.update(cellDict) libcell = moose.Neuron('/library/' + cellname) #added cells as a Neuron class. self.populationDict[populationname] = (cellname, {}) moose.Neutral('/cells') _logger.info("Creating population {0} of cell type {1}".format( populationname, cellname)) for instance in population.findall(".//{" + nml_ns + "}instance"): instanceid = instance.attrib['id'] location = instance.find('./{' + nml_ns + '}location') rotationnote = instance.find('./{' + meta_ns + '}notes') if rotationnote is not None: ## the text in rotationnote is zrotation=xxxxxxx zrotation = float(rotationnote.text.split('=')[1]) else: zrotation = 0 ## deep copies the library cell to an instance under '/cells' named as <arg3> ## /cells is useful for scheduling clocks as all sim elements are in /cells cellid = moose.copy(libcell, moose.Neutral('/cells'), populationname + "_" + instanceid) cell = moose.Neuron(cellid) self.populationDict[populationname][1][int(instanceid)] = cell x = float(location.attrib['x']) * self.length_factor y = float(location.attrib['y']) * self.length_factor z = float(location.attrib['z']) * self.length_factor self.translate_rotate(cell, x, y, z, zrotation)
def readNeuroMLFromFile(self, filename, params={}, cellsDict={}): """ For the format of params required to tweak what cells are loaded, refer to the doc string of NetworkML.readNetworkMLFromFile(). Returns (populationDict,projectionDict), see doc string of NetworkML.readNetworkML() for details. """ pu.info("Loading neuroml file %s " % filename) moose.Neutral( '/library') # creates /library in MOOSE tree; elif present, wraps tree = ET.parse(filename) root_element = tree.getroot() self.model_dir = path.dirname(path.abspath(filename)) if 'lengthUnits' in list(root_element.attrib.keys()): self.lengthUnits = root_element.attrib['lengthUnits'] else: self.lengthUnits = 'micrometer' ## lots of gymnastics to check if temperature meta tag is present self.temperature = CELSIUS_default # gets replaced below if tag for temperature is present self.temperature_default = True for meta_property in root_element.findall('.//{' + meta_ns + '}property'): ## tag can be an attrib or an element if 'tag' in list(meta_property.attrib.keys()): # tag is an attrib tagname = meta_property.attrib['tag'] if 'temperature' in tagname: self.temperature = float(meta_property.attrib['value']) self.temperature_default = False else: # tag is a separate element tag = meta_property.find('.//{' + meta_ns + '}tag') tagname = tag.text if 'temperature' in tagname: ## value can be a tag or an element if 'value' in list( tag.attrib.keys()): # value is an attrib self.temperature = float(tag.attrib['value']) self.temperature_default = False else: # value is a separate element self.temperature = float( tag.find('.//{' + meta_ns + '}value').text) self.temperature_default = False if self.temperature_default: print(("Using default temperature of", self.temperature, "degrees Celsius.")) self.nml_params = { 'temperature': self.temperature, 'model_dir': self.model_dir, } #print "Loading channels and synapses into MOOSE /library ..." cmlR = ChannelML(self.nml_params) for channels in root_element.findall('.//{' + neuroml_ns + '}channels'): self.channelUnits = channels.attrib['units'] for channel in channels.findall('.//{' + cml_ns + '}channel_type'): ## ideally I should read in extra params ## from within the channel_type element and put those in also. ## Global params should override local ones. cmlR.readChannelML(channel, params=params, units=self.channelUnits) for synapse in channels.findall('.//{' + cml_ns + '}synapse_type'): cmlR.readSynapseML(synapse, units=self.channelUnits) for ionConc in channels.findall('.//{' + cml_ns + '}ion_concentration'): cmlR.readIonConcML(ionConc, units=self.channelUnits) #print "Loading cell definitions into MOOSE /library ..." mmlR = MorphML(self.nml_params) self.cellsDict = cellsDict for cells in root_element.findall('.//{' + neuroml_ns + '}cells'): for cell in cells.findall('.//{' + neuroml_ns + '}cell'): cellDict = mmlR.readMorphML(cell, params=params, lengthUnits=self.lengthUnits) self.cellsDict.update(cellDict) ## check if there are populations in this NML files, ## if not, it's a MorphML or ChannelML file, not NetworkML, so skip. if root_element.find('.//{'+neuroml_ns+'}populations') is None \ and root_element.find('.//{'+nml_ns+'}populations') is None: return (self.cellsDict, 'no populations (L3 NetworkML) found.') else: #print "Loading individual cells into MOOSE root ... " nmlR = NetworkML(self.nml_params) return nmlR.readNetworkML(root_element,self.cellsDict,\ params=params,lengthUnits=self.lengthUnits) ## cellsDict = { cellname: (segDict, cableDict), ... } # multiple cells ## where segDict = { segid1 : [ segname,(proximalx,proximaly,proximalz), ## (distalx,distaly,distalz),diameter,length,[potential_syn1, ... ] ] , ... } ## segname is "<name>_<segid>" because 1) guarantees uniqueness, ## & 2) later scripts obtain segid from the compartment's name! ## and cableDict = { cablegroupname : [campartment1name, compartment2name, ... ], ... } self.cellsDict = nmlR.cellSegmentDict
def readNeuroMLFromFile(self,filename,params={},cellsDict={}): """ For the format of params required to tweak what cells are loaded, refer to the doc string of NetworkML.readNetworkMLFromFile(). Returns (populationDict,projectionDict), see doc string of NetworkML.readNetworkML() for details. """ pu.info("Loading neuroml file %s " % filename) moose.Neutral('/library') # creates /library in MOOSE tree; elif present, wraps tree = ET.parse(filename) root_element = tree.getroot() self.model_dir = path.dirname( path.abspath( filename ) ) if 'lengthUnits' in list(root_element.attrib.keys()): self.lengthUnits = root_element.attrib['lengthUnits'] else: self.lengthUnits = 'micrometer' ## lots of gymnastics to check if temperature meta tag is present self.temperature = CELSIUS_default # gets replaced below if tag for temperature is present self.temperature_default = True for meta_property in root_element.findall('.//{'+meta_ns+'}property'): ## tag can be an attrib or an element if 'tag' in list(meta_property.attrib.keys()): # tag is an attrib tagname = meta_property.attrib['tag'] if 'temperature' in tagname: self.temperature = float(meta_property.attrib['value']) self.temperature_default = False else: # tag is a separate element tag = meta_property.find('.//{'+meta_ns+'}tag') tagname = tag.text if 'temperature' in tagname: ## value can be a tag or an element if 'value' in list(tag.attrib.keys()): # value is an attrib self.temperature = float(tag.attrib['value']) self.temperature_default = False else: # value is a separate element self.temperature = float(tag.find('.//{'+meta_ns+'}value').text) self.temperature_default = False if self.temperature_default: print(("Using default temperature of", self.temperature,"degrees Celsius.")) self.nml_params = { 'temperature':self.temperature, 'model_dir':self.model_dir, } #print "Loading channels and synapses into MOOSE /library ..." cmlR = ChannelML(self.nml_params) for channels in root_element.findall('.//{'+neuroml_ns+'}channels'): self.channelUnits = channels.attrib['units'] for channel in channels.findall('.//{'+cml_ns+'}channel_type'): ## ideally I should read in extra params ## from within the channel_type element and put those in also. ## Global params should override local ones. cmlR.readChannelML(channel,params=params,units=self.channelUnits) for synapse in channels.findall('.//{'+cml_ns+'}synapse_type'): cmlR.readSynapseML(synapse,units=self.channelUnits) for ionConc in channels.findall('.//{'+cml_ns+'}ion_concentration'): cmlR.readIonConcML(ionConc,units=self.channelUnits) #print "Loading cell definitions into MOOSE /library ..." mmlR = MorphML(self.nml_params) self.cellsDict = cellsDict for cells in root_element.findall('.//{'+neuroml_ns+'}cells'): for cell in cells.findall('.//{'+neuroml_ns+'}cell'): cellDict = mmlR.readMorphML(cell,params=params,lengthUnits=self.lengthUnits) self.cellsDict.update(cellDict) ## check if there are populations in this NML files, ## if not, it's a MorphML or ChannelML file, not NetworkML, so skip. if root_element.find('.//{'+neuroml_ns+'}populations') is None \ and root_element.find('.//{'+nml_ns+'}populations') is None: return (self.cellsDict,'no populations (L3 NetworkML) found.') else: #print "Loading individual cells into MOOSE root ... " nmlR = NetworkML(self.nml_params) return nmlR.readNetworkML(root_element,self.cellsDict,\ params=params,lengthUnits=self.lengthUnits) ## cellsDict = { cellname: (segDict, cableDict), ... } # multiple cells ## where segDict = { segid1 : [ segname,(proximalx,proximaly,proximalz), ## (distalx,distaly,distalz),diameter,length,[potential_syn1, ... ] ] , ... } ## segname is "<name>_<segid>" because 1) guarantees uniqueness, ## & 2) later scripts obtain segid from the compartment's name! ## and cableDict = { cablegroupname : [campartment1name, compartment2name, ... ], ... } self.cellsDict = nmlR.cellSegmentDict
def readNeuroMLFromFile(self, filename: Path, params={}, cellsDict={}): """ For the format of params required to tweak what cells are loaded, refer to the doc string of NetworkML.readNetworkMLFromFile(). Returns (populationDict,projectionDict), see doc string of NetworkML.readNetworkML() for details. """ mu.info("Loading neuroml file %s " % filename) moose.Neutral( "/library") # creates /library in MOOSE tree; elif present, wraps assert filename.exists(), f'{filename} does not exists or not readable' tree = ET.parse(str(filename)) root_element = tree.getroot() # if model_path is given in params, use it else use the directory of NML # as model_dir. self.model_dir: Path = params.get("model_dir", filename.parent.resolve()) if "lengthUnits" in list(root_element.attrib.keys()): self.lengthUnits = root_element.attrib["lengthUnits"] else: self.lengthUnits = "micrometer" ## lots of gymnastics to check if temperature meta tag is present self.temperature = ( MNU.CELSIUS_default ) # gets replaced below if tag for temperature is present self.temperature_default = True for meta_property in root_element.findall(".//{" + MNU.meta_ns + "}property"): ## tag can be an attrib or an element if "tag" in list(meta_property.attrib.keys()): # tag is an attrib tagname = meta_property.attrib["tag"] if "temperature" in tagname: self.temperature = float(meta_property.attrib["value"]) self.temperature_default = False else: # tag is a separate element tag = meta_property.find(".//{" + MNU.meta_ns + "}tag") tagname = tag.text if "temperature" in tagname: ## value can be a tag or an element if "value" in list( tag.attrib.keys()): # value is an attrib self.temperature = float(tag.attrib["value"]) self.temperature_default = False else: # value is a separate element self.temperature = float( tag.find(".//{" + MNU.meta_ns + "}value").text) self.temperature_default = False if self.temperature_default: mu.info("Using default temperature of %s degree Celsius" % self.temperature) self.nml_params = { "temperature": self.temperature, "model_dir": str(self.model_dir), } mu.info("Loading channels and synapses into MOOSE /library ...") cmlR = ChannelML(self.nml_params) for channels in root_element.findall(".//{" + MNU.neuroml_ns + "}channels"): self.channelUnits = channels.attrib["units"] for channel in channels.findall(".//{" + MNU.cml_ns + "}channel_type"): ## ideally I should read in extra params ## from within the channel_type element and put those in also. ## Global params should override local ones. cmlR.readChannelML(channel, params=params, units=self.channelUnits) for synapse in channels.findall(".//{" + MNU.cml_ns + "}synapse_type"): cmlR.readSynapseML(synapse, units=self.channelUnits) for ionConc in channels.findall(".//{" + MNU.cml_ns + "}ion_concentration"): cmlR.readIonConcML(ionConc, units=self.channelUnits) mu.info("Loading cell definitions into MOOSE /library ...") mmlR = MorphML(self.nml_params) self.cellsDict = cellsDict for cells in root_element.findall(".//{" + MNU.neuroml_ns + "}cells"): for cell in cells.findall(".//{" + MNU.neuroml_ns + "}cell"): cellDict = mmlR.readMorphML(cell, params=params, lengthUnits=self.lengthUnits) self.cellsDict.update(cellDict) ## check if there are populations in this NML files, ## if not, it's a MorphML or ChannelML file, not NetworkML, so skip. if (root_element.find(".//{" + MNU.neuroml_ns + "}populations") is None and root_element.find(".//{" + MNU.nml_ns + "}populations") is None): return (self.cellsDict, "no populations (L3 NetworkML) found.") else: mu.info("Loading individual cells into MOOSE root ... ") nmlR = NetworkML(self.nml_params) return nmlR.readNetworkML( root_element, self.cellsDict, params=params, lengthUnits=self.lengthUnits, ) ## cellsDict = { cellname: (segDict, cableDict), ... } # multiple cells ## where segDict = { segid1 : [ segname,(proximalx,proximaly,proximalz), ## (distalx,distaly,distalz),diameter,length,[potential_syn1, ... ] ] , ... } ## segname is "<name>_<segid>" because 1) guarantees uniqueness, ## & 2) later scripts obtain segid from the compartment's name! ## and cableDict = { cablegroupname : [campartment1name, compartment2name, ... ], ... } self.cellsDict = nmlR.cellSegmentDict