Setting the basal level for Intracellular Calcium Concentrat
Setting the basal level for Intracellular Calcium Concentrat
Dear Sir,
I am working on a intracellular calcium diffusion, buffering and pump mechanism and am using the cdp.mod file (from the link provided at Errata for the Enhanced Preprint of "Expanding NEURON's Repertoire of Mechanisms with NMODL")
I have added this mechanism in the model "Pyramidal Neuron Deep, Superficial; Aspiny, Stellate (Mainen and Sejnowski 1996)"
Accession Number: 2488
which has other mod files likes ca.mod and cad.mod
Now the cad.mod file has a statement wherein cai is initialized to cainf which itself was initialized to 100nM
I
I now want to set the basal cai at 116 nano Molars. I tried doing it by changing the cainf parameter value in cad.mod file from 100nM to 116nM, however when i ran the simulation and checked the cai plot in the soma it was still reflecting the basal level at 50 nM. I don't know how the basal level is 50nM. And this does not change when i change the cainf value.
Can you please guide me about how to set the basal cai to 116 nM in this context.
thanks in advance
I am working on a intracellular calcium diffusion, buffering and pump mechanism and am using the cdp.mod file (from the link provided at Errata for the Enhanced Preprint of "Expanding NEURON's Repertoire of Mechanisms with NMODL")
I have added this mechanism in the model "Pyramidal Neuron Deep, Superficial; Aspiny, Stellate (Mainen and Sejnowski 1996)"
Accession Number: 2488
which has other mod files likes ca.mod and cad.mod
Now the cad.mod file has a statement wherein cai is initialized to cainf which itself was initialized to 100nM
I
I now want to set the basal cai at 116 nano Molars. I tried doing it by changing the cainf parameter value in cad.mod file from 100nM to 116nM, however when i ran the simulation and checked the cai plot in the soma it was still reflecting the basal level at 50 nM. I don't know how the basal level is 50nM. And this does not change when i change the cainf value.
Can you please guide me about how to set the basal cai to 116 nM in this context.
thanks in advance
-
- Site Admin
- Posts: 6384
- Joined: Wed May 18, 2005 4:50 pm
- Location: Yale University School of Medicine
- Contact:
Re: Setting the basal level for Intracellular Calcium Concentrat
The first thing to do is to make sure your model does not contain a conflict that prevents accurate results. cad.mod and cdp.mod should not be inserted into the same section because both contain
USEION ca . . . WRITE cai . . .
statements. This means that each of these mechanisms is using a different set of equations to compute a value for cai. The result will be nonsense. Decide which of these calcium accumulation mechanisms you want to use, and eliminate the other one.
The answer to your original question depends on which mechanism you decide to use.
USEION ca . . . WRITE cai . . .
statements. This means that each of these mechanisms is using a different set of equations to compute a value for cai. The result will be nonsense. Decide which of these calcium accumulation mechanisms you want to use, and eliminate the other one.
The answer to your original question depends on which mechanism you decide to use.
Re: Setting the basal level for Intracellular Calcium Concentrat
Sir,
I have decided to use the cdp mechanism. Now, how to set the basal level of cai.
regards
I have decided to use the cdp mechanism. Now, how to set the basal level of cai.
regards
-
- Site Admin
- Posts: 6384
- Joined: Wed May 18, 2005 4:50 pm
- Location: Yale University School of Medicine
- Contact:
Re: Setting the basal level for Intracellular Calcium Concentrat
In principle there are several ways to do this. Most intellectually satisfying is to have an analytic solution that relates one parameter "x" of the model to all the others that might affect resting cai. Then it is a simple matter of plugging in numbers and grinding out the particular value for "x" that will ensure the desired resting cai.
But with any model cell that involves one or more voltage-gated calcium currents and this cdp mechanism, one must choose which parameter to adjust, and the parameter may not have the same value in all compartments (because other paramters that affect cai may not have the same values in all compartments). A compartment with high membrane calcium conductance/permeability will need some adjustment of the pump's forward rate constants to bring cai back to the desired resting level, but that will affect they dynamics of cai. The alternative is to reduce the membrane calcium conductance or permeability of that compartment, but that may interfere with the response of the cell to changes of membrane potential.
So what is to be done? Just leave all parameters as they are, and preface each simulation with a long "warmup" run that allows cai to asymptotically settle toward whatever level it may finally reach?
In such a case, a better approach may be to create a density mechanism that does just one thing: acts as a constant sink or source of calcium. One would then adjust, during initialization, the intensity of this sink or source so that it is equal but opposite in sign to the sum of all other calcium sources. The result is a model that has the desired resting calcium concentration, without having to perturb parameters that would disturb model dynamics.
This strategy falls into the broad category of what might be called "initialization to desired steady state." A similar approach, presented in chapter 8 of The NEURON Book, uses a distributed current source to achieve a desired resting potential.
Here's the NMODL source code for such a mechanism. The purpose of the NONSPECIFIC_CURRENT ix is to ensure that this "calcium source mechanism" does not affect charge balance--we only want it to affect the local calcium concentration.
Here's how you would use this mechanism.
At the end of model setup, after you have inserted all other mechanisms that WRITE ica into your model cell, execute this statement:
After that, and certainly after any load_file("nrngui.hoc") statement, but before you execute any run() statement, insert this custom init() procedure:
Now, every time you execute run(), NEURON will first set ca0_ca_ion (the default initial value of cai) to whatever value you want (this is important because the pump in cdp generates a current whose magnitude depends on cai), and then it will adjust amp_casrc in all segments of all sections with mechanisms that WRITE ica so that the net calcium flux into or out of each segment is 0.
This should all work, but it is always possible that I mistyped something or even (gasp) made a mistake, so be sure to test it on a simple model with just one or two sections first, then try it on your whole model and test again to make sure it works properly.
Thanks for using NEURON, and thanks also for asking a question that raises some very important issues about initializing models that contain ion accumulation mechanisms.
But with any model cell that involves one or more voltage-gated calcium currents and this cdp mechanism, one must choose which parameter to adjust, and the parameter may not have the same value in all compartments (because other paramters that affect cai may not have the same values in all compartments). A compartment with high membrane calcium conductance/permeability will need some adjustment of the pump's forward rate constants to bring cai back to the desired resting level, but that will affect they dynamics of cai. The alternative is to reduce the membrane calcium conductance or permeability of that compartment, but that may interfere with the response of the cell to changes of membrane potential.
So what is to be done? Just leave all parameters as they are, and preface each simulation with a long "warmup" run that allows cai to asymptotically settle toward whatever level it may finally reach?
In such a case, a better approach may be to create a density mechanism that does just one thing: acts as a constant sink or source of calcium. One would then adjust, during initialization, the intensity of this sink or source so that it is equal but opposite in sign to the sum of all other calcium sources. The result is a model that has the desired resting calcium concentration, without having to perturb parameters that would disturb model dynamics.
This strategy falls into the broad category of what might be called "initialization to desired steady state." A similar approach, presented in chapter 8 of The NEURON Book, uses a distributed current source to achieve a desired resting potential.
Here's the NMODL source code for such a mechanism. The purpose of the NONSPECIFIC_CURRENT ix is to ensure that this "calcium source mechanism" does not affect charge balance--we only want it to affect the local calcium concentration.
Code: Select all
NEURON {
SUFFIX casrc
USEION ca WRITE ica
NONSPECIFIC_CURRENT ix
RANGE amp
}
UNITS {
(mA) = (milliamp)
}
PARAMETER {
amp (mA/cm2)
}
ASSIGNED {
ica (mA/cm2)
}
BREAKPOINT {
ica = amp
ix = -ica
}
At the end of model setup, after you have inserted all other mechanisms that WRITE ica into your model cell, execute this statement:
Code: Select all
forall if (ismembrane("ca_ion")) insert casrc // add casrc only to those sections that need it
Code: Select all
proc init() {
ca0_ca_ion = whatever_you_want_it_to_be
forall if (ismembrane("casrc")) amp_casrc = 0 // so it doesn't contribute to total ica(x)
finitialize(v_init)
forall if (ismembrane("ca_ion")) {
// iterate over all internal nodes (segments) and adjust amp_casrc accordingly
for (x,0) amp_casrc(x) = -ica(x)
}
if (cvode.active()) {
cvode.re_init()
} else {
fcurrent()
}
}
This should all work, but it is always possible that I mistyped something or even (gasp) made a mistake, so be sure to test it on a simple model with just one or two sections first, then try it on your whole model and test again to make sure it works properly.
Thanks for using NEURON, and thanks also for asking a question that raises some very important issues about initializing models that contain ion accumulation mechanisms.
Re: Setting the basal level for Intracellular Calcium Concentrat
Dear Sir,
I am delighted to receive such a enlightening and elaborate reply. I can't thank you enough for showing me the way forward.
With warm regards
I am delighted to receive such a enlightening and elaborate reply. I can't thank you enough for showing me the way forward.
With warm regards
Re: Setting the basal level for Intracellular Calcium Concentrat
Dear Sir,
I tried initializing cai as suggested by you. Firstly the NMODL source code threw up an error on compilation "Translating casrc.mod into casrc.c
Warning: ix undefined. (declared within VERBATIM?) ....." . To resolve this I added the statement "ix (mA/cm2)" within the assigned block. (I hope it was the correct thing to do) . Anyway, now the mod file compiled properly.
Thereafter I added the "insert casrc" statement and then the init() procedure(in which i had set the parameter value of ca0_ca_ion = 116.0e-6). The init procedure was added into my hoc code just prior to the run() statement. I then ran the simulation but the result was still the same. The basal cai as seen in the cai plot was stuck at 50 nM.
Can you please help me out. I have copied the hoc code that i am using down below
I tried initializing cai as suggested by you. Firstly the NMODL source code threw up an error on compilation "Translating casrc.mod into casrc.c
Warning: ix undefined. (declared within VERBATIM?) ....." . To resolve this I added the statement "ix (mA/cm2)" within the assigned block. (I hope it was the correct thing to do) . Anyway, now the mod file compiled properly.
Thereafter I added the "insert casrc" statement and then the init() procedure(in which i had set the parameter value of ca0_ca_ion = 116.0e-6). The init procedure was added into my hoc code just prior to the run() statement. I then ran the simulation but the result was still the same. The basal cai as seen in the cai plot was stuck at 50 nM.
Can you please help me out. I have copied the hoc code that i am using down below
Code: Select all
objref st,dendritic,dendritic_only
load_file("nrngui.hoc")
objectvar gr
create soma
access soma
tstop = 3000
steps_per_ms = 40
dt = 0.025
// ----------------passive & active membrane ---------------------
ra = 150
global_ra = ra
rm = 30000
c_m = 0.75
cm_myelin = 0.04
g_pas_node = 0.02
v_init = -70
celsius = 37
Ek = -90
Ena = 60
gna_dend = 20
gna_node = 30000
gna_soma = gna_dend
gkv_axon = 2000
gkv_soma = 200
gca = .4
gkm = .1
gkca = 3
gca_soma = .7
gkm_soma = .1
gkca_soma = .3
// -----------Graph to observe cai-------------------------------
proc addgraph(){
gr=new Graph()
gr.size(0,tstop,-0.00001,0.0004)
gr.xaxis()
gr.yaxis()
gr.addvar($s1,3,0)
gr.addvar($s2,2,0)
gr.save_name("graphList.")
graphList.append(gr)
}
// ------------Axon Geometry-------------------------------------
n_axon_seg = 5
create soma,iseg,hill,myelin[2],node[2]
proc create_axon() {
create iseg,hill,myelin[n_axon_seg],node[n_axon_seg]
soma{
equiv_diam = sqrt(area(.5)/(4*PI)) // area = equiv_diam^2*4*PI
}
if (numarg()) equiv_diam = $1
iseg{ // initial segment between hillock + myelin
L = 15
nseg = 5
diam = equiv_diam/10 // see Sloper and Powell 1982, Fig.71
}
hill{
L = 10
nseg = 5
diam(0:1) = 4*iseg.diam:iseg.diam
}
// construct myelinated axon with nodes of ranvier
for i=0,n_axon_seg-1 {
myelin[i]{ // myelin element
nseg = 5
L = 100
diam = iseg.diam
}
node[i]{ // nodes of Ranvier
nseg = 1
L = 1.0
diam = iseg.diam*.75 // nodes are thinner than axon
}
}
soma connect hill(0), 0.5
hill connect iseg(0), 1
iseg connect myelin[0](0), 1
myelin[0] connect node[0](0), 1
for i=0,n_axon_seg-2 {
node[i] connect myelin[i+1](0), 1
myelin[i+1] connect node[i+1](0), 1
}
}
// ----------------------------Cell Initialization--------------------------------
proc init_cell(){
// passive
forall{
insert pas
Ra = ra
cm = c_m
g_pas = 1/rm
e_pas = v_init
}
// exceptions along the axon
forsec "myelin" cm = cm_myelin
forsec "node" g_pas = g_pas_node
// na+ channels
forall insert na
forsec dendritic gbar_na = gna_dend
forsec "myelin" gbar_na = gna_dend
hill.gbar_na = gna_node
iseg.gbar_na = gna_node
forsec "node" gbar_na = gna_node
// kv delayed rectifier channels
iseg { insert kv gbar_kv = gkv_axon }
hill { insert kv gbar_kv = gkv_axon }
soma { insert kv gbar_kv = gkv_soma }
// dendritic channels
forsec dendritic_only{
insert km gbar_km = gkm
insert kca gbar_kca = gkca
insert ca gbar_ca = gca
insert cdp
}
soma{
insert km gbar_km = gkm_soma
insert kca gbar_kca = gkca_soma
insert ca gbar_ca = gca_soma
gbar_na = gna_soma
insert cdp2
}
forall if(ismembrane("k_ion")) ek = Ek
forall if(ismembrane("na_ion")){
ena = Ena
// seems to be necessary for 3d cells to shift Na kinetics -5 mV
vshift_na = -5
}
forall if(ismembrane("ca_ion")){
eca = 140
ion_style("ca_ion",0,1,0,0,0)
vshift_ca = 0
}
forall if(ismembrane("ca_ion")) insert casrc // add casrc only to those sections that need it
}
// ----------------Init------------------------------------------
proc init(){
ca0_ca_ion = 116.0
forall if (ismembrane("casrc")) amp_casrc = 0 // so it doesn't contribute to total ica(x)
finitialize(v_init)
forall if (ismembrane("ca_ion")) {
// iterate over all internal nodes (segments) and adjust amp_casrc accordingly
for (x,0) amp_casrc(x) = -ica(x)
}
if (cvode.active()) {
cvode.re_init()
} else {
fcurrent()
}
}
// -------------------------------Load cell structure---------------------------
proc load_3dcell(){
// $s1 filename
forall delete_section()
xopen($s1)
access soma
dendritic = new SectionList()
// make sure no compartments exceed 50 uM length
forall {
diam_save = diam
n = L/50
nseg = n + 1
if (n3d() == 0) diam = diam_save
dendritic.append()
}
dendritic_only = new SectionList()
forsec dendritic dendritic_only.append()
soma dendritic_only.remove()
create_axon()
init_cell()
init()
}
// -------------------------Run Simulation------------------------
load_3dcell("cells/lcAS3.hoc")
st=new IClamp(.5)
st.dur = 1000
st.del = 100
st.amp = 0.082
nrnmainmenu()
addgraph("apath[4].cai(0.5)","soma.cai(0.5)")
nrncontrolmenu()
-
- Site Admin
- Posts: 6384
- Joined: Wed May 18, 2005 4:50 pm
- Location: Yale University School of Medicine
- Contact:
Re: Setting the basal level for Intracellular Calcium Concentrat
Clearly you have a lot of ideas about what should go into your model (that's good), and you want to do it all at once. But the hoc code contains several actual or incipient bugs. Among other things, there are multiple create statements, scattered at different lines, such that if all of them were executed, the same sections would be created more than once, destroying previous effort. It is also too disorganized for efficient development and debugging. Throw it away and start from scratch, following the guidelines in this post
http://www.neuron.yale.edu/phpBB/viewto ... f=15&t=950
especially items 5, 7, and 10.
Do not bother adding a calcium accumulation mechanism such as cdp, or adding a custom initialization, until you have a well-structured program that creates a model whose other properties (anatomy, geometry, and biophysics) are "correct" (i.e. a close match to your conceptual model).
Once your complex model is at the point where it seems ready for insertion of a ca accumulation mechanism, put it aside and set up a toy model that has just one section and only two or three biophysical mechanisms--maybe pas, cdp, and a voltage-gated calcium current. Use this toy model as the testbed for your custom initialization strategy. After you have implemented and debugged your initialization strategy with the toy model, apply what you have learned to your complex model--and test again to make sure it is done correctly.
This may seem a difficult path to follow, but it is the way to master your own code, and after some initial delay your progress will be much smoother and faster.
http://www.neuron.yale.edu/phpBB/viewto ... f=15&t=950
especially items 5, 7, and 10.
Do not bother adding a calcium accumulation mechanism such as cdp, or adding a custom initialization, until you have a well-structured program that creates a model whose other properties (anatomy, geometry, and biophysics) are "correct" (i.e. a close match to your conceptual model).
Once your complex model is at the point where it seems ready for insertion of a ca accumulation mechanism, put it aside and set up a toy model that has just one section and only two or three biophysical mechanisms--maybe pas, cdp, and a voltage-gated calcium current. Use this toy model as the testbed for your custom initialization strategy. After you have implemented and debugged your initialization strategy with the toy model, apply what you have learned to your complex model--and test again to make sure it is done correctly.
This may seem a difficult path to follow, but it is the way to master your own code, and after some initial delay your progress will be much smoother and faster.
Re: Setting the basal level for Intracellular Calcium Concentrat
Thanks Ted. I'll try and do what you have suggested.
with warm regards
with warm regards
-
- Site Admin
- Posts: 6384
- Joined: Wed May 18, 2005 4:50 pm
- Location: Yale University School of Medicine
- Contact:
Re: Setting the basal level for Intracellular Calcium Concentrat
The "code cleanup" part of your task may be somewhat tedious but at least it should be straightforward. Proper initialization of ionic concentrations is one of the more difficult aspects of model specification and usage, which is why it should be tackled only after everything else is working correctly.
Re: Setting the basal level for Intracellular Calcium Concentrat
Dear Ted,
As suggested by you, i cleaned up the code after starting from scratch. Also as you had advised, i made a toy model with just the soma, into which i inserted the cdp,ca and pas mechanisms. I also inserted the casrc mechanism that you had provided.
This is the code for the toy model.
However, on running the code, I got the following error message
I guessed that this had something to do with the small size of the soma, so I resized it to the following dimensions (Diam=15, L=40). This time the code worked and I got the following output. (Was I right in my approach of resizing the soma or should i do something else?)

http://www.flickr.com/photos/48556469@N07/4447265946/
And this was the plot for cai

http://www.flickr.com/photos/48556469@N07/4447265950/
As seen above, the basal level for cai is still stuck at 50 nM. I am totally clueless as to where this figure of 50 nM is coming from. Is it part of some internal initialization within the neuron simulator?
I would highly appreciate it, if you could guide me on this issue.
For ready refernce, I have pasted the code for the cdp.mod and ca.mod mechanism that I have used
cdp.mod
ca.mod
As suggested by you, i cleaned up the code after starting from scratch. Also as you had advised, i made a toy model with just the soma, into which i inserted the cdp,ca and pas mechanisms. I also inserted the casrc mechanism that you had provided.
This is the code for the toy model.
Code: Select all
load_file("nrngui.hoc")
create soma
soma {nseg=2 diam=13.2 L= 8.2 }
//---------------- passive & active membrane properties--------------------
ra = 150
rm = 30000
c_m = 0.75
v_init = -70
celsius = 37
Ek = -90
Ena = 60
gca_soma = .3
//---------------------Mechanisms-----------------------------------
proc init_cell() {
soma{
insert pas
Ra = ra
cm = c_m
g_pas = 1/rm
e_pas = v_init
insert ca
insert cdp
}
forall if(ismembrane("ca_ion")) {
eca = 140
ion_style("ca_ion",0,1,0,0,0)
vshift_ca = 0
}
forall if(ismembrane("ca_ion")) insert casrc // add casrc only to those sections that need it
}
//------------------Init-------------------------------------------
proc init(){
ca0_ca_ion = 116.0e-6
forall if (ismembrane("casrc")) amp_casrc = 0 // so it doesn't contribute to total ica(x)
finitialize(v_init)
forall if (ismembrane("ca_ion")) {
// iterate over all internal nodes (segments) and adjust amp_casrc accordingly
for (x,0) amp_casrc(x) = -ica(x)
}
if (cvode.active()){
cvode.re_init()
} else {
fcurrent()
}
}
//---------------SIMULATION FLOW CONTROL---------------------------------
access soma
objref stim,shape,cgr,vgr
tstop = 3000
steps_per_ms = 40
dt = 0.025
stim=new IClamp(.5)
stim.dur = 1000
stim.del = 500
stim.amp = 0.082
init()
init_cell()
// show cell
shape = new PlotShape()
shape.size(-300,300,-300,300)
shape.show(2)
// show cai plot
cgr=new Graph()
cgr.size(0,tstop,-0.0001,0.0005)
cgr.xaxis() cgr.yaxis()
cgr.addvar("soma.cai(0.5)",2,0)
cgr.save_name("graphList.")
graphList.append(cgr)
// show volt spikes
vgr=new Graph()
vgr.size(0,tstop,-90,50)
vgr.xaxis() vgr.yaxis()
vgr.addvar("soma.v(0.5)",1,0)
vgr.save_name("graphList.")
graphList.append(vgr)
nrncontrolmenu()
Code: Select all
oc>at line 69 in file cdp.mod:
SOLVE state METHOD sparse
Error at section location soma(0.25)
Convergence not achieved in maximum number of iterations
/cad/neuron/nrn/x86_64/bin/nrniv: scopmath library error
near line 0
{run()}
^
fadvance()
advance()
step()
continuerun(3000)
and others
http://www.flickr.com/photos/48556469@N07/4447265946/
And this was the plot for cai
http://www.flickr.com/photos/48556469@N07/4447265950/
As seen above, the basal level for cai is still stuck at 50 nM. I am totally clueless as to where this figure of 50 nM is coming from. Is it part of some internal initialization within the neuron simulator?
I would highly appreciate it, if you could guide me on this issue.
For ready refernce, I have pasted the code for the cdp.mod and ca.mod mechanism that I have used
cdp.mod
Code: Select all
: Calcium ion accumulation with radial and longitudinal diffusion and pump
NEURON {
SUFFIX cdp
USEION ca READ cao, cai, ica WRITE cai, ica
RANGE ica_pmp
GLOBAL vrat, TotalBuffer, TotalPump
: vrat must be GLOBAL--see INITIAL block
: however TotalBuffer and TotalPump may be RANGE
}
DEFINE Nannuli 4
UNITS {
(mol) = (1)
(molar) = (1/liter)
(mM) = (millimolar)
(um) = (micron)
(mA) = (milliamp)
FARADAY = (faraday) (10000 coulomb)
PI = (pi) (1)
}
PARAMETER {
DCa = .6 (um2/ms)
k1buf = 9000 (/mM-ms) : Yamada et al. 1989
k2buf = 10 (/ms)
TotalBuffer = .09 (mM)
k1 = 1 (/mM-ms)
k2 = 0.005 (/ms)
k3 = 1 (/ms)
k4 = 0.005 (/mM-ms)
: to eliminate pump, set TotalPump to 0 in hoc
TotalPump = 0.95e-11 (mol/cm2)
fact = 0.75
}
ASSIGNED {
diam (um)
ica (mA/cm2)
ica_pmp (mA/cm2)
ica_pmp_last (mA/cm2)
parea (um) : pump area per unit length
cai (mM)
cao (mM)
vrat[Nannuli] (1) : dimensionless
: numeric value of vrat[i] equals the volume
: of annulus i of a 1um diameter cylinder
: multiply by diam^2 to get volume per um length
Kd (/mM)
B0 (mM)
}
CONSTANT { volo = 1e10 (um2) }
STATE {
: ca[0] is equivalent to cai
: ca[] are very small, so specify absolute tolerance
: let it be ~1.5 - 2 orders of magnitude smaller than baseline level
ca[Nannuli] (mM) <1e-7>
CaBuffer[Nannuli] (mM) <1e-5>
Buffer[Nannuli] (mM) <1e-5>
pump (mol/cm2) <1e-15>
pumpca (mol/cm2) <1e-15>
}
BREAKPOINT {
SOLVE state METHOD sparse
ica_pmp_last = ica_pmp
ica = ica_pmp
}
LOCAL factors_done
INITIAL {
if (factors_done == 0) { : flag becomes 1 in the first segment
factors_done = 1 : all subsequent segments will have
factors() : vrat = 0 unless vrat is GLOBAL
}
Kd = k1buf/k2buf
B0 = TotalBuffer/(1 + Kd*cai)
FROM i=0 TO Nannuli-1 {
ca[i] = cai
Buffer[i] = B0
CaBuffer[i] = TotalBuffer - B0
}
parea = PI*diam
: Manually computed initalization of pump
: assumes that cai has been equal to cai0_ca_ion for a long time
: pump = TotalPump/(1 + (cai*k1/k2))
: pumpca = TotalPump - pump
: If possible, instead of using formulas to calculate pump and pumpca,
: let NEURON figure them out--just uncomment the following four statements
ica=0
ica_pmp = 0
ica_pmp_last = 0
SOLVE state STEADYSTATE sparse
: This requires that pump and pumpca be constrained by the CONSERVE
: statement in the STATE block.
: If there is a voltage-gated calcium current,
: this is almost certainly the wrong initialization.
: In such a case, first do an initialization run, then use SaveState
: On subsequent runs, restore the initial condition from the saved states.
}
LOCAL frat[Nannuli] : scales the rate constants for model geometry
PROCEDURE factors() {
LOCAL r, dr2
r = 1/2 : starts at edge (half diam)
dr2 = r/(Nannuli-1)/2 : full thickness of outermost annulus,
: half thickness of all other annuli
vrat[0] = 0
frat[0] = 2*r
FROM i=0 TO Nannuli-2 {
vrat[i] = vrat[i] + PI*(r-dr2/2)*2*dr2 : interior half
r = r - dr2
frat[i+1] = 2*PI*r/(2*dr2) : outer radius of annulus
: div by distance between centers
r = r - dr2
vrat[i+1] = PI*(r+dr2/2)*2*dr2 : outer half of annulus
}
}
LOCAL dsq, dsqvol : can't define local variable in KINETIC block
: or use in COMPARTMENT statement
KINETIC state {
COMPARTMENT i, diam*diam*vrat[i] {ca CaBuffer Buffer}
COMPARTMENT (1e10)*parea {pump pumpca}
COMPARTMENT volo {cao}
LONGITUDINAL_DIFFUSION i, DCa*diam*diam*vrat[i] {ca}
:pump
~ ca[0] + pump <-> pumpca (k1*parea*(1e10), k2*parea*(1e10))
~ pumpca <-> pump + cao (k3*parea*(1e10), k4*parea*(1e10))
CONSERVE pump + pumpca = TotalPump * parea * (1e10)
ica_pmp = 2*FARADAY*(f_flux - b_flux)/parea
: all currents except pump
: ica is Ca efflux
~ ca[0] << (-(ica - ica_pmp_last)*PI*fact*diam/(2*FARADAY))
FROM i=0 TO Nannuli-2 {
~ ca[i] <-> ca[i+1] (DCa*frat[i+1], DCa*frat[i+1])
}
dsq = diam*diam
FROM i=0 TO Nannuli-1 {
dsqvol = dsq*vrat[i]
~ ca[i] + Buffer[i] <-> CaBuffer[i] (k1buf*dsqvol, k2buf*dsqvol)
}
cai = ca[0]
}
Code: Select all
COMMENT
26 Ago 2002 Modification of original channel to allow variable time step and to correct an initialization error.
Done by Michael Hines(michael.hines@yale.e) and Ruggero Scorcioni(rscorcio@gmu.edu) at EU Advance Course in Computational Neuroscience. Obidos, Portugal
ca.mod
Uses fixed eca instead of GHK eqn
HVA Ca current
Based on Reuveni, Friedman, Amitai and Gutnick (1993) J. Neurosci. 13:
4609-4621.
Author: Zach Mainen, Salk Institute, 1994, zach@salk.edu
ENDCOMMENT
INDEPENDENT {t FROM 0 TO 1 WITH 1 (ms)}
NEURON {
SUFFIX ca
USEION ca READ eca WRITE ica
RANGE m, h, gca, gbar
RANGE minf, hinf, mtau, htau
GLOBAL q10, temp, tadj, vmin, vmax, vshift
}
PARAMETER {
gbar = 0.1 (pS/um2) : 0.12 mho/cm2
vshift = 0 (mV) : voltage shift (affects all)
cao = 2.5 (mM) : external ca concentration
cai (mM)
temp = 23 (degC) : original temp
q10 = 2.3 : temperature sensitivity
v (mV)
dt (ms)
celsius (degC)
vmin = -120 (mV)
vmax = 100 (mV)
}
UNITS {
(mA) = (milliamp)
(mV) = (millivolt)
(pS) = (picosiemens)
(um) = (micron)
FARADAY = (faraday) (coulomb)
R = (k-mole) (joule/degC)
PI = (pi) (1)
}
ASSIGNED {
ica (mA/cm2)
gca (pS/um2)
eca (mV)
minf hinf
mtau (ms) htau (ms)
tadj
}
STATE { m h }
INITIAL {
trates(v+vshift)
m = minf
h = hinf
}
BREAKPOINT {
SOLVE states METHOD cnexp
gca = tadj*gbar*m*m*h
ica = (1e-4) * gca * (v - eca)
}
LOCAL mexp, hexp
:PROCEDURE states() {
: trates(v+vshift)
: m = m + mexp*(minf-m)
: h = h + hexp*(hinf-h)
: VERBATIM
: return 0;
: ENDVERBATIM
:}
DERIVATIVE states {
trates(v+vshift)
m' = (minf-m)/mtau
h' = (hinf-h)/htau
}
PROCEDURE trates(v) {
TABLE minf, hinf, mtau, htau
DEPEND celsius, temp
FROM vmin TO vmax WITH 199
rates(v): not consistently executed from here if usetable == 1
: tinc = -dt * tadj
: mexp = 1 - exp(tinc/mtau)
: hexp = 1 - exp(tinc/htau)
}
PROCEDURE rates(vm) {
LOCAL a, b
tadj = q10^((celsius - temp)/10)
a = 0.055*(-27 - vm)/(exp((-27-vm)/3.8) - 1)
b = 0.94*exp((-75-vm)/17)
mtau = 1/tadj/(a+b)
minf = a/(a+b)
:"h" inactivation
a = 0.000457*exp((-13-vm)/50)
b = 0.0065/(exp((-vm-15)/28) + 1)
htau = 1/tadj/(a+b)
hinf = a/(a+b)
}
FUNCTION efun(z) {
if (fabs(z) < 1e-4) {
efun = 1 - z/2
}else{
efun = z/(exp(z) - 1)
}
}
-
- Site Admin
- Posts: 6384
- Joined: Wed May 18, 2005 4:50 pm
- Location: Yale University School of Medicine
- Contact:
Re: Setting the basal level for Intracellular Calcium Concentrat
The hoc code is much cleaner. One minor problem is that proc init_cell(), which is really part of the "specification of biological properties" (it inserts mechanisms into sections!), is not executed until somewhere in the middle of a bunch of simulation parameter, simulation flow control, and user interface code. init_cell() should really be called before the custom proc init() is defined.
Another is that init_cell() calls ion_style() with a specification of how Ca concentration, reversal potential, etc. that interferes with proper initialization (it tries to force ena to be a constant and prevent Ca concentrations from changing!). This should just be omitted for now. If it turns out that you need eca to have a constant value, let's take care of that later, after Ca concentration is handled properly.
A potentially bigger problem is of my creation: a typographical error in the custom proc init(), which assigns a value to ca0_ca_ion. That should have been cai0_ca_ion.
And the use of an even value for nseg might cause you some difficulties in the future (see
Why should I use an odd value for nseg?
in the FAQ list
http://www.neuron.yale.edu/neuron/faq/general-questions
).
However, after fixing all of these issues, I see that the initial value of cai remains unaffected. Re-reading the code in cdp.mod, especially its INITIAL block, and the related discussion on page 258 of The NEURON block, I wonder if a more complex initialization process is required. It would be easy to change the pump's rate constants to force its "resting cai" to be 116 nM--for any particular resting cai and cao, the pump generates a net flux of 0 when
kf*cap = kr*cao*p
kr*cap = kf*cai*p
where numerical value of k1 = numerical value of k3 = kf
and numerical value of k2 = numerical value of k4 = kr
from which we have
kf = kr*sqrt(cao/cai)
But if one wants to leave the rate constants unchanged and use the membrane's ion channels plus a "constant ca source" to force resting cai to a desired value, the question is how to find the required intensity of the "constant ca source."
I'm going to have to think about this some more.
Another is that init_cell() calls ion_style() with a specification of how Ca concentration, reversal potential, etc. that interferes with proper initialization (it tries to force ena to be a constant and prevent Ca concentrations from changing!). This should just be omitted for now. If it turns out that you need eca to have a constant value, let's take care of that later, after Ca concentration is handled properly.
A potentially bigger problem is of my creation: a typographical error in the custom proc init(), which assigns a value to ca0_ca_ion. That should have been cai0_ca_ion.
And the use of an even value for nseg might cause you some difficulties in the future (see
Why should I use an odd value for nseg?
in the FAQ list
http://www.neuron.yale.edu/neuron/faq/general-questions
).
However, after fixing all of these issues, I see that the initial value of cai remains unaffected. Re-reading the code in cdp.mod, especially its INITIAL block, and the related discussion on page 258 of The NEURON block, I wonder if a more complex initialization process is required. It would be easy to change the pump's rate constants to force its "resting cai" to be 116 nM--for any particular resting cai and cao, the pump generates a net flux of 0 when
kf*cap = kr*cao*p
kr*cap = kf*cai*p
where numerical value of k1 = numerical value of k3 = kf
and numerical value of k2 = numerical value of k4 = kr
from which we have
kf = kr*sqrt(cao/cai)
But if one wants to leave the rate constants unchanged and use the membrane's ion channels plus a "constant ca source" to force resting cai to a desired value, the question is how to find the required intensity of the "constant ca source."
I'm going to have to think about this some more.
Re: Setting the basal level for Intracellular Calcium Concentrat
Thank you Ted for sparing the time to help me out.
Meanwhile, I'll work on the guidelines given by you.
Meanwhile, I'll work on the guidelines given by you.
Re: Setting the basal level for Intracellular Calcium Concentrat
Dear Sir,
Were you able to think out a way of initializing the cai? I tried doing it by adjusting the pump parameters but then the behavior of the model changed a lot from what I wanted it to be.
Regards
Were you able to think out a way of initializing the cai? I tried doing it by adjusting the pump parameters but then the behavior of the model changed a lot from what I wanted it to be.
Regards
Re: Setting the basal level for Intracellular Calcium Concentrat
Dear Sir,
thanks and regards
At the outset I apologise if I am being annoying. But i need to set the basal cai and i am just not able to do so. I would be greatly obliged if you could help me find a way.But if one wants to leave the rate constants unchanged and use the membrane's ion channels plus a "constant ca source" to force resting cai to a desired value, the question is how to find the required intensity of the "constant ca source."
I'm going to have to think about this some more.
thanks and regards
-
- Site Admin
- Posts: 6384
- Joined: Wed May 18, 2005 4:50 pm
- Location: Yale University School of Medicine
- Contact:
Re: Setting the basal level for Intracellular Calcium Concentrat
You're not being annoying. The problem has up to now stymied me. However, I finally think I see a way forward.
There are actually three difficulties to overcome. The first is to get the cdp mechanism to allow cai to be set to a value that differs from the one at which the net pump current is 0; this I have done, but only after many false starts. The second is to properly initialize the buffer concentrations, levels of pump and pumpca, and the current generated by the pump itself; this is taking more cleverness than I expected, partly because the pump's rate constants do not quite satisfy the Michaelis-Menten assumptions (the result is that pump + cai <-> pumpca doesn't replenish pumpca quite as rapidly as pumpca <-> pump + cao depletes it, and this causes a noticeable transient in the initial few ms of operation of the pump following initialization). However, I have an idea that I believe will resolve this problem, and will try it tomorrow. The third difficulty is how to deal with a model that contains other sources of transmembrane ca flux. I think this last can be handled by modifying the initialization to include a brief "initialization run," and maybe taking advantage of SaveState.
There are actually three difficulties to overcome. The first is to get the cdp mechanism to allow cai to be set to a value that differs from the one at which the net pump current is 0; this I have done, but only after many false starts. The second is to properly initialize the buffer concentrations, levels of pump and pumpca, and the current generated by the pump itself; this is taking more cleverness than I expected, partly because the pump's rate constants do not quite satisfy the Michaelis-Menten assumptions (the result is that pump + cai <-> pumpca doesn't replenish pumpca quite as rapidly as pumpca <-> pump + cao depletes it, and this causes a noticeable transient in the initial few ms of operation of the pump following initialization). However, I have an idea that I believe will resolve this problem, and will try it tomorrow. The third difficulty is how to deal with a model that contains other sources of transmembrane ca flux. I think this last can be handled by modifying the initialization to include a brief "initialization run," and maybe taking advantage of SaveState.