:
: SynapticNoise.mod
:
: This mechanism implements the synaptic bombardment model and
: generates both excitatory and inhibitory components of the synaptic noise.
: (Depends on RandomGenerator.mod, see "setpointer" in Geometry.hoc)
:
: Thalamocortical convergence studies
: Sebastien Behuret, UNIC/CNRS Paris, 2009
:
NEURON {
POINT_PROCESS SynapticNoise
RANGE Enabled
RANGE GeRev, GeMean, GeSigma, GeTau, Ge, GeDelta, GeExponential, GeAmplitude, GiRev, GiMean, GiSigma, GiTau, Gi, GiDelta, GiExponential, GiAmplitude
RANGE GeGiCorrelation, GeGiPhase, InterCorrelation
POINTER V
ELECTRODE_CURRENT I
POINTER InterGeNormRand, InterGiNormRand, InterGeGiNormRand
}
DEFINE HISTORY_LENGTH 256
UNITS
{
(mV) = (millivolt)
(nS) = (nanosiemens)
}
PARAMETER
{
mydt = 0.1 (ms)
Enabled = 1
GeRev = 0 (mV)
GeMean = 12 (nS)
GeSigma = 3.0 (nS)
GeTau = 2.7 (ms)
GiRev = -75 (mV)
GiMean = 57 (nS)
GiSigma = 6.6 (nS)
GiTau = 10.5 (ms)
GeGiCorrelation = 0
GeGiPhase = 0
InterCorrelation = 0
}
ASSIGNED
{
Ge (nS)
GeDelta (nS)
GeExponential
GeAmplitude (nS)
Gi (nS)
GiDelta (nS)
GiExponential
GiAmplitude (nS)
V (mV)
I (nA)
InterGeNormRand
InterGiNormRand
InterGeGiNormRand
GeGiNormRandHistoryA[HISTORY_LENGTH]
GeGiNormRandHistoryB[HISTORY_LENGTH]
}
INITIAL
{
LOCAL i
Ge = 0
Gi = 0
I = 0
FROM i = 0 TO HISTORY_LENGTH - 1
{
GeGiNormRandHistoryA[i] = 0
GeGiNormRandHistoryB[i] = 0
}
UpdateParameters()
}
PROCEDURE UpdateParameters()
{
GeDelta = 0
GiDelta = 0
if(GeTau != 0)
{
GeExponential = exp(- dt / GeTau)
GeAmplitude = GeSigma * sqrt((1 - exp(- 2 * dt / GeTau)))
}
if(GiTau != 0)
{
GiExponential = exp(- dt / GiTau)
GiAmplitude = GiSigma * sqrt((1 - exp(- 2 * dt / GiTau)))
}
}
PROCEDURE ShiftGeGiNormRandHistoryA(GeGiNormRand)
{
LOCAL HistoryLength
HistoryLength = HISTORY_LENGTH
VERBATIM
unsigned int i;
for (i = (unsigned int)_lHistoryLength - 1; i >= 1; i--)
{
GeGiNormRandHistoryA[i] = GeGiNormRandHistoryA[i - 1];
}
GeGiNormRandHistoryA[0] = _lGeGiNormRand;
ENDVERBATIM
}
PROCEDURE ShiftGeGiNormRandHistoryB(GeGiNormRand)
{
LOCAL HistoryLength
HistoryLength = HISTORY_LENGTH
VERBATIM
unsigned int i;
for (i = (unsigned int)_lHistoryLength - 1; i >= 1; i--)
{
GeGiNormRandHistoryB[i] = GeGiNormRandHistoryB[i - 1];
}
GeGiNormRandHistoryB[0] = _lGeGiNormRand;
ENDVERBATIM
}
BREAKPOINT
{
LOCAL GeNormRand, GiNormRand, GeGiNormRand, GePhase, GiPhase
GeNormRand = sqrt(1 - InterCorrelation) * normrand(0, 1) + sqrt(InterCorrelation) * InterGeNormRand
GiNormRand = sqrt(1 - InterCorrelation) * normrand(0, 1) + sqrt(InterCorrelation) * InterGiNormRand
ShiftGeGiNormRandHistoryA(sqrt(1 - InterCorrelation) * normrand(0, 1) + sqrt(InterCorrelation) * InterGeGiNormRand)
if (GeGiPhase == 0)
{
GePhase = 0
GiPhase = 0
}
else if (GeGiPhase > 0)
{
GePhase = 0
GiPhase = floor(GeGiPhase / mydt)
}
else
{
GePhase = floor(- GeGiPhase / mydt)
GiPhase = 0
}
if (Enabled == 1)
{
SOLVE OUProcess
if (GeTau == 0)
{
GeDelta = GeSigma * (sqrt(1 - GeGiCorrelation) * GeNormRand + sqrt(GeGiCorrelation) * GeGiNormRandHistoryA[GePhase])
}
if (GiTau == 0)
{
GiDelta = GiSigma * (sqrt(1 - GeGiCorrelation) * GiNormRand + sqrt(GeGiCorrelation) * GeGiNormRandHistoryA[GiPhase])
}
Ge = GeMean + GeDelta
Gi = GiMean + GiDelta
if( Ge < 0)
{
Ge = 0
}
if (Gi < 0)
{
Gi = 0
}
UNITSOFF
I = (Ge * (GeRev - V) + Gi * (GiRev - V)) * 1e-3
UNITSON
}
else
{
Ge = 0
Gi = 0
I = 0
}
}
PROCEDURE OUProcess()
{
LOCAL GeNormRand, GiNormRand, GeGiNormRand, GePhase, GiPhase
GeNormRand = sqrt(1 - InterCorrelation) * normrand(0, 1) + sqrt(InterCorrelation) * InterGeNormRand
GiNormRand = sqrt(1 - InterCorrelation) * normrand(0, 1) + sqrt(InterCorrelation) * InterGiNormRand
ShiftGeGiNormRandHistoryB(sqrt(1 - InterCorrelation) * normrand(0, 1) + sqrt(InterCorrelation) * InterGeGiNormRand)
if (GeGiPhase == 0)
{
GePhase = 0
GiPhase = 0
}
else if (GeGiPhase > 0)
{
GePhase = 0
GiPhase = floor(GeGiPhase / mydt)
}
else
{
GePhase = floor(- GeGiPhase / mydt)
GiPhase = 0
}
if (GeTau != 0)
{
GeDelta = GeExponential * GeDelta + GeAmplitude * (sqrt(1 - GeGiCorrelation) * GeNormRand + sqrt(GeGiCorrelation) * GeGiNormRandHistoryB[GePhase])
}
if (GiTau != 0)
{
GiDelta = GiExponential * GiDelta + GiAmplitude * (sqrt(1 - GeGiCorrelation) * GiNormRand + sqrt(GeGiCorrelation) * GeGiNormRandHistoryB[GiPhase])
}
}