: : ConductancePattern.mod : : Generates conductance patterns mimicking AMPA and GABAA postsynaptic potentials. : : Thalamocortical convergence studies : Sebastien Behuret, UNIC/CNRS Paris, 2009 : NEURON { POINT_PROCESS ConductancePattern RANGE BaseDelay, DelayExpMean, DelayExpNoise, DelayGaussMean, DelayGaussStd, DelayGaussNoise, Weight, Tau, ERev, Threshold, DeadTime, ExpireTime POINTER V, Trigger RANGE G ELECTRODE_CURRENT I } DEFINE MAX_INPUTS 1024 UNITS { (nA) = (nanoampere) (mV) = (millivolt) (nS) = (nanosiemens) } PARAMETER { mydt = 0.1 (ms) BaseDelay = 0 (ms) DelayExpMean = 0 (ms) DelayExpNoise = 0 DelayGaussMean = 0 (ms) DelayGaussStd = 1 (ms) DelayGaussNoise = 0 Weight = 10 (nS) Tau = 1 (ms) ERev = 0 (mV) Threshold = 0 DeadTime = 1 (ms) ExpireTime = 10 (ms) } ASSIGNED { V (mV) Trigger G (nS) I (nA) LastTime (ms) InputTimes[MAX_INPUTS] (ms) InputAmplitudes[MAX_INPUTS] } INITIAL { LOCAL i G = 0 I = 0 LastTime = - (DeadTime + mydt) UpdateParameters() } BREAKPOINT { SOLVE ProcessInputs } PROCEDURE UpdateParameters() { FROM i = 0 TO MAX_INPUTS - 1 { InputTimes[i] = ExpireTime InputAmplitudes[i] = 0 } } PROCEDURE DetectInput() { LOCAL Amplitude, i, j Amplitude = 0 if (t - LastTime > DeadTime) { if (Trigger > Threshold) { Amplitude = 1 LastTime = t } } if (Amplitude > 0) { i = 0 j = 0 while (i < MAX_INPUTS && j == 0) { if (InputTimes[i] >= ExpireTime) { InputTimes[i] = - (BaseDelay + DelayExpMean * (1 - DelayExpNoise + DelayExpNoise * exprand(1))) if (DelayGaussNoise == 1) { InputTimes[i] = InputTimes[i] - normrand(DelayGaussMean, DelayGaussStd) } InputAmplitudes[i] = Amplitude j = 1 } else { i = i + 1 } } if (j == 0) { printf("Detected input couldn't be added!\n") } } } FUNCTION TraverseInputs() (nS) { LOCAL i, j TraverseInputs = 0 FROM i = 0 TO MAX_INPUTS - 1 { if (InputTimes[i] < ExpireTime) { if (InputTimes[i] >= 0) { TraverseInputs = TraverseInputs + Weight * InputAmplitudes[i] * (InputTimes[i] / Tau) * exp(- (InputTimes[i] - Tau) / Tau) } InputTimes[i] = InputTimes[i] + mydt } } } PROCEDURE ProcessInputs() { DetectInput() G = TraverseInputs() UNITSOFF I = G * (ERev - V) * 1e-3 UNITSON }