-
Notifications
You must be signed in to change notification settings - Fork 1
/
mapping.g
280 lines (171 loc) · 5.28 KB
/
mapping.g
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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
//genesis
//
// $Id: mapping.g 1.9 Thu, 04 Apr 2002 11:55:56 +0200 hugo $
//
//////////////////////////////////////////////////////////////////////////////
//'
//' Purkinje tutorial
//'
//' (C) 1998-2002 BBF-UIA
//'
//' see our site at http://www.bbf.uia.ac.be/ for more information regarding
//' the Purkinje cell and genesis simulation software.
//'
//'
//' functional ideas ... Erik De Schutter, [email protected]
//' genesis coding ..... Hugo Cornelis, [email protected]
//'
//' general feedback ... Reinoud Maex, Erik De Schutter
//'
//////////////////////////////////////////////////////////////////////////////
// mapping.g : mapping between dendrites and spines
int include_mapping
if ( {include_mapping} == 0 )
include_mapping = 1
///
/// SH: MappingCreate
///
/// PA: path..: path with spines
///
/// DE: Create mapping elements between dendrites and spines
/// Mappings are created within the element /mappings
///
function MappingCreate(path)
str path
//- go to specified path
pushe {path}
//- create a neutral mapping element
create neutral /mappings
//- add a field for number of mappings
addfield /mappings mappingCount \
-description "Number of mappings"
//- loop over all compartments in the path
str comp
foreach comp ( {el ./#[][TYPE=compartment]} )
//- index of the element defaults to zero
int index = 0
//- default : do not create a mapping for this element
int bCreateMapping = 0
//- get the tail of the element
str tail = {getpath {comp} -tail}
//- calculate the place of the index count
// the quotes are not necessary but this way emacs is somewhat
// more friendly when matching braces
int indexOpen = {findchar {tail} "["}
int indexClose = {findchar {tail} "]"}
//- if this element has an index count
if ({indexOpen} != -1)
//- remove the index from the element
str compNoIndex = {substring {tail} 0 {indexOpen - 1}}
//- if it is not a spine
if ({strcmp {compNoIndex} spine} != 0)
//- calculate the index
index = {substring {tail} \
{indexOpen + 1} \
{indexClose - 1}}
//- remember to create a mapping
bCreateMapping = 1
end
end
//- if we should create a mapping
if (bCreateMapping)
//- if the mapping already exists
if (! {exists /mappings/{compNoIndex}})
//- create a neutral mapping element
create neutral /mappings/{compNoIndex}
//- add field for indices
addfield /mappings/{compNoIndex} indexCount \
-description "Number of elements - 1"
//- add field for number of synapses
addfield /mappings/{compNoIndex} synapseCount \
-description "Number of synapses"
//- add field for synapse begin
addfield /mappings/{compNoIndex} synapseBegin \
-description "Synapse begin index"
//- add field for synapse end
addfield /mappings/{compNoIndex} synapseEnd \
-description "Synapse end index"
//- clear the field
setfield /mappings/{compNoIndex} \
synapseCount 0
end
//- set index field
setfield /mappings/{compNoIndex} \
indexCount {index}
end
end
//- loop over all mappings with less than 30 indices
foreach comp ( {el /mappings/#[][indexCount<30]} )
//- delete the mapping element
delete {comp}
end
//- loop over all created mapping elements
str mapping
foreach mapping ( {el /mappings/#[]} )
//- get tail of mapping
str mappingTail = {getpath {mapping} -tail}
//echo Source elements : {path}/{mappingTail}
//- initialize synapse begin and end index
// because the Genesis reference manual does not document the
// ranges for the different numerical types (int, float),
// I use here 32767 as it is certainly big enough
int synapseBegin = 32767
int synapseEnd = -1
//- loop over the source array for this mapping
str source
foreach source ( {el {path}/{mappingTail}[]} )
//- get the spine that gives messages to the element
str spine = {getmsg {source} -outgoing -destination 7}
//- get tail of spine
str spineTail = {getpath {spine} -tail}
//echo spine tail : {spineTail}
//- if we are handling a spine
if ( {strncmp {spineTail} "spine" 5} == 0 )
//- create a neutral compartment for the spine
create neutral \
/mappings/{mappingTail}/{spineTail}
//echo {source} -> {spineTail}
//- if this is the first spine
if (spineTail == "spine")
//- add index [0]
spineTail = "spine[0]"
end
//- get index of synapse
int synapseIndex \
= {substring \
{spineTail} \
6 \
{{strlen {spineTail}} - 1}}
//- if the synapse index is the lowest so far
if (synapseIndex < synapseBegin)
//- remember the synapse begin
synapseBegin = {synapseIndex}
end
//- if the synapse index is the highest so far
if (synapseIndex > synapseEnd)
//- remember synapse end
synapseEnd = {synapseIndex}
end
end
end
//- set field for number of synapses and synaptic range
setfield {mapping} \
synapseCount {NumberOfElements {mapping}/} \
synapseBegin {synapseBegin} \
synapseEnd {synapseEnd}
end
//- go to previous current element
pope
end
///
/// SH: MappingDelete
///
/// PA: path..: path with spines
///
/// DE: Delete mappings created by MappingCreate
///
function MappingDelete
//- delete mappings element
delete /mappings
end
end