{load_file("nrngui.hoc")}
{load_file("mitral.hoc")}
{load_file("granule.hoc")}
celsius = 35
objref nil, pc
pc = new ParallelContext()
// line of nmitral mitral cells distributed from position 0 to len.
// No wrap-around. Each mitral cell assumed to have two
// secondary dendrites along the line with length len.
//network size parameters
//change following in param.hoc
//len = 1000 // size of the linear domain, mitral positions range from 0 to len
//Lsec = 1000 // mitral secden length
//ngranule = 1000 // distributed uniformly over the linear domain
//nmitral = 100 // distributed uniformly over the linear domain
// positions of mitral and granule cells
objref mitral_x, granule_x
mitral_x = new Vector()
granule_x = new Vector()
for i=0, nmitral - 1 {
mitral_x.append(len/nmitral/2+i*len/nmitral)
}
for i=0, ngranule - 1 {
granule_x.append(len/ngranule/2+i*len/ngranule)
}
nmitral=mitral_x.size
if (pc.id == 0) {
print nmitral, "first and last mitral at ", mitral_x.x[0], mitral_x.x[nmitral-1]
print ngranule, "first and last granule at ", granule_x.x[0], granule_x.x[ngranule-1]
}
// networksize assigned variables
// see comment on global GIDs assigned to cells
nmitral_begin = 0
ngranule_begin = nmitral_begin + nmitral
ncell = ngranule_begin + ngranule
{load_file("mgrs.hoc")}
{load_file("connect.hoc")}
// for more accurate complexity when splitting
// (prior to creation)
// $1 gid, $2 right or left
func how_many_syn_on_secden(){local n, xm, i, xg, delta, g localobj sp
if (object_id(sparse_connection_matrix_) == 0) {
sparse_connections()
}
sp = sparse_connection_matrix_
xm = mitral_x.x[$1]
n = 0
for i = 0, sp.sprowlen($1) - 1 {
sp.spgetrowval($1, i, &g)
xg = granule_x.x[i]
delta = xg - xm
if ($2 == 0) { // right secden
if (delta > 0 && delta < Lsec) {
n += 1
}
}else{ // left secden
if (delta < 0 && delta > -Lsec) {
n += 1
}
}
}
return n
}
func how_many_syn_on_granule() {local i, n, xg, xm localobj c //$1 is gid
c = g2m_connections($1)
return c.size
xg = granule_x.x[$1]
n = 0
for i=0, nmitral-1 {
xm = mitral_x.x[i]
if (abs(xm - xg) < Lsec) {
n += 1
}
}
return n
}
// if iterator does not exist load the default one.
if (!name_declared("cell_gids")) { load_file("iterator.hoc") }
//variables
// each cpu will have its own cell objects
objref cells //mitrals and granules on this cpu
cells = new List()
// for initialization
Vrest=-65
proc init() {
finitialize(Vrest)
forall {
if (ismembrane("nax")) {
e_pas=v+(ina+ik)/g_pas
} else if (ismembrane("k_ion")){
e_pas=v+ik/g_pas
}
}
fcurrent()
cvode.re_init()
frecord_init()
}
//parallel network object
// distribute GIDs and create cells
proc create_cells() { local gid, pgid, i, j, nm localobj cell, nc
for cell_gids(&pgid, &i) { //iterator returns changed value of address &gid in each loop
pc.set_gid2node(pgid, pc.id) //here the return value of iterator (gid) is used
}
for cell_gids(&pgid, &i) {
gid = basegid(pgid)
// if a piece exists do not create again
if (piecegid(gid) != pgid) { continue }
if (gid < nmitral) {
cell = new Mitral()
cell.position(mitral_x.x[gid], gid*20, 0)
for j=0,1 cell.secden[j].L = Lsec
splitmitral(gid, cell) // also associates base and piece gids
} else {
cell = new Granule()
cell.position(granule_x.x[gid-ngranule_begin], -100, 0)
cell.soma nc = new NetCon(&v(.5),nil)
pc.cell(gid, nc)
}
cells.append(cell)
// print pc.id, gid, cell
}
if (is_split) { pc.multisplit() }
}
proc mknet() {
create_cells()
connect_cells()
}
//load_file("control_net_graphics.hoc")
//load_file("control_net3.hoc")
//for i=0, mgrs_list.count-1 mgrs_list.object(i).pr()