-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathSingleExp.mod
177 lines (110 loc) · 2.53 KB
/
SingleExp.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
148
149
150
151
152
NEURON {
SUFFIX SynExp
USEION nmda READ enmda WRITE inmda VALENCE 2.0
RANGE onset, tau, gmax,B,enmda,inmdaC, r, r0, r1, lastrelease,TimeCount,rinf,rtau,gnmda
GLOBAL Cmax, Cdur,alpha,beta,T, Deadtime
:RANGE alpha,beta,T
:NONSPECIFIC_CURRENT i
}
INDEPENDENT {t FROM 0 TO 100 WITH 1 (ms)}
UNITS {
(pA) = (picoamp)
(mV) = (millivolt)
(nS) = (nanosiemens)
(mM) = (milli/liter)
}
PARAMETER {
dt (ms)
Deadtime = 1 (ms) : mimimum time between release events
Cmax = 1 (mM) : max transmitter concentration
Cdur = 1 (ms) : transmitter duration (rising phase)
gmax=1.1
enmda = 0 (mV) : reversal potential
mg = 1 (mM) : external magnesium concentration
onset=100 (ms)
:delay =500 (ms)
alpha=0.072 <0,1e4>
beta=0.0066
T=1
tau=90
}
ASSIGNED {
v (mV)
B : magnesium block
:ica (nA)
gnmda
inmda
rinf
rtau
C (mM) : transmitter concentration
r : fraction of open channels
r0 : open channels at start of release
r1 : open channels at end of release
lastrelease (ms) : time of last spike
TimeCount (ms) : time counter
}
BREAKPOINT {
SOLVE release
B = mgblock(v) : B is the block by magnesium at this voltage
if (gmax) { at_time(onset) }
gnmda = gmax * alp( (t - onset)/tau )
inmda = gnmda*B*(v - enmda)* r
: inmda=ica
}
FUNCTION alp(x) {
if (x < 0 || x > 10) {
alp = 0
}else{
alp = exp(1 - x)
}
}
FUNCTION mgblock(v(mV)) {
TABLE
DEPEND mg
FROM -140 TO 80 WITH 1000
mgblock = 1 / (1 + exp(0.062 (/mV) * -v) * (mg / 3.57 (mM)))
}
INITIAL {
r = 0
C = 0
rinf = Cmax*alpha / (Cmax*alpha + beta)
rtau = 1 / ((alpha * Cmax) + beta)
lastrelease = -1000
r1=0
TimeCount=-1
}
PROCEDURE release() {
:will crash if user hasn't set pre with the connect statement
TimeCount=TimeCount-dt : time since last release ended
: ready for another release?
if (TimeCount < -Deadtime) {
C = Cmax
r0 = r
lastrelease = t
TimeCount=Cdur
}
else if (C == Cmax) {
r1 = r
C = 0.
}
if (C > 0) { : transmitter being released?
r = rinf + (r0 - rinf) * exptable (- (t - lastrelease) / rtau)
} else { : no release occuring
r = r1 * exptable (- beta * (t - (lastrelease + Cdur)))
}
}
FUNCTION exptable(x) {
TABLE FROM -10 TO 10 WITH 2000
if ((x > -10) && (x < 10)) {
exptable = exp(x)
} else {
exptable = 0.
}
}
FUNCTION duale(x,y) {
if (x < 0 || y < 0) {
duale = 0
}else{
duale = exp(-x) - exp(-y)
}
}