COMMENT zoidsyn.mod Generates a train of symmetrically trapeZoidal conductance changes. User specifies trf (duration of rise/fall ramps), tp (duration of plateau), start (onset of first trapezoid), interval, i.e. period between trapezoid onsets), and number of trapezoids. Error checking in INIT block ensures that interval is longer than trapezoid duration. 4/1/2012 NTC, minor modifications 4/3/2012 TMM ENDCOMMENT NEURON { POINT_PROCESS ZoidSyn RANGE trf, tp RANGE start, interval, number RANGE e, gmax, g, 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 start (ms) <0, 1e9> : latency of first transient interval (ms) <0, 1e9> : period, i.e. interval between transient onsets number : how many to deliver e (mV) : reversal potential gmax (nS) <0, 1e9> : conductance during plateau } ASSIGNED { v (mV) i (nA) on tally : how many more to deliver m (1/ms) b (1) dur (ms) : sum of twice the rise/fall time trp plus tp t0 (ms) g (nS) } INITIAL { if (trf <= 0) { trf = 1 UNITSOFF printf("trf must be longer than 0\n") printf("trf has been increased to %g ms\n", trf) UNITSON } if (tp < 0) { tp = 0 UNITSOFF printf("tp must not be negative\n") printf("tp has been changed to %g ms\n", tp) UNITSON } dur = 2*trf + tp if (interval <= dur) { interval = dur + 1 (ms) UNITSOFF printf("interval must be longer than trapezoid duration\n") printf("interval has been increased to %g ms\n", interval) UNITSON } on = 0 m = 0 b = 0 tally = number if (tally > 0) { net_send(start, 1) tally = tally - 1 } } BREAKPOINT { g = gmax * (m*(t-t0) + b) i = (0.001)*g*(v-e) } 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(interval - dur, 1) tally = tally - 1 } } }