COMMENT
Modified from Zach's code: 6.3.94
Simulates alpha function synapse with synaptic delay.
If pre > PreThresh then a new spike is put on the queue at t+delay.
A delta pulse is added into the alpha function equations when time >
a time on the queue. A maximum of (pspMAX) can be handled on the queue.
ENDCOMMENT
INDEPENDENT {t FROM 0 TO 1 WITH 1 (ms)}
DEFINE pspMAX 15 :max # of spikes on queue
NEURON {
POINT_PROCESS glu
POINTER pre :presyn variable to trigger on
RANGE gmax, i, g, delay
RANGE delta, flag, erev:, p
NONSPECIFIC_CURRENT i
GLOBAL tau,PreThresh
}
ASSIGNED {
pspSTACK[pspMAX]
psp0
psp1
pspN
pre
flag
delta
: rn
}
UNITS {
(nA) = (nanoamp)
(mV) = (millivolt)
(umho) = (micromho)
(mM) = (milli/liter)
}
PARAMETER {
gmax=0.005 (umho)
erev=0 (mV)
tau=1.0 :tau for alpha function
delay=1.5 (ms) :synaptic delay
PreThresh=-20 (mV) :presyn spike thresh to test for
v (mV)
dt (ms)
: p = 0.2
}
STATE {
X
Y
}
INITIAL { LOCAL i
X = 0 :~proportion of bound transmitter/receptors
Y = 0 :~proportion of channels open (g)
flag = 0 :set if spike is above thresh
delta = 0 :set if quantum released
g = 0
pspN = 0
psp0 = 0
psp1 = 0
: rn = 1/(2^31)
FROM i=0 TO pspMAX {
pspSTACK[i] = 0
}
}
ASSIGNED { i (nA) g (umho)}
BREAKPOINT { :everything in BREAKPOINT called twice except SOLVE
SOLVE dstates METHOD cnexp
g = gmax * Y / (tau * 0.36787944) : tau * exp(-1)
i = g*(v - erev)
}
DERIVATIVE dstates {
CheckThresh()
CheckTime()
X' = delta - X / tau
Y' = X - Y / tau
}
PROCEDURE CheckThresh() {
if (flag) { if (pre < PreThresh) {flag = 0} }
else {
if (pre > PreThresh) {
flag = 1
: if (random()*rn < p) {
AddSpike()
: }
}
}
}
PROCEDURE AddSpike() {
if (pspN < pspMAX) {
pspN=pspN+1
if (psp1 >= pspMAX) { psp1 = 0 }
pspSTACK[psp1] = t+delay-dt :time at which next quantum released
psp1=psp1+1
}
else { printf("ERROR: spike queue full - synaptic delay too long?\n") }
}
COMMENT
PROCEDURE CheckTimeo() { :hacked code to get around pseudo bug
if ( pspSTACK[psp0] > 0) { :if delta set for only 1 dt, doesn't work
if (t-pspSTACK[psp0] > dt) {
delta = 0
pspN=pspN-1
pspSTACK[psp0] = 0
psp0 = psp0+1
if (psp0 >= pspMAX) { psp0 = 0 }
} else if (t-pspSTACK[psp0] > 0) {
printf("quantum released\n")
delta = 1/dt
}
}
}
ENDCOMMENT
PROCEDURE CheckTime() {
delta = 0
if ( (pspSTACK[psp0] > 0) && (t > pspSTACK[psp0]) ){
delta = 1/dt
pspN=pspN-1
pspSTACK[psp0] = 0
psp0 = psp0+1
if (psp0 >= pspMAX) { psp0 = 0 }
}
}