Sinusoidal extracellular stimulation
Sinusoidal extracellular stimulation
Hello everyone,
I built a model using Neuron and would like to use an extracellular electrode and apply a sinusoidal stimulating current. I read the extracellular mechanism and it seams like I would want to set vext[n] = rho*Iext(t)/(4*pi*(X^2 + (L*(n11))^2)^(.5)) where rho is the external resistivity, X is the distance from the axon to the electrode (at a 90 degree angle), L is the internodal length, and Iext(t) is my stimulating current (this is for an axon with 21 nodes). Is it OK if I declare my Iext(t) = amp * sin(2*PI*(t)*f*) as a variable in my hoc file and then insert extracellular and set vext[n] equal to the equation above? I do not think that I understand this mechanism very well. This is my first time using neuron and would greatly appreciate any suggestions.
Thank you!
I built a model using Neuron and would like to use an extracellular electrode and apply a sinusoidal stimulating current. I read the extracellular mechanism and it seams like I would want to set vext[n] = rho*Iext(t)/(4*pi*(X^2 + (L*(n11))^2)^(.5)) where rho is the external resistivity, X is the distance from the axon to the electrode (at a 90 degree angle), L is the internodal length, and Iext(t) is my stimulating current (this is for an axon with 21 nodes). Is it OK if I declare my Iext(t) = amp * sin(2*PI*(t)*f*) as a variable in my hoc file and then insert extracellular and set vext[n] equal to the equation above? I do not think that I understand this mechanism very well. This is my first time using neuron and would greatly appreciate any suggestions.
Thank you!
Re: Sinusoidal extracellular stimulation
I now understand that vext[n] is not the external voltage at each node. Also, I believe that I have to write an extra mod file for my sinusoidal stimulation and add it as a point process? I found a file called fsin.mod that does this but I am not sure how to deal with the pointer x. I would define the values for f, amp, del, and n in my hoc file right? But then there is also the xtra.mod file that works with the extracellular mechanism and I am confused about the different pointers and how to tie it all together.

 Site Admin
 Posts: 5810
 Joined: Wed May 18, 2005 4:50 pm
 Location: Yale University School of Medicine
 Contact:
