-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathpregen.mod
148 lines (118 loc) · 2.78 KB
/
pregen.mod
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
: $Id: pregen.mod,v 1.12 1995/05/30 01:01:14 billl Exp $
: comments at end
INDEPENDENT {t FROM 0 TO 1 WITH 1 (ms)}
NEURON {
POINT_PROCESS gen
GLOBAL seed
RANGE x, spk, lastspk
RANGE fast_invl, slow_invl, burst_len, start, end
RANGE noise
}
PARAMETER {
fast_invl = 1 : time between spikes in a burst (msec)
slow_invl = 50 : burst period (msec)
burst_len = 10 : burst length (# spikes)
start = 50 : location for first burst
end = 1e10 : time to stop bursting
noise = 0 : amount of randomness (0.0 - 1.0)
seed = 53892 : seed for random num generator
}
ASSIGNED {
scntr
lcntr
bcntr
burst
x
spk
lastspk
dt
}
INCLUDE "presyn.inc"
INITIAL {
burst = 0
scntr = fast_invl
bcntr = burst_len
if (noise != 0) {
set_seed(seed)
scntr = noise * fpoisrand(fast_invl) + (1 - noise) * fast_invl
bcntr = noise * fpoisrand(burst_len) + (1 - noise) * burst_len
}
lcntr = start - fast_invl
x = -90
spk = -90
}
BREAKPOINT {
SOLVE generate
}
PROCEDURE generate() {
if (t < end) {
: leave x up for 1 msec spike duration
if (t > lastspk+1) { spk = -90 }
x = -90
scntr = scntr - dt
lcntr = lcntr - dt
if (burst) {
: in a burst
if (scntr <= dt) {
: a spike
if (bcntr <= 1) {
: last spike in burst ?
burst = 0
if (noise==0) {
lcntr = slow_invl
} else {
lcntr = noise * fpoisrand(slow_invl) + (1 - noise) * slow_invl
}
}
x = 50
spk = 50
lastspk = t
newspike()
bcntr = bcntr - 1
if (noise==0) {
scntr = fast_invl
} else {
scntr = noise * fpoisrand(fast_invl) + (1 - noise) * fast_invl
}
}
} else {
: between bursts
if (lcntr <= dt) {
if (noise==0) {
bcntr = burst_len
} else {
bcntr = noise * fpoisrand(burst_len) + (1 - noise) * burst_len
}
burst = 1
}
}
VERBATIM
return 0;
ENDVERBATIM
}
}
FUNCTION fgauss(x,mean,std_dev) {
fgauss = gauss(x,mean,std_dev)
}
FUNCTION fpoisrand(mean) {
if (mean > 700) {
fpoisrand = 4. * poisrand(mean/4.)
} else {
fpoisrand = poisrand(mean)
}
}
COMMENT
Presynaptic spike generator
---------------------------
This mechanism has been written to be able to use synapses in a single
neuron receiving various types of presynaptic trains. This is a "fake"
presynaptic compartment containing a fast spike generator. The trains
of spikes can be either periodic or noisy (Poisson-distributed), and
either tonic or bursting.
Parameters;
noise: between 0 (no noise-periodic) and 1 (fully noisy)
fast_invl: fast interval, mean time between spikes (ms)
slow_invl: slow interval, mean burst silent period (ms), 0=tonic train
burst_len: mean burst length (nb. spikes)
Written by Z. Mainen, modified by A. Destexhe, The Salk Institute
ENDCOMMENT