//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // // NOTICE OF COPYRIGHT AND OWNERSHIP OF SOFTWARE // // Copyright 2010, The University Of Michigan // // All rights reserved. // For research use only; commercial use prohibited. // No Distribution without permission of William Stacey // wstacey@umich.edu // //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //this template is very similar to that in the 2009 paper: ModelDB accession 135902 //it has the following changes: //1. addition of 20 more pyramidal cells "Neighbors", taking the gid slots 81-100. Original 0-80 are "Drivers" //2. basket cells now take gid slots 101-120 //3. basket cells contact all 100 pyr cells (GABA), and each pyr cell contacts 2 or 3 basket cells (AMPA/NMDA) //4. potential recurrent synapse or gap junction conn between 20 of the Driver cells and the 20 Neighbors //5. Only inputs are noise to the pyramidal cells, implemented in the procedure activeSynapsesRandom() // that function starts with low noise for 200 ms, then adds noise to the Drivers for 1000 ms, then at 600 // ms adds noise to the Neighbors for 1000 ms (thus 600 ms crossover). Total duration 1600 ms //6. In the writeVoltages file, now saves three average voltage files: for all pyr cells ("sum") // all Driver cells "sumdrive" and all Neighbor cells "sumpas" begintemplate Recruitnet external cvode // PUBLIC VARIABLES // PUBLIC REFERENCES public pnm // PUBLIC METHODS public setScatteredVoltages, activeSynapses, pr, signalSynapse, activeSynapsesRandom, writeVoltages, recordVoltages, noiseStim, nc, nil, noiselist, signallist, par_gaps //, ncstim public randomPyrThenStim, writesingleVoltage, writenoise, recordnoise, manualParams objref pnm objref synParamSet, synCellSet, noisepyrlist, noisebasklist, nc, nil, noiselist, signallist, par_gaps manParamFlag=0 gmax_basktopyr=0 gmax_pyrgap=0 //For manual parameter entry {load_file("PYRkop.tem")} {load_file("Bwb.tem")} {load_file("Ok.tem")} {load_file("../parameters/synapses.tem")} {load_file("../parameters/recruitcells.tem")} // ================================================================================================= // // init(Npyr, Nbask, Nolm) // // ================================================================================================= proc init() { //manualParams(1.5, 5.5) print manParamFlag, "entered init" oneCell = 0 //I don't know nModules = 1 // this was 4 in the Tort paper debugFlag = 0 synCellSet = new CellParamSet() //reads in the cells.par into synCellSet Npyr = synCellSet.cellSet.object(0).N + 1 Nbask = synCellSet.cellSet.object(1).N Nolm = synCellSet.cellSet.object(2).N Nnoise = Npyr + Nbask //one noise synapse on each pyr and bask Npyr = Npyr Nbask = Nbask Nolm = Nolm Nnoise = Nnoise //added N = Npyr+Nbask+Nolm//+Nnoise //added the Nnoise pnm = new ParallelNetManager(nModules*N) if (debugFlag) print "Assigning GIDs" //assignGIDs() pnm.round_robin() //print N, Npyr, Nbask if (debugFlag) print "Creating cells" createCells() if (debugFlag) print "Connecting network" connectNetwork() if(nModules>1) connectNetworkInterModules() //activeSynapses() activeSynapsesZero() signallist=new List() } // ================================================================================================= // // iterators // pyrIter // baskIter // olmIter // // ================================================================================================= iterator pyrIter() { local i, ii for ii = 0, nModules-1 { for i=0, Npyr-1 { $&1 = i $&2 = i+ii*N iterator_statement } } //if (debugFlag) print "pyrIter" } iterator baskIter() { local i, ii for ii = 0, nModules-1{ for i=0,Nbask-1 { $&1 = i $&2 = i+Npyr+ii*N iterator_statement } } //if (debugFlag) print "baskIter" } iterator olmIter() { local i, ii for ii = 0, nModules-1{ for i=0,Nolm-1 { $&1 = i $&2 = i+Npyr+Nbask+ii*N iterator_statement } } //if (debugFlag) print "OLMiter" } iterator noiseIter() { local i, ii for ii = 0, nModules-1{ for i=0,Nnoise-1 { $&1 = i $&2 = i+Npyr+Nbask+Nolm+ii*N iterator_statement } } //if (debugFlag) print "Noiseiter" } // ================================================================================================= // // assignGIDs() // not called, rather the round_robin is called // ================================================================================================= proc assignGIDs() { local i, gid i = 0 gid = 0 if (debugFlag) print "ID#", pnm.pc.id, " NHOST:", pnm.pc.nhost if (pnm.pc.nhost>1) { for pyrIter(&i, &gid) pnm.set_gid2node(gid, i%(pnm.pc.nhost-1)) for baskIter(&i,&gid) pnm.set_gid2node(gid, pnm.pc.nhost-1) for olmIter(&i, &gid) pnm.set_gid2node(gid, pnm.pc.nhost-1) for noiseIter(&i, &gid) pnm.set_gid2node(gid, pnm.pc.nhost-1) }else{ for pyrIter(&i, &gid) pnm.set_gid2node(gid, 0) for baskIter(&i,&gid) pnm.set_gid2node(gid, 0) for olmIter(&i, &gid) pnm.set_gid2node(gid, 0) for noiseIter(&i, &gid) pnm.set_gid2node(gid, 0) } } // ================================================================================================= // // manualParams() $1 is the gmax for the bask-pyr GABA, $2 is gmax for pyr-pyr gap junction // // ================================================================================================= proc manualParams() {local i manParamFlag=1 gmax_basktopyr=$1 gmax_pyrgap=$2 print manParamFlag, "entered manualparams, not yet implemented" } // ================================================================================================= // // createCells() // // ================================================================================================= proc createCells() {local gc, i, pNN localobj parRef synParamSet = new SynParamSet(pnm.pc.id) pNN = 0 for i=0, synCellSet.cellSet.count()-1 { if(strcmp(synCellSet.cellSet.object(i).name, "Pyr")==0) { parRef = synCellSet.cellSet.object(i) pNN = pNN + 1 } } if(pNN!=1) print "ERROR pNN PYR" createPyrCells(parRef) pNN = 0 for i=0, synCellSet.cellSet.count()-1 { if(strcmp(synCellSet.cellSet.object(i).name, "Bask")==0) { parRef = synCellSet.cellSet.object(i) pNN = pNN + 1 } } if(pNN!=1) print "ERROR pNN BASK" createBaskCells(parRef) pNN = 0 for i=0, synCellSet.cellSet.count()-1 { if(strcmp(synCellSet.cellSet.object(i).name, "OLM")==0) { parRef = synCellSet.cellSet.object(i) pNN = pNN + 1 } } if(pNN!=1) print "ERROR pNN OLM" createOLMCells(parRef) } // ================================================================================================= // // createPyrCells( CellParam (object)) // // ================================================================================================= proc createPyrCells() {local i, j, gid localobj c, r r = new Random(pnm.pc.id+startsw()) i = 0 gid = 0 for pyrIter(&i, &gid) { if (pnm.gid_exists(gid)) { if(gid%N==0) { // Passive cell //c = new PYRkop(gid, 0, $o1.iappSsd, 0, $o1.iappAsd, $o1.iappUnits) c = new PYRkop(gid, 0, 0, 0, 0, $o1.iappUnits) //### added stim to first 20 cells 7/8/8 //}else if(gid<20){ //c = new PYRkop(gid, r.uniform($o1.iappSl, $o1.iappSh)+0*(gid*80/400+250)*2.5e-1, $o1.iappSsd, r.uniform($o1.iappAl, $o1.iappAh), $o1.iappAsd, $o1.iappUnits) //c = new PYRkop(gid, 0, 94.2, 180, 94.2, 0) }else{ c = new PYRkop(gid, r.uniform($o1.iappSl, $o1.iappSh)+0*(gid*80/400+250)*2.5e-1, $o1.iappSsd, r.uniform($o1.iappAl, $o1.iappAh), $o1.iappAsd, $o1.iappUnits) if (0) { if (gid%N<12/40*N && int(gid/N)<2 ) { c = new PYRkop(gid, r.uniform($o1.iappSl, $o1.iappSh)+0*(gid*80/400+250)*2.5e-1, $o1.iappSsd, r.uniform(330, 349), $o1.iappAsd, $o1.iappUnits) //c = new PYRkop(gid, r.uniform($o1.iappSl, $o1.iappSh)+0*(gid*80/400+250)*2.5e-1, $o1.iappSsd, r.uniform(300, 310), $o1.iappAsd, $o1.iappUnits) } else { if (gid%N<12/40*N && int(gid/N)>=2) { //c = new PYRkop(gid, r.uniform($o1.iappSl, $o1.iappSh)+0*(gid*80/400+250)*2.5e-1, $o1.iappSsd, r.uniform(820, 849), $o1.iappAsd, $o1.iappUnits) c = new PYRkop(gid, r.uniform($o1.iappSl, $o1.iappSh)+0*(gid*80/400+250)*2.5e-1, $o1.iappSsd, r.uniform(350, 400), $o1.iappAsd, $o1.iappUnits) }else{ c = new PYRkop(gid, r.uniform($o1.iappSl, $o1.iappSh)+0*(gid*80/400+250)*2.5e-1, $o1.iappSsd, r.uniform($o1.iappAl, $o1.iappAh), $o1.iappAsd, $o1.iappUnits) } } } } pnm.register_cell(gid, c ) addSyn(synParamSet, gid, "Pyr") } } } // ================================================================================================= // // createBaskCells(cell param object) // // ================================================================================================= proc createBaskCells() {local i, j, gid localobj c, r r = new Random(pnm.pc.id+startsw()) i = 0 gid = 0 for baskIter(&i, &gid) if (pnm.gid_exists(gid)) { c = new Bwb(gid, r.uniform($o1.iappSl, $o1.iappSh), $o1.iappSsd, $o1.iappUnits) pnm.register_cell(gid, c ) addSyn(synParamSet, gid, "Bask") c.recordVoltage() } } // ================================================================================================= // // createOLMCells(men, sd) // // ================================================================================================= proc createOLMCells() {local i, j, gid localobj c, r r = new Random(pnm.pc.id+startsw()) i = 0 gid = 0 for olmIter(&i, &gid) if (pnm.gid_exists(gid)) { //c = new Ok(gid, r.uniform($o1.iappSl, $o1.iappSh), $o1.iappSsd, $o1.iappUnits) c= new Ok(gid, 0,0,0) pnm.register_cell(gid, c ) addSyn(synParamSet, gid, "OLM") if (debugFlag) "creating OLM cells" // Random vurrent inj 0-500 ms // c.iappS.set_random(gid) //c.recordVoltage() } } // ================================================================================================= // // createNoiseStim() No longer used // // ================================================================================================= proc createNoiseStim() {local i, j, gid localobj c i = 0 gid = 0 for noiseIter(&i, &gid) if (pnm.gid_exists(gid)) { c = new NetStim() pnm.register_cell(gid, c ) // as of 5/26/08, the noise cells are 121-201 (to pyr) and 202-221 (to bask) //as of 6/08 this is no longer used, and the netstims are just NULLOBJECTs //addSyn(synParamSet, gid, "OLM") //print "creating noise cells" } } iterator ltr() {local i, cnt for i = 0, $o2.count - 1 { $o1 = $o2.object(i) iterator_statement } } strdef cmd // ================================================================================================= // // activeSynapsesZero() // // ================================================================================================= proc activeSynapsesZero() {localobj xo, co co = pnm.nclist //if ($1) print "synapse ACTIVATION at ", pnm.pc.id, co.count() for ltr(xo, co) { //if ($1) print pnm.pc.id, xo.precell, xo.postcell, xo.syn, xo.weight sprint(cmd, "%s", xo.postcell) if(strcmp(cmd,"NULLobject")!=0) xo.active(0) } } objref synR // ================================================================================================= // // randomPyrThenStim() to have the pyr cells firing randomly and lightly up to certain time, // then start some input at that time. THIS WAS NOT USED FOR THIS PAPER // ================================================================================================= proc randomPyrThenStim() {localobj xo, co, noiseR, noiseA, firstR // $1 start stim, $2 end stim, $3 min pyrthresh (uniform) prior to stim // $4 '0' DC current, '1' random inputs, $5 current value/pyrthresh value noiseR = new Random( startsw() ) synR = new Random( startsw() ) firstR = new Random( startsw() ) noiseA = new Random( startsw() ) synR.uniform(5,15) co = pnm.nclist for ltr(xo, co) { //print pnm.pc.id, xo.precell, xo.postcell, xo.syn, xo.weight, xo sprint(cmd, "%s", xo.postcell) if(strcmp(cmd, "NULLobject")!=0) { sprint( cmd, "%s.active(1)", xo ) cvode.event(synR.repick(), cmd) //makes NetCon[#] active at random times within 250, 750 //###! // but if you remove this, there are no conns to the baskets... } } //add a noise event to every pyr cell and every bask cell noiseR.uniform(0,100) noiseA.poisson(0.8) minthreshold=$3 //maximum pyrthresh on a uniform scale during first segment // no basketthreshold is implemented now, as basket noise was treated in the 2009 paper basketthreshold=100 noisestepper=.1 //how long the time intervals are in ms between each poisson noise iteration rng=0 tStop=$2 //this is where the entire run ends tStart=$1 //this is where the stim starts, and where the noise ends randomflag=$4 //1 will go to random inputs, 0 will be DC input noiselist=new List() noisetime=0 // set up the Netcons for noise synapses on pyramidal cells for ii=0, nModules-1 { for i=0,80 { noisetime=0 gidnoise= i+ ii*N if(pnm.gid_exists(gidnoise)) { nc=new NetCon(nil, pnm.pc.gid2obj(gidnoise).synlist.o(2)) //print gidnoise, pnm.pc.gid2obj(gidnoise).synlist.o(2), nc.postcell, nc nc.weight=.00001 * 53.407075 //cell area of pyr vs. the bask noiselist.append(nc) coweight=nc.weight firstR.uniform(minthreshold,100) threshold=firstR.repick() while(noisetime<tStop){ if (noisetime>0 && noisetime<tStart) { //first segment, just noise rng=noiseR.repick() if (rng>threshold) { amp=noiseA.repick() noiselist.o[i].weight = nc.weight * amp //print noiselist.o[i], noisetime, noiselist.o[i].weight sprint(cmd, "%s.active(1)",noiselist.o[i]) cvode.event(noisetime,cmd) //print i, noisetime noiselist.o[i].event(noisetime) } //rng nc.weight=coweight //reset weight to original value, else it retains it from this event } // if noisetime if (noisetime>tStart && noisetime<tStop) { //second segment if (!randomflag) { pnm.pc.gid2obj(gidnoise).setAdend1Iamp($5,tStart) //40 saturates it, 20 is poorly coordinated //30 has a couple of saturated ones, 35 a few more } else { rng=noiseR.repick() if (rng>$5) { //now all receive same input, as def by $5=pyrthresh amp=noiseA.repick() noiselist.o[i].weight = nc.weight * amp sprint(cmd, "%s.active(1)",noiselist.o[i]) cvode.event(noisetime,cmd) noiselist.o[i].event(noisetime) } //rng nc.weight=coweight } //randomflag } //if noisetime noisetime=noisetime+noisestepper } //while noisetime } //gidexists } // for i for i=81,100 { //### switched from 81 - 100 to have passive cells noisetime=0 gidnoise= i+ ii*N if(pnm.gid_exists(gidnoise)) { nc=new NetCon(nil, pnm.pc.gid2obj(gidnoise).synlist.o(3)) //print gidnoise, pnm.pc.gid2obj(gidnoise).synlist.o(3), nc.precell, nc.postcell, nc nc.weight=.00001 //could not compare with the synapses.par file because those are corrected by .001 or (1e-5 x area) noiselist.append(nc) coweight=nc.weight while(noisetime<tStop){ if (noisetime>0 && noisetime<tStop) { rng=noiseR.repick() if (rng>basketthreshold) { amp=noiseA.repick() noiselist.o[i].weight = nc.weight * amp print noiselist.o[i], noisetime, noiselist.o[i].weight sprint(cmd, "%s.active(1)",noiselist.o[i]) cvode.event(noisetime,cmd) //print i, noisetime noiselist.o[i].event(noisetime) } //rng nc.weight=coweight //reset weight to original value, else it retains it from this event } //if noisetime noisetime=noisetime+noisestepper } //while noisetime } //gidexists } //for i } //ii //print noiselist.o[81].postcell, noiselist.o[81].weight, noiselist.o[81] } // proc randomPyrThenStim // ================================================================================================= // // activeSynapsesRandom() This is the main function to add noise to the network // It has been altered from the 2009 model significantly // ================================================================================================= proc activeSynapsesRandom() {localobj xo, co, noiseR, noiseA //$1 is tstop, $2 is pyr noise threshold, $3 is bask noise threshold, $4 is the driver thresh synR = new Random( startsw() ) noiseR = new Random( startsw() ) noiseA = new Random( startsw() ) synR.uniform(5,15) co = pnm.nclist for ltr(xo, co) { sprint(cmd, "%s", xo.postcell) if(strcmp(cmd, "NULLobject")!=0) { sprint( cmd, "%s.active(1)", xo ) cvode.event(synR.repick(), cmd) //makes NetCon[#] active at random times within 250, 750 //###! if you remove this there are no conns to the baskets } } //add a noise event to every pyr cell and every bask cell noiseR.uniform(0,100) noiseA.poisson(0.8) threshold=$2 //75 makes it start out at 100 hz basketthreshold=$3 driverthreshold=$4 noisestepper=.1 //how long the time intervals are in ms between each poisson noise iteration delayD=200 //how long to wait before the Driver noise turns on lengthD=1000 //how long the Driver noise will last delayP=600 //how long for the Neighbor cells to wait before noise starts, now connected to "start" below quiescentthr=97 //baseline low noise level before it starts up higher at delayD rng=0 tStop=$1 noiselist=new List() noisetime=0 // set up the Netcons for noise synapses on pyramidal cells for ii=0, nModules-1 { for i=0,Npyr-1 { noisetime=0 //will make a delay before noise starts gidnoise= i+ ii*N if(pnm.gid_exists(gidnoise)) { nc=new NetCon(nil, pnm.pc.gid2obj(gidnoise).synlist.o(2)) nc.weight=.00001 * 53.407075 //cell area of pyr vs. the bask noiselist.append(nc) coweight=nc.weight //start=noiseR.repick() //start=start/20 // to make scattered delay starts, so they aren't all at same time exactly start=delayP if(gidnoise<81){ //for the Driver Cells while(noisetime<(lengthD+delayD)){ if (noisetime<delayD) { //what to do before the increased driver noise starts rng=noiseR.repick() if (rng>quiescentthr) { amp=noiseA.repick() noiselist.o[i].weight = nc.weight * amp sprint(cmd, "%s.active(1)",noiselist.o[i]) cvode.event(noisetime,cmd) noiselist.o[i].event(noisetime) } //rng nc.weight=coweight //reset weight to original value, else it retains it from this event } else { //after the delay rng=noiseR.repick() if (rng>driverthreshold) { amp=noiseA.repick() noiselist.o[i].weight = nc.weight * amp sprint(cmd, "%s.active(1)",noiselist.o[i]) cvode.event(noisetime,cmd) noiselist.o[i].event(noisetime) } //rng nc.weight=coweight //reset weight to original value, else it retains it from this event } // if noisetime noisetime=noisetime+noisestepper } //while noisetime } else { //the 20 Neighbor cells with different threshold while(noisetime<tStop){ if (noisetime<start) { rng=noiseR.repick() if (rng>quiescentthr) { amp=noiseA.repick() noiselist.o[i].weight = nc.weight * amp sprint(cmd, "%s.active(1)",noiselist.o[i]) cvode.event(noisetime,cmd) noiselist.o[i].event(noisetime) } //rng nc.weight=coweight //reset weight to original value, else it retains it from this event } else { //after the off period //if (noisetime>start && noisetime<tStop) { //method is redundant, was used for variable input timing rng=noiseR.repick() if (rng>threshold) { amp=noiseA.repick() noiselist.o[i].weight = nc.weight * amp sprint(cmd, "%s.active(1)",noiselist.o[i]) cvode.event(noisetime,cmd) noiselist.o[i].event(noisetime) } //rng nc.weight=coweight //reset weight to original value, else it retains it from this event } // else noisetime=noisetime+noisestepper } //while noisetime } //else } //gidexists } // for i for i=Npyr,N-1 { //### Basket cells noisetime=0 gidnoise= i+ ii*N if(pnm.gid_exists(gidnoise)) { nc=new NetCon(nil, pnm.pc.gid2obj(gidnoise).synlist.o(3)) nc.weight=.00001 //could not compare with the synapses.par file because those are corrected by .001 or (1e-5 x area) noiselist.append(nc) coweight=nc.weight while(noisetime<tStop){ if (noisetime>0 && noisetime<tStop) { rng=noiseR.repick() if (rng>basketthreshold) { amp=noiseA.repick() noiselist.o[i].weight = nc.weight * amp sprint(cmd, "%s.active(1)",noiselist.o[i]) cvode.event(noisetime,cmd) noiselist.o[i].event(noisetime) } //rng nc.weight=coweight //reset weight to original value, else it retains it from this event } //if noisetime noisetime=noisetime+noisestepper } //while noisetime } //gidexists } //for i } //for ii } //proc // ================================================================================================= // // signalSynapse() Not used in this paper // // ================================================================================================= proc signalSynapse() {localobj xo, co //$1 is tstop, $2 is synapse type: 0 for AMPA; 1 for NMDA, $3 is freq in Hz, $4 is the gid getting the sig co = pnm.nclist tStop=$1 syntype=$2 freq=$3 gidsig=$4 if (freq==0) return signaltime=0 // set up the Netcons for signal synapses on pyramidal cells if(pnm.gid_exists(gidsig)) { if (syntype==0) { nc=new NetCon(nil, pnm.pc.gid2obj(gidsig).synlist.o(3)) }else if (syntype!=0) { print "ERROR: do not have any signal other than AMPA now" return } nc.weight=.0001 * 53.407075 //cell area of pyr vs. the bask //.0001 *53.4 is still subthreshold .0003 is just right for over threshold signallist.prepend(nc) while(signaltime<tStop){ sprint(cmd, "%s.active(1)",signallist.o[0]) cvode.event(signaltime,cmd) signallist.o[0].event(signaltime) signaltime= signaltime + 1000/freq //to make it ms } //while noisetime } //gidexists } //proc proc noiseStim() { print "noisestim is nonfunctional" } // ================================================================================================= // // addGap(g, gid) this function is not working, it is done in a different fashion // // ================================================================================================= proc addGap() { print "addGap does not work! " pnm.pc.gid2obj($2).addGapA1($1) // all are set to the number listed in createPyrCells now } strdef modFileName // ================================================================================================= // // addSyn(synParam, gid) // // ================================================================================================= proc addSyn() { local i, tao1, tao2, Erev, synLocSec, synLoc, gid, ind, synID, r localobj synParamSet synParamSet = $o1 gid = $2 for i=0, synParamSet.synSet.count()-1 { if (!strcmp(synParamSet.synSet.object(i).postCell, $s3)) { tao1 = synParamSet.synSet.object(i).tao1 tao2 = synParamSet.synSet.object(i).tao2 Erev = synParamSet.synSet.object(i).Erev modFileName = synParamSet.synSet.object(i).modFileName synLocSec = synParamSet.synSet.object(i).synLocSec synLoc = synParamSet.synSet.object(i).synLoc synID = synParamSet.synSet.object(i).synID r = synParamSet.synSet.object(i).r //first time through synID is all -2, then become 0,1,2,3. The precells::i are-- Bask::0 OLM::3 Noise::7 Pyr::9 // //on the baskets, there are also 0,1,2,3 a bask 1, NMDA pyr 2, and OLM 4, and noise 8 //and on OLM there are 0,1, bask and NMDA pyr // // Assign synID if (synLocSec==0) { synParamSet.synSet.object(i).synID = pnm.pc.gid2obj(gid).addSynS( tao1, tao2, Erev, modFileName, synLoc) } if (synLocSec==-1) { synParamSet.synSet.object(i).synID = pnm.pc.gid2obj(gid).addSynB( tao1, tao2, Erev, modFileName, synLoc) } if (synLocSec==1) { synParamSet.synSet.object(i).synID = pnm.pc.gid2obj(gid).addSynA1( tao1, tao2, Erev, modFileName, synLoc) } if (synLocSec==2) { synParamSet.synSet.object(i).synID = pnm.pc.gid2obj(gid).addSynA2( tao1, tao2, Erev, modFileName, synLoc) } if (synLocSec==3) { synParamSet.synSet.object(i).synID = pnm.pc.gid2obj(gid).addSynA3( tao1, tao2, Erev, modFileName, synLoc) } if(r>-1) pnm.pc.gid2obj(gid).synlist.object(synParamSet.synSet.object(i).synID).r = r if(synParamSet.synSet.object(i).synID<0) print "ERROR!!!!!!!!*********************" } } } // ================================================================================================= // // recordVoltages() // // ================================================================================================= proc recordVoltages() { local i, ii for i=0,Npyr-1 { if (pnm.gid_exists(i)) pnm.pc.gid2obj(i).recordVoltage() } } // ================================================================================================= // // writeVoltages() This now saves several files. "sum" is the sum of all 100 pyr cells // "sumdrive" is the sum of just the Driver pyr cells // "sumpas" is the sum of just the Neighbor pyr cells // ================================================================================================= proc writeVoltages() { local i, ii localobj fo, ve, vedrive, vepassive, m, mm, mmdrive, mmpassive //added the localobj if (pnm.gid_exists(0)) { mm= new Matrix(pnm.pc.gid2obj(0).recordT[0].size(), 2) mmdrive= new Matrix(pnm.pc.gid2obj(0).recordT[0].size(), 2) mmpassive= new Matrix(pnm.pc.gid2obj(0).recordT[0].size(), 2) ve = new Vector(pnm.pc.gid2obj(0).recordT[0].size()) vedrive = new Vector(pnm.pc.gid2obj(0).recordT[0].size()) vepassive = new Vector(pnm.pc.gid2obj(0).recordT[0].size()) mm.setcol(0, pnm.pc.gid2obj(0).recordT[0]) mmdrive.setcol(0, pnm.pc.gid2obj(0).recordT[0]) mmpassive.setcol(0, pnm.pc.gid2obj(0).recordT[0]) } //first make the sum of all pyr cells for i=0,Npyr-1 { if (pnm.gid_exists(i)) { ve.add(pnm.pc.gid2obj(i).voltageRecS[1]) } } ve.mul(1/(Npyr-1)) mm.setcol(1, ve) fo = new File() if (numarg()==4) {sprint(cmd, "data/sum_b%d_p%d_g%d_f%d.dat",$1,$2,$3,$4) //3.1lf for i nA } else {sprint(cmd, "data/sum.dat")} fo.wopen(cmd) mm.fprint(0, fo, "%6.3lf ") fo.close() //then make the sum of the Driver "drive" cells, and the Neighbor "pas" cells if (1) { //can just switch this to zero if I don't want extra files. for i=0,80 { if (pnm.gid_exists(i)) { vedrive.add(pnm.pc.gid2obj(i).voltageRecS[1]) } } vedrive.mul(1/81) mmdrive.setcol(1, vedrive) fo = new File() if (numarg()==4) {sprint(cmd, "data/sumdrive_b%d_p%d_g%d_f%d.dat",$1,$2,$3,$4) //3.1lf for i nA } else {sprint(cmd, "data/sumdrive.dat")} fo.wopen(cmd) mmdrive.fprint(0, fo, "%6.3lf ") fo.close() for i=81,100 { if (pnm.gid_exists(i)) { vepassive.add(pnm.pc.gid2obj(i).voltageRecS[1]) } } vepassive.mul(1/20) mmpassive.setcol(1, vepassive) fo = new File() if (numarg()==4) {sprint(cmd, "data/sumpas_b%d_p%d_g%d_f%d.dat",$1,$2,$3,$4) //3.1lf for i nA } else {sprint(cmd, "data/sumpas.dat")} fo.wopen(cmd) mmpassive.fprint(0, fo, "%6.3lf ") fo.close() } //if (1) } // ================================================================================================= // // writesingleVoltage() 12/18/08 for when there is just a single pyr cell conn // Not used in this paper // ================================================================================================= proc writesingleVoltage() { localobj fo, mm //$1 is the basketthr $2 is pyrthresh $3 is sigfreq //I am assuming the cell we are recording is "GID= 1" fo= new File() if (pnm.gid_exists(1)){ mm= new Matrix(pnm.pc.gid2obj(1).recordT[1].size(), 2) mm.setcol(0, pnm.pc.gid2obj(1).recordT[1]) mm.setcol(1, pnm.pc.gid2obj(1).voltageRecS[1]) sprint(cmd, "data/1_b%d_p%d_single_f%d.dat",$1,$2,$3) fo.wopen(cmd) mm.fprint(0, fo, "%6.3lf ") fo.close() } if (pnm.gid_exists(81)) { mm= new Matrix(pnm.pc.gid2obj(81).recordT.size(), 2) mm.setcol(0, pnm.pc.gid2obj(81).recordT) mm.setcol(1, pnm.pc.gid2obj(81).voltageRecS) sprint(cmd, "data/81_b%d_p%d_single_f%d.dat",$1,$2,$3) fo.wopen(cmd) mm.fprint(0, fo, "%6.3lf ") fo.close() } } proc recordnoise() { pnm.pc.gid2obj(1).recordnoise() } // ================================================================================================= // // writenoise() 12/18/08 to determine noise input variance // not used in this paper // ================================================================================================= proc writenoise() { localobj fo, mm //$1 is the pyrthresh //I am assuming the cell we are recording is "GID= 1" fo= new File() if (pnm.gid_exists(1)){ mm= new Matrix(pnm.pc.gid2obj(1).recordT[1].size(), 2) mm.setcol(0, pnm.pc.gid2obj(1).recordT[1]) mm.setcol(1, pnm.pc.gid2obj(1).iRec) sprint(cmd, "data/noise_b%d.dat",$1) fo.wopen(cmd) mm.fprint(0, fo, "%6.3lf ") fo.close() } } // ================================================================================================= // // setScatteredVoltages(low, high) // // ================================================================================================= proc setScatteredVoltages() { local low, high low = $1 high = $2 i = 0 gid = 0 for pyrIter(&i,&gid) if (pnm.gid_exists(gid)) pnm.pc.gid2obj(gid).setScatteredVoltages(low, high) //for pyrIter(&i,&gid) if (pnm.gid_exists(gid)) pnm.pc.gid2obj(gid).setScatteredVoltages(-56, -55) for baskIter(&i,&gid) if (pnm.gid_exists(gid)) pnm.pc.gid2obj(gid).setScatteredVoltages(low, high) for olmIter(&i,&gid) if (pnm.gid_exists(gid)) pnm.pc.gid2obj(gid).setScatteredVoltages(low, high) finitialize() finitialize() //if (debugFlag) print "not stuck there" } // ================================================================================================= // // makePyrgCaScattered( flag ) flag = {0,1} // // ================================================================================================= proc makePyrgCaScattered() { local i, low, high, gid localobj rand gCaScattered = $1 gid = 0 i = 0 rand = new Random(startsw()) if (gCaScattered==0) { low = 10 high = 10 }else{ low = 9 high = 11 } rand.uniform(low, high) for pyrIter(&i, &gid) if (pnm.gid_exists(i)) pnm.pc.gid2obj(i).den.gca_icapr = rand.repick() } strdef lineStr // ================================================================================================= // // connectNetwork() // // ================================================================================================= proc connectNetwork() { local sgid, i, ii, thr, Erev, g, cellArea, num, cnt, countSyn, preGID, postGID, noiseGID, synID, globalID, ind, gmax, gmaxUnits, delay, Npre, gapcon localobj fo preGID = 0 postGID = 0 noiseGID = 0 globalID = 0 cellArea = 0 cnt=0 Npyr = synCellSet.cellSet.object(0).N + 1 //I think this is not supposed to have +1 for 80 cells Nbask = synCellSet.cellSet.object(1).N Nolm = synCellSet.cellSet.object(2).N par_gaps=new List() //makes a gap junction list for ii=0, nModules-1 { fo = new File() fo.ropen("parameters/recruitconn.dat") countSyn = 0 countGap = 0 while( !fo.eof() ) { fo.gets( lineStr ) cnt=cnt+1 num = sscanf( lineStr, "%d, %d, %d", &preGID, &postGID, &globalID) preGID = preGID + ii * N postGID = postGID + ii * N // has GABA (globalID 0) from each bask to pyr once // then has random NMDA pyr to bask (GlobalID 2, which is NOT synID) // these are the corresponding 0 and 2 rows of the synapses.par file // I have now made GlobalID 7 the noise->pyr AMPA, and 8 noise-> bask // 9 signal->pyr 10 pyr-pyr gaps, 11 bask-bask gaps if(num!=3) print "ERROR!!!!!!!!!!!!!!" //gAMPAdend * taPyr * 1e-5 // Do only if source or target are on the node if(pnm.gid_exists(preGID) || pnm.gid_exists(postGID)) { gmax = synParamSet.synSet.object(globalID).gmax delay = synParamSet.synSet.object(globalID).delay synID = synParamSet.synSet.object(globalID).synID // these get set in AddSyn gmaxUnits = synParamSet.synSet.object(globalID).gmaxUnits Erev = synParamSet.synSet.object(globalID).Erev if ((manParamFlag==1) && (globalID==0) ) { print "manual param flag ", preGID, postGID //gmax= gmax_basktopyr } if ( pnm.gid_exists(postGID)) cellArea = pnm.pc.gid2cell(postGID).getTotalArea() if(gmaxUnits==1) { // Convert gmax from mS/cm2 to uS g = cellArea * gmax * 1e-5 //cellArea is 100 in bask, so g=gmax*.001 }else{ // Convert gmax from nS to uS g = gmax * 1e-3 } // Normalize by the presynaptic number of cells Npre = synParamSet.synSet.object(globalID).Npre if (Npre==-1) { //not sure what this does, it affects those syns in synapses.par with -1 Npre pN = -1 pNN = 0 for i=0, synCellSet.cellSet.count()-1 { if(strcmp(synCellSet.cellSet.object(i).name, synParamSet.synSet.object(globalID).preCell)==0) { pN = synCellSet.cellSet.object(i).N pNN = pNN + 1 } } if(pNN!=1 || pN==-1) print "ERROR pNN" Npre = pN } g = g / Npre if (globalID<10) { if(globalID==0){ //this is for the basket-pyr AMPA synapses, which I can split into 2 (but did not in this paper) { //if(cnt%2) ###this is to make only every other one go if placed before the bracket ind = pnm.nc_append(preGID, postGID, synID, g, delay) } } else {ind = pnm.nc_append(preGID, postGID, synID, g, delay) } } else { // globalID 10 and 11 are gaps. we've already read in the gmax of the gap, rest is garbage if (globalID == 10) { //for baskbask gaps par_gap_create(preGID, 0 ,postGID, 0, gmax ) //the 2nd and 4th are locations countGap = countGap+1 // 0 means soma, 1 means A1 for now } //globalID 10 if (globalID == 11) { //for pyrpyr gaps if (manParamFlag==1) { print "manual param flag ", preGID, postGID //gmax= gmax_pyrgap } //manParamFlag par_gap_create(preGID, 0 ,postGID, 0, gmax ) //the 2nd and 4th are locations countGap = countGap+1 // 0 means soma, 1 means A1 for now } //globalID 11 } //else countSyn = countSyn + 1 thr=pnm.pc.threshold(preGID,-20) //can add (preGID, -10) to change it. At 0, lost many conns }//if pre/post GIDs exist } //while f.!eof fo.close() } // ii countSyn=countSyn-countGap //to correct for increments of Syn that were actually Gap above totalGaps=totalGaps+countGap pnm.pc.setup_transfer() printf("%d synapses and %d gaps were set\n\n", countSyn, totalGaps) } // ================================================================================================= // // connectNetworkInterModules() // THIS IS NOT USED // ================================================================================================= proc connectNetworkInterModules() { local sgid, i, ii, iii, Erev, g, cellArea, num, countSyn, preGID, postGID, synID, globalID, ind, gmax, gmaxUnits, delay, Npre localobj fo //countSyn = 0 //for some reason it's passing the N as the countSyn now 5/8 WS preGID = 0 postGID = 0 globalID = 0 cellArea = 0 for ii=0, nModules-1 { for iii=0,nModules-1 if (ii!=iii) { fo = new File() fo.ropen("parameters/recruitconn.dat") countSyn = 0 while( !fo.eof() ) { fo.gets( lineStr ) num = sscanf( lineStr, "%d, %d, %d", &preGID, &postGID, &globalID) if(strcmp(synParamSet.synSet.object(globalID).preCell, "OLM")==0 && strcmp(synParamSet.synSet.object(globalID).postCell, "Pyr")==0 && preGID!=postGID) { preGID = preGID + ii * N postGID = postGID + iii * N if(num!=3) print "ERROR!!!!!!!!!!!!!!" //gAMPAdend * taPyr * 1e-5 // Do only if source or target are on the node if(pnm.gid_exists(preGID) || pnm.gid_exists(postGID)) { gmax = synParamSet.synSet.object(globalID).gmax delay = synParamSet.synSet.object(globalID).delay synID = synParamSet.synSet.object(globalID).synID gmaxUnits = synParamSet.synSet.object(globalID).gmaxUnits Erev = synParamSet.synSet.object(globalID).Erev if ( pnm.gid_exists(postGID)) cellArea = pnm.pc.gid2cell(postGID).getTotalArea() if(gmaxUnits==1) { // Convert gmax from mS/cm2 to uS g = cellArea * gmax * 1e-5 }else{ // Convert gmax from nS to uS g = gmax * 1e-3 } // Normalize by the presynaptic number of cells Npre = synParamSet.synSet.object(globalID).Npre if (Npre==-1) { pN = -1 pNN = 0 for i=0, synCellSet.cellSet.count()-1 { if(strcmp(synCellSet.cellSet.object(i).name, synParamSet.synSet.object(globalID).preCell)==0) { pN = synCellSet.cellSet.object(i).N pNN = pNN + 1 } } if(pNN!=1 || pN==-1) print "ERROR pNN" Npre = pN } g = g / Npre ind = pnm.nc_append(preGID, postGID, synID, g, delay) countSyn = countSyn + 1 } } } fo.close() } // ii }// iii pnm.pc.setup_transfer() printf("%d Intermodule Connections were set\n\n", countSyn) } // ================================================================================================= // // par_gap_create() // taken from NEURON implementation of Traub's 2005 thalamocortical model // ================================================================================================= gap_src_gid = 2 func par_gap_create() { gap_src_gid += 2 if (pnm.gid_exists($1)) { par_gap_create1($1, $2, gap_src_gid + 1, gap_src_gid, $5) } if (pnm.gid_exists($3)) { par_gap_create1($3, $4, gap_src_gid, gap_src_gid + 1, $5) } return totalGaps + 1 } proc par_gap_create1() {localobj c, g, gaploc c = pnm.pc.gid2obj($1) if ($2==0) {gaploc=c.getlocoS()} if ($2==1) {gaploc=c.getlocoA1()} gaploc.sec { g = new gGapPar(.5) par_gaps.append(g) //print pnm.pc.gid2obj($1), gaploc, $3, $4, par_gaps.count() pnm.pc.target_var(&g.vgap, $3) pnm.pc.source_var(&v(.5), $4) g.g = $5 } } endtemplate Recruitnet