====== binokulare Sakkaden ======
Nachdem die Sakkaden im li. und re. detektiert worden sind, ist die nächste Aufgabe, die zusammengehörigen Sakkaden zu finden und eine gemeinsame Liste zu formen:
mgx <- function(l,r) {
dexarr <- array(dim=c(0,2))
ir <- 1
for ( il in 1:(length(l$t2)-1) ) {
while( l$t1[il] >= r$t3[ir] ) {
dexarr <- rbind( dexarr, c(NA,ir))
ir <- ir+1; }
if( l$t3[il] < r$t1[ir] ) dexarr <- rbind( dexarr, c(il,NA)) else {
dexarr <- rbind( dexarr, c(il,ir)) ; ir <- ir+1; }
}
dexarr}
mg <- function(l,r) { mgx( rbind(l[1:3],c(9999999,Inf,Inf)),rbind(r[1:3],c(9999999,Inf,Inf))) }
Sakkaden werden als zusammengehörig angesehen, wenn die Intervalle ''t1:t3'' der beiden Augen sich überlappen, also wenn
l$t1 < r$t3 & r$t1 < l$t3
gilt. Um ständige Abfragen auf Ende der Liste zu vermeiden, werden beide Listen mit einem Ende in weiter Zukunft abgeschlossen und die Hilfsfunktion ''mgx'' von ''mg'' aufgerufen.
Versuche mit mehr als 10% Ausfall landen auf der Badlist:
bad.list <- names(ausw.liste)[unlist(lapply(ausw.liste,
function(x){sum(x[["nas"]][,2]-x[["nas"]][,1])/x[["N"]]>0.1}))]
Für die statistische Auswertung werden die Sakkadenpaare in einem Dataframe ''mg.long'' gesammelt. Die Multiplikationen mit 2 für die Trigger-Zeiten dient der Umrechnung auf reale Millisekunden (bei 500Hz Abtastung).
mg.long <- NULL
for( fn in names(ausw.liste)) {
sakks2.mg <- with(ausw.liste[[fn]]$sakks2,mg(sakk.l,sakk.r))
tg <- with(ausw.liste[[fn]],approxfun(2*trig,trigv,method="c"))
nas <- unlist(apply(ausw.liste[[fn]]$nas,1,function(x)(2*x[1]):(2*x[2])))
mg.long <- rbind(mg.long, with(ausw.liste[[fn]]$sakks2,
cbind(fn,sakk.l[sakks2.mg[,1],],sakk.r[sakks2.mg[,2],],
l.na = is.element(sakk.l[sakks2.mg[,1],1],nas)
| is.element(sakk.l[sakks2.mg[,1],2],nas)
| is.element(sakk.l[sakks2.mg[,1],3],nas),
r.na = is.element(sakk.r[sakks2.mg[,1],2],nas)
| is.element(sakk.r[sakks2.mg[,2],2],nas)
| is.element(sakk.r[sakks2.mg[,2],3],nas),
l.tg=tg(sakk.l[sakks2.mg[,1],1]), r.tg=tg(sakk.r[sakks2.mg[,2],1]),
l.tg100=tg(sakk.l[sakks2.mg[,1],1]+100), r.tg100=tg(sakk.r[sakks2.mg[,2],1]+100)
)))
}
Am fertigen Dataframe werden noch einige Daten berechnet: die Sakkadenweite ''w.i'', die Richtung ''phi''.
names(mg.long)[2:10] <- paste("l", names(mg.long)[2:10], sep=".")
names(mg.long)[9+2:10] <- paste("r", names(mg.long)[9+2:10], sep=".")
mg.long$VP <- substring(mg.long$fn,1,3)
mg.long$l.w.i <- sqrt(mg.long$l.w.h^2+mg.long$l.w.v^2)
mg.long$r.w.i <- sqrt(mg.long$r.w.h^2+mg.long$r.w.v^2)
mg.long$l.phi <- with(mg.long,atan2(l.w.h,l.w.v))*180/pi
mg.long$r.phi <- with(mg.long,atan2(r.w.h,r.w.v))*180/pi
mg.long$match.h <- with(mg.long,(l.w.h-r.w.h)^2/(l.w.h^2+r.w.h^2+0.1))
mg.long$match.v <- with(mg.long,(l.w.v-r.w.v)^2/(l.w.v^2+r.w.v^2+0.1))
#mg.good <- subset(mg.long,!(l.na|r.na|is.element(fn,bad.list)|l.t3-l.t1>99|r.t3-l.t1>99))
mg.good <- subset(mg.long,!(l.na|r.na|is.element(fn,bad.list)))
mg.long.binocular <- subset(mg.long,!is.na(l.t1) & ! is.na(r.t1))
mg.good.binocular <- subset(mg.good,!is.na(l.t1) & ! is.na(r.t1))
mg.micro <- subset(mg.good.binocular,l.w.h^2+l.w.v^2+r.w.h^2+r.w.v^2 < 2)
par(mfrow=c(1,3))
hist(subset(mg.micro,l.tg100>0&l.tg100<8)$l.w.h,br=33)
hist(subset(mg.micro,l.tg100>7&l.tg100<15)$l.w.h,br=33)
hist(subset(mg.good,abs(l.w.h)<1&l.tg100>0&l.tg100<8)$l.w.h,br=33)
hist(subset(mg.good,abs(l.w.h)<1&l.tg100>14)$l.w.h,br=33)
boxplot(l.w.h~VP,subset(mg.good,abs(l.w.h)<1&l.tg100>0&l.tg100<8))
plot(l.v.c~l.v.i,subset(mg.micro,l.tg100>7&l.tg100<15),pch=".",col=1+as.numeric(factor(substring(fn,1,3))))
rate.l <- unlist(lapply(ausw.liste,function(x)with(x$sakks2$sakk.l,median(c(t2,999999)-c(0,t2)))))
rate.r <- unlist(lapply(ausw.liste,function(x)with(x$sakks2$sakk.r,median(c(t2,999999)-c(0,t2)))))