"""
Name: hhca_psc_alpha - Hodgkin Huxley neuron model.
Description:
hhca_psc_alpha is an implementation of a spiking neuron using the Hodkin-Huxley
formalism.
(1) Post-syaptic currents
Incoming spike events induce a post-synaptic change of current modelled
by an alpha function. The alpha function is normalised such that an event of
weight 1.0 results in a peak current of 1 pA.
(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.
Problems/Todo:
better spike detection
initial wavelet/spike at simulation onset
References:
Spiking Neuron Models:
Single Neurons, Populations, Plasticity
Wulfram Gerstner, Werner Kistler, Cambridge University Press
Theoretical Neuroscience:
Computational and Mathematical Modeling of Neural Systems
Peter Dayan, L. F. Abbott, MIT Press (parameters taken from here)
Hodgkin, A. L. and Huxley, A. F.,
A Quantitative Description of Membrane Current
and Its Application to Conduction and Excitation in Nerve,
Journal of Physiology, 117, 500-544 (1952)
Sends: SpikeEvent
Receives: SpikeEvent, CurrentEvent, DataLoggingRequest
Authors: Tanguy Fardet
SeeAlso: hh_psc_alpha
"""
neuron hhca_psc_alpha:
state:
r integer = 0 # number of steps in the current refractory phase
V_m mV = -65. mV # Membrane potential
Ca_i mmol/L = Ca_i_eq
inline alpha_n_init real = ( 0.01 * ( V_m / mV + 55. ) ) / ( 1. - exp( -( V_m / mV + 55. ) / 10. ) )
inline beta_n_init real = 0.125 * exp( -( V_m / mV + 65. ) / 80. )
inline alpha_m_init real = ( 0.1 * ( V_m / mV + 40. ) ) / ( 1. - exp( -( V_m / mV + 40. ) / 10. ) )
inline beta_m_init real = 4. * exp( -( V_m / mV + 65. ) / 18. )
inline alpha_h_init real = 0.07 * exp( -( V_m / mV + 65. ) / 20. )
inline beta_h_init real = 1. / ( 1. + exp( -( V_m / mV + 35. ) / 10. ) )
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
h_Ca real = y_shape(V_m, V_hhCa, -k_hCa)
m_Ca real = y_shape(V_m, V_hmCa, k_mCa)
m_AHP real = 0.
end
function y_shape(V_m mV, Vh mV, k_y mV) real:
arg_exp real = min(-(V_m-Vh)/k_y, 50.)
res real = clip(1./(1. + exp(arg_exp)), 0., 1.)
return res
end
parameters:
t_ref ms = 2.0 ms # Refractory period
g_Na nS = 12000.0 nS # Sodium peak conductance
g_K nS = 3600.0 nS # Potassium peak conductance
g_L nS = 30 nS # Leak conductance
C_m pF = 100.0 pF # Membrane Capacitance
E_Na mV = 50 mV # Sodium reversal potential
E_K mV = -77. mV # Potassium reversal potential
E_L mV = -54.402 mV # Leak reversal Potential (aka resting potential)
tau_syn_ex ms = 0.2 ms # Rise time of the excitatory synaptic alpha function i
tau_syn_in ms = 2.0 ms # Rise time of the inhibitory synaptic alpha function
g_Ca nS = 0.001 nS
Ca_env mmol/L = 1. mmol/L
Ca_i_eq mmol/L = 5e-5 mmol/L
tau_Ca ms = 500. ms
V_hmCa mV = -27.5 mV
k_mCa mV = 5.7 mV
tau_mCa ms = 0.5 ms
V_hhCa mV = -52.4 mV
k_hCa mV = 5.2 mV
tau_hCa ms = 18. ms
g_AHP nS = 0.2 nS
K_AHP mmol/L = 2e-3 mmol/L
b_AHP real = 2.5
tau_AHP ms = 30. ms
E_0 mV = 26.64 mV
Vcell um**3 = 4/3.*3.14159*(5*um)**3
# constant external input current
I_e pA = 0 pA
end
internals:
RefractoryCounts integer = steps(t_ref) # refractory time in steps
charge C = 1.6e-19 C
avogadro 1/mol = 6.02e23/mol
c2c mmol/L/fC = 1./(charge*avogadro*Vcell) # convert charge flux to concentration roughly 1e-2 mmol/L/fC
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 m_infAHP real = (Ca_i/K_AHP)**2/((Ca_i/K_AHP)**2 + b_AHP)
inline m_infCa real = y_shape(V_m, V_hmCa, k_mCa)
inline h_infCa real = y_shape(V_m, V_hhCa, -k_hCa)
inline E_Ca mV = 2*E_0*ln(Ca_env/Ca_i)
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 + g_AHP*m_AHP**2 ) * ( V_m - E_K )
inline I_Ca pA = -g_Ca*m_Ca*h_Ca*(V_m - E_Ca)
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
Ca_i' = c2c*I_Ca - (Ca_i - Ca_i_eq) / tau_Ca
# Act_n
inline alpha_n real = ( 0.01 * ( V_m / mV + 55. ) ) / ( 1. - exp( -( V_m / mV + 55. ) / 10. ) )
inline beta_n real = 0.125 * exp( -( V_m / mV + 65. ) / 80. )
Act_n' = ( alpha_n * ( 1 - Act_n ) - beta_n * Act_n ) / ms # n-variable
# Act_m
inline alpha_m real = ( 0.1 * ( V_m / mV + 40. ) ) / ( 1. - exp( -( V_m / mV + 40. ) / 10. ) )
inline beta_m real = 4. * exp( -( V_m / mV + 65. ) / 18. )
Act_m' = ( alpha_m * ( 1 - Act_m ) - beta_m * Act_m ) / ms # m-variable
# Inact_h'
inline alpha_h real = 0.07 * exp( -( V_m / mV + 65. ) / 20. )
inline beta_h real = 1. / ( 1. + exp( -( V_m / mV + 35. ) / 10. ) )
Inact_h' = ( alpha_h * ( 1 - Inact_h ) - beta_h * Inact_h ) / ms # h-variable
h_Ca' = (h_infCa - h_Ca) / tau_hCa
m_Ca' = (m_infCa - m_Ca) / tau_mCa
m_AHP' = (m_infAHP - m_AHP) / tau_AHP
end
input:
spikeInh pA <- inhibitory spike
spikeExc pA <- excitatory spike
I_stim pA <- continuous
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 > 0 mV and U_old > V_m: # threshold && maximum
r = RefractoryCounts
emit_spike()
end
end
end