forked from nest/nestml
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtraub_psc_alpha.nestml
116 lines (91 loc) · 4.2 KB
/
traub_psc_alpha.nestml
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
"""
Name: traub_psc_alpha - Traub model according to Borgers 2017.
Reduced Traub-Miles Model of a Pyramidal Neuron in Rat Hippocampus[1].
parameters got from reference [2].
(1) Post-synaptic currents
Incoming spike events induce a post-synaptic change of current modelled
by an alpha function.
(2) Spike Detection
Spike detection is done by a combined threshold-and-local-maximum search: if
there is a local maximum above a certain threshold of the membrane potential,
it is considered a spike.
References:
[1] R. D. Traub and R. Miles, Neuronal Networks of the Hippocampus,Cam- bridge University Press, Cambridge, UK, 1991.
[2] Borgers, C., 2017. An introduction to modeling neuronal dynamics (Vol. 66). Cham: Springer.
SeeAlso: hh_cond_exp_traub
"""
neuron traub_psc_alpha:
state:
r integer # number of steps in the current refractory phase
end
initial_values:
V_m mV = -70. mV # Membrane potential
Act_m real = alpha_m_init / ( alpha_m_init + beta_m_init ) # Activation variable m for Na
Inact_h real = alpha_h_init / ( alpha_h_init + beta_h_init ) # Inactivation variable h for Na
Act_n real = alpha_n_init / ( alpha_n_init + beta_n_init ) # Activation variable n for K
end
equations:
# synapses: alpha functions
kernel I_syn_in = (e/tau_syn_in) * t * exp(-t/tau_syn_in)
kernel I_syn_ex = (e/tau_syn_ex) * t * exp(-t/tau_syn_ex)
inline I_syn_exc pA = convolve(I_syn_ex, spikeExc)
inline I_syn_inh pA = convolve(I_syn_in, spikeInh)
inline I_Na pA = g_Na * Act_m * Act_m * Act_m * Inact_h * ( V_m - E_Na )
inline I_K pA = g_K * Act_n * Act_n * Act_n * Act_n * ( V_m - E_K )
inline I_L pA = g_L * ( V_m - E_L )
V_m' = ( -( I_Na + I_K + I_L ) + I_e + I_stim + I_syn_inh + I_syn_exc ) / C_m
# Act_n
inline alpha_n real = 0.032 * (V_m / mV + 52.) / (1. - exp(-(V_m / mV + 52.) / 5.))
inline beta_n real = 0.5 * exp(-(V_m / mV + 57.) / 40.)
Act_n' = ( alpha_n * ( 1 - Act_n ) - beta_n * Act_n ) / ms # n-variable
# Act_m
inline alpha_m real = 0.32 * (V_m / mV + 54.) / (1.0 - exp(-(V_m / mV + 54.) / 4.))
inline beta_m real = 0.28 * (V_m / mV + 27.) / (exp((V_m / mV + 27.) / 5.) - 1.)
Act_m' = ( alpha_m * ( 1 - Act_m ) - beta_m * Act_m ) / ms # m-variable
# Inact_h'
inline alpha_h real = 0.128 * exp(-(V_m / mV + 50.0) / 18.0)
inline beta_h real = 4.0 / (1.0 + exp(-(V_m / mV + 27.) / 5.))
Inact_h' = ( alpha_h * ( 1 - Inact_h ) - beta_h * Inact_h ) / ms # h-variable
end
parameters:
t_ref ms = 2.0 ms # Refractory period 2.0
g_Na nS = 10000.0 nS # Sodium peak conductance
g_K nS = 8000.0 nS # Potassium peak conductance
g_L nS = 10 nS # Leak conductance
C_m pF = 100.0 pF # Membrane Capacitance
E_Na mV = 50. mV # Sodium reversal potential
E_K mV = -100. mV # Potassium reversal potentia
E_L mV = -67. mV # Leak reversal Potential (aka resting potential)
V_Tr mV = -20. mV # Spike Threshold
tau_syn_ex ms = 0.2 ms # Rise time of the excitatory synaptic alpha function
tau_syn_in ms = 2. ms # Rise time of the inhibitory synaptic alpha function
# constant external input current
I_e pA = 0 pA
end
internals:
RefractoryCounts integer = steps(t_ref) # refractory time in steps
alpha_n_init real = 0.032 * (V_m / mV + 52.) / (1. - exp(-(V_m / mV + 52.) / 5.))
beta_n_init real = 0.5 * exp(-(V_m / mV + 57.) / 40.)
alpha_m_init real = 0.32 * (V_m / mV + 54.) / (1.0 - exp(-(V_m / mV + 54.) / 4.))
beta_m_init real = 0.28 * (V_m / mV + 27.) / (exp((V_m / mV + 27.) / 5.) - 1.)
alpha_h_init real = 0.128 * exp(-(V_m / mV + 50.0) / 18.0)
beta_h_init real = 4.0 / (1.0 + exp(-(V_m / mV + 27.) / 5.))
end
input:
spikeInh pA <- inhibitory spike
spikeExc pA <- excitatory spike
I_stim pA <- current
end
output: spike
update:
U_old mV = V_m
integrate_odes()
# sending spikes: crossing 0 mV, pseudo-refractoriness and local maximum...
if r > 0: # is refractory?
r -= 1
elif V_m > V_Tr and U_old > V_Tr: # threshold && maximum
r = RefractoryCounts
emit_spike()
end
end
end