// genesis - markovchan.g
/* This script defines functions to create the extended objects
Na_squid_markov and K_squid_markov from the pore objects Napores and
Kpores. These objects (described in the reference manual) use Markov
kinetics to simulate a finite population of ion channel pores. Instead of
a Gbar field, there is Gmax (the open state conductance of a single pore)
and the total number of pores, Nt. This is set to SOMA_A * pores/area =
SOMA_A * gdens(S/m^2)/Gmax, where gdens is an added field, giving the
maximum conductance per unit area (Gbar/SOMA_A) and the global variable
SOMA_A is the area of the parent compartment.
As the cell reader does not recognize these channels, the "*compt" option
should be used with readcell to create copies of a prototype compartment
that contains the prototype channels. Then, we need a way to determine the
area of the parent compartment and set Nt appropriately, as this will not
be done by readcell. This is done by the extended RESET, and CREATE
actions, and the SET action, when gdens is set. This script contains a
function make_markov_compt for creating such a compartment.
An example script that uses these prototypes with the cell reader may
be found in Scripts/examples/pore/markov.
NOTE: When using these channels, it may be necessary to give the reset
command twice, or to call the RESET action for the channels before doing a
general reset, in order to be sure that compartments are reset after the
channels have been reset.
*/
// CONSTANTS
float EREST_ACT = -0.070 // volts
float ENA = 0.045
float EK = -0.090
float RM = 0.33333 // specific membrane resistance (ohms m^2)
float CM = 0.01 // specific membrane capacitance (farads/m^2)
float RA = 0.3 // specific axial resistance (ohms m)
/* These are the values typical for squid axon. EREST_ACT, RM, CM, and RA can
be overridden by values defined before invoking make_markov_compt. If
readcell is used, then any values given in the cell parameter file will
have the final say.
*/
/* prototype compartment area in square meters, used to set the channel Nt
from the conductance density, gdens. This is useful to give Nt an initial
value. SOMA_A may be changed to an appropriate value.
*/
float SOMA_A = 30e-6*30e-6*3.14159
/* function used to extend the RESET action of the squid_markov prototypes */
function squid_markov_RESET(action)
float area, len, dia
float PI = 3.14159
call . RESET -parent
if ({isa compartment ..})
len = {getfield .. len}
dia = {getfield .. dia}
if (len > 1.0e-12)
area = {PI*dia*len}
else
area = {PI*dia*dia}
end
// Set Nt to Gbar/Gmax, where Gmax is max conductance per pore
setfield . Nt {{getfield . gdens}*area/{getfield . Gmax}}
end
return 0
end
/* function used to extend the CREATE action of the squid_markov prototypes */
function squid_markov_CREATE(action, parent, object, elm)
float area, len, dia
float PI = 3.14159
if ({isa compartment ..})
len = {getfield .. len}
dia = {getfield .. dia}
if (len > 1.0e-12)
area = {PI*dia*len}
else
area = {PI*dia*dia}
end
// Set Nt to Gbar/Gmax, where Gmax is max conductance per pore
setfield . Nt {{getfield . gdens}*area/{getfield . Gmax}}
end
return 1 // indicate that CREATE action is complete
end
/* function used to extend the SET action of the squid_markov prototypes */
function squid_markov_SET(action, field, newvalue)
float area, len, dia, newvalue
float PI = 3.14159
if ((field == "gdens") || (field == "Gmax"))
if ({isa compartment ..})
len = {getfield .. len}
dia = {getfield .. dia}
if (len > 1.0e-12)
area = {PI*dia*len}
else
area = {PI*dia*dia}
end
end
// Set Nt to Gbar/Gmax, where Gmax is max conductance per pore
setfield . Nt {{getfield . gdens}*area/{getfield . Gmax}}
end
return 0 // indicate that SET action isn't yet complete
end
// stochastic Na channel, with parameters like those in hhchan.g Na_squid_hh
function make_Na_squid_markov
str chanpath = "Na_squid_markov"
if ({argc} == 1)
chanpath = {argv 1}
end
if ({exists {chanpath}})
return
end
float NaGmax = 20.0e-12 // 20 pS/channel
float gdens = 1200 // S/m^2
create Napores {chanpath}
addfield {chanpath} gdens
setfield {chanpath} Ek {ENA} Gmax {NaGmax} gdens {gdens} \
Nt {SOMA_A*gdens/NaGmax} \
malpha_A {0.1e6*(0.025 + EREST_ACT)} malpha_B -0.1e6 malpha_C -1.0 \
malpha_D {-1.0*(0.025 + EREST_ACT)} malpha_F -0.01 \
mbeta_A 4.0e3 mbeta_B 0.0 mbeta_C 0.0 mbeta_D {-1.0*EREST_ACT} \
mbeta_F 18e-3 halpha_A 70.0 halpha_B 0.0 halpha_C 0.0 \
halpha_D {-1.0*EREST_ACT} halpha_F 0.02 \
hbeta_A 1.0e3 hbeta_B 0.0 hbeta_C 1.0 \
hbeta_D {-1.0*(0.030 + EREST_ACT)} hbeta_F -10.0e-3
// Extend actions to properly scale Nt from gdens and compt area
addaction {chanpath} RESET squid_markov_RESET
addaction {chanpath} SET squid_markov_SET
addaction {chanpath} CREATE squid_markov_CREATE
// Make an extended object
addobject {chanpath} {chanpath} -author "Dave Beeman" \
-description "Markov HH squid channel based on the Napore object"
end
// stochastic K channel, with parameters like those in hhchan.g K_squid_hh
function make_K_squid_markov
str chanpath = "K_squid_markov"
if ({argc} == 1)
chanpath = {argv 1}
end
if ({exists {chanpath}})
return
end
float KGmax = 20.0e-12 // 20 pS/channel
float gdens = 360 // S/m^2
create Kpores {chanpath}
addfield {chanpath} gdens
setfield {chanpath} Ek {EK} Gmax {KGmax} gdens {gdens} \
Nt {SOMA_A*gdens/KGmax} \
alpha_A {10e3*(0.01 + EREST_ACT)} alpha_B -10.0e3 alpha_C -1.0 \
alpha_D {-1.0*(0.01 + EREST_ACT)} alpha_F -0.01 beta_A 125.0 \
beta_B 0.0 beta_C 0.0 beta_D {-1.0*EREST_ACT} beta_F 80.0e-3
// Extend actions to properly scale Nt from gdens and compt area
addaction {chanpath} RESET squid_markov_RESET
addaction {chanpath} SET squid_markov_SET
addaction {chanpath} CREATE squid_markov_CREATE
// Make an extended object
addobject {chanpath} {chanpath} -author "Dave Beeman" \
-description "Markov HH squid channel based on the Kpore object"
end
/* make_markov_compt creates a prototype compartment markov_compt in the
current working element (usually it will be /library), containing the
channels markov_compt/Na_squid_markov and markov_compt/K_squid_markov.
This allows these channels to be used with readcell and the "*compt"
option. This is necessary when using channel objects that are not
recognized by readcell (such as the pore objects), or to simplify the cell
parameter file when creating many compartments that have the same set of
channels.
The compartment fields len, dia, Cm, Rm, Ra, and Em are set from the
prototype dimensions and the global variables CM, RM, RA, and EREST_ACT.
GENESIS does not declare these globals when started, although they will be
declared when readcell is invoked if they do not already exist.
Default values of CM, RM, RA, and EREST_ACT are given at the start
of this file, in order to intialize the prototype compartment, and can be
overridden by values specified in the cell parameter file.
make_markov_compt also assumes that the extended objects used to create
the Markov channels have been created by invoking make_Na_squid_markov and
make_K_squid_markov. As readcell will not scale the maximum conductance
of these channels, the gdens field of these channels should be set if it
is different than the defaults given here. Then, the extended RESET
action of the channels will set Nt (proportional to the maximum
conductance) using gdens and the compartment area that is assigned by
readcell.
*/
function make_markov_compt
str comptpath = "markov_compt"
if ({argc} == 1)
comptpath = {argv 1}
end
if ({exists {comptpath}})
return
end
float len, dia, surf
float PI = 3.14159
// default dimensions of the compartment
len = 30.0e-6
dia = 30.0e-6
surf = {len*dia*PI}
create compartment {comptpath}
setfield {comptpath} Cm {CM*surf} Rm {RM/surf} \
Ra {4.0*RA*len/(dia*dia*PI)} \
Em {EREST_ACT} dia {dia} len {len}
/* Create the prototype channels with the properly scaled
Nt and messages to/from the compartment */
create Na_squid_markov {comptpath}/Na_squid_markov
addmsg {comptpath} {comptpath}/Na_squid_markov VOLTAGE Vm
addmsg {comptpath}/Na_squid_markov {comptpath} CHANNEL Gk Ek
setfield {comptpath}/Na_squid_markov gdens 1200
create K_squid_markov {comptpath}/K_squid_markov
addmsg {comptpath} {comptpath}/K_squid_markov VOLTAGE Vm
addmsg {comptpath}/K_squid_markov {comptpath} CHANNEL Gk Ek
setfield {comptpath}/K_squid_markov gdens 360
end