I have been working on converting a single cell model with detailed anatomy and biophysics from Hoc to Python. I am currently having problems with custom ion channel mechanisms. I am able to insert the mechanisms, but I am having problems defining some of the specific parameters.
sec.insert(‘channel’)
sec.property = specific_value
I get the error the following error:
AttributeError: ‘nrn.Section’ object has no attribute ‘property’
For example, in the ‘AXNODE75’ channels Mod file below, I can define conductance properties (e.g. gnabar calling sec.gnabar_axnode75) and reversal potentials (e.g. ena calling sec.ena_axnode75). However, I am unable to define the parameters ‘vshift’ calling sec.vshift_axnode75 or ‘vtraub’ calling sec.vtraub_axnode75.
Code: Select all
TITLE Motor Axon Node channels
:
: Fast Na+, Persistant Na+, Slow K+, and Leakage currents
: responsible for nodal action potential
: Iterative equations H-H notation rest = -75 mV
:
INDEPENDENT {t FROM 0 TO 1 WITH 1 (ms)}
NEURON {
SUFFIX axnode75
NONSPECIFIC_CURRENT ina
NONSPECIFIC_CURRENT inap
NONSPECIFIC_CURRENT ik
NONSPECIFIC_CURRENT il
RANGE gnapbar, gnabar, gkbar, gl, ena, ek, el
RANGE mp_inf, m_inf, h_inf, s_inf
RANGE tau_mp, tau_m, tau_h, tau_s
}
UNITS {
(mA) = (milliamp)
(mV) = (millivolt)
}
PARAMETER {
gnapbar = 0.01 (mho/cm2)
gnabar = 3.0 (mho/cm2)
gkbar = 0.08 (mho/cm2)
gl = 0.007 (mho/cm2)
ena = 55.0 (mV)
ek = -85.0 (mV)
el = -85.0 (mV)
celsius (degC)
dt (ms)
v (mV)
vshift=5
vtraub=-80
ampA = 0.01
ampB = 27
ampC = 10.2
bmpA = 0.00025
bmpB = 34
bmpC = 10
amA = 1.86
amB = 21.4
amC = 10.3
bmA = 0.086
bmB = 25.7
bmC = 9.16
ahA = 0.062
ahB = 114.0
ahC = 11.0
bhA = 2.3
bhB = 31.8
bhC = 13.4
asA = 0.3
asB = -27
asC = -5
bsA = 0.03
bsB = 10
bsC = -1
}
STATE {
mp m h s
}
ASSIGNED {
inap (mA/cm2)
ina (mA/cm2)
ik (mA/cm2)
il (mA/cm2)
mp_inf
m_inf
h_inf
s_inf
tau_mp
tau_m
tau_h
tau_s
q10_1
q10_2
q10_3
}
BREAKPOINT {
SOLVE states METHOD cnexp
inap = gnapbar * mp*mp*mp * (v - ena)
ina = gnabar * m*m*m*h * (v - ena)
ik = gkbar * s * (v - ek)
il = gl * (v - el)
}
DERIVATIVE states { : exact Hodgkin-Huxley equations
evaluate_fct(v)
mp'= (mp_inf - mp) / tau_mp
m' = (m_inf - m) / tau_m
h' = (h_inf - h) / tau_h
s' = (s_inf - s) / tau_s
}
UNITSOFF
INITIAL {
:
: Q10 adjustment
:
q10_1 = 2.2 ^ ((celsius-20)/ 10 )
q10_2 = 2.9 ^ ((celsius-20)/ 10 )
q10_3 = 3.0 ^ ((celsius-36)/ 10 )
evaluate_fct(v)
mp = mp_inf
m = m_inf
h = h_inf
s = s_inf
}
PROCEDURE evaluate_fct(v(mV)) { LOCAL a,b,v2
v2 = v - vshift
a = q10_1*vtrap1(v2)
b = q10_1*vtrap2(v2)
tau_mp = 1 / (a + b)
mp_inf = a / (a + b)
a = q10_1*vtrap6(v2)
b = q10_1*vtrap7(v2)
tau_m = 1 / (a + b)
m_inf = a / (a + b)
a = q10_2*vtrap8(v2)
b = q10_2*bhA / (1 + Exp(-(v2+bhB)/bhC))
tau_h = 1 / (a + b)
h_inf = a / (a + b)
a = q10_3*asA / (Exp((v2-vtraub+asB)/asC) + 1)
b = q10_3*bsA / (Exp((v2-vtraub+bsB)/bsC) + 1)
tau_s = 1 / (a + b)
s_inf = a / (a + b)
}
FUNCTION vtrap(x) {
if (x < -50) {
vtrap = 0
}else{
vtrap = bsA / (Exp((x+bsB)/bsC) + 1)
}
}
FUNCTION vtrap1(x) {
if (fabs((x+ampB)/ampC) < 1e-6) {
vtrap1 = ampA*ampC
}else{
vtrap1 = (ampA*(x+ampB)) / (1 - Exp(-(x+ampB)/ampC))
}
}
FUNCTION vtrap2(x) {
if (fabs((x+bmpB)/bmpC) < 1e-6) {
vtrap2 = -bmpA*bmpC
}else{
vtrap2 = (bmpA*(-(x+bmpB))) / (1 - Exp((x+bmpB)/bmpC))
}
}
FUNCTION vtrap6(x) {
if (fabs((x+amB)/amC) < 1e-6) {
vtrap6 = amA*amC
}else{
vtrap6 = (amA*(x+amB)) / (1 - Exp(-(x+amB)/amC))
}
}
FUNCTION vtrap7(x) {
if (fabs((x+bmB)/bmC) < 1e-6) {
vtrap7 = -bmA*bmC
}else{
vtrap7 = (bmA*(-(x+bmB))) / (1 - Exp((x+bmB)/bmC))
}
}
FUNCTION vtrap8(x) {
if (fabs((x+ahB)/ahC) < 1e-6) {
vtrap8 = -ahA*ahC
}else{
vtrap8 = (ahA*(-(x+ahB))) / (1 - Exp((x+ahB)/ahC))
}
}
FUNCTION Exp(x) {
if (x < -100) {
Exp = 0
}else{
Exp = exp(x)
}
}
UNITSON
Another example, in the ‘Cacum’ channel Mod file below, I am unable to define the concentration parameter, cai0, calling sec.cai0_Cacum.
Code: Select all
TITLE calcium accumulation for STh
COMMENT
Calcium accumulation into a volume of area*depth next to the
membrane with an exponential decay (time constant tau) to resting
level (given by the global calcium variable cai0_ca_ion).
How the q10 works:
There is a q10 for the rates (alpha and beta's) called Q10. The q10s
should have been measured at specific temperatures temp1 and temp2
(that are 10degC apart). Ideally, as Q10 is temperature dependant, we
should know these two temperatures. We are going to follow the
more formal Arrhenius derived Q10 approach. The temperature at
which this channel's kinetics were recorded is tempb (base
temperature). What we then need to calculate is the desired rate
scale for now working at temperature celsius (rate_k). This is given
by the empirical Arrhenius equation, using the Q10.
ENDCOMMENT
NEURON {
SUFFIX Cacum
USEION ca READ ica WRITE cai
GLOBAL con,cai0,buftau,activate_Q10,Q10,rate_k,temp1,temp2,tempb,depth
}
UNITS {
(mM) = (milli/liter)
(mA) = (milliamp)
F = (faraday) (coulombs) : Faradays constant
}
PARAMETER {
v (mV)
dt (ms)
con = 0.0 : conversion constant (see INITIAL block)
Avo = 6.02e23 : Avogadro's number
elc = 1.602e-19 (coulombs) : elementrary charge
depth = 200.0 (nm) : assume volume = area*depth
cai0 = 0.0001(mM) : replace cai0_ca_ion
buftau = 1.857456645e+02 (ms)
cai0_ca_ion
celsius
activate_Q10 = 1
Q10 = 1.2
temp1 = 19.0 (degC)
temp2 = 29.0 (degC)
tempb = 23.0 (degC)
}
ASSIGNED {
ica (mA/cm2)
tau (ms)
rate_k
}
STATE {
cai (mM)
}
BREAKPOINT {
SOLVE integrate METHOD cnexp
}
UNITSOFF
INITIAL {
LOCAL ktemp,ktempb,ktemp1,ktemp2
if (activate_Q10>0) {
ktemp = celsius+273.0
ktempb = tempb+273.0
ktemp1 = temp1+273.0
ktemp2 = temp2+273.0
rate_k = exp( log(Q10)*((1/ktempb)-(1/ktemp))/((1/ktemp1)-(1/ktemp2)) )
}else{
rate_k = 1.0
}
con=1e7/(depth*2.0*Avo*elc) : UNITS (derivation)
: ica = (mA/cm2)
: = (A/1e3cm2)
: = ((C/s)/1e3cm2)
: depth = (nm) = (1e-7cm)
: ica/depth = ((C/s)/1e3cm2) * 1/(1e-7cm)
: = ((C/s)/1e3cm2) * 1e7/(cm)
: = (1e7(C/s) * 1/(1e3cm3))
: = (1e7(C/s) * 1/(litres))
: 1e7*ica/depth = ((C/s) * 1/(litres))
: = ((C/litres) * 1/(s))
: = ((C/litres) * 1/(1e3msec))
: = ((C/litres) * 1e-3/(msec))
: 1e4*ica/depth = ((C/litres) * 1/(msec))
: 1/(2*Avo*elc) = (mol/C)
: = (1e3mmol/C)
: 1e3/(2*Avo*elc) = (mmol/C)
: 1e4*ica/depth * 1e3/(2*Avo*elc) = ((C/litres) * 1/(msec))
: * (mmol/C)
: ica*1e7/(depth*2*Avo*elc) = (mmol/litres) * (1/msec)
: ica*con = (mM) * (1/msec)
tau=buftau/rate_k
cai=cai0
}
DERIVATIVE integrate {
cai' = -ica*con + (cai0 - cai)/tau
}
UNITSON
I am able to define the parameters above in NEURON using the original Hoc code, but not in Python. I am also able to define them in Python using the direct call to the Hoc interpreter with the h(‘ ‘) command. However, when I define an object in Python as a neuron section and try to define the parameters, I get the error mentioned above. The parameters are all in the PARAMETER block of the Mod file. It seems I am only able to define parameters that are defined as RANGE parameters in the NEURON block.
Any help would be greatly appreciated. Thanks!