Page 1 of 1

Action Potential propagation

Posted: Sun Mar 15, 2020 2:06 pm
by firoozeh
I have 3 questions:
1: Would you please tell me, the model that NEURON uses is always based on cable theory ? Can we have point model of neuron ,too?

2: I wrote this code:
create soma, axon
access soma

soma.nseg = 1
soma.diam = 18.8
soma.L = 18.8
soma.Ra =123.0
soma insert hh
soma psection()
axon.nseg = 1
axon.diam = 18.8
axon.L = 500
axon.Ra =123.0
axon insert hh
axon psection()
connect axon(0),soma(0)

objectvar stim
soma stim = new IClamp(0.5)
stim.del = 100
stim.dur = 100
stim.amp = 1

tstop = 300

and I want to see action potential propagation along the axon, so I plot axon.v(0.1) and axon.v(0.9) and I expected to see a time delay between spikes that I didn't see.
Could you please tell me how can I fix this problem?

3. And my last question is how can I compute intracellular voltage Vi = Vm + Ve ?!


Re: Action Potential propagation

Posted: Sun Mar 15, 2020 6:36 pm
by ramcdougal
1. Point models are fine. If you want biophysical kinetics, just use a section with nseg=1. If you want something more like an integrate-and-fire type cell, use one of the built-in types (e.g. IntFire, IntFire2, IntFire4), find one on ModelDB, or create your own with a MOD file of type ARTIFICIAL_CELL.

2. You set axon.nseg = 1; that means there's only one compartment for the axon, so whether you sample the 0.1 or 0.9 location doesn't matter; you'll still be in the same compartment.

That said, with your model even if you set "axon nseg=101" while you will see a difference between those two locations, it will be very slight. Why? A diameter of 18.8 is quite large and imposes little barrier to current flow. Try reducing the axon diameter to 2 microns and shortening your stimulus to just 1 ms. If you do that with an appropriate nseg, you'll see axon(0.9) follows axon(0.1) by about 1 ms.

As an aside, if you're new to NEURON, I strongly recommend learning Python instead of HOC. You'll find much more documentation on Python than in HOC (both in general and less-so-but-still-true with respect to NEURON), Python is a more broadly applicable skill, and Python offers vastly superior graphics and library support.

Here's a Python version of your code, with the changes as described above:

Code: Select all

import matplotlib.pyplot as plt
from neuron import h
from neuron.units import ms, mV

soma = h.Section(name='soma')
axon = h.Section(name='axon')

soma.nseg = 1
soma.diam = soma.L = 18.8

axon.nseg = 101
axon.diam = 2 
axon.L = 500

stim = h.IClamp(soma(0.5))
stim.delay = 100 * ms
stim.dur = 1 * ms
stim.amp = 0.9

for sec in [soma, axon]:
    sec.Ra = 123

t = h.Vector().record(h._ref_t)
v1 = h.Vector().record(axon(0.1)._ref_v)
v2 = h.Vector().record(axon(0.9)._ref_v)

h.finitialize(-65 * mV)
h.continuerun(300 * ms)

plt.plot(t, v1, label='axon(0.1).v')
plt.plot(t, v2, label='axon(0.9).v')
plt.xlim((99, 110))
plt.xlabel('t (ms)')

Re: Action Potential propagation

Posted: Mon Mar 16, 2020 10:30 am
by firoozeh
Dear Ramcdougal,

Thank you so much for your reply and your recommendations.
Would you please answer my 3rd question, too?
If I insert extracellular to my model, I have extracellular potential, haven't I?
If so, how can I code for intracellular voltage?


Re: Action Potential propagation

Posted: Mon Mar 16, 2020 11:36 am
by ted
See the documentation of extracellular in the Programmer's Reference.
The vext values are all referred to ground, which is assumed to have a potential of 0 mV.

The hoc name for the potential at a point just outside the cell membrane of the currently accessed section is
where x is the normalized distance of the point from the section's 0 end.
But what do you call it in Python? If the Python name of the section is foo, and extracellular has been "inserted" into foo, then the potential adjacent to the external surface of foo at location x is

So the intracellular potential at x, relative to ground, is the sum
foo(x).v + foo(x).vext[0]

You could force recalculation of this value throughout a simulation, but that is slower than capturing the time courses of foo(x).v and foo(x).vext[0] to a pair of Vectors during a simulation and then summing the vectors after the end of the simulation. For example, assuming that foov and foovext are the Python names for the Vectors that capture the time course of foo(x).v and foo(x).vext[0],

Code: Select all # executes a simulation
vintracell = foov + foovext # vintracell now contains the time course
  # of intracellular potential at foo(x)
Read the Programmer's Reference entry about the Vector class's record() method. By the way, it's also a good idea to capture the time values h.t to another Vector.