begintemplate CrossCorrelation
public reference, test
public ydat, tdat, grid, cor, y, tcor
external hoc_obj_
objref ydat[2], tdat[2] // original full data
objref y[2] // subset of data interpolated onto power of 2 grid
objref grid
objref cor, tcor
objref this, b, gdat, gcor
strdef tstr
proc init() {
if (numarg() < 2) {
ydat[0] = new Vector(2)
tdat[0] = new Vector(2)
ydat[0].x[0] = 2
tdat[0].indgen(100)
reference(ydat[0], tdat[0])
test(ydat[0], tdat[0])
}else if (numarg() == 2) {
reference($o1, $o2)
test($o1, $o2)
}else if (numarg() > 2) {
reference($o1, $o2)
test($o3, $o4)
}
nominal_dt = .025 //ms
usemean_ = 1
cor = new Vector()
tcor = new Vector()
grid = new Vector()
y[0] = new Vector()
y[1] = new Vector()
build()
map()
bcon(0)
gdat.exec_menu("View = plot")
gcor.exec_menu("View = plot")
gdat.exec_menu("Select Boundaries")
}
proc map() {
sprint(tstr, "%s", this)
b.map(tstr)
}
proc reference() {
ydat[0] = $o1.cl
tdat[0] = $o2.c
tbegin = 150
tend = 300
maxdat = ydat[0].max
mindat = ydat[0].min
maxshift = 10 //ms
}
proc test() {
ydat[1] = $o1.cl
tdat[1] = $o2.c
}
proc correl() {local ibegin, iend, i, x
x = (tend - tbegin)/nominal_dt
//print "tbegin=",tbegin, " tend=", tend, " x=", x
x = int(log(x)/log(2))
grid.resize(2^x)
ddt = (tend - tbegin)/grid.size
grid.indgen(tbegin, ddt)
//print "grid size =", grid.size, " ddt=", ddt
for i=0, 1 {
ydat[i].line(gdat, tdat[i], 1, 1)
ibegin=tdat[i].indwhere(">", tbegin)
if (ibegin == -1) { ibegin = tdat[i].size-2 }
iend = tdat[i].indwhere(">", tend)
if (iend == -1) { iend = tdat[i].size-1 }
//print "ibegin=", ibegin, " iend=", iend
y[i].copy(ydat[i], ibegin, iend)
y[i].interpolate(grid, tdat[i].c(ibegin, iend))
y[i].line(gdat, grid, 2, 1)
if (usemean_) {
y[i].sub(y[i].mean)
}
if (zcon_ == 1) {
y[i].resize(y[i].size*2)
}
}
cor.correl(y[0], y[1]).mul(ddt)
actual_shift = maxshift
if (maxshift*2 >= (tend - tbegin)) {
actual_shift = (tend - tbegin)/2
}
cor.rotate(actual_shift/ddt)
cor.resize(2*actual_shift/ddt+1)
tcor.resize(2*actual_shift/ddt+1).indgen(-actual_shift, ddt)
}
proc build() {
b = new VBox()
b.ref(this)
b.save("")
b.intercept(1)
gdat = new Graph()
xpanel("")
gdat.menu_tool("Select Boundaries", "bound")
xcheckbox("Periodic Boundary Condition", &pcon_, "bcon(0)")
xcheckbox("Zero Boundary Condition", &zcon_, "bcon(1)")
xcheckbox("Use mean = 0", &usemean_, "change()")
xbutton("Reference from Clipboard", "bref()")
xbutton("Test from Clipboard", "btes()")
xpvalue("maxshift", &maxshift, 1, "change_maxshift()")
xpvalue("nominal dt", &nominal_dt, 1, "change()")
xpvalue("actual dt", &ddt)
xpvalue("tbegin", &tbegin, 1, "region_change()")
xpvalue("tend", &tend, 1, "region_change()")
xpanel()
gcor = new Graph()
b.intercept(0)
}
proc bref() {
reference(hoc_obj_, hoc_obj_[1])
pl()
gdat.exec_menu("View = plot")
gcor.exec_menu("View = plot")
}
proc btes() {
test(hoc_obj_, hoc_obj_[1])
pl()
gdat.exec_menu("View = plot")
gcor.exec_menu("View = plot")
}
proc bcon() {
pcon_ = ($1 == 0)
zcon_ = ($1 == 1)
pl()
}
proc change() { pl() }
proc change_maxshift() {
pl()
gcor.size(-maxshift, maxshift, gcor.size(3), gcor.size(4))
}
proc region_change() {
if (tend > tdat[0].x[tdat[0].size-1]) {
tend = tdat[0].x[tdat[0].size-1]
if (tbegin + 4*nominal_dt > tend) {
tbegin = tend - 4*nominal_dt
}
}
if (tbegin < tdat[0].x[0]) {
tbegin = tdat[0].x[0]
}
if (tbegin + 4*nominal_dt > tend) {
tend = tbegin+4*nominal_dt
}
pl()
}
proc pl() {
gdat.erase()
gdat.vfixed(1)
gdat.label(.5, .9)
correl()
bndry(tbegin)
bndry(tend)
gcor.erase()
cor.line(gcor, tcor, 1,1)
}
proc bndry() {
gdat.beginline(3,1)
gdat.line($1, maxdat)
gdat.line($1, mindat)
gdat.flush()
}
proc bound() {
// print $1, $2, $3
if ($1 == 2) {
if (abs($2 - tbegin) < abs($2 - tend)) {
beg = 1
}else{
beg = 0
}
}
if (beg) {
tbegin = $2
}else{
tend = $2
}
region_change()
}
endtemplate CrossCorrelation
objref correl, ydat, tdat
/*
clipboard_retrieve("tmp1.dat")
ydat = hoc_obj_.cl
tdat = hoc_obj_[1].c
clipboard_retrieve("tmp2.dat")
correl = new CrossCorrelation(ydat, tdat, hoc_obj_, hoc_obj_[1])
ydat.resize(1000)
ydat.fill(0)
for i=0, 99 ydat.x[i] = 2
tdat.resize(1000)
tdat.indgen(.01)
correl = new CrossCorrelation(ydat, tdat, ydat, tdat)
*/