diff --git a/pipeline/L1_normalize-utils.R b/pipeline/L1_normalize-utils.R index 1075ef5d..8b023722 100644 --- a/pipeline/L1_normalize-utils.R +++ b/pipeline/L1_normalize-utils.R @@ -252,9 +252,9 @@ expect_silent(unit_conversion(x$value, x$research_name, y, quiet = TRUE)) # The second thing we pass is the observation data frame -# This function returns a logical vector, of the same length as the data_df -# input, that becomes F_OOS -oos <- function(oos_df, data_df) { +# This function returns a logical vector, of the same length as the +# data_df input, that becomes F_OOS +check_oos <- function(oos_df, data_df) { oos_df <- as.data.frame(oos_df) # Make sure that any 'extra' condition columns (in addition to the @@ -303,37 +303,38 @@ test_oos <- function() { # No other conditions beyond time window oos_df <- data.frame(oos_begin = 1, oos_end = 1) - stopifnot(oos(oos_df, data_df) == c(TRUE, FALSE, FALSE)) + stopifnot(check_oos(oos_df, data_df) == c(TRUE, FALSE, FALSE)) oos_df <- data.frame(oos_begin = 4, oos_end = 5) - stopifnot(oos(oos_df, data_df) == c(FALSE, FALSE, FALSE)) + stopifnot(check_oos(oos_df, data_df) == c(FALSE, FALSE, FALSE)) oos_df <- data.frame(oos_begin = 0, oos_end = 2) - stopifnot(oos(oos_df, data_df) == c(TRUE, TRUE, FALSE)) + stopifnot(check_oos(oos_df, data_df) == c(TRUE, TRUE, FALSE)) oos_df <- data.frame(oos_begin = 0, oos_end = 3) - stopifnot(oos(oos_df, data_df) == c(TRUE, TRUE, TRUE)) + stopifnot(check_oos(oos_df, data_df) == c(TRUE, TRUE, TRUE)) # x condition - doesn't match even though timestamp does oos_df <- data.frame(oos_begin = 1, oos_end = 1, x = "b") - stopifnot(oos(oos_df, data_df) == c(FALSE, FALSE, FALSE)) + stopifnot(check_oos(oos_df, data_df) == c(FALSE, FALSE, FALSE)) # x condition - matches and timestamp does oos_df <- data.frame(oos_begin = 1, oos_end = 1, x = "a") - stopifnot(oos(oos_df, data_df) == c(TRUE, FALSE, FALSE)) + stopifnot(check_oos(oos_df, data_df) == c(TRUE, FALSE, FALSE)) # x condition - some match, some don't oos_df <- data.frame(oos_begin = 1, oos_end = 2, x = "b") - stopifnot(oos(oos_df, data_df) == c(FALSE, TRUE, FALSE)) + stopifnot(check_oos(oos_df, data_df) == c(FALSE, TRUE, FALSE)) # x and y condition oos_df <- data.frame(oos_begin = 1, oos_end = 2, x = "b", y = 5) - stopifnot(oos(oos_df, data_df) == c(FALSE, TRUE, FALSE)) + stopifnot(check_oos(oos_df, data_df) == c(FALSE, TRUE, FALSE)) oos_df <- data.frame(oos_begin = 1, oos_end = 2, x = "a", y = 5) - stopifnot(oos(oos_df, data_df) == c(FALSE, FALSE, FALSE)) + stopifnot(check_oos(oos_df, data_df) == c(FALSE, FALSE, FALSE)) # Error thrown if condition column(s) not present oos_df <- data.frame(oos_begin = 1, oos_end = 2, z = 1) - out <- try(oos(oos_df, data_df), silent = TRUE) + out <- try(check_oos(oos_df, data_df), silent = TRUE) stopifnot(class(out) == "try-error") } test_oos() -# Read all out-of-service files and check their formatting +# Read all out-of-service files, check their formatting, +# and return as a list of the oos data tibbles read_oos_data <- function(oos_dir) { message("Dir is ", oos_dir) oos_files <- list.files(oos_dir, pattern = "\\.csv$", full.names = TRUE) diff --git a/pipeline/L1_normalize.qmd b/pipeline/L1_normalize.qmd index bce617ad..09160c21 100644 --- a/pipeline/L1_normalize.qmd +++ b/pipeline/L1_normalize.qmd @@ -106,11 +106,8 @@ L1_NORMALIZE <- file.path(params$DATA_ROOT, params$L1_NORMALIZE) source("helpers.R") -# Read out-of-service data and set up a structure to keep track -# of whether each table is used or not +# Read out-of-service data oos_data <- read_oos_data(params$OOS) -oos_data_used <- rep(FALSE, length.out = length(oos_data)) -names(oos_data_used) <- names(oos_data) # Restore old warning setting options(warn = oldwarn) @@ -260,9 +257,8 @@ for(i in seq_along(files_to_process)) { # Is this reasonable? If not, we need to run through # all `oos_data` entries, OR'ing the results as we go, # instead of breaking out - dat$F_OOS <- as.integer(oos(oos_data[[tbl]], dat)) + dat$F_OOS <- as.integer(check_oos(oos_data[[tbl]], dat)) if(sum(dat$F_OOS)) message("\tAdded ", sum(dat$F_OOS), " OOS flags for ", tbl) - oos_data_used[tbl] <- TRUE # won't work when parallelized break } } @@ -323,13 +319,6 @@ for(i in seq_along(files_to_process)) { out[[i]] <- smry } - -# Check whether all out-of-service tables were checked -# If not, this probably indicates a naming mistake -if(!all(oos_data_used)) { - warning("Out-of-service tables never used: ", - paste(names(oos_data_used)[!oos_data_used], collapse = ",")) -} ``` ## Summary diff --git a/pipeline/out-of-service/README.md b/pipeline/out-of-service/README.md index ef8eec25..4c8fa941 100644 --- a/pipeline/out-of-service/README.md +++ b/pipeline/out-of-service/README.md @@ -1,11 +1,11 @@ # out-of-service This folder holds out-of-service (OOS) tables that are -read by `L1_normalize.qmd` and used to add out-of-service flags to data. +read by `L1_normalize.qmd` to add out-of-service flags to data. -Note that **the CSV filenames are important.** They are used as a -pattern that's checked against the data 'Table' during L1_normalize -processing. +**Note that the CSV filenames are important:** they are used as a +pattern that's checked against the data 'Table' column during +L1_normalize processing. OOS tables are CSV files and _must_ have at least three columns: * `Site` - Site name for which these OOS entries apply diff --git a/pipeline/out-of-service/compass-fme-oos/README.md b/pipeline/out-of-service/compass-fme-oos/README.md deleted file mode 100644 index f6e55025..00000000 --- a/pipeline/out-of-service/compass-fme-oos/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# compass-fme-oos - -This folder holds COMPASS-FME instrument maintenance records that are -transformed into out-of-service (OOS) tables in the folder above. - -In both cases, -- copy new rows from google sheet into the CSV -- check times -- technicians sometime use 12hr times, sometimes 24hr - -`troll_maintenance.csv` tracks the "Aquatroll Calibration/Removal Log" -spreadsheet on the COMPASS-FME Google Drive. - -`exo_log.csv` tracks the "EXO calibration/deployment log" sheet on the -COMPASS-FME Google Drive. diff --git a/pipeline/out-of-service/compass-fme-oos/exo_log.csv b/pipeline/out-of-service/compass-fme-oos/exo_log.csv deleted file mode 100644 index 267fe356..00000000 --- a/pipeline/out-of-service/compass-fme-oos/exo_log.csv +++ /dev/null @@ -1,16 +0,0 @@ -Site,year,calibrated,deployed,retrieved,out_of_water,note,name -CRC,2022,2022-03-08,2022-03-10,2022-10-21,2022-07-19,Tube fixing,Fausto MS -OWC,2022,2022-03-07,2022-06-21,2022-11-11,2022-10-05,Firmware update,Fausto MS -PTR,2022,2022-07-19,2022-08-02,2022-10-21,2022-10-19,Stacked on sediment,Fausto MS -OWC,2023,2023-04-05,2023-04-11,2023-11-17,,,Fausto MS -CRC,2023,2023-04-05,2023-04-14,2023-11-17,2023-07-10,Tube fixing,Fausto MS -PTR,2023,2023-04-05,2023-06-19,2023-12-06,2023-11-25,Flying above water,Fausto MS -OWC,2024,2024-03-29,2024-03-29,,2024-04-05,Sensor DO Cap replacement,Fausto MS -CRC,2024,2024-04-25,2024-04-30,,,, -CRC,2025,2025-05-20,2025-06-23,,,, -MSM,2025,2025-11-06,2024-11-21,,,, -MSM,2025,2025-03-11,2025-03-13,,,, -MSM,2025,2025-05-13,2025-05-15,,,, -MSM,2025,2025-06-30,2025-07-01,,,, -MSM,2025,2025-09-08,2025-09-11,,,, -MSM,2025,2025-11-10,2025-11-13,,,, diff --git a/pipeline/out-of-service/compass-fme-oos/fme-oos.R b/pipeline/out-of-service/compass-fme-oos/fme-oos.R deleted file mode 100644 index e1b76ada..00000000 --- a/pipeline/out-of-service/compass-fme-oos/fme-oos.R +++ /dev/null @@ -1,93 +0,0 @@ -# fme-oos.R - -# Need to run this script from within pipeline directory -if(basename(getwd()) != "pipeline") { - stop("Working directory needs to be pipeline/") -} - -library(lubridate) -library(readr) -library(tibble) - -# We read in a version of the Aquatroll Calibration/Removal Log -# (in Monitoring Documents on the COMPASS Google Drive) and restructure it -# into a form ready for out-of-service calculations in L1_normalize.qmd -prep_troll_oos_table <- function(troll) { - # If no time_pulled given, assume 6 AM - tp <- troll$Time_pulled - tp[is.na(tp) | tp == ""] <- "06:00" - - # If no time_replaced given, assume 6 PM - tr <- troll$Time_replaced - tr[is.na(tr) | tr == ""] <- "18:00" - - # If no date_replaced given, assume ongoing - dr <- troll$Date_replaced - dr[is.na(dr) | dr == ""] <- "12/31/2999" - - # Calculate out of service windows - troll$oos_begin <- mdy(troll$Date_pulled, tz = "EST") + hm(tp) - troll$oos_end <- mdy(dr, tz = "EST") + hm(tr) - # Per Peter R., we throw out all data for 24 hours after replacement - troll$oos_end <- troll$oos_end + 60 * 60 * 24 - - # The L1 data have character, not PosixCT, timestamps, so for correct - # comparisons in oos() below need to have that be true here too - troll$oos_begin <- as.character(troll$oos_begin) - troll$oos_end <- as.character(troll$oos_end) - - # Rename columns to match the design table entries - troll$Instrument_ID <- troll$Troll - troll$Plot <- troll$Location - - # Return a data frame with the needed columns: the oos begin and end, - # as well as the additional columns to match - troll[c("Site", "Plot", "Instrument_ID", "oos_begin", "oos_end")] -} - -# Restructure the EXO calibration/deployment log -# (https://docs.google.com/spreadsheets/d/1y08XAOzzpLZbIOMJquVUv-jSHXhHJpF9neG5kcJpnjQ/edit#gid=913708372) -prep_exo_oos_table <- function(exo) { - # Out of service until deployment - exo$oos_begin <-ymd(paste0(exo$year, "-01-01"), tz = "EST") - exo$oos_end <- force_tz(exo$deployed + hm("21:00"), tzone = "EST") - - # Out of service after retrieval - exo2 <- tibble( - Site = exo$Site, - oos_begin = force_tz(exo$retrieved + hm("03:00"), tzone = "EST"), - oos_end = ymd(paste0(exo$year, "-12-31"), tz = "EST") - ) - - # And, out of service when out of water - exo3 <- tibble( - Site = exo$Site, - oos_begin = force_tz(exo$out_of_water + hm("03:00"), tzone = "EST"), - oos_end = force_tz(exo$out_of_water + hm("21:00"), tzone = "EST") - ) - - exo <- exo[c("Site", "oos_begin", "oos_end")] - exo <- rbind(exo, exo2, exo3) - - # The L1 data have character, not PosixCT, timestamps, so for correct - # comparisons in oos() below need to have that be true here too - exo$oos_begin <- as.character(exo$oos_begin) - exo$oos_end <- as.character(exo$oos_end) - - exo[!is.na(exo$oos_begin),] -} - - -# Read the Aquatroll out-of-service table -troll <- read_csv("out-of-service/compass-fme-oos/troll_maintenance.csv", - col_types = "ccccccccc") -oos_troll <- prep_troll_oos_table(troll) -# This tibble should be written as "WaterLevel600.csv" - -# Read the EXO out-of-service table -exo <- read_csv("out-of-service/compass-fme-oos/exo_log.csv", - col_types = "cdDDDDcc") -oos_exo <- prep_exo_oos_table(exo) -# This tibble should be written as "ExoTable.csv" - -message("All done. See comments about writing oos_troll and oos_exo") diff --git a/pipeline/out-of-service/compass-fme-oos/troll_maintenance.csv b/pipeline/out-of-service/compass-fme-oos/troll_maintenance.csv deleted file mode 100644 index 304fdad8..00000000 --- a/pipeline/out-of-service/compass-fme-oos/troll_maintenance.csv +++ /dev/null @@ -1,278 +0,0 @@ -Date_pulled,Site,Location,Time_pulled,Date_replaced,Time_replaced,Troll,Sensor_SN,Note -3/7/2022,OWC,W,,3/7/2022,,C,847973, -3/7/2022,OWC,WTE,,3/7/2022,,B,848022, -3/7/2022,OWC,TR,,3/7/2022,,A,848067, -3/7/2022,CRC,UP,,3/7/2022,,A,848069, -3/7/2022,PTR,W,,3/7/2022,,C,848308, -3/7/2022,PTR,UP,,3/7/2022,,A,848345, -3/7/2022,CRC,W,,3/7/2022,,C,848392, -3/7/2022,CRC,TR,,3/7/2022,,B,848523, -3/7/2022,PTR,TR,,3/7/2022,,B,848529, -5/31/2022,MSM,TR,14:00,5/31/2022,,B,848425, -7/19/2022,PTR,W,,7/19/2022,,C,848308, -7/19/2022,PTR,TR,,7/19/2022,,B,848529, -7/19/2022,CRC,UP,0:00,7/28/2022,0:00,A,,From Fausto code - see #121 -7/19/2022,CRC,TR,0:00,7/28/2022,0:00,B,,From Fausto code - see #121 -7/19/2022,CRC,W,0:00,7/28/2022,0:00,C,,From Fausto code - see #121 -7/20/2022,CRC,TR,,7/20/2022,,B,848523, -7/20/2022,CRC,UP,15:30,7/20/2022,,A,848069, -7/20/2022,CRC,W,,7/20/2022,,C,848392, -7/21/2022,OWC,TR,8:00,7/31/2022,0:00,A,,From Fausto code - see #121 -7/21/2022,OWC,WTE,8:00,7/31/2022,0:00,B,,From Fausto code - see #121 -7/21/2022,OWC,W,8:00,7/31/2022,0:00,C,,From Fausto code - see #121 -7/21/2022,OWC,W,,7/21/2022,,C,847973, -7/21/2022,OWC,WTE,,7/21/2022,,B,848022, -7/21/2022,OWC,TR,,7/21/2022,,A,848067, -7/19/2022,PTR,UP,8:00,7/29/2022,8:00,A,848345,From Fausto code - see #121 -8/2/2022,PTR,UP,8:00,8/12/2022,8:00,A,848345,From Fausto code - see #121 -9/15/2022,TMP,C,9:12,9/15/2022,,A,685442, -9/18/2022,MSM,UP,10:46,9/18/2022,,A,848502, -9/18/2022,MSM,TR,11:30,9/18/2022,,B,848425, -9/18/2022,MSM,W,12:23,9/18/2022,,C,847940, -9/20/2022,TMP,SW,9:00,9/20/2022,,A,685410, -9/20/2022,TMP,FW,10:25,9/20/2022,,A,685474, -9/22/2022,GWI,UP,11:50,9/22/2022,,A,848346, -9/22/2022,GWI,TR,12:51,9/22/2022,,B,848277, -9/22/2022,GWI,W,13:41,9/22/2022,,C,847922, -11/07/2022,CRC,TR,13:00,11/07/2022,,B,848523, -11/07/2022,CRC,UP,13:00,11/07/2022,,A,848069, -11/07/2022,PTR,TR,13:00,11/07/2022,,B,848529, -11/07/2022,PTR,UP,13:00,11/07/2022,,A,848345, -11/09/2022,CRC,UP,14:00,11/09/2022,,A,848069, -11/09/2022,CRC,TR,13:30,11/09/2022,,B,848523, -11/09/2022,CRC,W,13:15,11/09/2022,,C,848392, -11/09/2022,PTR,W,15:15,11/09/2022,,C,848308, -11/09/2022,OWC,TR,,11/09/2022,,A,848067, -11/22/2022,OWC,WTE,13:48,11/22/2022,,B,848022, -11/22/2022,OWC,W,14:50,11/22/2022,,C,847973, -1/24/2023,PTR,W,,1/24/2023,,C,848308, -1/24/2023,CRC,W,,1/24/2023,,C,848392, -1/24/2023,CRC,TR,,1/24/2023,,B,848523, -1/24/2023,CRC,UP,,1/24/2023,,A,848069, -1/24/2023,OWC,TR,,1/24/2023,,A,848067, -02/17/2023,CRC,W,12:00,02/17/2023,,C,848392, -02/17/2023,CRC,TR,13:00,02/17/2023,,B,848523, -03/02/2023,CRC,TR,12:30,03/02/2023,,B,848523, -03/02/2023,CRC,W,13:30,03/02/2023,,C,848392, -03/02/2023,CRC,UP,14:30,03/02/2023,,A,848069, -03/02/2023,PTR,UP,15:30,03/02/2023,,A,848345, -03/02/2023,PTR,TR,16:00,03/02/2023,,B,848529, -03/02/2023,PTR,W,16:15,03/02/2023,,C,848308, -03/02/2023,OWC,TR,17:40,03/02/2023,,A,848067, -03/02/2023,OWC,WTE,18:10,03/02/2023,,B,848022, -03/02/2023,OWC,W,18:25,03/02/2023,,C,847973, -03/22/2023,MSM,UP,9:50,03/22/2023,,A,848502, -03/22/2023,MSM,TR,11:30,03/22/2023,,B,951973, -03/22/2023,MSM,W,12:15,03/22/2023,,C,847940, -3/23/2023,PTR,UP,16:30,3/23/2023,,A,848345, -3/23/2023,PTR,TR,15:30,3/23/2023,,B,848529, -3/23/2023,PTR,W,13:30,3/23/2023,,C,848308, -3/30/2023,CRC,W,12:00,3/30/2023,,C,848392, -3/30/2023,CRC,TR,13:42,3/30/2023,,B,848523, -3/30/2023,CRC,UP,14:30,3/30/2023,,A,848069, -3/30/2023,OWC,TR,16:00,3/30/2023,,A,848067, -3/30/2023,OWC,WTE,16:55,3/30/2023,,B,848022, -3/30/2023,OWC,W,17:10,3/30/2023,,C,847973, -3/30/2023,GWI,UP,10:20,3/30/2023,,A,848346, -4/12/2023,GCW,UP,11:00,4/12/2023,,A,685442, -4/17/2023,GCW,W,12:56,4/17/2023,,C,847958, -3/8/2023,GCW,TR,12:00,3/8/2023,,B,848425, -4/21/2023,OWC,WTE,12:00,4/21/2023,,B,848022, -4/21/2023,OWC,TR,12:00,4/21/2023,,A,848067, -6/21/2023,CRC,W,17:42,6/21/2023,17:50,C,848392, -7/7/2023,CRC,UP,12:55,7/7/2023,15:30,A,848069, -7/10/2023,OWC,WTE,16:01,7/10/2023,16:44,B,848022, -7/12/2023,CRC,W,11:13,7/12/2023,12:07,C,848392, -7/12/2023,GCW,W,8:00,7/12/2023,,C,847958, -7/13/2023,CRC,TR,12:48,7/13/2023,13:46,B,848523, -7/13/2023,MSM,W,9:40,7/13/2023,,C,847940, -7/13/2023,MSM,TR,11:40,7/13/2023,,B,951973, -7/14/2023,OWC,TR,13:00,7/14/2023,13:44,A,848067, -7/14/2023,OWC,W,9:43,7/14/2023,10:35,C,847973, -7/14/2023,GCW,TR,11:00,7/14/2023,,B,848425, -7/14/2023,GCW,UP,12:50,7/14/2023,,A,685442, -7/17/2023,PTR,UP,9:45,7/17/2023,12:05,A,848345, -7/19/2023,PTR,TR,16:12,7/19/2023,18:00,B,848529, -7/19/2023,PTR,W,12:20,7/19/2023,12:57,C,848308, -7/19/2023,SWH,TR,10:00,7/19/2023,,B,1011979, -7/19/2023,SWH,W,13:30,7/19/2023,,C,1011987, -7/19/2023,SWH,UP,15:00,7/19/2023,,A,951927, -7/20/2023,GWI,W,9:20,7/20/2023,,C,847922, -7/20/2023,GWI,TR,10:00,7/20/2023,,B,848277, -7/20/2023,GWI,UP,11:00,7/20/2023,,A,848346, -7/25/2023,OWC,TR,11:00,7/25/2023,,A,848067, -7/25/2023,OWC,WTE,14:15,7/25/2023,,B,848022, -7/25/2023,OWC,W,13:45,7/25/2023,,C,847973, -7/27/2023,PTR,W,10:30,7/27/2023,,C,848308, -8/1/2023,PTR,TR,14:55,8/1/2023,,B,848529, -8/1/2023,PTR,UP,12:50,8/1/2023,,A,848345, -8/3/2023,CRC,UP,13:45,8/3/2023,,A,848069, -8/3/2023,CRC,W,12:15,8/3/2023,,C,848392, -8/3/2023,CRC,TR,11:00,8/3/2023,,B,848523, -8/21/2023,CRC,TR,11:09,8/21/2023,11:15,B,848523, -8/21/2023,CRC,W,10:40,8/21/2023,10:45,C,848392, -8/21/2023,CRC,UP,15:42,8/21/2023,15:47,A,848069, -9/7/2023,CRC,W,12:51,9/7/2023,13:50,C,848392, -9/14/2023,PTR,W,10:00,9/14/2023,12:00,C,848308, -9/19/2023,PTR,TR,11:00,9/19/2023,13:40,B,848529, -9/19/2023,PTR,UP,10:30,9/19/2023,12:00,A,848345, -9/21/2023,CRC,TR,12:13,9/21/2023,13:30,B,848523, -10/2/2023,OWC,TR,12:00,,,A,848067, -10/6/2023,CRC,TR,11:30,10/6/2023,11:45,B,848523, -10/11/2023,PTR,UP,12:30,10/11/2023,12:45,A,848345, -10/11/2023,PTR,TR,12:45,10/11/2023,13:00,B,848529, -6/20/2023,CRC,TR,13:20,6/20/2023,13:29,B,848523, -6/20/2023,CRC,W,14:12,6/20/2023,14:19,C,848392, -8/21/2023,CRC,TR,11:05,8/21/2023,11:09,B,848523, -9/27/2023,CRC,UP,11:27,9/27/2023,11:30,A,848069, -9/27/2023,CRC,TR,12:20,9/27/2023,12:23,B,848523, -9/27/2023,CRC,W,12:33,9/27/2023,12:38,C,848392, -10/24/2023,GCW,W,13:00,10/24/2023,14:00,C,847958, -10/24/2023,GCW,TR,13:45,10/24/2023,16:00,B,848425, -10/26/2023,GCW,UP,9:00,10/26/2023,10:00,A,685442, -11/7/2023,MSM,W,9:35,11/7/2023,10:15,C,847940, -11/7/2023,MSM,TR,11:00,11/7/2023,11:45,B,951973, -11/7/2023,MSM,UP,11:53,11/7/2023,12:30,A,848502, -12/5/2023,PTR,UP,9:15,12/5/2023,10:30,A,848345, -12/5/2023,PTR,TR,10:45,12/5/2023,11:45,B,848529, -12/5/2023,PTR,W,12:07,12/5/2023,13:00,C,848308, -12/14/2023,OWC,W,12:35,12/14/2023,13:30,C,847973, -12/14/2023,OWC,WTE,13:43,12/14/2023,14:45,B,848022, -3/5/2024,SWH,Swamp,12:20,3/5/2024,13:00,A,951927, -3/5/2024,SWH,W,14:15,3/5/2024,15:00,C,1011987, -3/5/2024,SWH,TR,15:30,3/5/2024,16:00,B,1011979, -3/7/2024,GWI,UP,10:10,3/7/2024,11:00,A,848346, -3/7/2024,GWI,TR,11:00,3/7/2024,12:00,B,848277, -3/7/2024,GWI,WC,12:00,3/7/2024,1:00,C,847922, -3/12/2024,MSM,UP,11:18,3/12/2024,12:00,A,868502, -3/12/2024,MSM,TR,12:11,3/12/2024,13:00,B,951973, -3/12/2024,MSM,WC,12:48,3/12/2024,13:00,C,847940, -3/15/2024,CRC,TR,11:30,3/15/2024,12:00,B,848523, -3/15/2024,CRC,W,12:00,3/15/2024,12:30,C,848392, -4/5/2024,OWC,TR,,4/5/2024,,A,1017585, -4/5/2024,OWC,WTE,,4/5/2024,,B,848022, -4/5/2024,OWC,W,,4/5/2024,,C,847973, -5/2/2024,OWC,TR,10:45,5/2/2024,13:30,A,1017585, -5/2/2024,OWC,WTE,11:15,5/2/2024,12:55,B,848022, -5/2/2024,OWC,W,12:55,5/2/2024,13:40,C,847973, -4/9/2024,PTR,W,10:45,4/9/2024,11:20,C,848308, -4/9/2024,PTR,TR,11:20,4/9/2024,11:50,B,848529, -4/9/2024,PTR,UP,11:50,4/9/2024,12:10,A,848345, -4/30/2024,CRC,UP,14:30,4/30/2024,15:15,A,848069, -4/30/2024,CRC,TR,15:20,4/30/2024,16:00,B,848523, -4/30/2024,CRC,W,16:05,4/30/2024,16:40,C,848392, -5/2/2024,OWC,TR,10:45,5/2/2024,13:30,A,1017585, -5/2/2024,OWC,WTE,11:15,5/2/2024,12:55,B,848022, -5/2/2024,OWC,W,12:55,5/2/2024,13:40,C,847973, -5/20/2024,GCW,TR,8:30,5/20/2024,10:00,B,848425, -5/20/2024,GCW,WC,10:30,5/20/2024,12:00,C,847958, -6/27/2024,GWI,TR,10:30,6/27/2024,11:30,B,848277, -6/27/2024,GWI,UP,11:50,6/27/2024,12:30,A,848346, -6/27/2024,GWI,WC,12:50,6/27/2024,13:30,C,847922, -7/3/2024,OWC,W,11:00,7/3/2024,11:40,C,847973, -7/24/2024,OWC,TR,10:05,7/24/2024,12:00,A,1017585, -8/14/2024,OWC,TR,12:00,8/14/2024,13:00,A,1017585, -8/14/2024,OWC,WTE,13:05,8/14/2024,14:00,B,848022, -8/14/2024,OWC,W,14:05,8/14/2024,14:30,C,847973, -8/19/2024,CRC,UP,9:31,8/19/2024,10:30,A,848069, -8/19/2024,CRC,TR,11:40,8/19/2024,14:00,B,848523, -8/19/2024,CRC,W,10:55,8/19/2024,11:30,C,848392, -8/23/2024,PTR,W,12:13,8/23/2024,13:05,C,848308, -8/23/2024,PTR,TR,11:08,8/23/2024,11:55,B,848529, -8/23/2024,PTR,UP,9:58,8/23/2024,10:55,A,848345, -8/29/2024,CRC,TR,10:50,8/29/2024,11:00,B,848523, -11/1/2024,CRC,TR,13:24,11/1/2024,13:35,B,, -11/7/2024,CRC,TR,8:35,11/7/2024,9:35,B,848523, -11/7/2024,CRC,W,9:40,11/7/2024,10:40,C,848392, -11/7/2024,CRC,UP,11:00,11/7/2024,11:50,A,848069, -11/7/2024,PTR,UP,13:05,11/7/2024,14:05,A,848345, -11/7/2024,PTR,TR,14:10,11/7/2024,15:05,B,848529, -11/7/2024,PTR,W,15:15,11/7/2024,15:50,C,848308, -11/8/2024,OWC,TR,13:45,11/8/2024,14:30,A,848067, -11/8/2024,OWC,WTE,12:00,11/8/2024,13:40,B,848022, -11/8/2024,OWC,W,11:00,11/8/2024,11:55,C,847973, -11/12/2024,SWH,W,12:00,11/12/2024,13:00,C,1011987, -11/12/2024,SWH,TR,14:00,11/12/2024,15:00,B,1011979, -11/13/2024,SWH,UP,9:00,11/13/2024,10:00,A,1107808, -11/13/2024,SWH,Swamp,10:00,11/13/2024,11:00,B,951927, -11/14/2024,GWI,TR,10:30,11/14/2024,11:30,B,848277, -11/14/2024,GWI,UP,12:00,11/14/2024,13:00,A,848346, -11/14/2024,GWI,W,13:00,11/14/2024,14:00,C,847922, -11/13/2024,CRC,TR,10:30,11/13/2024,12:00,B,848523, -11/13/2024,CRC,W,12:20,11/13/2024,12:50,C,848392, -11/13/2024,CRC,UP,13:05,11/13/2024,14:10,A,848069, -11/13/2024,PTR,UP,8:00,11/13/2024,8:30,A,848345, -11/13/2024,PTR,TR,8:30,11/13/2024,9:00,B,848529, -11/13/2024,PTR,W,9:00,11/13/2024,9:30,C,848308, -11/20/2024,OWC,TR,10:00,11/20/2024,11:15,A,848067, -11/20/2024,OWC,WTE,11:15,11/20/2024,11:45,B,848022, -11/20/2024,OWC,W,11:55,11/20/2024,12:50,C,847973, -11/21/2024,MSM,W,11:15,11/21/2024,12:00,C,847940, -11/21/2024,MSM,TR,12:45,11/21/2024,13:30,B,951973, -11/21/2024,MSM,UP,14:05,11/21/2024,15:00,A,848502, -12/3/2024,OWC,TR,10:30,12/3/2024,12:35,A,1017585, -3/4/2025,OWC,TR,8:30,3/4/2025,11:00,A,848067, -3/4/2025,OWC,WTE,11:00,3/4/2025,12:00,B,848022, -3/3/2025,GCW,UP,13:00,3/3/2025,15:00,A,1150428, -3/3/2025,GCW,TR,14:30,3/3/2025,16:00,B,848425, -3/5/2025,GCW,W,9:45,3/5/2025,12:00,C,847958, -3/11/2025,PTR,UP,11:30,3/11/2025,12:15,A,848345, -3/11/2025,PTR,TR,12:15,3/11/2025,13:00,B,848529, -3/11/2025,PTR,W,13:00,3/11/2025,13:45,C,848308, -3/11/2025,CRC,UP,15:00,3/11/2025,16:00,A,848069, -3/14/2025,CRC,TR,10:00,3/14/2025,12:15,B,1017585, -3/19/2025,GWI,W,8:48,3/19/2025,10:00,C,847922, -3/19/2025,GWI,TR,10:06,3/19/2025,11:00,B,848277, -3/19/2025,GWI,UP,10:55,3/19/2025,11:30,A,848346, -3/18/2025,SWH,W,10:55,3/18/2025,11:30,C,1011987, -3/18/2025,SWH,SWAMP,13:05,3/18/2025,13:30,B,951927, -3/18/2025,SWH,UP,13:45,3/18/2025,14:15,A,1107808, -3/18/2025,SWH,TR,14:45,3/18/2025,15:15,B,1011979, -3/13/2025,MSM,UP,11:00,3/13/2025,11:30,A,848502, -3/13/2025,MSM,TR,12:30,3/13/2025,13:00,B,951973, -3/13/2025,MSM,W,13:10,3/13/2025,14:00,C,847940, -4/1/2025,OWC,W,10:30,4/1/2025,12:00,C,847973, -4/1/2025,CRC,W,17:00,4/1/2025,18:00,C,848392, -6/27/2025,OWC,W,12:45,6/27/2025,13:30,C,847973, -6/27/2025,OWC,WTE,13:45,6/27/2025,14:30,B,848022, -6/27/2025,OWC,TR,14:45,6/27/2025,15:00,B,848067, -7/1/2025,CRC,W,8:45,7/1/2025,9:30,C,848392, -7/1/2025,CRC,TR,9:45,7/1/2025,10:15,B,1017585, -7/1/2025,CRC,UP,13:00,7/1/2025,13:30,A,848069, -7/11/2025,GCW,W,11:00,7/11/2025,12:00,B,847958, -7/11/2025,GCW,TR,13:30,7/11/2025,15:00,C,848346, -7/15/2025,MSM,UP,15:00,7/15/2025,17:00,A,951977, -7/15/2025,CRC,TR,10:30,7/15/2025,12:00,B,1017585, -7/15/2025,CRC,W,10:00,7/15/2025,11:30,C,848392, -7/22/2025,SWH,TR,8:30,7/22/2025,9:30,B,1011979, -7/22/2025,SWH,W,9:00,7/22/2025,10:00,C,1011987, -7/22/2025,SWH,SWAMP,10:10,7/22/2025,11:00,B,951927, -7/22/2025,SWH,UP,11:24,7/22/2025,12:00,A,1107808, -7/23/2025,GWI,W,12:35,7/23/2025,1:00,C,847922, -7/24/2025,GWI,TR,9:10,7/24/2025,10:00,B,848277, -7/24/2025,GWI,UP,8:30,7/24/2025,9:30,A,848425, -7/29/2025,PTR,W,11:00,7/29/2025,11:30,C,848529, -7/29/2025,PTR,TR,12:00,7/29/2025,12:30,B,848308, -7/30/2025,CRC,TR,10:00,7/30/2025,10:30,B,848523, -7/30/2025,PTR,UP,12:00,7/30/2025,14:00,A,1017585, -8/26/2025,CRC,TR,10:00,8/26/2025,11:00,B,848523, -8/27/2025,PTR,UP,10:30,8/27/2025,12:00,A,1240492, -9/5/2025,CRC,UP,15:00,9/5/2025,16:00,A,848523, -9/26/2025,OWC,W,10:45,9/26/2025,11:15,B,847973, -9/26/2025,PTR,UP,12:00,9/26/2025,13:15,A,848345, -9/26/2025,PTR,W,13:00,9/26/2025,13:30,C,848308, -10/2/2025,OWC,TR,10:30,10/2/2025,12:00,B,848067, -10/2/2025,OWC,WTE,11:00,10/2/2025,12:30,B,848022, -11/4/2025,SWH,TR,10:30,11/4/2025,11:00,B,1011979, -11/4/2025,SWH,W,13:40,11/4/2025,14:30,C,1011987, -11/5/2025,SWH,UP,9:30,11/5/2025,10:00,B,1107808, -11/5/2025,SWH,SWAMP,10:55,11/5/2025,11:30,A,951927, -11/6/2025,GWI,TR,10:15,11/6/2025,11:00,B,848277, -11/6/2025,GWI,UP,11:30,11/6/2025,12:00,A,848425, -11/6/2025,GWI,W,12:30,11/6/2025,13:00,C,1150742, -11/13/2025,MSM,UP,10:30,11/13/2025,11:00,A,951973, -11/13/2025,MSM,W,11:10,11/13/2025,12:00,C,1150428, -11/13/2025,MSM,TR,12:30,11/13/2025,13:00,B,847922, -12/8/2025,GCW,W,8:00,12/8/2025,9:00,C,848502, -12/8/2025,GCW,UP,9:45,12/8/2025,11:00,A,1150434, -12/8/2025,GCW,TR,9:45,12/8/2025,11:00,B,848346,