COMMENT
multiclamp.mod
Generates a train of symmetrically trapezoidal current changes.
User specifies trf (duration of rise/fall ramps), tp (duration of plateau),
del (onset of first trapezoid), per (period, i.e. interval between trapezoid onsets),
and number of trapezoids.
Ensures that period is longer than trapezoid duration.
4/1/2012 NTC modified from TrapSyn.mod on 4/2/2012 TMM
ENDCOMMENT
NEURON {
POINT_PROCESS MultIClamp
ELECTRODE_CURRENT i
RANGE trf, tp
RANGE del, per, number
RANGE amp, i
: NONSPECIFIC_CURRENT i
}
UNITS {
(mV) = (millivolt)
(nS) = (nanosiemens)
(nA) = (nanoamp)
}
PARAMETER {
trf (ms) <0, 1e9> : duration of rising and falling phases
tp (ms) <0, 1e9> : duration of plateau
del (ms) <0, 1e9> : latency of first transient
per (ms) <0, 1e9> : period, i.e. interval between transient onsets
number : how many to deliver
amp (nA) <0, 1e9> : conductance during plateau
}
ASSIGNED {
v (mV)
i (nA)
on
tally : how many more to deliver
m (1/ms)
b (1)
dur (ms)
t0 (ms)
}
INITIAL {
if (trf <= 0) {
trf = 0.025 : use default time step as default rise/fall time
UNITSOFF
printf("time rise fall must be longer than 0: ")
printf("increased to trf = %g ms\n", trf)
UNITSON
}
if (tp < 0) {
tp = 0
UNITSOFF
printf("time plateau must not be negative: ")
printf("changed to tp = %g ms\n", tp)
UNITSON
}
dur = 2*trf + tp
if (per <= dur) {
per = dur : allows this mechanism to be used as triangle wave
UNITSOFF
printf("period must be longer than trapezoid duration %g: ",dur)
printf("increased to per = %g ms\n", per)
UNITSON
}
on = 0
m = 0
b = 0
tally = number
if (tally > 0) {
net_send(del, 1)
tally = tally - 1
}
}
BREAKPOINT {
i = amp * (m*(t-t0) + b)
}
NET_RECEIVE (w) {
if ((on == 0) && (flag == 1)) {
: enter rising phase
t0 = t
m = 1/trf
b = 0
on = 1
: prepare for plateau phase
net_send(trf, 2)
}
if (flag == 2) {
: enter plateau
m = 0
b = 1
: prepare for falling phase
net_send(tp, 3)
}
if (flag == 3) {
: enter falling phase
t0 = t
m = -1/trf
b = 1
: prepare to end
net_send(trf, 4)
}
if (flag == 4) {
: end
m = 0
b = 0
on = 0
if (tally > 0) {
: prepare to turn it on again
net_send(per - dur, 1)
tally = tally - 1
}
}
}