def readNeuroMLFromFile(self,filename,params={}): """ 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. """ print "Loading neuroml file ... ", 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 ) ) self.lengthUnits = root_element.attrib['lengthUnits'] 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'): tagname = meta_property.attrib['tag'] if 'temperature' in tagname: self.temperature = float(meta_property.attrib['value']) 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={},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 = {} for cells in root_element.findall('.//{'+neuroml_ns+'}cells'): for cell in cells.findall('.//{'+neuroml_ns+'}cell'): cellDict = mmlR.readMorphML(cell,params={},lengthUnits=self.lengthUnits) self.cellsDict.update(cellDict) print "Loading individual cells into MOOSE root ... " print self.cellsDict nmlR = NetworkML(self.nml_params) print self.cellsDict return nmlR.readNetworkML(root_element,self.cellsDict,params=params,lengthUnits=self.lengthUnits)
def createPopulations(self): self.populationDict = {} for population in self.network.findall(".//{"+nml_ns+"}population"): cellname = population.attrib["cell_type"] populationname = population.attrib["name"] print "loading", populationname ## if cell does not exist in library load it from xml file if not moose.exists('/library/'+cellname): 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) 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) if cellname == 'LIF': libcell = moose.LeakyIaF('/library/'+cellname) else: libcell = moose.Neuron('/library/'+cellname) #added cells as a Neuron class. self.populationDict[populationname] = (cellname,{}) moose.Neutral('/cells') 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(string.split(rotationnote.text,'=')[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) if cellname == 'LIF': cell = moose.LeakyIaF(cellid) self.populationDict[populationname][1][int(instanceid)]=cell else: cell = moose.Neuron(cellid) # No Cell class in MOOSE anymore! :( addded Neuron class - Chaitanya 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 createPopulations(self): self.populationDict = {} for population in self.network.findall(".//{"+nml_ns+"}population"): cellname = population.attrib["cell_type"] populationname = population.attrib["name"] print "loading", populationname ## if cell does not exist in library load it from xml file if not self.library.has_key(cellname): 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) 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) self.library[cellname] = cellDict #self.populationDict[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: zrotation = float(string.split(rotationnote.text,'=')[1]) else: zrotation = 0 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.populationDict.update(self.translate_rotate(populationname,instanceid,self.library[cellname],x,y,z,zrotation))
def readNeuroMLFromFile(self,filename,params={}): """ 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. """ print "Loading neuroml file ... ", filename tree = ET.parse(filename) root_element = tree.getroot() self.model_dir = path.dirname(path.abspath(filename)) try: self.lengthUnits = root_element.attrib['lengthUnits'] except: self.lengthUnits = root_element.attrib['length_units'] self.nml_params = { 'model_dir':self.model_dir, } if root_element.tag.rsplit('}')[1] == 'neuroml': cellTag = neuroml_ns else: cellTag = mml_ns mmlR = MorphML(self.nml_params) self.cellsDict = {} for cells in root_element.findall('.//{'+cellTag+'}cells'): for cell in cells.findall('.//{'+cellTag+'}cell'): cellDict = mmlR.readMorphML(cell,params={},length_units=self.lengthUnits) self.cellsDict.update(cellDict) if len(self.cellsDict) != 0: return self.cellsDict else: nmlR = NetworkML(self.nml_params) return nmlR.readNetworkML(root_element,self.cellsDict,params=params,lengthUnits=self.lengthUnits)