-
Notifications
You must be signed in to change notification settings - Fork 1
/
net.hoc
149 lines (130 loc) · 3.64 KB
/
net.hoc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
{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()