//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//
// 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
//
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
/*{load_file("pyrkop.tem")}
{load_file("bwb.tem")}
{load_file("ok.tem")}
{load_file("../parameters/synapses.tem")}
{load_file("../parameters/manycells.tem")} */
begintemplate TGbignet2
external cvode
// PUBLIC VARIABLES
// PUBLIC REFERENCES
public pnm,mm,mm2
// PUBLIC METHODS
public setScatteredVoltages, activeSynapses, pr, signalSynapse, activeSynapsesRandom, activeSynapsesZero, connectNetwork, writeVoltages, recordVoltages, noiseStim, nc, nil, noiselist, signallist, par_gaps, shortspikes, shortnonrandomspikes, singlecellnonrandom //, ncstim
public randomPyrThenStim, writesingleVoltage, writenoise, recordnoise, manualParamsg, addAntennaDC, activatePyrSynapses, activateBaskSynapses, activateAntSynapses, writeParameters, setSeed
public sado
objref pnm
objref synParamSet, noisySynParamSet, synCellSet, noisepyrlist, noisebasklist, nc, nil, noiselist, signallist, par_gaps, weightedvec, iapps, rrr
strdef xyzStr
objref s
weightedvec= new Vector()
manParamFlag=0
//dipoleFlag=1 //FLAGS DON'T WORK HERE!!! Must be in init()
gmax_basktopyr=0
gmax_pyrgap=0 //For manual parameter entry
// =================================================================================================
//
// init(Npyr, Nbask, Nolm)
//
// =================================================================================================
proc init() {
//print manParamFlag, "entered init"
print "init"
oneCell = 0 //I don't know
nModules = 1 // set up for # of cell columns, was 4 in paper ###changed to 1 on 3/11/08
debugFlag = 1 //to show where in the sim you are
dipoleFlag=1
dFlag = 1 //to print 3d information when cells are created
synCellSet = new CellParamSet() //reads in the cells.par into synCellSet
Npyr = synCellSet.cellSet.object(0).N
Nbask = synCellSet.cellSet.object(1).N
print "Number of bask cells=", Nbask
Nolm = synCellSet.cellSet.object(2).N
Nant = synCellSet.cellSet.object(3).N
Nnoise = Npyr + Nbask + Nant //one noise synapse on each pyr and bask AND ANT
print Nnoise
Npyr = Npyr
Nbask = Nbask
Nolm = Nolm
Nant = Nant //I have no idea what the purpose of this is
print "Number of Nant cells=", Nant
Nnoise = Nnoise //added
N = Npyr+Nbask+Nant+Nolm//+Nnoise //added the Nnoise
pnm = new ParallelNetManager(nModules*N)
if (debugFlag) print "Assigning GIDs"
//assignGIDs()
pnm.round_robin()
if (debugFlag) print "Creating cells"
createCells()
if (debugFlag) print "Connecting network"
//connectNetwork() //****placed in realone.hoc
if(nModules>1) connectNetworkInterModules()
//activeSynapses()
//activeSynapsesZero() //***placed in realone.hoc
signallist=new List()
}
//set global index for Random123 (affects noisy stimulation delivered to cells)
proc setSeed() {
print "setSeed function running"
rrr = new Random(0)
rrr.Random123(0,0)
rrr.Random123_globalindex(0) //sets global index of Random123 generator (need different global index for different simulations)
for i=0, Npyr+Nbask+Nant-1 {
rrr.Random123(0,0) //sets index for different cells, so that different cells receive completely different noisy input
rrr.seq(0)
}
}
// =================================================================================================
//
// iterators
// pyrIter
// baskIter
// olmIter
//
// =================================================================================================
iterator pyrIter() { local i, ii
for ii = 0, nModules-1 {
print "Npyr = ",Npyr
for i=0, Npyr-1 {
$&1 = i
$&2 = i+ii*N
iterator_statement
}
}
//if (debugFlag) print "pyrIter"
}
iterator antIter() { local i, ii
for ii = 0, nModules-1 {
//print "Nant = ",Nant
for i=0, Nant-1 {
$&1 = i
$&2 = i+Npyr+Nbask+ii*N
iterator_statement
}
}
//if (debugFlag) print "antIter"
}
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+Nant+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)
}
}
// =================================================================================================
//
// createCells() Now this also reads in xyz.dat to create the 3d placement of the cells
//
// =================================================================================================
proc createCells() {local gc, i, pNN, gid, x3, y3, z3, num localobj parRef, fo
print "createCells"
synParamSet = new SynParamSet(pnm.pc.id)
noisySynParamSet = new NoisySynParamSet(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, "Ant")==0) {
parRef = synCellSet.cellSet.object(i)
pNN = pNN + 1
}
}
if(pNN!=1) print "ERROR pNN Ant"
createAntCells(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)
for ii=0, nModules-1 { //no method yet how to do this for different Modules
fo = new File()
fo.ropen("parameters/chrisxyz.dat") //this way each Module will have same xyz, will have to re-set with an ii factor
if (dFlag) print " +++++++++++++++++++==================translating.............."
while( !fo.eof() ) {
fo.gets( xyzStr )
num = sscanf( xyzStr, "%d %d %d %d", &gid, &x3, &y3, &z3)
if (dFlag){
//print ".....................this is before translating"
//print gid, pnm.pc.gid2obj(gid)
pnm.pc.gid2obj(gid).soma {
// print secname()
// for i=0,n3d()-1 print i,x3d(i), y3d(i), z3d(i), diam3d(i)
}
if (gid<Npyr) { //only for pyr cells
pnm.pc.gid2obj(gid).Bdend {
//print secname()
//for i=0,n3d()-1 print i,x3d(i), y3d(i), z3d(i), diam3d(i)
}
pnm.pc.gid2obj(gid).Adend1 {
// print secname()
// for i=0,n3d()-1 print i,x3d(i), y3d(i), z3d(i), diam3d(i)
}
pnm.pc.gid2obj(gid).Adend3 {
// print secname()
// for i=0,n3d()-1 print i,x3d(i), y3d(i), z3d(i), diam3d(i)
}
} //gid < 81
} //if dFlag
pnm.pc.gid2obj(gid).soma{
translate(x3, y3, z3)
define_shape()
}
if (dFlag){
//print "......................AFTER translating"
//print gid, pnm.pc.gid2obj(gid)
pnm.pc.gid2obj(gid).soma {
//print secname()
//for i=0,n3d()-1 print i,x3d(i), y3d(i), z3d(i), diam3d(i)
}
if (gid<Npyr) { //only for pyr cells
pnm.pc.gid2obj(gid).Bdend {
//print secname()
//for i=0,n3d()-1 print i,x3d(i), y3d(i), z3d(i), diam3d(i)
}
pnm.pc.gid2obj(gid).Adend1 {
//print secname()
//for i=0,n3d()-1 print i,x3d(i), y3d(i), z3d(i), diam3d(i)
}
pnm.pc.gid2obj(gid).Adend3 {
//print secname()
//for i=0,n3d()-1 print i,x3d(i), y3d(i), z3d(i), diam3d(i)
}
} //gid < 81
} //if dFlag
} //while
fo.close()
for j=Npyr+Nbask, Npyr+Nbask+Nant-1 {
if (j%2) {
pnm.pc.gid2obj(j).soma {
//translate(0, -200 + ((400/Nant)*(j-Npyr-Nbask)), 0)
translate(0, -500 + ((1000/Nant)*(j-Npyr-Nbask)), 0)
define_shape()
}
} else {
pnm.pc.gid2obj(j).soma {
//translate(0, 0, -200 + ((400/Nant)*(j-Npyr-Nbask))) //(j-150) * 4)
translate(0, 0, -500 + ((1000/Nant)*(j-Npyr-Nbask)))
define_shape()
}
}
if (dFlag){
//print "......................AFTER translating"
//print j, pnm.pc.gid2obj(j)
pnm.pc.gid2obj(j).soma {
//print secname()
//for i=0,n3d()-1 print i,x3d(i), y3d(i), z3d(i), diam3d(i)
}
pnm.pc.gid2obj(j).Bdend {
//print secname()
//for i=0,n3d()-1 print i,x3d(i), y3d(i), z3d(i), diam3d(i)
}
pnm.pc.gid2obj(j).Adend1 {
//print secname()
//for i=0,n3d()-1 print i,x3d(i), y3d(i), z3d(i), diam3d(i)
}
pnm.pc.gid2obj(j).Adend3 {
//print secname()
//for i=0,n3d()-1 print i,x3d(i), y3d(i), z3d(i), diam3d(i)
}
} //if dFlag
} //for j
} //for ii
if (debugFlag) print "finished createcells"
}
//===================================================================
//
// translate(x in um, y in um, z in um)
//
//=======================================================
proc translate() { local ii
for ii=0,n3d()-1 { // n3d:::::Description:Return the number of 3d locations stored in the currently accessed section.
//pt3dchange(ii, x3d(ii)+$1, y3d(ii)+$2, z3d(ii)+$3, diam3d(ii)) //this one ruins the positioning, because the z3d is set as a (+100 label)
//pt3dchange(ii, $1, $2, $3, diam3d(ii)) //when I did it this way, it reset every piece of the soma to one position
pt3dchange(ii, x3d(ii)+$1, y3d(ii)+$2, $3, diam3d(ii)) //this one works, but only because of how this implementation goes, which puts all cellular data into xy and position into z. So I use explicit z and relative xy
//pt3dclear()
//pt3dadd(x3d(ii)+$1,y3d(ii)+$2,$3,diam3d(ii))
//print "SECTION NAME"
//print secname()
//print x3d(ii)+$1," ","",y3d(ii)+$2," ",$3," ", diam3d(ii)
}
//s= new Shape()
//s.show(0)
}
// =================================================================================================
//
// createPyrCells( CellParam (object))
//
// =================================================================================================
proc createPyrCells() {local i, j localobj c, r
print "createPyrCells function running"
r = new Random(pnm.pc.id+startsw())
i = 0
gid = 0
x3=0
y3=0
z3=0
cnt=0
for pyrIter(&i, &gid) {
if (pnm.gid_exists(gid)) {
c = new PYRkop(gid, r.uniform($o1.iappSl, $o1.iappSh)+0*(gid*80/400+250)*2.5e-1, 0, r.uniform($o1.iappAl, $o1.iappAh), 0, $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)
}
} //if gid%N<12/40*N
} //If 0
pnm.register_cell(gid, c )
// if (debugFlag) print "Cell # ", gid, " is a pyr cell"
addSyn(synParamSet, gid, "Pyr")
addNoisySyn(noisySynParamSet,gid,"Pyr") //CF: this function adds the noisesyn synapses
pnm.pc.gid2obj(gid).noisysynlist.o(0).gid = gid
c.soma {
define_shape()
//translate(gid, gid*2, gid*3)
//define_shape()
}
//pop_section()
if (dFlag){
//print gid, "pyr ", c
c.soma {
//print secname()
//for i=0,n3d()-1 print i,x3d(i), y3d(i), z3d(i), diam3d(i)
}
c.Bdend {
//print secname()
//for i=0,n3d()-1 print i,x3d(i), y3d(i), z3d(i), diam3d(i)
}
c.Adend1 {
//print secname()
//for i=0,n3d()-1 print i,x3d(i), y3d(i), z3d(i), diam3d(i)
}
c.Adend3 {
//print secname()
//for i=0,n3d()-1 print i,x3d(i), y3d(i), z3d(i), diam3d(i)
}
if (gid==-1) { // no longer used, was for testing on the fly
c.soma {
translate(2222,2222,2222)
define_shape() //this is necessary to translate the connected sections
//print secname(), " ............NOW REDONE "
// for i=0,n3d()-1 print i,x3d(i), y3d(i), z3d(i), diam3d(i)
}
c.Bdend {
// print secname()
// for i=0,n3d()-1 print i,x3d(i), y3d(i), z3d(i), diam3d(i)
}
c.Adend1 {
//print secname()
// for i=0,n3d()-1 print i,x3d(i), y3d(i), z3d(i), diam3d(i)
}
c.Adend3 {
//print secname()
//for i=0,n3d()-1 print i,x3d(i), y3d(i), z3d(i), diam3d(i)
} //adend3
} // if gid== -1
}// if dFlag
}//gidexists
}//pyriter
}//function
// =================================================================================================
//
// createAntCells( CellParam (object)); this is just a copied, then revised version of createPyrCells
//
// =================================================================================================
proc createAntCells() { local i, j localobj c, r
print "createAntCells function running"
r = new Random(pnm.pc.id+startsw())
i = 0
gid = 0
x3=0
y3=0
z3=0
cnt=0
for antIter(&i, &gid) { //antIter iterates over all modules and all cells within each module
if (pnm.gid_exists(gid)) {
//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, r.uniform($o1.iappSl, $o1.iappSh)+0*(gid*80/400+250)*2.5e-1, 0, r.uniform($o1.iappAl, $o1.iappAh), 0, $o1.iappUnits)
pnm.register_cell(gid, c ) //***this is very important: it actually creates the cell defined above as 'c'
//addSyn defined approximately 700 lines later
addSyn(synParamSet, gid, "Pyr")
addNoisySyn(noisySynParamSet,gid,"Ant") //CF: this function adds the noisesyn synapses
pnm.pc.gid2obj(gid).noisysynlist.o(0).gid = gid
// if (debugFlag) print "Cell # ", gid, " is a Antenna cell"
c.soma {
define_shape()
//translate(gid, gid*2, gid*3)
//define_shape()
}
//pop_section()
if (dFlag){
//print gid, "ant ", c
c.soma {
//print secname()
//for i=0,n3d()-1 print i,x3d(i), y3d(i), z3d(i), diam3d(i)
}
c.Bdend {
//print secname()
//for i=0,n3d()-1 print i,x3d(i), y3d(i), z3d(i), diam3d(i)
}
c.Adend1 {
//print secname()
//for i=0,n3d()-1 print i,x3d(i), y3d(i), z3d(i), diam3d(i)
}
c.Adend3 {
//print secname()
//for i=0,n3d()-1 print i,x3d(i), y3d(i), z3d(i), diam3d(i)
}
//print "GIDGGGG=",gid
if (gid==-1) { // no longer used, was for testing on the fly
c.soma {
translate(2222,2222,2222)
define_shape() //this is necessary to translate the connected sections
print secname(), " ............NOW REDONE "
for i=0,n3d()-1 print i,x3d(i), y3d(i), z3d(i), diam3d(i)
}
c.Bdend {
//print secname()
//for i=0,n3d()-1 print i,x3d(i), y3d(i), z3d(i), diam3d(i)
}
c.Adend1 {
//print secname()
//for i=0,n3d()-1 print i,x3d(i), y3d(i), z3d(i), diam3d(i)
}
c.Adend3 {
//print secname()
//for i=0,n3d()-1 print i,x3d(i), y3d(i), z3d(i), diam3d(i)
} //adend3
} // if gid== -1
} // if dFlag
} //gidexists
} //antiter
if(debugFlag) print "finished creating Ant cells"
} //function
// =================================================================================================
//
// createBaskCells(cell param object)
//
// =================================================================================================
proc createBaskCells() {local i, j, gid localobj c, r, fo
print "createBaskCells function running"
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), 0, $o1.iappUnits)
pnm.register_cell(gid, c )
//if (debugFlag) print "Cell # ", gid, " is a basket cell"
//if (debugFlag) print "Adding Basket synapses"
addSyn(synParamSet, gid, "Bask")
addNoisySyn(noisySynParamSet,gid,"Bask") //CF: this function adds the noisesyn synapses
pnm.pc.gid2obj(gid).noisysynlist.o(0).gid = gid
c.recordVoltage()
c.soma define_shape()
if(dFlag){
//print gid, "bask ", c
c.soma {
//print secname()
//for i=0,n3d()-1 print i,x3d(i), y3d(i), z3d(i), diam3d(i)
}
//print " ..... now baskets redone "
c.soma {
translate(234, 345, 456)
define_shape()
//print secname()
//for i=0,n3d()-1 print i,x3d(i), y3d(i), z3d(i), diam3d(i)
}
}
}
}
// =================================================================================================
//
// createOLMCells(men, sd)
//
// =================================================================================================
proc createOLMCells() {local i, j, gid localobj c, r, fo
r = new Random(pnm.pc.id+startsw())
i = 0
gid = 0
print "OLMcells function running"
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 )
print "THE OLM CELLS ARE NOT POSITIONED!!!! THIS NEEDS TO BE FIXED!!!!!!!"
addSyn(synParamSet, gid, "OLM")
if (debugFlag) "creating OLM cells"
}
}
// =================================================================================================
//
// createNoiseStim()
//
// =================================================================================================
proc createNoiseStim() {local i, j, gid localobj c
print "createNoiseStim function running"
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
}
}
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
// =================================================================================================
//deleted this non-useless function
// =================================================================================================
//
// activeSynapsesRandom() This is the main function for producing noise, both in SR and CR simulations
//
// =================================================================================================
//deleted non-useless function
// =================================================================================================
//
// shortspikes() This is the main function for producing noise in pyr cell axons for brief periods
//
// =================================================================================================
//deleted non-useless function
// =================================================================================================
//
// signalSynapse()
//
// =================================================================================================
//deleted this non-useless function
// =================================================================================================
//
// 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
//print "addSyn function running"
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
//print synParamSet.synSet.object(i).preCell ," ", synID," ",synParamSet.synSet.object(i).postCell , i
//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!!!!!!!!*********************"
}
}
}
// ========== this is a copied and modified version of addSyn (above)
//
// addNoisySyn(synParam, gid)
//
// =================================================================================================
proc addNoisySyn() { local i, start, tao1, tao2, Erev, synLocSec, synLoc, spikedur, spikefreq, normalmean, normalstd, weight, poisson_mean localobj noisySynParamSet
//print "addNoisySyn function running"
noisySynParamSet = $o1 //noisySynParamSet object, which just contains the general information from noisysynapses.par
gid = $2 //gid
for i=0, noisySynParamSet.noisySynSet.count()-1 {
if (!strcmp(noisySynParamSet.noisySynSet.object(i).postCell, $s3)) {
modFileName = noisySynParamSet.noisySynSet.object(i).modFileName
start = noisySynParamSet.noisySynSet.object(i).start
tao1 = noisySynParamSet.noisySynSet.object(i).tao1
tao2 = noisySynParamSet.noisySynSet.object(i).tao2
Erev = noisySynParamSet.noisySynSet.object(i).Erev
synLocSec = noisySynParamSet.noisySynSet.object(i).synLocSec
synLoc = noisySynParamSet.noisySynSet.object(i).synLoc
spikedur = noisySynParamSet.noisySynSet.object(i).spikedur
spikefreq = noisySynParamSet.noisySynSet.object(i).spikefreq
normalmean = noisySynParamSet.noisySynSet.object(i).normalmean
normalstd = noisySynParamSet.noisySynSet.object(i).normalstd
weight = noisySynParamSet.noisySynSet.object(i).weight
poisson_mean = noisySynParamSet.noisySynSet.object(i).poisson_mean
//if (debugFlag) print gid, $s3, modFileName, spikedur, spikefreq, weight, start
if (synLocSec==0) { //addSynS defined in pyrkop.tem
pnm.pc.gid2obj(gid).addNoisySynS( modFileName, start, tao1, tao2, Erev, synLoc, spikedur, spikefreq, normalmean, normalstd, weight, poisson_mean)
}
if (synLocSec==-1) {
pnm.pc.gid2obj(gid).addNoisySynB( modFileName, start, tao1, tao2, Erev, synLoc, spikedur, spikefreq, normalmean, normalstd, weight, poisson_mean)
}
if (synLocSec==1) {
pnm.pc.gid2obj(gid).addNoisySynA1( modFileName, start, tao1, tao2, Erev, synLoc, spikedur, spikefreq, normalmean, normalstd, weight, poisson_mean)
}
if (synLocSec==2) {
pnm.pc.gid2obj(gid).addNoisySynA2( modFileName, start, tao1, tao2, Erev, synLoc, spikedur, spikefreq, normalmean, normalstd, weight, poisson_mean)
}
if (synLocSec==3) {
pnm.pc.gid2obj(gid).addNoisySynA3( modFileName, start, tao1, tao2, Erev, synLoc, spikedur, spikefreq, normalmean, normalstd, weight, poisson_mean)
}
}
}
}
proc addAntennaDC() { local i, gid
print "addAntennaDC function running"
i = 0
gid = 0
for antIter(&i,&gid) {
if (pnm.gid_exists(gid)) {
pnm.pc.gid2obj(gid).setSomaIamp($1, 0) //amplitude, delay This hits the ant cells with a DC pulse current
}
}
}
//this function sets the spike_tau value for the noisy synapses on pyramidal cells; this is meant to be called from hoc
proc activatePyrSynapses() { local i, gid
print "activatePyrSynapses function running"
i = 0
gid = 0
for pyrIter(&i,&gid) {
if (pnm.gid_exists(gid)) {
pnm.pc.gid2obj(gid).noisysynlist.o(0).spike_tau = $1
pnm.pc.gid2obj(gid).noisysynlist.o(0).nospike_tau = $2
}
}
}
proc activateAntSynapses() { local i, gid
print "activateAntSynapses function running"
i = 0
gid = 0
for antIter(&i,&gid) {
if (pnm.gid_exists(gid)) {
//print pnm.pc.gid2obj(gid).noisysynlist.o(0).A
pnm.pc.gid2obj(gid).noisysynlist.o(0).spike_tau = $1
pnm.pc.gid2obj(gid).noisysynlist.o(0).nospike_tau = $2
}
}
}
//this function sets the spike_tau value for the noisy synapses on basket cells; this is meant to be called from hoc
proc activateBaskSynapses() { local i, gid
print "activateBaskSynapses fun running"
i = 0
gid = 0
for baskIter(&i,&gid) {
if (pnm.gid_exists(gid)) {
pnm.pc.gid2obj(gid).noisysynlist.o(0).spike_tau = $1
pnm.pc.gid2obj(gid).noisysynlist.o(0).nospike_tau = $2
}
}
}
proc sado(){
print "tau1=",pnm.pc.gid2obj(gid).noisysynlist.o(0).tau1
print "i=",pnm.pc.gid2obj(gid).noisysynlist.o(0).i
//print "g=", pnm.pc.gid2obj(gid).noisysynlist.o(0).g
//print "A=", pnm.pc.gid2obj(gid).noisysynlist.o(0).A
//print "B=",pnm.pc.gid2obj(gid).noisysynlist.o(0).B
}
// =================================================================================================
//
// recordVoltages()
//
// =================================================================================================
proc recordVoltages() { local i, ii
print "recordVoltages function running"
for i=0,Npyr-1 {
if (pnm.gid_exists(i)) {
pnm.pc.gid2obj(i).recordVoltage()
pnm.pc.gid2obj(i).fieldrec() //creates extraRec[i] and TRec[i] for extracellular potentials
//print "pnm=",pnm
//has each section individually into vectors
}
}
for i=Npyr, Npyr+Nbask-1 {
if (pnm.gid_exists(i)) {
pnm.pc.gid2obj(i).fieldrec()
}
} // adding basket contribution is negligible, but it works
//cvode.record(&vrec, electrodeRec, recordT) // wasn't going to work easily
for i=Npyr+Nbask,Npyr+Nbask+Nant-1 {
if (pnm.gid_exists(i)) {
//pnm.pc.gid2obj(i).recordVoltage() //defined in bwb.tem, pyrkop.tem, and ok.tem
pnm.pc.gid2obj(i).fieldrec() //creates extraRec[i] and TRec[i] for extracellular potentials
//has each section individually into vectors
}
}
// pnm.pc.gid2obj(80).recordVoltage() //basket cells
// pnm.pc.gid2obj(81).recordVoltage() //basket cells
// pnm.pc.gid2obj(100).recordVoltage() //to look at one of the ant cells
// pnm.pc.gid2obj(101).recordVoltage()
print "In recordVoltages()"
totalVecSize()
}
// =================================================================================================
//
// writeVoltages() 1/31/08 I am altering this section
//
// =================================================================================================
proc writeVoltages() { local i, ii, j localobj fo,fo2,fo3,fo4, ve, m,mm,mm2,mm3,mm4, dip, dip1, vrec, vrecactive, vrecantenna
print "writeVoltages function running"
print "In writeVoltages()"
totalVecSize()
mm= new Matrix(pnm.pc.gid2obj(0).recordT[0].size(), 2) //I added, not (if.existed)
mm2=new Matrix(pnm.pc.gid2obj(0).recordT[0].size(), 2)
mm3=new Matrix(pnm.pc.gid2obj(0).recordT[0].size(), 2)
mm4=new Matrix(pnm.pc.gid2obj(0).recordT[0].size(), 2)
print "size=",pnm.pc.gid2obj(0).recordT[0].size()
ve = new Vector(pnm.pc.gid2obj(0).recordT[0].size())
dip = new Vector(pnm.pc.gid2obj(0).recordT[0].size())
dip1 = new Vector(pnm.pc.gid2obj(0).recordT[0].size())
vrec = new Vector(pnm.pc.gid2obj(0).recordT[0].size()) //was originally TRec[0], but then I removed the cvode.record for space
print "vrec in writeVoltages=",vrec
//print pnm.pc.gid2obj(0).recordT[0].size()
vrecactive = new Vector(pnm.pc.gid2obj(0).recordT[0].size())
vrecantenna = new Vector(pnm.pc.gid2obj(0).recordT[0].size())
mm.setcol(0, pnm.pc.gid2obj(0).recordT[0])
mm2.setcol(0, pnm.pc.gid2obj(0).recordT[0])
mm3.setcol(0, pnm.pc.gid2obj(0).recordT[0])
mm4.setcol(0, pnm.pc.gid2obj(0).recordT[0])
for i=0, Npyr-1{
if (pnm.gid_exists(i)) {
ve.add(pnm.pc.gid2obj(i).voltageRecS[0]) //prior to may 2011, this was actually 1, or the Bdend voltage
}
} //adds voltages from all pyramidal cells together
ve.mul(1/(Npyr-1)) //then averages them
mm.setcol(1, ve) //then sets them into the matrix that will be saves as the "sum" file
//mm2.setcol(3,ve)
fo = new File()
fo2 = new File()
fo3=new File()
fo4=new File()
//print dipoleFlag //also used for vrec
//generate intracellular voltage traces of individual cells
/* pnm.pc.gid2obj(0).writeVoltage(0,$1,$2,$3,$4,$5)
pnm.pc.gid2obj(19).writeVoltage(19,$1,$2,$3,$4,$5)
pnm.pc.gid2obj(30).writeVoltage(30,$1,$2,$3,$4,$5)
pnm.pc.gid2obj(42).writeVoltage(42,$1,$2,$3,$4,$5)
pnm.pc.gid2obj(44).writeVoltage(44,$1,$2,$3,$4,$5)
pnm.pc.gid2obj(47).writeVoltage(47,$1,$2,$3,$4,$5)
pnm.pc.gid2obj(55).writeVoltage(55,$1,$2,$3,$4,$5)
pnm.pc.gid2obj(56).writeVoltage(56,$1,$2,$3,$4,$5)
pnm.pc.gid2obj(65).writeVoltage(65,$1,$2,$3,$4,$5)
pnm.pc.gid2obj(66).writeVoltage(66,$1,$2,$3,$4,$5)
pnm.pc.gid2obj(68).writeVoltage(68,$1,$2,$3,$4,$5) */
//VERY IMPORTANT: for this to work, must include line 'pnm.pc.gid2obj(####).recordVoltage()' in recordVoltages() above, except for regular pyramidal cells(this is necessary in order for recordT to exist)
/*pnm.pc.gid2obj(0).writeField(0,$1,$2,$3,$4,$5)
pnm.pc.gid2obj(1).writeField(1,$1,$2,$3,$4,$5)
pnm.pc.gid2obj(2).writeField(2,$1,$2,$3,$4,$5)
pnm.pc.gid2obj(3).writeField(3,$1,$2,$3,$4,$5)
pnm.pc.gid2obj(4).writeField(4,$1,$2,$3,$4,$5)
pnm.pc.gid2obj(5).writeField(5,$1,$2,$3,$4,$5)
pnm.pc.gid2obj(6).writeField(6,$1,$2,$3,$4,$5)
pnm.pc.gid2obj(7).writeField(7,$1,$2,$3,$4,$5)
pnm.pc.gid2obj(8).writeField(8,$1,$2,$3,$4,$5)
pnm.pc.gid2obj(9).writeField(9,$1,$2,$3,$4,$5) */
//pnm.pc.gid2obj(80).writeField(80,$1,$2,$3,$4,$5)
//pnm.pc.gid2obj(81).writeField(81,$1,$2,$3,$4,$5)
//pnm.pc.gid2obj(100).writeField(100,$1,$2,$3,$4,$5)
//pnm.pc.gid2obj(101).writeField(101,$1,$2,$3,$4,$5)
if (dipoleFlag) {
print "entered dipole"
for i=0, Npyr-1{
if(pnm.gid_exists(i)){
dip.add(pnm.pc.gid2obj(i).voltageRecS[1]) // Bdend
dip.sub(pnm.pc.gid2obj(i).voltageRecS[4]) // A3
dip1.add(pnm.pc.gid2obj(i).voltageRecS[1]) //Bdend
dip1.sub(pnm.pc.gid2obj(i).voltageRecS[2]) //A1 Dipoles are done to all cells once, including neighbor cells
for j=0,4 {
vrec.add(pnm.pc.gid2obj(i).extraRec[j]) //vrec uses all active pyr cells PLUS....
vrecactive.add(pnm.pc.gid2obj(i).extraRec[j]) //vrecactive is all active pyr cells (plus baskets)
}
}
}
for i=Npyr+Nbask,Npyr+Nbask+Nant-1 { //the antenna cells
//for j=0,4 {
// print "number of Nant is equalto",Nant
// weightedvec=pnm.pc.gid2obj(i).extraRec[j]
// vrecantenna.add(weightedvec) //in case you want to add multiple of the antenna signal
// weightedvec.mul(1)
// vrec.add(weightedvec) //vrec adds all antenna cells, with a weight (now 1)
//}
if(pnm.gid_exists(i)){
//dip.add(pnm.pc.gid2obj(i).voltageRecS[1]) // Bdend
//dip.sub(pnm.pc.gid2obj(i).voltageRecS[4]) // A3
//dip1.add(pnm.pc.gid2obj(i).voltageRecS[1]) //Bdend
//dip1.sub(pnm.pc.gid2obj(i).voltageRecS[2]) //A1
for j=0,4 {
vrec.add(pnm.pc.gid2obj(i).extraRec[j]) //vrec uses all antenna pyr cells PLUS....
vrecantenna.add(pnm.pc.gid2obj(i).extraRec[j]) //vrecantenna is all antenna pyr cells
}
}
}
for i=Npyr,Npyr+Nbask-1 {
if(pnm.gid_exists(i)){
//print pnm.pc.gid2obj(i)
weightedvec=pnm.pc.gid2obj(i).extraRec
weightedvec.mul(1)
vrec.add(weightedvec) //vrec adds all baskets
vrecactive.add(weightedvec) //vrecactive also adds all baskets
}
} //baskets are negligible, but they work
if (debugFlag) print vrec.size(), vrecactive.size(), vrecantenna.size(), dip.size(), dip1.size(), "after all cells"
sprint(cmd, "data/extra_b%4.2f_p%5.3f_g%4.2f_f%d.dat",$1,$2,$3,$4) //extracellular voltage
if($5 < 1e-6) {
fo.wopen(cmd)
} else { fo.aopen(cmd) }
mm.setcol(1, vrec)
mm.fprint(0, fo, "%9.6lf ")
fo.close()
sprint(cmd, "data/extra_b%4.2f_p%5.3f_g%4.2f_f%d_SUM.dat",$1,$2,$3,$4) //extracellular voltage
fo2.aopen(cmd)
mm2.setcol(1, vrec)
mm2.fprint(0, fo2, "%9.6lf ")
fo2.close()
sprint(cmd, "data/extraactive_b%4.2f_p%5.3f_g%4.2f_f%d.dat",$1,$2,$3,$4) //extracellular voltage
if($5 < 1e-6) {
fo.wopen(cmd)
} else { fo.aopen(cmd) }
mm.setcol(1, vrecactive)
mm.fprint(0, fo, "%9.6lf ")
fo.close()
sprint(cmd, "data/extraactive_b%4.2f_p%5.3f_g%4.2f_f%d_SUM.dat",$1,$2,$3,$4) //extracellular voltage
fo3.aopen(cmd)
mm3.setcol(1, vrecactive)
mm3.fprint(0, fo3, "%9.6lf ")
fo3.close()
sprint(cmd, "data/extraantenna_b%4.2f_p%5.3f_g%4.2f_f%d.dat",$1,$2,$3,$4) //extracellular voltage
if($5 < 1e-6) {
fo.wopen(cmd)
} else { fo.aopen(cmd) }
mm.setcol(1, vrecantenna)
mm.fprint(0, fo, "%9.6lf ")
fo.close()
sprint(cmd, "data/extraantenna_b%4.2f_p%5.3f_g%4.2f_f%d_SUM.dat",$1,$2,$3,$4) //extracellular voltage
fo4.aopen(cmd)
mm4.setcol(1, vrecantenna)
mm4.fprint(0, fo4, "%9.6lf ")
fo4.close()
}
//CF: I added the following lines so that the memory consumed by these recording vectors doesn't increase without bound throughout the run
for i=0, Npyr-1{
if(pnm.gid_exists(i)){
for j=0,4 {
pnm.pc.gid2obj(i).voltageRecS[j].resize(0)
pnm.pc.gid2obj(i).extraRec[j].resize(0)
}
}
}
for i=Npyr+Nbask, Npyr+Nbask+Nant-1{
if(pnm.gid_exists(i)){
for j=0,4 {
pnm.pc.gid2obj(i).voltageRecS[j].resize(0) //don't need this bc. voltages of antenna cells are not being recorded
pnm.pc.gid2obj(i).extraRec[j].resize(0)
}
}
}
for i=Npyr,Npyr+Nbask-1 {
if(pnm.gid_exists(i)){
pnm.pc.gid2obj(i).voltageRecS.resize(0) //don't need this bc. voltages of basket cells are not being recorded
pnm.pc.gid2obj(i).extraRec.resize(0)
}
}
//pnm.pc.gid2obj(0).recordT[0].resize(0)
for i=0,Npyr-1 {
pnm.pc.gid2obj(i).recordT[0].resize(0)
}
for i=Npyr+Nbask,Npyr+Nbask+Nant-1 {
pnm.pc.gid2obj(i).recordT[0].resize(0)
}
for i=Npyr,Npyr+Nbask-1 {
pnm.pc.gid2obj(i).recordT.resize(0)
}
}
// =================================================================================================
//
// writesingleVoltage() 12/18/08 for when there is just a single pyr cell conn
//
// =================================================================================================
//delete this non-useless function
//=========================================================================================================================
//========================================================================================================================
//=========================================================================================================================
//CF: add new function to write all the important parameters to a single file
proc writeParameters() { localobj fo
fo = new File()
sprint(cmd, "data/parameters_b%4.2f_p%4.2f_g%d_f%d.dat",$1,$2,$3,$4)
fo.wopen(cmd)
sprint(cmd, "bask_spike_tau=%9.6f", $1)
fo.printf("%s \n",cmd)
sprint(cmd, "pyr_spike_tau=%9.6f", $2)
fo.printf("%s \n",cmd)
sprint(cmd, "gapstyle=%d", $3)
fo.printf("%s \n",cmd)
sprint(cmd, "sigfreq=%d", $4)
fo.printf("%s \n",cmd)
sprint(cmd, "bask_spike_tau=%9.6f", $5)
fo.printf("%s \n",cmd)
sprint(cmd, "pyr_spike_tau=%9.6f", $6)
fo.printf("%s \n",cmd)
sprint(cmd, "antennaDC=%9.6f", $7)
fo.printf("%s \n",cmd)
sprint(cmd, "Tstop=%9.6f", $8)
fo.printf("%s \n",cmd)
sprint(cmd, "t_seg=%9.6f", $9)
fo.printf("%s \n",cmd)
sprint(cmd, "Npyr=%d", Npyr)
fo.printf("%s \n",cmd)
sprint(cmd, "Nbask=%d", Nbask)
fo.printf("%s \n",cmd)
sprint(cmd, "Nolm=%d", Nolm)
fo.printf("%s \n",cmd)
sprint(cmd, "Nant=%d", Nant)
fo.printf("%s \n",cmd)
fo.close()
}
//====================================================================================================================
proc recordnoise() {
print "recordnoise fun running"
pnm.pc.gid2obj(1).recordnoise()
}
//====================================================================================================================
proc totalVecSize() {local i, s localobj vlist
print "totalVecSize function running"
vlist = new List("Vector")
s=0
max1=0
max2=0
max3=0
for i=1,vlist.count-1 {
s += vlist.o(i).size
//if (vlist.o(i).size > 500) print vlist.o(i).size, vlist.o(i) // this shows that there are thousands of vectors recording every time point (i.e. 20001 long for a 500 ms recording)
if (vlist.o(i).size > max1) {
max2=max1 //this only takes the second biggest vector, not the 1000's that are tied for longest vector
max1 = vlist.o(i).size
max3=i
}
//print vlist.o(i) // REALLY long
}
print "# Vectors: ", vlist.count, " total size: ", s, " top 2: ", max1, max2 //, " top: ", vlist.o(max3) // not useful, many that long
}
// =================================================================================================
//
// writenoise() 12/18/08 to determine noise input variance
//
// =================================================================================================
proc writenoise() { localobj fo, mm
//$1 is the pyrthresh
//I am assuming the cell we are recording is "GID= 1"
print "writenoise function running"
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
print "setScatteredVoltages function running"
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
print "makePyrgCaScattered function running"
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, rng, connthr localobj fo, randomconn
print "connectNetwork function running"
preGID = 0
postGID = 0
noiseGID = 0
globalID = 0
cellArea = 0
cnt=0
rng=0 //will be used with randomconn.repick()
connthr=$1 //if rng<connthr, the connection will be made
randomconn = new Random ( startsw() )
randomconn.uniform(0,100)
Npyr = synCellSet.cellSet.object(0).N //I think this is not supposed to have +1 for 80 cells
Nbask = synCellSet.cellSet.object(1).N
Nolm = synCellSet.cellSet.object(2).N
Nant = synCellSet.cellSet.object(3).N
par_gaps=new List() //makes a gap junction list
for ii=0, nModules-1 {
fo = new File()
fo.ropen("parameters/standard_conn.dat")
countSyn = 0
countGap = 0
//forcibly set all baskets to all pyr cells, with % connection of connthr (100 = all connections made)
for i=Npyr, Npyr + Nbask-1 {
for j=0,Npyr-1 {
preGID=i + ii* N
postGID=j + ii*N
globalID = 0 //do this bc. in synapses.par, the globalID for basket to pyr cells is 0
if(pnm.gid_exists(preGID) || pnm.gid_exists(postGID)) {
gmax = $2 //this allows for sweeping over various values of gmax for bask->pyr connections
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) {
g = cellArea * gmax * 1e-5 //cellArea is 100 in bask, so g=gmax*.001
}else{
g = gmax * 1e-3
}
Npre = synParamSet.synSet.object(globalID).Npre
if (Npre==-1) { //CF: I'm pretty sure that if Npre==-1, then you assume all-to-all connectivity; in this case, you assume each pyr cell receives a synapse from every single basket cell
pN = -1
pNN = 0
for k=0, synCellSet.cellSet.count()-1 {
if(strcmp(synCellSet.cellSet.object(k).name, synParamSet.synSet.object(globalID).preCell)==0) {
pN = synCellSet.cellSet.object(k).N
pNN = pNN + 1
}
}
if(pNN!=1 || pN==-1) print "ERROR pNN"
Npre = pN
}
g = g / Npre
rng=50 //uniform 0-100
if (rng <= connthr) {
//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)
countSyn = countSyn + 1
if (debugFlag) print "connecting these two cells: ",pnm.pc.gid2obj(preGID), pnm.pc.gid2obj(postGID), synID, g, delay
}
thr=pnm.pc.threshold(preGID,-20) //can add (preGID, -10) to change it. At 0, lost many conns
}//if pre/post GIDs exist
} //for j -- stepping through pyr cells
// now for ANT cells
for j=Npyr+Nbask,Npyr+Nbask+Nant-1 { //now do the same thing for the ANT cells, still using the i from baskets
preGID=i + ii* N
postGID=j + ii*N
globalID = 0 //do this bc. in synapses.par, the globalID for basket to pyr cells is 0
if(pnm.gid_exists(preGID) || pnm.gid_exists(postGID)) {
gmax = $2 //this allows for sweeping over various values of gmax for bask->pyr connections
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) {
g = cellArea * gmax * 1e-5 //cellArea is 100 in bask, so g=gmax*.001
}else{
g = gmax * 1e-3
}
Npre = synParamSet.synSet.object(globalID).Npre
if (Npre==-1) { //CF: I'm pretty sure that if Npre==-1, then you assume all-to-all connectivity; in this case, you assume each pyr cell receives a synapse from every single basket cell
pN = -1
pNN = 0
for k=0, synCellSet.cellSet.count()-1 {
if(strcmp(synCellSet.cellSet.object(k).name, synParamSet.synSet.object(globalID).preCell)==0) {
pN = synCellSet.cellSet.object(k).N
pNN = pNN + 1
}
}
if(pNN!=1 || pN==-1) print "ERROR pNN"
Npre = pN
}
g = g / Npre
rng=50 //uniform 0-100
if (rng <= connthr) {
//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)
countSyn = countSyn + 1
if (debugFlag) print "connecting these two cells: ",pnm.pc.gid2obj(preGID), pnm.pc.gid2obj(postGID), synID, g, delay
}
thr=pnm.pc.threshold(preGID,-20) //can add (preGID, -10) to change it. At 0, lost many conns
}//if pre/post GIDs exist
} //for j --ant cells
} // for i -- stepping through baskets
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) { //CF: I'm pretty sure that if Npre==-1, then you assume all-to-all connectivity; in this case, you assume each pyr cell receives a synapse from every single basket cell
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
// the gmax is divided by 1000, then by the presyn cells (20 in case of bask-pyr GABA)
if (globalID<10) {
//******* Basket to Pyr connections *******
rng=50 //uniform 0-100
if(globalID==0){ //this is for the basket-pyr AMPA synapses, which I can split into 2
if (rng <= connthr) {
{ //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)
countSyn = countSyn + 1
print "this shouldn't be happening, it is already set above"
}
}
//******** all other regular synapses ****************
} else { ind = pnm.nc_append(preGID, postGID, synID, g, delay)
countSyn = countSyn + 1
//print 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 // no longer needed here, done within each instance, which also separated out the gaps
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--no longer needed
totalGaps=totalGaps+countGap
ggap=.00005
pnm.pc.setup_transfer()
printf("%d synapses and %d gaps were set\n\n", countSyn, totalGaps)
totalVecSize()
}
// =================================================================================================
//
// connectNetworkInterModules() THIS SECTION NOT UTILIZED IN THIS MODEL
//
// =================================================================================================
// Delete this non-useless function
// =================================================================================================
//
// 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 TGbignet2