import sys import os import string from neuron import * from datetime import datetime h("strdef simname, allfiles, simfiles, output_file, datestr, uname, comment") h.simname=simname = "mtlhpc" h.allfiles=allfiles = "geom.hoc pyinit.py geom.py mpisim.py" h.simfiles=simfiles = "pyinit.py geom.py mpisim.py" h("runnum=1") runnum = 1.0 h.datestr=datestr = "10dec15" h.output_file=output_file = "data/15dec31.1" h.uname=uname = "x86_64" h("templates_loaded=0") templates_loaded=0 h("xwindows=1.0") h.xopen("nrnoc.hoc") h.xopen("init.hoc") CTYPi = 50.0; STYPi = 12.0 from pyinit import * from neuron import h, gui from nqs import * from labels import * import random from pylab import * import matplotlib.gridspec as gridspec import ConfigParser Vector=h.Vector newfigs=False dodrawbounds=True defbinsz=10 stimdel = 500 # delay from stim to measured firing rate peak response myhost = os.uname()[1] defnCPU=8 # this should match -np 8 , where 8 is number of cores used in mpiexec print 'Using ' , defnCPU, ' cpus by default.' config = ConfigParser.ConfigParser() # determine config file name def setfcfg (): fcfg = "netcfg.cfg" # default config file name for i in xrange(len(sys.argv)): if sys.argv[i].endswith(".cfg") and os.path.exists(sys.argv[i]): fcfg = sys.argv[i] print "config file is " , fcfg return fcfg fcfg=setfcfg() # config file name config.read(fcfg) def conffloat (base,var): return float(config.get(base,var)) def confint (base,var): return int(config.get(base,var)) def confstr (base,var): return config.get(base,var) tstart = 0 tstop = conffloat('run','tstop') + tstart binsz = conffloat("run","binsz") # bin size (in milliseconds) for MUA recdt = conffloat('run','recdt') recvdt = conffloat('run','recvdt') vtslow=Vector(); vtslow.indgen(tstart,tstop-recdt,recdt); vtslow=numpy.array(vtslow.to_python()) vtfast=Vector(); vtfast.indgen(tstart,tstop-recvdt,recvdt); vtfast=numpy.array(vtfast.to_python()) useWM = confint('mem','useWM') simstr = config.get('run','simstr') baselinest = float(config.get("mem","baset")) #Baseline Start nMem = confint('mem','nMem') startt = conffloat('mem','startt') def makefname (simstr,pcid): return 'data/' + simstr + '_pc_' + str(pcid) + '.npz' ix,ixe=[1e9 for i in xrange(CTYPi)],[-1e9 for i in xrange(CTYPi)] numc=[0 for i in xrange(CTYPi)] allcells,icells,ecells=0,0,0 # reload the variables from config file def reloadvars (): global tstart,loadstate,tstop,binsz,recdt,recvdt,vtslow,vtfast,useWM,simstr,baselinest,numc,allcells,ecells,icells,startt tstart = conffloat('run','loadtstop') loadstate = confint('run','loadstate') if loadstate == 0: tstart = 0 # only use previous end time if loading state tstop = conffloat('run','tstop') + tstart binsz = conffloat("run","binsz") # bin size (in milliseconds) for MUA recdt = conffloat('run','recdt') recvdt = conffloat('run','recvdt') vtslow=Vector(); vtslow.indgen(tstart,tstop-recdt,recdt); vtslow=numpy.array(vtslow.to_python()) vtfast=Vector(); vtfast.indgen(tstart,tstop-recvdt,recvdt); vtfast=numpy.array(vtfast.to_python()) useWM = confint('mem','useWM') simstr = config.get('run','simstr') baselinest = float(config.get("mem","baset")) #Baseline Start numc=[0 for i in xrange(CTYPi)] allcells,ecells,icells=0,0,0 startt = conffloat('mem','startt') # setup start/end indices for cell types def makeix (lctyID): global ix,ixe,allcells,ecells,icells allcells,ecells,icells=0,0,0 for i in xrange(CTYPi): ix[i]=1e9 ixe[i]=-1e9 numc[i]=0 for i in xrange(len(lctyID)): ty = lctyID[i] numc[ty]+=1 allcells+=1 ix[ty] = min(ix[ty],i) ixe[ty] = max(ixe[ty],i) if h.ice(ty): icells+=1 else: ecells+=1 lfastvar = ['volt', 'iAM', 'iNM', 'iGB', 'iGA','ina','ik','ica','ih'] # reads data from files saved by mpisim.py - must get nhost correct def readdat (simstr,nhost): ld = {} # dict for data from a single host for pcid in xrange(nhost): fn = makefname(simstr,pcid) ld[pcid]=numpy.load(fn) return ld # load/concat data from mpisim.py (which saves data from each host separately) - must get nhost correct def loaddat (simstr,nhost,quiet=False): ld = readdat(simstr,nhost) # dict for data from a single host lids,lspks=array([]),array([]) # stitch together spike times for pcid in xrange(nhost): lids=concatenate((lids,ld[pcid]['lids'])) lspks=concatenate((lspks,ld[pcid]['lspks'])) ldout={} # concatenated output from diff hosts ldout['lids']=lids; ldout['lspks']=lspks; for k in ['lctyID','vt','lX', 'lY', 'lZ']: ldout[k]=ld[0][k][:] makeix(ldout['lctyID']) ncells = len(ld[0]['lctyID']) vt = ld[0]['vt'][:] locvarlist = [] for loc in ['soma','Adend3']: for var in ['cai','Ihm','Ihp1','volt','caer','caCB','ip3cyt', 'iAM', 'iNM', 'iGB', 'iGA','ina','ik','ica','ih']: locvarlist.append(loc + '_' + var) locvarlist.append('Bdend_volt') for k in locvarlist: if not k in ld[0]: continue # skip? if not quiet: print k if k.endswith('volt') or lfastvar.count(k.split('_')[1])>0: sz = len(vtfast) else: sz = len(vtslow) ldout[k] = zeros((ncells,sz)) ldk = ldout[k] for pcid in xrange(nhost): d = ld[pcid][k] lE = ld[pcid]['lE']; for row,cdx in enumerate(lE): ldk[cdx,:] = d[row,0:sz] if k == 'soma_volt': # special case for soma voltage of I cells lI=ld[pcid]['lI']; dI=ld[pcid]['soma_voltI']; row=0 for row,cdx in enumerate(lI): ldk[cdx,:] = dI[row,0:sz] for pcid in xrange(nhost): del ld[pcid].f ld[pcid].close() del ld[pcid] return ldout # colors for spikes for raster -- based on cell type def getcolors (lspks,lids,lctyID): lclrs = [] for i in xrange(len(lids)): ty = lctyID[lids[i]] if IsLTS(ty): lclrs.append('b') elif ice(ty): lclrs.append('g') else: lclrs.append('r') return lclrs # draw vertical lines indicating start/stop of a stimulus (units of seconds) def drawBounds (ymin,ymax,row=0): if not dodrawbounds: return if not useWM: return nqm.tog("DB") MemONT = nqm.getcol("startt",row).x[row]/1e3 MemOFFT = nqm.getcol("endt",row).x[row]/1e3 axvline(MemONT,ymin,ymax,color='k',linewidth=3) axvline(MemOFFT,ymin,ymax,color='k',linewidth=3) # def drawraster (ld,sz=2): if newfigs: figure(); lspks,lids,lctyID=ld['lspks']/1e3,ld['lids'],ld['lctyID'] try: lclrs = ld['lclrs'] except: lclrs = getcolors(lspks,lids,lctyID) ld['lclrs'] = lclrs scatter(lspks,lids,s=sz**2,c=lclrs,marker='+') allcells = len(lctyID) for row in xrange(nMem): drawBounds(0,allcells,row) xlim((tstart/1e3,tstop/1e3)); ylim((0,allcells)); tight_layout(); xlabel('Time (s)',fontsize=18); title('raster'); # get complement of cells in vid (all cells of any type in lty that's not in vid) def getcomp (vid,ix,ixe,lty=[E2,E5R,E5B,E6]): vcomp = Vector() for ct in lty: for i in xrange(ix[ct],ixe[ct]+1): if i not in vid: vcomp.append(i) return vcomp # get cells in vid if they're of specified type (in lty) def getact (vid,ix,ixe,lty=[E2,E5R,E5B,E6]): vact = Vector() for ct in lty: for i in xrange(ix[ct],ixe[ct]+1): if i in vid: vact.append(i) return vact # return a list of which cells get signal. each item in output corresponds to one row # of nqm. first element in the item is list of cells that gets input and second element # is its complement. def getMemList (nq,ix,ixe): nq.tog("DB") memlist = [] #list of lists of which pyr cells to increase the input signal to. for i in xrange(int(nq.v[0].size())): vid = Vector() vid.copy(nq.get("vid",i).o[0]) memlist.append([]) memlist[-1].append(vid) memlist[-1].append(getcomp(vid,ix,ixe,lty=[E2,E5R,E5B,E6])) return memlist # sets up NQS with memory stimuli def setupnqm (fn=config.get("mem","nqm")): if os.path.exists(fn): # user specified a file that exists? then load it print 'reading nqm from fn = ', fn nqm = h.NQS(fn) elif os.path.exists('meminput/' + simstr + '_nqm.nqs'): # was the nqs saved from mpisim.py ? load it print 'reading nqm from ' , 'meminput/' + simstr + '_nqm.nqs' nqm = h.NQS('meminput/' + simstr + '_nqm.nqs') else: # last resort - reconstruct from params in config file print 'reconstructing nqm...' nqm = h.NQS('vid','startt','endt','rate','w'); nqm.odec('vid') lvid = []; nMem = confint('mem','nMem') memstartt = conffloat('mem','startt') memintert = conffloat('mem','intert') memdurt = conffloat('mem','durt') memfrac = conffloat('mem','frac') memrate = conffloat('mem','rate') memW = conffloat('mem','weight') startt = memstartt; endt = startt+memdurt for i in xrange(nMem): lvid.append(h.Vector()); vtmp=Vector() for ct in [E2,E5R,E5B,E6]: if i > 0: vtmp.indgen(int(ix[ct]+numc[ct]*memfrac),ixe[ct],1) else: vtmp.indgen(ix[ct],int(ix[ct]+numc[ct]*memfrac-1),1) lvid[-1].append(vtmp) nqm.append(lvid[-1],startt,endt,memrate,memW) startt += (memintert+memdurt); endt = startt + memdurt memlist = getMemList(nqm,ix,ixe) # setup memlist nMem = len(memlist) return nqm,memlist,nMem # return x with only two decimal places after x def twop (x): return round(x,2) # get an array of times of interest def gettimes (nqm,rampt=3e3): nqm.tog("DB") times = [] # periods of interest vstartt,vendt = Vector(),Vector() vstartt.copy(nqm.getcol("startt")) vendt.copy(nqm.getcol("endt")) if nMem > 0: times = [(baselinest,vstartt[0])] times.append((vstartt[0],vendt[0])) times.append((vendt[0],vendt[0]+rampt)) for row in xrange(1,nMem): times.append((vendt[row-1]+rampt,vstartt[row])) times.append((vstartt[row],vendt[row])) times.append((vendt[row],vendt[row]+rampt)) times.append((vendt[-1]+rampt,tstop)) return times # get an NQS with spikes (snq) def getsnq (ld): lspks,lids,lctyID=ld['lspks'],ld['lids'],ld['lctyID'] snq = NQS('id','t','ty','ice') snq.v[0].from_python(lids) snq.v[1].from_python(lspks) for i in xrange(len(lids)): snq.v[2].append(lctyID[lids[i]]) snq.v[3].append(h.ice(lctyID[lids[i]])) ld['snq']=snq return snq # print spike rates in each population in the periods of interest (baseline, signal, recall) def prspkcount (snq,nqm,rampt=3e3,times=None,quiet=False): snq.verbose=0 if times is None: times = gettimes(nqm,rampt) # periods of interest lfa,lfn=[],[] for row in xrange(nMem): lfa.append([]); lfn.append([]); vact,vna = memlist[row][0],memlist[row][1] for (startt,endt) in times: fa = round(1e3*snq.select("id","EQW",vact,"t","[]",startt,endt) / ((endt-startt)*vact.size()),2) lfa[-1].append(fa) try: fn = round(1e3*snq.select("id","EQW",vna,"t","[]",startt,endt) / ((endt-startt)*vna.size()),2) except: print " cant assign fn" fn = 0.0 lfn[-1].append(fn) if not quiet: stro = "t=" + str(startt) + "-" + str(endt) + ". ActE:" + str(fa) + " Hz. NonActE:" + str(fn) + " Hz." for ct in [I2, I2L, I5, I5L, I6, I6L]: fb = round(1e3*snq.select("id","[]",ix[ct],ixe[ct],"t","[]",startt,endt) / ((endt-startt)*numc[ct]),2) stro += ' ' + CTYP[ct] + ':' + str(fb) fi = round(1e3*snq.select("ice",1,"t","[]",startt,endt) / ((endt-startt)*icells),2) stro += ' I:' + str(fi) for ct in [E2, E5R, E5B, E6]: fb = round(1e3*snq.select("id","[]",ix[ct],ixe[ct],"t","[]",startt,endt) / ((endt-startt)*numc[ct]),2) stro += ' ' + CTYP[ct] + ':' + str(fb) fe = round(1e3*snq.select("ice",0,"t","[]",startt,endt) / ((endt-startt)*ecells),2) stro += ' E:' + str(fe) print stro snq.verbose=1 return lfa,lfn # print spike counts & draw activated and non-activated rates def drawrat (ld,incsz=500.0,winsz=1e3,quiet=False): snq=getsnq(ld); times=[] for i in xrange(2*int(tstop/winsz)):times.append( (i*incsz,(i*incsz)+winsz) ) lfa,lfn = prspkcount(snq,nqm,rampt=1e3,times=times,quiet=quiet) rat = []; tt=[]; for i in xrange(len(lfa[0])): rat.append(lfa[0][i]/lfn[0][i]) for tup in times: tt.append(0.5*(tup[0]+tup[1])) # time midpoints plot(tt,rat,'b',linewidth=2);plot(tt,rat,'bo',markersize=10);tight_layout();show() # # getfnq - make an NQS with ids, firing rates, types def getfnq(snq,lctyID,skipms=200): snq.verbose=0; snq.tog("DB"); fnq = h.NQS("id","freq","ty") tf = tstop - skipms # duration we're considering for frequency calc for i in xrange(allcells): n = float( snq.select("t",">",skipms,"id",i) ) # number of spikes fnq.append(i, n*1e3/tf, lctyID[i]) snq.verbose=1 return fnq # pravgrates - print average firing rates using fnq def pravgrates(fnq,skipms=200): fnq.verbose=0 ty=0; tf=float( tstop - skipms ) for ty in xrange(CTYPi): if numc[ty] < 1: continue fnq.select("ty",ty) vf = fnq.getcol("freq") if vf.size() > 1: print CTYP[ty], " avg rate = ", vf.mean(), "+/-", vf.stderr(), " Hz" else: print CTYP[ty], " avg rate = ", vf.mean(), "+/-", 0.0 , " Hz" ty += 1 fnq.verbose=1 # def drawcellcal (ld,cdx): lk = ['Adend3_cai', 'Adend3_ip3cyt', 'Adend3_caer', 'soma_cai', 'soma_ip3cyt', 'soma_caer'] for i,k in enumerate(lk): plot(vtslow/1e3,ld[k][cdx,:],linewidth=2) legend(lk,loc='best') xlabel('Time (s)'); ylabel('i'); # draws synaptic currents def drawcellcurr (ld,cdx): #clrs = ['k','b','g','r'] subplot(1,3,1); # synaptic currents lk = ['Adend3_iAM', 'Adend3_iNM', 'Adend3_iGA', 'Adend3_iGB', 'soma_iGA'] for i,k in enumerate(lk): plot(vtfast/1e3,ld[k][cdx,:],linewidth=2) legend(lk,loc='best'); xlabel('Time (s)'); ylabel('i'); for g,sec in zip([2,3],['Adend3','soma']): subplot(1,3,g) li = [sec + s for s in ['_ik','_ina','_ica','_ih']] for k,clr in zip(li,['b','g','r', 'c']): plot(vtfast/1e3,ld[k][cdx,:],clr,linewidth=2) legend(['ik','ina','ica','ih'],loc='best'); xlabel('Time (ms)'); ylabel(sec + '_i') # def drawcellvolt (ld,cdx,clr='g',ln=1,sec='soma'): vt = vtfast; sv=ld[sec+'_volt'][cdx,:] plot(vt,sv,clr,linewidth=ln) xlim((tstart,tstop)) # gets min,max value from the cell on the key. ld is from loaddat def getminmaxy (ld,cellidx,loc,key,sidx,eidx): da=ld[loc+'_'+key] miny=min(da[cellidx,sidx:eidx]) maxy=max(da[cellidx,sidx:eidx]) return miny,maxy # make integrated Ih p1 for the populations of pyramidal cells (by section) # lyr==-1 means all layers; lyr==2,5,6 means only E cells from that layer def makeIntegMem (ld,var,memlist,nMem,lyr=-1): d = [] for row in xrange(nMem): vact,vna = memlist[row][0],memlist[row][1] # IDs of activated and non-activated pyramidal cells if lyr == 2: vact = getact(vact,ix,ixe,lty=[E2]) vna = getact(vna,ix,ixe,lty=[E2]) elif lyr == 5: vact = getact(vact,ix,ixe,lty=[E5R,E5B]) vna = getact(vna,ix,ixe,lty=[E5R,E5B]) elif lyr == 6: vact = getact(vact,ix,ixe,lty=[E6]) vna = getact(vna,ix,ixe,lty=[E6]) d.append({}) for s in ["soma", "Adend3"]: d[-1][s+"_act_"+var] = getInteg(ld,var,s,vact) d[-1][s+"_nonact_"+var] = getInteg(ld,var,s,vna) ld['d'+var]=d return d # make a multiunit activity vector from specified cell IDs def getMUA (ld,IDs,tstart,tstop,binsz=5): #print 'getMUA: binsz=',binsz,',tstart=',tstart,',tstop=',tstop snq=None if 'snq' not in ld: getsnq(ld) snq=ld['snq']; snq.verbose=0; MUA=Vector() if type(IDs) == int: if IDs >= 0: for idx in xrange(ix[IDs],ixe[IDs]+1): if snq.select("id",idx) > 0: vt = snq.getcol("t") vh = vt.histogram(tstart,tstop,binsz) if MUA.size() < vh.size(): MUA.copy(vh) else: MUA.add(vh) else: # all inhib cells, indicated with IDs < 0 if snq.select("ice",1) > 0: vt = snq.getcol("t") vh = vt.histogram(tstart,tstop,binsz) if MUA.size() < vh.size(): MUA.copy(vh) else: MUA.add(vh) elif type(IDs) == tuple: for ct in IDs: for idx in xrange(ix[ct],ixe[ct]+1): if snq.select("id",idx) > 0: vt = snq.getcol("t") vh = vt.histogram(tstart,tstop,binsz) if MUA.size() < vh.size(): MUA.copy(vh) else: MUA.add(vh) else: for idx in IDs: # list of cells to use if snq.select("id",idx) > 0: vt = snq.getcol("t") vh = vt.histogram(tstart,tstop,binsz) if MUA.size() < vh.size(): MUA.copy(vh) else: MUA.add(vh) snq.tog("DB"); snq.verbose=1 return MUA # def nzratVec (v1,v2): vout = Vector(v1.size()) for i in xrange(int(v1.size())): if v2.x[i] != 0.0: vout.x[i] = v1.x[i] / v2.x[i] return vout # def ToHz (vmua,ncells,binsz): vmua.div(ncells) vmua.mul(1e3/binsz) # make MUA and store in network as NQS and also as a dictionary # binsz is not global - passed in as an arg! def makeMUA (ld,memlist,nMem,row,tstart,tstop,binsz,norm=True,lpops=[E5R,I5,I5L]): if 'nqMUA' in ld: nqsdel(ld['nqMUA']) vact,vna = memlist[row][0],memlist[row][1] # IDs of activated and non-activated pyramidal cells nq=NQS("row","tys","ty","vMUA"); nq.odec("vMUA"); nq.strdec("tys") ld['nqMUA']=nq; dMUA=[] diffMUA,ratMUA = Vector(),Vector() dMUA.append({}) for i in lpops: vmua = getMUA(ld,i,tstart,tstop,binsz) if type(i) == tuple: ncells = sum(numc[j] for j in i) nq.append(row,CTYP[i[0]],sum(j for j in i),vmua) else: ncells = numc[i] nq.append(row,CTYP[i],i,vmua) if norm: ToHz(vmua,ncells,binsz) dMUA[-1][i] = Vector() dMUA[-1][i].copy(vmua) if type(i) != tuple: dMUA[-1][i].label("M"+str(row)+"_"+CTYP[i]) vmua = getMUA(ld,-1,tstart,tstop,binsz) # a MUA for all I cells (-1 to getMUA indicates all I cells) if norm: ToHz(vmua,icells,binsz) dMUA[-1][-666] = Vector() # inhib cells indicated by -666 dMUA[-1][-666].copy(vmua) dMUA[-1][-666].label("M"+str(row)+"_"+"I") nq.append(row,"I",-666,vmua) # inhib cells indicated by "I" and -666 v1,v2=Vector(),Vector() vmua = getMUA(ld,vact,tstart,tstop,binsz) # activated E cell MUA if norm: ToHz(vmua,vact.size(),binsz) # rates diffMUA.copy(vmua); v1.copy(vmua) dMUA[-1][-1] = Vector() dMUA[-1][-1].copy(vmua) nq.append(row,"act",-1,vmua) # activated pyramidal cell MUA vmua = getMUA(ld,vna,tstart,tstop,binsz) # nonactivated E cell MUA if norm: ToHz(vmua,vna.size(),binsz) # rates diffMUA.sub(vmua); v2.copy(vmua) ratMUA0,ratMUA1 = nzratVec(v1,v2),nzratVec(v2,v1) dMUA[-1][-2] = Vector() dMUA[-1][-2].copy(vmua) nq.append(row,"nonact",-2,vmua) # non-activated pyramidal cell MUA dMUA[-1][-1].label("M"+str(row)+"_PyrMUA: Activated") dMUA[-1][-2].label("M"+str(row)+"_PyrMUA: NOT_Activated") ld['dMUA'+str(binsz)]=dMUA; ld['diffMUA'+str(binsz)]=diffMUA; ld['ratMUA0'+str(binsz)],ld['ratMUA1'+str(binsz)]=ratMUA0,ratMUA1 # draws the MUA on top of the raster plot -- binsz is in milliseconds, and # should be same value as used when calling makeMUA def drawMUA (ld,memlist,nMem,row,binsz,ipop=[],skipdiff=False,plotrows=1,plotoff=0): try: dMUA=ld['dMUA'+str(binsz)]; diffMUA=ld['diffMUA'+str(binsz)] except: makeMUA(ld,memlist,nMem,row,tstart,tstop,binsz) dMUA,diffMUA=ld['dMUA'+str(binsz)],ld['diffMUA'+str(binsz)]; if newfigs: figure(); lwidth=1; if binsz >= 100: lwidth=4; title('MUA'); tt=linspace(tstart/1e3,tstop/1e3,int(dMUA[0][-1].size())); subplot(plotrows,1,1+plotoff) for i in ipop: plot(tt,dMUA[row][i].as_numpy(),'g',linewidth=lwidth) plot(tt,dMUA[row][-1].as_numpy(),'c',linewidth=lwidth); plot(tt,dMUA[row][-2].as_numpy(),'m',linewidth=lwidth) if nMem > 1 and not skipdiff: plot(tt,diffMUA.as_numpy(),'y',linewidth=lwidth) xlim((tstart/1e3,tstop/1e3)); grid(True); for r in xrange(nMem): drawBounds(-10,10,r) plot(tt,dMUA[row][-666].as_numpy(),color=(0.5,0.5,0.5),linewidth=lwidth) # all I cells xlabel('Time (s)',fontsize=18); xlim((tstart/1e3,tstop/1e3)); print tstart/1e3,tstop/1e3 for r in xrange(nMem): drawBounds(-10,10,r) tight_layout(); ###########################################################3 # reload variables, reset config file name def myreload (Simstr,ncpu=defnCPU): global fcfg,simstr print 'simstr is ' , simstr simstr = Simstr print 'simstr is ' , simstr fcfg = 'backupcfg/' + simstr + '.cfg' if len(config.read(fcfg))==0: print 'myreload ERRA: could not read ', fcfg, '!!!' return None reloadvars() print fcfg try: ld=loaddat(simstr,ncpu); nqm,memlist,nMem=setupnqm(); return ld,nqm,memlist,nMem except: print 'could not reload data from' , Simstr return None ld,nqm,memlist,nMem=[None for i in xrange(4)] # draw sim data (designed for baseline sim but works with others too if their data is loaded) def baseDraw (drawty='raster',BINSZ=defbinsz,mint=5e3/1e3,maxt=20e3/1e3,setyl=True,skipdiff=True,lbinsz=[10,100],nrow=-1,noff=0,lyr=-1): global binsz; idx=1; locs=['soma', 'Adend3']; tx,ty=-.15,1.06; naxbins=5; fsz=18 if drawty == 'rastmua': ax=subplot(2,1,1);ax.locator_params(nbins=naxbins); dodrawbounds = True drawraster(ld,sz=2); ylabel('Cell ID'); title('');xlabel(''); xlim((mint,maxt)) dodrawbounds = False for BINSZ in lbinsz: drawMUA(ld,memlist,nMem,0,BINSZ,ipop=[],skipdiff=skipdiff,plotrows=2,plotoff=1); ax=subplot(2,1,2); ax.locator_params(nbins=naxbins); ylabel('MUA (Hz)',fontsize=fsz); title(''); text(tx,ty,'b',fontsize=fsz,fontweight='bold',transform=ax.transAxes); xlim((mint,maxt));grid(True); ylim((0,50)); elif drawty == 'mua': print 'mua' , ' binsz : ' , binsz , ' BINSZ: ' , BINSZ try: if binsz != BINSZ: del ld['dMUA'],ld['diffMUA'],ld['nqMUA']; except: pass binsz=BINSZ; plotrows=2 if nrow > 0: plotrows=nrow drawMUA(ld,memlist,nMem,0,BINSZ,plotrows=plotrows,ipop=[],skipdiff=skipdiff,plotoff=noff); txstr=['a','b']; msty = ['E', 'I'] for i in xrange(2): ax=subplot(plotrows,1,i+1); ax.locator_params(nbins=naxbins); ylabel(msty[i]+' MUA (Hz)'); title(''); text(tx,ty,txstr[i],fontsize=14,fontweight='bold',transform=ax.transAxes); xlim((mint,maxt));grid(True); def mydraw (): baseDraw('rastmua') for i in xrange(2,3,1): subplot(2,1,i); ylim((0,45)) subplot(2,1,1);title(''); tight_layout() ltxt=['a','b']; fsz=20 # need to draw letters on after tight_layout or they won't fit/display properly for i in xrange(2): ax=subplot(2,1,i+1); tx,ty=-0.0225,0.95 text(tx,ty,ltxt[i],fontsize=fsz,fontweight='bold',transform=ax.transAxes); #get rid of vertical ticks and ylabels for raster ax=subplot(2,1,1); ax.grid(True); ax.set_yticklabels([]); ax.set_yticks([]); ax.set_ylabel('') fsz=18 # and now draw text indicating layer tx,ty=-0.04,0.825 text(tx,ty,'L2/3',fontsize=fsz,fontweight='bold',transform=ax.transAxes); tx,ty=-0.04,0.45 text(tx,ty,'L5',fontsize=fsz,fontweight='bold',transform=ax.transAxes); tx,ty=-0.04,0.12 text(tx,ty,'L6',fontsize=fsz,fontweight='bold',transform=ax.transAxes); fsz=20 subplot(2,1,2); ylabel('MUA (Hz)',fontsize=fsz,fontweight='bold'); xlabel('Time (s)',fontsize=fsz,fontweight='bold') for i in xrange(1,3,1): subplot(2,1,i); xlim((8,14)) ld=loaddat(simstr,defnCPU); nMem=0; nqm,memlist,nMem=setupnqm(); ion() mydraw()