Page 1 of 1

Changing NEURON's default units

Posted: Tue Apr 03, 2012 5:41 pm
by sgratiy
It seems that the NMODL allows to change some units but not the other. I have read the units tutorial http://www.neuron.yale.edu/neuron/stati ... units.html but I am still confused. For instance, I was able to changed the units of conductance g to (mS/cm2), however, I cannot change the units of ik to (microamp/cm2). The modlunit complains that the ik must be in (milliamp/cm2). Why can't I control the units of distributed current? I prefer measuring distributed current in milliamp/cm2. Is it possible to do?

Below is the NEURON block for the my mechanism:

Code: Select all

NEURON {
	SUFFIX SK
	USEION k READ ek WRITE ik	
	USEION ca READ cai
	RANGE gbar, g, ik
}
Thanks in advance.

Re: Changing NEURON's default units

Posted: Wed Apr 04, 2012 12:49 pm
by ted
sgratiy wrote:I was able to changed the units of conductance g to (mS/cm2), however, I cannot change the units of ik to (microamp/cm2). The modlunit complains that the ik must be in (milliamp/cm2). Why can't I control the units of distributed current? I prefer measuring distributed current in milliamp/cm2. Is it possible to do?
The units that NEURON assumes for time, membrane potential, ionic equilibrium potentials, current density, etc. are what they are so that users can write code without always having to be concerned about scale factors--as long as they stick with the standard units that NEURON assumes.

That said, if you want some parameter or variable to use some other units, it is very easy to do so. Let's consider the example of your sk mechanism.

(by the way, I would prefer to use lower case rather than upper case for the mechanism's name, because I like to follow the convention of reserving upper case names for object classes, and density mechanisms are not object classes)

Code: Select all

NEURON {
	SUFFIX SK
	USEION k READ ek WRITE ik	
	USEION ca READ cai
	RANGE gbar, g, ik
}
Since this is a density mechanism, the current ik will be in units of mA/cm2. Since you changed the units of g to mS/cm2, your BREAKPOINT block has an assignment statement similar to this:
ik = (1e-3)*g*(v-ek)

But you want to refer to this mechanism's current with a variable whose units are microamp/cm2. Very easy: insert the following statements into your mod file--

In the NEURON block
RANGE i
In the ASSIGNED block
i (microamp/cm2)

In the BREAKPOINT block change
ik = (1e-3)*g*(v-ek)
to

Code: Select all

: ik = (1e-3)*g*(v-ek)
i = g*(v-ek)
ik = (1e-3)*i
Then the hoc name for your current in microamp/cm2 will be i_sk. Which is easier to write than ik_sk, and besides, who needs to be reminded that an sk current is a potassium current?

One more comment:
If I had to type
(microamp/cm2)
more than one time, I'd probably add this statement
(uA) = (microamp)
to the UNITS block
and then I'd be able to type
(uA/cm2)
whenever necessary.

Re: Changing NEURON's default units

Posted: Wed Apr 04, 2012 8:26 pm
by sgratiy
Ted, thanks for a quick response. This is a very nice and cleaver solution to my problem. However, I decided that since the units of distributed current and conductance cannot be easily changed throughout the NEURON, it would be best to avoid introducing custom units for some currents. Future user of my code may attempt to subtract i_sk (uA/cm2) from ik (mA/cm2) without knowing that they have different units. Anyway, thanks for explaining this to me. This is one more example where it is best not to temper with the tradition.