-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathfacil_NMDA.mod
More file actions
140 lines (123 loc) · 4.24 KB
/
facil_NMDA.mod
File metadata and controls
140 lines (123 loc) · 4.24 KB
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
TITLE Shared synaptic conductance with per-stream saturation and use-dependent facilitation
COMMENT
Milstein, 2018
Rise and decay kinetics, and parameters controlling use-dependent facilitation are shared across all presynaptic
sources. Conductances are linearly summed across sources, and updated at every time step. Each source stores an
independent weight multiplier, unitary peak conductance (g_unit), and memory of its contribution to the total shared
conductance. Each source also stores a memory of its current state of use-dependent facilitation. These per-stream
parameters need only be updated when a spike arrives from that source. This allows each stream to independently
saturate and/or facilitate its conductance during repetitive activation.
Implementation informed by:
The NEURON Book: Chapter 10, N.T. Carnevale and M.L. Hines, 2004
ENDCOMMENT
NEURON {
POINT_PROCESS FacilNMDA
RANGE g, i, dur_onset, tau_offset, e, sat, g_inf, vshift
RANGE f_inc, f_max, f_tau
RANGE B, mg, gamma, Kd
NONSPECIFIC_CURRENT i
}
UNITS {
(nA) = (nanoamp)
(mV) = (millivolt)
(umho) = (micromho)
(mM) = (milli/liter)
}
PARAMETER {
sat = 0.9 : target saturation at peak of single event
dur_onset = 10. (ms) : time to peak of single event, determines tau_onset
tau_offset = 35. (ms) : time constant of exponential decay
e = 0. (mV) : reversal potential
f_inc = 0.15 : each spike increments a facilitation multiplier
f_max = 0.6 : maximal facilitation
f_tau = 25. (ms) : time constant of recovery from facilitation
Kd = 9.98 (mM) : modulate Mg concentration dependence
gamma = 0.101 (/mV) : modulate slope of Mg sensitivity
mg = 1.0 (mM) : extracellular Mg concentration
vshift = 0. (mV) : modulate vhalf of activation
}
ASSIGNED {
v (mV) : postsynaptic voltage
i (nA) : current = g*(v - Erev)
g (umho) : conductance
g_inf : steady-state fraction active channels
tau_onset (ms) : time constant of exponential rise
alpha (/ms) : kinetic rate of rise
beta (/ms) : kinetic rate of decay
syn_onset (umho) : total weight of synapses in onset phase
B : fraction of channels not blocked by extracellular Mg
}
STATE {
g_onset (umho) : conductance of synapses in onset phase
g_offset (umho) : conductance of synapses in offset phase
}
INITIAL {
beta = 1. / tau_offset
tau_onset = -dur_onset / log(1. - sat)
alpha = 1. / tau_onset - beta
g_inf = alpha / (alpha + beta)
syn_onset = 0.
mgblock(v, vshift)
}
BREAKPOINT {
mgblock(v, vshift)
SOLVE release METHOD cnexp
g = B * (g_onset + g_offset) / sat / g_inf
i = g * (v - e)
}
DERIVATIVE release {
g_onset' = (syn_onset * g_inf - g_onset) / tau_onset
g_offset' = -g_offset / tau_offset
}
PROCEDURE mgblock(v(mV), vshift(mV)) {
: from Jahr & Stevens
B = 1. / (1. + exp(gamma * (-(v - vshift))) * (mg / Kd))
}
: following supports both saturation from single input and
: summation from multiple inputs
: if spike occurs during onset_dur then new peak time is t + onset_dur
: onset phase concatenates but does not summate
NET_RECEIVE(weight, g_unit (umho), onset, count, g0, f0, f1, t0 (ms)) {
INITIAL {
onset = 0
count = 0
g0 = 0.
t0 = 0.
f0 = 0.
f1 = 0.
}
: flag is an implicit argument of NET_RECEIVE and normally 0
if (flag == 0) { : a spike, begin onset phase if not already in onset phase
f1 = f1*exp(-(t - t0)/f_tau)
count = count + 1
if (!onset) {
g0 = g0*exp(-(t - t0)/tau_offset)
t0 = t
onset = 1
syn_onset = syn_onset + (1. + f1 - f0) * weight * g_unit
g_onset = g_onset + g0 * weight * g_unit
g_offset = g_offset - g0 * weight * g_unit
} else {
syn_onset = syn_onset + (f1 - f0) * weight * g_unit
}
f0 = f1
f1 = f1 + f_inc
if (f1 > f_max) {
f1 = f_max
}
: come again in dur_onset with flag = current count
net_send(dur_onset, count)
}
else {
if (flag == count) { : if the offset signal is associated with the most recent spike then begin offset phase
g0 = g_inf - (g_inf - g0) * exp(-(t - t0)/tau_onset)
f1 = f1*exp(-(t - t0)/f_tau)
t0 = t
syn_onset = syn_onset - (1. + f0) * weight * g_unit
f0 = 0.
g_onset = g_onset - g0 * weight * g_unit
g_offset = g_offset + g0 * weight * g_unit
onset = 0
}
}
}