# $Id: run.py,v 1.56 2012/09/20 14:06:03 samn Exp $ from pyinit import * from geom import * # from network import * # from params import * import sys try: import filt except: print("Couldn't import filt routines used in gethilbnqs") # sets up external inputs if net.noise: net.set_noise_inputs(h.tstop) #h.tstop sets duration of inpus for make noise case # handler for printing out time during simulation run def fi(): for i in range(0,int(h.tstop),100): h.cvode.event(i, "print " + str(i)) fih = h.FInitializeHandler(1, fi) # initialize random # generators of NetStims - forces it at beginning of each sim def myInitNetStims(): net.init_NetStims() fihns = h.FInitializeHandler(0, myInitNetStims) # save LFP with current pyramidal cell voltages _svNUM = 0 def saveLFPInterm (fbase): global _svNUM fout = fbase + "_svNUM_" + str(_svNUM) + "_lfp.vec" print("time is " , h.t, " saving LFP to " , fout) net.calc_lfp() mysvvec(fout,net.vlfp) net.clear_mem() _svNUM += 1 # setup events to save LFP intermittently _svFBase = "./tmp_" _svINC = 1000 def setSaveLFPEvents (): global _svNUM _svNUM = 0 stre = "nrnpython(\"saveLFPInterm(_svFBase)\")" for tt in range(_svINC,int(h.tstop),_svINC): h.cvode.event(tt,stre) h.cvode.event(h.tstop,stre) # example to save LFP intermittently: # fisv = h.FInitializeHandler(0, setSaveLFPEvents) #save vec to fn (fn is path) def mysvvec(fn,vec): fp = h.File() fp.wopen(fn) if fp.isopen(): vec.vwrite(fp) fp.close() else: print("savevec ERR: couldn't open " + fn) #run a sim and save data def minrunsv (simstr,tstop=1200,dt=0.1,savevolt=False): h.tstop=tstop h.dt=dt h.run() print("saving output data") net.calc_lfp() fn = "./data/"+simstr+"_lfp.vec" mysvvec(fn,net.vlfp) net.setsnq() # make NQS with spike times fn = "./data/"+simstr+"_snq.nqs" net.snq.sv(fn) if savevolt: nqv = net.getnqvolt() nqv.sv('./data/'+simstr+'_nqvolt.nqs') #read a Vector from file, fn is file-path, vec is a Vector def myrdvec(fn,vec): fp=h.File() fp.ropen(fn) if not fp.isopen(): print("myrdvec ERRA: Couldn't open " + fn) return False vec.vread(fp) fp.close() return True # concat a series of LFPs - fbase is base of filename def catlfp (fbase,svn): vlfp, vtmp = h.Vector(), h.Vector() for i in range(svn): fin = fbase + "_svNUM_" + str(i) + "_lfp.vec" if myrdvec(fin,vtmp): vlfp.append(vtmp) return vlfp #load data from minrunsv into net.vlfp,net.snq def loadminrundat(simstr,datadir="./data/",rdvolt=False): fs = datadir+simstr+"_lfp.vec" try: net.vlfp.resize(0) except: net.vlfp = h.Vector() myrdvec(fs,net.vlfp) fs = datadir+simstr+"_snq.nqs" try: h.nqsdel(net.snq) except: pass try: net.snq=h.NQS(fs) except: print("loadminrundat ERRB: couldn't read snq from " + fs) net.snq.verbose=0 # next, copy snq into vectors so can plot with net.rasterplot for po in net.cells: for i in range(len(po.lidvec)): ID = po.cell[i].id po.lidvec[i].resize(0) po.ltimevec[i].resize(0) if net.snq.select("id",ID): po.lidvec[i].copy(net.snq.getcol("id")) po.ltimevec[i].copy(net.snq.getcol("t")) net.snq.verbose=1 if rdvolt: try: h.nqsdel(net.nqv) except: pass fs = datadir+simstr+'_nqvolt.nqs' try: net.nqv=h.NQS(fs) except: print("loadminrundat ERRC: couldn't read nqvolt from " + fs) def myrast(spikes,times,sz=12): if h.g[0] == None: h.gg() spikes.mark(h.g[0],times,"O",sz,1,1) h.g[0].exec_menu("View = plot") ############################ # setup multithreading # pc = h.ParallelContext() # pc.nthread(32) # ############################ ####################################################################################################