/*
* @file ringplot.hoc
* @brief Horizontally scrolling plot
* @author M. Hines @ Yale, Werner Van Geit @ BBP
* @date 2015
*/
load_file("nrngui.hoc")
begintemplate RingPlot
public g, clipped_voltage
public view_count, fastflush, flush, cleanup
objref g, clipped_voltage, clipped_time, voltage, time, max_vec
/** Constructor */
proc init() {
// Generate graph
g = new Graph(0)
// Horizontal width of the plot (in ms)
clip_size = 3000.0
// Record voltage
voltage = new Vector(10000)
voltage.record(&v(.5))
// Record time
time = new Vector(10000)
time.record(&t)
// Vector that will contain the clipped data
clipped_voltage = new Vector()
clipped_time = new Vector()
// Set up location and size of window
g.view(0, -90, 3000, 120, 50, 650, 1007.04, 450)
}
/** View count of the graph */
func view_count() {
return g.view_count()
}
/** Fast flush the plot */
func fastflush() {
update()
return g.flush()
}
/** Flush the plot */
func flush() {
update()
return g.flush()
}
/** Update the plot */
proc update() {
// Set clipping region (in ms)
clip_size = 3000.0
// Time at right side of clipping region
right_t = t
// Time at left side of clipping region
// Wait until time reaches clip_size to start scrolling
if (t >= clip_size) {
left_t = t - clip_size
} else {
left_t = 0.0
}
// Calculate clipped vectors
clipped_voltage.copy(voltage, 0, left_t/dt, right_t/dt-1)
clipped_time.copy(time, 0, left_t/dt, right_t/dt-1)
clipped_time.sub(left_t)
// Erase previous plot
g.erase()
// Plot clipped vectors
clipped_voltage.plot(g, clipped_time)
}
/** Clean up the plot */
proc cleanup() {
// Vector that will contain the clipped data
clipped_voltage = new Vector()
clipped_time = new Vector()
}
endtemplate RingPlot