-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathinput.hoc
138 lines (117 loc) · 3.13 KB
/
input.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
// input.hoc
// Olfactory bulb network model: define procedures to set-up input
// Andrew Davison, The Babraham Institute, 2000.
strdef odourfile,inputfile
objref odour, inputarray
objref A, X, S
odour = new Vector(nof)
inputarray = new Matrix(nmitx,nmity)
proc set_no_input() {
for i = 0, nmitx-1 {
for j = 0, nmity-1 {
inputarray.x[i][j] = 0.0
input[i][j].amp = inputarray.x[i][j]
}
}
}
proc add_uniform_input() { local i,j // 2 args - min and max input
for i = 0, nmitx-1 {
for j = 0, nmity-1 {
inputarray.x[i][j] += random.uniform($1,$2)
input[i][j].amp = inputarray.x[i][j]
}
}
}
proc add_focal_input() { // 4 args - max input, centre coords and half-width of spot
for i = 0, nmitx-1 {
for j = 0, nmity-1 {
inputarray.x[i][j] += $1*exp(-2.77259*((i-$3)*(i-$3)+(j-$2)*(j-$2))/($2*$2))
input[i][j].amp = inputarray.x[i][j]
//print i,j,input[i][j].amp
}
}
}
proc generate_odour_matrix() { local i,j,r,ix,iy,k,l,min,max
A = new Matrix(nglom,nof) // A is set here and should
// not be changed elsewhere
S = new Matrix(nmitx,nmity) // X and S are local
X = new Vector(nglom) // matrices
r = random.normal(0.0,0.5)
// Generate original matrix
for i = 0,nglom-1 for j = 0,nof-1 {
r = random.repick()
if (r < 0) {r = 0}
A.x[i][j] = r
}
// Average to obtain similar responses of nearby glomeruli
blur = 2
for j = 0,nof-1 {
X = A.getcol(j)
for ix = 0,nmitx-1 for iy = 0,nmity-1 {
S.x[ix][iy] = X.x[ix*nmity+iy]
}
for ix = 0,nmitx-1 for iy = 0,nmity-1 {
X.x[ix*nmity+iy] = 0
for k = -1,1 for l = -1,1 {
kx = mod(ix+k,nmitx)
ly = mod(iy+l,nmity)
X.x[ix*nmity+iy] += ( S.x[kx][ly] * exp(-blur*sqrt(k^2+l^2)) )
}
}
A.setcol(j,X)
}
max = arraymax(A)
min = arraymin(A)
print "min, max ",min,max
for i=0,nglom-1 for j=0,nof-1 {
A.x[i][j] += -min
}
A.muls(1/(max-min))
}
proc read_odour_file() {
sprint(odourfile,"odour%d",$1)
ropen(odourfile)
for i = 0,nof-1 {
odour.x[i] = fscan()
}
ropen()
printf("Odour %d loaded:\n",$1)
odour.printf("%6.3f")
}
proc map_odour_to_input() { local i,j // 2 args - odour vector and odour intensity
X = A.mulv($o1)
for i = 0, nmitx-1 {
for j = 0, nmity-1 {
inputarray.x[i][j] += $2 * X.x[i*nmity+j]
input[i][j].amp = inputarray.x[i][j]
}
}
}
proc add_odour_input() { // 2 args - odour number and input intensity
generate_odour_matrix()
read_odour_file($1)
map_odour_to_input(odour,$2)
}
proc add_fixed_input() { local i,j // 2 args - input vector and input intensity
sprint(inputfile,"input%d",$1)
ropen(inputfile)
for i = 0, nmitx-1 {
for j = 0, nmity-1 {
inputarray.x[i][j] = fscan()
input[i][j].amp = $2*inputarray.x[i][j]
}
}
ropen()
printf("Input %d loaded:\n",$1)
inputarray.printf("%6.3f")
}
proc glomshock() { local i,j // 3 args - amplitude, delay and duration
for i = 0, nmitx-1 {
for j = 0, nmity-1 {
inputarray.x[i][j] = $1
input[i][j].amp = inputarray.x[i][j]
input[i][j].del = $2
input[i][j].dur = $3
}
}
}