intracellular sodium

NMODL and the Channel Builder.
Post Reply
jamie

intracellular sodium

Post by jamie »

Below is a mechanism for intracellular sodium ion accumulation (it doesn't account for the whole of the intracellular - just a sub-membrane space).

At the moment it has a source description for nai - sodium coming into the cell through channels increases nai. I wonder how I would modify this mechanism to add a decay term such that the nai in this submembrane space has both a source and a sink term. Where source and sink are:

source = sodium coming into the cell
sink = sodium moving out of this submembrane space out out into the bulk cytoplasm where we can forget about it.

It would be great if the sink term could have some parameter that I could play with to set the rate of sink.

Code: Select all


TITLE Sodium ion accumulation
: Intracellular sodium ion accumulation 

NEURON {
	SUFFIX Na_acc
	USEION na READ ina,nai WRITE nai
	RANGE Vi, Naneutral : electroneutral sodium accumulation
}

UNITS {
	
	(mV) = (millivolt)
	(um) = (micron)
	(mM) = (milli/liter)
	(mA) = (milliamp)
	F = (faraday) (coulombs)
}

PARAMETER {
	Naneutral   =  3e-5    (mA/cm2)   <0,1e6>
	Vi = 13668e-12 (cm3)
	ina		(mA/cm2)
	
          
}

STATE {
	nai START 9.19	(mM)
	
}

LOCAL ViF
INITIAL {
	VERBATIM

	nai = _ion_nai;
	
	ENDVERBATIM
	ViF = F*Vi*2e4
}

BREAKPOINT {
	SOLVE state METHOD derivimplicit
}

DERIVATIVE state {
	nai' = -(ina-Naneutral)/(ViF) 
}


This is an alternative sodium accumulation mechanism that we could perhaps adjust if this one is any easier:

Code: Select all



COMMENT
Longitudinal diffusion of sodium (no buffering)
(equivalent modified euler with standard method and
equivalent to diagonalized linear solver with CVODE )
ENDCOMMENT

NEURON {
	SUFFIX nadifl
	USEION na READ ina WRITE nai
	RANGE D
}

UNITS {
	(mM) = (milli/liter)
	(um) = (micron)
	FARADAY = (faraday) (coulomb)
	PI = (pi) (1)
}

PARAMETER {
	D = .6 (um2/ms)
}

ASSIGNED {
	ina (milliamp/cm2)
	diam (um)
}

STATE {
	nai (mM)
}

BREAKPOINT {
	SOLVE conc METHOD sparse
}

KINETIC conc {
	COMPARTMENT PI*diam*diam/4 {nai}
	LONGITUDINAL_DIFFUSION D {nai}
	~ nai << (-ina/(FARADAY)*PI*diam*(1e4))
}


ted
Site Admin
Posts: 6384
Joined: Wed May 18, 2005 4:50 pm
Location: Yale University School of Medicine
Contact:

Post by ted »

First a word about attributed re-use of source code. When borrowing source code, it is
appropriate to say where it came from. There are two reasons for this. First, all model
source code has a context in which it was developed--an empirical basis for the assumptions
that are embodied in the code--and it can be helpful to know what that context is, when one
evaluates the code. Second--or perhaps first--it is a reasonable courtesy to the authors of
the code to credit them for it.

Now for comments about these particular mechanisms.

The Na_acc mechanism's code is from the nacum.mod file that is part of the atrial
action potential model in ModelDB, originally by Courtemanche et al. and subsequently
implemented for NEURON by Ingemar Jacobson; see
http://senselab.med.yale.edu/senselab/m ... model=3800

The nadifl mechanism is from the nadifl.mod file that is part of the nigral dopaminergic cell
model in ModelDB, by Carmen Canavier; see
http://senselab.med.yale.edu/senselab/m ... model=6763
Below is a mechanism for intracellular sodium ion accumulation (it doesn't account for the whole of the intracellular - just a sub-membrane space).
There is no way to infer the presumed geometry from Na_acc's source code. Only by
reading the original paper will it be possible to tell if this particular code assumes a
"shell surrounding a core". But here is what _can_ be discerned from the code: Na_acc
is typical of many ion accumulation models that were initially developed with a general
purpose programming language, and subsequently reimplemented for NEURON, in that
it assumes that the volume of distribution is fixed, i.e. independent of length or diameter
of the cell (note PARAMETER Vi is in units of (cm3)). This is OK in that it works for the
original purpose for which it was designed (i.e. as a component of a model of an atrial
cell), but it DOES NOT GENERALIZE to cells that are of a different physical size and
shape. Also note that there is no parameter that specifies the resting sodium
concentration; instead there is an "Naneutral" parameter that has units of current
density, and which bears only an indirect and complex relationship to resting nai. This
works for this particular mechanism in its original application, but it does not generalize,
and it is inconsistent with "best practices" in the NEURON simulation environment.

nadifl suffers from none of these shortcomings. The volume of distribution for nai is the
entire volume of the cell--PI*diam*diam/4 is the volume per unit length of a cylinder--and
PI*diam is the surface area per unit lengh of a cylinder (ina/(FARADAY)*PI*diam is the
same as ina*PI*diam/(FARADAY), just written in a way that confuses human beings
but does not confuse hoc). So this mechanism takes cell geometry into account properly.

nadifl includes longitudinal diffusion, which you did not ask about--does your model really
need that bit of complexity? The mechanism would execute a bit more quickly without
longitudinal diffusion, which can be eliminated by merely commenting out the line
LONGITUDINAL_DIFFUSION D {nai}
and recompiling.

nadifl does not involve a pump. Carmen's model factored the pump into a separate
mechanism, called pump and specified in pump.mod. pump transports both na and k
and is electrogenic. You need to decide if that's what you want, or if you need to modify
it (remove k transport, and/or make it electrically neutral).
jamie

Post by jamie »

Sorry, yes, it would have been helpful and right to put where I cut and paste the coding from. What is missing from those accumulation code pieces is a "sink" term to nai. Which can perhaps be thought of as "radial diffusion" away from the membrane - radial diffusion out of nai. Thanks to steve from Salk who referred me to this mechanism in modeldb:

http://senselab.med.yale.edu/senselab/m ... difusl.mod

So, I have adapted it to use na instead of ca and I cut and paste this below.

However, my remaining problem is that I would like some parameter that I can access to control the rate/degree of radial diffusion. And I cannot see such a fulcrum parameter in the mechanism. Perhaps Dfree? I have played with DFree and this doesn't seem to change anything in my modelling. I would be very grateful to anyone that can suggest a parameter to play with.

Code: Select all


TITLE Calcium ion accumulation with longitudinal and radial diffusion

: The internal coordinate system is set up in PROCEDURE coord_cadifus()
: The scale factors set up in this procedure do not have to be recomputed
: when diam or DFree are changed.
: The amount of calcium in an annulus is ca[i]*diam^2*vol[i] with
: ca[0] being the second order correct concentration at the exact edge
: and ca[NANN-1] being the concentration at the exact center

NEURON {
	SUFFIX stevefour
	USEION na READ nai, ina WRITE nai
	RANGE inabar
	GLOBAL vol, Buffer0
}

DEFINE NANN  4

UNITS {
	(molar) = (1/liter)
	(mM)	= (millimolar)
	(um)	= (micron)
	(mA)	= (milliamp)
	FARADAY = (faraday)	 (10000 coulomb)
	PI	= (pi) (1)
}

PARAMETER {
	DFree =  6   :  .6	(um2/ms)
	diam		(um)
	nio		(mM)
	ina		(mA/cm2)
	k1buf		(/mM-ms)
	k2buf		(/ms)
	inabar		(mA/cm2)
}

ASSIGNED {
	nai		(mM)
	vol[NANN]	(1)	: gets extra cm2 when multiplied by diam^2
}

STATE {
	na[NANN]	(mM) : ca[0] is equivalent to cai
	naBuffer[NANN]  (mM)
	Buffer[NANN]    (mM)
}

BREAKPOINT {
	SOLVE state METHOD sparse
	ina = inabar
}

LOCAL coord_done

INITIAL {
	if (coord_done == 0) {
		coord_done = 1
		coord()
	}
	: note Buffer gets set to Buffer0 automatically
	: and CaBuffer gets set to 0 (Default value of CaBuffer0) as well
	FROM i=0 TO NANN-1 {
		na[i] = nai
	}
}

LOCAL frat[NANN] 	: gets extra cm when multiplied by diam

PROCEDURE coord() {
	LOCAL r, dr2
	: cylindrical coordinate system  with constant annuli thickness to
	: center of cell. Note however that the first annulus is half thickness
	: so that the concentration is second order correct spatially at
	: the membrane or exact edge of the cell.
	: note ca[0] is at edge of cell
	:      ca[NANN-1] is at center of cell
	r = 1/2					:starts at edge (half diam)
	dr2 = r/(NANN-1)/2			:half thickness of annulus
	vol[0] = 0
	frat[0] = 2*r
	FROM i=0 TO NANN-2 {
		vol[i] = vol[i] + PI*(r-dr2/2)*2*dr2	:interior half
		r = r - dr2
		frat[i+1] = 2*PI*r/(2*dr2)	:exterior edge of annulus
					: divided by distance between centers
		r = r - dr2
		vol[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
KINETIC state {
	COMPARTMENT i, diam*diam*vol[i] {na naBuffer Buffer}
	LONGITUDINAL_DIFFUSION j, DFree*diam*diam*vol[j] {na}
	~ na[0] << (-ina*PI*diam*frat[0]/(2*FARADAY))
	FROM i=0 TO NANN-2 {
		~ na[i] <-> na[i+1] (DFree*frat[i+1], DFree*frat[i+1])
	}
	dsq = diam*diam
	FROM i=0 TO NANN-1 {
		dsqvol = dsq*vol[i]
		~ na[i] + Buffer[i] <-> naBuffer[i] (k1buf*dsqvol,k2buf*dsqvol)
	}
	nai = na[0]
}

ted
Site Admin
Posts: 6384
Joined: Wed May 18, 2005 4:50 pm
Location: Yale University School of Medicine
Contact:

Post by ted »

jamie wrote:Thanks to steve from Salk who referred me to this mechanism in modeldb:

http://senselab.med.yale.edu/senselab/m ... difusl.mod

So, I have adapted it to use na instead of ca and I cut and paste this below.
Close examination reveals that the file in ModelDB is an imperfect modification of cadif.mod,
which is one of the example files that are distributed with NEURON--it's
share/examples/nrniv/nmodl/cadif.mod
if you have expanded the gzipped tar file of the source code, or if you're using MSWin it's
c:\nrnxx\examples\nrniv\nmodl\cadif.mod
The problem with the file in ModelDB is that it doesn't initialize cai or free or Ca-bound
buffer concentrations properly. It also contains several "junk" (purposeless or unused)
variables and statements.
What is missing from those accumulation code pieces is a "sink" term to nai. Which can perhaps be thought of as "radial diffusion" away from the membrane - radial diffusion out of nai.
Are you sure your model needs radial diffusion of Na? nai is so large to begin with, and
Na diffuses so quickly, that (1) concentration near the membrane barely changes even
during a spike, and (2) any such changes are rapidly dissipated.
However, my remaining problem is that I would like some parameter that I can access to control the rate/degree of radial diffusion. And I cannot see such a fulcrum parameter in the mechanism.
The diffusion constant, which could just as well be called D rather than Dfree because
Na isn't buffered.
I have played with DFree and this doesn't seem to change anything in my modelling.
Perhaps because of the reasons that I mentioned above, i.e. resting nai is huge
compared to the changes that are produced by ina, and Na moves quickly. Maybe your
model is telling you that radial diffusion of Na does not need to be represented.
jamie

Post by jamie »

Before I digest your last post Ted. Would just like to add that I have tried this rational from steve at Salk - this strategy to increase amount of radial diffusion:

~ na + Buffer <-> naBuffer (k1buf*dsqvol,k2buf*dsqvol)

K1buf and k2buf must be rate constants controlling the forward and backward reactions. Suggestion would be to try changing the values of k1buf and k2buf (specifically, increasing k1 and/or decreasing k2).

So, I set these parameters as the following to start with:

k1buf = 500 (/mM-ms)
k2buf = 0.5 (/ms)

And then did tinkering with them. But manipulating these had no real positive effect on the modelling.

So, now I will start thinking about your last post Ted. Just thought would put this up as well - put it up ASAP so you can see what I have been up to on this. In case it holds any interest.
ted
Site Admin
Posts: 6384
Joined: Wed May 18, 2005 4:50 pm
Location: Yale University School of Medicine
Contact:

Post by ted »

Oops--focussing on the source code for the Ca diffusion + buffering mechanism in
ModelDB, I failed to apply similar scrutiny to your modification of it. Now that you ask, I see
that this
~ na + Buffer <-> naBuffer (k1buf*dsqvol,k2buf*dsqvol)
has no empirical basis, unless a cytoplasmic buffer for Na has been discovered while
nobody was looking.

Complete nonsense, of course. Everything that pertains to Na buffering should be
eliminated.
Post Reply