// $Id: staley.hoc,v 1.23 2010/01/15 21:07:35 samn Exp $
print "Loading staley.hoc..."
{install_staley()}
//* trace analysis
//** outputnqs = getsznq(inputvector)
// gets an nqs with time-bounds of seizures detected with staley code in staley.mod
obfunc getsznq () { local i,ns localobj nqsz,vtmp
nqsz=new NQS("id","numspikest","startidx","endidx","startms","endms","startmin","endmin")
vtmp=$o1
if ((ns=vtmp.getseizures(nqsz.v[1],nqsz.v[2],nqsz.v[3]))<1) return nil // "no seizures found"
if(ns>1) nqsz.v[0].indgen(0,nqsz.v[1].size-1,1) else nqsz.v[0].append(0)
for i=2,3 {
nqsz.v[i+2].copy(nqsz.v[i])
nqsz.v[i+2].mul(1e3/samprate_staley)
nqsz.v[i+4].copy(nqsz.v[i+2])
nqsz.v[i+4].div(60000)
}
return nqsz
}
//** getallchsznq(inputnqs with coumns as EEG time-series,vmask - mask of which columns to find seizures for)
// get seizures on all channels of inputnqs($o1) specified in vids($o2)
// in output nqs, "id" has the seizure identifier within a given channel, and "gid"
// has the global seizure identifier across all channel
// vmask.x(i) == 1 iff should use channel i (inputnqs.v[i]) to find seizures, otherwise channel i is skipped
obfunc getallchsznq () { local a,idx,bsz,esz,ii,jj,lend,nid,gid,mii,mxi,changed,done,i,j,st1,st2,et1,et2,tt\
localobj nqin,nqout,vmask,nqtmp,vch,vfrag,vb,ve,vdur,v1,v2,v3,\
vsmin,vemin,vnsmin,vnemin,vid,vbe,vbi
nqin=$o1 vmask=$o2
if (vmask==nil) {vmask=getvmask(nqin) $o2=vmask}
nqout=new NQS("id","numspikest","startidx","endidx","startms","endms","startmin","endmin","ch")
nqout.info.set("chans",vch=new Vector(0)) nqout.info.set("frags",vfrag=new Vector(0))
nqout.info.set("beg",vb=new Vector(0)) nqout.info.set("end",ve=new Vector(0))
nqout.info.set("dur",vdur=new Vector(0))
nqout.info.set("begidx",vbi=new Vector(0)) nqout.info.set("endidx",vbe=new Vector(0))
a=allocvecs(v1,v2,v3,vsmin,vemin,vid,vnsmin,vnemin)
for idx=0,vmask.size-1 if(vmask.x(idx)!=0) {
// printf("looking for seizures on column %d\n",idx)
if((nqtmp=getsznq(nqin.v[idx]))!=nil) {
nqtmp.resize("ch") nqtmp.pad() nqtmp.v[nqtmp.m-1].fill(idx)
nqout.append(nqtmp) nqsdel(nqtmp)
}
}
{nqout.sort("endmin") nqout.sort("startmin")}
{vid.resize(nqout.v.size) vsmin.copy(nqout.getcol("startmin")) vemin.copy(nqout.getcol("endmin"))}
for i=0,vsmin.size-1 { //find start/end of seizures overlapping across channels
{st1=vsmin.x(i) et1=vemin.x(i)}
for j=0,vsmin.size-1 if(i!=j) {
{st2=vsmin.x(j) et2=vemin.x(j)}
if(st2>=st1 && st2<=et1) {
{st1=MIN(st1,st2) et1=MAX(et1,et2)}
{vsmin.x(i)=vsmin.x(j)=st1 vemin.x(i)=vemin.x(j)=et1}
} else if(st1>=st2 && st1<=et2) {
{st1=MIN(st1,st2) et1=MAX(et1,et2)}
{vsmin.x(i)=vsmin.x(j)=st1 vemin.x(i)=vemin.x(j)=et1}
}
}
}
{vrsz(0,vnsmin,vnemin) nid=tt=0} //set global ids for seizures
if(vsmin.size>0) {tt=vemin.x(0)-vsmin.x(0) vnsmin.append(vsmin.x(0)) vnemin.append(vemin.x(0))}
if(vsmin.size>1) {
for i=0,vsmin.size-2 {
vid.x(i)=nid
if(vsmin.x(i)!=vsmin.x(i+1) || vemin.x(i)!=vemin.x(i+1)) {
{nid+=1 vnsmin.append(vsmin.x(i+1)) vnemin.append(vemin.x(i+1))}
}
}
if(vsmin.x(i)!=vsmin.x(i-1) || vemin.x(i)!=vemin.x(i-1)) nid+=1 //check last seizure's id
vid.x(i)=nid
} else if(vsmin.size==1) vid.x(0)=0
{nqout.resize("gid") nqout.getcol("gid").copy(vid)}//set the new gids
{vb.copy(vnsmin) ve.copy(vnemin)}
{vbi.copy(vnsmin) vbe.copy(vnemin) vbe.apply("min2ind") vbi.apply("min2ind")}
{vdur.copy(ve) vdur.sub(vb)}
nqout.verbose=0
for ii=0,nid {
vfrag.append(nqout.select("gid",ii))
vch.append(nqout.getcol("ch").uniq())
}
nqout.verbose=1 nqout.tog("DB")
dealloc(a)
return nqout
}
//** stichallsznq(nqs from geallchsznq)
//get nqs with overlapping(in time) seizures combined
obfunc stitchallsznq () { local c1,c2,i,j,a localobj vs,ve,nqo,nqin
a=allocvecs(vs,ve)
nqin=$o1
nqin.tog("DB")
nqin.verbose=0
vrsz(nqin.v.size(),vs,ve)
c1=nqin.fi("startmin")
c2=nqin.fi("endmin")
for i=0,vs.size-1 {
vs.x(i)=nqin.v[c1].x(i)
ve.x(i)=nqin.v[c2].x(i)
}
nqo=new NQS("id","startidx","endidx","startms","endms","startmin","endmin","numspikest")
for i=0,vs.size-1 {
for j=0,vs.size-1 {
}
}
dealloc(a)
nqin.verbose=1
return nqo
}