////////////////////////////////////////////////// // Instrumentation, i.e. stimulation and recording ////////////////////////////////////////////////// // setup activity in EC stims proc mkEC() {local i, necs localobj cstim, rs EClist = new Vector() necs = 0 print "Make EC input..." for i=0, cells.count-1 { gid = gidvec.x[i] // id of cell if (gid >= iECL3180 && gid < iECL3180+nECL3180) { // appropriate target cell // create cue stimulus cstim = cells.object(i).stim //cstim.number = ECL3180NUM //cstim.start = ECL3180START //cstim.interval = ECL3180INT //cstim.noise = ECL3180NOISE //cstim.burstint = ECL3180BINT //cstim.burstlen = ECL3180BLEN cstim.number = ECL3180NUM cstim.start = ECL3180START cstim.interval = ECL3180INT cstim.noise = ECL3180NOISE } if (gid >= iECL3360 && gid < iECL3360+nECL3360) { // appropriate target cell // create cue stimulus cstim = cells.object(i).stim rs = ranlist.object(i) //cstim.number = ECL3360NUM //cstim.start = ECL3360START //cstim.interval = ECL3360INT //cstim.noise = ECL3360NOISE //cstim.burstint = ECL3360BINT //cstim.burstlen = ECL3360BLEN cstim.number = ECL3360NUM cstim.start = ECL3360START cstim.interval = ECL3360INT cstim.noise = ECL3360NOISE } if (gid >= iECL2180 && gid < iECL2180+nECL2180) { // appropriate target cell // create cue stimulus cstim = cells.object(i).stim //cstim.number = ECL2180NUM //cstim.start = ECL2180START //cstim.interval = ECL2180INT //cstim.noise = ECL2180NOISE //cstim.burstint = ECL2180BINT //cstim.burstlen = ECL2180BLEN cstim.number = ECL2180NUM cstim.start = ECL2180START cstim.interval = ECL2180INT cstim.noise = ECL2180NOISE } if (gid >= iECL2360 && gid < iECL2360+nECL2360) { // appropriate target cell // create cue stimulus cstim = cells.object(i).stim rs = ranlist.object(i) //cstim.number = ECL2360NUM //cstim.start = ECL2360START //cstim.interval = ECL2360INT //cstim.noise = ECL2360NOISE //cstim.burstint = ECL2360BINT //cstim.burstlen = ECL2360BLEN cstim.number = ECL2360NUM cstim.start = ECL2360START cstim.interval = ECL2360INT cstim.noise = ECL2360NOISE // Use the gid-specific random generator so random streams are // independent of where and how many stims there are. cstim.noiseFromRandom(rs.r) rs.r.normal(0, 1) rs.start() EClist.append(i) necs += 1 } } } objref cue, fp // setup activity pattern in input cue stims proc mkcueECL2180() {local i, j, ncue localobj cstim, target, rs print "Make cue (ECL2180) input..." cuelistECL2180 = new Vector() // open patterns file fp = new File($s1) fp.ropen() cue = new Vector(nECL2180) cue.scanf(fp, $2, $4) // read pattern // cue.printf() fp.close() ncue = 0 // find active cells in pattern for i=0, cue.size()-1 { //if (!pc.gid_exists(i+iECL2180)) { continue } if (ncue <= SPATT*$3) { // fraction of active cells in cue if (cue.x[i] == 1) { print "Cue cell ", i //cstim = pc.gid2cell(i+iECL2180) cstim = cells.object(i+iECL2180).stim for j=0, cells.count-1 { if (gidvec.x[j] == i+iECL2180) {break} // find cell index } rs = ranlist.object(j) // create cue stimulus //cstim.number = ECL2180NUM //cstim.start = ECL2180START //cstim.interval = ECL2180INT //cstim.noise = ECL2180NOISE //cstim.burstint = ECL2180BINT //cstim.burstlen = ECL2180BLEN cstim.number = ECL2180NUM cstim.start = ECL2180START cstim.interval = ECL2180INT cstim.noise = ECL2180NOISE // Use the gid-specific random generator so random streams are // independent of where and how many stims there are. cstim.noiseFromRandom(rs.r) rs.r.normal(0, 1) rs.start() cuelistECL2180.append(i) ncue += 1 } } } //print " cue size ", ncue } // setup activity pattern in input cue stims proc mkcueECL2360() {local i, j, ncue localobj cstim, target, rs print "Make cue (ECL2360) input..." cuelistECL2360 = new Vector() // open patterns file fp = new File($s1) fp.ropen() cue = new Vector(nECL2360) cue.scanf(fp, $2, $4) // read pattern // cue.printf() fp.close() ncue = 0 // find active cells in pattern for i=0, cue.size()-1 { //if (!pc.gid_exists(i+iECL2360)) { continue } if (ncue <= SPATT*$3) { // fraction of active cells in cue if (cue.x[i] == 1) { print "Cue cell ", i //cstim = pc.gid2cell(i+iECL2360) cstim = cells.object(i+iECL2360).stim for j=0, cells.count-1 { if (gidvec.x[j] == i+iECL2360) {break} // find cell index } rs = ranlist.object(j) // create cue stimulus //cstim.number = ECL2360NUM //cstim.start = ECL2360START //cstim.interval = ECL2360INT //cstim.noise = ECL2360NOISE //cstim.burstint = ECL2360BINT //cstim.burstlen = ECL2360BLEN cstim.number = ECL2360NUM cstim.start = ECL2360START cstim.interval = ECL2360INT cstim.noise = ECL2360NOISE // Use the gid-specific random generator so random streams are // independent of where and how many stims there are. cstim.noiseFromRandom(rs.r) rs.r.normal(0, 1) rs.start() cuelistECL2360.append(i) ncue += 1 } } } //print " cue size ", ncue } // setup activity pattern in input cue stims proc mkcueECL3180() {local i, j, ncue localobj cstim, target, rs print "Make cue (ECL3180) input..." cuelistECL3180 = new Vector() // open patterns file fp = new File($s1) fp.ropen() cue = new Vector(nECL3180) cue.scanf(fp, $2, $4) // read pattern // cue.printf() fp.close() ncue = 0 // find active cells in pattern for i=0, cue.size()-1 { //if (!pc.gid_exists(i+iECL3180)) { continue } if (ncue <= SPATT*$3) { // fraction of active cells in cue if (cue.x[i] == 1) { print "Cue cell ", i //cstim = pc.gid2cell(i+iECL3180) cstim = cells.object(i+iECL3180).stim for j=0, cells.count-1 { if (gidvec.x[j] == i+iECL3180) {break} // find cell index } rs = ranlist.object(j) // create cue stimulus //cstim.number = ECL3180NUM //cstim.start = ECL3180START //cstim.interval = ECL3180INT //cstim.noise = ECL3180NOISE //cstim.burstint = ECL3180BINT //cstim.burstlen = ECL3180BLEN cstim.number = ECL3180NUM cstim.start = ECL3180START cstim.interval = ECL3180INT cstim.noise = ECL3180NOISE // Use the gid-specific random generator so random streams are // independent of where and how many stims there are. cstim.noiseFromRandom(rs.r) rs.r.normal(0, 1) rs.start() cuelistECL3180.append(i) ncue += 1 } } } //print " cue size ", ncue } // setup activity pattern in input cue stims proc mkcueECL3360() {local i, j, ncue localobj cstim, target, rs print "Make cue (ECL3360) input..." cuelistECL3360 = new Vector() // open patterns file fp = new File($s1) fp.ropen() cue = new Vector(nECL3360) cue.scanf(fp, $2, $4) // read pattern // cue.printf() fp.close() ncue = 0 // find active cells in pattern for i=0, cue.size()-1 { //if (!pc.gid_exists(i+iECL3360)) { continue } if (ncue <= SPATT*$3) { // fraction of active cells in cue if (cue.x[i] == 1) { print "Cue cell ", i //cstim = pc.gid2cell(i+iECL3360) cstim = cells.object(i+iECL3360).stim for j=0, cells.count-1 { if (gidvec.x[j] == i+iECL3360) {break} // find cell index } rs = ranlist.object(j) // create cue stimulus //cstim.number = ECL3360NUM //cstim.start = ECL3360START //cstim.interval = ECL3360INT //cstim.noise = ECL3360NOISE //cstim.burstint = ECL3360BINT //cstim.burstlen = ECL3360BLEN cstim.number = ECL3360NUM cstim.start = ECL3360START cstim.interval = ECL3360INT cstim.noise = ECL3360NOISE // Use the gid-specific random generator so random streams are // independent of where and how many stims there are. cstim.noiseFromRandom(rs.r) rs.r.normal(0, 1) rs.start() cuelistECL3360.append(i) ncue += 1 } } } //print " cue size ", ncue } // remove activity pattern in input cue stims proc erasecue() {local i, j localobj cstim for i=0, cuelist.size()-1 { //if (!pc.gid_exists(i+iCA3)) { continue } //cstim = pc.gid2cell(i+iCA3) cstim = cells.object(cuelist.x[i]+iCA3).stim cstim.number = 0 } } mkcueECL2180(FDGPATT, CPATT, CFRAC, NPATT) // cue from already stored pattern //mkcueECL2180(FDGSTORE, CPATT, CFRAC, NSTORE) // cue from new pattern mkcueECL2360(FDGPATT, CPATT, CFRAC, NPATT) // cue from already stored pattern //mkcueECL2360(FDGSTORE, CPATT, CFRAC, NSTORE) // cue from new pattern //mkcueECL3180(FCA1PATT, CPATT, CFRAC, NPATT) // cue from already stored pattern ////mkcueECL3180(FCA1STORE, CPATT, CFRAC, NSTORE) // cue from new pattern //mkcueECL3360(FCA1PATT, CPATT, CFRAC, NPATT) // cue from already stored pattern ////mkcueECL3360(FCA1STORE, CPATT, CFRAC, NSTORE) // cue from new pattern mkEC() //mkECL2() //mkECL3() // Spike recording objref tvec, idvec // will be Vectors that record all spike times (tvec) // and the corresponding id numbers of the cells that spiked (idvec) proc spikerecord() {local i localobj nc, nil print "Record spikes..." tvec = new Vector() idvec = new Vector() for i=0, cells.count-1 { nc = cells.object(i).connect2target(nil) nc.record(tvec, idvec, i) // the Vector will continue to record spike times // even after the NetCon has been destroyed } } spikerecord() // Record cell voltage traces objref vDGGC, vDGBC, vDGMC, vDGHC // Vectors that record voltages from DG-GC, DG-MC, DG-BC, DG-HC objref vCA3PC, vCA3AAC, vCA3BC, vCA3OLM // Vectors that record voltages from CA3-PC, CA3-AAC, CA3-BC, CA3-OLM objref vCA1PC, vCA1AAC, vCA1BC, vCA1BSC, vCA1OLM // Vectors that record voltages from CA1-PC, CA1-AAC, CA1-BC, CA1-BSC, CA1-OLM proc vrecord() {local i, gid print "Record example voltage traces..." for i=0, cells.count-1 { // loop over possible target cells gid = gidvec.x[i] // id of cell if (gid==iDGGC+32) { vDGGC = new Vector() vDGGC.record(&cells.object(i).soma.v(0.5)) } if (gid==iDGMC) { vDGMC = new Vector() vDGMC.record(&cells.object(i).soma.v(0.5)) } if (gid==iDGBC) { vDGBC = new Vector() vDGBC.record(&cells.object(i).soma.v(0.5)) } if (gid==iDGHC) { vDGHC = new Vector() vDGHC.record(&cells.object(i).soma.v(0.5)) } if (gid==iCA3PC+1) { vCA3PC = new Vector() vCA3PC.record(&cells.object(i).soma.v(0.5)) } if (gid==iCA3AAC) { vCA3AAC = new Vector() vCA3AAC.record(&cells.object(i).soma.v(0.5)) } if (gid==iCA3BC) { vCA3BC = new Vector() vCA3BC.record(&cells.object(i).soma.v(0.5)) } if (gid==iCA3OLM) { vCA3OLM = new Vector() vCA3OLM.record(&cells.object(i).soma.v(0.5)) } if (gid==iCA1PC+8) { vCA1PC = new Vector() vCA1PC.record(&cells.object(i).soma.v(0.5)) } if (gid==iCA1AAC) { vCA1AAC = new Vector() vCA1AAC.record(&cells.object(i).soma.v(0.5)) } if (gid==iCA1BC) { vCA1BC = new Vector() vCA1BC.record(&cells.object(i).soma.v(0.5)) } if (gid==iCA1BSC) { vCA1BSC = new Vector() vCA1BSC.record(&cells.object(i).soma.v(0.5)) } // if (gid==iCA1OLM) { // vCA1OLM = new Vector() // vCA1OLM.record(&cells.object(i).soma.v(0.5)) // } } } vrecord() // Record CA1 pyramidal cell voltage traces objref vCA1PC_soma, vCA1PC_lm_thick, vCA1PC_radTprox, vCA1PC_radTdist, vCA1PC_radTmed proc vCA1PCrecord() {local i, gid print "Record example voltage traces..." for i=0, cells.count-1 { // loop over possible target cells gid = gidvec.x[i] // id of cell if (gid==iCA1PC+8) { vCA1PC_soma = new Vector() vCA1PC_soma.record(&cells.object(i).soma.v(0.5)) vCA1PC_lm_thick = new Vector() vCA1PC_lm_thick.record(&cells.object(i).lm_thick1.v(0.5)) vCA1PC_radTprox = new Vector() vCA1PC_radTprox.record(&cells.object(i).radTprox.v(0.5)) vCA1PC_radTmed = new Vector() vCA1PC_radTmed.record(&cells.object(i).radTmed.v(0.5)) vCA1PC_radTdist = new Vector() vCA1PC_radTdist.record(&cells.object(i).radTdist.v(0.5)) } } } vCA1PCrecord() //////////////////////////// // Simulation control //////////////////////////// strdef fstem fstem = "Results/Results_DG_CA3_CA1_w_inhibition" tstop = SIMDUR celsius = 34 //run() //////////////////////////// // Report simulation results //////////////////////////// objref fo strdef fno proc spikeout() { local i printf("\ntime\t cell\n") // print header once sprint(fno,"%s_spt.dat", fstem) fo = new File(fno) fo.wopen() for i=0, tvec.size-1 { printf("%g\t %d\n", tvec.x[i], idvec.x[i]) fo.printf("%g\t %d\n", tvec.x[i], idvec.x[i]) } fo.close() } proc vout() { local i, j, gid for j=0, cells.count-1 { // loop over possible target cells gid = gidvec.x[j] // id of cell // if (gid==iDGGC) { if (gid==iDGGC+32) { sprint(fno,"%s_DGGC.dat", fstem) fo = new File(fno) fo.wopen() for i=0, vDGGC.size-1 { fo.printf("%g\n", vDGGC.x[i]) } fo.close() } if (gid==iDGMC) { sprint(fno,"%s_DGMC.dat", fstem) fo = new File(fno) fo.wopen() for i=0, vDGMC.size-1 { fo.printf("%g\n", vDGMC.x[i]) } fo.close() } if (gid==iDGBC) { sprint(fno,"%s_DGBC.dat", fstem) fo = new File(fno) fo.wopen() for i=0, vDGBC.size-1 { fo.printf("%g\n", vDGBC.x[i]) } fo.close() } if (gid==iDGHC) { sprint(fno,"%s_DGHC.dat", fstem) fo = new File(fno) fo.wopen() for i=0, vDGHC.size-1 { fo.printf("%g\n", vDGHC.x[i]) } fo.close() } if (gid==iCA3PC+1) { sprint(fno,"%s_CA3PC.dat", fstem) fo = new File(fno) fo.wopen() for i=0, vCA3PC.size-1 { fo.printf("%g\n", vCA3PC.x[i]) } fo.close() } if (gid==iCA3AAC) { sprint(fno,"%s_CA3AAC.dat", fstem) fo = new File(fno) fo.wopen() for i=0, vCA3AAC.size-1 { fo.printf("%g\n", vCA3AAC.x[i]) } fo.close() } if (gid==iCA3BC) { sprint(fno,"%s_CA3BC.dat", fstem) fo = new File(fno) fo.wopen() for i=0, vCA3BC.size-1 { fo.printf("%g\n", vCA3BC.x[i]) } fo.close() } if (gid==iCA3OLM) { sprint(fno,"%s_CA3OLM.dat", fstem) fo = new File(fno) fo.wopen() for i=0, vCA3OLM.size-1 { fo.printf("%g\n", vCA3OLM.x[i]) } fo.close() } if (gid==iCA1PC+8) { sprint(fno,"%s_CA1PC.dat", fstem) fo = new File(fno) fo.wopen() for i=0, vCA1PC.size-1 { fo.printf("%g\n", vCA1PC.x[i]) } fo.close() } if (gid==iCA1AAC) { sprint(fno,"%s_CA1AAC.dat", fstem) fo = new File(fno) fo.wopen() for i=0, vCA1AAC.size-1 { fo.printf("%g\n", vCA1AAC.x[i]) } fo.close() } if (gid==iCA1BC) { sprint(fno,"%s_CA1BC.dat", fstem) fo = new File(fno) fo.wopen() for i=0, vCA1BC.size-1 { fo.printf("%g\n", vCA1BC.x[i]) } fo.close() } if (gid==iCA1BSC) { sprint(fno,"%s_CA1BSC.dat", fstem) fo = new File(fno) fo.wopen() for i=0, vCA1BSC.size-1 { fo.printf("%g\n", vCA1BSC.x[i]) } fo.close() } // if (gid==iCA1OLM) { // sprint(fno,"%s_CA1OLM.dat", fstem) // fo = new File(fno) // fo.wopen() // for i=0, vCA1OLM.size-1 { // fo.printf("%g\n", vCA1OLM.x[i]) // } // fo.close() // } } } proc vCA1PCout() { local i, j, gid for j=0, cells.count-1 { // loop over possible target cells gid = gidvec.x[j] // id of cell if (gid==iCA1PC+8) { sprint(fno,"%s_CA1PCsoma.dat", fstem) fo = new File(fno) fo.wopen() for i=0, vCA1PC_soma.size-1 { fo.printf("%g\n", vCA1PC_soma.x[i]) } fo.close() sprint(fno,"%s_CA1PCradTprox.dat", fstem) fo = new File(fno) fo.wopen() for i=0, vCA1PC_radTprox.size-1 { fo.printf("%g\n", vCA1PC_radTprox.x[i]) } fo.close() sprint(fno,"%s_CA1PCradTmed.dat", fstem) fo = new File(fno) fo.wopen() for i=0, vCA1PC_radTmed.size-1 { fo.printf("%g\n", vCA1PC_radTmed.x[i]) } fo.close() sprint(fno,"%s_CA1PCradTdist.dat", fstem) fo = new File(fno) fo.wopen() for i=0, vCA1PC_radTdist.size-1 { fo.printf("%g\n", vCA1PC_radTdist.x[i]) } fo.close() sprint(fno,"%s_CA1PClmthick.dat", fstem) fo = new File(fno) fo.wopen() for i=0, vCA1PC_lm_thick.size-1 { fo.printf("%g\n", vCA1PC_lm_thick.x[i]) } fo.close() } } } // produce raster plot of spiking activity objref gs proc spikeplot() { local i gs = new Graph() gs.size(0, tstop, -1, ntot) for i=0, tvec.size-1 { gs.mark(tvec.x[i], idvec.x[i], "|", 8) } gs.flush() } // panel for simulation results proc xspikeres() { xpanel("Spike results") xbutton("Write voltages out", "vout()") xbutton("Write CA1 PC voltages out", "vCA1PCout()") xbutton("Write spikes out", "spikeout()") xbutton("Plot", "spikeplot()") xpanel() } xspikeres()