R/filter_interactive.R

Defines functions filter_interactive

Documented in filter_interactive

#' 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"))
  
  
}}}
JannisGottwald/N40RTS documentation built on Feb. 1, 2021, 5:13 p.m.