Balance of excitation and inhibition (Carvalho and Buonomano 2009)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:125689
" ... Here, theoretical analyses reveal that excitatory synaptic strength controls the threshold of the neuronal input-output function, while inhibitory plasticity alters the threshold and gain. Experimentally, changes in the balance of excitation and inhibition in CA1 pyramidal neurons also altered their input-output function as predicted by the model. These results support the existence of two functional modes of plasticity that can be used to optimize information processing: threshold and gain plasticity."
Reference:
1 . Carvalho TP, Buonomano DV (2009) Differential effects of excitatory and inhibitory plasticity on synaptically driven neuronal input-output functions. Neuron 61:774-85 [PubMed]
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type: Neuron or other electrically excitable cell;
Brain Region(s)/Organism:
Cell Type(s):
Channel(s):
Gap Junctions:
Receptor(s):
Gene(s):
Transmitter(s):
Simulation Environment: NEURON; MATLAB;
Model Concept(s): Synaptic Integration;
Implementer(s):
COMMENT

Merged  INPUT.mod and SpkGen.mod
INPUT.mod is used as the input, and drives the synapses to the first layer Ex cells
SpkGen.mod is used to drive the input with patterns
Dean Buonomano 4/1/01

modified from pregen.mod - Mainen and Destexhe
modified to incorporate arbitrary sequences of pulses with
assigned inter-burst intervals
spkgenmode = 0 is the same as the previous version
spkgenmode = 1 permits the user to assign inter-burst intervals
in an aperiodic fashion. In this mode the on_times variable
must be initialized to +9e9 in the .oc or .hoc file.
Potential bug was fixed by adding dt/2
Dean Buonomano 5/20/99



ENDCOMMENT

UNITS {
        (mV) = (millivolt)
        (mA) = (milliamp)
}

INDEPENDENT {t FROM 0 TO 1 WITH 1 (ms)}

NEURON {
    NONSPECIFIC_CURRENT i
    SUFFIX INPUT

    GLOBAL  spikedur
        RANGE   Spike, lastspk, spk

    GLOBAL seed
    GLOBAL spkgenmode
        RANGE fast_invl, slow_invl, burst_len, start, end
        RANGE noise
        RANGE on_times

}


PARAMETER {

    v
    i

    spikedur = 1.0  (ms)
        refact   = 1.5  (ms)

        spkgenmode      = 0             : 0=normal periodic mode, 1=aperiodic assigned mode
        fast_invl       = 1             : time between spikes in a burst (msec)
        slow_invl       = 100           : burst period (msec)
        burst_len       = 1             : burst length (# spikes)
        start           = 50            : location for first burst
        end             = 200           : time to stop bursting
        noise           = 0             : amount of randomness (0.0 - 1.0)
        seed            = 53892         : seed for random num generator

}

ASSIGNED {

        Spike
        spk
        lastspike

        pulsecntr
        scntr
        lcntr
        bcntr
        burst
        dt
        on_times[10]            : maximum of a sequence of 10 inter-burst intervals
                                                : should be initialized to 9e9 in .oc files

}

INITIAL {
        Spike = 0
        lastspike = -9e4

        pulsecntr = -1
        burst   = 0
        scntr   = fast_invl
        bcntr   = burst_len
        if (noise != 0) {
          set_seed(seed)
          scntr = noise * fpoisrand(fast_invl) + (1 - noise) * fast_invl
          bcntr = noise * fpoisrand(burst_len) + (1 - noise) * burst_len
        }
:       lcntr   = start - fast_invl
        lcntr   = start
}

BREAKPOINT {
        SOLVE generate
        i = Spike*(v+20)     :INSTANT STEP TO -20 mV
}



PROCEDURE generate() {
  if (t < end) {
    : leave spk up for 1 msec spike duration, Spike is not ON for ms
    if (t > lastspike+1) { spk = 0 }
    Spike = 0
    scntr = scntr - dt
    lcntr = lcntr - dt
    if (burst) {
      :  in a burst
      if (scntr <= dt+dt/2) {
                        : a spike
                        if (bcntr <= 1) {
                                : last spike in burst ?
                                burst = 0
                                if (spkgenmode==0) {
                                if (noise==0) {
                                lcntr = slow_invl
                            } else {
                            lcntr = noise * fpoisrand(slow_invl) + (1 - noise) * slow_invl
                                }
                                } else if  (spkgenmode==1) {
                                lcntr = on_times[pulsecntr] + dt
                                }
                }

                        Spike = 1
                        spk = 1
         lastspike = t

                        bcntr = bcntr - 1
                        if (noise==0) {
                                scntr = fast_invl + dt
                        } else {
                                scntr = noise * fpoisrand(fast_invl) + (1 - noise) * fast_invl
                        }
        }                                                                                       : if (scntr <= dt+dt/2)
        } else {                                                                        : end if(burst)
      :  between burst
      if (lcntr <= dt+dt/2) {                           : there is a round off problem here
                        :VERBATIM
                        :printf("FFFFFFFFFFFt = %f  pulsecntr = %f sctr = %f   x = %f   lctr=%f   spk=%f   lspk=%f\n",t,pulsecntr,scntr,x,lcntr,spk,lastspk);
                        :ENDVERBATIM
                if (noise==0) {
                        bcntr = burst_len
                } else {
                        bcntr = noise * fpoisrand(burst_len) + (1 - noise) * burst_len
                }
                burst = 1
        pulsecntr = pulsecntr + 1
      }
    }                                                   : end ~(burst)
    VERBATIM
    return 0;
    ENDVERBATIM
  }
}

FUNCTION fgauss(x,mean,std_dev) {
        fgauss = gauss(x,mean,std_dev)
}

FUNCTION fpoisrand(mean) {
  if (mean > 700) {
    fpoisrand = 4. * poisrand(mean/4.)
  } else {
    fpoisrand = poisrand(mean)
  }
}

COMMENT
Presynaptic spike generator
---------------------------

This mechanism has been written to be able to use synapses in a single
neuron receiving various types of presynaptic trains.  This is a "fake"
presynaptic compartment containing a fast spike generator.  The trains
of spikes can be either periodic or noisy (Poisson-distributed), and
either tonic or bursting.

Parameters;

   spikegenmod: 0=periodic;1=aperiodic
   noise:       between 0 (no noise-periodic) and 1 (fully noisy)
   fast_invl:   fast interval, mean time between spikes (ms)
   slow_invl:   slow interval, mean burst silent period (ms), 0=tonic train
   burst_len:   mean burst length (nb. spikes)
   on_times:    used for spkgenmode=1, assigns inter-burst intervals

Written by Z. Mainen, modified by A. Destexhe, modified by D. Buonomano

ENDCOMMENT