/* makebiramp.hoc
sets up a triangular waveform for use as a command potential
assumes the following are known:
dt time step
*/
// Easy mnemonics so I can set these in the interpreter
// and then invoke simple() (just in case I forget the calling
// syntax for mkramp(), or maybe only want to change one param).
// My convention for constants is upper case
V0 = -80 // default for stdrun.hoc is -65 mV
SLOPE = 0.2 // mv/ms
TR = 10000 // ms
objref mycmd,mycmd1,mycmd2
mycmd = new Vector() // must create object outside proc
mycmd1 = new Vector() // must create object outside proc
mycmd2 = new Vector() // must create object outside proc
/* Creates a "ramp" vector
_____ v1
/
/ slope
v0 /
tr
arguments:
$1 v0 command at start of ramp (mV)
$2 slope dv/dt during ramp (mV/ms)
$3 tr duration of ramp (ms)
note 1: v1 = v0 + slope*tr
note 2: at end of t0 + tr, vector.play will leave
command at v1, but if this is played into
dur2 of a SEClamp object, what really happens
will depend on whether t enters dur3
*/
// I double the initial letter so these local variables won't
// collide with global names that I may want to use later
proc mkbiramp() { local ii, vv0, sslope, ttr, vv1
vv0 = $1
sslope = $2
ttr = $3
vv1 = vv0 + sslope*ttr/2
mycmd1.indgen(vv0, vv1, dt*sslope)
mycmd2.indgen(vv0,vv1,dt*sslope)
mycmd2.reverse()
mycmd.resize(0)
mycmd.append(mycmd1,mycmd2)
}
// I can invoke mkbiramp() with all 3 arguments,
// or I can change a single "constant" (V0, SLOPE, or TR)
// and then invoke simple() with no arguments.
proc simple() {
mkbiramp(V0, SLOPE, TR)
}
proc vsimple() {
mkbiramp(vV0, vSLOPE, vTR)
}