NEMO is a program that reads an on channel description in a format based on ChannelML and generates a corresponding description in the NMODLlanguage used by the NEURON simulator.
| -i FORMAT | specify input format (nemo, xml, sxml, s-exp) |
| --xml[=FILE] | write XML output to file (default: <model-name>.xml |
| --sxml[=FILE] | write SXML output to file (default: <model-name>.sxml |
| --nmodl[=FILE] | write NMODL output to file (default: <model-name>.mod |
| --nmodl-method=METHOD | specify NMODL integration method (cnexp, derivimplicit) |
| --nmodl-kinetic=[STATES] | use NMODL kinetic equations for the given reactions |
| --nmodl-depend=VARS | specify DEPEND variables for NMODL interpolation tables |
| -t | use interpolation tables in generated code |
| -h, --help | print help |
The following constructs comprise the model description language:
Declares one or several imported quantities. If the optional AS parameter is given, then the quantity is imported as {LOCAL-ID}. If the optional FROM parameter is given, then the quantity is imported from namespace {NAMESPACE}.
| ( OUTPUT {ID} )Declares that an existing quantity be exported.
| ( CONST {ID} = {EXPR} )Declares a constant quantity (its value will be computed at declaration time).
| ( DEFUN {ID} ( {ARG-ID} ... ) {EXPR} )Declares a function (a parameterized expression with no free variables).
| ( {ID} = {EXPR} )Declares an assigned quantity (an expression that can refer to other quantities in the system).
| ( REACTION {ID} {TRANSITIONS} {INITIAL-EXPR} {OPEN-ID} )Declares a reaction quantity. See below for the syntax of state transition equations. {INITIAL-EXPR} is an expression that computes the initial value. {OPEN-ID} is the name of the open state. It must be one of the states defined by the transition equations.
| ( COMPONENT ( TYPE {ID} ) ( NAME {ID} ) {ELEMENTS} )Declares a system component (a quantity that can contain other quantities).
Expressions in the model description language are defined as:
A numeric constant.
| {ID}A variable name.
| ( {ID} ( {EXPR} ... ) )A function invocation.
| ( {EXPR} {OP} {EXPR} )Arithmetic operator invocation. The following operators are supported: + - / * > < <= >= ^
| ( LET ( {BINDINGS} ) {EXPR} )Local variables declaration. Each element in {BINDINGS} is of the form: ( {ID} {EXPR} )
| ( IF {CONDITION} THEN {EXPR} ELSE {EXPR} )Conditional expression. The expression after IF must be a comparison expression.
State transition equations in the model description language are defined as:
Declares that a transition occurs from state {SRC-ID} to state {DEST-ID} at rate computed by {EXPR}.
| ( <-> {SRC-ID} {DEST-ID} {EXPR-1} {EXPR-2} )Declares that a transition occurs from state {SRC-ID} to state {DEST-ID} and vice versa, at rates computed by {EXPR-1} and {EXPR-2}.
Currently, the NMODL code generator recognizes and generates code for ion channel components that are defined as follows:
(
One or more gate definitions. Each component of type gate must export the reactions that characterize the gate dynamics.
( COMPONENT ( TYPE pore ) ... )Conductance law definition. This component must export a constant maximal conductance, or an assigned quantity whose equation represents the conductance law used.
[( COMPONENT ( TYPE permeating-substance ) ... )] [( COMPONENT ( TYPE accumulating-substance ) ... )]The Hodgkin-Huxley ionic conductance extension is a shortcut that declares a reaction corresponding to the Hodgkin-Huxley formulation of ion channel dynamics.
(
Ion name: exported variables will be of the form {ion}_{id}.
( M-POWER {INTEGER} )Power of state variable M.
( H-POWER {INTEGER} )Power of state variable H. If zero, the initial value and equations for this variable can be omitted.
( INITIAL-M {EXPR} )Expression that computes initial value for state variable M.
( INITIAL-H {EXPR} )Expression that computes initial value for state variable H.
( M-ALPHA {EXPR} )Closed state to open state rate expression for state variable M.
( M-BETA {EXPR} )Open state to closed state rate expression for state variable M.
( H-ALPHA {EXPR} )Closed state to open state rate expression for state variable H.
( H-BETA {EXPR} )Open state to closed state rate expression for state variable H.
( M-INF {EXPR} )Steady state expression for variable M.
( M-TAU {EXPR} )Time constant expression for variable M.
( H-INF {EXPR} )Steady state expression for variable H.
( H-TAU {EXPR} )Time constant expression for variable H.
)
;; Akemann and Knoepfel, J.Neurosci. 26 (2006) 4602
(nemo-model AKP06
((input v
(cai from ion-pools)
(ica from ion-currents))
(const Vrest = -68)
(const diam = 20)
(const celsius = 24)
(const temp_adj = (pow (3 ((celsius - 22) / 10))))
(defun ghk (v celsius ci co)
(let ((F 96485.0) (R 8.3145))
(let ((zeta ((2e-3 * F * v) / (R * (273.19 + celsius)))))
(if ((abs (1.0 - exp (neg (zeta)))) < 1e-6)
then (1e-6 * (2 * F) * (ci - (co * exp (neg (zeta)))) * (1.0 + (zeta / 2)))
else ((1e-6 * (2 * zeta * F) * (ci - (co * exp (neg (zeta))))) / (1.0 - exp (neg (zeta))))))))
(component (type membrane-capacitance)
(const C_m = 1)
(output C_m))
(component (type ion-channel) (name Kv1)
(component (type gate)
;; rate functions
(defun Kv1_amf (v)
(let ((cma 0.12889)
(cka -33.90877)
(cva 45))
(cma * (exp (neg ((v + cva) / cka))))))
(defun Kv1_bmf (v)
(let ((cmb 0.12889)
(ckb 12.42101)
(cvb 45))
(cmb * (exp (neg ((v + cvb) / ckb))))))
(hh-ionic-gate
(Kv1 ;; ion name: exported variables will be of the form {ion}_{id}
(initial-m (Kv1_amf (Vrest) / (Kv1_amf (Vrest) + Kv1_bmf (Vrest))))
(m-power 4)
(h-power 0)
(m-alpha (temp_adj * Kv1_amf (v) ))
(m-beta (temp_adj * Kv1_bmf (v) ))))
)
(component (type pore)
(const gbar_Kv1 = 0.011)
(output gbar_Kv1 ))
(component (type permeating-substance) (name k)
(const e_Kv1 = -85)
(output e_Kv1 ))
) ;; end Kv1 current
(component (type ion-channel) (name Kv3)
(component (type gate)
;; rate functions
(defun Kv3_amf (v)
(let ((ca 0.22)
(cva 16)
(cka -26.5))
(ca * exp((neg (v + cva)) / cka) )))
(defun Kv3_bmf (v)
(let ((ca 0.22)
(cvb 16)
(ckb 26.5))
(ca * exp((neg (v + cvb)) / ckb) )))
(hh-ionic-gate
(Kv3 ;; ion name: exported variables will be of the form {ion}_{id}
(initial-m (Kv3_amf (Vrest) / (Kv3_amf (Vrest) + Kv3_bmf (Vrest))))
(m-power 4)
(h-power 0)
(m-alpha (temp_adj * Kv3_amf (v) ))
(m-beta (temp_adj * Kv3_bmf (v) ))))
)
(component (type pore)
(const gbar_Kv3 = 0.005)
(output gbar_Kv3 ))
(component (type permeating-substance) (name k)
(const e_Kv3 = -85)
(output e_Kv3 ))
(component (type binary-gate)
(const switch_Kv3 = 0)
(const e0 = 1.60217646e-19)
(const gunit = 16)
(const nc = (1e12 * gbar_Kv3 / gunit))
(const zn = 1.9196)
(defun gate_flip_Kv3 (v m)
(let ((a (Kv3_amf (v)))
(ab (a + Kv3_bmf (v)))
(tau (1 / ab))
(inf (a / ab)))
((inf - m) / tau)))
(i_gate_Kv3 =
(if (switch_Kv3 > 0) then (nc * 1e6 * e0 * 4 * zn * gate_flip_Kv3(v Kv3_m)) else 0))
(output i_gate_Kv3 ))
) ;; end Kv3 current
(component (type ion-channel) (name Kv4)
(component (type gate)
;; rate functions
(defun Kv4_amf (v)
(let ((can 0.15743)
(ckan -32.19976)
(cvan 57))
(can * exp (neg ((v + cvan) / ckan)))))
(defun Kv4_bmf (v)
(let ((cbn 0.15743)
(ckbn 37.51346)
(cvbn 57))
(cbn * exp (neg ((v + cvbn) / ckbn)))))
(defun Kv4_ahf (v)
(let ((cah 0.01342)
(ckah -7.86476)
(cvah 60))
(cah / (1.0 + (exp (neg ((v + cvah) / ckah)))))))
(defun Kv4_bhf (v)
(let ((cbh 0.04477)
(ckbh 11.3615)
(cvbh 54))
(cbh / (1.0 + (exp (neg ((v + cvbh) / ckbh)))))))
(hh-ionic-gate
(Kv4 ;; ion name: exported variables will be of the form {ion}_{id}
(initial-m (Kv4_amf (Vrest) / (Kv4_amf (Vrest) + Kv4_bmf (Vrest))) )
(initial-h (Kv4_ahf (Vrest) / (Kv4_ahf (Vrest) + Kv4_bhf (Vrest))) )
(m-power 4)
(h-power 1)
(m-alpha (temp_adj * Kv4_amf (v)))
(m-beta (temp_adj * Kv4_bmf (v)))
(h-alpha (temp_adj * Kv4_ahf (v)))
(h-beta (temp_adj * Kv4_bhf (v)))
))
)
(component (type pore)
(const gbar_Kv4 = 0.0039)
(output gbar_Kv4 ))
(component (type permeating-substance) (name k)
(const e_Kv4 = -85)
(output e_Kv4 ))
) ;; end Kv4 current
(component (type ion-channel) (name Ih)
(component (type gate)
;; rate functions
(defun Ih_inf (v)
(let ((cvn 90.1)
(ckn -9.9))
(1.0 / (1.0 + exp (neg ((v + cvn) / ckn) )))))
(defun Ih_tau (v)
(let ((cct 190)
(cat 720)
(cvt 81.5)
(ckt 11.9))
(cct + (cat * exp (neg (pow (((v + cvt) / ckt) 2)))))))
(hh-ionic-gate
(Ih ;; ion name: exported variables will be of the form {ion}_{id}
(initial-m (Ih_inf (Vrest)))
(m-power 1)
(h-power 0)
(m-inf (Ih_inf (v)))
(m-tau (Ih_tau (v) / temp_adj))
))
)
(component (type pore)
(const gbar_Ih = 0.0002)
(output gbar_Ih ))
(component (type permeating-substance) (name non-specific)
(const e_Ih = -30)
(output e_Ih ))
) ;; end Ih current
(component (type ion-channel) (name Leak)
(component (type pore)
(const gbar_Leak = 9e-5)
(output gbar_Leak ))
(component (type permeating-substance) (name non-specific)
(const e_Leak = -61)
(output e_Leak ))
) ;; end leak current
(component (type ion-channel) (name CaP)
(component (type gate)
;; rate functions
(defun CaP_inf (v)
(let ((cv 19) (ck 5.5))
(1.0 / (1.0 + exp (neg ((v + cv) / ck))))))
(defun CaP_tau (v)
(if (v > -50)
then (1e3 * (0.000191 + (0.00376 * pow ((exp (neg ((v + 41.9) / 27.8))) 2))))
else (1e3 * (0.00026367 + (0.1278 * exp (0.10327 * v))))))
(hh-ionic-gate
(CaP ;; ion name: exported variables will be of the form {ion}_{id}
(initial-m (CaP_inf (Vrest)))
(m-power 1)
(h-power 0)
(m-inf (CaP_inf (v)))
(m-tau (CaP_tau (v) / temp_adj))))
)
(component (type pore)
(const gmax_CaP = 0.01667)
(const cao = 2.4)
(gbar_CaP = (gmax_CaP * ghk (v celsius cai cao)))
(output gbar_CaP ))
(component (type accumulating-substance) (name ca) )
) ;; end CaP current
(component (type ion-channel) (name CaBK)
(component (type gate)
;; rate functions
(defun CaBK_zinf (ca)
(let ((zhalf 0.001))
(1 / (1 + (zhalf / ca)))))
(const CaBK_ztau = 1.0)
(defun CaBK_minf (v)
(let ((cvm 28.9)
(ckm 6.2))
(1.0 / (1.0 + exp (neg ((v + 5.0 + cvm) / ckm))))))
(defun CaBK_mtau (v)
(let ((ctm 0.000505)
(cvtm1 86.4)
(cktm1 -10.1)
(cvtm2 -33.3)
(cktm2 10))
(ctm + (1.0 / (exp (neg ((v + 5.0 + cvtm1) / cktm1)) +
exp (neg ((v + 5.0 + cvtm2) / cktm2)))))))
(defun CaBK_hinf (v)
(let ((ch 0.085)
(cvh 32)
(ckh -5.8))
(ch + ((1.0 - ch) / (1.0 + (exp (neg ((v + 5.0 + cvh) / ckh))))))))
(defun CaBK_htau (v)
(let ((cth 0.0019)
(cvth1 48.5)
(ckth1 -5.2)
(cvth2 -54.2)
(ckth2 12.9))
(cth + (1.0 / (exp (neg ((v + cvth1) / ckth1)) +
exp (neg ((v + cvth2) / ckth2)))))))
(reaction
(CaBK_z
(transitions (<-> C O (CaBK_zinf (cai) / CaBK_ztau)
((1 - CaBK_zinf (cai)) / CaBK_ztau)))
(initial (CaBK_zinf (1e-4)))
(open O) (power 2)))
(output CaBK_z )
(hh-ionic-gate
(CaBK ;; ion name: exported variables will be of the form {ion}_{id}
(initial-m (CaBK_minf (Vrest) / temp_adj))
(initial-h (CaBK_hinf (Vrest) / temp_adj))
(m-power 3)
(h-power 1)
(m-inf (CaBK_minf (v) / temp_adj) )
(m-tau (CaBK_mtau (v) / temp_adj) )
(h-inf (CaBK_hinf (v) / temp_adj) )
(h-tau (CaBK_htau (v) / temp_adj) )))
)
(component (type pore)
(const gbar_CaBK = 0.014)
(output gbar_CaBK ))
(component (type permeating-substance) (name k)
(const e_CaBK = -85)
(output e_CaBK ))
) ;; end BK current
(component (type decaying-pool) (name ca)
(const F = 96485.0)
(const ca_initial = 1e-4)
(const ca_depth = 0.1)
(const ca_beta = 1.0)
(d (ca) = ((neg (ica) / (2 * F * ca_initial * ca_depth)) -
(ca * ca_beta * temp_adj))
(initial ca_initial))
(output ca)
)
(functor (name Nafun) (type ion-channel)
( Na_Con Na_Coff Na_Oon Na_Ooff Na_alfac Na_btfac
Na_alpha Na_beta Na_gamma Na_delta Na_epsilon Na_zeta Na_x1 Na_x2
Na_x3 Na_x4 Na_x5 Na_x6 ) =
(component (type gate)
;; rate functions
(f01 = (4.0 * Na_alpha * exp (v / Na_x1) * temp_adj))
(f02 = (3.0 * Na_alpha * exp (v / Na_x1) * temp_adj))
(f03 = (2.0 * Na_alpha * exp (v / Na_x1) * temp_adj))
(f04 = (Na_alpha * exp (v / Na_x1) * temp_adj))
(f0O = (Na_gamma * exp (v / Na_x3) * temp_adj))
(fip = (Na_epsilon * exp (v / Na_x5) * temp_adj))
(f11 = (4.0 * Na_alpha * Na_alfac * exp (v / Na_x1) * temp_adj))
(f12 = (3.0 * Na_alpha * Na_alfac * exp (v / Na_x1) * temp_adj))
(f13 = (2.0 * Na_alpha * Na_alfac * exp (v / Na_x1) * temp_adj))
(f14 = (Na_alpha * Na_alfac * exp (v / Na_x1) * temp_adj))
(f1n = (Na_gamma * exp (v / Na_x3) * temp_adj))
(fi1 = (Na_Con * temp_adj))
(fi2 = (Na_Con * Na_alfac * temp_adj))
(fi3 = (Na_Con * Na_alfac * Na_alfac * temp_adj))
(fi4 = (Na_Con * Na_alfac * Na_alfac * Na_alfac * temp_adj))
(fi5 = (Na_Con * Na_alfac * Na_alfac * Na_alfac * Na_alfac * temp_adj))
(fin = (Na_Oon * temp_adj))
(b01 = (Na_beta * exp (v / Na_x2) * temp_adj))
(b02 = (2.0 * Na_beta * exp (v / Na_x2) * temp_adj))
(b03 = (3.0 * Na_beta * exp (v / Na_x2) * temp_adj))
(b04 = (4.0 * Na_beta * exp (v / Na_x2) * temp_adj))
(b0O = (Na_delta * exp (v / Na_x4) * temp_adj))
(bip = (Na_zeta * exp (v / Na_x6) * temp_adj))
(b11 = (Na_beta * Na_btfac * exp (v / Na_x2) * temp_adj))
(b12 = (2.0 * Na_beta * Na_btfac * exp (v / Na_x2) * temp_adj))
(b13 = (3.0 * Na_beta * Na_btfac * exp (v / Na_x2) * temp_adj))
(b14 = (4.0 * Na_beta * Na_btfac * exp (v / Na_x2) * temp_adj))
(b1n = (Na_delta * exp (v / Na_x4) * temp_adj))
(bi1 = (Na_Coff * temp_adj))
(bi2 = (Na_Coff * Na_btfac * temp_adj))
(bi3 = (Na_Coff * Na_btfac * Na_btfac * temp_adj))
(bi4 = (Na_Coff * Na_btfac * Na_btfac * Na_btfac * temp_adj))
(bi5 = (Na_Coff * Na_btfac * Na_btfac * Na_btfac * Na_btfac * temp_adj))
(bin = (Na_Ooff * temp_adj))
(reaction
(Na_z
(transitions
(<-> C1 C2 f01 b01)
(<-> C2 C3 f02 b02)
(<-> C3 C4 f03 b03)
(<-> C4 C5 f04 b04)
(<-> C5 O f0O b0O)
(<-> O B fip bip)
(<-> O I6 fin bin)
(<-> I1 I2 f11 b11)
(<-> I2 I3 f12 b12)
(<-> I3 I4 f13 b13)
(<-> I4 I5 f14 b14)
(<-> I5 I6 f1n b1n)
(<-> C1 I1 fi1 bi1)
(<-> C2 I2 fi2 bi2)
(<-> C3 I3 fi3 bi3)
(<-> C4 I4 fi4 bi4)
(<-> C5 I5 fi5 bi5))
(conserve (1 = (C1 + C2 + C3 + C4 + C5 + O + B + I1 + I2 + I3 + I4 + I5 + I6)))
(open O) (power 1)))
(output Na_z )
)
(component (type pore)
(const gbar = 0.016)
(output gbar ))
(component (type permeating-substance) (name na)
(const e = -88)
(output e ))
) ;; end Nafun functor
(component (name Na) =
Nafun ((const Na_Con = 0.005)
(const Na_Coff = 0.5)
(const Na_Oon = 2.3)
(const Na_Ooff = 0.005)
(const Na_alfac = (pow ((Na_Oon / Na_Con) (1.0 / 4.0))))
(const Na_btfac = (pow ((Na_Ooff / Na_Coff) (1.0 / 4.0))))
(const Na_alpha = 150)
(const Na_beta = 3)
(const Na_gamma = 150)
(const Na_delta = 40)
(const Na_epsilon = 1e-12)
(const Na_zeta = 0.03)
(const Na_x1 = 20)
(const Na_x2 = -20)
(const Na_x3 = 1000000000000.0)
(const Na_x4 = -1000000000000.0)
(const Na_x5 = 1000000000000.0)
(const Na_x6 = -25)))
;; end Na current
(component (name Narsg) =
Nafun ((const Na_Con = 0.005)
(const Na_Coff = 0.5)
(const Na_Oon = 0.75)
(const Na_Ooff = 0.005)
(const Na_alfac = (pow ((Na_Oon / Na_Con) (1.0 / 4.0))))
(const Na_btfac = (pow ((Na_Ooff / Na_Coff) (1.0 / 4.0))))
(const Na_alpha = 150)
(const Na_beta = 3)
(const Na_gamma = 150)
(const Na_delta = 40)
(const Na_epsilon = 1.75)
(const Na_zeta = 0.03)
(const Na_x1 = 20)
(const Na_x2 = -20)
(const Na_x3 = 1000000000000.0)
(const Na_x4 = -1000000000000.0)
(const Na_x5 = 1000000000000.0)
(const Na_x6 = -25)))
;; end Narsg current
))
Copyright 2008 Ivan Raikov and the Okinawa Institute of Science and Technology. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. A full copy of the GPL license can be found at <http://www.gnu.org/licenses/>.