#' filter data interactive
#'
#' @description Interactive filtering of awk filtered data. Awk files may miss colnames. make shure they have colnames(data)="timestamp", "samples", "duration", "signal_freq", "signal_bw", "max_signal","noise", "receiver", "station"
#'
#'
#' @author Jannis Gottwald
#'
#'
#'
#' @param animal list, generated by initanimal function
#' @param projList list, generatet by initProject function
#' @param station string, path to awk filtered file
#' @param nth num, subset data for plotting using only every nth column
#'
#'
#' @export
#'
#'
filter_interactive<-function(projList, animal, path_to_data=".", nth){
stat<-data.table::fread(path_to_data)
if(all(!(c("timestamp", "samples", "duration", "signal_freq", "signal_bw", "max_signal","noise", "receiver", "station") %in% colnames(stat)))){
colnames(stat)<-c("timestamp", "samples", "duration", "signal_freq", "signal_bw", "max_signal","noise", "receiver", "station")}
stat<-stat[!is.na(stat$timestamp),]
stat<-stat[!is.na(stat$max_signal),]
if(nrow(stat)>=10){
tmp = stat[seq(1, nrow(stat), nth), ]
print(plot(x=tmp$signal_freq, y=tmp$max_signal, ylim=c(45,100),panel.first=grid(ny=10)))
if(continue()=="Y"){
cat("willst du die daten im oberen dB Bereich abschneiden, weil z.B. ein weiterer Sender reinfunkt? Wenn nicht gebe gleich einen Wert ein, der oberhalb deiner Verteilung liegt")
c1<-where_cut()
stat<-stat[stat$max_signal<=c1,]
done<-FALSE
while(!done){
stat<-stat[!is.na(stat$timestamp),]
tmp = stat[seq(1, nrow(stat), nth), ]
print(plot(x=tmp$signal_freq, y=tmp$max_signal, ylim=c(45,100),panel.first=grid(ny=10)))
dat<-stat
cat("Als naechstes kannst du die Daten unterhalb eines wertes rechts und links der Mittelfrequenz abschneiden. Hier erstmal grob den gesamten Pilz-z.B. <80dB links (-3) rechts (+10)")
lst1<-upper_cut()
lst1<-unlist(lst1)
dat$sig_diff<-dat$signal_freq-(animal$meta$freq)
dat<-dat[!(dat$max_signal<=lst1[1] & (dat$sig_diff<=lst1[2] | dat$sig_diff>=lst1[3])),]
tmp = dat[seq(1, nrow(dat), nth), ]
print(plot(x=tmp$signal_freq, y=tmp$max_signal, ylim=c(45,100) ,panel.first=grid(ny=10)))
s<-success()
done <- s =="Y"
if(done=="Y"){cat("next filter step")}
if(done=="N"){cat("Back to ")}
}
done<-FALSE
while(!done){
cat("hier wird unterhalb des Schirms etwas feiner ausgeschnitten. z.B unterhalb 60dB links(-0.5) und rechts (1)")
dat2<-dat
tmp = dat2[seq(1, nrow(dat), nth), ]
print(plot(x=tmp$signal_freq, y=tmp$max_signal, ylim=c(45,100),panel.first=grid(ny=10)))
lst2<-upper_cut()
lst2<-unlist(lst2)
dat2<-dat2[!(dat2$max_signal<=lst2[1] & (dat2$sig_diff<=lst2[2] | dat2$sig_diff>=lst2[3])),]
tmp = dat2[seq(1, nrow(dat), nth), ]
print(plot(x=tmp$signal_freq, y=tmp$max_signal, ylim=c(45,100),panel.first=grid(ny=10)))
s<-success()
done <- s =="Y"
if(done=="Y"){cat("next filter step")}
if(done=="N"){cat("Back to ")}
}
done<-FALSE
while(!done){
#tmp = dat[seq(1, nrow(dat), 100), ]
print(plot(x=tmp$signal_freq, y=tmp$max_signal, ylim=c(45,100) ,panel.first=grid(ny=10)))
df<-dat2
cat("hier kannst du angeben zwischen welchem unteren und oberen dB Wert die Mittelfrequenz und die Standardabweichung berechnet werden sollen. z.B. unten 55 oben 60 ")
lst3<-fun_fine()
lst3<-unlist(lst3)
print(lst3)
tmp<-tmp[!is.na(tmp$max_signal),]
mid_freq<-mean(tmp[tmp$max_signal>=lst3[1] & tmp$max_signal<=lst3[2],]$signal_freq)
print(mid_freq)
sd_freq<-4*sd(tmp[tmp$max_signal>=lst3[1] & tmp$max_signal<=lst3[2],]$signal_freq)
print(sd_freq)
cat("wenn die Standardabweichung kleiner 1 und Mittelfrequenz im Bereich der Senderfrequenz Y")
ok<-fun_param_okay(mid_freq = mid_freq, sd_freq = sd_freq)
if(ok=="Y"){
df$sig_diff<-abs(df$signal_freq-(mid_freq))
cat("Ab wo soll mit der Standardabweichung ausgeschnitten werden? In der Regel ein Wert knapp ueber deem Muellteppich")
c<-where_cut()
df<-df[!(df$max_signal<=c & df$sig_diff>=sd_freq),]
tmp = df[seq(1, nrow(df), nth), ]
print(plot(x=tmp$signal_freq, y=tmp$max_signal, ylim=c(45,100), panel.first=grid(ny=10)))
s<-success()
done <- s =="Y"
if(done=="Y"){cat("station successfully filtered")}
if(done=="N"){cat("Back to ")}
}}
param<-data.frame(cut_rough_max_signal=lst1[1], cut_rough_freq_er=lst1[2], cut_lower=lst2[1], cut_upper=lst2[2], sd=sd_freq, mid_freq=mid_freq, station=stat$station[1], ID=animal$meta$animalID)
write.csv(param,paste0(projList$path$param_lst, "/", animal$meta$animalID,"_",df$station[1], "_filter_parameter.csv"))
data.table::fwrite(df, paste0(animal$path$filtered, "/",gsub(".csv", "", basename(path_to_data)), "_filtered.csv"))
}}}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.