Deliver a Proportion of Presynaptic Spikes to Postsynapse

NMODL and the Channel Builder.
Post Reply
henrychen1986
Posts: 15
Joined: Wed Nov 25, 2009 7:07 pm

Deliver a Proportion of Presynaptic Spikes to Postsynapse

Post by henrychen1986 »

Hi,

Is there any build-in function in NEURON can deliver a proportion of presynaptic spikes to postsynapse?

For example:
When the ratio P = 50%
Presynase output: ______||||||||_____
Postsynapse input: _____|_|_|_|______

When the ratio P = 25%
Presynase output: ______||||||||_____
Postsynapse input: _____|___|________

Thanks in advance!

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

Re: Deliver a Proportion of Presynaptic Spikes to Postsynapse

Post by ted »

henrychen1986 wrote:Is there any build-in function in NEURON can deliver a proportion of presynaptic spikes to postsynapse?
No.

You could implement an approximate "pass every Nth event" function with an IntFire1 artificial spiking cell that has tau=1e9 and is driven by a NetCon whose weight just slightly larger than 1/N.* This would work well for events that arrive at intervals much smaller than 1e9, but if very long ISIs are anticipated, it wouldn't be hard to create an IntFire0 class whose membrane state does not decay at all between events.

*--Setting the weight to 1/N may result in failures because of roundoff error. If we make the weight just a bit larger than 1/N, we can be assured that N input events will trigger an output, but N-1 will not. How big should the weight be? We want
(N-1)w < 1
and
Nw > 1
so
1/N < w < 1/(N-1)
This will be satisfied if we set w to any value in the range 1/N ... 1/(N-1), so just set w at or near the middle of that range.
w = 0.5*(1/N + 1/(N-1)) = (1/N)*(1 + 0.5/(N-1)) ~ (1/N)*(1 + 0.5/N)
henrychen1986
Posts: 15
Joined: Wed Nov 25, 2009 7:07 pm

Re: Deliver a Proportion of Presynaptic Spikes to Postsynapse

Post by henrychen1986 »

Thank you so much Ted!
This method works fine to me.
Finally, i built a template for this feature. I share it here. Please let me know if there any mistakes.
Thanks again!

Code: Select all

//"PRelease.hoc"
//Proportional Release Property
//
//	Usage:
//		load_file("PRelease.hoc")
//		...
//		objref PostStim
//		PostStim = new PRelease(Source,Ratio,Threshold1)
//		objref NetCon0
//		NetCon0 = new NetCon(PostStim.OutStim,...)
//
//by Henry Chen
//public.henry@gmail.com
//Apr 20,2010

begintemplate PRelease
public Source,TempIntFire,OutStim,TempNetCon0,TempNetCon1,TempNetCon2
objref Source,TempIntFire,OutStim,TempNetCon0,TempNetCon1,TempNetCon2

 proc init() {
	Source = $o1	
   	Ratio = $2
	Threshold1 = $3

	Wgt = Ratio*1.00001
	Thrsd = 1-(1e-9)

	TempIntFire = new IntFire1()
	TempIntFire.tau = 1e9
	TempIntFire.refrac = 1
	TempIntFire.m = 0

	OutStim = new IntFire1()
	OutStim.tau = 0
	OutStim.refrac = 1
	OutStim.m = 0

	TempNetCon0 = new NetCon(Source,TempIntFire,Threshold1,0,Wgt)
	TempNetCon1 = new NetCon(TempIntFire,OutStim,Thrsd,0,2)
	TempNetCon2 = new NetCon(TempIntFire,OutStim,Thrsd,0.001,1)
 }
endtemplate PRelease
ted
Site Admin
Posts: 6299
Joined: Wed May 18, 2005 4:50 pm
Location: Yale University School of Medicine
Contact:

Re: Deliver a Proportion of Presynaptic Spikes to Postsynapse

Post by ted »

Here's a big one: NetCon threshold has no effect when attached to an artificial spiking cell that uses net_event to produce output events, as NEURON's built-in IntFire1, IntFire2, and IntFire4 do. The reason is that such artificial spiking cells perform their own test for threshold crossing in their NET_RECEIVE block.
henrychen1986
Posts: 15
Joined: Wed Nov 25, 2009 7:07 pm

Re: Deliver a Proportion of Presynaptic Spikes to Postsynapse

Post by henrychen1986 »

ted wrote:Here's a big one: NetCon threshold has no effect when attached to an artificial spiking cell that uses net_event to produce output events, as NEURON's built-in IntFire1, IntFire2, and IntFire4 do. The reason is that such artificial spiking cells perform their own test for threshold crossing in their NET_RECEIVE block.
That's interesting...
There is threshold crossing test inside the IntFire1,2,4. So do you mean no matter what the threshold value I set to the NetCon, the response of the IntFire will be the same?

If the source of the TempNetCon0 in my code is membrane voltage from a cell, ranged from -65 mV to 25 mV. What is the best way to assign a threshold as -10mV?

Thanks!

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

Re: Deliver a Proportion of Presynaptic Spikes to Postsynapse

Post by ted »

What I meant to write was this:
"NetCon threshold has no effect when the 'spike source' (presynaptic cell) is an artificial spiking cell that uses net_event to produce output events, as NEURON's built-in IntFire1, IntFire2, and IntFire4 do. The reason is that such artificial spiking cells perform their own test for threshold crossing in their NET_RECEIVE block."

In your template, the statements
objref Source
Source = $o1
and
TempNetCon0 = new NetCon(Source,TempIntFire,Threshold1,0,Wgt)
make sense only if you expect the presynaptic cell for this new NetCon to be an artificial spiking cell.
And in these statements
TempNetCon1 = new NetCon(TempIntFire,OutStim,Thrsd,0,2)
TempNetCon2 = new NetCon(TempIntFire,OutStim,Thrsd,0.001,1)
it is quite clear that the presynaptic cell for these NetCons is an artificial spiking cell. So the values assigned to Threshold1 and Thrsd will have no effect on the operation of the microcircuit that the template creates.

As I look more closely at the template, I'm not sure I understand how it fits in with the original question you asked--it seems to have additional complexity that isn't directly related to the design goal of having something that passes every Nth input event.
henrychen1986 wrote:If the source of the TempNetCon0 in my code is membrane voltage from a cell, ranged from -65 mV to 25 mV. What is the best way to assign a threshold as -10mV?
The first question is how tell TempNetCon0 that it should be monitoring membrane potential in a section. For this, the Source objref is not useful--get rid of it. Instead, you want to have this statement in the template's init() procedure
TempNetCon0 = new NetCon(&v($1), TempIntFire,Threshold1,0,Wgt)
It is then necessary to create each new instance of the PRelease class in the context of a currently accessed section, as in this example

Code: Select all

objref pr
axon pr = new PRelease(1, . . . ) // axon is part of a "top level" model cell
or this one

Code: Select all

ca1pyr.soma pr = new PRelease(0.5, . . . ) // ca1pyr is an instance of a cell class
  // and soma is the name of a section that is a public member of that cell class
where the first argument to PRelease is the location on the currently accessed section at which you want to monitor membrane potential.

Are you trying to implement a model that includes probabilistic transmitter release? If that's the case, there is a much better way to proceed.
Post Reply