TITLE HH style channels for spiking retinal ganglion cells
:
: Modified from Fohlmeister et al, 1990, Brain Res 510, 343-345
: by TJ Velte March 17, 1995
: must be used with calcium pump mechanism, i.e. capump.mod
:
:

INDEPENDENT {t FROM 0 TO 1 WITH 1 (ms)}

NEURON {
    SUFFIX spike
    USEION na READ ena WRITE ina
    USEION k READ ek WRITE ik
    USEION ca READ cai, eca, cao WRITE ica
    RANGE gnabar, gkbar, gabar, gcabar, gkcbar
    RANGE m_inf, h_inf, n_inf, p_inf, q_inf, c_inf
    RANGE tau_m, tau_h, tau_n, tau_p, tau_q, tau_c
    RANGE m_exp, h_exp, n_exp, p_exp, q_exp, c_exp
    RANGE idrk, iak, icak
}


UNITS {
    (molar) = (1/liter)
    (mM) = (millimolar)
    (mA) = (milliamp)
    (mV) = (millivolt)

}

PARAMETER {
    gnabar  = 0.04    (mho/cm2)
    gkbar   = 0.012   (mho/cm2)
    gabar   = 0.036   (mho/cm2)
    gcabar  = 0.002   (mho/cm2)
    gkcbar  = 0.00005 (mho/cm2)
    ena     = 35  (mV)
    ek      = -75 (mV)
    eca           (mV)
    cao     = 1.8 (mM)
    cai     = 0.0001 (mM)
    dt            (ms)
    v             (mV)
}

STATE {
    m h n p q c 
}

INITIAL {
: The initial values were determined at a resting value of -66.3232 mV in a 
: single-compartment
:    m = 0.0155
:    h = 0.9399
:    n = 0.0768
:    p = 0.0398
:    q = 0.4526
:    c = 0.0016
: at -60 mV
    m = 0.0345
    h = 0.8594
    n = 0.1213
    p = 0.0862
    q = 0.2534
    c = 0.0038
}

ASSIGNED {
    ina    (mA/cm2)
    ik     (mA/cm2)
    idrk   (mA/cm2)
    iak    (mA/cm2)
    icak   (mA/cm2)
    ica    (mA/cm2)
    m_inf h_inf n_inf p_inf q_inf c_inf
    tau_m tau_h tau_n tau_p tau_q tau_c
    m_exp h_exp n_exp p_exp q_exp c_exp
}

BREAKPOINT {
    SOLVE states
    ina = gnabar * m*m*m*h * (v - ena)
    idrk = gkbar * n*n*n*n * (v - ek)
    iak =  gabar * p*p*p*q * (v - ek)
    icak = gkcbar * ((cai / 0.001)/ (1 + (cai / 0.001))) * (v - ek)
    ik = idrk + iak + icak
    ica = gcabar * c*c*c * (v - eca)
}

PROCEDURE states() {    : exact when v held constant
    evaluate_fct(v)
    m = m + m_exp * (m_inf - m)
    h = h + h_exp * (h_inf - h)
    n = n + n_exp * (n_inf - n)
    p = p + p_exp * (p_inf - p)
    q = q + q_exp * (q_inf - q)
    c = c + c_exp * (c_inf - c)

    VERBATIM
    return 0;
    ENDVERBATIM
}

UNITSOFF

PROCEDURE evaluate_fct(v(mV)) { LOCAL a,b
    
:NA m
    a = (-0.6 * (v+30)) / ((exp(-0.1*(v+30))) - 1)
    b = 20 * (exp((-1*(v+55))/18))
    tau_m = 1 / (a + b)
    m_inf = a * tau_m

:NA h
    a = 0.4 * (exp((-1*(v+50))/20))
    b = 6 / ( 1 + exp(-0.1 *(v+20)))
    tau_h = 1 / (a + b)
    h_inf = a * tau_h

:K n (non-inactivating, delayed rectifier)
    a = (-0.02 * (v+40)) / ((exp(-0.1*(v+40))) - 1)
    b = 0.4 * (exp((-1*(v + 50))/80))
    tau_n = 1 / (a + b)
    n_inf = a * tau_n

:K (inactivating)
    a = (-0.006 * (v+90)) / ((exp(-0.1*(v+90))) - 1)
    b = 0.1 * (exp((-1*(v + 30))/10))
    tau_p = 1 / (a + b)
    p_inf = a * tau_p

    a = 0.04 * (exp((-1*(v+70))/20))
    b = 0.6 / ( 1 + exp(-0.1 *(v+40)))    
    tau_q = 1 / (a + b)
    q_inf = a * tau_q

:CA channel
    a = (-0.3 * (v+13)) / ((exp(-0.1*(v+13))) - 1)
    b = 10 * (exp((-1*(v + 38))/18))
    tau_c = 1 / (a + b)
    c_inf = a * tau_c

: State vars to inifinity
    m_exp = 1 - exp(-dt/tau_m)
    h_exp = 1 - exp(-dt/tau_h)
    n_exp = 1 - exp(-dt/tau_n)
    p_exp = 1 - exp(-dt/tau_p)
    q_exp = 1 - exp(-dt/tau_q)
    c_exp = 1 - exp(-dt/tau_c)
}

UNITSON