Page 1 of 1

input to a netcon synapse from an external file

Posted: Wed Sep 14, 2005 9:50 am
by horstmann
I tried to rewrite a simple Ampa-Synapse from Destexhe et. al with a rectangular transmitter pulse in order to a have a synapse, which is able to deal with NetCon-Events, so that using CVode during simulation is possible.

Everything went fine, until I tried to implement the synapse in hoc.
What I want to do is simulating a pyramidal hippocampal neuron, which gains its input through different synapses from files. The Files are pure ASCII-Files consisting of 0 and 1, which denote if a spike has arrived or not. Because a Netstim-Process can only have as a source a range variable I inserted a dummysoma, which is not connected to anything else and consists of one segment, loaded the files into a vector and played the vectors by brute force into the membranpotential of the dummysoma.

This is the hoc code:

i

Code: Select all

input = new File()
input.ropen("randomInput1.txt")
vector = new Vector(620000)
vector.scanf(input)

dummysoma vektor.play(&v(0), 0.025) /

objectvar NetConSynapse

dendbas {NetConSynapse = new AMPANETCON(0.2)} 
objref nc
dummyinput=0


dummysoma nc = new NetCon(&v(0), NetConSynapse, 0.5, 0, 0) 

AMPANETCON is the rewritten Ampa Synapse.

To figure out if the problem may be the new programmed AMPANETCON-Synapse, I tried the same with the "old Synapse"

Code: Select all

dendbas{
    noise1 = new AMPA(0.2)
    inputnoise1=0}
   
    stimdummy setpointer noise1.pre, v(0) 
    stimdummy vector1.play(&v(0), 0.025)
AMPA is the "old synapse", vector1 the vector, where all the file datapoints are played in

This doesn't work at all (v(0) doesn't change at all), but if I replace v(0) with any arbitrary variable x, everything works fine.

Does anyone know a solution for feeding a NetCon-Synapse with data from file?

Thanks in advance

Marie-Therese

driving a synaptic mechanism with events at specified times

Posted: Wed Sep 14, 2005 1:33 pm
by ted
The straightforward way to do what you want is to exploit the NetCon class's
event() method, which allows you to stuff events into the queue--see
http://www.neuron.yale.edu/neuron/stati ... html#event

Here's an outline of the changes you need to make:
1. Translate your strings of 0s and 1s into a Vector full of event times, i.e. the times at
which you want your synapticmechanism to be activated.
2. Make sure the NetCon that will feed these to your synaptic mechanism has a delay
of 0 (the documentation of NetCon.event says that the times are delivery times, not
"initiating" (source) times, but there's no harm in explicitly making nc.delay = 0).
3. Use an FIinitializeHandler
http://www.neuron.yale.edu/neuron/stati ... ithnd.html
to stuff the event times into that NetCon's queue during initialization. For example, if
the Vector that holds the event times is syntimes, and the NetCon that drives the
synaptic point process nc, this would work:
objref fih
fih = new FInitializeHandler("loadqueue()")
proc loadqueue() { local ii
for ii=0,syntimes.size()-1 nc.event(syntimes.x[ii])
}

model of saturating AMPAergic synapse

Posted: Wed Sep 14, 2005 1:44 pm
by ted
Here's Listing 10.5 from The NEURON Book--the NMODL code for a saturating
AMPAergic synaptic mechanism that works with the event delivery system. You may
want to compare the PARAMETERs against those that Alain used in his original
implementation, and change them if necessary.

Code: Select all

: ampa.mod
: saturating synapse model using discrete events

NEURON {
  POINT_PROCESS AMPA_S
  RANGE g
  NONSPECIFIC_CURRENT i
  GLOBAL Cdur, Alpha, Beta, Erev, Rinf, Rtau
}

UNITS {
  (nA)   = (nanoamp)
  (mV)   = (millivolt)
  (umho) = (micromho)
}

PARAMETER {
  Cdur  = 1.0   (ms)  : transmitter duration (rising phase)
  Alpha = 1.1   (/ms) : forward (binding) rate
  Beta  = 0.19  (/ms) : backward (dissociation) rate
  Erev  = 0     (mV)  : equilibrium potential
}

ASSIGNED {
  v     (mV)   : postsynaptic voltage
  i     (nA)   : current = g*(v - Erev)
  g     (umho) : conductance
  Rtau  (ms)   : time constant of channel binding
  Rinf  : fraction of open channels if xmtr was present "forever"
  synon : sum of weights of all synapses that are in the "onset" state
}

STATE { Ron Roff }  : initialized to 0 by default
: Ron and Roff are the total conductances of all synapses 
:   that are in the "onset" (transmitter pulse ON)
:   and "offset" (transmitter pulse OFF) states, respectively

INITIAL {
  Rinf = Alpha / (Alpha + Beta)
  Rtau = 1 / (Alpha + Beta)
  synon = 0
}

BREAKPOINT {
  SOLVE release METHOD cnexp
  g = (Ron + Roff)*1(umho)
  i = g*(v - Erev)
}

DERIVATIVE release {
  Ron' = (synon*Rinf - Ron)/Rtau
  Roff' = -Beta*Roff
}

NET_RECEIVE(weight, on, r0, t0 (ms)) {
  : on == 1 if transmitter is present ("onset" state), otherwise 0
  : flag is an implicit argument of NET_RECEIVE, normally 0
  if (flag == 0) {
    : a spike happened, so start onset state if not already in onset state
    if (!on) {
      : this synapse joins the set of synapses in the onset state
      synon = synon + weight
      r0 = r0*exp(-Beta*(t - t0)) : r0 at start of onset state
      : r0 joins the "onset" conductance pool,
      :   which grows according to Ron' = ...
      :   and leaves the "offset" conductance pool,
      :   which decays according to Roff' = ...
      Ron = Ron + r0
      Roff = Roff - r0
      t0 = t
      on = 1
      net_send(Cdur, 1)
    } else {
      : already in onset state, so move offset time
      net_move(t+Cdur)
    }
  }
  if (flag == 1) {
    : "turn off transmitter"
    : i.e. this synapse joins the set of synapses in the offset state
    synon = synon - weight
    : r0 at start of offset state
    r0 = weight*Rinf + (r0 - weight*Rinf)*exp(-(t - t0)/Rtau)
    : r0 leaves the "onset" conductance pool,
    :   and joins the "offset" conductance pool
    Ron = Ron - r0
    Roff = Roff + r0
    t0 = t
    on = 0
  }
}

Thanks

Posted: Thu Sep 15, 2005 4:32 am
by horstmann
Thank you very much, this works.

Marie-Therese

Model of saturating AMPAergic synapse

Posted: Wed Sep 28, 2005 5:17 am
by Raj
Small observation on the absence of state_discontinuity statements and the answer was found in the NEURON book, chapter 10:
Earlier versions of NEURON had to change g (i.e. a state variable) with a state_discontinuity() statement. This is no longer necessary.
Nice!

Posted: Tue Jun 19, 2007 2:32 pm
by JZ
This is helpful to me too, does anyone know of a similar implementation (with netcon) of Destexhe's model of the GABA_a receptor?