Re: Sinusoidal extracellular stimulation
A bit of clarification appears to be in order.
The word "node" is ambiguous in this context. Must distinguish between "node of Ranvier" (if your axon is myelinated) and "node as a discrete point in space at which NEURON computes the local potential." Which did you have in mind when writing "vext[n]"? In the following comments I use "node" without other qualifications to refer to the latter, and "node of Ranvier" to refer to the former.bee wrote:I now understand that vext[n] is not the external voltage at each node.
The question is: how to make potential at extracellular nodes follow the desired time course. One could literally insert hoc statements into the main computational loop that would, at every time step, evaluate the sine function, then loop over all extracellular nodes, one at a time, computing the product of the sine value and an appropriate scale factor and storing the result in v at this node. This would be much slower than necessary, and it would also be incompatible with adaptive integration.Also, I believe that I have to write an extra mod file for my sinusoidal stimulation and add it as a point process?
Presumably you refer to http://www.neuron.yale.edu/ftp/ted/neuron/fsin.mod. Be sure to follow the instructions in its header with regard to order of compilation of mod files.I found a file called fsin.mod
Time to review what the Programmer's Reference says about setpointer. Also look for other examples of setpointer usage in the hoc files that accompanied xtra.mod. Then realize that it's mercifully simpler than you thought, because is_xtra is GLOBAL  which means you only need one instance of the Fsin class and just one setpointer statement to link its x variable to is_xtra.I am not sure how to deal with the pointer x.
Code: Select all
objref fsin
soma fsin = new Fsin(0.5)
setpointer fsin.x, is_xtra
True.I would define the values for f, amp, del, and n in my hoc file right?
There is no change in how xtra's im and ex POINTER variables are dealt with. The only new thing is the Fsin object and its x POINTER. I know it seems kind of mindbending the first time, if not migraine inducing, but it's really not that bad.But then there is also the xtra.mod file that works with the extracellular mechanism and I am confused about the different pointers
Re: Sinusoidal extracellular stimulation
Hello Ted,
Thank you so much for replying.
Here is the section of the code where I try to calculate each voltage
for i=0, 20 {
node{
iext = amp * sin(2*PI*(tdel)*f*(0.001))
v(i) = rhoa*iext/(4*PI*(X1^2+(L*(i11)^2)^.5)
insert extracellular e_extracellular(i) = v(i) }
}
would something like that work? I tried compiling but got an error: range variable domain is 0<=x<=1
I am now going through all the other variables to try to figure out what is wrong
Thank you so much for replying.
I meant node of ranvier on a myelinated axonted wrote:The word "node" is ambiguous in this context. Must distinguish between "node of Ranvier" (if your axon is myelinated) and "node as a discrete point in space at which NEURON computes the local potential." Which did you have in mind when writing "vext[n]"? .
For now I decided to start by calculating the extracellular voltage at each of the nodes of ranvier and then possibly start messing around with the mod files later.ted wrote:how to make potential at extracellular nodes follow the desired time course. One could literally insert hoc statements into the main computational loop that would, at every time step, evaluate the sine function, then loop over all extracellular nodes, one at a time, computing the product of the sine value and an appropriate scale factor and storing the result in v at this node.
Here is the section of the code where I try to calculate each voltage
for i=0, 20 {
node{
iext = amp * sin(2*PI*(tdel)*f*(0.001))
v(i) = rhoa*iext/(4*PI*(X1^2+(L*(i11)^2)^.5)
insert extracellular e_extracellular(i) = v(i) }
}
would something like that work? I tried compiling but got an error: range variable domain is 0<=x<=1
I am now going through all the other variables to try to figure out what is wrong
Re: Sinusoidal extracellular stimulation
When I comment out
e_extracellular(i) = v(i)
it works just fine. But then I am not setting the extracellular potential to the value I calculated. Am I using e_extracellular the wrong way?
e_extracellular(i) = v(i)
it works just fine. But then I am not setting the extracellular potential to the value I calculated. Am I using e_extracellular the wrong way?

 Site Admin
 Posts: 5810
 Joined: Wed May 18, 2005 4:50 pm
 Location: Yale University School of Medicine
 Contact:
Re: Sinusoidal extracellular stimulation
The problem to be overcome is how to make each e_extracellular follow the desired time course throughout the simulation. Any code you plan to use for that purpose will have to be executed at each fadvance(). An efficient way to implement a sinusoidally fluctuating field is to use Fsin and xtra, and to use a setpointer statement to link Fsin's x variable to xtra's is variable. It doesn't get simpler than that.
Re: Sinusoidal extracellular stimulation
Hello again,
I got busy and was not able to work on this for a while but I am giving it another try. I used a setpointer statement to link Fsin's x variable to xtra's is variable like you suggested
objref fsin
soma fsin = new Fsin(0.5)
setpointer fsin.x, is_xtra
I was able to compile, however when I try to run the program it complains about the last line:
setpointer fsin.x, is_xtra
It is hard to get going since I have not looked at this in a while. I made sure I had all the MOD files in the same folder and am trying to figure out what is wrong but any insight in the meantime would be appreciated.
I got busy and was not able to work on this for a while but I am giving it another try. I used a setpointer statement to link Fsin's x variable to xtra's is variable like you suggested
objref fsin
soma fsin = new Fsin(0.5)
setpointer fsin.x, is_xtra
I was able to compile, however when I try to run the program it complains about the last line:
setpointer fsin.x, is_xtra
It is hard to get going since I have not looked at this in a while. I made sure I had all the MOD files in the same folder and am trying to figure out what is wrong but any insight in the meantime would be appreciated.

 Site Admin
 Posts: 5810
 Joined: Wed May 18, 2005 4:50 pm
 Location: Yale University School of Medicine
 Contact:
Re: Sinusoidal extracellular stimulation
If you insert xtra into a section, each internal node of that section has a separate instance of the xtra mechanism, and that instance of xtra has its own ex POINTER which must be linked to the e_extracellular variable at that node's location. I use a procedure to do this, right after model setup is complete.If you do anything that affects nseg in any section that has the xtra mechanism, or changes cell geometry, it is necessary to execute setpointers() again.
Code: Select all
proc setpointers() {
grindaway() // in interpxyz.hoc, determines interpolated locations of nodes
forall {
if (ismembrane("xtra")) {
for (x, 0) { // iterate over each internal node
setpointer im_xtra(x), i_membrane(x)
setpointer ex_xtra(x), e_extracellular(x)
}
}
}
}
setpointers()
Re: Sinusoidal extracellular stimulation
Instead of using all the given files for extracellular stimulation I am trying to write my own code because I think that is the only way I will really understand it, so instead of inserting an extracellular mechanism I am going to try to insert the equivalent current intracellularly. I am still going to use the fsin.mod file to generate the input pulse but I will then use that to calculate the potential at each of the nodes and then use that to calculate the intracellular current to be injected at each node. I have a few questions. How do I keep track of the timing in the hoc file?
I added the following code in my hoc file
proc voltages() {
objref fsin
objref Iext
node fsin = new Fsin(.5)
setpointer fsin.x, Iext
objref Ve
Ve = new Vector(21,0)
objref stim
stim = new Vector(21,0)
for i=0,20 {
Ve.x = rhoa*Iext/(4*PI*(X1^2+(L*(i11))^2)^.5)
}
for i =1,19 {
stim.x = Ve.x[i1]2*Ve.x + Ve.x[i+1]
}
}
voltages()
First, it says I have a syntax error in the lines:
node fsin = new Fsin(.5)
setpointer fsin.x, Iext
I am also not sure if I am using the vectors correctly. If all of that was working, how can I make the hoc file calculate the new Ve's and stim's as Iext changes with time?
I added the following code in my hoc file
proc voltages() {
objref fsin
objref Iext
node fsin = new Fsin(.5)
setpointer fsin.x, Iext
objref Ve
Ve = new Vector(21,0)
objref stim
stim = new Vector(21,0)
for i=0,20 {
Ve.x = rhoa*Iext/(4*PI*(X1^2+(L*(i11))^2)^.5)
}
for i =1,19 {
stim.x = Ve.x[i1]2*Ve.x + Ve.x[i+1]
}
}
voltages()
First, it says I have a syntax error in the lines:
node fsin = new Fsin(.5)
setpointer fsin.x, Iext
I am also not sure if I am using the vectors correctly. If all of that was working, how can I make the hoc file calculate the new Ve's and stim's as Iext changes with time?
Re: Sinusoidal extracellular stimulation
The reason why I got a syntax error for the following lines:
node fsin = new Fsin(.5)
setpointer fsin.x, Iext
is because I declared objref fsin inside of a proc
My program compiles and runs now without any error messages but when I plot the transmembrane voltage nothing happens. Right now I am just injecting the equivalent intracellular current from the extracellular stimulus into one of the nodes to see if it works. If it works with one then I will add the others. I modified NEURON block in fsin.mod like this:
NEURON {
POINT_PROCESS fsin
RANGE Ve1, Ve2, Ve3, stim2, del, f, amp, n
ELECTRODE_CURRENT stim2
}
I also added two other sections:
PROCEDURE settables (x) {
Ve1 = rhoa*x/(4*PI*(X1^2+(L*(011))^2)^.5)
Ve2 = rhoa*x/(4*PI*(X1^2+(L*(111))^2)^.5)
Ve3 = rhoa*x/(4*PI*(X1^2+(L*(211))^2)^.5)
}
BREAKPOINT {
stim2 = Ve12*Ve2 + Ve3
}
and in my hoc file I added this:
objref volt
proc voltages() {
node[2] volt = new Istim(.5)
}
voltages()
I thought this way the current calculated in fsin.mod would be injected into node 2 of my model but when I run the process nothing happens. Any ideas?
Thank you!
node fsin = new Fsin(.5)
setpointer fsin.x, Iext
is because I declared objref fsin inside of a proc
My program compiles and runs now without any error messages but when I plot the transmembrane voltage nothing happens. Right now I am just injecting the equivalent intracellular current from the extracellular stimulus into one of the nodes to see if it works. If it works with one then I will add the others. I modified NEURON block in fsin.mod like this:
NEURON {
POINT_PROCESS fsin
RANGE Ve1, Ve2, Ve3, stim2, del, f, amp, n
ELECTRODE_CURRENT stim2
}
I also added two other sections:
PROCEDURE settables (x) {
Ve1 = rhoa*x/(4*PI*(X1^2+(L*(011))^2)^.5)
Ve2 = rhoa*x/(4*PI*(X1^2+(L*(111))^2)^.5)
Ve3 = rhoa*x/(4*PI*(X1^2+(L*(211))^2)^.5)
}
BREAKPOINT {
stim2 = Ve12*Ve2 + Ve3
}
and in my hoc file I added this:
objref volt
proc voltages() {
node[2] volt = new Istim(.5)
}
voltages()
I thought this way the current calculated in fsin.mod would be injected into node 2 of my model but when I run the process nothing happens. Any ideas?
Thank you!

 Site Admin
 Posts: 5810
 Joined: Wed May 18, 2005 4:50 pm
 Location: Yale University School of Medicine
 Contact:
Re: Sinusoidal extracellular stimulation
I don't understand this question. During a simulation, NEURON's run control system automatically advances t from whatever the start time is until t reaches the value specified by tstop.bee wrote:How do I keep track of the timing in the hoc file?
Iext is a NULLobject. What good does setpointer do if Iext is a NULLobject?. . .Code: Select all
proc voltages() { objref fsin objref Iext node fsin = new Fsin(.5) setpointer fsin.x, Iext . . .
First, it says I have a syntax error in the lines:Code: Select all
node fsin = new Fsin(.5) setpointer fsin.x, Iext
You need a custom proc advance(). Have you read chapter 7 of The NEURON Book, specifically the discussion of the standard run system? You need to define a proc advance() of the formI am also not sure if I am using the vectors correctly. If all of that was working, how can I make the hoc file calculate the new Ve's and stim's as Iext changes with time?
Code: Select all
proc advance() {
. . . statement(s) to be executed before calling fadvance() . . .
fadvance()
}

 Site Admin
 Posts: 5810
 Joined: Wed May 18, 2005 4:50 pm
 Location: Yale University School of Medicine
 Contact:
Re: Sinusoidal extracellular stimulation
What is Iext? If it's a NULLobject, the setpointer statement will do nothing useful.bee wrote:The reason why I got a syntax error for the following lines:
node fsin = new Fsin(.5)
setpointer fsin.x, Iext
Suggest you test everything you have done to verify that it works as you expected. Assume that nothing works properly.when I run the process nothing happens. Any ideas?
What is Istim? Have you verified that an Istim works the way you think it should work? What do you think your changes to fsin have accomplished? Did they in fact accomplish what you expected?I modified NEURON block in fsin.mod like this:I also added two other sections:Code: Select all
NEURON { POINT_PROCESS fsin RANGE Ve1, Ve2, Ve3, stim2, del, f, amp, n ELECTRODE_CURRENT stim2 }
and in my hoc file I added this:Code: Select all
PROCEDURE settables (x) { Ve1 = rhoa*x/(4*PI*(X1^2+(L*(011))^2)^.5) Ve2 = rhoa*x/(4*PI*(X1^2+(L*(111))^2)^.5) Ve3 = rhoa*x/(4*PI*(X1^2+(L*(211))^2)^.5) } BREAKPOINT { stim2 = Ve12*Ve2 + Ve3 }
Code: Select all
objref volt proc voltages() { node[2] volt = new Istim(.5) } voltages()
When developing something more or less de novo, it's best to proceed in small steps, making only one change at a time and verifying that every change works as expected.