//proc randomize(seedVal) //proc zeroNet() //proc saveSpikes(filename) //proc recGidVm(mode/*0=setup, 1=get values*/) //proc saveStims(filename) //proc netStats(resultVec) //proc updateAll() //proc saveCON() load_file("pBGburstSearch.hoc") objref r, sc_r //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// proc randomize() {local seedVal //$1 seedVal base //////////////// seedVal = $1 + pnm.pc.id r = new Random(seedVal) sc_r = new scopRandom(.5) sc_r.seed(seedVal) print "pc.id() ", pnm.pc.id(), " using random seed ", seedVal } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// proc zeroNet() { //////////////// //Set all synaptic weights to zero gmaxSTNGPe = 0 gmaxGPeGPe = 0 gmaxGPeSTN = 0 gmaxGPeGPi = 0 gmaxSTNGPi = 0 gmaxGPiTha = 0 CONupdateWeights() gmaxCtxSTN = 0 gmaxStrGPe = 0 gmaxStrGPi = 0 INPupdateWeights() } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// proc saveSpikes() { local i localobj f //(s1:filename) //////////////// //Save random seed and pnm spike time and id vectors to file with name passed in $s1 //pnm.gatherspikes() should be called right after prun, calling twice produces error? f = new File() f.wopen($s1) print "seed=", seedVal f.printf("%f\n", seedVal) for i=0, pnm.spikevec.size-1 { f.printf("%f\t%f\n", pnm.spikevec.x[i], pnm.idvec.x[i]) } f.close() } objref vmRecIds,vmL,vmI vmRecIds = new Vector() //global record id vector vmL = new List() //list containing record data vectors vmI = new Vector() //locally owned record id vector //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// proc setupVms() {local i localobj vm //////////////// //Called internally - prepare to record voltages for cell ids stored in vmRecIds, vecs stored locally will be collected by master in the same manner as pnm spikevec and idvec vmL.remove_all() vmI.resize(0) if (pnm.pc.id > 0) { //nodes consume setup message while (pnm.pc.look("setupIds") != 1) { } vmRecIds = pnm.pc.upkvec() //unpack vector of ids to record } for i=0,vmRecIds.size-1 { if (pnm.pc.gid_exists(vmRecIds.x(i))) { //vm goes out of context, but pointer in vmL should remain to hold object vm = new Vector() vm.record(&pnm.pc.gid2obj(vmRecIds.x(i)).soma.v) vmL.append(vm) vmI.append(vmRecIds.x(i)) } } if (pnm.pc.id > 0) { pnm.pc.post("setupvm") //nodes tell master they're done } } proc postVms() {local i //////////////// pnm.pc.pack(vmI) //send back vector of ids recorded by this node for i=0,vmI.size-1 { //... as well as the recorded data pnm.pc.pack(vmL.o(i)) } pnm.pc.post("postvm") //tell master this node is done } proc recGidVm() { local i,j localobj v1,v2 //($1:mode(0=setup, 1=get values)) //////////////// if (pnm.pc.nhost > 1 && pnm.pc.id == 0) { //all this work required only by master node if running parallel with >1 host if ($1==0) { pnm.pc.pack(vmRecIds) pnm.pc.post("setupIds") pnm.pc.context("setupVms()\n") //tell each node to run setupVms for i=0, pnm.pc.nhost-2 { pnm.pc.take("setupvm") //wait until all responses are consumed } setupVms() //call setup for ids owned by master itself pnm.pc.take("setupIds") //clear the setup message } else { pnm.pc.context("postVms()\n") //tell each node to run postVms for i=0, pnm.pc.nhost-2 { pnm.pc.take("postvm") //consume message once for each node (not master) v1 = pnm.pc.upkvec() //deal with data sent back from nodes vmI.append(v1) //... appending to data already on master for j=0,v1.size-1 { v2 = pnm.pc.upkvec() vmL.append(v2) } } } } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// proc poststims() { //////////////// for i=0, numGPi-1 { //send back vector of GPI stim times for ids on this node pnm.pc.pack(timesDBSGPi[i]) } pnm.pc.post("poststim") //tell master this node is done } proc gatherstims() {local i,j localobj s //////////////// if (pnm.pc.nhost > 1) { s = new Vector() pnm.pc.context("poststims()\n") //tell each node to run poststims for i=0, pnm.pc.nhost-2 { pnm.pc.take("poststim") //consume message once for each node (not master) for j=0,numGPi-1 { s = pnm.pc.upkvec() //deal with data sent back from nodes timesDBSGPi[j].append(s)//... appending to data already on master } } } } proc saveStims() { local i localobj f //($s1:filename) //////////////// gatherstims() // need this for parallel to pull stim times on nodes other than master f = new File() f.wopen($s1) for i=0,numGPi-1 { for j=0,timesDBSGPi[i].size-1 { f.printf("%f\t%f\n", timesDBSGPi[i].x(j), cellID(ID_GPi,i)) } } f.close() } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// objref st[ncell], isi[ncell], bur[ncell] for i=0,ncell-1 { st[i] = new Vector() isi[i] = new Vector() bur[i] = new Matrix() } proc netStats() {local i,j localobj res,spkRate, burRate //$o1:res ////////////////// //pnm.gatherspikes() should be called right after prun, calling twice produces error? res = $o1 spkRate = new Vector(ncell) burRate = new Vector(ncell) for i=0,ncell-1 { st[i].resize(0) isi[i].resize(0) bur[i].resize(1,1) } // get spike times for each cell for i=0,pnm.idvec.size-1 { st[pnm.idvec.x(i)].append(pnm.spikevec.x(i)) } // process each cell for i=0,ncell-1 { if (st[i].size > 2) { // calculate interspike intervals for j=0,st[i].size-2 { isi[i].append(st[i].x(j+1) - st[i].x(j)) } // get burst times burstSearch(st[i], isi[i], bur[i]) // calculate average spike and burst rates spkRate.x(i) = 1000*(st[i].size - 1)/st[i].x(st[i].size-1) //using total time is time of last spike if (bur[i].ncol == 1) { burRate.x(i) = 0 } else { burRate.x(i) = 1000*bur[i].nrow/st[i].x(st[i].size-1) //using total time is t at end??? } } else { spkRate.x(i) = 0 burRate.x(i) = 0 } } f_stn = spkRate.mean(cellID(ID_STN, 0), cellID(ID_STN, numSTN-1)) std_stn = spkRate.stdev(cellID(ID_STN, 0), cellID(ID_STN, numSTN-1)) //print "STN ", f_stn, std_stn f_gpe = spkRate.mean(cellID(ID_GPe, 0), cellID(ID_GPe, numGPe-1)) std_gpe = spkRate.stdev(cellID(ID_GPe, 0), cellID(ID_GPe, numGPe-1)) //print "GPe ", f_gpe, std_gpe f_gpi = spkRate.mean(cellID(ID_GPi, 0), cellID(ID_GPi, numGPi-1)) std_gpi = spkRate.stdev(cellID(ID_GPi, 0), cellID(ID_GPi, numGPi-1)) //print "GPi ", f_gpi, std_gpi br_stn = 60*burRate.mean(cellID(ID_STN, 0), cellID(ID_STN, numSTN-1)) brstd_stn = 60*burRate.stdev(cellID(ID_STN, 0), cellID(ID_STN, numSTN-1)) //print "STN(br) ", br_stn, brstd_stn br_gpe = 60*burRate.mean(cellID(ID_GPe, 0), cellID(ID_GPe, numGPe-1)) brstd_gpe = 60*burRate.stdev(cellID(ID_GPe, 0), cellID(ID_GPe, numGPe-1)) //print "GPe(br) ", br_gpe, brstd_gpe br_gpi = 60*burRate.mean(cellID(ID_GPi, 0), cellID(ID_GPi, numGPi-1)) brstd_gpi = 60*burRate.stdev(cellID(ID_GPi, 0), cellID(ID_GPi, numGPi-1)) //print "GPi(br) ", br_gpi, brstd_gpi res.resize(6) res.x(0) = f_stn res.x(1) = f_gpe res.x(2) = f_gpi res.x(3) = br_stn res.x(4) = br_gpe res.x(5) = br_gpi } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// proc updateAll() { ////////////////// //Distribute any global parameter changes to cells readParms($s1) BIAupdateWeights() CONupdateWeights() INPupdateWeights() } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// proc saveCON() { local i localobj f //////////////// f = new File() f.wopen("pBG_CON.txt") for i=0,pnm.nclist.count-1 { f.printf("Cell %s -> cell %s\n", pnm.nclist.o(i).precell, pnm.nclist.o(i).postcell) } f.close() } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// strdef junkStr //----------------------------------------------------------------------------------------------------- proc getOutput() {local i,numFields,tmp localobj f //(filename, skipLines, readInputs) //--------------- numTargets = 6 f = new File() f.ropen($s1) for i=0,$2-1 { f.gets(junkStr) } for i=0,3+numTargets-1 { tmp = f.scanvar() } gmaxSTNGPi = f.scanvar() gmaxGPeGPi = f.scanvar() gmaxSTNGPe = f.scanvar() gmaxGPeGPe = f.scanvar() gmaxGPeSTN = f.scanvar() gDA_STNGPi = f.scanvar() gDA_GPeGPi = f.scanvar() gDA_STNGPe = f.scanvar() gDA_GPeGPe = f.scanvar() gDA_GPeSTN = f.scanvar() iBiasSTN = f.scanvar() iBiasGPe = f.scanvar() iBiasGPi = f.scanvar() if ($3) { // read in input parameters (assumes format is same as listed here) gmaxCtxSTN = f.scanvar() gmaxStrGPe = f.scanvar() gmaxStrGPi = f.scanvar() /* ... removed in distribution ... */ } f.close() BIAupdateWeights() CONupdateWeights() INPupdateWeights() }