// $Id: hinton.hoc,v 1.33 2004/10/07 19:03:12 billl Exp $
// load_file("hinton.hoc")
load_file("colors.hoc")
//* decl
objref nilsl,ghint,cmat
nilsl = new SectionList()
// func mod101 () { return($1%101) }
// cmat = new Vector()
// cmat.resize(500*100)
// cmat.indgen()
// cmat.apply("mod101")
// plot2d(ghint,-90,50)
// draw2d(ghint,cmat,500)
//* plot2d(g[,min,max,ratio]); plot2d(g[,vec,ratio]); plot2d(g,ratio)
proc plot2d () { local ratio,width
$o1 = new PlotShape(nilsl,0)
flush_list.append($o1)
c1($o1,63)
ratio=1 width=500
if (numarg()>=2) {
if (argtype(2)==1) {
$o1.scale($o2.min,$o2.max)
if (numarg()>=3) ratio=$3
} else {
if (numarg()==2) ratio=$2
if (numarg()>=3) $o1.scale($2,$3)
if (numarg()>=4) ratio=$4
}
} else $o1.scale(0,100)
$o1.view(0,100,0,100,100,50,width,ratio*500)
$o1.erase_all
}
//** draw2d(g,mat,cols) draw transpose of matrix
xpos=yoff=0 // xpos==transpose
scly=1
proc he () { ghint.erase_all() }
proc draw2d () { local i,j,k,ny,nx
if (numarg()>=3) nx=$3 else nx=cols
ny=$o2.size/nx
wdt=.01
if (!xpos) for i=0,nx-1 for j=0,ny-1 {
k=ny-1-j // reverse j
// ptr xloc yloc xsz ysz
$o1.hinton(&$o2.x[j*nx+i], (i+.5)*wdt, yoff+(k+.5)*wdt*scly, wdt, wdt*scly) }
if ( xpos) for i=0,nx-1 for j=0,ny-1 {
$o1.hinton(&$o2.x[j*nx+i], (j+.5)*wdt, yoff+(i+.5)*wdt*scly, wdt, wdt*scly) }
$o1.size(0, i*wdt, 0, j*wdt*scly)
$o1.exec_menu("Shape Plot")
$o1.flush
}
// hgg(color_vec, yloc_vec, xloc[, xwidth, flag]) flag means horizontal
// like gg() but draw vec vs vec as a hinton plot
proc hgg () { local xyloc,flag,max,ii,a,wdt,wflag
if (numarg()==0) {
print "hgg(color_vec, yloc_vec, xloc[, xwidth (vec or num), flag]) flag means horizontal"
return }
a=allocvecs(1)
xyloc=$3
flag=wflag=0
wdt=$o2.max/12 // to put 12 in a row next to each other and get square
if (numarg()>=4) if (argtype(4)==1) wflag=1 else wdt=$4
if (numarg()>=5) flag=$5
mso[a].deriv($o2,1,1) mso[a].append(mso[a].mean) mso[a].add(0.01*mso[a].mean)
for ii=0,$o1.size-1 {
if (wflag) wdt=$o4.x[ii]+1e-3 // should be non-zero width
if (flag){
ghint.hinton(&$o1.x[ii],$o2.x[ii]+mso[a].x[ii]/2, xyloc, mso[a].x[ii], wdt)
} else { // color xloc yloc xsz ysz
ghint.hinton(&$o1.x[ii], xyloc, $o2.x[ii]+mso[a].x[ii]/2, wdt, mso[a].x[ii]) }
// print $o1.x[ii], xyloc, $o2.x[ii]+mso[a].x[ii]/2, wdt, mso[a].x[ii]
}
dealloc(a)
}
proc showghint () {
ghint.exec_menu("Shape Plot")
ghint.exec_menu("View = plot")
ghint.fastflush
doEvents()
}
//** anim2d(g,mat,cols) draws slowly
proc anim2d () { local i,j,ny,nx
$o1.erase_all ny=$o2.size/nx
if (numarg()>=3) nx=$3 else nx=cols
wdt=.01
for i=0,nx-1 {
for j=0,ny-1 $o1.hinton(&$o2.x[j*nx+i],(i+.5)*wdt,(j+.5)*wdt,wdt)
$o1.flush
doEvents()
}
}