tests/testthat/proto-dam5.R

read_dam5_file <- function(path,
                           region_id = 1:32,
                           start_datetime = -Inf,
                           stop_datetime = +Inf,
                           tz = "UTC"){
  # todo check whether region has duplicates/ is in range
  regions <- region_id
  start_datetime <- damr:::parse_datetime(start_datetime, tz = tz)
  stop_datetime <- damr:::parse_datetime(stop_datetime, tz = tz)

  first_last_lines <- damr:::find_dam2_first_last_lines(path,
                                                 start_datetime,
                                                 stop_datetime,
                                                 tz)
  first_line = first_last_lines$id[1]
  last_line = first_last_lines$id[2]
  col_types = do.call(readr::cols_only, DAM5_COLS)

  # todo we do not have to read all regions and when filter.
  # We can already load only the channels we want here.
  df <-readr::read_tsv(path, col_names = names(DAM5_COLS),
                       col_types = col_types,
                       skip = first_line-1,
                       n_max = last_line-first_line+1,
                       progress = F)
  return(df)
  #  return(start_datetime)
  df <- as.data.table(df)
  df <- df[, datetime := paste(date,time, sep=" ")]
  suppressWarnings(
    df <- df[, datetime_posix  := as.POSIXct(strptime(datetime,"%d %b %y %H:%M:%S",tz=tz))]
  )
  df[, datetime := NULL]
  setnames(df, "datetime_posix", "datetime")

  # if start date is not defined, t0 is the first read available, whether or not is is valid!
  if(is.infinite(start_datetime))
    t0 = df$datetime[1]
  else
    t0 = start_datetime

  experiment_id <- paste(format(t0, format = "%F %T"), basename(path),sep="|")
  df <- df[status == 1]
  df <- unique(df, by="datetime")
  df <- df[, (colnames(df) %like% "(channel)|(datetime)"), with=F]
  setnames(df,
           grep("channel_", colnames(df), value = T),
           gsub("channel_", "0", grep("channel_", colnames(df), value = T)))
  df <- melt(df, id="datetime", variable.name = "channel", value.name = "activity")

  dt <- df[ ,. (id = as.factor(sprintf("%s|%02d",experiment_id, as.integer(channel))),
                region_id = as.integer(channel),
                t = as.numeric(datetime-t0, units = "secs"),
                activity=activity)]

  setkeyv(dt, "id")

  dt <- dt[region_id %in% regions]
  meta <- unique(dt[, c("id","region_id")],by="id")

  meta[,experiment_id := experiment_id]
  meta[,start_datetime := t0]

  file_info <- meta[,.(file_info =  list(list(path = path, file = basename(path)))), by="id"]
  meta <- file_info[meta]
  #meta <- met[,file:=basename(path)]
  dt[,region_id:=NULL]

  behavr::behavr(dt,meta)
}


path <- "./tests/testthat/M30_DAM5.txt"
start_datetime = -Inf
stop_datetime = +Inf
tz = "UTC"
start_datetime <- damr:::parse_datetime(start_datetime, tz = tz)
stop_datetime <- damr:::parse_datetime(stop_datetime, tz = tz)
first_last_lines <- damr:::find_dam_first_last_lines(path,
                                                    start_datetime,
                                                    stop_datetime,
                                                    tz)

start_datetime = "2017-12-21 18:00:00"
stop_datetime = "2017-12-21 20:00:00"
start_datetime <- damr:::parse_datetime(start_datetime, tz = tz)
stop_datetime <- damr:::parse_datetime(stop_datetime, tz = tz)
first_last_lines <- damr:::find_dam_first_last_lines(path,
                                                      start_datetime,
                                                      stop_datetime,
                                                      tz)

Try the damr package in your browser

Any scripts or data that you put into this service are public.

damr documentation built on Nov. 16, 2020, 9:06 a.m.