simRef = simRefPrefix + "_" + sim + recompSuffix simDir = File(projFile.getParentFile(), "/simulations/" + simRef) timeFile = File(simDir, "time.dat") if not timeFile.exists(): print "\n------- Error loading data from simulation in directory: %s\n" % simDir.getCanonicalPath( ) else: if verbose: print "--- Reloading data from simulation in directory: %s" % simDir.getCanonicalPath( ) time.sleep(1) # wait a while... try: simData = SimulationData(simDir) simData.initialise() times = simData.getAllTimes() cellSegmentRef = simData.getAllLoadedDataStores().get( 0).getCellGroupName() + "_0" print "Looking for voltages of " + cellSegmentRef volts = simData.getVoltageAtAllTimes(cellSegmentRef) if verbose: print "Got " + str( len(volts) ) + " data points on cell seg ref: " + cellSegmentRef analyseStartTime = 0 analyseStopTime = 2000
simRefPrefix = (simAllPrefix+simConfigName+"_").replace(' ', '') simRef = simRefPrefix+"_"+sim+recompSuffix simDir = File(projFile.getParentFile(), "/simulations/"+simRef) timeFile = File(simDir, "time.dat") if not timeFile.exists(): print "\n------- Error loading data from simulation in directory: %s\n"%simDir.getCanonicalPath() else: if verbose: print "--- Reloading data from simulation in directory: %s"%simDir.getCanonicalPath() time.sleep(1) # wait a while... try: simData = SimulationData(simDir) simData.initialise() times = simData.getAllTimes() cellSegmentRef = simData.getAllLoadedDataStores().get(0).getCellGroupName()+"_0" print "Looking for voltages of "+cellSegmentRef volts = simData.getVoltageAtAllTimes(cellSegmentRef) if verbose: print "Got "+str(len(volts))+" data points on cell seg ref: "+cellSegmentRef analyseStartTime = 0 analyseStopTime = 2000 analyseThreshold = -20 # mV spikeTimes = SpikeAnalyser.getSpikeTimes(volts, times, analyseThreshold, analyseStartTime, analyseStopTime)
def testAll(argv=None): if argv is None: argv = sys.argv print "Loading project from "+ projFile.getCanonicalPath() simManager = nc.SimulationManager(projFile, numConcurrentSims = numConcurrentSims, verbose = verbose) ### Change num in each cell group densityGrC = 1.90e6 densityMF = 6.6e5 densityGoC = 4607 totDens = densityGrC + densityMF + densityGoC numMF = int(targetNum * densityMF/totDens) numGoC = int(targetNum * densityGoC/totDens) numGrC = targetNum - numMF - numGoC vol = targetNum/(totDens*1e-9) height = 150 side = math.sqrt(vol/height) info = "Number in %fx%fx%i box (vol: %f mm^3): GrC: %i, MF: %i, GoC: %i, Total: %i"%(side, side, height, vol*1e-9,numGrC, numMF,numGoC, (numGrC +numMF +numGoC)) print info SimulationsInfo.addExtraSimProperty("summary", info) region3D = simManager.project.regionsInfo.getRegionObject("TestGranCellVolume") region3D.setParameter(region3D.WIDTH_PARAM, side) region3D.setParameter(region3D.HEIGHT_PARAM, height) region3D.setParameter(region3D.DEPTH_PARAM, side) simManager.project.cellGroupsInfo.getCellPackingAdapter("TestScalingGrC").setMaxNumberCells(numGrC) simManager.project.cellGroupsInfo.getCellPackingAdapter("TestScalingGoC").setMaxNumberCells(numGoC) simManager.project.cellGroupsInfo.getCellPackingAdapter("TestScalingMF").setMaxNumberCells(numMF) ######simManager.project.cellGroupsInfo.getCellPackingAdapter("lg2").setMaxNumberCells(numCells2) allSims = simManager.runMultipleSims(simConfigs = simConfigs, simDt = simDt, simDuration = simDuration, simulators = simulators, runInBackground = runInBackground, varTimestepNeuron = varTimestepNeuron, mpiConfigs = mpiConfigs, suggestedRemoteRunTime = suggestedRemoteRunTime, simRefGlobalPrefix = simAllPrefix, runSims = runSims, maxElecLens = multipleRuns, saveAsHdf5 = saveAsHdf5, saveOnlySpikes = saveOnlySpikes, runMode = runMode) while (len(simManager.allRunningSims)>0): print "Waiting for the following sims to finish: "+str(simManager.allRunningSims) time.sleep(5) # wait a while... simManager.updateSimsRunning() times = [] procNums = [] for sim in allSims: simDir = File(projFile.getParentFile(), "/simulations/"+sim) try: simData = SimulationData(simDir) simData.initialise() simTime = simData.getSimulationProperties().getProperty("RealSimulationTime") print "Simulation: %s took %s seconds"%(sim, simTime) times.append(float(simTime)) paraConfig = simData.getSimulationProperties().getProperty("Parallel configuration") print paraConfig numProc = int(paraConfig[max(paraConfig.find(" host, ")+7, paraConfig.find(" hosts, ")+8):paraConfig.find(" processor")]) procNums.append(numProc) except: print "Error analysing simulation data from: %s"%simDir.getCanonicalPath() print sys.exc_info() print times print procNums ''' import matplotlib.pyplot as plt lines = plt.loglog(times, procNums, 'r:') plt.ylabel('Simulation time') plt.xlabel('Number of processors') plt.show()''' from ucl.physiol.neuroconstruct.gui.plotter import PlotManager from ucl.physiol.neuroconstruct.gui.plotter import PlotCanvas from ucl.physiol.neuroconstruct.dataset import DataSet plotFrame = PlotManager.getPlotterFrame("Time for simulation run on different numbers of processors", 0, 1) plotFrame.setViewMode(PlotCanvas.INCLUDE_ORIGIN_VIEW) info = "Simulation times for: "+str(procNums) dataSet = DataSet(info, info, "#", "s", "Number of processors", "Simulation time") dataSet.setGraphFormat(PlotCanvas.USE_CIRCLES_FOR_PLOT) for i in range(len(times)): dataSet.addPoint(procNums[i],times[i]*procNums[i]) #dataSet.addPoint(procNums[i],times[i]) plotFrame.addDataSet(dataSet)
print 'Loading project file: ', projFile.getAbsolutePath() pm = ProjectManager() project = pm.loadProject(projFile) print 'Successfully loaded project: ', project.getProjectName() simDir = File(projFile.getParentFile(), "/simulations/"+simRef) print print "--- Reloading data from simulation in directory: %s"%simDir.getCanonicalPath() plotFrame = PlotManager.getPlotterFrame("All voltage traces from simulation: "+simRef, False) try: simData = SimulationData(simDir) simData.initialise() volt_traces = simData.getCellSegRefs(True) for trace in volt_traces: ds = simData.getDataSet(trace, SimPlot.VOLTAGE, False) plotFrame.addDataSet(ds) except: print "Error analysing simulation data from: %s"%simDir.getCanonicalPath() print exc_info() plotFrame.setVisible(True)
for sim in simulators: for simRefPart in allSims: simRef = simRefPart + sim simDir = File(projFile.getParentFile(), "/simulations/"+simRef) timeFile = File(simDir, "time.dat") if timeFile.exists(): print "--- Reloading data from simulation in directory: %s"%simDir.getCanonicalPath() time.sleep(1) # wait a while... try: simData = SimulationData(simDir) simData.initialise() times = simData.getAllTimes() if plotSims: for dataStore in simData.getAllLoadedDataStores(): ds = simData.getDataSet(dataStore.getCellSegRef(), dataStore.getVariable(), False) print dataStore.getCellSegRef() if cellsegRefs.has_key(dataStore.getCellSegRef()):
def testAll(argv=None): if argv is None: argv = sys.argv print "Loading project from " + projFile.getCanonicalPath() simManager = nc.SimulationManager(projFile, numConcurrentSims=numConcurrentSims, verbose=verbose) allSims = simManager.runMultipleSims( simConfigs=simConfigs, simDt=simDt, simDuration=simDuration, simulators=simulators, runInBackground=runInBackground, varTimestepNeuron=varTimestepNeuron, mpiConfigs=mpiConfigs, suggestedRemoteRunTime=suggestedRemoteRunTime, simRefGlobalPrefix=simAllPrefix, runSims=runSims, maxElecLens=multipleRuns, saveAsHdf5=saveAsHdf5, saveOnlySpikes=saveOnlySpikes) while (len(simManager.allRunningSims) > 0): print "Waiting for the following sims to finish: " + str( simManager.allRunningSims) time.sleep(5) # wait a while... simManager.updateSimsRunning() times = [] procNums = [] for sim in allSims: simDir = File(projFile.getParentFile(), "/simulations/" + sim) try: simData = SimulationData(simDir) simData.initialise() simTime = simData.getSimulationProperties().getProperty( "RealSimulationTime") print "Simulation: %s took %s seconds" % (sim, simTime) times.append(float(simTime)) paraConfig = simData.getSimulationProperties().getProperty( "Parallel configuration") print paraConfig numProc = int(paraConfig[max( paraConfig.find(" host, ") + 7, paraConfig.find(" hosts, ") + 8):paraConfig.find(" processor")]) procNums.append(numProc) except: print "Error analysing simulation data from: %s" % simDir.getCanonicalPath( ) print sys.exc_info() print times print procNums ''' import matplotlib.pyplot as plt lines = plt.loglog(times, procNums, 'r:') plt.ylabel('Simulation time') plt.xlabel('Number of processors') plt.show()''' from ucl.physiol.neuroconstruct.gui.plotter import PlotManager from ucl.physiol.neuroconstruct.gui.plotter import PlotCanvas from ucl.physiol.neuroconstruct.dataset import DataSet plotFrame = PlotManager.getPlotterFrame( "Time for simulation run on different numbers of processors", 0, 1) plotFrame.setViewMode(PlotCanvas.INCLUDE_ORIGIN_VIEW) info = "Simulation times for: " + str(procNums) dataSet = DataSet(info, info, "#", "s", "Number of processors", "Simulation time") dataSet.setGraphFormat(PlotCanvas.USE_CIRCLES_FOR_PLOT) for i in range(len(times)): dataSet.addPoint(procNums[i], times[i] * procNums[i]) plotFrame.addDataSet(dataSet)
def reloadSims(waitForSimsToFinish): print "Trying to reload sims: "+str(allFinishedSims) plottedSims = [] for simRef in allFinishedSims: simDir = File(projFile.getParentFile(), "/simulations/"+simRef) timeFile = File(simDir, "time.dat") timeFile2 = File(simDir,"time.txt") # for PSICS... if timeFile.exists() or timeFile2.exists(): if verbose: print "--- Reloading data from simulation in directory: %s"%simDir.getCanonicalPath() time.sleep(1) # wait a while... try: simData = SimulationData(simDir) simData.initialise() times = simData.getAllTimes() if analyseSims: ''' volts = simData.getVoltageAtAllTimes(cellSegmentRef) if verbose: print "Got "+str(len(volts))+" data points on cell seg ref: "+cellSegmentRef analyseStartTime = 0 analyseStopTime = simConfig.getSimDuration() analyseThreshold = -20 # mV spikeTimes = SpikeAnalyser.getSpikeTimes(volts, times, analyseThreshold, analyseStartTime, analyseStopTime) print "Spike times in %s for sim %s: %s"%(cellSegmentRef, simRef, str(spikeTimes)) ''' if plotSims: simConfigName = simData.getSimulationProperties().getProperty("Sim Config") if simConfigName.find('(')>=0: simConfigName = simConfigName[0:simConfigName.find('(')] for dataStore in simData.getAllLoadedDataStores(): ds = simData.getDataSet(dataStore.getCellSegRef(), dataStore.getVariable(), False) if not plotVoltageOnly or dataStore.getVariable() == SimPlot.VOLTAGE: plotFrame = PlotManager.getPlotterFrame("Behaviour of "+dataStore.getVariable() \ +" on: %s for sim config: %s"%(str(simulators), simConfigName)) plotFrame.addDataSet(ds) plottedSims.append(simRef) except: print "Error analysing simulation data from: %s"%simDir.getCanonicalPath() print sys.exc_info() for simRef in plottedSims: allFinishedSims.remove(simRef) if waitForSimsToFinish and len(allRunningSims)>0: if verbose: print "Waiting for sims: %s to finish..."%str(allRunningSims) time.sleep(2) # wait a while... updateSimsRunning() reloadSims(True)
projectFileName = os.environ["NC_HOME"]+argLookup["ProjectFile"] slashparts = projectFileName.split('/') basefolder = '/'.join(slashparts[:-1]) + '/' print basefolder for sim in simList: projectFullDir = basefolder+"/simulations/"+sim if not os.path.exists(projectFullDir): print("--- project not found, directory missing %s ---"%projectFullDir) quit() simDir = File(basefolder, "/simulations/"+sim) print("--- Reloading data from simulation in directory: %s"%simDir.getCanonicalPath()) try: simData = SimulationData(simDir) simData.initialise() print("Data loaded: ") print(simData.getAllLoadedDataStores()) times = simData.getAllTimes() # simConfig was just grabbed for use here, it was CGspinstell_0 cellSegmentRef = simConfig.getCellGroups().get(0)+"_0" volts = simData.getVoltageAtAllTimes(cellSegmentRef) traceInfo = "Voltage at: %s in simulation: %s"%(cellSegmentRef, sim) dataSetV = DataSet(traceInfo, traceInfo, "ms", "mV", "Time", "Membrane potential") for i in range(len(times)): dataSetV.addPoint(times[i], volts[i])
#centre = Point3f(0,40,0) dist = pos.getPoint().distance(centre) #print "Cell %i at %s is %f away from centre %s"%(pos.cellNumber, str(pos.getPoint()), dist, str(centre)) if dist >= innerRadius and dist < outerRadius: cellsToUse.append(pos.cellNumber) GeneralUtils.timeCheck("After load sim", True) spikeLists = ArrayList() times = simData.getAllTimes() for cellNum in cellsToUse: cellSegRef = SimulationData.getCellRef(cellGroupName, cellNum) volts = simData.getVoltageAtAllTimes(cellSegRef) spikes = SpikeAnalyser.getSpikeTimes(volts, times, threshold, 0, times[-1]) spikeLists.add(spikes) ds = SpikeAnalyser.getSlidingSpikeSynchrony(spikeLists, times, slideSize, 0, times[-1])
simRefGlobalPrefix = simAllPrefix, runInBackground = runInBackground, simulators = [sim]) simDir = File(projFile.getParentFile(), "/simulations/"+simRef) timeFile = File(simDir, "time.dat") if not timeFile.exists(): print "\n------- Error loading data from simulation in directory: %s\n"%simDir.getCanonicalPath() else: if verbose: print "--- Reloading data from simulation in directory: %s"%simDir.getCanonicalPath() time.sleep(1) # wait a while... try: simData = SimulationData(simDir) simData.initialise() if not simData.isDataLoaded(): print "Waiting while data loads" time.sleep(5) times = simData.getAllTimes() cellSegmentRef = simData.getAllLoadedDataStores().get(0).getCellGroupName()+"_0" print "Looking for voltages of "+cellSegmentRef volts = simData.getVoltageAtAllTimes(cellSegmentRef) if verbose: print "Got "+str(len(volts))+" data points on cell seg ref: "+cellSegmentRef
def testAll(argv=None): if argv is None: argv = sys.argv print "Loading project from "+ projFile.getCanonicalPath() simManager = nc.SimulationManager(projFile, numConcurrentSims = numConcurrentSims, verbose = verbose) ### Change num in each cell group densityGrC = 1.90e6 densityMF = 6.6e5 densityGoC = 4607 totDens = densityGrC + densityMF + densityGoC for conf in confs.keys(): numb = conf mpiConfigs = [confs[conf]] perProc = 5000 targetNum = perProc*numb simAllPrefix = "NZ_%i_%i_"%(perProc, numb) # Adds a prefix to simulation reference print "Simulation pref: "+simAllPrefix numMF = int(targetNum * densityMF/totDens) numGoC = int(targetNum * densityGoC/totDens) numGrC = targetNum - numMF - numGoC vol = targetNum/(totDens*1e-9) height = 150 side = math.sqrt(vol/height) info = "Number in %fx%fx%i box (vol: %f mm^3): GrC: %i, MF: %i, GoC: %i, Total: %i"%(side, side, height, vol*1e-9,numGrC, numMF,numGoC, (numGrC +numMF +numGoC)) print info SimulationsInfo.addExtraSimProperty("summary", info) region3D = simManager.project.regionsInfo.getRegionObject("TestGranCellVolume") region3D.setParameter(region3D.WIDTH_PARAM, side) region3D.setParameter(region3D.HEIGHT_PARAM, height) region3D.setParameter(region3D.DEPTH_PARAM, side) simManager.project.cellGroupsInfo.getCellPackingAdapter("TestScalingGrC").setMaxNumberCells(numGrC) simManager.project.cellGroupsInfo.getCellPackingAdapter("TestScalingGoC").setMaxNumberCells(numGoC) simManager.project.cellGroupsInfo.getCellPackingAdapter("TestScalingMF").setMaxNumberCells(numMF) ######simManager.project.cellGroupsInfo.getCellPackingAdapter("lg2").setMaxNumberCells(numCells2) allSims = simManager.runMultipleSims(simConfigs = simConfigs, simDt = simDt, simDuration = simDuration, simulators = simulators, runInBackground = runInBackground, varTimestepNeuron = varTimestepNeuron, mpiConfigs = mpiConfigs, suggestedRemoteRunTime = suggestedRemoteRunTime, simRefGlobalPrefix = simAllPrefix, runSims = runSims, maxElecLens = multipleRuns, saveAsHdf5 = saveAsHdf5, saveOnlySpikes = saveOnlySpikes, runMode = runMode) if wait: while (len(simManager.allRunningSims)>0): print "Waiting for the following sims to finish: "+str(simManager.allRunningSims) time.sleep(30) # wait a while... simManager.updateSimsRunning() times = [] procNums = [] for sim in allSims: simDir = File(projFile.getParentFile(), "/simulations/"+sim) try: simData = SimulationData(simDir) simData.initialise() simTime = simData.getSimulationProperties().getProperty("RealSimulationTime") print "Simulation: %s took %s seconds"%(sim, simTime) times.append(float(simTime)) paraConfig = simData.getSimulationProperties().getProperty("Parallel configuration") print paraConfig numProc = int(paraConfig[max(paraConfig.find(" host, ")+7, paraConfig.find(" hosts, ")+8):paraConfig.find(" processor")]) procNums.append(numProc) except: print "Error analysing simulation data from: %s"%simDir.getCanonicalPath() print sys.exc_info()
def generateV_ICurve(self, projFile, simulator, simConfig, stimAmpLow, stimAmpInc, stimAmpHigh, stimDur, simDuration, maxNumSimultaneousSims = 4): # Load neuroConstruct project print "Loading project from file: " + projFile.getAbsolutePath()+", exists: "+ str(projFile.exists()) pm = ProjectManager() self.myProject = pm.loadProject(projFile) self.simulator = simulator simConfig = self.myProject.simConfigInfo.getSimConfig(simConfig) simConfig.setSimDuration(simDuration) pm.doGenerate(simConfig.getName(), self.neuroConstructSeed) while pm.isGenerating(): print "Waiting for the project to be generated with Simulation Configuration: "+str(simConfig) time.sleep(2) numGenerated = self.myProject.generatedCellPositions.getNumberInAllCellGroups() print "Number of cells generated: " + str(numGenerated) simReferences = {} if numGenerated > 0: print "Generating scripts for simulator: %s..."%simulator if simulator == 'NEURON': self.myProject.neuronFileManager.setQuitAfterRun(1) # Remove this line to leave the NEURON sim windows open after finishing self.myProject.neuronSettings.setCopySimFiles(1) # 1 copies hoc/mod files to PySim_0 etc. and will allow multiple sims to run at once self.myProject.neuronSettings.setGraphicsMode(0) # 0 hides graphs during execution if simulator == 'GENESIS': self.myProject.genesisFileManager.setQuitAfterRun(1) # Remove this line to leave the NEURON sim windows open after finishing self.myProject.genesisSettings.setCopySimFiles(1) # 1 copies hoc/mod files to PySim_0 etc. and will allow multiple sims to run at once self.myProject.genesisSettings.setGraphicsMode(0) # 0 hides graphs during execution stimAmp = stimAmpLow ADD_TO_BEFORE_INIT = self.myProject.neuronSettings.getNativeBlock(NativeCodeLocation.BEFORE_INITIAL) ADD_TO_RECORD_I = self.myProject.neuronSettings.getNativeBlock(NativeCodeLocation.AFTER_SIMULATION) ADD_TO_START_FINITIALIZE = self.myProject.neuronSettings.getNativeBlock(NativeCodeLocation.START_FINITIALIZE) while stimAmp <= stimAmpHigh: while (len(self.simsRunning)>=maxNumSimultaneousSims): print "Sims currently running: "+str(self.simsRunning) print "Waiting..." time.sleep(3) # wait a while... self.updateSimsRunning() simRef = "PySim_"+str(float(stimAmp)) print "Going to run simulation: "+simRef ######## Adjusting the amplitude of the Voltage clamp ############### TEXT_BEFORE_CREATION = "objref clampobj" + "\n" + "objref record_current" + "\n" + "objref data_save" + "\n" # TEXT_BEFORE_INIT = "GranuleCell_mod_tonic[0].Soma {\n" + "clampobj = new SEClamp(0.5)\n" + "clampobj.dur1 = 150.0" + "\n" + "clampobj.amp1 = -100.0" + "\n" + "clampobj.dur2 = " + str(stimDur) + "\n" + "clampobj.amp2 = " + str(stimAmp) + "\n" + "clampobj.dur3 = 150.0" + "\n" + "clampobj.amp3 = -100.0" + "\n" + "clampobj.rs = 0.00001\n " + "}\n" # This should do the trick # TEXT_BEFORE_INIT = TEXT_BEFORE_INIT + ADD_TO_BEFORE_INIT TEXT_START_FINITIALIZE = "GranuleCell_mod_tonic[0].Soma {\n" + "clampobj = new SEClamp(0.5)\n" + "clampobj.dur1 = 150.0" + "\n" + "clampobj.amp1 = -100.0" + "\n" + "clampobj.dur2 = " + str(stimDur) + "\n" + "clampobj.amp2 = " + str(stimAmp) + "\n" + "clampobj.dur3 = 150.0" + "\n" + "clampobj.amp3 = -40.0" + "\n" + "clampobj.rs = 0.00001\n" + "record_current = new Vector()" + "\n" + "record_current.record(&clampobj.i)" + "\n" + "}\n" #This should do the trick TEXT_START_FINITIALIZE = TEXT_START_FINITIALIZE + ADD_TO_START_FINITIALIZE TEXT_TO_RECORD_I = """data_save = new File() \n""" + """strdef filename \n""" + """sprint(filename, """" + self.myProject.getProjectMainDirectory().getAbsolutePath() + """/simulations/current%.3f.txt", clampobj.amp2) \n""" + """data_save.wopen(filename) \n""" + """record_current.printf(data_save) \n""" + """data_save.close() \n""" TEXT_TO_RECORD_I = TEXT_TO_RECORD_I + ADD_TO_RECORD_I self.myProject.neuronSettings.setNativeBlock(NativeCodeLocation.BEFORE_CELL_CREATION, TEXT_BEFORE_CREATION) # self.myProject.neuronSettings.setNativeBlock(NativeCodeLocation.BEFORE_INITIAL, TEXT_BEFORE_INIT) self.myProject.neuronSettings.setNativeBlock(NativeCodeLocation.START_FINITIALIZE, TEXT_START_FINITIALIZE) self.myProject.neuronSettings.setNativeBlock(NativeCodeLocation.AFTER_SIMULATION, TEXT_TO_RECORD_I) print "Next stim: "+ str(stimAmp) self.myProject.simulationParameters.setReference(simRef) if simulator == "NEURON": self.myProject.neuronFileManager.generateTheNeuronFiles(simConfig, None, NeuronFileManager.RUN_HOC, self.simulatorSeed) print "Generated NEURON files for: "+simRef compileProcess = ProcessManager(self.myProject.neuronFileManager.getMainHocFile()) compileSuccess = compileProcess.compileFileWithNeuron(0,0) print "Compiled NEURON files for: "+simRef if compileSuccess: pm.doRunNeuron(simConfig) print "Set running simulation: "+simRef self.simsRunning.append(simRef) if simulator == "GENESIS": compartmentalisation = GenesisCompartmentalisation() self.myProject.genesisFileManager.generateTheGenesisFiles(simConfig, None, compartmentalisation, self.simulatorSeed) print "Generated GENESIS files for: "+simRef pm.doRunGenesis(simConfig) print "Set running simulation: "+simRef self.simsRunning.append(simRef) time.sleep(1) # Wait for sim to be kicked off simReferences[simRef] = stimAmp stimAmp = stimAmp +stimAmpInc print print "Finished running "+str(len(simReferences))+" simulations for project "+ projFile.getAbsolutePath() print "These can be loaded and replayed in the previous simulation browser in the GUI" print while (len(self.simsRunning)>0): print "Sims currently running: "+str(self.simsRunning) print "Waiting..." time.sleep(4) # wait a while... self.updateSimsRunning() #simReferences = {'PySim_0.3':0.3,'PySim_0.4':0.4,'PySim_0.5':0.5} plotFrameVI = PlotManager.getPlotterFrame("V-I curve from project: "+str(self.myProject.getProjectFile())+" on "+simulator , 1, 1) plotFrameVI.setViewMode(PlotCanvas.INCLUDE_ORIGIN_VIEW) info = "V-I curve for Simulation Configuration: "+str(simConfig) dataSet = DataSet(info, info, "mV", "nA", "Voltage", "Current") dataSet.setGraphFormat(PlotCanvas.USE_CIRCLES_FOR_PLOT) simList = simReferences.keys() simList.sort() for sim in simList: simDir = File(projFile.getParentFile(), "/neuroConstruct/models/Dan_GranCell/simulations/"+sim) print print "--- Reloading data from simulation in directory: %s"%simDir.getCanonicalPath() try: simData = SimulationData(simDir) simData.initialise() print "Data loaded: " print simData.getAllLoadedDataStores() times = simData.getAllTimes() cellSegmentRef = simConfig.getCellGroups().get(0)+"_0" cfilename = "E:/neuroConstruct/models/Dan_GranCell/simulations/" + sim + "/current.txt" trace = "E:/neuroConstruct/models/Dan_GranCell/simulations/" + sim + ".txt" # cFILE = open(cfilename, "r") strom = 0.0 volts = simData.getVoltageAtAllTimes(cellSegmentRef) traceInfo = "Voltage at: %s in simulation: %s"%(cellSegmentRef, sim) stimAmp = simReferences[sim] print "Current at %f mV in sim %s: %f"%(stimAmp, sim, float(strom)) dataSet.addPoint(stimAmp,float(strom)) except: print "Error analysing simulation data from: %s"%simDir.getCanonicalPath() print sys.exc_info()[0] plotFrameVI.addDataSet(dataSet)
def testAll(argv=None): if argv is None: argv = sys.argv print "Loading project from "+ projFile.getCanonicalPath() simManager = nc.SimulationManager(projFile, numConcurrentSims = numConcurrentSims, verbose = verbose) ### Change num in each cell group simManager.project.cellGroupsInfo.getCellPackingAdapter("ExcCells").setMaxNumberCells(numExcCells) simManager.project.cellGroupsInfo.getCellPackingAdapter("INCells").setMaxNumberCells(numINCells) ### Change weights in synapses/gap junctions simConfig = simManager.project.simConfigInfo.getSimConfig(simConfigName) for netConnName in simConfig.getNetConns(): print "Changing synaptic delay in %s to %f"%(netConnName, defaultSynapticDelay) delayGen = NumberGenerator(defaultSynapticDelay) for synProps in simManager.project.morphNetworkConnectionsInfo.getSynapseList(netConnName): synProps.setDelayGenerator(delayGen) # defaultSynapticDelay will be recorded in simulation.props and listed in SimulationBrowser GUI SimulationsInfo.addExtraSimProperty("defaultSynapticDelay", str(defaultSynapticDelay)) allSims = simManager.runMultipleSims(simConfigs = [simConfigName], simDt = simDt, simDuration = simDuration, simulators = simulators, runInBackground = runInBackground, varTimestepNeuron = varTimestepNeuron, mpiConfigs = mpiConfigs, suggestedRemoteRunTime = suggestedRemoteRunTime, simRefGlobalPrefix = simAllPrefix, runSims = runSims, neuroConstructSeed = neuroConstructSeed, simulatorSeed = simulatorSeed) while (len(simManager.allRunningSims)>0): print "Waiting for the following sims to finish: "+str(simManager.allRunningSims) time.sleep(5) # wait a while... simManager.updateSimsRunning() for sim in allSims: simDir = File(projFile.getParentFile(), "/simulations/"+sim) try: simData = SimulationData(simDir) simData.initialise() simTime = simData.getSimulationProperties().getProperty("RealSimulationTime") print "Simulation: %s took %s seconds"%(sim, simTime) except: print "Error analysing simulation data from: %s"%simDir.getCanonicalPath() if mpiConfigs == [MpiSettings.LOCAL_SERIAL] or mpiConfigs == [MpiSettings.MATLEM_1PROC]: simManager.reloadSims(plotVoltageOnly = True, plotSims = plotSims, analyseSims = analyseSims)
if compileSuccess: pm.doRunNeuron(simConfig) print "Set running simulation: "+simRef simDir = File(projFile.getParentFile(), "/simulations/"+simRef) timeFile = File(simDir, "time.dat") while not timeFile.exists(): print "Waiting for file: %s to be generated..."%timeFile.getCanonicalPath() sleep(2) # wait a while... print "--- Reloading data from simulation in directory: %s"%simDir.getCanonicalPath() sleep(1) # wait a while... try: simData = SimulationData(simDir) simData.initialise() times = simData.getAllTimes() cellSegmentRef = simConfig.getCellGroups().get(0)+"_0" volts = simData.getVoltageAtAllTimes(cellSegmentRef) print "Got "+str(len(volts))+" data points on cell seg ref: "+cellSegmentRef analyseStartTime = 0 analyseStopTime = simConfig.getSimDuration() analyseThreshold = -20 # mV spikeTimes = SpikeAnalyser.getSpikeTimes(volts, times, analyseThreshold, analyseStartTime, analyseStopTime) print "Number of spikes in %s: %i"%(cellSegmentRef, len(spikeTimes)) avgFreq = 0.
def testAll(argv=None): if argv is None: argv = sys.argv print "Loading project from "+ projFile.getCanonicalPath() simManager = nc.SimulationManager(projFile, numConcurrentSims = numConcurrentSims, verbose = verbose) ### Change num in each cell group simManager.project.cellGroupsInfo.getCellPackingAdapter("lg1").setMaxNumberCells(numCells1) simManager.project.cellGroupsInfo.getCellPackingAdapter("lg2").setMaxNumberCells(numCells2) allSims = simManager.runMultipleSims(simConfigs = simConfigs, simDt = simDt, simDuration = simDuration, simulators = simulators, runInBackground = runInBackground, varTimestepNeuron = varTimestepNeuron, mpiConfigs = mpiConfigs, suggestedRemoteRunTime = suggestedRemoteRunTime, simRefGlobalPrefix = simAllPrefix, runSims = runSims, maxElecLens = multipleRuns, saveAsHdf5 = saveAsHdf5, saveOnlySpikes = saveOnlySpikes, runMode = runMode) while (len(simManager.allRunningSims)>0): print "Waiting for the following sims to finish: "+str(simManager.allRunningSims) time.sleep(5) # wait a while... simManager.updateSimsRunning() times = [] procNums = [] for sim in allSims: simDir = File(projFile.getParentFile(), "/simulations/"+sim) try: simData = SimulationData(simDir) simData.initialise() simTime = simData.getSimulationProperties().getProperty("RealSimulationTime") print "Simulation: %s took %s seconds"%(sim, simTime) times.append(float(simTime)) paraConfig = simData.getSimulationProperties().getProperty("Parallel configuration") print paraConfig numProc = int(paraConfig[max(paraConfig.find(" host, ")+7, paraConfig.find(" hosts, ")+8):paraConfig.find(" processor")]) procNums.append(numProc) except: print "Error analysing simulation data from: %s"%simDir.getCanonicalPath() print sys.exc_info() print times print procNums ''' import matplotlib.pyplot as plt lines = plt.loglog(times, procNums, 'r:') plt.ylabel('Simulation time') plt.xlabel('Number of processors') plt.show()''' from ucl.physiol.neuroconstruct.gui.plotter import PlotManager from ucl.physiol.neuroconstruct.gui.plotter import PlotCanvas from ucl.physiol.neuroconstruct.dataset import DataSet plotFrame = PlotManager.getPlotterFrame("Time for simulation run on different numbers of processors", 0, 1) plotFrame.setViewMode(PlotCanvas.INCLUDE_ORIGIN_VIEW) info = "Simulation times for: "+str(procNums) dataSet = DataSet(info, info, "#", "s", "Number of processors", "Simulation time") dataSet.setGraphFormat(PlotCanvas.USE_CIRCLES_FOR_PLOT) for i in range(len(times)): #dataSet.addPoint(procNums[i],times[i]*procNums[i]) dataSet.addPoint(procNums[i],times[i]) plotFrame.addDataSet(dataSet)
def generateF_ICurve(self, projFile, simulator, simConfig, preStimAmp, preStimDel, preStimDur, stimAmpLow, stimAmpInc, stimAmpHigh, stimDel, stimDur, simDuration, analyseStartTime, analyseStopTime, analyseThreshold, maxNumSimultaneousSims = 4): # Load neuroConstruct project print "Loading project from file: " + projFile.getAbsolutePath()+", exists: "+ str(projFile.exists()) pm = ProjectManager() self.myProject = pm.loadProject(projFile) self.simulator = simulator simConfig = self.myProject.simConfigInfo.getSimConfig(simConfig) simConfig.setSimDuration(simDuration) pm.doGenerate(simConfig.getName(), self.neuroConstructSeed) while pm.isGenerating(): print "Waiting for the project to be generated with Simulation Configuration: "+str(simConfig) time.sleep(2) numGenerated = self.myProject.generatedCellPositions.getNumberInAllCellGroups() print "Number of cells generated: " + str(numGenerated) simReferences = {} if numGenerated > 0: print "Generating scripts for simulator: %s..."%simulator if simulator == 'NEURON': self.myProject.neuronFileManager.setQuitAfterRun(1) # Remove this line to leave the NEURON sim windows open after finishing self.myProject.neuronSettings.setCopySimFiles(1) # 1 copies hoc/mod files to PySim_0 etc. and will allow multiple sims to run at once self.myProject.neuronSettings.setGraphicsMode(0) # 0 hides graphs during execution if simulator == 'GENESIS': self.myProject.genesisFileManager.setQuitAfterRun(1) # Remove this line to leave the NEURON sim windows open after finishing self.myProject.genesisSettings.setCopySimFiles(1) # 1 copies hoc/mod files to PySim_0 etc. and will allow multiple sims to run at once self.myProject.genesisSettings.setGraphicsMode(0) # 0 hides graphs during execution stimAmp = stimAmpLow while stimAmp <= stimAmpHigh: while (len(self.simsRunning)>=maxNumSimultaneousSims): print "Sims currently running: "+str(self.simsRunning) print "Waiting..." time.sleep(3) # wait a while... self.updateSimsRunning() simRef = "PySim_"+str(float(stimAmp)) print "Going to run simulation: "+simRef ######## Adjusting the amplitude of the current clamp ############### # preStim = self.myProject.elecInputInfo.getStim(simConfig.getInputs().get(0)) preStim = self.myProject.elecInputInfo.getStim("Input_3") preStim.setAmp(NumberGenerator(preStimAmp)) preStim.setDel(NumberGenerator(preStimDel)) preStim.setDur(NumberGenerator(preStimDur)) self.myProject.elecInputInfo.updateStim(preStim) # stim = self.myProject.elecInputInfo.getStim(simConfig.getInputs().get(1)) stim = self.myProject.elecInputInfo.getStim("Input_4") stim.setAmp(NumberGenerator(stimAmp)) stim.setDel(NumberGenerator(stimDel)) stim.setDur(NumberGenerator(stimDur)) self.myProject.elecInputInfo.updateStim(stim) print "Next stim: "+ str(stim) self.myProject.simulationParameters.setReference(simRef) if simulator == "NEURON": self.myProject.neuronFileManager.generateTheNeuronFiles(simConfig, None, NeuronFileManager.RUN_HOC, self.simulatorSeed) print "Generated NEURON files for: "+simRef compileProcess = ProcessManager(self.myProject.neuronFileManager.getMainHocFile()) compileSuccess = compileProcess.compileFileWithNeuron(0,0) print "Compiled NEURON files for: "+simRef if compileSuccess: pm.doRunNeuron(simConfig) print "Set running simulation: "+simRef self.simsRunning.append(simRef) if simulator == "GENESIS": compartmentalisation = GenesisCompartmentalisation() self.myProject.genesisFileManager.generateTheGenesisFiles(simConfig, None, compartmentalisation, self.simulatorSeed) print "Generated GENESIS files for: "+simRef pm.doRunGenesis(simConfig) print "Set running simulation: "+simRef self.simsRunning.append(simRef) time.sleep(1) # Wait for sim to be kicked off simReferences[simRef] = stimAmp stimAmp = stimAmp +stimAmpInc print print "Finished running "+str(len(simReferences))+" simulations for project "+ projFile.getAbsolutePath() print "These can be loaded and replayed in the previous simulation browser in the GUI" print while (len(self.simsRunning)>0): print "Sims currently running: "+str(self.simsRunning) print "Waiting..." time.sleep(4) # wait a while... self.updateSimsRunning() #simReferences = {'PySim_0.3':0.3,'PySim_0.4':0.4,'PySim_0.5':0.5} plotFrameFI = PlotManager.getPlotterFrame("F-I curve from project: "+str(self.myProject.getProjectFile())+" on "+simulator , 1, 1) plotFrameVolts = PlotManager.getPlotterFrame("VoltageTraces from project: "+str(self.myProject.getProjectFile())+" on "+simulator , 1, 1) plotFrameFI.setViewMode(PlotCanvas.INCLUDE_ORIGIN_VIEW) info = "F-I curve for Simulation Configuration: "+str(simConfig) dataSet = DataSet(info, info, "nA", "Hz", "Current injected", "Firing frequency") dataSet.setGraphFormat(PlotCanvas.USE_CIRCLES_FOR_PLOT) simList = simReferences.keys() simList.sort() for sim in simList: simDir = File(projFile.getParentFile(), "/neuroConstruct/models/Dan_GranCell/simulations/"+sim) print print "--- Reloading data from simulation in directory: %s"%simDir.getCanonicalPath() try: simData = SimulationData(simDir) simData.initialise() print "Data loaded: " print simData.getAllLoadedDataStores() times = simData.getAllTimes() cellSegmentRef = simConfig.getCellGroups().get(0)+"_0" volts = simData.getVoltageAtAllTimes(cellSegmentRef) traceInfo = "Voltage at: %s in simulation: %s"%(cellSegmentRef, sim) dataSetV = DataSet(traceInfo, traceInfo, "mV", "ms", "Membrane potential", "Time") for i in range(len(times)): dataSetV.addPoint(times[i], volts[i]) plotFrameVolts.addDataSet(dataSetV) spikeTimes = SpikeAnalyser.getSpikeTimes(volts, times, analyseThreshold, analyseStartTime, analyseStopTime) stimAmp = simReferences[sim] print "Number of spikes at %f nA in sim %s: %i"%(stimAmp, sim, len(spikeTimes)) avgFreq = 0 if len(spikeTimes)>1: avgFreq = len(spikeTimes)/ ((analyseStopTime - analyseStartTime)/1000.0) dataSet.addPoint(stimAmp,avgFreq) except: print "Error analysing simulation data from: %s"%simDir.getCanonicalPath() print sys.exc_info()[0] plotFrameFI.addDataSet(dataSet)
def make_fF_Curve(self, projFile, simulator, simConfig, nTrains, simDuration, analyseStartTime, analyseStopTime, analyseThreshold, maxNumSimultaneousSims = 4): # Load neuroConstruct project print "Loading project from file: " + projFile.getAbsolutePath()+", exists: "+ str(projFile.exists()) pm = ProjectManager() self.myProject = pm.loadProject(projFile) self.simulator = simulator simConfig = self.myProject.simConfigInfo.getSimConfig(simConfig) simConfig.setSimDuration(simDuration) pm.doGenerate(simConfig.getName(), self.neuroConstructSeed) while pm.isGenerating(): print "Waiting for the project to be generated with Simulation Configuration: "+str(simConfig) time.sleep(2) numGenerated = self.myProject.generatedCellPositions.getNumberInAllCellGroups() print "Number of cells generated: " + str(numGenerated) simReferences = {} if numGenerated > 0: print "Generating scripts for simulator: %s..."%simulator if simulator == 'NEURON': self.myProject.neuronFileManager.setQuitAfterRun(1) # Remove this line to leave the NEURON sim windows open after finishing self.myProject.neuronSettings.setCopySimFiles(1) # 1 copies hoc/mod files to PySim_0 etc. and will allow multiple sims to run at once self.myProject.neuronSettings.setGraphicsMode(0) # 0 hides graphs during execution if simulator == 'GENESIS': self.myProject.genesisFileManager.setQuitAfterRun(1) # Remove this line to leave the NEURON sim windows open after finishing self.myProject.genesisSettings.setCopySimFiles(1) # 1 copies hoc/mod files to PySim_0 etc. and will allow multiple sims to run at once self.myProject.genesisSettings.setGraphicsMode(0) # 0 hides graphs during execution currentTrain = 0 ADD_TO_START_FINITIALIZE = self.myProject.neuronSettings.getNativeBlock(NativeCodeLocation.START_FINITIALIZE) ADD_TO_RECORD_I = self.myProject.neuronSettings.getNativeBlock(NativeCodeLocation.AFTER_SIMULATION) while currentTrain <= nTrains: while (len(self.simsRunning)>=maxNumSimultaneousSims): print "Sims currently running: "+str(self.simsRunning) print "Waiting..." time.sleep(3) # wait a while... self.updateSimsRunning() simRef = "PySim_"+str(currentTrain) print "Going to run simulation: "+simRef ######## Adjusting the amplitude of the Voltage clamp ############### TEXT_BEFORE_CREATION = """objref vector, gTrainFile\n""" + "objectvar clamp\n" ### TEXT_BEFORE_INIT = "GranuleCell_mod_tonic[0].Soma {\n" + "clampobj = new VClamp(0.5)\n" + "clampobj.dur[0] = " + str(stimDur) + "\n" + "clampobj.amp[0] = " + str(stimAmp) + "\n" + "}\n" # This should do the trick TEXT_START_FINITIALIZE = "\n" + "gTrainFile = new File() \n" + "vector = new Vector(100000) \n" + "access GranuleCell_mod_tonic[0].Soma \n" + "clamp = new SEClamp(0.5) \n" + "clamp.amp1 = 0 \n" + "clamp.dur1 = 1e9 \n" + """gTrainFile.ropen("E:/neuroConstruct/models/Dan_GranCell/gTrains_nS/gAMPA_""" + str(currentTrain) + """.txt") \n""" + "vector.scanf(gTrainFile) \n" + "gTrainFile.close \n" + "for i = 0, vector.size() -1 { \n" + " if (vector.x[i] <= 0) { \n" + " vector.x[i] = 1e-20 \n" + " } \n" + " } \n" + "for i = 0, vector.size() -1 { \n" + " vector.x[i] = ( 1 / vector.x[i] ) * 1000 \n" + " } \n" + "vector.play(&clamp.rs, 0.03) \n" # This TEXT_START_FINITIALIZE = TEXT_START_FINITIALIZE + ADD_TO_START_FINITIALIZE TEXT_TO_RECORD_I = """// currently not used \n""" TEXT_TO_RECORD_I = TEXT_TO_RECORD_I + ADD_TO_RECORD_I self.myProject.neuronSettings.setNativeBlock(NativeCodeLocation.BEFORE_CELL_CREATION, TEXT_BEFORE_CREATION) self.myProject.neuronSettings.setNativeBlock(NativeCodeLocation.START_FINITIALIZE, TEXT_START_FINITIALIZE) self.myProject.neuronSettings.setNativeBlock(NativeCodeLocation.AFTER_SIMULATION, TEXT_TO_RECORD_I) print "Next Train: "+ str(currentTrain) self.myProject.simulationParameters.setReference(simRef) if simulator == "NEURON": self.myProject.neuronFileManager.generateTheNeuronFiles(simConfig, None, NeuronFileManager.RUN_HOC, self.simulatorSeed) print "Generated NEURON files for: "+simRef compileProcess = ProcessManager(self.myProject.neuronFileManager.getMainHocFile()) compileSuccess = compileProcess.compileFileWithNeuron(0,0) print "Compiled NEURON files for: "+simRef if compileSuccess: pm.doRunNeuron(simConfig) print "Set running simulation: "+simRef self.simsRunning.append(simRef) if simulator == "GENESIS": compartmentalisation = GenesisCompartmentalisation() self.myProject.genesisFileManager.generateTheGenesisFiles(simConfig, None, compartmentalisation, self.simulatorSeed) print "Generated GENESIS files for: "+simRef pm.doRunGenesis(simConfig) print "Set running simulation: "+simRef self.simsRunning.append(simRef) time.sleep(1) # Wait for sim to be kicked off simReferences[simRef] = currentTrain currentTrain = currentTrain + 1 print print "Finished running "+str(len(simReferences))+" simulations for project "+ projFile.getAbsolutePath() print "These can be loaded and replayed in the previous simulation browser in the GUI" print while (len(self.simsRunning)>0): print "Sims currently running: "+str(self.simsRunning) print "Waiting..." time.sleep(4) # wait a while... self.updateSimsRunning() #simReferences = {'PySim_0.3':0.3,'PySim_0.4':0.4,'PySim_0.5':0.5} plotFrameFf = PlotManager.getPlotterFrame("F-f curve from project: "+str(self.myProject.getProjectFile())+" on "+simulator , 1, 1) plotFrameVolts = PlotManager.getPlotterFrame("VoltageTraces from project: "+str(self.myProject.getProjectFile())+" on "+simulator , 1, 1) plotFrameFf.setViewMode(PlotCanvas.INCLUDE_ORIGIN_VIEW) info = "F-f curve for Simulation Configuration: "+str(simConfig) dataSet = DataSet(info, info, "Hz", "Hz", "Input_Freq", "Output_Freq") dataSet.setGraphFormat(PlotCanvas.USE_CIRCLES_FOR_PLOT) simList = simReferences.keys() simList.sort() traininfos = open("E:/neuroConstruct/models/Dan_GranCell/gAMPA_traininfo.txt") train_info_list = traininfos.readlines() currentTrain = 0 for sim in simList: simDir = File(projFile.getParentFile(), "E:/neuroConstruct/models/Dan_GranCell/simulations/"+sim) print print "--- Reloading data from simulation in directory: %s"%simDir.getCanonicalPath() try: simData = SimulationData(simDir) simData.initialise() print "Data loaded: " print simData.getAllLoadedDataStores() times = simData.getAllTimes() cellSegmentRef = simConfig.getCellGroups().get(0)+"_0" volts = simData.getVoltageAtAllTimes(cellSegmentRef) time.sleep(2) traceInfo = "Voltage at: %s in simulation: %s"%(cellSegmentRef, sim) dataSetV = DataSet(traceInfo, traceInfo, "ms", "mV", "Time", "Membrane Potential") Spike_List = [] Spike_List.append(0.00) for i in range(len(times)): dataSetV.addPoint(times[i], volts[i]) for i in range(len(times)): if (volts[i] > 0.0): if (times[i] - Spike_List[len(Spike_List)-1] > 0.50): Spike_List.append(times[i]) Spike_List.remove(0.00) plotFrameVolts.addDataSet(dataSetV) spikeTimes = SpikeAnalyser.getSpikeTimes(volts, times, analyseThreshold, analyseStartTime, analyseStopTime) currentTrain_Freq = float(train_info_list[currentTrain-1]) print "Number of spikes in sim %s: %i"%(sim, len(spikeTimes)) avgFreq = 0 if len(Spike_List)>0: avgFreq = 1000.0 / ((Spike_List[len(Spike_List)-1] - Spike_List[0]) / (len(Spike_List) -1)) dataSet.addPoint(currentTrain_Freq,avgFreq) currentTrain = currentTrain + 1 except: print "Error analysing simulation data from: %s"%simDir.getCanonicalPath() print sys.exc_info()[0] plotFrameFf.addDataSet(dataSet)
slashparts = projectFileName.split('/') basefolder = '/'.join(slashparts[:-1]) + '/' print basefolder for sim in simList: projectFullDir = basefolder + "/simulations/" + sim if not os.path.exists(projectFullDir): print("--- project not found, directory missing %s ---" % projectFullDir) quit() simDir = File(basefolder, "/simulations/" + sim) print("--- Reloading data from simulation in directory: %s" % simDir.getCanonicalPath()) try: simData = SimulationData(simDir) simData.initialise() print("Data loaded: ") print(simData.getAllLoadedDataStores()) times = simData.getAllTimes() # simConfig was just grabbed for use here, it was CGspinstell_0 cellSegmentRef = simConfig.getCellGroups().get(0) + "_0" volts = simData.getVoltageAtAllTimes(cellSegmentRef) traceInfo = "Voltage at: %s in simulation: %s" % (cellSegmentRef, sim) dataSetV = DataSet(traceInfo, traceInfo, "ms", "mV", "Time", "Membrane potential") for i in range(len(times)):