From d09ae156d05bdccaa72ca1fdf58fb73c2aae29f3 Mon Sep 17 00:00:00 2001 From: Zwart Date: Mon, 18 Dec 2023 16:02:24 -0800 Subject: [PATCH 01/26] renaming r proj --- neon4cast-ci.Rproj => usgsrc4cast-ci.Rproj | 40 +++++++++++----------- 1 file changed, 20 insertions(+), 20 deletions(-) rename neon4cast-ci.Rproj => usgsrc4cast-ci.Rproj (94%) diff --git a/neon4cast-ci.Rproj b/usgsrc4cast-ci.Rproj similarity index 94% rename from neon4cast-ci.Rproj rename to usgsrc4cast-ci.Rproj index 497f8bfcfb..b9255bc959 100644 --- a/neon4cast-ci.Rproj +++ b/usgsrc4cast-ci.Rproj @@ -1,20 +1,20 @@ -Version: 1.0 - -RestoreWorkspace: Default -SaveWorkspace: Default -AlwaysSaveHistory: Default - -EnableCodeIndexing: Yes -UseSpacesForTab: Yes -NumSpacesForTab: 2 -Encoding: UTF-8 - -RnwWeave: Sweave -LaTeX: pdfLaTeX - -AutoAppendNewline: Yes -StripTrailingWhitespace: Yes - -BuildType: Package -PackageUseDevtools: Yes -PackageInstallArgs: --no-multiarch --with-keep.source +Version: 1.0 + +RestoreWorkspace: Default +SaveWorkspace: Default +AlwaysSaveHistory: Default + +EnableCodeIndexing: Yes +UseSpacesForTab: Yes +NumSpacesForTab: 2 +Encoding: UTF-8 + +RnwWeave: Sweave +LaTeX: pdfLaTeX + +AutoAppendNewline: Yes +StripTrailingWhitespace: Yes + +BuildType: Package +PackageUseDevtools: Yes +PackageInstallArgs: --no-multiarch --with-keep.source From 8164e0251038bdbb62c26a3079656b75cbcd94c8 Mon Sep 17 00:00:00 2001 From: Zwart Date: Mon, 18 Dec 2023 16:19:08 -0800 Subject: [PATCH 02/26] updating readme --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 93d8dd8d1a..08e7aae4e6 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# National Ecological Observatory Network (NEON) Ecological Forecasting Challenge +# Ecological Forecasting Initiative (EFI) and U.S. Geological Survey (USGS) River Chlorophyll Forecasting Challenge The following elements of a forecasting challenge workflow are included in this repo. The GitHub Actions are the tool for automating the tasks. @@ -15,3 +15,7 @@ The following elements of a forecasting challenge workflow are included in this See [https://doi.org/10.1002/fee.2616](https://doi.org/10.1002/fee.2616) for more information on the structure of a forecasting challenge. Supported by the U.S. National Science Foundation grants (DEB-1926388 and OAC-2209866) + +## Disclaimer +Although this software program has been used by the U.S. Geological Survey (USGS), no warranty, expressed or implied, is made by the USGS or the U.S. Government as to the accuracy and functioning of the program and related program material nor shall the fact of distribution constitute any such warranty, and no responsibility is assumed by the USGS in connection therewith. +This software is provided “AS IS.” From 100d4e893cd27eea0c6fda7a08d477e08d83fc04 Mon Sep 17 00:00:00 2001 From: Zwart Date: Mon, 18 Dec 2023 16:19:36 -0800 Subject: [PATCH 03/26] updating names in description and config --- DESCRIPTION | 11 ++++++++--- challenge_configuration.yaml | 8 ++++---- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 78347f0b74..55d671bf7e 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,11 +1,16 @@ -Package: neon4cast-ci -Title: Cyberinfrastructure for the VERA Forecasting Challenge +Package: usgsrc4cast-ci +Title: Cyberinfrastructure for the EFI-USGS River Chlorophyll Forecasting Challenge Version: 0.1 Authors@R: c(person( "Quinn", "Thomas", email = "rqthomas@vt.edu", role = c("aut", "cre"), - comment = c(ORCID = "0000-0003-1282-7825"))) + comment = c(ORCID = "0000-0003-1282-7825")), + person( + "Jacob", "Zwart", + email = "jzwart@usgs.gov", + role = c("aut", "cre"), + comment = c(ORCID = "0000-0002-3870-405X"))) Description: Cyberinfrastructure that processing submissions, scores submissions, generates catalog, and generates dashboards License: MIT Encoding: UTF-8 diff --git a/challenge_configuration.yaml b/challenge_configuration.yaml index ff97a165af..b3d4776a55 100644 --- a/challenge_configuration.yaml +++ b/challenge_configuration.yaml @@ -1,5 +1,5 @@ -challenge_long_name: NEON Ecological Forecasting Challenge -project_id: neon4cast +challenge_long_name: EFI-USGS River Chlorophyll Forecasting Challenge +project_id: usgsrc4cast endpoint: sdsc.osn.xsede.org noaa_endpoint: s3.flare-forecast.org submissions_endpoint: submit.ecoforecast.org @@ -24,8 +24,8 @@ target_metadata_gsheet: https://docs.google.com/spreadsheets/d/10YTX9ae_C1rFdLgE targets_thumbnail: 'https://raw.githubusercontent.com/eco4cast/neon4cast-ci/main/catalog/thumbnail_plots/neon_stream.jpg' targets_thumbnail_title: 'Test Image' targets_path: 'catalog/targets/' -challenge_url: https://projects.ecoforecast.org/neon4cast-ci -github_repo: eco4cast/neon4cast-ci +challenge_url: https://projects.ecoforecast.org/usgsrc4cast-ci +github_repo: eco4cast/usgsrc4cast-ci target_groups: Aquatics: targets_file: "https://data.ecoforecast.org/neon4cast-targets/aquatics/aquatics-targets.csv.gz" From 26d8dcf329bb0e02566a7ca3d48f0b1d3f6888f6 Mon Sep 17 00:00:00 2001 From: Zwart Date: Mon, 18 Dec 2023 16:24:06 -0800 Subject: [PATCH 04/26] specifying NEON challenge in the doi link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 08e7aae4e6..9dc42e1dd5 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ The following elements of a forecasting challenge workflow are included in this 9) Creation of Docker containers with supporting software 10) Creation of archive/snapshots of challenge submissions and targets. -See [https://doi.org/10.1002/fee.2616](https://doi.org/10.1002/fee.2616) for more information on the structure of a forecasting challenge. +See [https://doi.org/10.1002/fee.2616](https://doi.org/10.1002/fee.2616) for more information on the structure of a forecasting challenge, using the NEON forecasting challenge as the example. Supported by the U.S. National Science Foundation grants (DEB-1926388 and OAC-2209866) From e48709f120e02861605b9e11accf0a518f15ae9c Mon Sep 17 00:00:00 2001 From: Zwart Date: Mon, 18 Dec 2023 16:26:05 -0800 Subject: [PATCH 05/26] removing themes we are not using --- targets/beetles_targets.R | 125 ------------ targets/phenology_targets.R | 89 --------- targets/terrestrial_targets.R | 349 ---------------------------------- targets/ticks_targets.R | 151 --------------- 4 files changed, 714 deletions(-) delete mode 100644 targets/beetles_targets.R delete mode 100644 targets/phenology_targets.R delete mode 100644 targets/terrestrial_targets.R delete mode 100644 targets/ticks_targets.R diff --git a/targets/beetles_targets.R b/targets/beetles_targets.R deleted file mode 100644 index dcb776a157..0000000000 --- a/targets/beetles_targets.R +++ /dev/null @@ -1,125 +0,0 @@ -library(neonstore) -library(tidyverse) -library(ISOweek) -source("targets/R/resolve_taxonomy.R") - -df <- neonstore:::neon_data(product = "DP1.10022.001", - #start_date = "2023-06-01", - #end_date = "2023-08-01", - type="expanded") - -sorting_urls <- df |> - dplyr::filter(grepl("bet_sorting", name)) |> - pull(url) - -sorting <- duckdbfs::open_dataset(sorting_urls, format="csv") |> - select(collectDate, siteID, taxonID, individualCount, subsampleID, - scientificName, morphospeciesID, taxonRank, sampleType, - nativeStatusCode, sampleCondition) |> - collect() - -para_urls <- df |> - dplyr::filter(grepl("bet_parataxonomistID", name)) |> - pull(url) - -para <- duckdbfs::open_dataset(para_urls, format="csv") |> - select(subsampleID, individualID, scientificName, taxonRank, taxonID, morphospeciesID) |> - collect() - -expert_urls <- df |> - dplyr::filter(grepl("bet_expertTaxonomistIDProcessed", name)) |> - pull(url) - -expert <- duckdbfs::open_dataset(expert_urls, format="csv") |> - select(-uid, -namedLocation, -domainID, -siteID, -collectDate, -plotID, -setDate, -collectDate) |> - collect() - -field_urls <- df |> - dplyr::filter(grepl("bet_fielddata", name)) |> - pull(url) - -field <- duckdbfs::open_dataset(field_urls, format="csv") |> - select(collectDate, siteID, setDate) |> - collect() - -#### Generate derived richness table #################### - - -beetles <- resolve_taxonomy(sorting, para, expert) %>% - mutate(iso_week = ISOweek::ISOweek(collectDate), - time = ISOweek::ISOweek2date(paste0(iso_week, "-1"))) %>% - as_tibble() - -richness <- beetles %>% - select(taxonID, siteID, collectDate, time) %>% - distinct() %>% - count(siteID, time) %>% - rename(richness = n) %>% - ungroup() - -#### Generate derived abundance table #################### - -## Using 'field' instead of 'beetles' Does not reflect taxonomic corrections! -## Allows for some counts even when richness is NA - -effort <- field %>% - mutate(iso_week = ISOweek::ISOweek(collectDate), - time = ISOweek::ISOweek2date(paste0(iso_week, "-1"))) %>% - group_by(siteID, time) %>% - summarise(trapnights = as.integer(sum(collectDate - setDate)), - .groups = "drop") - -counts <- beetles %>% - mutate(iso_week = ISOweek::ISOweek(collectDate), - time = ISOweek::ISOweek2date(paste0(iso_week, "-1"))) %>% - group_by(siteID, time) %>% - summarise(count = sum(as.numeric(individualCount), na.rm = TRUE), - .groups = "drop") - -abund <- counts %>% - left_join(effort, by = join_by(siteID, time)) %>% - arrange(time) %>% - mutate(abundance = count / trapnights) %>% - select(siteID, time, abundance) %>% - ungroup() - -targets_na <- full_join(abund, richness, by = join_by(siteID, time)) - -## site-dates that have sampling effort but no counts should be -## treated as explicit observation 0s - -## FIXME some may have effort but no sorting due only to latency, should not be treated as zeros - -targets <- effort %>% - select(siteID, time) %>% - left_join(targets_na, by = join_by(siteID, time)) %>% - tidyr::replace_na(list(richness = 0L, abundance = 0)) |> - pivot_longer(-c("time","siteID"), names_to = "variable", values_to = "observation") |> - rename(site_id = siteID) |> - mutate(iso_week = ISOweek::ISOweek(time)) |> - select(time, site_id, variable, observation, iso_week) - -targets <- targets |> - rename(datetime = time) - -s3 <- arrow::s3_bucket("neon4cast-targets/beetles", - endpoint_override = "data.ecoforecast.org", - access_key = Sys.getenv("AWS_ACCESS_KEY_SUBMISSIONS"), - secret_key = Sys.getenv("AWS_SECRET_ACCESS_KEY_SUBMISSIONS")) - -arrow::write_csv_arrow(targets, sink = s3$path("beetles-targets.csv.gz")) - -targets2 <- targets |> - mutate(datetime = lubridate::as_datetime(datetime), - duration = "P1W", - project_id = "neon4cast") |> - select(project_id, site_id, datetime, duration, variable, observation) - -s3 <- arrow::s3_bucket("bio230014-bucket01/challenges/targets/project_id=neon4cast/duration=P1W", - endpoint_override = "sdsc.osn.xsede.org", - access_key = Sys.getenv("OSN_KEY"), - secret_key = Sys.getenv("OSN_SECRET")) - -arrow::write_csv_arrow(targets2, sink = s3$path("beetles-targets.csv.gz")) - -RCurl::getURL("https://hc-ping.com/ed35da4e-01d3-4750-ae5a-ad2f5dfa6e99") diff --git a/targets/phenology_targets.R b/targets/phenology_targets.R deleted file mode 100644 index 3091c220e5..0000000000 --- a/targets/phenology_targets.R +++ /dev/null @@ -1,89 +0,0 @@ -#renv::restore() - -library(tidyverse) - - -source("targets/R/downloadPhenoCam.R") -source("targets/R/calculatePhenoCamUncertainty.R") - -sites <- readr::read_csv("neon4cast_field_site_metadata.csv") |> - dplyr::filter(phenology == 1) - -allData <- data.frame(matrix(nrow = 0, ncol = 5)) - -message(paste0("Downloading and generating phenology targets ", Sys.time())) - -for(i in 1:nrow(sites)){ - siteName <- sites$phenocam_code[i] - site_roi <- sites$phenocam_roi[i] - message(siteName) - ##URL for daily summary statistics - URL_gcc90 <- paste('https://phenocam.nau.edu/data/archive/',siteName,"/ROI/",siteName,"_",site_roi,"_1day.csv",sep="") - ##URL for individual image metrics - URL_individual <- paste('https://phenocam.nau.edu/data/archive/',siteName,"/ROI/",siteName,"_",site_roi,"_roistats.csv",sep="") - - phenoData <- download.phenocam(URL = URL_gcc90) - dates <- unique(phenoData$date) - phenoData_individual <- download.phenocam(URL=URL_individual,skipNum = 17) - ##Calculates standard deviations on daily gcc90 values - gcc_sd <- calculate.phenocam.uncertainty(dat=phenoData_individual,dates=dates) - rcc_sd <- calculate.phenocam.uncertainty(dat=phenoData_individual,dates=dates,target="rcc") - - subPhenoData <- phenoData %>% - mutate(site_id = stringr::str_sub(siteName, 10, 13), - time = date) %>% - select(time, site_id, gcc_90, rcc_90) |> - pivot_longer(-c("time", "site_id"), names_to = "variable", values_to = "observation") |> - mutate(sd = ifelse(variable == "gcc_90", gcc_sd, rcc_sd)) - - allData <- rbind(allData,subPhenoData) - -} - -full_time <- seq(min(allData$time),max(allData$time), by = "1 day") -combined <- NULL - -for(i in 1:nrow(sites)){ - - full_time_curr1 <- tibble(time = full_time, - site_id = rep(sites$field_site_id[i],length(full_time)), - variable = "gcc_90") - - full_time_curr2 <- tibble(time = full_time, - site_id = rep(sites$field_site_id[i],length(full_time)), - variable = "rcc_90") - - combined <- bind_rows(combined, full_time_curr1, full_time_curr2) -} - - - -allData2 <- left_join(combined, allData, by = c("time", "site_id", "variable")) - -allData2 <- allData2 |> - select("time", "site_id", "variable", "observation") |> - rename(datetime = time) - -s3 <- arrow::s3_bucket("neon4cast-targets/phenology", - endpoint_override = "data.ecoforecast.org", - access_key = Sys.getenv("AWS_ACCESS_KEY_SUBMISSIONS"), - secret_key = Sys.getenv("AWS_SECRET_ACCESS_KEY_SUBMISSIONS")) - -arrow::write_csv_arrow(allData2, sink = s3$path("phenology-targets.csv.gz")) - -allData3 <- allData2 |> - mutate(datetime = lubridate::as_datetime(datetime), - duration = "P1D", - project_id = "neon4cast") |> - select(project_id, site_id, datetime, duration, variable, observation) - -s3 <- arrow::s3_bucket("bio230014-bucket01/challenges/targets/project_id=neon4cast/duration=P1D", - endpoint_override = "sdsc.osn.xsede.org", - access_key = Sys.getenv("OSN_KEY"), - secret_key = Sys.getenv("OSN_SECRET")) - -arrow::write_csv_arrow(allData3, sink = s3$path("phenology-targets.csv.gz")) - -unlink("phenology-targets.csv.gz") - -RCurl::getURL("https://hc-ping.com/f5d48d96-bb41-4c21-b028-930fa2b01c5a") diff --git a/targets/terrestrial_targets.R b/targets/terrestrial_targets.R deleted file mode 100644 index b95f9a408e..0000000000 --- a/targets/terrestrial_targets.R +++ /dev/null @@ -1,349 +0,0 @@ -#renv::restore() -print(paste0("Running Creating Terrestrial Targets at ", Sys.time())) - -#Sys.setenv("NEONSTORE_HOME" = "/home/rstudio/data/neonstore") - -Sys.setenv("NEONSTORE_HOME" = "/home/rstudio/data/neonstore_temp") - -pecan_flux_uncertainty <- "../pecan/modules/uncertainty/R/flux_uncertainty.R" -readRenviron("~/.Renviron") # compatible with littler - -non_store_dir <- "/home/rstudio/data/neon_flux_data" -use_5day_data <- TRUE -add_TERN <- FALSE - -library(neonUtilities) -library(neonstore) -library(tidyverse) -library(lubridate) -library(contentid) -library(ncdf4) - -sites <- read_csv("https://raw.githubusercontent.com/eco4cast/neon4cast-targets/main/NEON_Field_Site_Metadata_20220412.csv") |> - dplyr::filter(terrestrial == 1) - -site_names <- sites$field_site_id - -# Terrestrial - -neonstore::neon_download(product = "DP4.00200.001", type = "basic") -neonstore::neon_store(product = "DP4.00200.001") -#neon_disconnect() - -#DP4.00200.001 & DP1.00094.001 -#neon_store(product = "DP4.00200.001") -flux_data <- neon_table(table = "nsae-basic", site = site_names, lazy = TRUE) %>% - mutate(timeBgn = as_datetime(timeBgn), - timeEnd = as_datetime(timeEnd)) |> - select(timeBgn, timeEnd, data.fluxCo2.turb.flux, siteID, data.fluxH2o.turb.flux, qfqm.fluxCo2.turb.qfFinl) |> - collect() - - -#Get the current unpublished flux data (5-day latency) - -if(use_5day_data){ - #files <- readr::read_csv("https://storage.googleapis.com/neon-sae-files/ods/dataproducts/sae_file_url_unpublished.csv", show_col_types = FALSE) - files <- readr::read_csv("https://storage.googleapis.com/neon-sae-files/ods/sae_files_unpublished/sae_file_url_unpublished.csv", show_col_types = FALSE) - #Convert old S3 links to GCS - files$url <- base::gsub("https://s3.data.neonscience.org", "https://storage.googleapis.com", files$url) - files <- files %>% - filter(site %in% site_names) %>% - mutate(file_name = basename(url)) |> - filter(date > max(lubridate::as_date(flux_data$timeBgn))) - - fs::dir_create(file.path(non_store_dir,"current_month"), recurse = TRUE) - fs::dir_create(file.path(non_store_dir,"current_month_parquet"), recurse = TRUE) - - for(i in 1:nrow(files)){ - destfile <- file.path(non_store_dir,"current_month",files$file_name[i]) - parquet_file <- file.path(non_store_dir,"current_month_parquet",paste0(files$file_name[i],".parquet")) - if(!(file.exists(parquet_file))){ - download.file(files$url[i], destfile = destfile) - } - } - - fn_parquet <- list.files(file.path(non_store_dir,"current_month_parquet")) - - #Checking for files that have been updated - if(length(fn_parquet) > 0){ - d <- tibble(file_full = fn_parquet, - file = tools::file_path_sans_ext(tools::file_path_sans_ext(fn_parquet)), - date = lubridate::as_datetime(stringr::str_split(fn_parquet, "\\.", 12, simplify = TRUE)[, 10])) |> - arrange(file, date) |> - group_by(file) |> - mutate(max_date = max(date), - delete = ifelse(date != max(date), 1, 0)) |> - ungroup() - unlink(file.path(non_store_dir,"current_month_parquet", d$file_full[which(d$delete == 1)])) - - #remove files that are no longer in the unpublished s3 bucket because they are now in NEON portal - - for(i in 1:length(fn_parquet)){ - if(!tools::file_path_sans_ext(basename(fn_parquet[i])) %in% files$file_name){ - message(paste0("removing: ", basename(fn_parquet[i]))) - unlink(file.path(non_store_dir,"current_month_parquet",fn_parquet[i])) - } - } - } - - fn <- list.files(file.path(non_store_dir,"current_month"), full.names = TRUE) - #fn_parquet <- file.path(non_store_dir,"current_month_parquet", paste0(basename(fn[i]),".parquet")) - - if(length(fn) > 0){ - message(paste0("reading in ", length(fn), " non-NEON portal files")) - - #future::plan("future::multisession", workers = 4) - - #new_files <- fn[which(!(basename(fn) %in% tools::file_path_sans_ext(basename(fn_parquet))))] - purrr::walk(1:length(fn), function(i, fn){ - message(paste0(i, " of ", length(fn), " reading file ",fn[i])) - df <- neonstore::neon_read(files = fn[i]) |> - select(timeBgn, timeEnd, data.fluxCo2.turb.flux, siteID, data.fluxH2o.turb.flux, qfqm.fluxCo2.turb.qfFinl) - arrow::write_parquet(x = df, file.path(non_store_dir,"current_month_parquet", paste0(basename(fn[i]),".parquet"))) - unlink(fn[i]) - }, - fn = fn) - } - - #s3 <- arrow::SubTreeFileSystem$create(file.path(non_store_dir,"current_month_parquet")) - - flux_data_curr <- arrow::open_dataset(file.path(non_store_dir,"current_month_parquet")) |> - select(timeBgn, timeEnd, data.fluxCo2.turb.flux, siteID, data.fluxH2o.turb.flux, qfqm.fluxCo2.turb.qfFinl) |> - collect() - - - #Combined published and unpublished - - flux_data <- bind_rows(flux_data, flux_data_curr) -} - - -#flux_data |> -# group_by(siteID) |> -# summarize(min = min(timeBgn), -# max = max(timeBgn), .groups = "drop") |> -# arrange(min) |> -# print(n = 50) - -flux_data <- flux_data %>% - mutate(time = as_datetime(timeBgn)) - -co2_data <- flux_data %>% - filter(qfqm.fluxCo2.turb.qfFinl == 0 & data.fluxCo2.turb.flux > -50 & data.fluxCo2.turb.flux < 50) %>% - select(time,data.fluxCo2.turb.flux, siteID, data.fluxH2o.turb.flux) %>% - rename(nee = data.fluxCo2.turb.flux, - le = data.fluxH2o.turb.flux, - site_id = siteID) |> - mutate(nee = ifelse(site_id == "OSBS" & year(time) < 2019, NA, nee), - nee = ifelse(site_id == "SRER" & year(time) < 2019, NA, nee), - nee = ifelse(site_id == "BARR" & year(time) < 2019, NA, nee), - le = ifelse(site_id == "OSBS" & year(time) < 2019, NA, le), - le = ifelse(site_id == "SRER" & year(time) < 2019, NA, le), - le = ifelse(site_id == "BARR" & year(time) < 2019, NA, le)) |> - pivot_longer(-c("time","site_id"), names_to = "variable", values_to = "observation") - -#co2_data %>% -# filter(variable == "nee") |> -# ggplot(aes(x = time, y = observation)) + -# geom_point() + -# facet_wrap(~site_id) - -#earliest <- min(as_datetime(c(co2_data$time)), na.rm = TRUE) -#latest <- max(as_datetime(c(co2_data$time)), na.rm = TRUE) - - -#full_time_vector <- seq(min(c(co2_data$time), na.rm = TRUE), -# max(c(co2_data$time), na.rm = TRUE), -# by = "30 min") - -#full_time <- NULL -#for(i in 1:length(site_names)){ -# df_nee <- tibble(time = full_time_vector, -# site_id = rep(site_names[i], length(full_time_vector)), -# variable = "nee") -# df_le <- tibble(time = full_time_vector, -# site_id = rep(site_names[i], length(full_time_vector)), -# variable = "le") -# full_time <- bind_rows(full_time, df_nee, df_le) -# -#} - -flux_target_30m <- co2_data #left_join(full_time, co2_data, by = c("time", "site_id", "variable")) - -valid_dates <- flux_target_30m %>% - mutate(date = as_date(time)) %>% - filter(!is.na(observation)) %>% - group_by(date, site_id, variable) %>% - summarise(count = n(), .groups = "drop") - -flux_target_daily <- flux_target_30m %>% - mutate(date = as_date(time)) %>% - group_by(date, site_id, variable) %>% - summarize(observation = mean(observation, na.rm = TRUE), .groups = "drop") |> - left_join(valid_dates, by = c("date","site_id", "variable")) |> - mutate(observation = ifelse(count > 24, observation, NA), - observation = ifelse(is.nan(observation), NA, observation)) %>% - rename(time = date) %>% - select(-count) |> - mutate(observation = ifelse(variable == "nee", (observation * 12 / 1000000) * (60 * 60 * 24), observation)) - -#flux_target_daily %>% -# filter(year(time) > 2021) %>% -# ggplot(aes(x = time, y = observation)) + -# geom_point() + -# facet_grid(variable~site_id, scale = "free") - -flux_target_30m <- flux_target_30m |> - select(time, site_id, variable, observation) |> - rename(datetime = time) - -flux_target_daily <- flux_target_daily |> - select(time, site_id, variable, observation) |> - rename(datetime = time) - - -if(add_TERN){ - - sites <- read_csv("tern_field_site_metadata.csv", show_col_types = FALSE) |> - filter(!is.na(data_url)) - - read_tern_site <- function(i, sites){ - nc <- ncdf4::nc_open(sites$data_url[i]) - - co2 <- ncdf4::ncvar_get(nc, "Fco2") - le <- ncdf4::ncvar_get(nc, "Fe") - time <- ncdf4::ncvar_get(nc, "time") - - time <- lubridate::as_datetime("1800-01-01 00:00:00.0") + lubridate::seconds(time * 86400) - - co2 <- tibble::tibble(datetime = time, - site_id = sites$`EFI ID`[i], - variable = "nee", - observation = co2) |> - mutate(observation = ifelse(observation < -100, NA, observation)) - - le <- tibble::tibble(datetime = time, - site_id = sites$`EFI ID`[i], - variable = "le", - observation = le) |> - mutate(observation = ifelse(observation < -100, NA, observation)) - - bind_rows(co2, le) - } - - tern_flux_target_30m <- map_dfr(1:nrow(sites), read_tern_site, sites) - - full_time <- NULL - for(i in 1:nrow(sites)){ - - site_targets <- tern_flux_target_30m |> filter(site_id == sites$`EFI ID`[i]) - - full_time_vector <- seq(min(c(site_targets$datetime), na.rm = TRUE), - max(c(site_targets$datetime), na.rm = TRUE), - by = "30 min") - - df_nee <- tibble(datetime = full_time_vector, - site_id = rep(sites$`EFI ID`[i], length(full_time_vector)), - variable = "nee") - df_le <- tibble(datetime = full_time_vector, - site_id = rep(sites$`EFI ID`[i], length(full_time_vector)), - variable = "le") - full_time <- bind_rows(full_time, df_nee, df_le) - - } - - tern_flux_target_30m <- left_join(full_time, tern_flux_target_30m, by = c("datetime", "site_id", "variable")) - - valid_dates <- tern_flux_target_30m %>% - mutate(date = as_date(datetime)) %>% - filter(!is.na(observation)) %>% - group_by(date, site_id, variable) %>% - summarise(count = n(), .groups = "drop") - - - tern_flux_target_daily <- tern_flux_target_30m %>% - mutate(date = as_date(datetime)) %>% - group_by(date, site_id, variable) %>% - summarize(observation = mean(observation, na.rm = TRUE), .groups = "drop") |> - left_join(valid_dates, by = c("date","site_id", "variable")) |> - mutate(observation = ifelse(count > 24, observation, NA), - observation = ifelse(is.nan(observation), NA, observation)) %>% - rename(datetime = date) %>% - select(-count) |> - mutate(observation = ifelse(variable == "nee", (observation * 12 / 1000000) * (60 * 60 * 24), observation)) - - tern_flux_target_daily %>% - filter(year(datetime) > 2021) %>% - ggplot(aes(x = datetime, y = observation)) + - geom_point() + - facet_grid(variable~site_id, scale = "free") - - ggplot(tern_flux_target_daily, aes(x = datetime, y = observation)) + - geom_point() + - facet_wrap(~variable, scale = "free") - - - flux_target_30m <- bind_rows(flux_target_30m, tern_flux_target_30m) - - flux_target_daily <- bind_rows(flux_target_daily, tern_flux_target_daily) - -} - -#write_csv(flux_target_30m, "terrestrial_30min-targets.csv.gz") -#write_csv(flux_target_daily, "terrestrial_daily-targets.csv.gz") - -readRenviron("~/.Renviron") # compatible with littler -# Write 30 minute data - -s3 <- arrow::s3_bucket("neon4cast-targets/terrestrial_30min", - endpoint_override = "data.ecoforecast.org", - access_key = Sys.getenv("AWS_ACCESS_KEY"), - secret_key = Sys.getenv("AWS_SECRET_ACCESS_KEY")) - -flux_target_30m |> - arrange(variable, datetime) |> - arrow::write_csv_arrow(sink = s3$path("terrestrial_30min-targets.csv.gz")) - -flux_target_30m2 <- flux_target_30m |> - mutate(datetime = lubridate::as_datetime(datetime), - duration = "PT30M", - project_id = "neon4cast") |> - select(project_id, site_id, datetime, duration, variable, observation) |> - arrange(variable, datetime) |> - na.omit() - -s3 <- arrow::s3_bucket("bio230014-bucket01/challenges/targets/project_id=neon4cast/duration=PT30M", - endpoint_override = "sdsc.osn.xsede.org", - access_key = Sys.getenv("OSN_KEY"), - secret_key = Sys.getenv("OSN_SECRET")) - -arrow::write_csv_arrow(flux_target_30m2, sink = s3$path("terrestrial_30min-targets.csv.gz")) - -#Write daily data - -s3 <- arrow::s3_bucket("neon4cast-targets/terrestrial_daily", - endpoint_override = "data.ecoforecast.org", - access_key = Sys.getenv("AWS_ACCESS_KEY"), - secret_key = Sys.getenv("AWS_SECRET_ACCESS_KEY")) - -flux_target_daily |> - arrange(variable, datetime) |> - arrow::write_csv_arrow(sink = s3$path("terrestrial_daily-targets.csv.gz")) - -flux_target_daily2 <- flux_target_daily |> - mutate(datetime = lubridate::as_datetime(datetime), - duration = "P1D", - project_id = "neon4cast") |> - select(project_id, site_id, datetime, duration, variable, observation) |> - arrange(variable, datetime) |> - na.omit() - -s3 <- arrow::s3_bucket("bio230014-bucket01/challenges/targets/project_id=neon4cast/duration=P1D", - endpoint_override = "sdsc.osn.xsede.org", - access_key = Sys.getenv("OSN_KEY"), - secret_key = Sys.getenv("OSN_SECRET")) - - -arrow::write_csv_arrow(flux_target_daily2, sink = s3$path("terrestrial_daily-targets.csv.gz")) - -message(paste0("Completed Terrestrial Target at ", Sys.time())) diff --git a/targets/ticks_targets.R b/targets/ticks_targets.R deleted file mode 100644 index 3204b01114..0000000000 --- a/targets/ticks_targets.R +++ /dev/null @@ -1,151 +0,0 @@ -library(tidyverse) # for data wrangling and piping (dplyr probably ok) -library(lubridate) # for finding year from dates -library(neonstore) - -# select target species and life stage -target_species <- c("Amblyomma americanum") # NEON species name -target_lifestage <- "Nymph" - -sites_df <- read_csv("https://raw.githubusercontent.com/eco4cast/neon4cast-targets/main/NEON_Field_Site_Metadata_20220412.csv") |> - dplyr::filter(ticks == 1) -target_sites <- sites_df %>% pull(field_site_id) - - - -# get data from neon -#product <- "DP1.10093.001" -#neon_download(product = product, -# site = target.sites) - - -df <- neonstore:::neon_data(product = "DP1.10093.001", - #start_date = "2023-06-01", - #end_date = "2023-08-01", - site = target_sites, - type="expanded") - -fielddata_urls <- df |> - dplyr::filter(grepl("tck_fielddata", name)) |> - pull(url) - -taxonomyProcessed_urls <- df |> - dplyr::filter(grepl("tck_taxonomyProcessed", name)) |> - pull(url) - -tick_field_raw <- duckdbfs::open_dataset(fielddata_urls, format="csv") |> - select(totalSampledArea, collectDate, namedLocation, nlcdClass, siteID) |> - collect() - -tick_taxon_raw <- duckdbfs::open_dataset(taxonomyProcessed_urls, format="csv") |> - select(sampleCondition, sexOrAge, collectDate, namedLocation, - acceptedTaxonID, individualCount, scientificName, taxonRank) |> - collect() - -# there are lots of reasons why sampling didn't occur (logistics, too wet, too cold, etc.) -# so, keep records when sampling occurred -tick_field <- tick_field_raw %>% - filter(totalSampledArea > 0) %>% - mutate(collectDate = lubridate::fast_strptime(collectDate, "%Y-%m-%dT%H:%MZ"), - time = floor_date(collectDate, unit = "day")) %>% - unite(namedLocation, time, col = "occasionID", sep = "_") - -# combine adults into single category and make wide to get zero counts -tick_taxon_wide <- tick_taxon_raw %>% - filter(sampleCondition == "OK") %>% # remove taxonomy samples with quality issues - mutate(sexOrAge = if_else(sexOrAge == "Female" | sexOrAge == "Male", - "Adult", # convert to Adult - sexOrAge), - collectDate = lubridate::fast_strptime(collectDate, "%Y-%m-%dT%H:%MZ"), - time = floor_date(collectDate, unit = "day")) %>% - unite(namedLocation, time, col = "occasionID", sep = "_") %>% - pivot_wider(id_cols = occasionID, # make wide by species and life stage - names_from = c(acceptedTaxonID, sexOrAge), - values_from = individualCount, - names_sep = "_", - values_fn = {sum}, # duplicates occur because of Adults that where F/M - add them - values_fill = 0) - -# join taxonomy and field data -tick_joined <- left_join(tick_taxon_wide, tick_field, by = "occasionID") %>% - select(-NA_NA) - -# all the species column names -spp_cols <- tick_joined %>% - select(contains("Larva"), contains("Nymph"), contains("Adult")) %>% - colnames() - -# get matching taxon ids -taxon_ids <- tick_taxon_raw %>% - filter(!is.na(acceptedTaxonID)) %>% - select(acceptedTaxonID, scientificName, taxonRank) %>% - distinct() - -# make longer -tick_long <- tick_joined %>% - pivot_longer(cols = all_of(spp_cols), - names_to = "taxonAge", - values_to = "processedCount", - values_drop_na = TRUE) %>% - separate(col = taxonAge, into = c("acceptedTaxonID", "lifeStage"), sep = "_") - -# add taxon ids -tick_long <- left_join(tick_long, taxon_ids, by = "acceptedTaxonID") - -# standardize the data and subset to targets -tick_standard <- tick_long %>% - filter(siteID %in% target_sites, # sites we want - lifeStage == target_lifestage, # life stage we want - scientificName %in% target_species, - #scientificName %in% target.species, # species we want - grepl("Forest", nlcdClass)) %>% # forest plots - mutate(date = floor_date(collectDate, unit = "day"), - date = ymd(date), - year = year(date), - iso_week = ISOweek::ISOweek(collectDate), - time = ISOweek::ISOweek2date(paste0(iso_week, "-1"))) %>% - select(time, processedCount, totalSampledArea, siteID, scientificName) %>% - mutate(totalSampledArea = as.numeric(totalSampledArea)) %>% - summarise(totalCount = sum(processedCount), # all counts in a week - totalArea = sum(totalSampledArea),# total area surveyed in a week - observation = totalCount / totalArea * 1600, .by = c(siteID, time, scientificName)) %>% # scale to the size of a plot - mutate(iso_week = ISOweek::ISOweek(time)) %>% - arrange(siteID, time) %>% - select(time, iso_week, siteID, scientificName, observation) - - -tick_targets <- tick_standard %>% - #filter(time < challenge.time) |> - rename(site_id = siteID) |> - mutate(variable = scientificName) |> - mutate(variable = ifelse(variable == "Amblyomma americanum", "amblyomma_americanum", "ixodes_scapularis")) |> - select(time, site_id, variable, observation, iso_week) - -ggplot(tick_targets, aes(x = time, y = observation, color = variable)) + - geom_line() + - facet_wrap(~site_id, scale = "free") - -tick_targets <- tick_targets |> - rename(datetime = time) - -s3 <- arrow::s3_bucket("neon4cast-targets/ticks", - endpoint_override = "data.ecoforecast.org", - access_key = Sys.getenv("AWS_ACCESS_KEY_SUBMISSIONS"), - secret_key = Sys.getenv("AWS_SECRET_ACCESS_KEY_SUBMISSIONS")) - -arrow::write_csv_arrow(tick_targets, sink = s3$path("ticks-targets.csv.gz")) - -tick_targets2 <- tick_targets |> - mutate(datetime = lubridate::as_datetime(datetime), - duration = "P1W", - project_id = "neon4cast") |> - select(project_id, site_id, datetime, duration, variable, observation) - -s3 <- arrow::s3_bucket("bio230014-bucket01/challenges/targets/project_id=neon4cast/duration=P1W", - endpoint_override = "sdsc.osn.xsede.org", - access_key = Sys.getenv("OSN_KEY"), - secret_key = Sys.getenv("OSN_SECRET")) - -arrow::write_csv_arrow(tick_targets2, sink = s3$path("ticks-targets.csv.gz")) - -RCurl::getURL("https://hc-ping.com/09c7ab10-eb4e-40ef-a029-7a4addc3295b") - From ac52cdbe7ab86b33c2c517fbfb1946ffecd2e8a8 Mon Sep 17 00:00:00 2001 From: Zwart Date: Mon, 18 Dec 2023 16:35:03 -0800 Subject: [PATCH 06/26] dont commit in or out dirs and files --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index ba397cceb5..0838b805f1 100644 --- a/.gitignore +++ b/.gitignore @@ -62,3 +62,7 @@ archive/ .DS_Store *.gz *.csv + +**/out/** + +**/in/** From b1391d22eed21719882e1960c42e09f59c2eafc1 Mon Sep 17 00:00:00 2001 From: Zwart Date: Mon, 18 Dec 2023 16:35:42 -0800 Subject: [PATCH 07/26] removing functions not used for this challenge --- targets/R/avro_functions.R | 429 ----------------------- targets/R/calculatePhenoCamUncertainty.R | 24 -- targets/R/data_processing.R | 52 --- targets/R/downloadPhenoCam.R | 20 -- targets/R/resolve_taxonomy.R | 66 ---- 5 files changed, 591 deletions(-) delete mode 100644 targets/R/avro_functions.R delete mode 100644 targets/R/calculatePhenoCamUncertainty.R delete mode 100644 targets/R/data_processing.R delete mode 100644 targets/R/downloadPhenoCam.R delete mode 100644 targets/R/resolve_taxonomy.R diff --git a/targets/R/avro_functions.R b/targets/R/avro_functions.R deleted file mode 100644 index 7ba80ccd66..0000000000 --- a/targets/R/avro_functions.R +++ /dev/null @@ -1,429 +0,0 @@ - -download.neon.avro <- function(months, data_product, path) { - for (i in 1:length(months$site_id)) { - # create a directory for each site (if one doesn't already exist) - if (!paste0('site=', months$site_id[i]) %in% list.dirs(path, full.names = F)) { - dir.create(path = paste0(path, '/site=', months$site_id[i]), recursive = TRUE, showWarnings = FALSE) - message('creating new directory') - } - - message(paste0('downloading site ', i, '/', length(months$site_id))) - - month_use <- unique(format(c(months$new_date[i], Sys.Date() + days(2)), "%Y-%m")) - # loop through each month (max 2) and each dp listed - for (j in 1:length(month_use)) { - - for (dp in data_product) { - # download the provisional files from Google Cloud Storage using the gsutils tool from cmd - # -n argument skips files already downloaded - system(paste0('~/google-cloud-sdk/bin/gsutil -m cp -n gs://neon-is-transition-output/provisional/dpid=DP1.', - dp, - '.001/ms=', - # -n excludes already downloaded files - # -m cp runs the copy function in parallel to speed up download - month_use[j], - '/site=', - months$site_id[i], - "/* ", - path, - '/site=', - months$site_id[i]), - ignore.stderr = T) - - } - - } - - } -} -# no error is thrown if the data product doesn't exist for that site - - -# delete the superseded files -delete.neon.parquet <- function(months, path, data_product) { - - for (i in 1:nrow(months)) { - site_parquet <- dir(path = path, - pattern = months$site_id[i]) - - superseded <- site_parquet[which(lubridate::as_date(str_match(site_parquet, - "__\\s*(.*?)\\s*.avro")[,2]) <= - months$cur_wq_month[i])] - - if (length(superseded) != 0) { - file.remove(paste0(path, '/',superseded)) - } - } -} - -# delete the superseded files -delete.neon.avro <- function(months, path, data_product) { - - for (i in 1:nrow(months)) { - - site_avro <- dir(path = paste0(path, '/site=', months$site_id[i]), - pattern = data_product) - - superseded <- site_avro[which(lubridate::as_date(str_match(site_avro, - "__\\s*(.*?)\\s*.avro")[,2]) <= - months$cur_wq_month[i])] - - if (length(superseded) != 0) { - file.remove(paste0(path,'/site=', months$site_id[i], '/',superseded)) - } - } -} - - - -# requires wq_vars - specify -read.avro.wq <- function(sc, name = 'name', path, columns_keep, dir ) { - message(paste0('reading file ', path)) - wq_avro <- sparkavro::spark_read_avro(sc, - name = "name", - path = path, - memory = FALSE) |> - dplyr::filter(termName %in% wq_vars) %>% - # for streams want to omit the downstream measurement (102) and retain upstream (101) - # rivers and lakes horizontal index is 103 - dplyr::filter(horizontalIndex %in% c('101', '111', '103')) %>% - dplyr::select(siteName, termName, startDate, - doubleValue, intValue) %>% - dplyr::collect() |> - # combine the value fields to one - dplyr::mutate(Value = ifelse(is.na(doubleValue), - intValue, doubleValue)) %>% - dplyr::select(any_of(columns_keep)) - - wq_tibble <- wq_avro %>% - as.data.frame() %>% - suppressWarnings() - - if (nrow(wq_tibble) >=1) { - wq_tibble_wider <- wq_tibble %>% - arrange(startDate, termName) %>% - pivot_wider(names_from = termName, values_from = Value) %>% - filter_at(vars(ends_with('QF')), any_vars(. != 1)) # checks to see if any of the QF cols have a 1 - - # if the filtering has left rows then find the mean - if (nrow(wq_tibble_wider) >= 1) { - daily_wq <- wq_tibble_wider %>% - mutate(time = as.Date(startDate), - # add missing columns (sites with no chlorophyll), need all otherwise function won't run - chlorophyll = ifelse('chlorophyll' %in% colnames(wq_tibble_wider), chlorophyll, NA), - chlorophyllExpUncert = ifelse('chlorophyll' %in% colnames(wq_tibble_wider),chlorophyllExpUncert,NA)) %>% - group_by(siteName, time) %>% - summarize(oxygen = mean(dissolvedOxygen, na.rm = TRUE), - chla = mean(chlorophyll, na.rm = TRUE),.groups = "drop") %>% - rename(site_id = siteName) %>% - # get in the same long format as the NEON portal data - pivot_longer(cols = -c("time", "site_id"), - names_to = "variable", - values_to = "observation") - } - } - - if (exists('daily_wq')) { - if (unique(daily_wq$site_id) %in% stream_sites) { - daily_wq <- daily_wq %>% dplyr::filter(variable == "oxygen") - } - } - - fs::dir_create(dir) - - file_name <- file.path(file.path(dir, paste0(basename(path), ".parquet"))) - - if (exists('daily_wq')) { - arrow::write_parquet(x = daily_wq, sink = file_name) - if(fs::file_exists(file_name)){ - #fs::file_delete(path) - } - } else { - # create an empty df to return - empty <- data.frame(site_id = NA, - time = NA, - variable = NA, - observation = NA) %>% - mutate(site_id = as.character(site_id), - time = as.Date(time), - variable = as.character(variable), - observation = as.numeric(observation)) %>% - dplyr::filter(rowSums(is.na(.)) != ncol(.)) # remove the empty row - arrow::write_parquet(x = empty, sink = file_name) - if(fs::file_exists(file_name)){ - #fs::file_delete(path) - } - } -} - -read.avro.tsd <- function(sc, name = 'name', path, thermistor_depths, dir, delete_files) { - message(paste0('reading file ', path)) - tsd_avro <- sparkavro::spark_read_avro(sc, - name = "name", - path = path, - memory = FALSE) |> - dplyr::filter(termName %in% tsd_vars) %>% - # for streams want to omit the downstream measurement (102) and retain upstream (101) - # rivers and lakes horizontal index is 103 - dplyr::filter(horizontalIndex %in% c('101','111', '103'), - temporalIndex == "030") %>% # take the 30-minutely data only - dplyr::select(siteName, termName, startDate, - doubleValue, intValue, verticalIndex) %>% - collect() |> - # combine the value fields to one - dplyr::mutate(Value = ifelse(is.na(doubleValue), - intValue, doubleValue)) %>% - dplyr::select(any_of(columns_keep)) - - - tsd_tibble <- tsd_avro %>% - as.data.frame() %>% - suppressWarnings() %>% - inner_join(., thermistor_depths, by = c('siteName', 'verticalIndex')) %>% - # only want temperatures in the surface (< 1 m) of the water column - dplyr::filter(thermistorDepth <= 1.0) - - if (nrow(tsd_tibble) >=1) { - tsd_tibble_wider <- tsd_tibble %>% - arrange(startDate, termName) %>% - pivot_wider(names_from = termName, values_from = Value) %>% - filter_at(vars(ends_with('QF')), any_vars(. != 1)) # checks to see if any of the QF cols have a 1 - - # if the filtering has left rows then find the mean - if (nrow(tsd_tibble_wider) >= 1) { - daily_tsd <- tsd_tibble_wider %>% - mutate(time = as.Date(startDate)) %>% - # add missing columns (sites with no tsdWaterTempMean), need all otherwise function won't run - # tsdWaterTempMean = ifelse('tsdWaterTempMean' %in% colnames(tsd_tibble_wider), - # tsdWaterTempMean, NA), - # tsdWaterTempExpUncert = ifelse('tsdWaterTempExpUncert' %in% colnames(tsd_tibble_wider), - # tsdWaterTempExpUncert, NA)) %>% - group_by(siteName, time) %>% - summarize(temperature = mean(tsdWaterTempMean, na.rm = TRUE), - .groups = "drop") %>% - rename(site_id = siteName) %>% - # get in the same long format as the NEON portal data - pivot_longer(cols = -c("time", "site_id"), - names_to = "variable", - values_to = "observation") - - } - } - - fs::dir_create(dir) - file_name <- file.path(file.path(dir, paste0(basename(path), ".parquet"))) - - if (exists('daily_tsd')) { - daily_tsd <- daily_tsd |> QC.temp(range = c(-5, 40), spike = 5, by.depth = F) - - arrow::write_parquet(x = daily_tsd, sink = file_name) - if(fs::file_exists(file_name) & delete_files){ - fs::file_delete(path) - } - } else { - # create an empty df to return - empty <- data.frame(site_id = NA, - time = NA, - variable = NA, - observation = NA) %>% - mutate(site_id = as.character(site_id), - time = as.Date(time), - variable = as.character(variable), - observation = as.numeric(observation)) %>% - dplyr::filter(rowSums(is.na(.)) != ncol(.)) # remove the empty row - if(fs::file_exists(file_name) & delete_files){ - fs::file_delete(path) - } - } -} - - -read.avro.tsd.profile <- function(sc, name = 'name', path, thermistor_depths, columns_keep, dir, delete_files) { - message(paste0('reading file ', path)) - - tsd_avro <- sparkavro::spark_read_avro(sc, - name = "name", - path = path, - memory = FALSE) %>% - dplyr::filter(termName %in% tsd_vars) %>% - # for streams want to omit the downstream measurement (102) and retain upstream (101) - # rivers and lakes horizontal index is 103 - dplyr::filter(horizontalIndex %in% c('101', '111', '103'), - temporalIndex == "030") %>% # take the 30-minutely data only - dplyr::select(siteName, termName, startDate, - doubleValue, intValue, verticalIndex) %>% - collect() |> - # combine the value fields to one - dplyr::mutate(Value = ifelse(is.na(doubleValue), - intValue, doubleValue)) %>% - dplyr::select(any_of(columns_keep)) - - - tsd_tibble <- tsd_avro %>% - as.data.frame() %>% - suppressWarnings() %>% - inner_join(., thermistor_depths, by = c('siteName', 'verticalIndex')) - - if (nrow(tsd_tibble) >=1) { - tsd_tibble_wider <- tsd_tibble %>% - arrange(startDate, termName) %>% - pivot_wider(names_from = termName, values_from = Value) %>% - filter_at(vars(ends_with('QF')), any_vars(. != 1)) # checks to see if any of the QF cols have a 1 - - # if the filtering has left rows then find the mean - if (nrow(tsd_tibble_wider) >= 1) { - hourly_tsd <- tsd_tibble_wider %>% - mutate(time = lubridate::ymd_h(format(startDate, "%Y-%m-%d %H"))) %>% - # add missing columns (sites with no tsdWaterTempMean), need all otherwise function won't run - # tsdWaterTempMean = ifelse('tsdWaterTempMean' %in% colnames(tsd_tibble_wider), - # tsdWaterTempMean, NA), - # tsdWaterTempExpUncert = ifelse('tsdWaterTempExpUncert' %in% colnames(tsd_tibble_wider), - # tsdWaterTempExpUncert, NA)) %>% - group_by(siteName, time, thermistorDepth) %>% - summarize(temperature = mean(tsdWaterTempMean, na.rm = TRUE), - .groups = "drop") %>% - rename(site_id = siteName, - depth = thermistorDepth) %>% - # get in the same long format as the NEON portal data - pivot_longer(cols = -c("time", "site_id", "depth"), - names_to = "variable", - values_to = "observation") - - } - } - - fs::dir_create(dir) - file_name <- file.path(file.path(dir, paste0(basename(path), ".parquet"))) - - - if (exists('hourly_tsd')) { - hourly_tsd <- hourly_tsd |> - QC.temp(range = c(-5, 40), spike = 5, by.depth = T) |> - mutate(data_source = 'NEON_pre-portal') - - arrow::write_parquet(x = hourly_tsd, sink = file_name) - if(fs::file_exists(file_name) & delete_files){ - fs::file_delete(path) - } - } else { - # create an empty df to return - empty <- data.frame(site_id = NA, - time = NA, - depth = NA, - variable = NA, - observation = NA) %>% - mutate(site_id = as.character(site_id), - time = as.Date(time), - depth = as.numeric(depth), - variable = as.character(variable), - observation = as.numeric(observation)) %>% - dplyr::filter(rowSums(is.na(.)) != ncol(.)) # remove the empty row - arrow::write_parquet(x = empty, sink = file_name) - if(fs::file_exists(file_name) & delete_files){ - fs::file_delete(path) - } - } -} - - -read.avro.prt <- function(sc, name = 'name', path, columns_keep, dir) { - message(paste0('reading file ', path)) - prt_avro <- sparkavro::spark_read_avro(sc, name = 'name', - path = path) |> - dplyr::filter(termName %in% prt_vars) %>% - # for streams want to omit the downstream measurement (102) and retain upstream (101) - # rivers and lakes horizontal index is 103 - dplyr::filter(horizontalIndex %in% c('101', '111', '103'), - temporalIndex == "030") %>% # take the 30-minutely data only - dplyr::select(siteName, termName, startDate, - doubleValue, intValue) %>% - collect() |> - # combine the value fields to one - dplyr::mutate(Value = ifelse(is.na(doubleValue), - intValue, doubleValue)) %>% - dplyr::select(any_of(columns_keep)) - - - prt_tibble <- prt_avro %>% - as.data.frame() %>% - suppressWarnings() - - if (nrow(prt_tibble) >=1) { - prt_tibble_wider <- prt_tibble %>% - arrange(startDate, termName) %>% - pivot_wider(names_from = termName, values_from = Value) %>% - filter_at(vars(ends_with('QF')), any_vars(. != 1)) # checks to see if any of the QF cols have a 1 - - # if the filtering has left rows then find the mean - if (nrow(prt_tibble_wider) >= 1) { - daily_prt <- prt_tibble_wider %>% - mutate(time = as.Date(startDate)) %>% - group_by(siteName, time) %>% - summarize(temperature = mean(surfWaterTempMean, na.rm = TRUE), - .groups = "drop") %>% - rename(site_id = siteName) %>% - rename(observation = temperature) |> - mutate(variable = "temperature") - - } - } - - fs::dir_create(dir) - file_name <- file.path(file.path(dir, paste0(basename(path), ".parquet"))) - - - if (exists('daily_prt')) { - - daily_prt <- daily_prt |> QC.temp(range = c(-5, 40), spike = 5, by.depth = F) - - arrow::write_parquet(x = daily_prt, sink = file_name) - if(fs::file_exists(file_name)){ - #fs::file_delete(path) - } - } else { - # create an empty df to return - empty <- data.frame(site_id = NA, - time = NA, - variable = NA, - observation = NA) %>% - mutate(site_id = as.character(site_id), - time = as.Date(time), - variable = as.character(variable), - observation = as.numeric(observation)) %>% - dplyr::filter(rowSums(is.na(.)) != ncol(.)) # remove the empty row - arrow::write_parquet(x = empty, sink = file_name) - if(fs::file_exists(file_name)){ - #fs::file_delete(path) - } - } -} - - -# wrapper function for a generic read avro function that selects the right - # read_avro_... depending on the data product -read.neon.avro <- function(path, sc, data_product, columns_keep, ...) { - # the function is only available for 3 data products (wq, tsd, and prt) - if (data_product != '20288' | - data_product != '20264' | - data_product != '20053') { - stop('No read avro function for this data product') - } - - #does the data product match the file path specified - if (str_detect(path, data_product) == FALSE) { - stop('Data product does not match path') - } - - # use the right function based on the data product specified - if (data_product == '20288') { - message('running read.avro for water quality') - df <- read.avro.wq(path = path, sc = sc, columns_keep = columns_keep) - } else if (data_product == '20264') { - message('running read.avro for temperature at specific depth') - df <- read.avro.tsd(path = path, sc = sc, thermistor_depths = thermistor_depths, columns_keep = columns_keep) - } else if (data_product == '20053') { - message('running read.avro for surface temperature') - df <- read.avro.prt(path = path, sc = sc, columns_keep = columns_keep) - } - return(df) -} \ No newline at end of file diff --git a/targets/R/calculatePhenoCamUncertainty.R b/targets/R/calculatePhenoCamUncertainty.R deleted file mode 100644 index 8f35d86725..0000000000 --- a/targets/R/calculatePhenoCamUncertainty.R +++ /dev/null @@ -1,24 +0,0 @@ -##' Calculate the uncertainty (standard deviation) on daily PhenoCam gcc_90 by bootstrap -##' -##' @param dat PhenoCam data dataframe from roistats file -##' @param dates Vector of desired dates to calculate standard deviation for -##' @export -calculate.phenocam.uncertainty <- function(dat,dates,target="gcc") { - sds <- rep(NA,length(dates)) - nboot <- 50 - for(d in 1:length(dates)){ - dailyDat <- dat[dat$date==dates[d],] - if(nrow(dailyDat)>0){ - dailyDat <- dailyDat[!is.na(dailyDat[,target]),] - nrows <- nrow(dailyDat) - gcc_90s <- rep(NA,nboot) - for(j in 1:nboot){ - gcc_90s[j] <- quantile(dailyDat[,target][sample(x = 1:nrows,size = nrows,replace = T)],0.90) - } - sds <- sd(gcc_90s) - }else{ - sds <- NA - } - } - return(sds) -} \ No newline at end of file diff --git a/targets/R/data_processing.R b/targets/R/data_processing.R deleted file mode 100644 index 37a04f15ee..0000000000 --- a/targets/R/data_processing.R +++ /dev/null @@ -1,52 +0,0 @@ -#### Temperature data QC #### -# Function to QC temperature profiles - # option to group by site and depth or just by site - # need to specify the 1) absolute range (vector - length 2) and the 2) the acceptable rate of change (absolute value) -QC.temp <- function(df, range, spike, by.depth = T) { - if (by.depth == F) { - df_QC <- df %>% - arrange(site_id, time) %>% - group_by(site_id) %>% - mutate(temp_change = observation - dplyr::lag(observation), - - flagged_abs_val = ifelse(between(observation, min(range), max(range)), F, T), - flagged_spike = ifelse(abs(temp_change) > spike & time != first(time), - T, F), - flagged_flat = ifelse(temp_change == 0 & time != first(time), - T, F), - final_flag = ifelse(flagged_spike != F | - flagged_abs_val != F | - flagged_flat != F, - T, F), - observation = ifelse(final_flag == T, - NA, observation)) %>% - select(-c(contains('flag'), temp_change)) - } else { - df_QC <- df %>% - arrange(site_id, time) %>% - group_by(site_id, depth) %>% - mutate(temp_change = observation - dplyr::lag(observation), - - flagged_abs_val = ifelse(between(observation, min(range), max(range)), F, T), - flagged_spike = ifelse(abs(temp_change) > spike & time != first(time), - T, F), - flagged_flat = ifelse(temp_change == 0 & time != first(time), - T, F), - final_flag = ifelse((flagged_spike == T | - flagged_abs_val == T | - flagged_flat == T), - T, F), - observation = ifelse((final_flag == F | is.na(final_flag)), - observation, NA)) %>% - select(-c(contains('flag'), temp_change)) - } - return(df_QC) -} - - -#### Standard Error #### -# Function to calculate the standard error of the mean -se <- function(x) { - se <- sd(x, na.rm = T)/(sqrt(length(which(!is.na(x))))) - return(se) -} \ No newline at end of file diff --git a/targets/R/downloadPhenoCam.R b/targets/R/downloadPhenoCam.R deleted file mode 100644 index 31c41bca39..0000000000 --- a/targets/R/downloadPhenoCam.R +++ /dev/null @@ -1,20 +0,0 @@ -##' Download Phenocam data -##' -##' @param URL web address where data is archived -##' @param skipNum The number of lines to skip (22 for 1day file and 17 for roistats file) -##' @export -download.phenocam <- function(URL,skipNum=22) { - ## check that we've been passed a URL - if (length(URL) == 1 & is.character(URL) & substr(URL,1,4)=="http") { - - ## read data - dat <- read.csv(URL,skip = skipNum) - - ## convert date - dat$date <- as.Date(as.character(dat$date)) - - return(dat) - } else { - print(paste("download.phenocam: Input URL not provided correctly",URL)) - } -} \ No newline at end of file diff --git a/targets/R/resolve_taxonomy.R b/targets/R/resolve_taxonomy.R deleted file mode 100644 index 08cea009b7..0000000000 --- a/targets/R/resolve_taxonomy.R +++ /dev/null @@ -1,66 +0,0 @@ - -# Update `scientificName`, `taxonID`, `taxonRank` and `morphospeciesID` using assignments from parataxonomy and expert taxonomy. -# -library(dplyr) -library(stringi) - -clean_names <- function (x) -{ - s <- stringi::stri_split_regex(x, "/", simplify = TRUE)[,1] - s <- stringi::stri_extract_all_words(s, simplify = TRUE) - if (dim(s)[2] > 1) - stringi::stri_trim(paste(s[, 1], s[, 2])) - else stringi::stri_trim(s[, 1]) -} - -resolve_taxonomy <- function(sorting, para, expert){ - - taxonomy <- - left_join(sorting, - para, - by = "subsampleID") %>% - ## why are there so many other shared columns (siteID, collectDate, etc? and why don't they match!?) - ## we use `select` to avoid these - left_join(expert, - by = "individualID") %>% - distinct() %>% - ## Prefer the para table cols over the sorting table cols only for sampleType=="other carabid" - mutate(taxonRank.x = ifelse(is.na(taxonRank.y) | sampleType != "other carabid", taxonRank.x, taxonRank.y), - scientificName.x = ifelse(is.na(scientificName.y) | sampleType != "other carabid", scientificName.x, scientificName.y), - taxonID.x = ifelse(is.na(taxonID.y) | sampleType != "other carabid", taxonID.x, taxonID.y), - morphospeciesID.x = ifelse(is.na(morphospeciesID.y) | sampleType != "other carabid", morphospeciesID.x, morphospeciesID.y)) %>% - ## Prefer expert values where available - mutate(taxonRank = ifelse(is.na(taxonRank), taxonRank.x, taxonRank), - scientificName = ifelse(is.na(scientificName), scientificName.x, scientificName), - taxonID = ifelse(is.na(taxonID), taxonID.x, taxonID), - morphospeciesID = ifelse(is.na(morphospeciesID), morphospeciesID.x, morphospeciesID), - nativeStatusCode = ifelse(is.na(nativeStatusCode.y), nativeStatusCode.x, nativeStatusCode.y), - sampleCondition = ifelse(is.na(sampleCondition.y), sampleCondition.x, sampleCondition.y) - ) %>% - select(-ends_with(".x"), -ends_with(".y")) # %>% -# select(-individualCount) - ## WARNING: if the subsample is split into separate taxa by experts, we do not know - ## how many of the total count should go to each taxon in the the split - ## since only part of that subsample have been pinned. - ## We should flag these cases in some manner. - - - #### Should we add a "species" column, using morphospecies or the best available? - ## Use morphospecies if available for higher-rank-only classifications, - ## Otherwise, binomialize the scientific name: - taxonomy <- taxonomy %>% - mutate(morphospecies = - ifelse(taxonRank %in% c("subgenus", "genus", "family", "order") & !is.na(morphospeciesID), - morphospeciesID, - clean_names(scientificName) - ) - ) - - ## Beetles must be identified as carabids by both sorting table and the taxonomists (~3 non-Carabidae slip through in sorting) - beetles <- taxonomy %>% - filter(grepl("carabid", sampleType)) %>% - filter(family == "Carabidae" | is.na(family)) - - beetles -} - From d33d42c2ce2642a2d42b69729811d2da5db4037c Mon Sep 17 00:00:00 2001 From: Zwart Date: Mon, 18 Dec 2023 16:36:10 -0800 Subject: [PATCH 08/26] adding targets file --- targets/_targets.R | 145 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 targets/_targets.R diff --git a/targets/_targets.R b/targets/_targets.R new file mode 100644 index 0000000000..3ffdd57241 --- /dev/null +++ b/targets/_targets.R @@ -0,0 +1,145 @@ +library(targets) + +options(tidyverse.quiet = TRUE, + clustermq.scheduler = "multicore") + +# set package needs +tar_option_set(packages = c("dataRetrieval", + "tidyverse")) + +source("src/download_nwis_data.R") + +# End this file with a list of target objects. +list( + + # storing predictions from run-pgdl-da into ncdf files + tar_target( + site_list_file, + "in/FY23_ecological_forecast_challenge_USGS_sites.csv", + format = "file" + ), + + tar_target( + site_list_id, + read_csv(site_list_file) %>% + filter(include_in_challenge == "yes") %>% + pull(NWIS_site_no) + ), + + tar_target( + metadata, + { + out_file <- "out/USGS_site_metadata.csv" + whatNWISsites(sites = site_list_id) %>% + tibble() %>% + mutate(site_id = paste(agency_cd, site_no, sep = "-"), + site_url = paste0("https://waterdata.usgs.gov/monitoring-location/", site_no)) %>% + relocate(site_id) %>% + relocate(site_url, .before = colocated) %>% + write_csv(file = out_file) + return(out_file) + } + ), + + # tar_target( + # historic_data, + # download() + # ), + + tar_target( + start_date, + # Sys.Date() - 2 + as.Date("2000-01-01") + # { + # max_date_per_site + # }, + # pattern = map(historic_data) + ), + + tar_target( + end_date, + Sys.Date() + ), + + tar_target( + char_names_yml, + "in/characteristic_names.yml", + format = "file" + ), + + tar_target( + char_names, + yaml::read_yaml(char_names_yml) + ), + + tar_target( + pcodes_yml, + "in/pcodes.yml", + format = "file" + ), + + tar_target( + pcodes, + yaml::read_yaml(pcodes_yml) + ), + + tar_target( + historic_data_rds, + download_historic_data(sites = site_list_id, + start_date = start_date, + end_date = end_date, + pcodes = pcodes, + service = "dv", # dv is daily values + statCd = "00003", # 00003 is mean + out_file = "out/historic_data.rds"), + format = "file" + ), + + tar_target( + sites_without_dv, + { + sites_with_dv = read_rds(historic_data_rds) + site_list_id[!site_list_id %in% sites_with_dv$site_no] + } + ), + + tar_target( + uv_historic_data_rds, + download_historic_uv_data(sites = sites_without_dv, + start_date = start_date, + end_date = end_date, + pcodes = pcodes, + service = "uv", + out_file = "out/historic_uv_data.rds"), + format = "file" + ), + + tar_target( + all_historic_data_csv, + { + dv <- read_rds(historic_data_rds) + uv <- read_rds(uv_historic_data_rds) + out_file <- "out/USGS_chl_data.csv" + out <- bind_rows(dv, uv) %>% + rename(datetime = dateTime, + site_id = site_no, + observation = chl_ug_L) %>% + mutate(variable = "chla", + site_id = paste0("USGS-", site_id)) %>% + select(datetime, site_id, variable, observation) + write_csv(out, file = out_file) + return(out_file) + }, + format = "file" + ), + + tar_target( + push_to_data_repo, + "fill_in" + ) + +) + + + + From 75894386b3c50bd6fb7203686968118a913641d2 Mon Sep 17 00:00:00 2001 From: Zwart Date: Mon, 18 Dec 2023 16:36:45 -0800 Subject: [PATCH 09/26] add empty files --- targets/in/.empty | 0 targets/out/.empty | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 targets/in/.empty create mode 100644 targets/out/.empty diff --git a/targets/in/.empty b/targets/in/.empty new file mode 100644 index 0000000000..e69de29bb2 diff --git a/targets/out/.empty b/targets/out/.empty new file mode 100644 index 0000000000..e69de29bb2 From 5b584f880422d3a9f565877934364a95fc537fab Mon Sep 17 00:00:00 2001 From: Zwart Date: Mon, 18 Dec 2023 16:37:15 -0800 Subject: [PATCH 10/26] site list for challenge --- ...23_ecological_forecast_challenge_USGS_sites.csv | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 targets/in/FY23_ecological_forecast_challenge_USGS_sites.csv diff --git a/targets/in/FY23_ecological_forecast_challenge_USGS_sites.csv b/targets/in/FY23_ecological_forecast_challenge_USGS_sites.csv new file mode 100644 index 0000000000..d82e45fe66 --- /dev/null +++ b/targets/in/FY23_ecological_forecast_challenge_USGS_sites.csv @@ -0,0 +1,14 @@ +IWAAs_basin,NWIS_site_no,site_name,has_fchla,reason_for_inclusion,other_notes,include_in_challenge +DRB,01463500,"Delaware River at Trenton, NJ",yes,High profile WQ site for basin stakeholders,,yes +DRB,01427510,"Delaware River at Calicoon, PA",yes,Upstream pristine site of interest due to reservoir releases,,yes +ILRB,05553700,"Illinois River at Starved Rock, IL",yes,several algal blooms in recent years ,,yes +ILRB,05586300,"Illinois River at Florence, IL",yes,NWQN / high profile site,,yes +ILRB,05543010,"Illinois River at Seneca, IL",yes,Upstream of Starved Rock,,yes +ILRB,05558300 ,"Illinois RIver at Henry, IL",yes,Downstream of Starved Rock & upstream of Peoria (water intake),,yes +ILRB,05549500,"Fox River at McHenry, IL",yes,"High chl, IEPA routinely samples for algal toxins at this site. Stakeholder interest.",Sensor has seasonal deployment b/c site freezes over,yes +UCOL,09014050,Grand Lake Outlet blw. Chipmunk Lane,yes,High profile WQ site for basin stakeholders related the Three Lakes Clarity and the C-BT Project diverting water to the Front Range of Colorado,Only has RFUs for the last 3 years so not including in the forecast challenge ,no +WRB,,Detroit Lake ,,,,no +WRB,14211720,Willamette @ Morrison St Br,yes,Important based conversation from Elena Nilsen ,has tidal influence and upstream lagoon seems to be the algal hotspot ,yes +WRB,14211010,"CLACKAMAS RIVER NEAR OREGON CITY, OR",yes,extend transport ideas with this site ,,yes +WRB,14181500,"NORTH SANTIAM RIVER AT NIAGARA, OR",yes,,,yes +NA ,03378500,"WABASH RIVER AT NEW HARMONY, IN",yes,Important to the Nature Conservancy ,contact is Carrie Parmenter at carrie.parmenter@tnc.org,no From 15b7d9f40e15e498fbbd31289288e5ec9a5a9a17 Mon Sep 17 00:00:00 2001 From: Zwart Date: Mon, 18 Dec 2023 16:43:33 -0800 Subject: [PATCH 11/26] ignore targets folder --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 0838b805f1..2042727f6b 100644 --- a/.gitignore +++ b/.gitignore @@ -66,3 +66,5 @@ archive/ **/out/** **/in/** + +_targets/ From 1f0adba912448b87e4a64d6e512e66a7f9a5b7d3 Mon Sep 17 00:00:00 2001 From: Zwart Date: Mon, 18 Dec 2023 16:45:46 -0800 Subject: [PATCH 12/26] adding in pcodes and var names --- targets/in/characteristic_names.yml | 32 +++++++++++++ targets/in/pcodes.yml | 73 +++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 targets/in/characteristic_names.yml create mode 100644 targets/in/pcodes.yml diff --git a/targets/in/characteristic_names.yml b/targets/in/characteristic_names.yml new file mode 100644 index 0000000000..72eb8bb6d1 --- /dev/null +++ b/targets/in/characteristic_names.yml @@ -0,0 +1,32 @@ +# Characteristic names to use in WQP query. See all characteristics at +# https://www.waterqualitydata.us/Codes/Characteristicname?mimeType=xml + +- "Chlorophyll a" +- "Chlorophyll b" +- "Chlorophyll c" +- "Chlorophyll a (probe)" +- "Chlorophyll a - Periphyton (attached)" +- "Chlorophyll a, corrected for pheophytin" +- "Chlorophyll a - Phytoplankton (suspended)" +- "Chlorophyll a, uncorrected for pheophytin" +- "Chlorophyll a (probe relative fluorescence)" +- "Phaeophytin - Phytoplankton (suspended)" +- "Phaeophytin - Periphyton (attached)" +- "Chlorophyll" +- "Chlorophyll A" +- "Biomass/chlorophyll ratio" +- "Chlorophyll/Pheophytin ratio" +- "Chlorophyll a, free of pheophytin" +- "Chlorophyll a, collected/analyzed (YES/NO) (choice list)" +- "Chlorophyll a (probe) concentration, Cyanobacteria (bluegreen)" +- "Pheophytin" +- "Pheophytin a" +- "Pheophytin ratio" +- "Phytoplankton" +- "Phytoplankton Density" +- "Biomass, phytoplankton" +- "Phytoplankton biovolume" +- "Phytoplankton productivity" +- "Phytoplankton Relative Density" +- "Phytoplankton, settling volume" +- "Population diversity, phytoplankton, # of species" diff --git a/targets/in/pcodes.yml b/targets/in/pcodes.yml new file mode 100644 index 0000000000..6626d92e8a --- /dev/null +++ b/targets/in/pcodes.yml @@ -0,0 +1,73 @@ + +# algal-ish +# - "32209" +# - "32210" +# - "32211" +# - "32217" +# - "32218" +# - "32230" +# - "32231" +# - "32232" +# - "32234" +# - "32241" +# - "32269" +# - "32283" +# - "32284" +# - "32285" +# - "32286" +# - "32287" +# - "32288" +# - "32317" +# - "32318" +# - "32320" +# - "32329" +# - "32334" +# - "32735" +# - "32736" +# - "32737" +# - "32738" +# - "49953" +# - "60050" +# - "62360" +# - "62361" +# - "65228" +# - "65229" +# - "65230" +# - "65231" +# - "70951" +# - "70952" +# - "70953" +# - "70954" +# - "70955" +# - "70956" +# - "70957" +# - "70958" +# - "92209" +# - "92217" +# - "95201" +# - "95203" +# - "95204" +# - "32335" +# - "32336" +# - "32337" +# - "32338" +# - "32339" +# - "01325" +# - "31883" +# - "31884" +# - "31885" +# - "31886" +# - "31887" +# - "31888" +# - "32315" +# - "32316" +# - "32319" +# - "32321" +# - "32323" +# - "95202" + + +# UV pcodes +- "62361" +- "32316" +- "32318" From 8642dd5bede358faa0c8ce17b59d58e83b06dddf Mon Sep 17 00:00:00 2001 From: Zwart Date: Mon, 18 Dec 2023 16:59:57 -0800 Subject: [PATCH 13/26] removing neon site metadata and adding usgs --- USGS_site_metadata.csv | 11 +++++ neon4cast_field_site_metadata.csv | 82 ------------------------------- 2 files changed, 11 insertions(+), 82 deletions(-) create mode 100644 USGS_site_metadata.csv delete mode 100644 neon4cast_field_site_metadata.csv diff --git a/USGS_site_metadata.csv b/USGS_site_metadata.csv new file mode 100644 index 0000000000..badaffae99 --- /dev/null +++ b/USGS_site_metadata.csv @@ -0,0 +1,11 @@ +site_id,agency_cd,site_no,station_nm,site_tp_cd,dec_lat_va,dec_long_va,site_url,colocated,queryTime +USGS-14211720,USGS,14211720,"WILLAMETTE RIVER AT PORTLAND, OR",ST-TS,45.5175,-122.6691667,https://waterdata.usgs.gov/monitoring-location/14211720,FALSE,2023-12-19T00:46:32Z +USGS-14211010,USGS,14211010,"CLACKAMAS RIVER NEAR OREGON CITY, OR",ST,45.3792874,-122.5773134,https://waterdata.usgs.gov/monitoring-location/14211010,FALSE,2023-12-19T00:46:32Z +USGS-14181500,USGS,14181500,"NORTH SANTIAM RIVER AT NIAGARA, OR",ST,44.75377778,-122.2974444,https://waterdata.usgs.gov/monitoring-location/14181500,FALSE,2023-12-19T00:46:32Z +USGS-05586300,USGS,05586300,"ILLINOIS RIVER AT FLORENCE, IL",ST,39.63275,-90.6076667,https://waterdata.usgs.gov/monitoring-location/05586300,FALSE,2023-12-19T00:46:32Z +USGS-05558300,USGS,05558300,"ILLINOIS RIVER AT HENRY, IL",ST,41.10727778,-89.3562222,https://waterdata.usgs.gov/monitoring-location/05558300,FALSE,2023-12-19T00:46:32Z +USGS-05553700,USGS,05553700,"ILLINOIS RIVER AT STARVED ROCK, IL",ST,41.3247564,-88.9839693,https://waterdata.usgs.gov/monitoring-location/05553700,FALSE,2023-12-19T00:46:32Z +USGS-05543010,USGS,05543010,"ILLINOIS RIVER AT SENECA, IL",ST,41.29988889,-88.6141944,https://waterdata.usgs.gov/monitoring-location/05543010,FALSE,2023-12-19T00:46:32Z +USGS-05549500,USGS,05549500,"FOX RIVER NEAR MCHENRY, IL",ST,42.3100222,-88.2514745,https://waterdata.usgs.gov/monitoring-location/05549500,FALSE,2023-12-19T00:46:32Z +USGS-01427510,USGS,01427510,DELAWARE RIVER AT CALLICOON NY,ST,41.75675,-75.0574167,https://waterdata.usgs.gov/monitoring-location/01427510,FALSE,2023-12-19T00:46:32Z +USGS-01463500,USGS,01463500,Delaware River at Trenton NJ,ST,40.22166667,-74.7780556,https://waterdata.usgs.gov/monitoring-location/01463500,FALSE,2023-12-19T00:46:32Z diff --git a/neon4cast_field_site_metadata.csv b/neon4cast_field_site_metadata.csv deleted file mode 100644 index 506a8fe751..0000000000 --- a/neon4cast_field_site_metadata.csv +++ /dev/null @@ -1,82 +0,0 @@ -field_domain_id,field_site_id,field_site_name,terrestrial,aquatics,phenology,ticks,beetles,phenocam_code,phenocam_roi,phenocam_vegetation,field_site_type,field_site_subtype,field_colocated_site,field_site_host,field_site_url,field_nonneon_research_allowed,field_access_details,field_neon_field_operations_office,latitude,longitude,field_geodetic_datum,field_utm_northing,field_utm_easting,field_utm_zone,field_site_county,field_site_state,field_site_country,field_mean_elevation_m,field_minimum_elevation_m,field_maximum_elevation_m,field_mean_annual_temperature_C,field_mean_annual_precipitation_mm,field_dominant_wind_direction,field_mean_canopy_height_m,field_dominant_nlcd_classes,field_domint_plant_species,field_usgs_huc,field_watershed_name,field_watershed_size_km2,field_lake_depth_mean_m,field_lake_depth_max_m,field_tower_height_m,field_usgs_geology_unit,field_megapit_soil_family,field_soil_subgroup,field_avg_number_of_green_days,field_avg_grean_increase_doy,field_avg_green_max_doy,field_avg_green_decrease_doy,field_avg_green_min_doy,field_phenocams,field_number_tower_levels,neon_url -D16,ABBY,Abby Road NEON,1,0,1,0,1,NEON.D16.ABBY.DP1.00033,EN_1000,evergreen needleleaf,Gradient Terrestrial,,,Washington Department of Natural Resources,https://www.dnr.wa.gov/,Limited,Reseachers should coordinate with the site manager and submit a site research permit.,Domain 16 Support Facility,45.762439,-122.33032,WGS84,5067870.429,552075.5426,10N,Clark,WA,USA,365,,708,10,2451,,34m (in surrounding non-logged area),Evergreen Forest|Grassland/Herbaceous|Shrub/Scrub,Gaultheria shallon (salal)|Pseudotsuga menziesii (douglas fir)|Pteridium aquilinum (bracken fern),,,,,,19,WAEOv1b;0,,Andic Humudepts,190,110,165,205,300,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D16.ABBY.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D16.ABBY.DP1.00042),5,https://www.neonscience.org/field-sites/abby -D10,ARIK,Arikaree River NEON,0,1,0,0,0,,,,Core Aquatic,Wadeable Stream,,The Nature Conservancy,https://www.nature.org/en-us/get-involved/how-to-help/places-we-protect/fox-ranch/,Yes,Reseachers should coordinate with the site manager.,Domain 10/13 Support Facility,39.758206,-102.44715,WGS84,4404042.549,718694.3752,13N,Yuma,CO,USA,1179,,,10.4,452,,,Emergent Herbaceous Wetlands|Grassland/Herbaceous|Woody Wetlands,,[h10250001](https://water.usgs.gov/lookup/getwatershed?10250001),Lower Sappa,2631.8,,,,COTo;0|COQe;0,,,,,,,,[Land-water interface](https://phenocam.sr.unh.edu/webcam/sites/NEON.D10.ARIK.DP1.20002),,https://www.neonscience.org/field-sites/arik -D03,BARC,Lake Barco NEON,0,1,0,0,0,,,,Core Aquatic,Lake,OSBS,University of Florida Foundation,https://ordway-swisher.ufl.edu/ResearchUse.aspx,Yes,This area is a very active research community and will required a site research permit.,Domain 03 Support Facility,29.675982,-82.008414,WGS84,3283362.548,402358.9734,17N,Putnam,FL,USA,27,,,20.9,1308,,,Shrub/Scrub,,[h03080103](https://water.usgs.gov/lookup/getwatershed?03080103),Lower St. Johns,31.3,3.3,6.7,,FLPOc;0,,,,,,,,[Land-water interface](https://phenocam.sr.unh.edu/webcam/sites/NEON.D03.BARC.DP1.20002),,https://www.neonscience.org/field-sites/barc -D18,BARR,Utqiaġvik NEON,1,0,1,0,1,NEON.D18.BARR.DP1.00033,TN_1000,tundra,Gradient Terrestrial,,,Ukpeagvik Inupiat Corporation,http://www.north-slope.org/departments/planning-community-services/applications-and-forms,Yes,Reseachers should coordinate with the site manager and submit appropriate site research-access permit.,Domain 18/19 Support Facility,71.28241,-156.61936,WGS84,7910571.986,585246.1299,4N,North Slope,AK,USA,4,0,13,-12,105,E,0.3,Emergent Herbaceous Wetlands,Carex aquatilis (water sedge)|Dupontia fisheri (Fisher's tundragrass)|Petasites frigidus (Arctic sweet coltsfoot),,,,,,9,A003.BW002_114,,Typic Histoturbels,45,175,195,210,220,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D18.BARR.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D18.BARR.DP1.00042),4,https://www.neonscience.org/field-sites/barr -D01,BART,Bartlett Experimental Forest NEON,1,0,1,0,1,NEON.D01.BART.DP1.00033,DB_1000,deciduous broadleaf,Gradient Terrestrial,,,"Northern Research Station, US Forest Service",https://www.nrs.fs.fed.us/ef/locations/nh/bartlett/,Yes,Bartlett Experimental Forest has very limited staff and the USFS personnel are NOT available to support external researchers. Permitting requests for research activities should be submitted at least 6 months prior to planned start.,Domain 01 Support Facility,44.063889,-71.287375,WGS84,4881511.552,316812.1595,19N,Carroll,NH,USA,274,230,655,6.2,1325,S,23,Deciduous Forest|Evergreen Forest|Mixed Forest,Fagus grandifolia (American beech)|Tsuga canadensis (Eastern hemlock)|Acer rubrum (Red maple),,,,,,35,NHJc1b;0,"Coarse-loamy, isotic, frigid. Aquic Haplorthods.",Aquic Haplorthods,180,120,170,220,300,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D01.BART.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D01.BART.DP1.00042),6,https://www.neonscience.org/field-sites/bart -D17,BIGC,Upper Big Creek NEON,0,1,0,0,0,,,,Gradient Aquatic,Wadeable Stream,,US Forest Service,https://www.fs.usda.gov/sierra/,Yes,Researchers should coordinate directly with the US Forest Service for permitting and approval.,Domain 17 Support Facility,37.059719,-119.25755,WGS84,4103686.499,299408.5848,11N,Fresno,CA,USA,1197,,,13.4,900,,,Evergreen Forest,,[h18030010](https://water.usgs.gov/lookup/getwatershed?18030010),Upper King,10.9,,,,CAgrMZ3;0,,,,,,,,[Land-water interface](https://phenocam.sr.unh.edu/webcam/sites/NEON.D17.BIGC.DP1.20002),,https://www.neonscience.org/field-sites/bigc -D02,BLAN,Blandy Experimental Farm NEON,1,0,1,1,1,NEON.D02.BLAN.DP1.00033,DB_1000,deciduous broadleaf,Gradient Terrestrial,,LEWI,University of Virginia|Private Land,http://blandy.virginia.edu/research|,Yes (Tower and TIS) / Very Limited,Research activity at the NEON tower area via University of Virginia. / Very limited available via private land owner.,Domain 02 Support Facility,39.033698,-78.041788,WGS84,4327545.884,753379.5421,17N,Clarke,VA,USA,183,119,193,12.1,983,NW,1,Deciduous Forest|Pasture/Hay,Rhamnus davurica (dahurian buckthorn)|Lonicera maackii (amur honeysuckle)|Juglans nigra (eastern black walnut),,,,,,8,VAOCAco;0,"Fine, mixed, subactive, mesic. Ultic Hapludalfs.",Ultic Hapludalfs,235,75,150,210,310,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D02.BLAN.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D02.BLAN.DP1.00042),4,https://www.neonscience.org/field-sites/blan -D12,BLDE,Blacktail Deer Creek NEON,0,1,0,0,0,,,,Core Aquatic,Wadeable Stream,YELL,National Park Service,https://irma.nps.gov/rprs/,Limited,The National Park Service is open to additional research activities taking place in this area. Apply via IRMA Permitting portal. NEON research area is limited to additional research due to sensitivity.,Domain 12 Support Facility,44.95011,-110.58715,WGS84,4977491.173,532567.1216,12N,Park,WY,USA,2053,,,3.6,481,,,Emergent Herbaceous Wetlands|Shrub/Scrub,,[h10070001](https://water.usgs.gov/lookup/getwatershed?10070001),Yellowstone Headwaters,37.8,,,,WYQu;0,,,,,,,,[Land-water interface](https://phenocam.sr.unh.edu/webcam/sites/NEON.D12.BLDE.DP1.20002),,https://www.neonscience.org/field-sites/blde -D11,BLUE,Blue River NEON,0,1,0,0,0,,,,Gradient Aquatic,Wadeable Stream,,The Nature Conservancy,https://www.nature.org/en-us/get-involved/how-to-help/places-we-protect/okayanahli-preserve/,Yes,Reseachers should coordinate with the site manager.,Domain 11 Support Facility,34.444218,-96.624201,WGS84,3813972.213,718273.9768,14N,Johnston,OK,USA,289,,,16.4,1041,,,Grassland/Herbaceous|Pasture/Hay,,[h11140102](https://water.usgs.gov/lookup/getwatershed?11140102),Blue,322.2,,,,OKQal;0,,,,,,,,[Land-water interface](https://phenocam.sr.unh.edu/webcam/sites/NEON.D11.BLUE.DP1.20002),,https://www.neonscience.org/field-sites/blue -D08,BLWA,Black Warrior River NEON,0,1,0,0,0,,,,Gradient Aquatic,Non-wadeable River,DELA,US Army Corps of Engineers|Private,https://www.sam.usace.army.mil/|,Limited / Very Limited,"This area is primarily intended to provide recreational opportunities and is also classified as a hunting area. As such, access is very limited but potentially possible. / Very limited available via private land owner.",Domain 08 Support Facility,32.541529,-87.798151,WGS84,3600743.438,425055.8239,16N,Greene,AL,USA,22,,,17.6,1372,,,Woody Wetlands,,[h03160113](https://water.usgs.gov/lookup/getwatershed?03160113),Lower Black Warrior,16159.4,,,,ALHalt;0,,,,,,,,[Land-water interface](https://phenocam.sr.unh.edu/webcam/sites/NEON.D08.BLWA.DP1.20002),,https://www.neonscience.org/field-sites/blwa -D19,BONA,Caribou-Poker Creeks Research Watershed NEON,1,0,1,0,1,NEON.D19.BONA.DP1.00033,EN_1000,evergreen needleleaf,Core Terrestrial,,CARI,University of Alaska,https://www.uaf.edu/uaf/,Yes,NEON site is colocated with Boreal LTER. Please allow extra lead time (3-6 months prior to planned start) for coordination requirements; coordinate with site manager,Domain 18/19 Support Facility,65.15401,-147.50258,WGS84,7225712.648,476436.7395,6N,Fairbanks North Star,AK,USA,230,212,728,-3,262,W,8,Deciduous Forest|Evergreen Forest|Mixed Forest|Woody Wetlands,Picea mariana (black spruce)|Populus tremuloides (quaking aspen)|Alnus viridis (green alder) ,,,,,,19,A003.LG002_114|E191.LG002_930,"Coarse-silty, mixed, superactive, subgelic. Typic Histoturbels.",Typic Histoturbels,115,135,180,210,250,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D19.BONA.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D19.BONA.DP1.00042),5,https://www.neonscience.org/field-sites/bona -D19,CARI,Caribou Creek NEON,0,1,0,0,0,,,,Core Aquatic,Wadeable Stream,BONA,Alaska Department of Natural Resources,http://dnr.alaska.gov/,Yes,NEON site is colocated with Boreal LTER. Please allow extra lead time (3-6 months prior to planned start) for coordination requirements; coordinate with site manager,Domain 18/19 Support Facility,65.153224,-147.50397,WGS84,7225606.728,476441.523,6N,Fairbanks North Star,AK,USA,225,,,-3,262,,,Woody Wetlands,,[h19040509](https://water.usgs.gov/lookup/getwatershed?19040509),Tolovana River,31,,,,A003.LG002_114|E191.LG002_930,,,115,135,180,210,250,[Land-water interface](https://phenocam.sr.unh.edu/webcam/sites/NEON.D19.CARI.DP1.20002),,https://www.neonscience.org/field-sites/cari -D11,CLBJ,Lyndon B. Johnson National Grassland NEON,1,0,1,0,1,NEON.D11.CLBJ.DP1.00033,DB_2000,deciduous broadleaf,Core Terrestrial,,PRIN,US Forest Service,https://www.fs.usda.gov/detail/texas/about-forest/districts/?cid=fswdev3_008440,Very Limited,Researchers should coordinate directly with the US Forest Service for permitting and approval. Site host is very limited to external research requests.,Domain 11 Support Facility,33.40123,-97.57,WGS84,3696682.441,632982.2183,14N,Wise,TX,USA,272,258,343,17.5,926,S,13,Deciduous Forest|Grassland/Herbaceous,Quercus stellata (post oak)|Quercus marilandica (blackjack oak),,,,,,22,TXKa;0,,Udic Paleustalfs,260,60|215,135|230,175|265,295|320,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D11.CLBJ.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D11.CLBJ.DP1.00042),5,https://www.neonscience.org/field-sites/clbj -D13,COMO,Como Creek NEON,0,1,0,0,0,,,,Core Aquatic,Wadeable Stream,NIWO,US Forest Service,https://cuboulder.qualtrics.com/jfe/form/SV_3O9QymZrswv5U6F,Yes,Reseachers should coordinate with the site manager and submit a site research permit.,Domain 10/13 Support Facility,40.034962,-105.54416,WGS84,4431779.634,453513.6657,13N,Boulder,CO,USA,3021,,,2,841,,,Shrub/Scrub,,[h10190005](https://water.usgs.gov/lookup/getwatershed?10190005),St. Vrain,3.6,,,,COXb;0|COQd;0,,,,,,,,[Land-water interface](https://phenocam.sr.unh.edu/webcam/sites/NEON.D13.COMO.DP1.20002),,https://www.neonscience.org/field-sites/como -D10,CPER,Central Plains Experimental Range NEON,1,0,1,0,1,NEON.D10.CPER.DP1.00033,GR_1000,grassland,Core Terrestrial,,,USDA-Agricultural Research Service,https://www.ars.usda.gov/plains-area/fort-collins-co/center-for-agricultural-resources-research/rangeland-resources-systems-research/docs/rrsr/central-plains-experimental-research-location/,Yes,Reseachers should coordinate with the site manager.,Domain 10/13 Support Facility,40.815536,-104.74559,WGS84,4518311.062,521454.7706,13N,Weld,CO,USA,1654,1601,1686,8.6,344,NW,0.4,Grassland/Herbaceous,Bouteloua gracilis (Blue grama)|Hesperostipa comata (Needle-and-thread grass)|Thelesperma filifolium (Stiff greenthread),,,,,,9,COKl;0,"Fine, loamy, mixed, superactive, mesic. Aridic Argiustolls.",Aridic Argiustolls,260,90,165,210,350,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D10.CPER.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D10.CPER.DP1.00042),4,https://www.neonscience.org/field-sites/cper -D05,CRAM,Crampton Lake NEON,0,1,0,0,0,,,,Core Aquatic,Lake,,University of Notre Dame,https://underc.nd.edu/underc-west/research-opportunities/,Yes,"UNDERC encourages research; subject to evaluation based on potential for scientific advancement, impact on the site, and consistency and compatibility with other designated, non-research, uses of the property.",Domain 05 Support Facility,46.209675,-89.473688,WGS84,5120489.547,308836.941,16N,Vilas,WI,USA,509,,,4.3,794,,,Woody Wetlands,,[h04020102](https://water.usgs.gov/lookup/getwatershed?04020102),Ontonagon,0.6,4.6,19,,WIAgn;0,,,,,,,,[Land-water interface](https://phenocam.sr.unh.edu/webcam/sites/NEON.D05.CRAM.DP1.20002),,https://www.neonscience.org/field-sites/cram -D04,CUPE,Rio Cupeyes NEON,0,1,0,0,0,,,,Core Aquatic,Wadeable Stream,,Commonwealth of Puerto Rico|Private (access),,Limited,Please note this area is an active farm. Research activities are limited and must not interfere with farming activites; gates must remain closed at all times to avoid cattle walking out. Start permitting > 6 months prior to scheduled start.,Domain 04 Support Facility,18.11352,-66.98676,WGS84,2003908.949,713025.6777,19N,San German Municipio,PR,USA,157,,,,,,,Evergreen Forest,,[h21010003](https://water.usgs.gov/lookup/getwatershed?21010003),Culebrinas-Guanajibo,4.3,,,,KJs,,,,,,,,[Land-water interface](https://phenocam.sr.unh.edu/webcam/sites/NEON.D04.CUPE.DP1.20002),,https://www.neonscience.org/field-sites/cupe -D09,DCFS,Dakota Coteau Field Site NEON,1,0,1,0,1,NEON.D09.DCFS.DP1.00033,GR_1000,grassland,Gradient Terrestrial,,PRLA,North Dakota Land Trust,https://www.land.nd.gov/,Yes,Reseachers should coordinate with the site manager.,Domain 09 Support Facility,47.16165,-99.10656,WGS84,5223133.117,491923.484,14N,Stutsman,ND,USA,575,494,592,4.9,490,NW,0.4,Grassland/Herbaceous,Elaeagnus commutata (slilverberry)|Poa pratensis (Kentucky bluegrass)|Crataegus chrysocarpa (fireberry hawthorn),,,,,,8,NDQct;0,"Fine, loamy, mixed, superactive, frigid. Typic Haplustolls.",Typic Haplustolls,170,120,180,205,290,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D09.DCFS.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D09.DCFS.DP1.00042),4,https://www.neonscience.org/field-sites/dcfs -D19,DEJU,Delta Junction NEON,1,0,1,0,1,NEON.D19.DEJU.DP1.00033,EN_1000,tundra,Gradient Terrestrial,,,Bureau of Land Management,https://www.blm.gov/office/eastern-interior-field-office,Yes,Reseachers should coordinate with the site manager.,Domain 18/19 Support Facility,63.88112,-145.75136,WGS84,7084367.216,561330.0608,6N,Southeast Fairbanks,AK,USA,517,444,581,-3,305,E,10,Evergreen Forest|Shrub/Scrub|Woody Wetlands,Picea mariana (black spruce)|Vaccinium vitis-idaea (lingonberry)|Betula glandulosa / Betula (American dwarf birch),,,,,,22,A003.MH002_140,"Coarse, loamy, mixed, superactive. Typic Haplocryepts.",Typic Haplocryepts,120,130,170,210,250,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D19.DEJU.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D19.DEJU.DP1.00042),5,https://www.neonscience.org/field-sites/deju -D08,DELA,Dead Lake NEON,1,0,1,0,1,NEON.D08.DELA.DP1.00033,DB_1000,deciduous broadleaf,Gradient Terrestrial,,BLWA,US Army Corps of Engineers,https://www.sam.usace.army.mil/,Limited,"This area is primarily intended to provide recreational opportunities and is also classified as a hunting area. As such, access is very limited but potentially possible.",Domain 08 Support Facility,32.541727,-87.803877,WGS84,3600769.463,424518.299,16N,Greene,AL,USA,25,21,41,17.6,1372,SW,30,Evergreen Forest|Woody Wetlands,Quercus nigra (Water oak)|Celtis laevigata (Sugarberry)|Acer rubrum (Red maple),,,,,,42,ALHalt;0,"Fine, mixed, semiactive, thermic. Aquic Paleudults.",Aquic Paleudults,270,60,135,205,330,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D08.DELA.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D08.DELA.DP1.00042),6,https://www.neonscience.org/field-sites/dela -D03,DSNY,Disney Wilderness Preserve NEON,1,0,1,0,1,NEON.D03.DSNY.DP1.00033,GR_1000,grassland,Gradient Terrestrial,,,The Nature Conservancy,https://www.nature.org/en-us/get-involved/how-to-help/places-we-protect/the-disney-wilderness-preserve/,Yes,New research requests may be restricted to limited portions of the preserve - coordination required with preserve management.,Domain 03 Support Facility,28.12505,-81.43619,WGS84,3111130.689,457161.0924,17N,Osceola,FL,USA,20,15,22,22.5,1216,E,1.5,Pasture/Hay|Woody Wetlands,Andropogon virginicus (broomsedge bluestem)|Aristida beyrichia (wiregrass)|Axonopus furcatus (big carpetgrass),,,,,,8,FLPSHu;0,"Sandy, siliceous, hyperthermic. Aeric Alaquods.",Aeric Alaquods,260,60,140,190,320,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D03.DSNY.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D03.DSNY.DP1.00042),4,https://www.neonscience.org/field-sites/dsny -D03,FLNT,Flint River NEON,0,1,0,0,0,,,,Gradient Aquatic,Non-wadeable River,JERC,"Robert Woodruff Foundation, Inc.",http://www.jonesctr.org/research/,Yes,This area is a very active research community and will required a site research permit.,Domain 03 Support Facility,31.185424,-84.437403,WGS84,3452980.845,744204.4003,16N,Baker,GA,USA,30,,,19.2,1311,,,Mixed Forest,,[h03130008](https://water.usgs.gov/lookup/getwatershed?03130008),Lower Flint,14999.4,,,,GAQal;1,,,,,,,,[Land-water interface](https://phenocam.sr.unh.edu/webcam/sites/NEON.D03.FLNT.DP1.20002),,https://www.neonscience.org/field-sites/flnt -D07,GRSM,Great Smoky Mountains National Park NEON,1,0,1,0,1,NEON.D07.GRSM.DP1.00033,DB_1000,deciduous broadleaf,Gradient Terrestrial,,LECO,National Park Service,https://irma.nps.gov/rprs/,Yes,The National Park Service is open to additional research activities taking place in this area. Apply via IRMA Permitting portal.,Domain 07 Support Facility,35.68896,-83.50195,WGS84,3952335.289,273599.8765,17N,Sevier,TN,USA,575,426,1978,13.1,1375,NW,30,Deciduous Forest|Evergreen Forest,Liriodendron tulipifera (tulip tree/yellow poplar)|Lindera benzoin (spicebush)|Acer rubrum (red maple),,,,,,45,TNpCAs;15,"Loamy, skeletal, isotic, mesic. Typic Humudepts.",Typic Humudepts,220,90,155,215,310,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D07.GRSM.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D07.GRSM.DP1.00042),6,https://www.neonscience.org/field-sites/grsm -D04,GUAN,Guanica Forest NEON,1,0,1,0,1,NEON.D04.GUAN.DP1.00033,EB_1000,evergreen broadleaf,Core Terrestrial,,,"State Forest, Dept. of Natural and Environmental Resources, Commonwealth of Puerto Rico",,Limited,It is highly recommended that prospective researchers make contact well in advance of any planned work (> 6 months) as there are multiple steps and a high level of coordination that must take place to gain permission and access to this area. All requests will be evaluated on a case-by-case basis by the site hosts.,Domain 04 Support Facility,17.96955,-66.8687,WGS84,1988112.213,725706.1285,19N,Guanica Municipio,PR,USA,125,8,209,23,840,S,10,Evergreen Forest,Gymnanthes lucida (oysterwood)|Croton lucidus (firebush)|Eugenia foetida (Spanish stopper),,,,,,23,Tjd,"Coarse, loamy, carbonatic, isohyperthermic. Typic Haplocalcids.",Typic Haplocalcids,365,,,,,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D04.GUAN.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D04.GUAN.DP1.00042),5,https://www.neonscience.org/field-sites/guan -D04,GUIL,Rio Guilarte NEON,0,1,0,0,0,,,,Gradient Aquatic,Wadeable Stream,,University of Puerto Rico,,Yes,"The site host actively encourages research at this site, however all requests will be evaluated on a case-by-case basis. Please note that due to the high density of research taking place in this area, it is critical to coordinate closely with the site host to ensure no conflicts with ongoing research; start permitting > 6 months prior to scheduled start.",Domain 04 Support Facility,18.17406,-66.79868,WGS84,2010843.814,732872.1887,19N,Adjuntas Municipio,PR,USA,551,,,,,,,Evergreen Forest|Grassland/Herbaceous,,[h21010003](https://water.usgs.gov/lookup/getwatershed?21010003),Culebrinas-Guanajibo,9.6,,,,Tkal|TKl,,,,,,,,[Land-water interface](https://phenocam.sr.unh.edu/webcam/sites/NEON.D04.GUIL.DP1.20002),,https://www.neonscience.org/field-sites/guil -D01,HARV,Harvard Forest & Quabbin Watershed NEON,1,0,1,0,1,NEON.D01.HARV.DP1.00033,DB_1000,deciduous broadleaf,Core Terrestrial,,HOPB,Harvard University|Massachusetts DCR Division of Water Supply Protection,https://harvardforest.fas.harvard.edu/conducting-research|https://www.mass.gov/service-details/watershed-permits,Yes / Limited,Field site managed by Harvard University - open to additional research via the Harvard Experimental Forest website. Many other colocated research projects within NEON area. / Field site located in the Quabbin Resevoir - Massachusetts DCR Division of Water Supply Protection . This property is very limited to additional research - researchers should take necessary coordinations with the DCR.,Domain 01 Support Facility,42.53691,-72.17265,WGS84,4713265.041,732183.1938,18N,Worcester,MA,USA,348,160,415,7.4,1199,NW,26,Deciduous Forest|Evergreen Forest|Mixed Forest|Woody Wetlands,Osmunda cinnamomea (Cinmon fern)|Quercus rubra (Northern red oak)|Tsuga cadensis (Eastern hemlock),,,,,,39,MADht;0|MAOps;0,"Coarse, loamy over sandy or sandy, skeletal, mixed, semiactive, frigid. Oxyaquic Dystrudepts.",Oxyaquic Dystrudepts,210,110,160,220,300,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D01.HARV.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D01.HARV.DP1.00042),6,https://www.neonscience.org/field-sites/harv -D19,HEAL,Healy NEON,1,0,1,0,1,NEON.D19.HEAL.DP1.00033,TN_1000,tundra,Gradient Terrestrial,,,Alaska Department of Natural Resources,http://dnr.alaska.gov/,Yes,Reseachers should coordinate with the site manager.,Domain 18/19 Support Facility,63.875798,-149.21335,WGS84,7085047.865,391276.5986,6N,Denali,AK,USA,677,588,717,-1.3,385,NW,0.3,Dwarf Scrub|Evergreen Forest|Shrub/Scrub,Betula glandulosa / Betula (American dwarf birch)|Picea glauca (white spruce)|Ledum palustre (marsh Labrador tea),,,,,,9,B006.HE002_570,,Lithic Haplustepts,110,135,180,210,245,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D19.HEAL.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D19.HEAL.DP1.00042),4,https://www.neonscience.org/field-sites/heal -D01,HOPB,Lower Hop Brook NEON,0,1,0,0,0,,,,Core Aquatic,Wadeable Stream,HARV,Massachusetts DCR Division of Water Supply Protection,https://www.mass.gov/service-details/watershed-permits,Limited,Field site located in the Quabbin Resevoir - Massachusetts DCR Division of Water Supply Protection . This property is very limited to additional research - researchers should take necessary coordinations with the DCR.,Domain 01 Support Facility,42.471941,-72.329526,WGS84,4705615.726,719519.9768,18N,Franklin,MA,USA,203,,,7.9,1368,,,Evergreen Forest|Mixed Forest,,[h01080204](https://water.usgs.gov/lookup/getwatershed?01080204),Chicopee,11.9,,,,MAOps;0,,,,,,,,[Land-water interface](https://phenocam.sr.unh.edu/webcam/sites/NEON.D01.HOPB.DP1.20002),,https://www.neonscience.org/field-sites/hopb -D03,JERC,The Jones Center At Ichauway NEON,1,0,1,0,1,NEON.D03.JERC.DP1.00033,EN_2000,evergreen needleleaf,Gradient Terrestrial,,FLNT,"Robert Woodruff Foundation, Inc.",http://www.jonesctr.org/research/,Yes,This area is a very active research community and will required a site research permit.,Domain 03 Support Facility,31.194839,-84.468623,WGS84,3453956.371,741205.7224,16N,Baker,GA,USA,47,29,55,19.2,1308,NE,27,Cultivated Crops|Deciduous Forest|Evergreen Forest|Mixed Forest,Aristida beyrichiana (wiregrass)|Quercus falcata (southern red oak)|Pinus palustris (longleaf pine),,,,,,42,GAEOo;1,"Loamy, kaolinitic, thermic. Arenic Kandiudults.",Arenic Kandiudults,220,90,175,220,310,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D03.JERC.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D03.JERC.DP1.00042),6,https://www.neonscience.org/field-sites/jerc -D14,JORN,Jornada Experimental Range NEON,1,0,1,0,1,NEON.D14.JORN.DP1.00033,GR_1000,grassland,Gradient Terrestrial,,,USDA-Agricultural Research Service,https://jornada.nmsu.edu/,Yes,"JORN encourages research activities that do not conflict with on-going activities. Please apply directly with site host and USDA for a site research permit. All requests are reviewed for impacts to cultural resources, endangered species and other research activities.",Domain 14 Support Facility,32.590694,-106.84254,WGS84,3607409.16,327074.62,13N,Dona Ana,NM,USA,1324,1316,1333,15.7,271,SW,0.4,Shrub/Scrub,Prosopis glandulosa (honey mesquite)|Yucca elata (soaptree yucca)|Bouteloua eriopoda (black grama grass),,,,,,8,NMQTs;0,"Coarse, loamy, mixed, superactive, thermicc. Typic Petrocalcids.",Typic Petrocalcids,260,80,185,245,340,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D14.JORN.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D14.JORN.DP1.00042),4,https://www.neonscience.org/field-sites/jorn -D06,KING,Kings Creek NEON,0,1,0,0,0,,,,Core Aquatic,Wadeable Stream,KONA,"The Nature Conservancy, Kansas State University",https://kpbs.konza.k-state.edu/scientist-information/permits.html,Yes,The Nature Conservancy and Konza Prairie Biological Station (KSU) welcomes and encourages research use that fits their mission and is compatible with their abilities as a host. Please plan on at more than two weeks advance notice to request and plan site access.,Domain 06 Support Facility,39.105061,-96.603829,WGS84,4331170.418,707234.5703,14N,Riley,KS,USA,324,,,12.7,860,,,Deciduous Forest,,[h10270101](https://water.usgs.gov/lookup/getwatershed?10270101),Upper Kansas,13,,,,KSPcg;0,,,,,,,,[Land-water interface](https://phenocam.sr.unh.edu/webcam/sites/NEON.D06.KING.DP1.20002),,https://www.neonscience.org/field-sites/king -D06,KONA,Konza Prairie Agroecosystem NEON,1,0,1,0,1,NEON.D06.KONA.DP1.00033,AG_1000,agriculture,Gradient Terrestrial,,KING,Kansas State University,https://kpbs.konza.k-state.edu/scientist-information/permits.html,Yes,KSU - Konza Prairie Biological Station (KSU) welcomes and encourages research use that fits their mission and is compatible with their abilities as a host. Please plan on at more than two weeks advance notice to request and plan site access.,Domain 06 Support Facility,39.110446,-96.612935,WGS84,4331745.281,706389.4538,14N,Riley,KS,USA,323,312,359,12.7,850,SSW,,Cultivated Crops,"Agriculture field, crops vary year to year",,,,,,8,KSQal3;0,"Fine, smectitic, mesic. Pachic Vertic Argiudolls.",Pachic Vertic Argiudolls,210,90,160,210,300,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D06.KONA.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D06.KONA.DP1.00042),4,https://www.neonscience.org/field-sites/kona -D06,KONZ,Konza Prairie Biological Station NEON,1,0,1,1,1,NEON.D06.KONZ.DP1.00033,GR_1000,grassland,Core Terrestrial,,,"The Nature Conservancy, Kansas State University",https://kpbs.konza.k-state.edu/scientist-information/permits.html,Yes,The Nature Conservancy and Konza Prairie Biological Station (KSU) welcomes and encourages research use that fits their mission and is compatible with their abilities as a host. Please plan on at more than two weeks advance notice to request and plan site access.,Domain 06 Support Facility,39.100774,-96.563075,WGS84,4330786.534,710729.798,14N,Riley,KS,USA,414,333,443,12.4,870,SSW,1.5,Deciduous Forest|Grassland/Herbaceous,Cornus drummondii (Roughleaf Dogwood)|Schizachyrium scoparium (Little Bluestem)|Andropogon gerardii (Big Bluestem),,,,,,8,KSPc;0,"Fine, smectitic, mesic. Pachic Udertic Argiustolls.",Pachic Udertic Argiustolls,210,90,160,210,300,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D06.KONZ.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D06.KONZ.DP1.00042),4,https://www.neonscience.org/field-sites/konz -D04,LAJA,Lajas Experimental Station NEON,1,0,1,0,1,NEON.D04.LAJA.DP1.00033,AG_1000,agriculture,Gradient Terrestrial,,,University of Puerto Rico,,Limited,"The site host actively encourages research at this site, however all requests will be evaluated on a case-by-case basis. Please note that due to the high density of research taking place in this area, it is critical to coordinate closely with the site host to ensure no conflicts with ongoing research.; > 6months prior to planned schedule.",Domain 04 Support Facility,18.021261,-67.076889,WGS84,1993593.871,703591.1281,19N,Lajas Municipio,PR,USA,16,13,41,25,830,SSE,0.4,Cultivated Crops|Grassland/Herbaceous|Pasture/Hay,Pithecellobium dulce (pinzán)|Cynodon nlemfuensis (African bermudagrass)|Urochloa maxima (guineagrass),,,,,,8,Qa,"Fine, mixed, superactive, isohyperthermic. Sodic Haplusterts.",Sodic Haplusterts,365,,,,,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D04.LAJA.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D04.LAJA.DP1.00042),4,https://www.neonscience.org/field-sites/laja -D07,LECO,LeConte Creek NEON,0,1,0,0,0,,,,Gradient Aquatic,Wadeable Stream,GRSM,National Park Service,https://irma.nps.gov/rprs/,Yes,The National Park Service is open to additional research activities taking place in this area. Apply via IRMA Permitting portal.,Domain 07 Support Facility,35.690428,-83.50379,WGS84,3952502.4,273437.4965,17N,Sevier,TN,USA,579,,,13.1,1375,,,Deciduous Forest,,[h06010107](https://water.usgs.gov/lookup/getwatershed?06010107),Lower French Broad,9.1,,,,TNpCAs;15,,,,,,,,[Land-water interface](https://phenocam.sr.unh.edu/webcam/sites/NEON.D07.LECO.DP1.20002),,https://www.neonscience.org/field-sites/leco -D08,LENO,Lenoir Landing NEON,1,0,1,1,1,NEON.D08.LENO.DP1.00033,DB_1000,deciduous broadleaf,Gradient Terrestrial,,TOMB,US Army Corps of Engineers|US Fish and Wildlife Service,https://www.sam.usace.army.mil/|https://www.fws.gov/refuge/choctaw/,Limited /Yes,"This area is primarily intended to provide recreational opportunities and is also classified as a hunting area. As such, access is very limited but potentially possible. / The primary purpose of the refuge is to provide wood duck brood habitat and serve as a protected wintering area for waterfowl. Researchers should coordinate directly with site manager.",Domain 08 Support Facility,31.853861,-88.161181,WGS84,3524827.167,390139.6172,16N,Choctaw,AL,USA,13,,,18.1,1386,N,35,Deciduous Forest|Woody Wetlands,Liquidambar styraciflua (sweetgum)|Carpinus carolinia (American hornbeam)|Ilex decidua (possumhaw),,,,,,47,ALHalt;0,"Fine, mixed, active, acid, thermic. Vertic Epiaquepts.",Vertic Epiaquepts,265,70,145,200,335,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D08.LENO.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D08.LENO.DP1.00042),6,https://www.neonscience.org/field-sites/leno -D02,LEWI,Lewis Run NEON,0,1,0,0,0,,,,Gradient Aquatic,Wadeable Stream,BLAN,Casey Tree Farm,https://caseytrees.org/about-us/casey-tree-farm/,Limited,Research on the Casey Tree Farm is limited - coordination required with farm management.,Domain 02 Support Facility,39.095637,-77.983216,WGS84,4331627.279,242002.1375,18N,Clarke,VA,USA,152,,,12.2,976,,,Deciduous Forest,,[h02070007](https://water.usgs.gov/lookup/getwatershed?02070007),Shenandoah,11.9,,,,VACAe;0,,,,,,,BLAN,[Land-water interface](https://phenocam.sr.unh.edu/webcam/sites/NEON.D02.LEWI.DP1.20002),,https://www.neonscience.org/field-sites/lewi -D05,LIRO,Little Rock Lake NEON,0,1,0,0,0,,,,Gradient Aquatic,Lake,,Wisconsin Department of Natural Resources,https://dnr.wi.gov/Permits/,Yes,The site host has indicated support for additional research.,Domain 05 Support Facility,45.998269,-89.704767,WGS84,290559.717,5097412.448,16N,Vilas,WI,USA,502,,,4.4,796,,,Deciduous Forest|Mixed Forest,,[h07050002](https://water.usgs.gov/lookup/getwatershed?07050002),Flambeau,0.9,2.7,10.8,,WIXgg;0,,,,,,,,[Land-water interface](https://phenocam.sr.unh.edu/webcam/sites/NEON.D05.LIRO.DP1.20002),,https://www.neonscience.org/field-sites/liro -D16,MART,Martha Creek NEON,0,1,0,0,0,,,,Core Aquatic,Wadeable Stream,,US Forest Service,https://www.fs.usda.gov/recarea/giffordpinchot/recreation/recarea/?recid=31184,Yes,Reseachers should coordinate with the site manager and submit a site research permit. Various on-going research projects to be aware of at site. Possible NOAA permit required to due sensitive fish species in stream.,Domain 16 Support Facility,45.790835,-121.93379,WGS84,5071408.747,583011.2516,10N,Skamania,WA,USA,337,,,9.6,2329,,,Evergreen Forest,,[h17070105](https://water.usgs.gov/lookup/getwatershed?17070105),Middle Columbia-Hood,6.3,,,,WAQv;0|WAEOOGv;0,,,,,,,,[Land-water interface](https://phenocam.sr.unh.edu/webcam/sites/NEON.D16.MART.DP1.20002),,https://www.neonscience.org/field-sites/mart -D08,MAYF,Mayfield Creek NEON,0,1,0,0,0,,,,Core Aquatic,Wadeable Stream,TALL,Talladega National Forest,https://www.fs.usda.gov/detail/alabama/about-forest/districts/?cid=fsbdev3_002555,Yes,Researchers should coordinate directly with the US Forest Service for permitting and approval.,Domain 08 Support Facility,32.960365,-87.407688,WGS84,3646888.45,461856.8853,16N,Bibb,AL,USA,77,,,17.2,1379,,,Deciduous Forest|Mixed Forest,,[h03160113](https://water.usgs.gov/lookup/getwatershed?03160113),Lower Black Warrior,14.4,,,,ALKg;1|ALKck;1,,,,,,,,[Land-water interface](https://phenocam.sr.unh.edu/webcam/sites/NEON.D08.MAYF.DP1.20002),,https://www.neonscience.org/field-sites/mayf -D06,MCDI,McDiffett Creek NEON,0,1,0,0,0,,,,Gradient Aquatic,Wadeable Stream,,"The Nature Conservancy, Kansas State University",https://kpbs.konza.k-state.edu/scientist-information/permits.html,Yes,The Nature Conservancy and Konza Prairie Biological Station (KSU) welcomes and encourages research use that fits their mission and is compatible with their abilities as a host. Please plan on at more than two weeks advance notice to request and plan site access.,Domain 06 Support Facility,38.945861,-96.443022,WGS84,4313704.71,721693.8516,14N,Wabaunsee,KS,USA,396,,,12.2,921,,,Cultivated Crops|Grassland/Herbaceous,,[h10270102](https://water.usgs.gov/lookup/getwatershed?10270102),Middle Kansas,22.6,,,,KSPc;0,,,,,,,,[Land-water interface](https://phenocam.sr.unh.edu/webcam/sites/NEON.D06.MCDI.DP1.20002),,https://www.neonscience.org/field-sites/mcdi -D16,MCRA,McRae Creek NEON,0,1,0,0,0,,,,Gradient Aquatic,Wadeable Stream,,"US Forest Service, Oregon State University",https://andrewsforest.oregonstate.edu/,Yes,Researchers should coordinate directly with the US Forest Service and HJ Andrews Experimental Forest for permitting and approval.,Domain 16 Support Facility,44.259598,-122.16555,WGS84,4901044.973,566608.6324,10N,Linn,OR,USA,876,,,8.8,2188,,,Evergreen Forest,,[h17090004](https://water.usgs.gov/lookup/getwatershed?17090004),Mckenzie,3.9,,,,ORTfc;0,,,,,,,,[Land-water interface](https://phenocam.sr.unh.edu/webcam/sites/NEON.D16.MCRA.DP1.20002),,https://www.neonscience.org/field-sites/mcra -D07,MLBS,Mountain Lake Biological Station NEON,1,0,1,0,1,NEON.D07.MLBS.DP1.00033,DB_2000,deciduous broadleaf,Gradient Terrestrial,,,University of Virginia|George Washington and Jefferson National Forest,https://mlbs.virginia.edu/resapp|https://www.fs.usda.gov/gwj/,Yes / Limited,Mountain Lake Biological Station is open to additional research activities taking place in this area. / Researchers should coordinate directly with the US Forest Service for permitting and approval.,Domain 07 Support Facility,37.378314,-80.524847,WGS84,4136943.44,542067.64,17N,Giles,VA,USA,1170,752,1320,8.8,1227,WNW,18,Deciduous Forest,Acer rubrum (red maple)|Quercus alba (northern red oak)|Quercus rubra (white oak),,,,,,29,VADSz;0,The dominant wind direction is west-northwest.,Fluvaquents,200,110,160,220,310,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D07.MLBS.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D07.MLBS.DP1.00042),6,https://www.neonscience.org/field-sites/mlbs -D13,MOAB,Moab NEON,1,0,1,0,1,NEON.D13.MOAB.DP1.00033,GR_1000,grassland,Gradient Terrestrial,,,Bureau of Land Management,https://www.blm.gov/office/moab-field-office,Yes,Reseachers should coordinate with the site manager.,Domain 10/13 Support Facility,38.248283,-109.38827,WGS84,4234596.509,641031.4708,12N,San Juan,UT,USA,1799,1722,2039,10.1,319,SSW,0.2,Evergreen Forest|Shrub/Scrub,Atriplex canescens (fourwing saltbush)|Ephedra viridis (Mormon tea)|Bouteloua gracilis (blue grama) .,,,,,,8,UTQe;0,"Coarse, loamy, mixed, superactive, mesic. Ustic Haplocalcids.",Ustic Haplocalcids,215,85,165,225,300,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D13.MOAB.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D13.MOAB.DP1.00042),4,https://www.neonscience.org/field-sites/moab -D13,NIWO,Niwot Ridge NEON,1,0,1,0,1,NEON.D13.NIWO.DP1.00033,TN_1000,tundra,Core Terrestrial,,COMO,"US Forest Service, University of Colorado-Boulder",,Yes,Reseachers should coordinate with the site manager and submit a site research permit.,Domain 10/13 Support Facility,40.05425,-105.58237,WGS84,4433940.917,450328.2848,13N,Boulder,CO,USA,3490,2975,3583,0.3,1005,WNW,0.2,Evergreen Forest|Grassland/Herbaceous,Abies lasiocarpa (subapline fir)|Picea engelmannii (Engelmann spruce)|Vaccinium sp. (blueberry sp.),,,,,,8,COXb;0,"Coarse, loamy, mixed, superactive. Typic Haplocryolls.",Typic Haplocryolls,130,140,190,220,270,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D13.NIWO.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D13.NIWO.DP1.00042),4,https://www.neonscience.org/field-sites/niwo -D09,NOGP,Northern Great Plains Research Laboratory NEON,1,0,1,0,1,NEON.D09.NOGP.DP1.00033,GR_1000,grassland,Gradient Terrestrial,,,USDA Agricultural Research Service,https://www.ars.usda.gov/plains-area/mandan-nd/ngprl/,Yes,This site host welcomes and encourages additional research activities related to the USDA Agricultural Research Service mission.,Domain 09 Support Facility,46.76972,-100.91535,WGS84,5181355.713,353761.6032,14N,Morton,ND,USA,589,517,592,5.9,457,NNE,0.4,Grassland/Herbaceous,Elaeagnus angustifolia (Russian olive)|Poa pratensis (Kentucky bluegrass)|Symphoricarpos occidentalis (Western snowberry),,,,,,8,NDQol;0,"Fine, loamy, mixed, superactive, frigid. Typic Argiustolls.",Typic Argiustolls,175,115,170,200,290,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D09.NOGP.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D09.NOGP.DP1.00042),4,https://www.neonscience.org/field-sites/nogp -D11,OAES,Marvin Klemme Range Research Station NEON,1,0,1,0,1,NEON.D11.OAES.DP1.00033,GR_1000,grassland,Gradient Terrestrial,,,Oklahoma State University,http://oaes.okstate.edu/,Limited,Reseachers should coordinate with the site manager.,Domain 11 Support Facility,35.410599,-99.058779,WGS84,3918579.067,494662.2504,14N,Washita,OK,USA,519,487,531,15.5,779,SE,1,Grassland/Herbaceous|Shrub/Scrub,Bouteloua dactyloides (buffalo grass)|Bouteloua gracilis (blue grama)|Bouteloua curtipendula (sideoats grama),,,,,,8,OKPdy;0,,Lithic Haplustepts,240,70|233,135|270,165|290,225|310,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D11.OAES.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D11.OAES.DP1.00042),4,https://www.neonscience.org/field-sites/oaes -D18,OKSR,Oksrukuyik Creek NEON,0,1,0,0,0,,,,Core Aquatic,Wadeable Stream,TOOL,Bureau of Land Management,https://www.blm.gov/office/fairbanks-district-office,Yes,Reseachers should coordinate with the site manager.,Domain 18/19 Support Facility,68.669753,-149.14302,WGS84,413022.17,7619054.186,6N,North Slope,AK,USA,766,,,-9,316,,,Shrub/Scrub,,[h19060402](https://water.usgs.gov/lookup/getwatershed?19060402),Sagavanirktok River,57.8,,,,A003.PS002_400,,,,,,,,,,https://www.neonscience.org/field-sites/oksr -D15,ONAQ,Onaqui NEON,1,0,1,0,1,NEON.D15.ONAQ.DP1.00033,SH_1000,shrubland,Core Terrestrial,,,Bureau of Land Management,https://www.blm.gov/office/salt-lake-field-office,Limited,Reseachers should coordinate with the site manager and submit a site research permit.,Domain 15 Support Facility,40.177599,-112.45245,WGS84,4448479.606,376339.6859,12N,Tooele,UT,USA,1662,1599,2061,9,288,SW,1.2,Evergreen Forest|Shrub/Scrub,Artemisia tridentata (big sagebrush)|Ceratocephala testiculata (curveseed butterwort)|Bromus tectorum (cheatgrass),,,,,,8,UTQa;0,"Fine, loamy, mixed, superactive, mesic. Xeric Haplocalcids.",Xeric Haplocalcids,205,75,130,170,280,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D15.ONAQ.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D15.ONAQ.DP1.00042),4,https://www.neonscience.org/field-sites/onaq -D07,ORNL,Oak Ridge NEON,1,0,1,1,1,NEON.D07.ORNL.DP1.00033,DB_1000,deciduous broadleaf,Core Terrestrial,,WALK,Department of Energy,https://www.ornl.gov/division/esd,Very Limited,There is currently no system in place to authorize access for additional research activities to this federally secure area. Coordinate directly with site manager.,Domain 07 Support Facility,35.964128,-84.282588,WGS84,3983383.087,745052.4354,16N,Anderson,TN,USA,344,230,356,14.4,1340,WNW,28,Deciduous Forest|Evergreen Forest|Pasture/Hay,Acer rubrum (red maple)|Nyssa sylvatica (sour gum)|Quercus monta (chestnut oak),,,,,,39,TNOnc;10|TNCAcr;10,"Fine, kaolinitic, thermic. Typic Paleudults.",Typic Paleudults,225,90,140,210,315,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D07.ORNL.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D07.ORNL.DP1.00042),6,https://www.neonscience.org/field-sites/ornl -D03,OSBS,Ordway-Swisher Biological Station NEON,1,0,1,1,1,NEON.D03.OSBS.DP1.00033,EN_1001,evergreen needleleaf,Core Terrestrial,,BARC|SUGG,University of Florida Foundation,https://ordway-swisher.ufl.edu/ResearchUse.aspx,Yes,This area is a very active research community and will required a site research permit.,Domain 03 Support Facility,29.689282,-81.993431,WGS84,3284767.489,403886.418,17N,Putnam,FL,USA,46,22,49,20.9,1302,NE,23,Emergent Herbaceous Wetlands|Evergreen Forest|Woody Wetlands,Quercus laevis (turkey oak)|Pinus palustris (longleaf pine)|Aristida beyrichia (Beyrich threeawn),,,,,,35,FLPOc;0,,Typic Quartzipsam-ments,245,70,150,190,315,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D03.OSBS.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D03.OSBS.DP1.00042),6,https://www.neonscience.org/field-sites/osbs -D02,POSE,Posey Creek NEON,0,1,0,0,0,,,,Core Aquatic,Wadeable Stream,SCBI,Smithsonian Institution,,,,Domain 02 Support Facility,38.89431,-78.147258,WGS84,4308808.691,747457.7533,17N,Warren,VA,USA,276,,,11.8,1090,,,Deciduous Forest,,[h02070005](https://water.usgs.gov/lookup/getwatershed?02070005),South Fork Shenandoah,2,,,,VACAZc;0,,,,,,,,[Land-water interface](https://phenocam.sr.unh.edu/webcam/sites/NEON.D02.POSE.DP1.20002),,https://www.neonscience.org/field-sites/pose -D11,PRIN,Pringle Creek NEON,0,1,0,0,0,,,,Core Aquatic,Wadeable Stream,CLBJ,US Forest Service,https://www.fs.usda.gov/detail/texas/about-forest/districts/?cid=fswdev3_008440,Very Limited,Researchers should coordinate directly with the US Forest Service for permitting and approval. Site host is very limited to external research requests.,Domain 11 Support Facility,33.378517,-97.782312,WGS84,3693920.968,613271.5081,14N,Wise,TX,USA,253,,,17.5,898,,,Deciduous Forest|Grassland/Herbaceous,,[h12030101](https://water.usgs.gov/lookup/getwatershed?12030101),Upper West Fork Trinity,48.9,,,,TXKa;0,,,,,,,,[Land-water interface](https://phenocam.sr.unh.edu/webcam/sites/NEON.D11.PRIN.DP1.20002),,https://www.neonscience.org/field-sites/prin -D09,PRLA,Prairie Lake NEON,0,1,0,0,0,,,,Gradient Aquatic,Lake,DCFS,North Dakota Land Trust,https://www.land.nd.gov/,Yes,Reseachers should coordinate with the site manager.,Domain 09 Support Facility,47.15909,-99.11388,WGS84,5222849.742,491367.9402,14N,Stutsman,ND,USA,565,,,4.9,490,,,Grassland/Herbaceous,,[h10160002](https://water.usgs.gov/lookup/getwatershed?10160002),Pipestem,3.4,2.1,4.9,,NDQct;0,,,,,,,,[Land-water interface](https://phenocam.sr.unh.edu/webcam/sites/NEON.D09.PRLA.DP1.20002),,https://www.neonscience.org/field-sites/prla -D09,PRPO,Prairie Pothole NEON,0,1,0,0,0,,,,Core Aquatic,Lake,WOOD,US Fish and Wildlife Service,https://www.fws.gov/refuge/chase_lake/,Yes,This site host welcomes and encourages additional research activities related to the US Fish And Wildlife mission.,Domain 09 Support Facility,47.129839,-99.253147,WGS84,5219640.042,480997.9682,14N,Stutsman,ND,USA,579,,,4.9,494,,,Grassland/Herbaceous,,[h07050002](https://water.usgs.gov/lookup/getwatershed?07050002),Pipestem,2.1,1.7,4.1,,NDQccr;0,,,,,,,,[Land-water interface](https://phenocam.sr.unh.edu/webcam/sites/NEON.D09.PRPO.DP1.20002),,https://www.neonscience.org/field-sites/prpo -D20,PUUM,Pu'u Maka'ala Natural Area Reserve NEON,1,0,1,0,1,NEON.D20.PUUM.DP1.00033,EB_1000,evergreen broadleaf,Core Terrestrial,,,Hawaii Forest Department of Land and Natural Resources,https://dlnr.hawaii.gov/ecosystems/nars/permits/,Yes,Researchers should coordinate with site manager and apply for a site research permit (3-6 months).,Domain 20 Support Facility,19.55309,-155.31731,WGS84,2163673.63,256868.7191,5N,Hawaii,HI,USA,1685,1034,1877,12.7,2657,,20,Evergreen Forest,Metrosideros polymorpha (ʻŌhiʻa)|Cibotium glaucum (hapu‘u)|Styphelia tameiameiae (pūkiawe),,,,,,32,Qk4|Qk2,,Typic Hapludands,365,,,,,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D20.PUUM.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D20.PUUM.DP1.00042),6,https://www.neonscience.org/field-sites/puum -D15,REDB,Red Butte Creek NEON,0,1,0,0,0,,,,Core Aquatic,Wadeable Stream,,"US Forest Service, University of Utah",https://www.fs.usda.gov/detail/uwcnf/about-forest/districts/?cid=fsem_035528|,Limited,Researchers should coordinate directly with the US Forest Service for permitting and approval.,Domain 15 Support Facility,40.783934,-111.79789,WGS84,4515056.814,432697.1044,12N,Salt Lake,UT,USA,1694,,,7.7,751,,,Deciduous Forest,,[h16020204](https://water.usgs.gov/lookup/getwatershed?16020204),Jordan,16.703218,,,,UTTR2;3,,,,,,,,[Land-water interface](https://phenocam.sr.unh.edu/webcam/sites/NEON.D15.REDB.DP1.20002),,https://www.neonscience.org/field-sites/redb -D10,RMNP,Rocky Mountains NEON,1,0,1,0,1,NEON.D10.RMNP.DP1.00033,EN_1000,evergreen needleleaf,Gradient Terrestrial,,,Roosevelt National Forest,https://www.fs.usda.gov/arp,Yes,Researchers should coordinate directly with the US Forest Service for permitting and approval.,Domain 10/13 Support Facility,40.275903,-105.54596,WGS84,4458524.203,453588.4118,13N,Larimer,CO,USA,2742,2454,3042,2.9,731,,19,Evergreen Forest,Pinus contorta (Lodgepole pine)|Abies lasiocarpa (Subalpine fir)|Pseudotsuga menziesii (Douglas-fir),,,,,,25,COYg;0,"Loamy, skeletal, mixed, superactive. Ustic Haplocryolls.",Ustic Haplocryolls,165,120,180,210,285,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D10.RMNP.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D10.RMNP.DP1.00042),5,https://www.neonscience.org/field-sites/rmnp -D02,SCBI,Smithsonian Conservation Biology Institute NEON,1,0,1,1,1,NEON.D02.SCBI.DP1.00033,DB_1000,deciduous broadleaf,Core Terrestrial,,POSE,Smithsonian Institution,https://www.si.edu/unit/conservation-biology-institute,Yes,Significant portions of the site are off-limits or have restricted access due to captive animal activities. Annual hunting activities may render this area completely inaccessible for short periods of time (1 or 2 days) over the course of the season. Most research activities require approval from a land-use committee; and stays longer than a month may require the researcher to apply for contractor credentials and submit to a background check.,Domain 02 Support Facility,38.892925,-78.139494,WGS84,4308784.078,748090.6473,17N,Warren,VA,USA,352,251,571,11.6,1126,SSE,35,Deciduous Forest|Evergreen Forest|Pasture/Hay,Liriodendron tulipifera (tulip tree)|Microstegium vimineum (Japanese stiltgrass)|Fraxinus americana (white ash),,,,,,52,VACAZc;0,"Loamy, skeletal, mixed, active, mesic. Ultic Hapludalfs.",Ultic Hapludalfs,245,85,150,220,320,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D02.SCBI.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D02.SCBI.DP1.00042),6,https://www.neonscience.org/field-sites/scbi -D02,SERC,Smithsonian Environmental Research Center NEON,1,0,1,1,1,NEON.D02.SERC.DP1.00033,DB_1000,deciduous broadleaf,Gradient Terrestrial,,,Smithsonian Institution,https://serc.si.edu/,Yes,"Some areas of the site have pre-existing experiments and a high density of markers, equipment, sensors etc. Care should be taken to coordinate and avoid impacting on-going work at the site. All researchers must be accompanied while on-site by at least one individual with an approved Visiting Scientist Agreement. Annual hunting activities may render this area completely inaccessible for short periods of time (1 or 2 days) over the course of the season.",Domain 02 Support Facility,38.890131,-76.560014,WGS84,4305735.3,364703.6624,18N,Anne Arundel,MD,USA,33,0,43,13.6,1075,NNW,38,Cultivated Crops|Deciduous Forest,Liriodendron tulipifera (tulip poplar)|Fagus grandifolia (American Beech)|Liquidambar styraciflua (American sweetgum),,,,,,62,MDTn;5,"Fine, loamy, mixed, active, mesic. Aquic Hapludults.",Aquic Hapludults,245,80,155,220,325,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D02.SERC.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D02.SERC.DP1.00042),6,https://www.neonscience.org/field-sites/serc -D17,SJER,San Joaquin Experimental Range NEON,1,0,1,0,1,NEON.D17.SJER.DP1.00033,EN_2000,evergreen needleleaf,Core Terrestrial,,,US Forest Service,https://www.fs.fed.us/psw/ef/san_joaquin/,Yes,Researchers should coordinate directly with the US Forest Service for permitting and approval.,Domain 17 Support Facility,37.10878,-119.73228,WGS84,4110433.937,257213.9752,11N,Madera,CA,USA,400,252,502,16.4,540,NW,21,Evergreen Forest|Grassland/Herbaceous|Shrub/Scrub,Quercus douglasii (blue oak)|Erodium botrys (broadleaf filaree)|Bromus diandrus (great brome),,,,,,39,CAgrMZ3;0,,Psammentic Haploxerolls,250,270,65,95,155,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D17.SJER.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D17.SJER.DP1.00042),6,https://www.neonscience.org/field-sites/sjer -D17,SOAP,Soaproot Saddle NEON,1,0,1,0,1,NEON.D17.SOAP.DP1.00033,EN_1001,evergreen needleleaf,Gradient Terrestrial,,,US Forest Service,https://www.fs.usda.gov/sierra/,Yes,Researchers should coordinate directly with the US Forest Service for permitting and approval.,Domain 17 Support Facility,37.03337,-119.26219,WGS84,4100967.253,298792.741,11N,Fresno,CA,USA,1210,1044,1373,13.4,900,NW,32,Evergreen Forest|Shrub/Scrub,Arctostaphylos viscida ssp. Mariposa (mariposa manzanita)|Chamaebatia foliolosa (mountain misery)|Quercus chrysolepis (canyon live oak),,,,,,52,CAgrMZ3;0,"Fine, loamy, mixed, semiactive, mesic. Ultic Haploxeralfs.",Ultic Haploxeralfs,200,90,155,185,290,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D17.SOAP.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D17.SOAP.DP1.00042),6,https://www.neonscience.org/field-sites/soap -D14,SRER,Santa Rita Experimental Range NEON,1,0,1,0,1,NEON.D14.SRER.DP1.00033,SH_1000,shrubland,Core Terrestrial,,,University of Arizona,https://taac.arizona.edu/sites/taac.arizona.edu/files/SRER%20Range%20Use%20Agreement%202014%20revised%5B1%5D.pdf,Yes,"SRER encourages research activities that do not conflict with on-going research. Researchers should apply directly for a site research permit. All proposed actions will be reviewed for potential impacts to cultural resources, endangered species and other research activities.",Domain 14 Support Facility,31.91068,-110.83549,WGS84,3530547.118,515553.9031,12N,Pima,AZ,USA,997,897,1461,19.3,346,ESE,2,Shrub/Scrub,Larrea tridentata (creosote bush)|Prosopis veluti (velvet mesquite)|Parkinsonia florida (blue palo verde),,,,,,8,AZQ;0,,Typic Torrifluvents,247,87|186,139|215,189|259,219|334,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D14.SRER.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D14.SRER.DP1.00042),4,https://www.neonscience.org/field-sites/srer -D05,STEI,Steigerwaldt-Chequamegon NEON,1,0,1,0,1,NEON.D05.STEI.DP1.00033,DB_1000,deciduous broadleaf,Gradient Terrestrial,,,Private|Chequamegon Nicolet National Forest,|https://www.fs.usda.gov/cnnf/,Very Limited / Yes,Very limited available via private land owner. / NEON sampling area of this field site is located in Chequamegon Nicolet National Forest. Additional research may take place in this area with site host permission.,Domain 05 Support Facility,45.50894,-89.58637,WGS84,5042743.852,297968.6864,16N,Lincoln,WI,USA,476,466,536,4.8,797,WSW,20m (in surounding non-logged area) ,Deciduous Forest|Mixed Forest|Woody Wetlands,Populus tremuloides (quaking aspen)|Abies balsamea (balsam fir)|Acer rubrum (red maple),,,,,,22,WIXmi;0|WIXmv;0,"Coarse, loamy, mixed, superactive, frigid. Alfic Epiaquods.",Alfic Epiaquods,170,120,165,215,290,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D05.STEI.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D05.STEI.DP1.00042),6,https://www.neonscience.org/field-sites/stei -D10,STER,North Sterling NEON,1,0,1,0,1,NEON.D10.STER.DP1.00033,AG_1000,agriculture,Gradient Terrestrial,,,Private,,Very Limited,Very limited available via private land owner.,Domain 10/13 Support Facility,40.461894,-103.02929,WGS84,4480891.098,667084.9559,13N,Logan,CO,USA,1365,1352,1371,9.7,433,NW,varies based on crops planted,Cultivated Crops,"Agriculture field, crops vary year to year",,,,,,8,COTo;0,"Fine, silty, mixed, superactive, mesic. Pachic Argiustolls.",Pachic Argiustolls,180,90,150,190,270,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D10.STER.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D10.STER.DP1.00042),4,https://www.neonscience.org/field-sites/ster -D03,SUGG,Lake Suggs NEON,0,1,0,0,0,,,,Core Aquatic,Lake,OSBS,University of Florida Foundation,https://ordway-swisher.ufl.edu/ResearchUse.aspx,Yes,This area is a very active research community and will required a site research permit.,Domain 03 Support Facility,29.68778,-82.017745,WGS84,3284541.044,401683.9696,17N,Putnam,FL,USA,32,,,20.9,1308,,,Evergreen Forest|Woody Wetlands,,,,39.6,2.1,3.2,,FLPOc;0,,,,,,,,[Land-water interface](https://phenocam.sr.unh.edu/webcam/sites/NEON.D03.SUGG.DP1.20002),,https://www.neonscience.org/field-sites/sugg -D14,SYCA,Sycamore Creek NEON,0,1,0,0,0,,,,Core Aquatic,Wadeable Stream,,US Forest Service,https://www.fs.usda.gov/tonto/,Limited,Researchers should coordinate directly with the US Forest Service for permitting and approval.,Domain 14 Support Facility,33.750993,-111.50809,WGS84,3734447.851,453051.1385,12N,Maricopa,AZ,USA,645,,,20.7,409,,,Shrub/Scrub,,[h15060203](https://water.usgs.gov/lookup/getwatershed?15060203),Lower Verde,280.3,,,,AZTb;0,,,,,,,,[Land-water interface](https://phenocam.sr.unh.edu/webcam/sites/NEON.D14.SYCA.DP1.20002),,https://www.neonscience.org/field-sites/syca -D08,TALL,Talladega National Forest NEON,1,0,1,1,1,NEON.D08.TALL.DP1.00033,EN_1000,evergreen needleleaf,Core Terrestrial,,MAYF,Talladega National Forest,https://www.fs.usda.gov/detail/alabama/about-forest/districts/?cid=fsbdev3_002555,Yes,Researchers should coordinate directly with the US Forest Service for permitting and approval.,Domain 08 Support Facility,32.95047,-87.393259,WGS84,3645863.573,463241.7192,16N,Bibb,AL,USA,166,63,179,17.2,1383,N,25,Deciduous Forest|Evergreen Forest|Mixed Forest,Quercus montana (Chestnut oak)|Liriodendron tulipifera (tulip tree)|Cornus florida (flowering dogwood),,,,,,35,ALKg;1|ALKck;1,"Fine, loamy, siliceous, subactive, thermic. Typic Hapludults.",Typic Hapludults,255,75,135,195,330,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D08.TALL.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D08.TALL.DP1.00042),5,https://www.neonscience.org/field-sites/tall -D17,TEAK,Lower Teakettle NEON,1,0,1,0,1,NEON.D17.TEAK.DP1.00033,EN_1000,evergreen needleleaf,Gradient Terrestrial,,,US Forest Service,https://www.fs.usda.gov/sierra/,Yes,Researchers should coordinate directly with the US Forest Service for permitting and approval.,Domain 17 Support Facility,37.00583,-119.00602,WGS84,4097400.183,321515.7352,11N,Fresno,CA,USA,2149,2086,2734,8,1223,NW,35,Evergreen Forest|Shrub/Scrub,Abies magnifica (red fir)|Abies concolor (white fir)|Pinus contorta (lodgepole pine),,,,,,59,CAQg;0,,Pachic Humixerepts,180,120,180,205,300,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D17.TEAK.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D17.TEAK.DP1.00042),7,https://www.neonscience.org/field-sites/teak -D17,TECR,Teakettle Creek - Watershed 2 NEON,0,1,0,0,0,,,,Core Aquatic,Wadeable Stream,,US Forest Service,https://www.fs.usda.gov/sierra/,Yes,Researchers should coordinate directly with the US Forest Service for permitting and approval.,Domain 17 Support Facility,36.955931,-119.02736,WGS84,319530.6268,4091831.328,11N,Fresno,CA,USA,2011,,,8.7,1175,,,Evergreen Forest,,[h18030010](https://water.usgs.gov/lookup/getwatershed?18030010),Upper King,3,,,,CAgrMZ3;0,,,,,,,,[Land-water interface](https://phenocam.sr.unh.edu/webcam/sites/NEON.D17.TECR.DP1.20002),,https://www.neonscience.org/field-sites/tecr -D08,TOMB,Lower Tombigbee River NEON,0,1,0,0,0,,,,Gradient Aquatic,Non-wadeable River,LENO,US Army Corps of Engineers|Private,https://www.fws.gov/refuge/choctaw/|NA,Limited / Very Limited,"This area is primarily intended to provide recreational opportunities and is also classified as a hunting area. As such, access is very limited but potentially possible. / Very limited available via private land owner.",Domain 08 Support Facility,31.853431,-88.158872,WGS84,3524629.254,390152.1672,16N,Choctaw,AL,USA,20,,,18.1,1386,,,Mixed Forest,,[h03160201](https://water.usgs.gov/lookup/getwatershed?03160201),Middle Tombigbee-Chickasaw,47085.3,,,,ALHalt;0|ALwater;0,,,,,,,,[Land-water interface](https://phenocam.sr.unh.edu/webcam/sites/NEON.D08.TOMB.DP1.20002),,https://www.neonscience.org/field-sites/tomb -D18,TOOK,Toolik Lake NEON,0,1,0,0,0,,,,Gradient Aquatic,Lake,TOOL,Bureau of Land Management,https://toolik.alaska.edu/user_guide/permits.php,Yes,Reseachers should coordinate with the site manager and submit a site research permit via Toolik Field Station.,Domain 18/19 Support Facility,68.630692,-149.61064,WGS84,7615309.612,393866.9558,6N,North Slope,AK,USA,715,,,-9,316,,,Dwarf Scrub,,[h19060401](https://water.usgs.gov/lookup/getwatershed?19060401),Kuparuk River,67.6,8.5,27,,A002.PS001_102,,,,,,,,[Land-water interface](https://phenocam.sr.unh.edu/webcam/sites/NEON.D18.TOOK.DP1.20002),,https://www.neonscience.org/field-sites/took -D18,TOOL,Toolik Field Station NEON,1,0,1,0,1,NEON.D18.TOOL.DP1.00033,TN_1000,tundra,Core Terrestrial,,TOOK|OKSR,Bureau of Land Management,https://toolik.alaska.edu/user_guide/permits.php,Yes,Reseachers should coordinate with the site manager and submit a site research permit via Toolik Field Station.,Domain 18/19 Support Facility,68.66109,-149.37047,WGS84,7618427.659,403757.147,6N,North Slope,AK,USA,832,704,980,-9,316,S,0.3,Dwarf Scrub|Shrub/Scrub,Eriophorum vaginatum (tussock cottongrass)|Carex sp. (true sedges)|Vaccinium vitis-idaea (lingonberry),,,,,,9,A003.PS002_400,,Typic Histoturbels,80,160,185,205,240,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D18.TOOL.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D18.TOOL.DP1.00042),4,https://www.neonscience.org/field-sites/tool -D05,TREE,Treehaven NEON,1,0,1,0,1,NEON.D05.TREE.DP1.00033,DB_1000,deciduous broadleaf,Gradient Terrestrial,,,University of Wisconsin-Stevens Point,https://www.uwsp.edu/cnr-ap/treehaven/Pages/Research-Form.aspx,Yes,Treehaven encourages research projects. Research activities may be limited based on other uses of this property and on-going projects.,Domain 05 Support Facility,45.49369,-89.58571,WGS84,5041047.894,297965.3164,16N,Lincoln,WI,USA,467,447,482,4.8,797,WSW,23,Deciduous Forest|Evergreen Forest|Mixed Forest|Woody Wetlands,Acer saccharum (sugar maple)|Acer rubrum (red maple)|Alnus incana (gray alder),,,,,,36,WIXmv;0,"Coarse, loamy, mixed, superactive, frigid. Alfic Haplorthods.",Alfic Haplorthods,170,120,165,215,290,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D05.TREE.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D05.TREE.DP1.00042),6,https://www.neonscience.org/field-sites/tree -D06,UKFS,University of Kansas Field Station NEON,1,0,1,1,1,NEON.D06.UKFS.DP1.00033,DB_1000,deciduous broadleaf,Gradient Terrestrial,,,University of Kansas,https://biosurvey.ku.edu/research,Yes,This site host welcomes and encourages research use that fits their mission and is compatible with their abilities as a host. Please plan on at more than two weeks advance notice to request and plan site access.,Domain 06 Support Facility,39.040431,-95.19215,WGS84,4323549.848,310276.2976,15N,Jefferson,KS,USA,322,272,332,12.7,990,SE,19,Deciduous Forest|Pasture/Hay,Fraxinus americana (white ash)|Symphoricarpos orbiculatus (coralberry)|Celtis occidentalis (common hackberry),,,,,,35,KSQgd;0,"Fine, smectitic, mesic. Pachic Argiudolls.",Pachic Argiudolls,255,75,160,210,330,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D06.UKFS.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D06.UKFS.DP1.00042),6,https://www.neonscience.org/field-sites/ukfs -D05,UNDE,University of Notre Dame Environmental Research Center NEON,1,0,1,0,1,NEON.D05.UNDE.DP1.00033,DB_1000,deciduous broadleaf,Core Terrestrial,,,University of Notre Dame,https://underc.nd.edu/underc-west/research-opportunities/,Yes,"UNDERC encourages research; subject to evaluation based on potential for scientific advancement, impact on the site, and consistency and compatibility with other designated, non-research, uses of the property.",Domain 05 Support Facility,46.23391,-89.537254,WGS84,5123162.886,304366.9502,16N,Gogebic,MI,USA,521,501,538,4.3,802,SSW,24,Deciduous Forest|Mixed Forest|Woody Wetlands,Acer saccharum (sugar maple)|Abies balsamea (balsam fir)|Acer rubrum (red maple),,,,,,39,MIAgn;0,"Coarse, loamy, mixed, superactive, frigid. Argic Fragiaquods.",Argic Fragiaquods,165,120,170,215,285,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D05.UNDE.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D05.UNDE.DP1.00042),6,https://www.neonscience.org/field-sites/unde -D07,WALK,Walker Branch NEON,0,1,0,0,0,,,,Core Aquatic,Wadeable Stream,ORNL,Department of Energy,https://www.ornl.gov/division/esd,Very Limited,There is currently no system in place to authorize access for additional research activities to this federally secure area. Coordinate directly with site manager.,Domain 07 Support Facility,35.957378,-84.279251,WGS84,3982872.555,745264.058,16N,Anderson,TN,USA,264,,,14.4,1340,,,Deciduous Forest,,[h06010207](https://water.usgs.gov/lookup/getwatershed?06010207),Lower Clinch,1.1,,,,TNOnc;10,,,,,,,,[Land-water interface](https://phenocam.sr.unh.edu/webcam/sites/NEON.D07.WALK.DP1.20002),,https://www.neonscience.org/field-sites/walk -D13,WLOU,West St Louis Creek NEON,0,1,0,0,0,,,,Gradient Aquatic,Wadeable Stream,,US Forest Service,https://www.fs.usda.gov/wps/portal/fsinternet/cs/main/!ut/p/z0/04_Sj9CPykssy0xPLMnMz0vMAfIjo8zijQwgwNHCwN_DI8zPwBcqYKBfkO2oCADIwpjI/?pname=Arapaho%2F&ss=110210&pnavid=null&navid=091000000000000&ttype=main&cid=null,Yes,Researchers should coordinate directly with the US Forest Service for permitting and approval.,Domain 10/13 Support Facility,39.891366,-105.9154,WGS84,4416100.982,421737.8532,13N,Grand,CO,USA,2908,,,1.5,655,,,Evergreen Forest,,[h14010001](https://water.usgs.gov/lookup/getwatershed?14010001),Colorado headwaters,4.9,,,,COXb;0,,,,,,,,[Land-water interface](https://phenocam.sr.unh.edu/webcam/sites/NEON.D13.WLOU.DP1.20002),,https://www.neonscience.org/field-sites/wlou -D09,WOOD,Chase Lake National Wildlife Refuge NEON,1,0,1,0,1,NEON.D09.WOOD.DP1.00033,GR_1000,grassland,Core Terrestrial,,PRPO,US Fish and Wildlife Service,https://www.fws.gov/refuge/chase_lake/,Yes,This site host welcomes and encourages additional research activities related to the US Fish And Wildlife mission.,Domain 09 Support Facility,47.1282,-99.241334,WGS84,5219442.039,481694.7212,14N,Stutsman,ND,USA,591,569,606,4.9,494,NW,1,Emergent Herbaceous Wetlands|Grassland/Herbaceous,Poa pratensis (Kentucky bluegrass)|Elymus repens (couch grass)|Bromus inermis (smooth brome),,,,,,8,NDQcrh;0,"Coarse, loamy, over-sandy or sandy, skeletal, mixed, superactive, frigid. Typic Haplustolls.",Typic Haplustolls,170,120,180,210,290,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D09.WOOD.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D09.WOOD.DP1.00042),4,https://www.neonscience.org/field-sites/wood -D16,WREF,Wind River Experimental Forest NEON,1,0,1,0,1,NEON.D16.WREF.DP1.00033,EN_1000,evergreen needleleaf,Core Terrestrial,,,"Pacific Northwest Research Station, US Forest Service",https://www.fs.usda.gov/pnw/,Yes,Reseachers should coordinate with the site manager and submit a site research permit. Various on-going research projects to be aware of at site.,Domain 16 Support Facility,45.82049,-121.95191,WGS84,5074636.87,581417.8024,10N,Skamania,WA,USA,351,300,1008,9.2,2225,NW,50,Evergreen Forest,Gaultheria shallon (salal)|Psuedotsuga menziesii (douglas fir)|Tsuga heterophylla (western hemlock),,,,,,74,WAQv;0,"Medial, amorphic, mesic. Typic Hapludands.",Typic Hapludands,175,115,165,210,290,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D16.WREF.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D16.WREF.DP1.00042),8,https://www.neonscience.org/field-sites/wref -D12,YELL,Yellowstone National Park NEON,1,0,1,0,1,NEON.D12.YELL.DP1.00033,EN_1000,evergreen needleleaf,Core Terrestrial,,BLDE|YELL,National Park Service,https://irma.nps.gov/rprs/,Limited,The National Park Service is open to additional research activities taking place in this area. Apply via IRMA Permitting portal. NEON research area is limited to additional research due to sensitivity.,Domain 12 Support Facility,44.95348,-110.53914,WGS84,4977885.935,536352.1992,12N,Park,WY,USA,2133,1847,2244,3.4,493,SSE,14,Evergreen Forest|Grassland/Herbaceous|Shrub/Scrub,Artemisia tridentata (big sagebrush)|Pseudotsuga menziesii (douglas fir)|Pinus contorta (lodgepole pine),,,,,,18,WYQb;0|WYTs;0,,Pachic Argiustolls,144,125,169,193,269,[Tower top](https://phenocam.sr.unh.edu/webcam/sites/NEON.D12.YELL.DP1.00033)|[Tower bottom](https://phenocam.sr.unh.edu/webcam/sites/NEON.D12.YELL.DP1.00042),5,https://www.neonscience.org/field-sites/yell From a07f01358a3f0a0abb22b6945e67bf749d18048a Mon Sep 17 00:00:00 2001 From: Zwart Date: Mon, 18 Dec 2023 17:00:53 -0800 Subject: [PATCH 14/26] adding fetch functions --- targets/_targets.R | 6 -- targets/fetch_sites.R | 7 ++ targets/src/download_nwis_data.R | 142 +++++++++++++++++++++++++++++++ 3 files changed, 149 insertions(+), 6 deletions(-) create mode 100644 targets/fetch_sites.R create mode 100644 targets/src/download_nwis_data.R diff --git a/targets/_targets.R b/targets/_targets.R index 3ffdd57241..ad84283e18 100644 --- a/targets/_targets.R +++ b/targets/_targets.R @@ -12,7 +12,6 @@ source("src/download_nwis_data.R") # End this file with a list of target objects. list( - # storing predictions from run-pgdl-da into ncdf files tar_target( site_list_file, "in/FY23_ecological_forecast_challenge_USGS_sites.csv", @@ -41,11 +40,6 @@ list( } ), - # tar_target( - # historic_data, - # download() - # ), - tar_target( start_date, # Sys.Date() - 2 diff --git a/targets/fetch_sites.R b/targets/fetch_sites.R new file mode 100644 index 0000000000..2dd22cdfa2 --- /dev/null +++ b/targets/fetch_sites.R @@ -0,0 +1,7 @@ + +# wrapper file for running forecast pipeline; called from gitlab CI + +library(targets) +tar_make() +tar_meta(fields = error, complete_only = TRUE) + diff --git a/targets/src/download_nwis_data.R b/targets/src/download_nwis_data.R new file mode 100644 index 0000000000..848e0d6c52 --- /dev/null +++ b/targets/src/download_nwis_data.R @@ -0,0 +1,142 @@ + + +do_fetch_by_site <- function(file_out, site, pcodes, service, start_date, end_date) { + message(file_out) + fetch_by_pcode_service_by_site( + site, pcodes, service, + start_date, end_date) %>% + write_csv(file = file_out) + return(file_out) +} + +do_alt_fetch_by_site <- function(file_out, site, alt_site, pcodes, service, start_date, end_date) { + message(file_out) + returned_data <- fetch_by_pcode_service_by_site( + alt_site, pcodes, service, + start_date, end_date) %>% + { + # Only attempt to add the alternative site no if there was data + if(nrow(.) > 0) + # The site number that was downloaded is actually our alternative site, + # so add a column to retain that info, but substitute the site we are + # actually using for metabolism modeling into `site_no` + mutate(., alt_site_no = site_no) %>% + mutate(site_no = site) + else . + } %>% + write_csv(file = file_out) + return(file_out) +} + +fetch_by_pcode_service_by_site <- function(site, pcodes, service, start_date, end_date) { + + raw_data <- fetch_nwis_fault_tolerantly_bysite(site, pcodes, service, start_date, end_date) + + # Remove attributes, which typically have a timestamp associated + # with them this can cause strange rebuilds of downstream data, + # even if the data itself is the same. + attr(raw_data, "comment") <- NULL + attr(raw_data, "queryTime") <- NULL + attr(raw_data, "headerInfo") <- NULL + + return(raw_data) +} + +fetch_nwis_fault_tolerantly_bysite <- function(site, pcodes, service, start_date, end_date, max_tries = 10) { + data_returned <- tryCatch( + retry(readNWISdata(siteNumber = site, + parameterCd = pcodes, + startDate = start_date, + endDate = end_date, + service = service), + until = function(val, cnd) "data.frame" %in% class(val), + max_tries = max_tries), + error = function(e) return() + ) + + # Noticed that some UV calls return a data.frame with a tz_cd column + # and nothing else. These should be considered empty. + # For example: + # readNWISdata(siteNumber = "05579630", parameterCd = "00060", startDate = "2020-12-01", + # endDate = "2020-12-31", service = "uv") + if(nrow(data_returned) == 0 & "tz_cd" %in% names(data_returned)) { + return(data.frame()) + } else { + return(data_returned) + } +} + + + +download_historic_data <- function( + sites, + start_date, + end_date, + pcodes, + service, + statCd = NULL, + min_chl = 0, # minimum chlorohpyll-a to keep + out_file +){ + + daily_data <- dataRetrieval::readNWISdata(siteNumbers = sites, + parameterCd = pcodes, + startDate = start_date, + endDate = end_date, + service = service, + statCd = statCd) %>% + pivot_longer(cols = matches(paste0(statCd, "$")), + names_to = "parameter_name", + values_to = "chl_ug_L") %>% + select(site_no, dateTime, parameter_name, chl_ug_L) %>% + # TODO: add in filter based on prvisional data or not? + filter(!is.na(chl_ug_L), chl_ug_L >= min_chl) %>% + mutate(dateTime = as.Date(dateTime)) %>% + group_by(site_no, dateTime) %>% + summarise(chl_ug_L = mean(chl_ug_L), .groups = "drop") + + write_rds(x = daily_data, file = out_file) + return(out_file) +} + + +download_historic_uv_data <- function( + sites, + start_date, + end_date, + pcodes, + service, + min_chl = 0, # minimum chlorohpyll-a to keep + out_file +){ + + daily_data <- dataRetrieval::readNWISdata(siteNumbers = sites, + parameterCd = pcodes, + startDate = start_date, + endDate = end_date, + service = service) %>% + pivot_longer(cols = matches("00000$"), + names_to = "parameter_name", + values_to = "chl_ug_L") %>% + select(site_no, dateTime, parameter_name, chl_ug_L) %>% + # TODO: add in filter based on prvisional data or not? + filter(!is.na(chl_ug_L), chl_ug_L >= min_chl) %>% + mutate(dateTime = as.Date(dateTime)) %>% + group_by(site_no, dateTime) %>% + summarise(chl_ug_L = mean(chl_ug_L), .groups = "drop") + + write_rds(x = daily_data, file = out_file) + return(out_file) +} + + +aggregate_to_daily <- function( + subdaily_data +){ + daily_data <- subdaily_data %>% + group_by(siteNumbers, date) %>% + summarise(.groups = "drop") + + return(daily_data) +} + From 414cee6e35d759129c17b0d5363b3d393f00c930 Mon Sep 17 00:00:00 2001 From: Zwart Date: Mon, 18 Dec 2023 17:06:13 -0800 Subject: [PATCH 15/26] update targets workflow --- .github/workflows/targets.yaml | 45 +++------------------------------- 1 file changed, 4 insertions(+), 41 deletions(-) diff --git a/.github/workflows/targets.yaml b/.github/workflows/targets.yaml index d5d0b39254..ed9fb4ef10 100644 --- a/.github/workflows/targets.yaml +++ b/.github/workflows/targets.yaml @@ -8,7 +8,7 @@ on: name: target-generation jobs: - phenology: + chl-targets: runs-on: ubuntu-latest env: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} @@ -23,44 +23,7 @@ jobs: - name: Generate targets shell: Rscript {0} run: | - install.packages("RCurl") - source("targets/phenology_targets.R") - - beetles: - runs-on: ubuntu-latest - env: - GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_SUBMISSIONS }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY_SUBMISSIONS }} - OSN_KEY: ${{ secrets.OSN_KEY }} - OSN_SECRET: ${{ secrets.OSN_SECRET }} - NEON_TOKEN: ${{ secrets.NEON_TOKEN }} - container: rocker/geospatial:latest - steps: - - uses: actions/checkout@v3 - - - name: Generate targets - shell: Rscript {0} - run: | - install.packages(c("neonstore","RCurl","duckdbfs","ISOweek")) - source("targets/beetles_targets.R") - - ticks: - runs-on: ubuntu-latest - env: - GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_SUBMISSIONS }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY_SUBMISSIONS }} - OSN_KEY: ${{ secrets.OSN_KEY }} - OSN_SECRET: ${{ secrets.OSN_SECRET }} - NEON_TOKEN: ${{ secrets.NEON_TOKEN }} - container: rocker/geospatial:latest - steps: - - uses: actions/checkout@v3 - - - name: Generate targets - shell: Rscript {0} - run: | - install.packages(c("neonstore","RCurl","duckdbfs","ISOweek")) - source("targets/ticks_targets.R") + install.packages("clustermq", "dataRetrieval", "RCurl", "tarchetypes", "targets") + setwd("targets") + targets::tar_make() From ba394ee8e4c978b9003b0a833ca33e0535fdd68c Mon Sep 17 00:00:00 2001 From: Zwart Date: Tue, 19 Dec 2023 07:59:21 -0800 Subject: [PATCH 16/26] removing baseline models --- baseline_models/run_beetles_baselines.R | 10 --------- baseline_models/run_phenology_baselines.R | 14 ------------ baseline_models/run_terrestrial_baselines.R | 24 --------------------- baseline_models/run_ticks_baselines.R | 13 ----------- 4 files changed, 61 deletions(-) delete mode 100644 baseline_models/run_beetles_baselines.R delete mode 100644 baseline_models/run_phenology_baselines.R delete mode 100644 baseline_models/run_terrestrial_baselines.R delete mode 100644 baseline_models/run_ticks_baselines.R diff --git a/baseline_models/run_beetles_baselines.R b/baseline_models/run_beetles_baselines.R deleted file mode 100644 index 7135cff88a..0000000000 --- a/baseline_models/run_beetles_baselines.R +++ /dev/null @@ -1,10 +0,0 @@ -#renv::restore() - -print(paste0("Running Creating Beetles baselines at ", Sys.time())) - - -print(paste0("Running mean model at ", Sys.time())) -source("baseline_models/models/beetles_mean.R") -print(paste0("Completed mean model ", Sys.time())) - -RCurl::url.exists("https://hc-ping.com/28df2e97-6036-4fa1-9d8a-6aa9fbaa0726") diff --git a/baseline_models/run_phenology_baselines.R b/baseline_models/run_phenology_baselines.R deleted file mode 100644 index 83d6f6ac68..0000000000 --- a/baseline_models/run_phenology_baselines.R +++ /dev/null @@ -1,14 +0,0 @@ -#renv::restore() - -print(paste0("Running Creating phenology Targets at ", Sys.time())) - - -print(paste0("Running daily climatology at ", Sys.time())) -source("baseline_models/models/phenology_climatology.R") -print(paste0("Completed daily climatology ", Sys.time())) - -print(paste0("Running daily persistence at ", Sys.time())) -source("baseline_models/models/phenology_persistenceRW.R") -print(paste0("Completed daily persistenceRW ", Sys.time())) - -RCurl::url.exists("https://hc-ping.com/a5a12c66-6e38-4415-aa40-4eb24881a949") diff --git a/baseline_models/run_terrestrial_baselines.R b/baseline_models/run_terrestrial_baselines.R deleted file mode 100644 index 59422f9cdb..0000000000 --- a/baseline_models/run_terrestrial_baselines.R +++ /dev/null @@ -1,24 +0,0 @@ -#renv::restore() - -print(paste0("Running Creating Terrestrial baselines at ", Sys.time())) - -generate_null_daily <- TRUE -generate_null_30min <- TRUE - -if(generate_null_daily){ - print(paste0("Running daily climatology at ", Sys.time())) - source("baseline_models/models/terrestrial_daily_climatology.R") - print(paste0("Completed daily climatology at ", Sys.time())) - print(paste0("Running daily persistence at ", Sys.time())) - source("baseline_models/models/terrestrial_daily_persistenceRW.R") - print(paste0("Completed daily persistence at ", Sys.time())) - -} - -if(generate_null_30min){ - print(paste0("Running 30 min persistence at ", Sys.time())) - source("baseline_models/models/terrestrial_30min_climatology.R") - print(paste0("Completed 30 min Null at ", Sys.time())) -} - -RCurl::url.exists("https://hc-ping.com/bbe3ddc7-4020-4c53-bb13-08580d765e32") diff --git a/baseline_models/run_ticks_baselines.R b/baseline_models/run_ticks_baselines.R deleted file mode 100644 index a4716a032f..0000000000 --- a/baseline_models/run_ticks_baselines.R +++ /dev/null @@ -1,13 +0,0 @@ -#renv::restore() - -print(paste0("Running Creating ticks baselines at ", Sys.time())) - - -print(paste0("Running climatology at ", Sys.time())) -source("baseline_models/models/ticks_climatology.R") -print(paste0("Completed climatology ", Sys.time())) -print(paste0("Running mean at ", Sys.time())) -source("baseline_models/models/ticks_mean.R") -print(paste0("Completed mean ", Sys.time())) - -RCurl::url.exists("https://hc-ping.com/9fd0a2f4-13b3-4d11-880b-1487a1d801ca") From 86a2c58e5ceabc168503ef9e4ca02f6db7659022 Mon Sep 17 00:00:00 2001 From: Zwart Date: Tue, 19 Dec 2023 08:00:29 -0800 Subject: [PATCH 17/26] rm more models --- baseline_models/models/beetles_mean.R | 92 ----- .../models/phenology_climatology.R | 103 ----- .../models/phenology_persistenceBayes.R | 185 --------- .../models/phenology_persistenceRW.R | 60 --- .../models/terrestrial_30min_climatology.R | 211 ---------- .../models/terrestrial_daily_climatology.R | 144 ------- .../terrestrial_daily_persistenceBayes.R | 363 ------------------ .../models/terrestrial_daily_persistenceRW.R | 59 --- baseline_models/models/ticks_climatology.R | 128 ------ baseline_models/models/ticks_mean.R | 68 ---- 10 files changed, 1413 deletions(-) delete mode 100644 baseline_models/models/beetles_mean.R delete mode 100644 baseline_models/models/phenology_climatology.R delete mode 100644 baseline_models/models/phenology_persistenceBayes.R delete mode 100644 baseline_models/models/phenology_persistenceRW.R delete mode 100644 baseline_models/models/terrestrial_30min_climatology.R delete mode 100644 baseline_models/models/terrestrial_daily_climatology.R delete mode 100644 baseline_models/models/terrestrial_daily_persistenceBayes.R delete mode 100644 baseline_models/models/terrestrial_daily_persistenceRW.R delete mode 100644 baseline_models/models/ticks_climatology.R delete mode 100644 baseline_models/models/ticks_mean.R diff --git a/baseline_models/models/beetles_mean.R b/baseline_models/models/beetles_mean.R deleted file mode 100644 index 09c9f1b1e6..0000000000 --- a/baseline_models/models/beetles_mean.R +++ /dev/null @@ -1,92 +0,0 @@ - -library(fable) -library(distributional) -library(tidyverse) - - -## Get the latest beetle target data. -download.file("https://data.ecoforecast.org/neon4cast-targets/beetles/beetles-targets.csv.gz", - "beetles-targets.csv.gz") -targets <- read_csv("beetles-targets.csv.gz") - -curr_iso_week <- ISOweek::ISOweek(Sys.Date()) - -curr_date <- ISOweek::ISOweek2date(paste0(curr_iso_week, "-1")) - -site_list <- unique(targets$site_id) - -last_day_richness <- tibble(site_id = site_list, - datetime = rep(curr_date, length(site_list)), - variable = "richness", - observation = NA) - -last_day_abundance <- tibble(site_id = site_list, - datetime = rep(curr_date, length(site_list)), - variable = "abundance", - observation = NA) - -targets_richness <- targets |> - filter(variable == "richness") |> - bind_rows(last_day_richness) |> - rename(richness = observation) |> - select(-variable) |> - as_tsibble(index = datetime, key = site_id) - -targets_abundance <- targets |> - filter(variable == "abundance") |> - bind_rows(last_day_abundance) |> - rename(abundance = observation) |> - select(-variable) |> - as_tsibble(index = datetime, key = site_id) - -## a single mean per site... obviously silly -fc_richness <- targets_richness %>% - model(null = MEAN(log(richness + 1))) %>% - generate(times = 500, h = "1 year", bootstrap = TRUE) |> - dplyr::rename(ensemble = .rep, - prediction = .sim) |> - mutate(variable = "richness", - family = "ensemble") - -fc_abundance <- targets_abundance %>% - model(null = MEAN(log(abundance + 1))) %>% - generate(times = 500, h = "1 year", bootstrap = TRUE) |> - dplyr::rename(parameter = .rep, - prediction = .sim) |> - mutate(variable = "abundance", - family = "ensemble") - -fc_richness |> - filter(site_id %in% site_list[1:10], variable == "richness") |> - ggplot(aes(x = datetime, y = prediction, group = ensemble)) + - geom_line() + - facet_wrap(~site_id) - -targets |> - filter(site_id %in% site_list[1:10], variable == "richness") |> - ggplot(aes(x = datetime, y = observation)) + - geom_point() + - facet_wrap(~site_id) - -team_name <- "mean" - -forecast <- bind_rows(as_tibble(fc_richness), as_tibble(fc_abundance)) |> - mutate(reference_datetime = lubridate::as_date(min(datetime)) - lubridate::weeks(1), - model_id = team_name) |> - select(model_id, datetime, reference_datetime, site_id, family, parameter, variable, prediction) - -## Create the metadata record, see metadata.Rmd -theme_name <- "beetles" -file_date <- forecast$reference_datetime[1] - -filename <- paste0(theme_name, "-", file_date, "-", team_name, ".csv.gz") - -## Store the forecast products -readr::write_csv(forecast, filename) - -neon4cast::submit(forecast_file = filename, - ask = FALSE) - -unlink(filename) - - diff --git a/baseline_models/models/phenology_climatology.R b/baseline_models/models/phenology_climatology.R deleted file mode 100644 index 70379be5ee..0000000000 --- a/baseline_models/models/phenology_climatology.R +++ /dev/null @@ -1,103 +0,0 @@ -library(tidyverse) -library(lubridate) - -message(paste0("Running null model ", Sys.time())) - -download_url <- paste0("https://data.ecoforecast.org/neon4cast-targets/", - "phenology", "/", "phenology-targets.csv.gz") - -target <- read_csv(download_url) - -target_clim <- target %>% - mutate(doy = yday(datetime)) %>% - group_by(doy, site_id, variable) %>% - summarise(mean = mean(observation, na.rm = TRUE), - sd = sd(observation, na.rm = TRUE), - .groups = "drop") %>% - mutate(mean = ifelse(is.nan(mean), NA, mean)) - -curr_year <- year(Sys.Date()) -curr_month <- month(Sys.Date()) -if(curr_month < 10){ - curr_month <- paste0("0", curr_month) -} - -curr_year <- year(Sys.Date()) -start_date <- Sys.Date() + days(1) - -forecast_dates <- seq(start_date, as_date(start_date + days(34)), "1 day") -forecast_doy <- yday(forecast_dates) - -forecast_dates_df <- tibble(datetime = forecast_dates, - doy = forecast_doy) - -forecast <- target_clim %>% - mutate(doy = as.integer(doy)) %>% - filter(doy %in% forecast_doy) %>% - full_join(forecast_dates_df, by = 'doy') %>% - arrange(site_id, datetime) - -subseted_site_names <- unique(forecast$site_id) -site_vector <- NULL -for(i in 1:length(subseted_site_names)){ - site_vector <- c(site_vector, rep(subseted_site_names[i], length(forecast_dates))) -} - -forecast_tibble1 <- tibble(datetime = rep(forecast_dates, length(subseted_site_names)), - site_id = site_vector, - variable = "gcc_90") - -forecast_tibble2 <- tibble(datetime = rep(forecast_dates, length(subseted_site_names)), - site_id = site_vector, - variable = "rcc_90") - -forecast_tibble <- bind_rows(forecast_tibble1, forecast_tibble2) - -forecast <- left_join(forecast_tibble, forecast) - - - -combined <- forecast %>% - select(datetime, site_id, mean, sd, variable) %>% - group_by(site_id, variable) %>% - # remove rows where all in group are NA - filter(!is.na(mean)) %>% - # retain rows where group size >= 2, to allow interpolation - filter(n() >= 2) %>% - mutate(mu = imputeTS::na_interpolation(mean), - sigma = median(sd, na.rm = TRUE)) %>% - pivot_longer(c("mu", "sigma"),names_to = "parameter", values_to = "prediction") |> - arrange(site_id, datetime) |> - mutate(family = "normal") |> - mutate(reference_datetime = lubridate::as_date(min(datetime)) - lubridate::days(1), - model_id = "climatology") |> - select(model_id, datetime, reference_datetime, site_id, variable, family, parameter, prediction) |> - ungroup() - -combined %>% - filter(variable == "gcc_90") |> - select(datetime, site_id,parameter, prediction) %>% - pivot_wider(names_from = parameter, values_from = prediction) %>% - ggplot(aes(x = datetime)) + - geom_ribbon(aes(ymin=mu - sigma*1.96, ymax=mu + sigma*1.96), alpha = 0.1) + - geom_point(aes(y = mu)) + - facet_wrap(~site_id) - -file_date <- combined$reference_datetime[1] - -forecast_file <- paste("phenology", file_date, "climatology.csv.gz", sep = "-") - -write_csv(combined, file = forecast_file) - - -neon4cast::submit(forecast_file = forecast_file, - metadata = NULL, - ask = FALSE) - -unlink(forecast_file) -#unlink(meta_data_filename) - -message(paste0("Completed null model generation ", Sys.time())) - - - diff --git a/baseline_models/models/phenology_persistenceBayes.R b/baseline_models/models/phenology_persistenceBayes.R deleted file mode 100644 index a01b51b0cb..0000000000 --- a/baseline_models/models/phenology_persistenceBayes.R +++ /dev/null @@ -1,185 +0,0 @@ -library("rjags") -library("ecoforecastR") -library("ncdf4") -library("tidybayes") -library("tidyverse") - -source("R/randomWalkNullModelFunction.R") -###Random WalkNull Model Calculations -####Note: Currently this is not set up to run iteratively because I am not sure how the challenge is planning on doing this. -####Note (continued): Hopefully someone who knows about how this will be done can use this code to do that - -generate_plots <- FALSE -team_name <- "persistence" - -download.file("https://data.ecoforecast.org/neon4cast-targets/phenology/phenology-targets.csv.gz", - "phenology-targets.csv.gz") - -phenoDat <- read_csv("phenology-targets.csv.gz") -sites <- unique(as.character(phenoDat$site_id)) -target_variables <- c("gcc_90","rcc_90") -target_variables_sd <- c("gcc_sd","rcc_sd") - -forecast_length <- 35 -predictions <- array(NA, dim = c(length(target_variables), forecast_length, length(sites), 2000)) - -#'Generic random walk state-space model is JAGS format. We use this model for -#'both the oxygen and temperature null forecasts -RandomWalk = " -model{ - # Priors - x[1] ~ dnorm(x_ic,tau_add) - tau_obs[1] <- 1 / pow(sd_obs, 2) - y[1] ~ dnorm(x[1],tau_obs[1]) - - sd_add ~ dunif(0.000001, 100) - tau_add <- 1/ pow(sd_add, 2) - - # Process Model - for(t in 2:N){ - x[t] ~ dnorm(x[t-1], tau_add) - tau_obs[t] <- 1 / pow(sd_obs, 2) - y[t] ~ dnorm(x[t], tau_obs[t]) - } -} -" - -forecast_saved <- NULL - -for(i in 1:length(target_variables)){ - - for(s in 1:length(sites)){ - - message(paste0("forecasting ",target_variables[i]," at site: ",sites[s])) - message("site ", s, " of ", length(sites)) - - forecast_length <- 35 - - sitePhenoDat <- phenoDat[phenoDat$site_id==sites[s],] - sitePhenoDat$datetime <- lubridate::as_date(sitePhenoDat$datetime) - - #sitePhenoDat <- sitePhenoDat %>% - # pivot_longer(cols = c(all_of(target_variables), all_of(target_variables_sd)), names_to = "variable", values_to = "values") - - #start_forecast <- max(sitePhenoDat$datetime) + lubridate::days(1) - start_forecast <- Sys.Date() + lubridate::days(1) - - sitePhenoDat_variable <- sitePhenoDat %>% - filter(variable == target_variables[i]) - - sitePhenoDat_sd <- sitePhenoDat %>% - filter(variable == target_variables_sd[i]) - #full_datetime <- tibble::tibble(datetime = seq(min(sitePhenoDat$datetime), max(sitePhenoDat$datetime) + lubridate::days(forecast_length), by = "1 day")) - full_datetime <- tibble::tibble(datetime = seq(min(sitePhenoDat$datetime), Sys.Date() + lubridate::days(forecast_length), by = "1 day")) - forecast_start_index <- which(full_datetime$datetime == max(sitePhenoDat$datetime) + lubridate::days(1)) - - d <- tibble::tibble(datetime = sitePhenoDat_variable$datetime, - p=as.numeric(sitePhenoDat_variable$observation), - p.sd=as.numeric(sitePhenoDat_variable$sd)) - d <- dplyr::full_join(d, full_datetime) - - ggplot(d, aes(x = datetime, y = p)) + - geom_point() - - #gap fill the missing precisions by assigning them the average sd for the site - d$p.sd[!is.finite(d$p.sd)] <- NA - d$p.sd[is.na(d$p.sd)] <- mean(d$p.sd,na.rm=TRUE) - d$p.sd[d$p.sd == 0.0] <- min(d$p.sd[d$p.sd != 0.0]) - d$N <- length(d$p) - data <- list(y = d$p, - sd_obs = 0.01, - N = length(d$p), - x_ic = 0.3) - - init_x <- approx(x = d$datetime[!is.na(d$p)], y = d$p[!is.na(d$p)], xout = d$datetime, rule = 2)$y - - #Initialize parameters - nchain = 3 - chain_seeds <- c(200,800,1400) - init <- list() - for(j in 1:nchain){ - init[[j]] <- list(sd_add = sd(diff(data$y[!is.na(data$y)])), - .RNG.name = "base::Wichmann-Hill", - .RNG.seed = chain_seeds[j], - x = init_x) - } - - - - j.model <- jags.model(file = textConnection(RandomWalk), - data = data, - inits = init, - n.chains = 3) - - - #Run JAGS model as the burn-in - jags.out <- coda.samples(model = j.model,variable.names = c("sd_add"), n.iter = 1000) - - #Run JAGS model again and sample from the posteriors - m <- coda.samples(model = j.model, - variable.names = c("x","sd_add", "y"), - n.iter = 2000, - thin = 1) - - #Use TidyBayes package to clean up the JAGS output - model_output <- m %>% - spread_draws(y[day]) %>% - filter(.chain == 1) %>% - rename(ensemble = .iteration) %>% - mutate(datetime = full_datetime$datetime[day]) %>% - ungroup() %>% - select(datetime, y, ensemble) - - if(generate_plots){ - #Pull in the observation data for plotting - obs <- tibble(datetime = d$datetime, - obs = d$p) %>% - filter(datetime >= max(sitePhenoDat$datetime)) - - #Post past and future - model_output %>% - group_by(datetime) %>% - summarise(mean = mean(y), - upper = quantile(y, 0.975), - lower = quantile(y, 0.025),.groups = "drop") %>% - filter(datetime >= max(sitePhenoDat$datetime) ) %>% - ggplot(aes(x = datetime, y = mean)) + - geom_line() + - geom_ribbon(aes(ymin = lower, ymax = upper), alpha = 0.2, color = "lightblue", fill = "lightblue") + - geom_point(data = obs, aes(x = datetime, y = obs), color = "red") + - labs(x = "Date", y = "gcc_90") - - ggsave(paste0("phenology_",sites[s],"_figure.pdf"), device = "pdf") - } - - #Filter only the forecasted dates and add columns for required variable - forecast_saved_tmp <- model_output %>% - filter(datetime >= start_forecast) %>% - rename(prediction = y) %>% - mutate(site_id = sites[s]) %>% - mutate(forecast_iteration_id = start_forecast) %>% - mutate(forecast_project_id = team_name, - variable = target_variables[i]) - - - # Combined with the previous sites - forecast_saved <- rbind(forecast_saved, forecast_saved_tmp) - - } -} - -forecast_file_name <- paste0("phenology-",lubridate::as_date(min(forecast_saved$datetime)),"-",team_name,".csv.gz") - -forecast_saved <- forecast_saved |> - mutate(start_datetime = lubridate::as_date(min(datetime)) - lubridate::days(1)) |> - rename(parameter = ensemble) |> - mutate(family = "ensemble") |> - select(datetime, reference_datetime, site_id, variable, family, parameter, prediction) |> - -write_csv(forecast_saved, forecast_file_name) - -neon4cast::submit(forecast_file = forecast_file_name, - metadata = NULL, - ask = FALSE) - -unlink(forecast_file_name) diff --git a/baseline_models/models/phenology_persistenceRW.R b/baseline_models/models/phenology_persistenceRW.R deleted file mode 100644 index e39882ef94..0000000000 --- a/baseline_models/models/phenology_persistenceRW.R +++ /dev/null @@ -1,60 +0,0 @@ -library(tidyverse) -library(tsibble) -library(fable) -source('./R/fablePersistenceModelFunction.R') -# 1.Read in the targets data -targets <- readr::read_csv("https://data.ecoforecast.org/neon4cast-targets/phenology/phenology-targets.csv.gz", guess_max = 1e6) |> - na.omit() - -# 2. Make the targets into a tsibble with explicit gaps -targets_ts <- targets %>% - as_tsibble(key = c('variable', 'site_id'), index = 'datetime') %>% - # add NA values up to today (index) - fill_gaps(.end = Sys.Date()) - -# 2. Run through each via map -# Requires a dataframe that has each of the variable in the RW_forecast function -site_var_combinations <- expand.grid(site = unique(targets$site_id), - var = unique(targets$variable)) %>% - # assign the transformation depending on the variable - mutate(transformation = 'none') %>% - mutate(boot_number = 200, - h = 35, - bootstrap = T, - verbose = T) - -# runs the RW forecast for each combination of variable and site_id -RW_forecasts <- purrr::pmap_dfr(site_var_combinations, RW_daily_forecast) - -# convert the output into EFI standard -RW_forecasts_EFI <- RW_forecasts %>% - rename(parameter = .rep, - prediction = .sim) %>% - # For the EFI challenge we only want the forecast for future - filter(datetime > Sys.Date()) %>% - group_by(site_id, variable) %>% - mutate(reference_datetime = min(datetime) - lubridate::days(1), - family = "ensemble", - model_id = "persistenceRW") %>% - select(model_id, datetime, reference_datetime, site_id, family, parameter, variable, prediction) - -#RW_forecasts_EFI |> -# filter(variable == "gcc_90") |> -# filter(site_id %in% unique(RW_forecasts_EFI$site_id)[1:24]) |> -# ggplot(aes(x = time, y = prediction, group = ensemble)) + -# geom_line() + -# facet_wrap(~site_id) - -# 4. Write forecast file - -file_date <- RW_forecasts_EFI$reference_datetime[1] - -forecast_file <- paste("phenology", file_date, "persistenceRW.csv.gz", sep = "-") - -write_csv(RW_forecasts_EFI, forecast_file) - -neon4cast::submit(forecast_file = forecast_file, - metadata = NULL, - ask = FALSE) - -unlink(forecast_file) diff --git a/baseline_models/models/terrestrial_30min_climatology.R b/baseline_models/models/terrestrial_30min_climatology.R deleted file mode 100644 index d784064e6c..0000000000 --- a/baseline_models/models/terrestrial_30min_climatology.R +++ /dev/null @@ -1,211 +0,0 @@ -print(paste0("Running Creating 30-minute Terrestrial Historical Means Forecasts at ", Sys.time())) - -library(ncdf4) -library(tidyverse) -library(lubridate) -library(modelr) - -set.seed(42) - -ne = 200 ## number of ensemble members - -team_list <- list(list(individualName = list(givenName = "Mike", surName ="Dietze"), - id = "https://orcid.org/0000-0002-2324-2518"), - list(individualName = list(givenName = "Quinn", surName = "Thomas"), - id = "https://orcid.org/0000-0003-1282-7825") -) - -team_name <- "climatology" -forecast_project_id <- "efi_hist" - -download.file("https://data.ecoforecast.org/neon4cast-targets/terrestrial_30min/terrestrial_30min-targets.csv.gz", - "terrestrial_30min-targets.csv.gz") - -terrestrial_targets <- read_csv("terrestrial_30min-targets.csv.gz", guess_max = 100000, show_col_types = FALSE) - -site_names <- read_csv("https://raw.githubusercontent.com/eco4cast/neon4cast-targets/main/NEON_Field_Site_Metadata_20220412.csv") |> - dplyr::filter(terrestrial == 1) |> - dplyr::pull(field_site_id) - -start_forecast <- as.POSIXct(Sys.Date(),tz="UTC") -fx_datetime <- seq(start_forecast, start_forecast + days(10), by = "30 min") - -reference_datetime <- strftime(lubridate::as_datetime(start_forecast),format= "%Y-%m-%d %H:%M:%S") - -nee_fx = le_fx = array(NA, dim=c(length(fx_datetime),length(site_names),ne)) ## dimensions: datetime, space, ensemble - -## Forecast by site -for(s in 1:length(site_names)){ - print(site_names[s]) - - site_data_var <- terrestrial_targets %>% - filter(site_id == site_names[s]) |> - arrange(variable, datetime) - - max_datetime <- max(site_data_var$datetime) + days(1) - - - min_datetime <- min(which(!is.na(site_data_var$observation))) - # This is key here - I added 16 days on the end of the data for the forecast period - - full_datetime1 <- tibble(datetime = seq(site_data_var$datetime[min_datetime], max(site_data_var$datetime), by = "30 min"), - variable = "nee") - - full_datetime2 = tibble(datetime = seq(site_data_var$datetime[min_datetime], max(site_data_var$datetime), by = "30 min"), - variable = "le") - - full_datetime <- bind_rows(full_datetime1, full_datetime2) - - site_data_var <- left_join(full_datetime, site_data_var, by = c("datetime", "variable")) %>% - filter(lubridate::month(datetime) == lubridate::month(max_datetime)) ## grab all historical data for this month - - non_na <- site_data_var |> - na.omit() - ############ NEE ############# - - if(nrow(non_na) > 0){ - - #Full datetime series with gaps - y_wgaps <- site_data_var$observation[which(site_data_var$variable == "nee")] - datetime <- c(site_data_var$datetime[which(site_data_var$variable == "nee")]) - #Remove gaps - t_nogaps <- datetime[!is.na(y_wgaps)] - y_nogaps <- y_wgaps[!is.na(y_wgaps)] - - ## check that we can calculate mean diurnal cycle - htod = hour(t_nogaps) + minute(t_nogaps)/60 ## historical datetime of day - nee_diurnal = tapply(y_nogaps,htod,mean) - n_diurnal = tapply(y_nogaps,htod,length) - # plot(nee_diurnal,main=site_names[s]) - - ## forecast - ftod = hour(fx_datetime) + minute(fx_datetime)/60 - for(i in 1:48){ - #print(i) - tod = (i-1)/2 - window = 0.25 - hindex = which(abs(htod - tod) < window) ## indices in historical data to resample - while(length(hindex) < 10){ - window = window + 0.5 - hindex = which(abs(htod - tod) < window) ## if no data at that datetime, look at adjacent datetimes - #print(window) - } - findex = which(ftod == tod) ## columns in fx to fill in - for(j in findex){ - nee_fx[j,s,] = y_nogaps[sample(hindex,ne,replace=TRUE)] - } - } - - ############ Latent heat ############ - - #Full datetime series with gaps - y_wgaps <- site_data_var$observation[which(site_data_var$variable == "le")] - datetime <- c(site_data_var$datetime[which(site_data_var$variable == "le")]) - #Remove gaps - t_nogaps <- datetime[!is.na(y_wgaps)] - y_nogaps <- y_wgaps[!is.na(y_wgaps)] - - htod = hour(t_nogaps) + minute(t_nogaps)/60 ## historical datetime of day - for(i in 1:48){ - tod = (i-1)/2 - window = 0.25 - hindex = which(abs(htod - tod) < window) ## indices in historical data to resample - while(length(hindex) < 10){ - window = window + 0.5 - hindex = which(abs(htod - tod) < window) ## if no data at that datetime, look at adjacent datetimes - print(window) - } - findex = which(ftod == tod) ## columns in fx to fill in - for(j in findex){ - le_fx[j,s,] = y_nogaps[sample(hindex,ne,replace=TRUE)] - } - } - } -} ## end loop over sites - -## Set dimensions -datetimedim <- ncdim_def("datetime", ## dimension name - units = paste('seconds since',fx_datetime[1]), - ## size of datetimestep, with units and start date - vals = as.numeric(fx_datetime - fx_datetime[1]), - ## sequence of values that defines the dimension. - longname = 'datetime') -## descriptive name - -sitedim <- ncdim_def("site", - units="", - vals=1:length(site_names), - longname = "NEON siteID") - -ensdim <- ncdim_def("parameter", - units = "", - vals = seq_len(ne), - longname = 'ensemble member') - -nchardim <- ncdim_def("nchar",units="",1:4,create_dimvar=FALSE) - -## quick check that units are valid -udunits2::ud.is.parseable(datetimedim$units) -udunits2::ud.is.parseable(sitedim$units) -udunits2::ud.is.parseable(ensdim$units) - -fillvalue <- 1e32 ## missing data value - -#Define variables -def_list <- list() -def_list[[1]] <- ncvar_def(name = "nee", - units = "umol CO2 m-2 s-1", - dim = list(datetimedim, sitedim, ensdim), - missval = fillvalue, - longname = 'net ecosystem exchange of CO2', - prec="double") -def_list[[2]] <- ncvar_def(name = "le", - units = "W m-2", - dim = list(datetimedim, sitedim, ensdim), - missval = fillvalue, - longname = 'latent heat flux', - prec="double") -def_list[[3]] <- ncvar_def(name = "site_id", - units="", - dim = list(nchardim,sitedim), - longname = "NEON site codes", - prec="char") - -ncfname <- paste0("terrestrial_30min-",lubridate::as_date(reference_datetime),"-",team_name,".nc") -ncout <- nc_create(ncfname,def_list,force_v4=T) -ncvar_put(ncout,def_list[[1]] , nee_fx) -ncvar_put(ncout,def_list[[2]] , le_fx) -ncvar_put(ncout,def_list[[3]] , site_names) - -## Global attributes (metadata) -curr_datetime <- with_tz(Sys.time(), "UTC") -ncatt_put(ncout,0,"reference_datetime", reference_datetime, - prec = "text") -ncatt_put(ncout,0,"model_id",team_name, prec = "text") - - -nc_close(ncout) ## make sure to close the file - -# Generate metadata -forecast_issue_datetime <- as_date(curr_datetime) -forecast_iteration_id <- start_forecast -forecast_model_id <- team_name - -#source("generate_metadata.R") -#meta_data_filename <- generate_metadata(forecast_file = ncfname, -# metadata_yaml = "metadata_30min.yml", -# forecast_issue_datetime = as_date(with_tz(Sys.time(), "UTC")), -# forecast_iteration_id = start_forecast, -# forecast_file_name_base = strsplit(ncfname,".",fixed=TRUE)[[1]][1], -# start_time = fx_time[1], -# reference_datetime = last(fx_datetime)) - -neon4cast::submit(forecast_file = ncfname, - #metadata = meta_data_filename, - ask = FALSE) - -unlink(ncfname) -#unlink(meta_data_filename) - - - diff --git a/baseline_models/models/terrestrial_daily_climatology.R b/baseline_models/models/terrestrial_daily_climatology.R deleted file mode 100644 index 6d0dd566ef..0000000000 --- a/baseline_models/models/terrestrial_daily_climatology.R +++ /dev/null @@ -1,144 +0,0 @@ -#'# Ecological Forecasting Initiative Null Model - -#'## Set-up - -print(paste0("Running Creating Daily Terrestrial Forecasts at ", Sys.time())) - -#'Load renv.lock file that includes the versions of all the packages used -#'You can generate using the command renv::snapshot() - -#' Required packages. -#' EFIstandards is at remotes::install_github("eco4cast/EFIstandards") -library(tidyverse) -library(lubridate) -library(aws.s3) -library(EFIstandards) -library(EML) -library(jsonlite) -library(imputeTS) - - -#' set the random number for reproducible MCMC runs -set.seed(329) - -#'Generate plot to visualized forecast -generate_plots <- TRUE -#'Is the forecast run on the Ecological Forecasting Initiative Server? -#'Setting to TRUE published the forecast on the server. -efi_server <- TRUE - -#' List of team members. Used in the generation of the metadata -#team_list <- list(list(individualName = list(givenName = "Quinn", surName = "Thomas"), -# id = "https://orcid.org/0000-0003-1282-7825"), -# list(individualName = list(givenName = "Others", surName ="Pending")), -#) - -#'Team name code -team_name <- "climatology" - -#'Read in target file. The guess_max is specified because there could be a lot of -#'NA values at the beginning of the file -targets <- readr::read_csv("https://data.ecoforecast.org/neon4cast-targets/terrestrial_daily/terrestrial_daily-targets.csv.gz", guess_max = 10000) - -sites <- read_csv("https://raw.githubusercontent.com/eco4cast/neon4cast-targets/main/NEON_Field_Site_Metadata_20220412.csv") |> - dplyr::filter(terrestrial == 1) - -site_names <- sites$field_site_id - -target_clim <- targets %>% - mutate(doy = yday(datetime)) %>% - group_by(doy, site_id, variable) %>% - summarise(clim_mean = mean(observation, na.rm = TRUE), - clim_sd = sd(observation, na.rm = TRUE), - .groups = "drop") %>% - mutate(clim_mean = ifelse(is.nan(clim_mean), NA, clim_mean)) - -#curr_month <- month(Sys.Date()) -curr_month <- month(Sys.Date()) -if(curr_month < 10){ - curr_month <- paste0("0", curr_month) -} - -curr_year <- year(Sys.Date()) -start_date <- Sys.Date() + days(1) - -forecast_dates <- seq(start_date, as_date(start_date + days(35)), "1 day") -forecast_doy <- yday(forecast_dates) - -forecast_dates_df <- tibble(datetime = forecast_dates, - doy = forecast_doy) - -forecast <- target_clim %>% - mutate(doy = as.integer(doy)) %>% - filter(doy %in% forecast_doy) %>% - full_join(forecast_dates_df, by = 'doy') %>% - arrange(site_id, datetime) - -subseted_site_names <- unique(forecast$site_id) -site_vector <- NULL -for(i in 1:length(subseted_site_names)){ - site_vector <- c(site_vector, rep(subseted_site_names[i], length(forecast_dates))) -} - -forecast_tibble1 <- tibble(datetime = rep(forecast_dates, length(subseted_site_names)), - site_id = site_vector, - variable = "nee") - -forecast_tibble2 <- tibble(datetime = rep(forecast_dates, length(subseted_site_names)), - site_id = site_vector, - variable = "nee") - -forecast_tibble <- bind_rows(forecast_tibble1, forecast_tibble2) - -foreast <- right_join(forecast, forecast_tibble) - -site_count <- forecast %>% - select(datetime, site_id, variable, clim_mean, clim_sd) %>% - filter(!is.na(clim_mean)) |> - group_by(site_id, variable) %>% - summarize(count = n(), .groups = "drop") |> - filter(count > 2) |> - distinct() |> - pull(site_id) - - - - - -combined <- forecast %>% - filter(site_id %in% site_count) |> - select(datetime, site_id, variable, clim_mean, clim_sd) %>% - rename(mean = clim_mean, - sd = clim_sd) %>% - group_by(site_id, variable) %>% - mutate(mu = imputeTS::na_interpolation(x = mean), - sigma = median(sd, na.rm = TRUE)) -combined <- combined %>% - pivot_longer(c("mu", "sigma"),names_to = "parameter", values_to = "prediction") |> - mutate(family = "normal") |> - mutate(reference_datetime = min(combined$datetime) - lubridate::days(1), - model_id = "climatology") |> - select(model_id, datetime, reference_datetime, site_id, variable, family, parameter, prediction) - -combined %>% - filter(variable == "nee") |> - pivot_wider(names_from = parameter, values_from = prediction) %>% - ggplot(aes(x = datetime)) + - geom_ribbon(aes(ymin=mu - sigma*1.96, ymax=mu + sigma*1.96), alpha = 0.1) + - geom_point(aes(y = mu)) + - facet_wrap(~site_id) - -file_date <- combined$reference_datetime[1] - -forecast_file <- paste("terrestrial_daily", file_date, "climatology.csv.gz", sep = "-") - -write_csv(combined, forecast_file) - -neon4cast::submit(forecast_file = forecast_file, - metadata = NULL, - ask = FALSE) - -unlink(forecast_file) - - - diff --git a/baseline_models/models/terrestrial_daily_persistenceBayes.R b/baseline_models/models/terrestrial_daily_persistenceBayes.R deleted file mode 100644 index f91a6b4c1a..0000000000 --- a/baseline_models/models/terrestrial_daily_persistenceBayes.R +++ /dev/null @@ -1,363 +0,0 @@ -#'# Ecological Forecasting Initiative Null Model - -#'## Set-up - -print(paste0("Running Creating Daily Terrestrial Forecasts at ", Sys.time())) - -#'Load renv.lock file that includes the versions of all the packages used -#'You can generate using the command renv::snapshot() - -#' Required packages. -#' EFIstandards is at remotes::install_github("eco4cast/EFIstandards") -library(tidyverse) -library(lubridate) -library(rjags) -library(tidybayes) -library(modelr) -library(aws.s3) -library(EFIstandards) -library(EML) -library(jsonlite) - -#' set the random number for reproducible MCMC runs -set.seed(329) - -#'Generate plot to visualized forecast -generate_plots <- FALSE - -#' List of team members. Used in the generation of the metadata -team_list <- list(list(individualName = list(givenName = "Quinn", surName = "Thomas"), - id = "https://orcid.org/0000-0003-1282-7825"), - list(individualName = list(givenName = "Alex", surName ="Young")), - list(individualName = list(givenName = "George", surName ="Burba")), - list(individualName = list(givenName = "Jamie", surName ="Cleverly")), - list(individualName = list(givenName = "Ankur", surName ="Desai")), - list(individualName = list(givenName = "Mike", surName ="Dietze")), - list(individualName = list(givenName = "Andy", surName ="Fox")), - list(individualName = list(givenName = "William", surName ="Hammond")), - list(individualName = list(givenName = "Danica", surName ="Lombardozzi")) -) - -#'Team name code -team_name <- "persistence" - -#'Download target file from the server -download.file("https://data.ecoforecast.org/neon4cast-targets/terrestrial_daily/terrestrial_daily-targets.csv.gz", - "terrestrial_daily-targets.csv.gz") - -#'Read in target file. The guess_max is specified because there could be a lot of -#'NA values at the beginning of the file -terrestrial_targets <- read_csv("terrestrial_daily-targets.csv.gz", guess_max = 10000) - -terrestrial_targets |> - group_by(variable) |> - summarize(mean = quantile(observation, 0.75, na.rm = TRUE)) - -terrestrial_targets <- terrestrial_targets #%>% - #filter(time < as_date("2020-12-01")) - -#download.file("https://data.ecoforecast.org/neon4cast-targets/terrestrial_30min/terrestrial_30min-targets.csv.gz", -# "terrestrial_30min-targets.csv.gz") - -#terrestrial_targets_30min <- read_csv("terrestrial_30min-targets.csv.gz", guess_max = 10000) - -#variable_sd <- terrestrial_targets_30min |> -# mutate(sd = (sqrt(2) * sd_intercept) * ((12 / 1000000) * (60 * 60 * 24)) / sqrt(48)) |> -# group_by(site_id, variable) |> -# summarize(sd = mean(sd, na.rm = TRUE), .groups = "drop") - -#'Focal sites -sites <- read_csv("https://raw.githubusercontent.com/eco4cast/neon4cast-targets/main/NEON_Field_Site_Metadata_20220412.csv") |> - dplyr::filter(terrestrial == 1) - -site_names <- sites$field_site_id - -#'Generic random walk state-space model is JAGS format. We use this model for -#'both the NEE and LE null forecasts -RandomWalk = " -model{ - - # Priors - x[1] ~ dnorm(x_ic,tau_add) - - sd_add ~ dunif(0.0000001, 100) - tau_add <- 1/ pow(sd_add, 2) - - - # Process Model - for(t in 2:n){ - x[t]~dnorm(x[t-1],tau_add) - #Data Model - y[t] ~ dnorm(x[t],tau_obs) - } - -} -" - -#'## NEE Model - -#'Create variable for combined forecasts across sites -forecast_saved_nee <- NULL -nee_figures <- list() -#+ message = FALSE -#' Loop through sites -for(s in 1:length(site_names)){ - - message(paste0("NEE: ", site_names[s])) - - #site_sd <- variable_sd |> - # filter(site_id == site_names[s], - # variable == "nee") |> - # pull(sd) - - - # Select site - site_data_var <- terrestrial_targets %>% - filter(variable == "nee") |> - filter(site_id == site_names[s], - datetime >= lubridate::as_date("2020-01-01")) - - # Find the last day in the observation data and add one day for the start of the - # forecast - start_forecast <- max(site_data_var$datetime) + days(1) - - # This is key here - I added 35 days on the end of the data for the forecast period - full_datetime <- tibble(datetime = seq(min(site_data_var$datetime), max(site_data_var$datetime) + days(35), by = "1 day")) - - # Join the full datetime with the site_data_var so there aren't gaps in the datetime column - site_data_var <- left_join(full_datetime, site_data_var) - - #observation NEE: Full datetime series with gaps - y_wgaps <- site_data_var$observation - datetime <- c(site_data_var$datetime) - #observation NEE: datetime series without gaps - y_nogaps <- y_wgaps[!is.na(y_wgaps)] - #Index: datetime series with gaps - y_wgaps_index <- 1:length(y_wgaps) - #Index: the index of the non-NA values in datetime series with gaps - y_wgaps_index <- y_wgaps_index[!is.na(y_wgaps)] - - #Generate starting initial conditions for latent states - init_x <- approx(x = datetime[!is.na(y_wgaps)], y = y_nogaps, xout = datetime, rule = 2)$y - - #Create a list of the data for use in JAGS. Include vector lengths (nobs, n) - data <- list(y = y_wgaps, - tau_obs = 1/(0.05 ^ 2), - n = length(y_wgaps), - x_ic = 0.0) - - #Initialize parameters - nchain = 3 - chain_seeds <- c(200,800,1400) - init <- list() - for(i in 1:nchain){ - init[[i]] <- list(sd_add = sd(diff(y_nogaps)), - .RNG.name = "base::Wichmann-Hill", - .RNG.seed = chain_seeds[i], - x = init_x) - } - - #Initialize JAGS model - j.model <- jags.model (file = textConnection(RandomWalk), - data = data, - inits = init, - n.chains = 3) - - #Run JAGS model as the burn-in - jags.out <- coda.samples(model = j.model,variable.names = c("sd_add"), n.iter = 10000) - - #Run JAGS model again and sample from the posteriors - m <- coda.samples(model = j.model, - variable.names = c("y","sd_add"), - n.iter = 10000, - thin = 5) - - #Use TidyBayes package to clean up the JAGS output - model_output <- m %>% - spread_draws(y[day]) %>% - filter(.chain == 1) %>% - rename(ensemble = .iteration) %>% - mutate(datetime = full_datetime$datetime[day]) %>% - ungroup() %>% - select(datetime, y, ensemble) - - if(generate_plots){ - #Pull in the observation data for plotting - obs <- tibble(datetime = full_datetime$datetime, - obs = y_wgaps) - - - #Post past and future - model_output %>% - group_by(datetime) %>% - summarise(mean = mean(y), - upper = quantile(y, 0.975), - lower = quantile(y, 0.025),.groups = "drop") %>% - ggplot(aes(x = datetime, y = mean)) + - geom_line() + - geom_ribbon(aes(ymin = lower, ymax = upper), alpha = 0.2, color = "lightblue", fill = "lightblue") + - geom_point(data = obs, aes(x = datetime, y = obs), color = "red") + - labs(x = "Date", y = "nee") - - ggsave(paste0("nee_daily_",site_names[s],"_figure.pdf"), device = "pdf") - } - - #Filter only the forecasted dates and add columns for required variable - forecast_saved_tmp <- model_output %>% - filter(datetime >= start_forecast) %>% - rename(prediction = y) %>% - mutate(variable = "nee", - site_id = site_names[s]) %>% - mutate(forecast_iteration_id = start_forecast) %>% - mutate(forecast_project_id = team_name) - - # Combined with the previous sites - forecast_saved_nee <- bind_rows(forecast_saved_nee, forecast_saved_tmp) - -} - -#'## Latent heat model -#' -#' See notes from the NEE section above -#+ message = FALSE - - -forecast_saved_le <- NULL -le_figures <- list() -for(s in 1:length(site_names)){ - - message(paste0("LE: ", site_names[s])) - - site_data_var <- terrestrial_targets %>% - filter(variable == "le") |> - filter(site_id == site_names[s], - datetime >= lubridate::as_date("2020-01-01")) - - #site_sd <- variable_sd |> - # filter(site_id == site_names[s], - # variable == "le") |> - # pull(sd) - - - max_datetime <- max(site_data_var$datetime) + days(1) - - start_forecast <- max_datetime - full_datetime <- tibble(datetime = seq(min(site_data_var$datetime), max(site_data_var$datetime) + days(35), by = "1 day")) - - site_data_var <- left_join(full_datetime, site_data_var) - - y_wgaps <- site_data_var$observation - datetime <- c(site_data_var$datetime) - - y_nogaps <- y_wgaps[!is.na(y_wgaps)] - - y_wgaps_index <- 1:length(y_wgaps) - - y_wgaps_index <- y_wgaps_index[!is.na(y_wgaps)] - - init_x <- approx(x = datetime[!is.na(y_wgaps)], y = y_nogaps, xout = datetime, rule = 2)$y - - data <- list(y = y_wgaps, - tau_obs = 1/(0.1 ^ 2), - n = length(y_wgaps), - x_ic = 0.0) - - nchain = 3 - chain_seeds <- c(200,800,1400) - init <- list() - for(i in 1:nchain){ - init[[i]] <- list(sd_add = sd(diff(y_nogaps)), - .RNG.name = "base::Wichmann-Hill", - .RNG.seed = chain_seeds[i], - x = init_x) - } - - j.model <- jags.model (file = textConnection(RandomWalk), - data = data, - inits = init, - n.chains = 3) - - jags.out <- coda.samples(model = j.model,variable.names = c("sd_add"), n.iter = 10000) - - m <- coda.samples(model = j.model, - variable.names = c("y","sd_add"), - n.iter = 10000, - thin = 5) - - model_output <- m %>% - spread_draws(y[day]) %>% - filter(.chain == 1) %>% - rename(ensemble = .iteration) %>% - mutate(datetime = full_datetime$datetime[day]) %>% - ungroup() %>% - select(datetime, y, ensemble) - - if(generate_plots){ - obs <- tibble(datetime = full_datetime$datetime, - obs = y_wgaps) - - model_output %>% - group_by(datetime) %>% - summarise(mean = mean(y), - upper = quantile(y, 0.975), - lower = quantile(y, 0.025),.groups = "drop") %>% - ggplot(aes(x = datetime, y = mean)) + - geom_line() + - geom_ribbon(aes(ymin = lower, ymax = upper), alpha = 0.2, color = "lightblue", fill = "lightblue") + - geom_point(data = obs, aes(x = datetime, y = obs), color = "red") + - labs(x = "Date", y = "le") - - ggsave(paste0("le_daily_",site_names[s],"_figure.pdf"), device = "pdf") - } - - forecast_saved_tmp <- model_output %>% - filter(datetime >= start_forecast) %>% - rename(prediction = y) %>% - mutate(variable = "le", - site_id = site_names[s]) %>% - mutate(forecast_iteration_id = start_forecast) %>% - mutate(forecast_project_id = team_name) - - forecast_saved_le <- bind_rows(forecast_saved_le, forecast_saved_tmp) -} - - -#'Combined the NEE and LE forecasts together and re-order column -forecast_saved <- bind_rows(forecast_saved_nee, forecast_saved_le) %>% - rename(parameter = ensemble) |> - mutate(family = "ensemble", - model_id = team_name) |> - select(model_id, datetime, site_id, family, parameter, variable, prediction) - -#'Save file as CSV in the -#'[theme_name]-[year]-[month]-[date]-[team_name].csv -forecast_file_name_base <- paste0("terrestrial_daily-",as_date(Sys.Date()),"-",team_name) -forecast_file <- paste0(forecast_file_name_base, ".csv.gz") -write_csv(forecast_saved, forecast_file) - -#'#Generate metadata - -#'Get system datetime for setting the issue datetime of the forecast -curr_datetime <- with_tz(Sys.time(), "UTC") -#forecast_issue_time <- format(curr_time,format = "%Y-%m-%d %H:%M:%SZ", usetz = F) -forecast_issue_time <- as_date(curr_time) -forecast_iteration_id <- start_forecast - -#' The team name is the `forecast_model_id` -forecast_model_id <- team_name - -#source("generate_metadata.R") - -#meta_data_filename <- generate_metadata(forecast_file = forecast_file, -# metadata_yaml = "metadata.yml", -# forecast_issue_time = as_date(with_tz(Sys.time(), "UTC")), -# forecast_iteration_id = start_forecast, -# forecast_file_name_base = forecast_file_name_base) - - -neon4cast::submit(forecast_file = forecast_file, - metadata = NULL, - ask = FALSE) - -unlink(forecast_file) -#unlink(meta_data_filename) \ No newline at end of file diff --git a/baseline_models/models/terrestrial_daily_persistenceRW.R b/baseline_models/models/terrestrial_daily_persistenceRW.R deleted file mode 100644 index eded58008a..0000000000 --- a/baseline_models/models/terrestrial_daily_persistenceRW.R +++ /dev/null @@ -1,59 +0,0 @@ -library(tidyverse) -library(tsibble) -library(fable) - -source('R/fablePersistenceModelFunction.R') -# 1.Read in the targets data -# We are not doing a peristence for le right now. -targets <- readr::read_csv("https://data.ecoforecast.org/neon4cast-targets/terrestrial_daily/terrestrial_daily-targets.csv.gz", guess_max = 1e6) %>% - filter(variable == 'nee') - -# 2. Make the targets into a tsibble with explicit gaps -targets_ts <- targets %>% - as_tsibble(key = c('variable', 'site_id'), index = 'datetime') %>% - # add NA values up to today (index) - fill_gaps(.end = Sys.Date()) - -# 3. Run through each via map -site_var_combinations <- expand.grid(site = unique(targets$site_id), - var = unique(targets$variable)) %>% - # assign the transformation depending on the variable. le is logged - mutate(transformation = 'none') %>% - mutate(boot_number = 200, - h = 35, - bootstrap = T, - verbose = T) - -# Runs the RW forecast for each combination of variable and site_id -RW_forecasts <- purrr::pmap_dfr(site_var_combinations, RW_daily_forecast) - -# convert the output into EFI standard -RW_forecasts_EFI <- RW_forecasts %>% - rename(parameter = .rep, - prediction = .sim) %>% - # For the EFI challenge we only want the forecast for future - filter(datetime > Sys.Date()) %>% - group_by(site_id, variable) %>% - mutate(reference_datetime = min(datetime) - lubridate::days(1), - family = "ensemble", - model_id = "persistenceRW") %>% - select(model_id, datetime, reference_datetime, site_id, family, parameter, variable, prediction) - -#RW_forecasts_EFI |> -# filter(site_id %in% unique(RW_forecasts_EFI$site_id)[1:24]) |> -# ggplot(aes(x = time, y = prediction, group = ensemble)) + -# geom_line() + -# facet_wrap(~site_id) - -# 4. Write forecast file -file_date <- RW_forecasts_EFI$reference_datetime[1] - -forecast_file <- paste("terrestrial_daily", file_date, "persistenceRW.csv.gz", sep = "-") - -write_csv(RW_forecasts_EFI, forecast_file) - -neon4cast::submit(forecast_file = forecast_file, - metadata = NULL, - ask = FALSE) - -unlink(forecast_file) \ No newline at end of file diff --git a/baseline_models/models/ticks_climatology.R b/baseline_models/models/ticks_climatology.R deleted file mode 100644 index 82fafc3f7d..0000000000 --- a/baseline_models/models/ticks_climatology.R +++ /dev/null @@ -1,128 +0,0 @@ -#=====================================================# -# This script creates the null model for the Tick -# Population challenge -# -# The model is historcial means for each week at each site -#=====================================================# - -library(tidyverse) -library(lubridate) - -# first load the target data set -data <- read_csv("https://data.ecoforecast.org/neon4cast-targets/ticks/ticks-targets.csv.gz", guess_max = 1e6) -sites <- data %>% - pull(site_id) %>% - unique() - - -# the weeks we need to forecast -curr_iso_week <- as.numeric(stringr::str_sub(ISOweek::ISOweek(Sys.Date()),7, 8)) -curr_year <- lubridate::year(Sys.Date()) -curr_week <- ISOweek::ISOweek2date(paste0(ISOweek::ISOweek(Sys.Date()), "-1")) -fx.datetime <- seq.Date(curr_week, by = 7, length.out = 52) # all Sundays in 2021 - -# Forecast is weekly mean and sd by site -hist_means <- function(df, target.weeks){ - - focal_weeks <- (as.numeric(stringr::str_sub(ISOweek::date2ISOweek(target.weeks), 7, 8))) - - weekly.means <- df %>% - mutate(iso_week = as.numeric(stringr::str_sub(iso_week, 7, 8))) |> - group_by(site_id, iso_week) %>% - summarise(mean = mean(observation), - sd = sd(observation)) - - - # need to fill in NAs and need to do on all data before sub-setting to target weeks - filler.tb <- tibble(site_id = rep(sites, length(1:44)), - iso_week = rep(1:44, each = length(sites))) - - all.weeks <- left_join(filler.tb, weekly.means, by = c("site_id", "iso_week")) %>% - arrange(site_id, iso_week) - - # not all weeks will be accounted for - linearly interpolate if missing - gap.filled <- all.weeks %>% - group_by(site_id) %>% - mutate(mean = approx(x = iso_week, y = mean, xout = iso_week, rule = 2)$y, - sd = replace_na(sd, mean(sd, na.rm = TRUE)), - sd = replace(sd, sd == 0, mean(sd))) |> - filter(iso_week %in% focal_weeks) - - # now each week has a mean - sort of - return(gap.filled) -} - - - -create_ensembles <- function(df, nmc = 500, forecast.year = 2021) { - - # simulate error from the log normal (to keep the zero bound) - # need to calculate meanLog and sdLog from the normal mean and sd - log_norm_sim <- function(df, i){ - mu <- df$mean[[i]] + 1 - sd <- df$sd[[i]] - meanLog <- log(mu^2 / sqrt(sd^2 + mu^2)) - sdLog <- sqrt(log(1 + (sd^2 / mu^2))) - sim <- data.frame( - site_id = df$site_id[[i]], - iso_week = df$iso_week[[i]], - ensemble = 1:nmc, - density = rlnorm(nmc, meanLog, sdLog) - ) - return(sim) - } - - # make ensemble data frame, create/rename columns as needed - ens <- 1:nrow(df) %>% - map_dfr(~ log_norm_sim(df, .x)) %>% - as_tibble() %>% - mutate(year = ifelse(iso_week < curr_iso_week, curr_year + 1, curr_year), - iso_week = stringr::str_pad(iso_week, width = 2,side = "left",pad = 0), - iso_week = paste0(year, "-W",iso_week,"-1"), - datetime = ISOweek::ISOweek2date(iso_week)) - - return(ens) - -} - -# get the forecasts we want -forecast <- hist_means(data, fx.datetime) - -# generate ensembles for uncertainty and scoring -ensembles <- create_ensembles(forecast, curr_iso_week, curr_year) - -team_name <- "EFI_avg_null" - -# finalize for EFI submission -forecast.submit <- ensembles %>% - select(-year, -iso_week) %>% - rename(prediction = density, - parameter = ensemble) |> - mutate(variable = "amblyomma_americanum", - family = "ensemble") |> - mutate(reference_datetime = lubridate::as_date(min(datetime)) - lubridate::weeks(1), - model_id = team_name) |> - select(model_id, datetime, reference_datetime, site_id, variable, family, parameter, prediction) |> - arrange(site_id, datetime) - -ggplot(forecast.submit, aes(x = datetime, y = prediction)) + - geom_point() + - facet_wrap(~site_id) - -ggplot(data, aes(x = datetime, y = observation)) + - geom_point() + - facet_wrap(~site_id) - -# Save file as CSV in the EFI format -# [theme_name]-[time]-[team_name].csv -theme_name <- "ticks" -file_date <- forecast$reference_datetime[1] -file.name <- paste0(theme_name, "-", file_date, "-", team_name, ".csv.gz") - -write_csv(forecast.submit, file.name) - -neon4cast::submit(forecast_file = file.name, - metadata = NULL, - ask = FALSE) - -unlink(file.name) diff --git a/baseline_models/models/ticks_mean.R b/baseline_models/models/ticks_mean.R deleted file mode 100644 index 81d56f13c3..0000000000 --- a/baseline_models/models/ticks_mean.R +++ /dev/null @@ -1,68 +0,0 @@ - -library(fable) -library(distributional) -library(tidyverse) - -efi_statistic_format <- function(df){ - ## determine variable name - var <- attributes(df)$dist - ## Normal distribution: use distribution mean and variance - df %>% - dplyr::mutate(sigma = sqrt( distributional::variance( .data[[var]] ) ) ) %>% - dplyr::rename(mu = .mean) %>% - dplyr::select(datetime, site_id, .model, mu, sigma) %>% - tidyr::pivot_longer(c(mu, sigma), names_to = "parameter", values_to = var) %>% - pivot_longer(tidyselect::all_of(var), names_to="variable", values_to = "prediction") |> - mutate(family = "normal") -} - -## Get the latest beetle target data. -download.file("https://data.ecoforecast.org/neon4cast-targets/ticks/ticks-targets.csv.gz", - "ticks-targets.csv.gz") -targets <- read_csv("ticks-targets.csv.gz") - -curr_iso_week <- ISOweek::ISOweek(Sys.Date()) - -curr_date <- ISOweek::ISOweek2date(paste0(curr_iso_week, "-1")) - -site_list <- unique(targets$site_id) - -last_day <- tibble(site_id = site_list, - datetime = rep(curr_date, length(site_list)), - variable = "amblyomma_americanum", - observation = NA) - - - -targets <- targets |> - filter(variable == "amblyomma_americanum") |> - bind_rows(last_day) |> - select(-variable) |> - as_tsibble(index = datetime, key = site_id) - -team_name <- "mean" - -## a single mean per site... obviously silly -forecast <- targets %>% - model(null = MEAN(log(observation + 1))) %>% - generate(times = 500, h = "1 year", bootstrap = TRUE) |> - dplyr::rename(ensemble = .rep, - prediction = .sim) |> - mutate(variable = "amblyomma_americanum") |> - mutate(reference_datetime = lubridate::as_date(min(datetime)) - lubridate::weeks(1), - model_id = team_name) |> - select(model_id, datetime, reference_datetime, site_id, ensemble, variable, prediction) - -## Create the metadata record, see metadata.Rmd -theme_name <- "ticks" -file_date <- forecast$reference_datetime[1] - -filename <- paste0(theme_name, "-", file_date, "-", team_name, ".csv.gz") - -## Store the forecast products -readr::write_csv(forecast, filename) - -neon4cast::submit(forecast_file = filename, - ask = FALSE) - - From e3e1c09e2f59bc23cc9dc33f99301acde23855f6 Mon Sep 17 00:00:00 2001 From: Zwart Date: Tue, 19 Dec 2023 10:31:11 -0800 Subject: [PATCH 18/26] removing forecasts not used --- .../collection.json | 217 ---------------- .../collection.json | 217 ---------------- .../Beetles/abundance_weekly/collection.json | 204 --------------- catalog/forecasts/Beetles/collection.json | 152 ----------- .../Beetles/richness_weekly/collection.json | 204 --------------- .../collection.json | 227 ---------------- .../collection.json | 242 ------------------ catalog/forecasts/Phenology/collection.json | 152 ----------- .../30min_latent_heat_flux/collection.json | 147 ----------- .../collection.json | 222 ---------------- catalog/forecasts/Terrestrial/collection.json | 162 ------------ .../collection.json | 212 --------------- catalog/forecasts/Ticks/collection.json | 147 ----------- 13 files changed, 2505 deletions(-) delete mode 100644 catalog/forecasts/Beetles/Weekly_beetle_community_abundance/collection.json delete mode 100644 catalog/forecasts/Beetles/Weekly_beetle_community_richness/collection.json delete mode 100644 catalog/forecasts/Beetles/abundance_weekly/collection.json delete mode 100644 catalog/forecasts/Beetles/collection.json delete mode 100644 catalog/forecasts/Beetles/richness_weekly/collection.json delete mode 100644 catalog/forecasts/Phenology/Daily_Green_chromatic_coordinate/collection.json delete mode 100644 catalog/forecasts/Phenology/Daily_Red_chromatic_coordinate/collection.json delete mode 100644 catalog/forecasts/Phenology/collection.json delete mode 100644 catalog/forecasts/Terrestrial/30min_latent_heat_flux/collection.json delete mode 100644 catalog/forecasts/Terrestrial/Daily_Net_ecosystem_exchange/collection.json delete mode 100644 catalog/forecasts/Terrestrial/collection.json delete mode 100644 catalog/forecasts/Ticks/Weekly_Amblyomma_americanum_population/collection.json delete mode 100644 catalog/forecasts/Ticks/collection.json diff --git a/catalog/forecasts/Beetles/Weekly_beetle_community_abundance/collection.json b/catalog/forecasts/Beetles/Weekly_beetle_community_abundance/collection.json deleted file mode 100644 index 7e648aafd9..0000000000 --- a/catalog/forecasts/Beetles/Weekly_beetle_community_abundance/collection.json +++ /dev/null @@ -1,217 +0,0 @@ -{ - "id": "Weekly_beetle_community_abundance", - "description": "This page includes all models for the Weekly_beetle_community_abundance variable.", - "stac_version": "1.0.0", - "license": "CC0-1.0", - "stac_extensions": [ - "https://stac-extensions.github.io/scientific/v1.0.0/schema.json", - "https://stac-extensions.github.io/item-assets/v1.0.0/schema.json", - "https://stac-extensions.github.io/table/v1.2.0/schema.json" - ], - "type": "Collection", - "links": [ - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/mean.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_arima.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_auto_adam.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_ets.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_humidity_lm.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_lasso.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_precip_lm.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_randfor.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_tbats.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_temp_lm.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_randfor_all_sites.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_lasso_all_sites.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_humidity_lm_all_sites.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_temp_lm_all_sites.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_precip_lm_all_sites.json" - }, - { - "rel": "parent", - "type": "application/json", - "href": "../collection.json" - }, - { - "rel": "root", - "type": "application/json", - "href": "../collection.json" - }, - { - "rel": "self", - "type": "application/json", - "href": "collection.json" - }, - { - "rel": "cite-as", - "href": "https://doi.org/10.1002/fee.2616" - }, - { - "rel": "about", - "href": "https://projects.ecoforecast.org/neon4cast-docs/", - "type": "text/html", - "title": "NEON Ecological Forecasting Challenge Documentation" - }, - { - "rel": "describedby", - "href": "https://projects.ecoforecast.org/neon4cast-docs/", - "title": "NEON Forecast Challenge Dashboard", - "type": "text/html" - } - ], - "title": "Weekly_beetle_community_abundance", - "extent": { - "spatial": { - "bbox": [ - [-156.6194, 17.9696, -66.8687, 71.2824] - ] - }, - "temporal": { - "interval": [ - [ - "2023-01-02T00:00:00Z", - "2024-12-09T00:00:00Z" - ] - ] - } - }, - "table:columns": [ - { - "name": "reference_datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime that the forecast was initiated (horizon = 0)" - }, - { - "name": "datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime of the forecasted value (ISO 8601)" - }, - { - "name": "site_id", - "type": "string", - "description": "For forecasts that are not on a spatial grid, use of a site dimension that maps to a more detailed geometry (points, polygons, etc.) is allowable. In general this would be documented in the external metadata (e.g., alook-up table that provides lon and lat)" - }, - { - "name": "family", - "type": "string", - "description": "For ensembles: “ensemble.” Default value if unspecified for probability distributions: Name of the statistical distribution associated with the reported statistics. The “sample” distribution is synonymous with “ensemble.”For summary statistics: “summary.”" - }, - { - "name": "parameter", - "type": "string", - "description": "ensemble member or distribution parameter" - }, - { - "name": "prediction", - "type": "double", - "description": "predicted value for variable" - }, - { - "name": "pub_datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime that forecast was submitted" - }, - { - "name": "project_id", - "type": "string", - "description": "unique identifier for the forecast project" - }, - { - "name": "duration", - "type": "string", - "description": "temporal duration of forecast (hourly, daily, etc.); follows ISO 8601 duration convention" - }, - { - "name": "variable", - "type": "string", - "description": "name of forecasted variable" - }, - { - "name": "model_id", - "type": "string", - "description": "unique model identifier" - }, - { - "name": "reference_date", - "type": "string", - "description": "date that the forecast was initiated" - } - ], - "assets": { - "data": { - "href": "\"s3://anonymous@bio230014-bucket01/challenges/forecasts/parquet/project_id=neon4cast/duration=P1W/variable=abundance?endpoint_override=sdsc.osn.xsede.org\"", - "type": "application/x-parquet", - "title": "Database Access", - "roles": [ - "data" - ], - "description": "Use `arrow` for remote access to the database. This R code will return results for forecasts of the variable by the specific model .\n\n### R\n\n```{r}\n# Use code below\n\nall_results <- arrow::open_dataset(\"s3://anonymous@bio230014-bucket01/challenges/forecasts/parquet/project_id=neon4cast/duration=P1W/variable=abundance?endpoint_override=sdsc.osn.xsede.org\")\ndf <- all_results |> dplyr::collect()\n\n```\n \n\nYou can use dplyr operations before calling `dplyr::collect()` to `summarise`, `select` columns, and/or `filter` rows prior to pulling the data into a local `data.frame`. Reducing the data that is pulled locally will speed up the data download speed and reduce your memory usage.\n\n\n" - }, - "thumbnail": { - "href": "pending", - "type": "image/JPEG", - "roles": [ - "thumbnail" - ], - "title": "pending" - } - } -} diff --git a/catalog/forecasts/Beetles/Weekly_beetle_community_richness/collection.json b/catalog/forecasts/Beetles/Weekly_beetle_community_richness/collection.json deleted file mode 100644 index aa6fd65f9b..0000000000 --- a/catalog/forecasts/Beetles/Weekly_beetle_community_richness/collection.json +++ /dev/null @@ -1,217 +0,0 @@ -{ - "id": "Weekly_beetle_community_richness", - "description": "This page includes all models for the Weekly_beetle_community_richness variable.", - "stac_version": "1.0.0", - "license": "CC0-1.0", - "stac_extensions": [ - "https://stac-extensions.github.io/scientific/v1.0.0/schema.json", - "https://stac-extensions.github.io/item-assets/v1.0.0/schema.json", - "https://stac-extensions.github.io/table/v1.2.0/schema.json" - ], - "type": "Collection", - "links": [ - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/mean.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_arima.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_ets.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_precip_lm_all_sites.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_randfor_all_sites.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_tbats.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_randfor.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_humidity_lm_all_sites.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_lasso.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_precip_lm.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_temp_lm_all_sites.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_humidity_lm.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_temp_lm.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_lasso_all_sites.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_auto_adam.json" - }, - { - "rel": "parent", - "type": "application/json", - "href": "../collection.json" - }, - { - "rel": "root", - "type": "application/json", - "href": "../collection.json" - }, - { - "rel": "self", - "type": "application/json", - "href": "collection.json" - }, - { - "rel": "cite-as", - "href": "https://doi.org/10.1002/fee.2616" - }, - { - "rel": "about", - "href": "https://projects.ecoforecast.org/neon4cast-docs/", - "type": "text/html", - "title": "NEON Ecological Forecasting Challenge Documentation" - }, - { - "rel": "describedby", - "href": "https://projects.ecoforecast.org/neon4cast-docs/", - "title": "NEON Forecast Challenge Dashboard", - "type": "text/html" - } - ], - "title": "Weekly_beetle_community_richness", - "extent": { - "spatial": { - "bbox": [ - [-156.6194, 17.9696, -66.8687, 71.2824] - ] - }, - "temporal": { - "interval": [ - [ - "2023-01-02T00:00:00Z", - "2024-12-09T00:00:00Z" - ] - ] - } - }, - "table:columns": [ - { - "name": "reference_datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime that the forecast was initiated (horizon = 0)" - }, - { - "name": "datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime of the forecasted value (ISO 8601)" - }, - { - "name": "site_id", - "type": "string", - "description": "For forecasts that are not on a spatial grid, use of a site dimension that maps to a more detailed geometry (points, polygons, etc.) is allowable. In general this would be documented in the external metadata (e.g., alook-up table that provides lon and lat)" - }, - { - "name": "family", - "type": "string", - "description": "For ensembles: “ensemble.” Default value if unspecified for probability distributions: Name of the statistical distribution associated with the reported statistics. The “sample” distribution is synonymous with “ensemble.”For summary statistics: “summary.”" - }, - { - "name": "parameter", - "type": "string", - "description": "ensemble member or distribution parameter" - }, - { - "name": "prediction", - "type": "double", - "description": "predicted value for variable" - }, - { - "name": "pub_datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime that forecast was submitted" - }, - { - "name": "project_id", - "type": "string", - "description": "unique identifier for the forecast project" - }, - { - "name": "duration", - "type": "string", - "description": "temporal duration of forecast (hourly, daily, etc.); follows ISO 8601 duration convention" - }, - { - "name": "variable", - "type": "string", - "description": "name of forecasted variable" - }, - { - "name": "model_id", - "type": "string", - "description": "unique model identifier" - }, - { - "name": "reference_date", - "type": "string", - "description": "date that the forecast was initiated" - } - ], - "assets": { - "data": { - "href": "\"s3://anonymous@bio230014-bucket01/challenges/forecasts/parquet/project_id=neon4cast/duration=P1W/variable=richness?endpoint_override=sdsc.osn.xsede.org\"", - "type": "application/x-parquet", - "title": "Database Access", - "roles": [ - "data" - ], - "description": "Use `arrow` for remote access to the database. This R code will return results for forecasts of the variable by the specific model .\n\n### R\n\n```{r}\n# Use code below\n\nall_results <- arrow::open_dataset(\"s3://anonymous@bio230014-bucket01/challenges/forecasts/parquet/project_id=neon4cast/duration=P1W/variable=richness?endpoint_override=sdsc.osn.xsede.org\")\ndf <- all_results |> dplyr::collect()\n\n```\n \n\nYou can use dplyr operations before calling `dplyr::collect()` to `summarise`, `select` columns, and/or `filter` rows prior to pulling the data into a local `data.frame`. Reducing the data that is pulled locally will speed up the data download speed and reduce your memory usage.\n\n\n" - }, - "thumbnail": { - "href": "pending", - "type": "image/JPEG", - "roles": [ - "thumbnail" - ], - "title": "pending" - } - } -} diff --git a/catalog/forecasts/Beetles/abundance_weekly/collection.json b/catalog/forecasts/Beetles/abundance_weekly/collection.json deleted file mode 100644 index a3e691f7f1..0000000000 --- a/catalog/forecasts/Beetles/abundance_weekly/collection.json +++ /dev/null @@ -1,204 +0,0 @@ -{ - "id": "abundance_weekly", - "description": "This page includes all models for the abundance_weekly variable.", - "stac_version": "1.0.0", - "license": "CC0-1.0", - "stac_extensions": [ - "https://stac-extensions.github.io/scientific/v1.0.0/schema.json", - "https://stac-extensions.github.io/item-assets/v1.0.0/schema.json", - "https://stac-extensions.github.io/table/v1.2.0/schema.json" - ], - "type": "Collection", - "links": [ - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_humidity_lm_all_sites.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_precip_lm_all_sites.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_temp_lm.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_humidity_lm.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_precip_lm.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_randfor.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_lasso.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_temp_lm_all_sites.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_arima.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_tbats.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_randfor_all_sites.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_ets.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_lasso_all_sites.json" - }, - { - "rel": "parent", - "type": "application/json", - "href": "../collection.json" - }, - { - "rel": "root", - "type": "application/json", - "href": "../collection.json" - }, - { - "rel": "self", - "type": "application/json", - "href": "collection.json" - }, - { - "rel": "cite-as", - "href": "https://doi.org/10.1002/fee.2616" - }, - { - "rel": "about", - "href": "www.neon4cast.org", - "type": "text/html", - "title": "NEON Ecological Forecasting Challenge Documentation" - }, - { - "rel": "describedby", - "href": "www.neon4cast.org", - "title": "NEON Ecological Forecasting Challenge Documentation", - "type": "text/html" - } - ], - "title": "abundance_weekly", - "extent": { - "spatial": { - "bbox": [ - [ - -156.6194, - 71.2824, - -66.7987, - 71.2824 - ] - ] - }, - "temporal": { - "interval": [ - [ - "2021-05-17T00:00:00Z", - "2024-10-28T00:00:00Z" - ] - ] - } - }, - "table:columns": [ - { - "name": "reference_datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime that the forecast was initiated (horizon = 0)" - }, - { - "name": "datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime of the forecasted value (ISO 8601)" - }, - { - "name": "site_id", - "type": "string", - "description": "For forecasts that are not on a spatial grid, use of a site dimension that maps to a more detailed geometry (points, polygons, etc.) is allowable. In general this would be documented in the external metadata (e.g., alook-up table that provides lon and lat)" - }, - { - "name": "family", - "type": "string", - "description": "For ensembles: “ensemble.” Default value if unspecified for probability distributions: Name of the statistical distribution associated with the reported statistics. The “sample” distribution is synonymous with “ensemble.”For summary statistics: “summary.”" - }, - { - "name": "parameter", - "type": "string", - "description": "ensemble member or distribution parameter" - }, - { - "name": "prediction", - "type": "double", - "description": "predicted value for variable" - }, - { - "name": "pub_datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime that forecast was submitted" - }, - { - "name": "project_id", - "type": "string", - "description": "unique identifier for the forecast project" - }, - { - "name": "duration", - "type": "string", - "description": "temporal duration of forecast (hourly, daily, etc.); follows ISO 8601 duration convention" - }, - { - "name": "variable", - "type": "string", - "description": "name of forecasted variable" - }, - { - "name": "model_id", - "type": "string", - "description": "unique model identifier" - }, - { - "name": "reference_date", - "type": "string", - "description": "date that the forecast was initiated" - } - ], - "assets": { - "data": { - "href": "s3://anonymous@bio230014-bucket01/challenges/forecasts/parquet/project_id=neon4cast/duration=P1W/variable=abundance?endpoint_override=sdsc.osn.xsede.org", - "type": "application/x-parquet", - "title": "Database Access", - "roles": [ - "data" - ], - "description": "Use `arrow` for remote access to the database. This R code will return results for the NEON Ecological Forecasting Aquatics theme.\n\n### R\n\n```{r}\n# Use code below\n\nall_results <- arrow::open_dataset(s3://anonymous@bio230014-bucket01/challenges/forecasts/parquet/project_id=neon4cast/duration=P1W/variable=abundance?endpoint_override=sdsc.osn.xsede.org)\ndf <- all_results |> dplyr::collect()\n\n```\n \n\nYou can use dplyr operations before calling `dplyr::collect()` to `summarise`, `select` columns, and/or `filter` rows prior to pulling the data into a local `data.frame`. Reducing the data that is pulled locally will speed up the data download speed and reduce your memory usage.\n\n\n" - } - } -} diff --git a/catalog/forecasts/Beetles/collection.json b/catalog/forecasts/Beetles/collection.json deleted file mode 100644 index 2cc580b83c..0000000000 --- a/catalog/forecasts/Beetles/collection.json +++ /dev/null @@ -1,152 +0,0 @@ -{ - "id": "Beetles", - "description": "This page includes variables for the Beetles group.", - "stac_version": "1.0.0", - "license": "CC0-1.0", - "stac_extensions": [ - "https://stac-extensions.github.io/scientific/v1.0.0/schema.json", - "https://stac-extensions.github.io/item-assets/v1.0.0/schema.json", - "https://stac-extensions.github.io/table/v1.2.0/schema.json" - ], - "type": "Collection", - "links": [ - { - "rel": "child", - "type": "application/json", - "href": "Weekly_beetle_community_abundance/collection.json" - }, - { - "rel": "child", - "type": "application/json", - "href": "Weekly_beetle_community_richness/collection.json" - }, - { - "rel": "parent", - "type": "application/json", - "href": "../collection.json" - }, - { - "rel": "root", - "type": "application/json", - "href": "../collection.json" - }, - { - "rel": "self", - "type": "application/json", - "href": "collection.json" - }, - { - "rel": "cite-as", - "href": "https://doi.org/10.1002/fee.2616" - }, - { - "rel": "about", - "href": "https://projects.ecoforecast.org/neon4cast-docs/", - "type": "text/html", - "title": "NEON Ecological Forecasting Challenge Documentation" - }, - { - "rel": "describedby", - "href": "https://projects.ecoforecast.org/neon4cast-docs/", - "title": "NEON Forecast Challenge Dashboard", - "type": "text/html" - } - ], - "title": "Beetles", - "extent": { - "spatial": { - "bbox": [ - [-156.6194, 17.9696, -66.8687, 71.2824] - ] - }, - "temporal": { - "interval": [ - [ - "2023-01-01T00:00:00Z", - "2024-12-09T00:00:00Z" - ] - ] - } - }, - "table:columns": [ - { - "name": "reference_datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime that the forecast was initiated (horizon = 0)" - }, - { - "name": "datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime of the forecasted value (ISO 8601)" - }, - { - "name": "site_id", - "type": "string", - "description": "For forecasts that are not on a spatial grid, use of a site dimension that maps to a more detailed geometry (points, polygons, etc.) is allowable. In general this would be documented in the external metadata (e.g., alook-up table that provides lon and lat)" - }, - { - "name": "family", - "type": "string", - "description": "For ensembles: “ensemble.” Default value if unspecified for probability distributions: Name of the statistical distribution associated with the reported statistics. The “sample” distribution is synonymous with “ensemble.”For summary statistics: “summary.”" - }, - { - "name": "parameter", - "type": "string", - "description": "ensemble member or distribution parameter" - }, - { - "name": "prediction", - "type": "double", - "description": "predicted value for variable" - }, - { - "name": "pub_datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime that forecast was submitted" - }, - { - "name": "project_id", - "type": "string", - "description": "unique identifier for the forecast project" - }, - { - "name": "duration", - "type": "string", - "description": "temporal duration of forecast (hourly, daily, etc.); follows ISO 8601 duration convention" - }, - { - "name": "variable", - "type": "string", - "description": "name of forecasted variable" - }, - { - "name": "model_id", - "type": "string", - "description": "unique model identifier" - }, - { - "name": "reference_date", - "type": "string", - "description": "date that the forecast was initiated" - } - ], - "assets": { - "data": { - "href": "\"s3://anonymous@bio230014-bucket01/challenges/forecasts/parquet/?endpoint_override=sdsc.osn.xsede.org\"", - "type": "application/x-parquet", - "title": "Database Access", - "roles": [ - "data" - ], - "description": "Use `arrow` for remote access to the database. This R code will return results for the NEON Ecological Forecasting Aquatics theme.\n\n### R\n\n```{r}\n# Use code below\n\nall_results <- arrow::open_dataset(\"s3://anonymous@bio230014-bucket01/challenges/forecasts/parquet/?endpoint_override=sdsc.osn.xsede.org\")\ndf <- all_results |>\n dplyr::filter(variable %in% c(\"abundance\", \"richness\")) |>\n dplyr::collect()\n\n```\n \n\nYou can use dplyr operations before calling `dplyr::collect()` to `summarise`, `select` columns, and/or `filter` rows prior to pulling the data into a local `data.frame`. Reducing the data that is pulled locally will speed up the data download speed and reduce your memory usage.\n\n\n" - }, - "thumbnail": { - "href": "https://www.neonscience.org/sites/default/files/styles/max_width_1170px/public/image-content-images/Beetles_pinned.jpg", - "type": "image/JPEG", - "roles": [ - "thumbnail" - ], - "title": "Beetle Image" - } - } -} diff --git a/catalog/forecasts/Beetles/richness_weekly/collection.json b/catalog/forecasts/Beetles/richness_weekly/collection.json deleted file mode 100644 index 62f3e9eff7..0000000000 --- a/catalog/forecasts/Beetles/richness_weekly/collection.json +++ /dev/null @@ -1,204 +0,0 @@ -{ - "id": "richness_weekly", - "description": "This page includes all models for the richness_weekly variable.", - "stac_version": "1.0.0", - "license": "CC0-1.0", - "stac_extensions": [ - "https://stac-extensions.github.io/scientific/v1.0.0/schema.json", - "https://stac-extensions.github.io/item-assets/v1.0.0/schema.json", - "https://stac-extensions.github.io/table/v1.2.0/schema.json" - ], - "type": "Collection", - "links": [ - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_humidity_lm.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_humidity_lm_all_sites.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_precip_lm_all_sites.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_temp_lm.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_randfor.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_precip_lm.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_temp_lm_all_sites.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_ets.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_arima.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_lasso.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_lasso_all_sites.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_randfor_all_sites.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_tbats.json" - }, - { - "rel": "parent", - "type": "application/json", - "href": "../collection.json" - }, - { - "rel": "root", - "type": "application/json", - "href": "../collection.json" - }, - { - "rel": "self", - "type": "application/json", - "href": "collection.json" - }, - { - "rel": "cite-as", - "href": "https://doi.org/10.1002/fee.2616" - }, - { - "rel": "about", - "href": "www.neon4cast.org", - "type": "text/html", - "title": "NEON Ecological Forecasting Challenge Documentation" - }, - { - "rel": "describedby", - "href": "www.neon4cast.org", - "title": "NEON Ecological Forecasting Challenge Documentation", - "type": "text/html" - } - ], - "title": "richness_weekly", - "extent": { - "spatial": { - "bbox": [ - [ - -156.6194, - 71.2824, - -66.7987, - 71.2824 - ] - ] - }, - "temporal": { - "interval": [ - [ - "2021-05-17T00:00:00Z", - "2024-10-28T00:00:00Z" - ] - ] - } - }, - "table:columns": [ - { - "name": "reference_datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime that the forecast was initiated (horizon = 0)" - }, - { - "name": "datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime of the forecasted value (ISO 8601)" - }, - { - "name": "site_id", - "type": "string", - "description": "For forecasts that are not on a spatial grid, use of a site dimension that maps to a more detailed geometry (points, polygons, etc.) is allowable. In general this would be documented in the external metadata (e.g., alook-up table that provides lon and lat)" - }, - { - "name": "family", - "type": "string", - "description": "For ensembles: “ensemble.” Default value if unspecified for probability distributions: Name of the statistical distribution associated with the reported statistics. The “sample” distribution is synonymous with “ensemble.”For summary statistics: “summary.”" - }, - { - "name": "parameter", - "type": "string", - "description": "ensemble member or distribution parameter" - }, - { - "name": "prediction", - "type": "double", - "description": "predicted value for variable" - }, - { - "name": "pub_datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime that forecast was submitted" - }, - { - "name": "project_id", - "type": "string", - "description": "unique identifier for the forecast project" - }, - { - "name": "duration", - "type": "string", - "description": "temporal duration of forecast (hourly, daily, etc.); follows ISO 8601 duration convention" - }, - { - "name": "variable", - "type": "string", - "description": "name of forecasted variable" - }, - { - "name": "model_id", - "type": "string", - "description": "unique model identifier" - }, - { - "name": "reference_date", - "type": "string", - "description": "date that the forecast was initiated" - } - ], - "assets": { - "data": { - "href": "s3://anonymous@bio230014-bucket01/challenges/forecasts/parquet/project_id=neon4cast/duration=P1W/variable=richness?endpoint_override=sdsc.osn.xsede.org", - "type": "application/x-parquet", - "title": "Database Access", - "roles": [ - "data" - ], - "description": "Use `arrow` for remote access to the database. This R code will return results for the NEON Ecological Forecasting Aquatics theme.\n\n### R\n\n```{r}\n# Use code below\n\nall_results <- arrow::open_dataset(s3://anonymous@bio230014-bucket01/challenges/forecasts/parquet/project_id=neon4cast/duration=P1W/variable=richness?endpoint_override=sdsc.osn.xsede.org)\ndf <- all_results |> dplyr::collect()\n\n```\n \n\nYou can use dplyr operations before calling `dplyr::collect()` to `summarise`, `select` columns, and/or `filter` rows prior to pulling the data into a local `data.frame`. Reducing the data that is pulled locally will speed up the data download speed and reduce your memory usage.\n\n\n" - } - } -} diff --git a/catalog/forecasts/Phenology/Daily_Green_chromatic_coordinate/collection.json b/catalog/forecasts/Phenology/Daily_Green_chromatic_coordinate/collection.json deleted file mode 100644 index 3966205fb9..0000000000 --- a/catalog/forecasts/Phenology/Daily_Green_chromatic_coordinate/collection.json +++ /dev/null @@ -1,227 +0,0 @@ -{ - "id": "Daily_Green_chromatic_coordinate", - "description": "This page includes all models for the Daily_Green_chromatic_coordinate variable.", - "stac_version": "1.0.0", - "license": "CC0-1.0", - "stac_extensions": [ - "https://stac-extensions.github.io/scientific/v1.0.0/schema.json", - "https://stac-extensions.github.io/item-assets/v1.0.0/schema.json", - "https://stac-extensions.github.io/table/v1.2.0/schema.json" - ], - "type": "Collection", - "links": [ - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/cb_prophet.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/climatology.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/persistenceRW.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_bag_mlp.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_ets.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_humidity_lm.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_humidity_lm_all_sites.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_lasso.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_lasso_all_sites.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_precip_lm.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_arima.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_auto_adam.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_tbats.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_temp_lm.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_temp_lm_all_sites.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_precip_lm_all_sites.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_randfor.json" - }, - { - "rel": "parent", - "type": "application/json", - "href": "../collection.json" - }, - { - "rel": "root", - "type": "application/json", - "href": "../collection.json" - }, - { - "rel": "self", - "type": "application/json", - "href": "collection.json" - }, - { - "rel": "cite-as", - "href": "https://doi.org/10.1002/fee.2616" - }, - { - "rel": "about", - "href": "https://projects.ecoforecast.org/neon4cast-docs/", - "type": "text/html", - "title": "NEON Ecological Forecasting Challenge Documentation" - }, - { - "rel": "describedby", - "href": "https://projects.ecoforecast.org/neon4cast-docs/", - "title": "NEON Forecast Challenge Dashboard", - "type": "text/html" - } - ], - "title": "Daily_Green_chromatic_coordinate", - "extent": { - "spatial": { - "bbox": [ - [-156.6194, 17.9696, -66.8687, 71.2824] - ] - }, - "temporal": { - "interval": [ - [ - "2023-01-01T00:00:00Z", - "2024-01-21T00:00:00Z" - ] - ] - } - }, - "table:columns": [ - { - "name": "reference_datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime that the forecast was initiated (horizon = 0)" - }, - { - "name": "datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime of the forecasted value (ISO 8601)" - }, - { - "name": "site_id", - "type": "string", - "description": "For forecasts that are not on a spatial grid, use of a site dimension that maps to a more detailed geometry (points, polygons, etc.) is allowable. In general this would be documented in the external metadata (e.g., alook-up table that provides lon and lat)" - }, - { - "name": "family", - "type": "string", - "description": "For ensembles: “ensemble.” Default value if unspecified for probability distributions: Name of the statistical distribution associated with the reported statistics. The “sample” distribution is synonymous with “ensemble.”For summary statistics: “summary.”" - }, - { - "name": "parameter", - "type": "string", - "description": "ensemble member or distribution parameter" - }, - { - "name": "prediction", - "type": "double", - "description": "predicted value for variable" - }, - { - "name": "pub_datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime that forecast was submitted" - }, - { - "name": "project_id", - "type": "string", - "description": "unique identifier for the forecast project" - }, - { - "name": "duration", - "type": "string", - "description": "temporal duration of forecast (hourly, daily, etc.); follows ISO 8601 duration convention" - }, - { - "name": "variable", - "type": "string", - "description": "name of forecasted variable" - }, - { - "name": "model_id", - "type": "string", - "description": "unique model identifier" - }, - { - "name": "reference_date", - "type": "string", - "description": "date that the forecast was initiated" - } - ], - "assets": { - "data": { - "href": "\"s3://anonymous@bio230014-bucket01/challenges/forecasts/parquet/project_id=neon4cast/duration=P1D/variable=gcc_90?endpoint_override=sdsc.osn.xsede.org\"", - "type": "application/x-parquet", - "title": "Database Access", - "roles": [ - "data" - ], - "description": "Use `arrow` for remote access to the database. This R code will return results for forecasts of the variable by the specific model .\n\n### R\n\n```{r}\n# Use code below\n\nall_results <- arrow::open_dataset(\"s3://anonymous@bio230014-bucket01/challenges/forecasts/parquet/project_id=neon4cast/duration=P1D/variable=gcc_90?endpoint_override=sdsc.osn.xsede.org\")\ndf <- all_results |> dplyr::collect()\n\n```\n \n\nYou can use dplyr operations before calling `dplyr::collect()` to `summarise`, `select` columns, and/or `filter` rows prior to pulling the data into a local `data.frame`. Reducing the data that is pulled locally will speed up the data download speed and reduce your memory usage.\n\n\n" - }, - "thumbnail": { - "href": "pending", - "type": "image/JPEG", - "roles": [ - "thumbnail" - ], - "title": "pending" - } - } -} diff --git a/catalog/forecasts/Phenology/Daily_Red_chromatic_coordinate/collection.json b/catalog/forecasts/Phenology/Daily_Red_chromatic_coordinate/collection.json deleted file mode 100644 index 203ff2c4b8..0000000000 --- a/catalog/forecasts/Phenology/Daily_Red_chromatic_coordinate/collection.json +++ /dev/null @@ -1,242 +0,0 @@ -{ - "id": "Daily_Red_chromatic_coordinate", - "description": "This page includes all models for the Daily_Red_chromatic_coordinate variable.", - "stac_version": "1.0.0", - "license": "CC0-1.0", - "stac_extensions": [ - "https://stac-extensions.github.io/scientific/v1.0.0/schema.json", - "https://stac-extensions.github.io/item-assets/v1.0.0/schema.json", - "https://stac-extensions.github.io/table/v1.2.0/schema.json" - ], - "type": "Collection", - "links": [ - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_tbats.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/cb_prophet.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/climatology.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/persistenceRW.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/prophet_clim_ensemble.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_arima.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_bag_mlp.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_ets.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_temp_lm.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_temp_lm_all_sites.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/baseline_ensemble.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_humidity_lm.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_humidity_lm_all_sites.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_lasso.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_lasso_all_sites.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_precip_lm.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_precip_lm_all_sites.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_randfor.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_randfor_all_sites.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_auto_adam.json" - }, - { - "rel": "parent", - "type": "application/json", - "href": "../collection.json" - }, - { - "rel": "root", - "type": "application/json", - "href": "../collection.json" - }, - { - "rel": "self", - "type": "application/json", - "href": "collection.json" - }, - { - "rel": "cite-as", - "href": "https://doi.org/10.1002/fee.2616" - }, - { - "rel": "about", - "href": "https://projects.ecoforecast.org/neon4cast-docs/", - "type": "text/html", - "title": "NEON Ecological Forecasting Challenge Documentation" - }, - { - "rel": "describedby", - "href": "https://projects.ecoforecast.org/neon4cast-docs/", - "title": "NEON Forecast Challenge Dashboard", - "type": "text/html" - } - ], - "title": "Daily_Red_chromatic_coordinate", - "extent": { - "spatial": { - "bbox": [ - [-156.6194, 17.9696, -66.8687, 71.2824] - ] - }, - "temporal": { - "interval": [ - [ - "2023-01-01T00:00:00Z", - "2024-01-21T00:00:00Z" - ] - ] - } - }, - "table:columns": [ - { - "name": "reference_datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime that the forecast was initiated (horizon = 0)" - }, - { - "name": "datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime of the forecasted value (ISO 8601)" - }, - { - "name": "site_id", - "type": "string", - "description": "For forecasts that are not on a spatial grid, use of a site dimension that maps to a more detailed geometry (points, polygons, etc.) is allowable. In general this would be documented in the external metadata (e.g., alook-up table that provides lon and lat)" - }, - { - "name": "family", - "type": "string", - "description": "For ensembles: “ensemble.” Default value if unspecified for probability distributions: Name of the statistical distribution associated with the reported statistics. The “sample” distribution is synonymous with “ensemble.”For summary statistics: “summary.”" - }, - { - "name": "parameter", - "type": "string", - "description": "ensemble member or distribution parameter" - }, - { - "name": "prediction", - "type": "double", - "description": "predicted value for variable" - }, - { - "name": "pub_datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime that forecast was submitted" - }, - { - "name": "project_id", - "type": "string", - "description": "unique identifier for the forecast project" - }, - { - "name": "duration", - "type": "string", - "description": "temporal duration of forecast (hourly, daily, etc.); follows ISO 8601 duration convention" - }, - { - "name": "variable", - "type": "string", - "description": "name of forecasted variable" - }, - { - "name": "model_id", - "type": "string", - "description": "unique model identifier" - }, - { - "name": "reference_date", - "type": "string", - "description": "date that the forecast was initiated" - } - ], - "assets": { - "data": { - "href": "\"s3://anonymous@bio230014-bucket01/challenges/forecasts/parquet/project_id=neon4cast/duration=P1D/variable=rcc_90?endpoint_override=sdsc.osn.xsede.org\"", - "type": "application/x-parquet", - "title": "Database Access", - "roles": [ - "data" - ], - "description": "Use `arrow` for remote access to the database. This R code will return results for forecasts of the variable by the specific model .\n\n### R\n\n```{r}\n# Use code below\n\nall_results <- arrow::open_dataset(\"s3://anonymous@bio230014-bucket01/challenges/forecasts/parquet/project_id=neon4cast/duration=P1D/variable=rcc_90?endpoint_override=sdsc.osn.xsede.org\")\ndf <- all_results |> dplyr::collect()\n\n```\n \n\nYou can use dplyr operations before calling `dplyr::collect()` to `summarise`, `select` columns, and/or `filter` rows prior to pulling the data into a local `data.frame`. Reducing the data that is pulled locally will speed up the data download speed and reduce your memory usage.\n\n\n" - }, - "thumbnail": { - "href": "pending", - "type": "image/JPEG", - "roles": [ - "thumbnail" - ], - "title": "pending" - } - } -} diff --git a/catalog/forecasts/Phenology/collection.json b/catalog/forecasts/Phenology/collection.json deleted file mode 100644 index b230a43b84..0000000000 --- a/catalog/forecasts/Phenology/collection.json +++ /dev/null @@ -1,152 +0,0 @@ -{ - "id": "Phenology", - "description": "This page includes variables for the Phenology group.", - "stac_version": "1.0.0", - "license": "CC0-1.0", - "stac_extensions": [ - "https://stac-extensions.github.io/scientific/v1.0.0/schema.json", - "https://stac-extensions.github.io/item-assets/v1.0.0/schema.json", - "https://stac-extensions.github.io/table/v1.2.0/schema.json" - ], - "type": "Collection", - "links": [ - { - "rel": "child", - "type": "application/json", - "href": "Daily_Green_chromatic_coordinate/collection.json" - }, - { - "rel": "child", - "type": "application/json", - "href": "Daily_Red_chromatic_coordinate/collection.json" - }, - { - "rel": "parent", - "type": "application/json", - "href": "../collection.json" - }, - { - "rel": "root", - "type": "application/json", - "href": "../collection.json" - }, - { - "rel": "self", - "type": "application/json", - "href": "collection.json" - }, - { - "rel": "cite-as", - "href": "https://doi.org/10.1002/fee.2616" - }, - { - "rel": "about", - "href": "https://projects.ecoforecast.org/neon4cast-docs/", - "type": "text/html", - "title": "NEON Ecological Forecasting Challenge Documentation" - }, - { - "rel": "describedby", - "href": "https://projects.ecoforecast.org/neon4cast-docs/", - "title": "NEON Forecast Challenge Dashboard", - "type": "text/html" - } - ], - "title": "Phenology", - "extent": { - "spatial": { - "bbox": [ - [-156.6194, 17.9696, -66.8687, 71.2824] - ] - }, - "temporal": { - "interval": [ - [ - "2023-01-01T00:00:00Z", - "2024-12-09T00:00:00Z" - ] - ] - } - }, - "table:columns": [ - { - "name": "reference_datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime that the forecast was initiated (horizon = 0)" - }, - { - "name": "datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime of the forecasted value (ISO 8601)" - }, - { - "name": "site_id", - "type": "string", - "description": "For forecasts that are not on a spatial grid, use of a site dimension that maps to a more detailed geometry (points, polygons, etc.) is allowable. In general this would be documented in the external metadata (e.g., alook-up table that provides lon and lat)" - }, - { - "name": "family", - "type": "string", - "description": "For ensembles: “ensemble.” Default value if unspecified for probability distributions: Name of the statistical distribution associated with the reported statistics. The “sample” distribution is synonymous with “ensemble.”For summary statistics: “summary.”" - }, - { - "name": "parameter", - "type": "string", - "description": "ensemble member or distribution parameter" - }, - { - "name": "prediction", - "type": "double", - "description": "predicted value for variable" - }, - { - "name": "pub_datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime that forecast was submitted" - }, - { - "name": "project_id", - "type": "string", - "description": "unique identifier for the forecast project" - }, - { - "name": "duration", - "type": "string", - "description": "temporal duration of forecast (hourly, daily, etc.); follows ISO 8601 duration convention" - }, - { - "name": "variable", - "type": "string", - "description": "name of forecasted variable" - }, - { - "name": "model_id", - "type": "string", - "description": "unique model identifier" - }, - { - "name": "reference_date", - "type": "string", - "description": "date that the forecast was initiated" - } - ], - "assets": { - "data": { - "href": "\"s3://anonymous@bio230014-bucket01/challenges/forecasts/parquet/?endpoint_override=sdsc.osn.xsede.org\"", - "type": "application/x-parquet", - "title": "Database Access", - "roles": [ - "data" - ], - "description": "Use `arrow` for remote access to the database. This R code will return results for the NEON Ecological Forecasting Aquatics theme.\n\n### R\n\n```{r}\n# Use code below\n\nall_results <- arrow::open_dataset(\"s3://anonymous@bio230014-bucket01/challenges/forecasts/parquet/?endpoint_override=sdsc.osn.xsede.org\")\ndf <- all_results |>\n dplyr::filter(variable %in% c(\"gcc_90\", \"rcc_90\")) |>\n dplyr::collect()\n\n```\n \n\nYou can use dplyr operations before calling `dplyr::collect()` to `summarise`, `select` columns, and/or `filter` rows prior to pulling the data into a local `data.frame`. Reducing the data that is pulled locally will speed up the data download speed and reduce your memory usage.\n\n\n" - }, - "thumbnail": { - "href": "https://www.neonscience.org/sites/default/files/styles/max_1300x1300/public/image-content-images/_BFP8455.jpg", - "type": "image/JPEG", - "roles": [ - "thumbnail" - ], - "title": "Phenology Image" - } - } -} diff --git a/catalog/forecasts/Terrestrial/30min_latent_heat_flux/collection.json b/catalog/forecasts/Terrestrial/30min_latent_heat_flux/collection.json deleted file mode 100644 index 70aa66c100..0000000000 --- a/catalog/forecasts/Terrestrial/30min_latent_heat_flux/collection.json +++ /dev/null @@ -1,147 +0,0 @@ -{ - "id": "30min_latent_heat_flux", - "description": "This page includes all models for the 30min_latent_heat_flux variable.", - "stac_version": "1.0.0", - "license": "CC0-1.0", - "stac_extensions": [ - "https://stac-extensions.github.io/scientific/v1.0.0/schema.json", - "https://stac-extensions.github.io/item-assets/v1.0.0/schema.json", - "https://stac-extensions.github.io/table/v1.2.0/schema.json" - ], - "type": "Collection", - "links": [ - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/climatology.json" - }, - { - "rel": "parent", - "type": "application/json", - "href": "../collection.json" - }, - { - "rel": "root", - "type": "application/json", - "href": "../collection.json" - }, - { - "rel": "self", - "type": "application/json", - "href": "collection.json" - }, - { - "rel": "cite-as", - "href": "https://doi.org/10.1002/fee.2616" - }, - { - "rel": "about", - "href": "https://projects.ecoforecast.org/neon4cast-docs/", - "type": "text/html", - "title": "NEON Ecological Forecasting Challenge Documentation" - }, - { - "rel": "describedby", - "href": "https://projects.ecoforecast.org/neon4cast-docs/", - "title": "NEON Forecast Challenge Dashboard", - "type": "text/html" - } - ], - "title": "30min_latent_heat_flux", - "extent": { - "spatial": { - "bbox": [ - [-156.6194, 17.9696, -66.8687, 71.2824] - ] - }, - "temporal": { - "interval": [ - [ - "2023-11-14T00:00:00Z", - "2023-12-27T00:00:00Z" - ] - ] - } - }, - "table:columns": [ - { - "name": "reference_datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime that the forecast was initiated (horizon = 0)" - }, - { - "name": "datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime of the forecasted value (ISO 8601)" - }, - { - "name": "site_id", - "type": "string", - "description": "For forecasts that are not on a spatial grid, use of a site dimension that maps to a more detailed geometry (points, polygons, etc.) is allowable. In general this would be documented in the external metadata (e.g., alook-up table that provides lon and lat)" - }, - { - "name": "family", - "type": "string", - "description": "For ensembles: “ensemble.” Default value if unspecified for probability distributions: Name of the statistical distribution associated with the reported statistics. The “sample” distribution is synonymous with “ensemble.”For summary statistics: “summary.”" - }, - { - "name": "parameter", - "type": "string", - "description": "ensemble member or distribution parameter" - }, - { - "name": "prediction", - "type": "double", - "description": "predicted value for variable" - }, - { - "name": "pub_datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime that forecast was submitted" - }, - { - "name": "project_id", - "type": "string", - "description": "unique identifier for the forecast project" - }, - { - "name": "duration", - "type": "string", - "description": "temporal duration of forecast (hourly, daily, etc.); follows ISO 8601 duration convention" - }, - { - "name": "variable", - "type": "string", - "description": "name of forecasted variable" - }, - { - "name": "model_id", - "type": "string", - "description": "unique model identifier" - }, - { - "name": "reference_date", - "type": "string", - "description": "date that the forecast was initiated" - } - ], - "assets": { - "data": { - "href": "\"s3://anonymous@bio230014-bucket01/challenges/forecasts/parquet/project_id=neon4cast/duration=PT30M/variable=le?endpoint_override=sdsc.osn.xsede.org\"", - "type": "application/x-parquet", - "title": "Database Access", - "roles": [ - "data" - ], - "description": "Use `arrow` for remote access to the database. This R code will return results for forecasts of the variable by the specific model .\n\n### R\n\n```{r}\n# Use code below\n\nall_results <- arrow::open_dataset(\"s3://anonymous@bio230014-bucket01/challenges/forecasts/parquet/project_id=neon4cast/duration=PT30M/variable=le?endpoint_override=sdsc.osn.xsede.org\")\ndf <- all_results |> dplyr::collect()\n\n```\n \n\nYou can use dplyr operations before calling `dplyr::collect()` to `summarise`, `select` columns, and/or `filter` rows prior to pulling the data into a local `data.frame`. Reducing the data that is pulled locally will speed up the data download speed and reduce your memory usage.\n\n\n" - }, - "thumbnail": { - "href": "pending", - "type": "image/JPEG", - "roles": [ - "thumbnail" - ], - "title": "pending" - } - } -} diff --git a/catalog/forecasts/Terrestrial/Daily_Net_ecosystem_exchange/collection.json b/catalog/forecasts/Terrestrial/Daily_Net_ecosystem_exchange/collection.json deleted file mode 100644 index ea2cbe3edb..0000000000 --- a/catalog/forecasts/Terrestrial/Daily_Net_ecosystem_exchange/collection.json +++ /dev/null @@ -1,222 +0,0 @@ -{ - "id": "Daily_Net_ecosystem_exchange", - "description": "This page includes all models for the Daily_Net_ecosystem_exchange variable.", - "stac_version": "1.0.0", - "license": "CC0-1.0", - "stac_extensions": [ - "https://stac-extensions.github.io/scientific/v1.0.0/schema.json", - "https://stac-extensions.github.io/item-assets/v1.0.0/schema.json", - "https://stac-extensions.github.io/table/v1.2.0/schema.json" - ], - "type": "Collection", - "links": [ - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_precip_lm_all_sites.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_randfor.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_tbats.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_temp_lm.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_temp_lm_all_sites.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/cb_prophet.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/climatology.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/lasso.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/randfor.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_arima.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_ets.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_humidity_lm_all_sites.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_precip_lm.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_auto_adam.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_bag_mlp.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_humidity_lm.json" - }, - { - "rel": "parent", - "type": "application/json", - "href": "../collection.json" - }, - { - "rel": "root", - "type": "application/json", - "href": "../collection.json" - }, - { - "rel": "self", - "type": "application/json", - "href": "collection.json" - }, - { - "rel": "cite-as", - "href": "https://doi.org/10.1002/fee.2616" - }, - { - "rel": "about", - "href": "https://projects.ecoforecast.org/neon4cast-docs/", - "type": "text/html", - "title": "NEON Ecological Forecasting Challenge Documentation" - }, - { - "rel": "describedby", - "href": "https://projects.ecoforecast.org/neon4cast-docs/", - "title": "NEON Forecast Challenge Dashboard", - "type": "text/html" - } - ], - "title": "Daily_Net_ecosystem_exchange", - "extent": { - "spatial": { - "bbox": [ - [-156.6194, 17.9696, -66.8687, 71.2824] - ] - }, - "temporal": { - "interval": [ - [ - "2023-01-01T00:00:00Z", - "2024-01-22T00:00:00Z" - ] - ] - } - }, - "table:columns": [ - { - "name": "reference_datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime that the forecast was initiated (horizon = 0)" - }, - { - "name": "datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime of the forecasted value (ISO 8601)" - }, - { - "name": "site_id", - "type": "string", - "description": "For forecasts that are not on a spatial grid, use of a site dimension that maps to a more detailed geometry (points, polygons, etc.) is allowable. In general this would be documented in the external metadata (e.g., alook-up table that provides lon and lat)" - }, - { - "name": "family", - "type": "string", - "description": "For ensembles: “ensemble.” Default value if unspecified for probability distributions: Name of the statistical distribution associated with the reported statistics. The “sample” distribution is synonymous with “ensemble.”For summary statistics: “summary.”" - }, - { - "name": "parameter", - "type": "string", - "description": "ensemble member or distribution parameter" - }, - { - "name": "prediction", - "type": "double", - "description": "predicted value for variable" - }, - { - "name": "pub_datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime that forecast was submitted" - }, - { - "name": "project_id", - "type": "string", - "description": "unique identifier for the forecast project" - }, - { - "name": "duration", - "type": "string", - "description": "temporal duration of forecast (hourly, daily, etc.); follows ISO 8601 duration convention" - }, - { - "name": "variable", - "type": "string", - "description": "name of forecasted variable" - }, - { - "name": "model_id", - "type": "string", - "description": "unique model identifier" - }, - { - "name": "reference_date", - "type": "string", - "description": "date that the forecast was initiated" - } - ], - "assets": { - "data": { - "href": "\"s3://anonymous@bio230014-bucket01/challenges/forecasts/parquet/project_id=neon4cast/duration=P1D/variable=le?endpoint_override=sdsc.osn.xsede.org\"", - "type": "application/x-parquet", - "title": "Database Access", - "roles": [ - "data" - ], - "description": "Use `arrow` for remote access to the database. This R code will return results for forecasts of the variable by the specific model .\n\n### R\n\n```{r}\n# Use code below\n\nall_results <- arrow::open_dataset(\"s3://anonymous@bio230014-bucket01/challenges/forecasts/parquet/project_id=neon4cast/duration=P1D/variable=le?endpoint_override=sdsc.osn.xsede.org\")\ndf <- all_results |> dplyr::collect()\n\n```\n \n\nYou can use dplyr operations before calling `dplyr::collect()` to `summarise`, `select` columns, and/or `filter` rows prior to pulling the data into a local `data.frame`. Reducing the data that is pulled locally will speed up the data download speed and reduce your memory usage.\n\n\n" - }, - "thumbnail": { - "href": "pending", - "type": "image/JPEG", - "roles": [ - "thumbnail" - ], - "title": "pending" - } - } -} diff --git a/catalog/forecasts/Terrestrial/collection.json b/catalog/forecasts/Terrestrial/collection.json deleted file mode 100644 index 30e45f9667..0000000000 --- a/catalog/forecasts/Terrestrial/collection.json +++ /dev/null @@ -1,162 +0,0 @@ -{ - "id": "Terrestrial", - "description": "This page includes variables for the Terrestrial group.", - "stac_version": "1.0.0", - "license": "CC0-1.0", - "stac_extensions": [ - "https://stac-extensions.github.io/scientific/v1.0.0/schema.json", - "https://stac-extensions.github.io/item-assets/v1.0.0/schema.json", - "https://stac-extensions.github.io/table/v1.2.0/schema.json" - ], - "type": "Collection", - "links": [ - { - "rel": "child", - "type": "application/json", - "href": "Daily_Net_ecosystem_exchange/collection.json" - }, - { - "rel": "child", - "type": "application/json", - "href": "Daily_Net_ecosystem_exchange/collection.json" - }, - { - "rel": "child", - "type": "application/json", - "href": "30min_latent_heat_flux/collection.json" - }, - { - "rel": "child", - "type": "application/json", - "href": "30min_latent_heat_flux/collection.json" - }, - { - "rel": "parent", - "type": "application/json", - "href": "../collection.json" - }, - { - "rel": "root", - "type": "application/json", - "href": "../collection.json" - }, - { - "rel": "self", - "type": "application/json", - "href": "collection.json" - }, - { - "rel": "cite-as", - "href": "https://doi.org/10.1002/fee.2616" - }, - { - "rel": "about", - "href": "https://projects.ecoforecast.org/neon4cast-docs/", - "type": "text/html", - "title": "NEON Ecological Forecasting Challenge Documentation" - }, - { - "rel": "describedby", - "href": "https://projects.ecoforecast.org/neon4cast-docs/", - "title": "NEON Forecast Challenge Dashboard", - "type": "text/html" - } - ], - "title": "Terrestrial", - "extent": { - "spatial": { - "bbox": [ - [-156.6194, 17.9696, -66.8687, 71.2824] - ] - }, - "temporal": { - "interval": [ - [ - "2023-01-01T00:00:00Z", - "2024-12-09T00:00:00Z" - ] - ] - } - }, - "table:columns": [ - { - "name": "reference_datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime that the forecast was initiated (horizon = 0)" - }, - { - "name": "datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime of the forecasted value (ISO 8601)" - }, - { - "name": "site_id", - "type": "string", - "description": "For forecasts that are not on a spatial grid, use of a site dimension that maps to a more detailed geometry (points, polygons, etc.) is allowable. In general this would be documented in the external metadata (e.g., alook-up table that provides lon and lat)" - }, - { - "name": "family", - "type": "string", - "description": "For ensembles: “ensemble.” Default value if unspecified for probability distributions: Name of the statistical distribution associated with the reported statistics. The “sample” distribution is synonymous with “ensemble.”For summary statistics: “summary.”" - }, - { - "name": "parameter", - "type": "string", - "description": "ensemble member or distribution parameter" - }, - { - "name": "prediction", - "type": "double", - "description": "predicted value for variable" - }, - { - "name": "pub_datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime that forecast was submitted" - }, - { - "name": "project_id", - "type": "string", - "description": "unique identifier for the forecast project" - }, - { - "name": "duration", - "type": "string", - "description": "temporal duration of forecast (hourly, daily, etc.); follows ISO 8601 duration convention" - }, - { - "name": "variable", - "type": "string", - "description": "name of forecasted variable" - }, - { - "name": "model_id", - "type": "string", - "description": "unique model identifier" - }, - { - "name": "reference_date", - "type": "string", - "description": "date that the forecast was initiated" - } - ], - "assets": { - "data": { - "href": "\"s3://anonymous@bio230014-bucket01/challenges/forecasts/parquet/?endpoint_override=sdsc.osn.xsede.org\"", - "type": "application/x-parquet", - "title": "Database Access", - "roles": [ - "data" - ], - "description": "Use `arrow` for remote access to the database. This R code will return results for the NEON Ecological Forecasting Aquatics theme.\n\n### R\n\n```{r}\n# Use code below\n\nall_results <- arrow::open_dataset(\"s3://anonymous@bio230014-bucket01/challenges/forecasts/parquet/?endpoint_override=sdsc.osn.xsede.org\")\ndf <- all_results |>\n dplyr::filter(variable %in% c(\"nee\", \"le\")) |>\n dplyr::collect()\n\n```\n \n\nYou can use dplyr operations before calling `dplyr::collect()` to `summarise`, `select` columns, and/or `filter` rows prior to pulling the data into a local `data.frame`. Reducing the data that is pulled locally will speed up the data download speed and reduce your memory usage.\n\n\n" - }, - "thumbnail": { - "href": "https://projects.ecoforecast.org/neon4cast-catalog/img/BONA_Twr.jpg", - "type": "image/JPEG", - "roles": [ - "thumbnail" - ], - "title": "NEON Field Tower" - } - } -} diff --git a/catalog/forecasts/Ticks/Weekly_Amblyomma_americanum_population/collection.json b/catalog/forecasts/Ticks/Weekly_Amblyomma_americanum_population/collection.json deleted file mode 100644 index 3252276e36..0000000000 --- a/catalog/forecasts/Ticks/Weekly_Amblyomma_americanum_population/collection.json +++ /dev/null @@ -1,212 +0,0 @@ -{ - "id": "Weekly_Amblyomma_americanum_population", - "description": "This page includes all models for the Weekly_Amblyomma_americanum_population variable.", - "stac_version": "1.0.0", - "license": "CC0-1.0", - "stac_extensions": [ - "https://stac-extensions.github.io/scientific/v1.0.0/schema.json", - "https://stac-extensions.github.io/item-assets/v1.0.0/schema.json", - "https://stac-extensions.github.io/table/v1.2.0/schema.json" - ], - "type": "Collection", - "links": [ - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_tbats.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_arima.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_ets.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_humidity_lm_all_sites.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_precip_lm.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_randfor.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_temp_lm.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_randfor_all_sites.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_temp_lm_all_sites.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_humidity_lm.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_lasso.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_lasso_all_sites.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_precip_lm_all_sites.json" - }, - { - "rel": "item", - "type": "application/json", - "href": "../../models/model_items/tg_auto_adam.json" - }, - { - "rel": "parent", - "type": "application/json", - "href": "../collection.json" - }, - { - "rel": "root", - "type": "application/json", - "href": "../collection.json" - }, - { - "rel": "self", - "type": "application/json", - "href": "collection.json" - }, - { - "rel": "cite-as", - "href": "https://doi.org/10.1002/fee.2616" - }, - { - "rel": "about", - "href": "https://projects.ecoforecast.org/neon4cast-docs/", - "type": "text/html", - "title": "NEON Ecological Forecasting Challenge Documentation" - }, - { - "rel": "describedby", - "href": "https://projects.ecoforecast.org/neon4cast-docs/", - "title": "NEON Forecast Challenge Dashboard", - "type": "text/html" - } - ], - "title": "Weekly_Amblyomma_americanum_population", - "extent": { - "spatial": { - "bbox": [ - [-96.5631, 29.6893, -76.56, 39.1008] - ] - }, - "temporal": { - "interval": [ - [ - "2023-01-02T00:00:00Z", - "2024-12-09T00:00:00Z" - ] - ] - } - }, - "table:columns": [ - { - "name": "reference_datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime that the forecast was initiated (horizon = 0)" - }, - { - "name": "datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime of the forecasted value (ISO 8601)" - }, - { - "name": "site_id", - "type": "string", - "description": "For forecasts that are not on a spatial grid, use of a site dimension that maps to a more detailed geometry (points, polygons, etc.) is allowable. In general this would be documented in the external metadata (e.g., alook-up table that provides lon and lat)" - }, - { - "name": "family", - "type": "string", - "description": "For ensembles: “ensemble.” Default value if unspecified for probability distributions: Name of the statistical distribution associated with the reported statistics. The “sample” distribution is synonymous with “ensemble.”For summary statistics: “summary.”" - }, - { - "name": "parameter", - "type": "string", - "description": "ensemble member or distribution parameter" - }, - { - "name": "prediction", - "type": "double", - "description": "predicted value for variable" - }, - { - "name": "pub_datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime that forecast was submitted" - }, - { - "name": "project_id", - "type": "string", - "description": "unique identifier for the forecast project" - }, - { - "name": "duration", - "type": "string", - "description": "temporal duration of forecast (hourly, daily, etc.); follows ISO 8601 duration convention" - }, - { - "name": "variable", - "type": "string", - "description": "name of forecasted variable" - }, - { - "name": "model_id", - "type": "string", - "description": "unique model identifier" - }, - { - "name": "reference_date", - "type": "string", - "description": "date that the forecast was initiated" - } - ], - "assets": { - "data": { - "href": "\"s3://anonymous@bio230014-bucket01/challenges/forecasts/parquet/project_id=neon4cast/duration=P1W/variable=amblyomma_americanum?endpoint_override=sdsc.osn.xsede.org\"", - "type": "application/x-parquet", - "title": "Database Access", - "roles": [ - "data" - ], - "description": "Use `arrow` for remote access to the database. This R code will return results for forecasts of the variable by the specific model .\n\n### R\n\n```{r}\n# Use code below\n\nall_results <- arrow::open_dataset(\"s3://anonymous@bio230014-bucket01/challenges/forecasts/parquet/project_id=neon4cast/duration=P1W/variable=amblyomma_americanum?endpoint_override=sdsc.osn.xsede.org\")\ndf <- all_results |> dplyr::collect()\n\n```\n \n\nYou can use dplyr operations before calling `dplyr::collect()` to `summarise`, `select` columns, and/or `filter` rows prior to pulling the data into a local `data.frame`. Reducing the data that is pulled locally will speed up the data download speed and reduce your memory usage.\n\n\n" - }, - "thumbnail": { - "href": "pending", - "type": "image/JPEG", - "roles": [ - "thumbnail" - ], - "title": "pending" - } - } -} diff --git a/catalog/forecasts/Ticks/collection.json b/catalog/forecasts/Ticks/collection.json deleted file mode 100644 index 4e202c6b69..0000000000 --- a/catalog/forecasts/Ticks/collection.json +++ /dev/null @@ -1,147 +0,0 @@ -{ - "id": "Ticks", - "description": "This page includes variables for the Ticks group.", - "stac_version": "1.0.0", - "license": "CC0-1.0", - "stac_extensions": [ - "https://stac-extensions.github.io/scientific/v1.0.0/schema.json", - "https://stac-extensions.github.io/item-assets/v1.0.0/schema.json", - "https://stac-extensions.github.io/table/v1.2.0/schema.json" - ], - "type": "Collection", - "links": [ - { - "rel": "child", - "type": "application/json", - "href": "Weekly_Amblyomma_americanum_population/collection.json" - }, - { - "rel": "parent", - "type": "application/json", - "href": "../collection.json" - }, - { - "rel": "root", - "type": "application/json", - "href": "../collection.json" - }, - { - "rel": "self", - "type": "application/json", - "href": "collection.json" - }, - { - "rel": "cite-as", - "href": "https://doi.org/10.1002/fee.2616" - }, - { - "rel": "about", - "href": "https://projects.ecoforecast.org/neon4cast-docs/", - "type": "text/html", - "title": "NEON Ecological Forecasting Challenge Documentation" - }, - { - "rel": "describedby", - "href": "https://projects.ecoforecast.org/neon4cast-docs/", - "title": "NEON Forecast Challenge Dashboard", - "type": "text/html" - } - ], - "title": "Ticks", - "extent": { - "spatial": { - "bbox": [ - [-96.5631, 29.6893, -76.56, 39.1008] - ] - }, - "temporal": { - "interval": [ - [ - "2023-01-01T00:00:00Z", - "2024-12-09T00:00:00Z" - ] - ] - } - }, - "table:columns": [ - { - "name": "reference_datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime that the forecast was initiated (horizon = 0)" - }, - { - "name": "datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime of the forecasted value (ISO 8601)" - }, - { - "name": "site_id", - "type": "string", - "description": "For forecasts that are not on a spatial grid, use of a site dimension that maps to a more detailed geometry (points, polygons, etc.) is allowable. In general this would be documented in the external metadata (e.g., alook-up table that provides lon and lat)" - }, - { - "name": "family", - "type": "string", - "description": "For ensembles: “ensemble.” Default value if unspecified for probability distributions: Name of the statistical distribution associated with the reported statistics. The “sample” distribution is synonymous with “ensemble.”For summary statistics: “summary.”" - }, - { - "name": "parameter", - "type": "string", - "description": "ensemble member or distribution parameter" - }, - { - "name": "prediction", - "type": "double", - "description": "predicted value for variable" - }, - { - "name": "pub_datetime", - "type": "timestamp[us, tz=UTC]", - "description": "datetime that forecast was submitted" - }, - { - "name": "project_id", - "type": "string", - "description": "unique identifier for the forecast project" - }, - { - "name": "duration", - "type": "string", - "description": "temporal duration of forecast (hourly, daily, etc.); follows ISO 8601 duration convention" - }, - { - "name": "variable", - "type": "string", - "description": "name of forecasted variable" - }, - { - "name": "model_id", - "type": "string", - "description": "unique model identifier" - }, - { - "name": "reference_date", - "type": "string", - "description": "date that the forecast was initiated" - } - ], - "assets": { - "data": { - "href": "\"s3://anonymous@bio230014-bucket01/challenges/forecasts/parquet/?endpoint_override=sdsc.osn.xsede.org\"", - "type": "application/x-parquet", - "title": "Database Access", - "roles": [ - "data" - ], - "description": "Use `arrow` for remote access to the database. This R code will return results for the NEON Ecological Forecasting Aquatics theme.\n\n### R\n\n```{r}\n# Use code below\n\nall_results <- arrow::open_dataset(\"s3://anonymous@bio230014-bucket01/challenges/forecasts/parquet/?endpoint_override=sdsc.osn.xsede.org\")\ndf <- all_results |>\n dplyr::filter(variable %in% c(\"amblyomma_americanum\")) |>\n dplyr::collect()\n\n```\n \n\nYou can use dplyr operations before calling `dplyr::collect()` to `summarise`, `select` columns, and/or `filter` rows prior to pulling the data into a local `data.frame`. Reducing the data that is pulled locally will speed up the data download speed and reduce your memory usage.\n\n\n" - }, - "thumbnail": { - "href": "https://raw.githubusercontent.com/eco4cast/neon4cast-ci/main/catalog/thumbnail_plots/tick_drag.jpg", - "type": "image/JPEG", - "roles": [ - "thumbnail" - ], - "title": "NEON Ticks" - } - } -} From fdb3bc3d062a42e49a5ac76d059536c8b51443da Mon Sep 17 00:00:00 2001 From: Zwart Date: Tue, 19 Dec 2023 11:59:05 -0800 Subject: [PATCH 19/26] modifying quarto docs --- dashboard/_quarto.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dashboard/_quarto.yml b/dashboard/_quarto.yml index 70b0568fc6..49ffd6801d 100644 --- a/dashboard/_quarto.yml +++ b/dashboard/_quarto.yml @@ -3,9 +3,9 @@ project: output-dir: docs website: - title: "NEON Ecological Forecast Challenge" + title: "EFI-USGS River Chlorophyll Forecast Challenge" page-navigation: true - repo-url: https://github.com/eco4cast/neon4cast-ci + repo-url: https://github.com/eco4cast/usgsrc4cast-ci repo-actions: [source, issue] navbar: @@ -26,7 +26,7 @@ website: left: "CC-BY" right: - icon: github - href: https://github.com/eco4cast/neon4cast-ci + href: https://github.com/eco4cast/usgsrc4cast-ci format: html: From 3f25f21466107db0b5e25a529743af7301155d1f Mon Sep 17 00:00:00 2001 From: Zwart Date: Tue, 19 Dec 2023 12:03:42 -0800 Subject: [PATCH 20/26] removing targets not used --- challenge_configuration.yaml | 45 ++++++++---------------------------- 1 file changed, 9 insertions(+), 36 deletions(-) diff --git a/challenge_configuration.yaml b/challenge_configuration.yaml index b3d4776a55..4bf31fc518 100644 --- a/challenge_configuration.yaml +++ b/challenge_configuration.yaml @@ -16,10 +16,11 @@ model_metadata_bucket: bio230014-bucket01/challenges/metadata/model_id model_metadata_gsheet: https://docs.google.com/spreadsheets/d/1f177dpaxLzc4UuQ4_SJV9JWIbQPlilVnEztyvZE6aSU/edit?usp=sharing example_model_id: example site_path: 'catalog/sites' -site_table: neon4cast_field_site_metadata.csv -site_thumbnail: 'https://www.neonscience.org/sites/default/files/styles/max_2600x2600/public/2021-04/2021_04_graphic_Domain_Map_no-Titles-png.png?itok=7MsHPigZ' -site_thumbnail_title: "NEON Sites Map" -site_table_link: 'https://raw.githubusercontent.com/eco4cast/neon4cast-ci/main/neon4cast_field_site_metadata.csv' +site_table: USGS_site_metadata.csv +site_thumbnail: 'https://d9-wret.s3.us-west-2.amazonaws.com/assets/palladium/production/s3fs-public/thumbnails/image/screencapture-waterdata-usgs-gov-nwis-rt-2018-08-02-13_00_05-01.jpg' +site_thumbnail_title: "USGS Sites Map" +site_table_link: 'https://raw.githubusercontent.com/eco4cast/neon4cast-ci/main/USGS_site_metadata.csv' +# TODO: update below target_metadata_gsheet: https://docs.google.com/spreadsheets/d/10YTX9ae_C1rFdLgEDkUcCRCpUkVYv06leY01BtD1BgM/edit?usp=sharing targets_thumbnail: 'https://raw.githubusercontent.com/eco4cast/neon4cast-ci/main/catalog/thumbnail_plots/neon_stream.jpg' targets_thumbnail_title: 'Test Image' @@ -29,42 +30,14 @@ github_repo: eco4cast/usgsrc4cast-ci target_groups: Aquatics: targets_file: "https://data.ecoforecast.org/neon4cast-targets/aquatics/aquatics-targets.csv.gz" - Terrestrial: - targets_file: "https://data.ecoforecast.org/neon4cast-targets/terrestrial/terrestrial-targets.csv.gz" - Beetles: - targets_file: "https://data.ecoforecast.org/neon4cast-targets/beetles/beetles-targets.csv.gz" - Phenology: - targets_file: "https://data.ecoforecast.org/neon4cast-targets/phenology/phenology-targets.csv.gz" - Ticks: - targets_file: "https://data.ecoforecast.org/neon4cast-targets/ticks/ticks-targets.csv.gz" noaa_forecast_groups: ['Pseudo','Stage1-stats','Stage1','Stage2','Stage3'] noaa_forecast_group_paths: ['pseudo','stage1-stats','stage1','stage2','stage3'] variable_groups: Aquatics: - variable: ['oxygen','temperature','chla'] - duration: ['P1D','P1D','P1D'] - thumbnail_link: 'https://projects.ecoforecast.org/neon4cast-catalog/img/neon_buoy.jpg' - thumbnail_title: 'NEON Aquatics Buoy' - Terrestrial: - variable: ['nee','le','nee','le'] - duration: ['P1D','P1D','PT30M','PT30M'] - thumbnail_link: 'https://projects.ecoforecast.org/neon4cast-catalog/img/BONA_Twr.jpg' - thumbnail_title: 'NEON Field Tower' - Phenology: - variable: ['gcc_90','rcc_90'] - duration: ['P1D','P1D'] - thumbnail_link: 'https://www.neonscience.org/sites/default/files/styles/max_1300x1300/public/image-content-images/_BFP8455.jpg' - thumbnail_title: 'Phenology Image' - Beetles: - variable: ['abundance', 'richness'] - duration: ['P1W','P1W'] - thumbnail_link: 'https://www.neonscience.org/sites/default/files/styles/max_width_1170px/public/image-content-images/Beetles_pinned.jpg' - thumbnail_title: 'Beetle Image' - Ticks: - variable: ['amblyomma_americanum'] - duration: ['P1W'] - thumbnail_link: 'https://raw.githubusercontent.com/eco4cast/neon4cast-ci/main/catalog/thumbnail_plots/tick_drag.jpg' - thumbnail_title: 'NEON Ticks' + variable: ['chla'] + duration: ['P1D'] + thumbnail_link: 'https://d9-wret.s3.us-west-2.amazonaws.com/assets/palladium/production/s3fs-public/thumbnails/image/Back-b.jpg' + thumbnail_title: 'USGS Streamgage' catalog_config: about_string: 'https://projects.ecoforecast.org/neon4cast-docs/' about_title: 'NEON Ecological Forecasting Challenge Documentation' From 93963cf25603d8fac4637f649dd9db0204335c88 Mon Sep 17 00:00:00 2001 From: Zwart Date: Tue, 19 Dec 2023 12:25:59 -0800 Subject: [PATCH 21/26] adding usgs logo for banner - note that we can only use this as this is official collaboration with usgs --- catalog/catalog.json | 6 ++-- challenge_configuration.yaml | 44 ++++++++++++++++-------------- dashboard/img/USGS_logo_green.png | Bin 0 -> 116068 bytes 3 files changed, 26 insertions(+), 24 deletions(-) create mode 100644 dashboard/img/USGS_logo_green.png diff --git a/catalog/catalog.json b/catalog/catalog.json index d4b4b271b2..b06b062dec 100644 --- a/catalog/catalog.json +++ b/catalog/catalog.json @@ -1,8 +1,8 @@ { "type": "Catalog", - "id": "neon4cast-stac", - "title": "NEON Ecological Forecasting Challenge Catalog", - "description": "A STAC (Spatiotemporal Asset Catalog) describing forecasts and forecast scores for the neon4cast Forecasting Challenge", + "id": "usgsrc4cast-stac", + "title": "EFI-USGS River Chlorophyll Forecasting Challenge Catalog", + "description": "A STAC (Spatiotemporal Asset Catalog) describing forecasts and forecast scores for the usgsrc4cast Forecasting Challenge", "stac_version": "1.0.0", "conformsTo": "conformsTo", "links": [ diff --git a/challenge_configuration.yaml b/challenge_configuration.yaml index 4bf31fc518..d5c9dea0b5 100644 --- a/challenge_configuration.yaml +++ b/challenge_configuration.yaml @@ -19,12 +19,13 @@ site_path: 'catalog/sites' site_table: USGS_site_metadata.csv site_thumbnail: 'https://d9-wret.s3.us-west-2.amazonaws.com/assets/palladium/production/s3fs-public/thumbnails/image/screencapture-waterdata-usgs-gov-nwis-rt-2018-08-02-13_00_05-01.jpg' site_thumbnail_title: "USGS Sites Map" -site_table_link: 'https://raw.githubusercontent.com/eco4cast/neon4cast-ci/main/USGS_site_metadata.csv' +site_table_link: 'https://raw.githubusercontent.com/eco4cast/usgsrc4cast-ci/main/USGS_site_metadata.csv' # TODO: update below target_metadata_gsheet: https://docs.google.com/spreadsheets/d/10YTX9ae_C1rFdLgEDkUcCRCpUkVYv06leY01BtD1BgM/edit?usp=sharing targets_thumbnail: 'https://raw.githubusercontent.com/eco4cast/neon4cast-ci/main/catalog/thumbnail_plots/neon_stream.jpg' targets_thumbnail_title: 'Test Image' targets_path: 'catalog/targets/' +## challenge_url: https://projects.ecoforecast.org/usgsrc4cast-ci github_repo: eco4cast/usgsrc4cast-ci target_groups: @@ -39,37 +40,38 @@ variable_groups: thumbnail_link: 'https://d9-wret.s3.us-west-2.amazonaws.com/assets/palladium/production/s3fs-public/thumbnails/image/Back-b.jpg' thumbnail_title: 'USGS Streamgage' catalog_config: - about_string: 'https://projects.ecoforecast.org/neon4cast-docs/' - about_title: 'NEON Ecological Forecasting Challenge Documentation' - scores_thumbnail: "https://raw.githubusercontent.com/eco4cast/neon4cast-ci/main/catalog/thumbnail_plots/52760199990_d1a0f154fe_c.jpg" - scores_thumbnail_title: "NEON Buoy Image" - forecasts_thumbnail: "https://raw.githubusercontent.com/eco4cast/neon4cast-ci/main/catalog/thumbnail_plots/51629805865_0ef01ffbbc_c.jpg" - forecasts_thumbnail_title: "NEON Buoy Image" + about_string: 'https://projects.ecoforecast.org/usgsrc4cast-docs/' + about_title: 'EFI-USGS River Chlorophyll Forecasting Challenge Documentation' + scores_thumbnail: "https://d9-wret.s3.us-west-2.amazonaws.com/assets/palladium/production/s3fs-public/thumbnails/image/Back-b.jpg" + scores_thumbnail_title: "USGS Streamgage" + forecasts_thumbnail: "https://d9-wret.s3.us-west-2.amazonaws.com/assets/palladium/production/s3fs-public/thumbnails/image/Back-b.jpg" + forecasts_thumbnail_title: "USGS Streamgage" forecast_path: 'catalog/forecasts/' scores_path: 'catalog/scores/' summaries_path: 'catalog/summaries/' - summaries_thumbnail: 'https://raw.githubusercontent.com/eco4cast/neon4cast-ci/main/catalog/thumbnail_plots/neon_desert.jpg' - summaries_thumbnail_title: "NEON Image" + # here + summaries_thumbnail: 'https://d9-wret.s3.us-west-2.amazonaws.com/assets/palladium/production/s3fs-public/thumbnails/image/Manual%20measurement%20streamgage.jpg' + summaries_thumbnail_title: "USGS Image" inventory_path: 'catalog/inventory' - inventory_thumbnail: 'https://raw.githubusercontent.com/eco4cast/neon4cast-ci/main/catalog/thumbnail_plots/neon_forest.jpg' - inventory_thumbnail_title: "NEON Image" + inventory_thumbnail: 'https://d9-wret.s3.us-west-2.amazonaws.com/assets/palladium/production/s3fs-public/thumbnails/image/Streamgaging%20Basics%20photo%20showing%20Acoustic%20Doppler%20Current%20Profiler2.jpg' + inventory_thumbnail_title: "USGS Image" noaa_path: 'catalog/noaa_forecasts/' - noaa_thumbnail: 'https://raw.githubusercontent.com/eco4cast/neon4cast-ci/main/catalog/thumbnail_plots/neon_wetland.jpg' - noaa_thumbnail_title: "NEON Image" + noaa_thumbnail: 'https://d9-wret.s3.us-west-2.amazonaws.com/assets/palladium/production/s3fs-public/DSC_0001.jpg' + noaa_thumbnail_title: "USGS Image" aws_download_path_forecasts: 'bio230014-bucket01/challenges/forecasts/parquet/' aws_download_path_scores: 'bio230014-bucket01/challenges/scores/parquet/' summaries_download_path: 'bio230014-bucket01/vera4cast/forecasts/summaries/parquet/' host_url: "https://www.ecoforecastprojectvt.org" host_name: "Ecoforecast Challenge" bbox: - max_lat: 71.2824 - min_lat: 17.9696 - max_lon: -66.7987 - min_lon: -156.6194 + max_lat: 45.5175 + min_lat: 39.6327 + max_lon: -74.7781 + min_lon: -122.6692 site_type: 'MultiPoint' - base_image_path: 'https://data.ecoforecast.org/neon4cast-catalog' + base_image_path: 'https://data.ecoforecast.org/usgsrc4cast-catalog' citation_doi: "https://doi.org/10.1002/fee.2616" citation_text: "Thomas, R.Q., C. Boettiger, C.C. Carey, M.C. Dietze, L.R. Johnson, M.A. Kenney, J.S. Mclachlan, J.A. Peters, E.R. Sokol, J.F. Weltzin, A. Willson, W.M. Woelmer, and Challenge Contributors. 2023. The NEON Ecological Forecasting Challenge. Frontiers in Ecology and Environment 21: 112-113." - dashboard_url: "https://projects.ecoforecast.org/neon4cast-docs/" - dashboard_title: "NEON Forecast Challenge Dashboard" - site_metadata_url: 'https://raw.githubusercontent.com/eco4cast/neon4cast-ci/main/neon4cast_field_site_metadata.csv' + dashboard_url: "https://projects.ecoforecast.org/usgsrc4cast-docs/" + dashboard_title: "EFI-USGS River Chlorophyll Forecast Challenge Dashboard" + site_metadata_url: 'https://raw.githubusercontent.com/eco4cast/usgsrc4cast-ci/main/USGS_site_metadata.csv' diff --git a/dashboard/img/USGS_logo_green.png b/dashboard/img/USGS_logo_green.png new file mode 100644 index 0000000000000000000000000000000000000000..d7c1d199d4db63ca29e649d00495a32af6fd8a94 GIT binary patch literal 116068 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 bIN*$qv&IHDLfFpTwW6-_Oc|p1>h1pn2DW~? literal 0 HcmV?d00001 From d21273160420fd9e522890cae96b8e952f68af80 Mon Sep 17 00:00:00 2001 From: Zwart Date: Tue, 19 Dec 2023 16:02:18 -0800 Subject: [PATCH 22/26] updating for usgs challenge --- R/access_model_metadata.R | 2 +- dashboard/_quarto.yml | 2 +- dashboard/catalog.qmd | 2 +- dashboard/img/banner.jpg | Bin 71995 -> 0 bytes dashboard/index.qmd | 4 ++-- dashboard/targets.qmd | 4 ---- drivers/download_stage1_psuedo.R | 15 +++------------ drivers/generate_stage2.R | 20 +++++++++++++------- drivers/generate_stage3.R | 9 +++++---- drivers/update_stage3.R | 8 ++++---- scoring/build_score_inventory.R | 13 +++++++++---- scoring/scoring.R | 19 +++++++++++++------ targets/_targets.R | 2 ++ 13 files changed, 54 insertions(+), 46 deletions(-) delete mode 100644 dashboard/img/banner.jpg diff --git a/R/access_model_metadata.R b/R/access_model_metadata.R index 7a249299e3..8460bd7e2a 100644 --- a/R/access_model_metadata.R +++ b/R/access_model_metadata.R @@ -1,4 +1,4 @@ -s3 <- arrow::s3_bucket(bucket = "bio230121-bucket01/vera4cast/metadata/model_id/", +s3 <- arrow::s3_bucket(bucket = "bio230121-bucket01/vera4cast/metadata/model_id/", # update from vera4cast? endpoint_override = "renc.osn.xsede.org", anonymous = TRUE) d1 <- arrow::open_dataset(s3, format = "json") |> dplyr::collect() diff --git a/dashboard/_quarto.yml b/dashboard/_quarto.yml index 49ffd6801d..0964e2146e 100644 --- a/dashboard/_quarto.yml +++ b/dashboard/_quarto.yml @@ -33,7 +33,7 @@ format: theme: [sandstone, custom.scss] css: styles.css title-block-style: default - title-block-banner: "img/banner.jpg" + title-block-banner: "img/USGS_logo_green.png" title-block-banner-color: white page-layout: full toc: true diff --git a/dashboard/catalog.qmd b/dashboard/catalog.qmd index 3211b74f41..33501912f3 100644 --- a/dashboard/catalog.qmd +++ b/dashboard/catalog.qmd @@ -29,7 +29,7 @@ The catalog of submitted forecasts and the evaluation of the forecasts ("scores" The catalog provides the code that you can use to access forecasts and scores.\ -A full page version can be found [here](https://radiantearth.github.io/stac-browser/#/external/raw.githubusercontent.com/eco4cast/neon4cast-ci/main/catalog/catalog.json)\ +A full page version can be found [here](https://radiantearth.github.io/stac-browser/#/external/raw.githubusercontent.com/eco4cast/usgsrc4cast-ci/main/catalog/catalog.json)\

diff --git a/dashboard/img/banner.jpg b/dashboard/img/banner.jpg deleted file mode 100644 index a55b76feb299b76bf2b3093279a86e66daf0ed44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71995 zcmeFYby(D2*DpMj5~6~HAl)^@z<>;0LnGaYFh%DKC5R#-4MR#QT?0s``ct~4)1*U` z6cpin@fY`fo%5XMde8Ikd+*^pd(GZ!t-aRTF?)YDb2fAK5p-1tt_=qf5fOpz058zl zC(2-r0B1A^q^&IkA_swh=Q0s72nJ9dz(Y$!0wMzP^M{#;>~~%Y&^P{~p98eOUp&MB zEdj_<19>y>KmeK!$h(2Z`7!Bl**SoQ0m{^jHB?M*8N)a*NU)0+3d7+iAu7%xfb(_s zz;I~mXmaQnYG`u!NkarhIJ|KVZqC?14h4>zP|9J>!18s^! zATV)hn7Ay5gcM9l1_qS`5rZOA9M$`XApYstB|EZ@I;3xizetq6SKqCMBI{Wwj z1O(1oJevopfygghxOjn#{Nlxn6cpr?m*}W3QBhrDqP=#7j+L36jg^^&g@Z?wpMy(; zn}tO{Mo>gtLP|=ConKbrCPZFTQVMdegouKI;u6)R>(tcOA)G9nkpJg&_6LZD9K=op zILiehrXeDsAv)^>0g)gg14iHZ0Q@Tv5tERTUARb2K}iKLG+aH86bUgY2^kqFDZm{9 z)PqQA$Y?nwR4!aIa=6IlO$T{^&m-qnt$9svJo=4C($Oc3f|7ypIukQ5AHRU0kQ7u} z=B6x6OkO|gZDKq$OCdZ zReWB}YYJ{j<8SniKBJTjJW`){cg|h=?b-h~$HM+cp8ez4zx0&EDUzjC{w8R=z-SQdTs8xfFWM z3gViUas3b0-8Xr#UoR=x?3;%4Rib(qMk=oKhxy1loPmO;6@Q$#HCs8{3SOmqY+>AT zI$m#I&i<{Ww`(x&*E4^*Wy&D36W1)*Q0uQRw=bQ6YQxV!I+h1N-9Bzy(ky?YR9e#C z*9wz18ecvsXLxiasLxJk%JJ4=O2POtabCJ%l;wjE!4nM%ar8(^c>oW4cj7PK0|IIy zA9ST@;0#zCCctG~xgLd{dF-DI2Gj5_mAA>H%0q;+vy2yr7$G0AOQDZU-3?1L(LXYa z7<7$b`Pb?ah7&)*buR@a+j`FPpnDw>f}?9LRV{H3#*BC;3huuAJYF;L*kpk{uef25 z+-ofVsULkxnqMV_vq$Q$6tZ7V5hJ(WwX9xee{(y39VeXJ+xnv`*4WLpxg#XBlDgWG zE6ug}xxz-n=9+n9$8xll0v)=gWxM_`nf;F1$c+?qIau+tSIx9qwewzV(Hq~*p1qQ| z+ka$J_=KcPQ+stOi_aeGgwA|CO|h}>yWz0EC-bv>wqn_?x8{A!rVoVb4D_M#3`FT_ z4}bca?=H&Qw&!q;AF}?1^1(Zagt7E5Q$CS%pZjuU$vXmr7dNAmCX5>AW-f1l-!&#F znq-D=Zd*0ZBd^?hYK>}mnc>A|DRSc`xIT55B>0{37RAWebFp@{63h3m-C5Iipd%?m z96f25-#^)m`w%arP|pzi3c=^m_;QxX@M)EcTEzg5RkVC#&|-8)>m;}!VUVVH@Z%MZ z8m0T|W@n%#6{5VcZKTOK4dr--A2+^oICj&Aa3>4Sf0Ne~uX(uXe!Zrd|1Bp$3%Z2k z-JdU=@plUNB~>0?F`-chdWP=JP%}h^y zXyB_K2Y~t!3?nSoaqMtlHN7q+t zW2c#1cStP9-k}1(9-p_HBv#p@KTexrc9!7u9#R6mEbM&x%|DRLBb!wD;IZuiyfb5R znuO&-GaEj$=}P!PV7kwG718z}<8fy0_+rEZ*XU=prp5PO@i`=&hiaPIB)7;Jb!(#3M- z^46{NtxdA$a+f9BJaukQAr8IigDEI*LmLOHZkE5aD}0V5wZoL&-yUk4i7tl9G-U)2 z7*eo4VU96v37AA1{?W2XiZ~uSObSs;Qi$=)5AY#>4e9?9uaanNvz~h+{UJ;I(R$kn zwNE;1vO~vFBBwuK-Sla<$@)k`J_~C}{L@sqm!D8Gn=AF-wq$NtgM5NK;HzXr^jdLbr@j&3jWBL-D{0{_Y=92|j!mci2zzhxbXC9d6pt+#cZ;*t@Jnx?03CW~Y`a z2?sO0p}(VL1uk_Y3lC&#b`~_5Jli`eKMkIX6JTN(pll#izjl~M$e1<>+_J?&-%>p*DU#Us)x%s-dNdaZM_@q+o>i`=>|rQFKRZ}L z5$-Ftph5XZij&u%=11o>?z357_j$?R35)fDiHUjmiaH=Y9Z{kPPj|5Z2QM*TKPU#0 zR|@cQK)9l?9F8cAvxfrL*S1$&9L`7uE(@r>xW1Pf%E?(P$OmN-WMGO2az)4@xs((+ z9X?1j%vc@%mj>XI0@q)r`uqEf`b&y>`e4K)WMyT=#35o32pHf1`v!Vo9e`!Q zm-}xG>L_1?kFyun+0%pLT%&`dCl0H?1+@RCVeVe~`u`~YFJs{Des1k=ZeOg1A0YhS zMaU?C^wWlz~&1?T;iXm&Ue-S zaGyJjad!9mEdfOKA1;9Yhv~mG{=8|xLzucJ0(ahswz>k>xh5FW6XA@6{U#+Pr5%t` z5>jAs38W)f3Mv5s--O(h1&cdK$VfvW5NU*@_}_Z8J$$ha9thOA9ze6GGoZv#`X{gtOQB@YU|9(XaWGQK!4Zv;6^8)Tf6L$UaR!EwgWJE`bFK#o=#iDZi9jKd z(qKt(C>ku~h>!(4N;{yyP)A288A(SeNu;zi7Y7mngM0e8I{^LQ?CyX;iJhNbxH!(^ z1yeE9R^Wn&0@nWiXz1pEMFYGFTzbwPxPZS(O`Y9QCRm5_$Vo^;rEW?{KxAZ~QsRt)sd)&Yr5a**%fy>vy4~69Vs}SMj;DJE_^9ktFKiQoBix5kprKF^RJ_1Y1K%ihL z1VRSvaMKY1mX<}zIv^z=NEt`e-}1hmXso}34@w0C^fzEB(A&R{XB+~*qagSuKTy?^*1{(XV1xhmH(03y44V10}=RXG66kmKSC=mLlWL=O@JkvbrJy;KYh_5MaK|Ihqz>NhqG z8V8^2`akRc+Y)Lda998kPY!@f8R6xF1?W2fE$xr>I;WoiG##*ELjp7bphbKD0|9#G zyxj3mdh49V{HD+0co3bBsj(X1+c^%;f%!Mu@!x2KlaD*VBL(pAAl*Fx{lu1k(#Uf< z_?&ik!vVJaPUpz&C6tGm36S#u4+}^Wqz%#s8G<-KjvyS!8RQ1Sg1|uT0hIWHjDdR9 z|BF2HZ+SyN$`O!q1|a|mb&w~>9pvy^9(3LZ01uG<6{mVjvM+!@e|Y>$-t!p= z=`jd&eb&pt$KiK7=Xg9Z8n`6cEdhb3tw5k_Z$ThRn?K_Q)ScIZ3Z_9IQy^A)Lm*H_ zCJ4lb0d(8`U;I7?^8bn3f6Mb%{C)%bB*et$e?TGy{>aGBA#yUxix)4DU!uHpiHeen ziuy9`RqD$$m#L_(GF+v(Mn_Lif9VS2bq2cYv~=`zzkz)cK!%izf{cuUj+%;^?*BQR zor2{5=a(gCZ_cj;dM=of5CMqz-`4^xKzx7W=jVa^oq)TeKd%JBI_8ysshzBCmdWXEw_<|WkU-bJvR-*Fsow|Z0?(eT5E7LlIkiqagaYNrI)p|OD%&&m1eG_bI^)ROwn_I zl&u?h3Afi&Z19P}C*?ku>u5yNlypC_Qglv=4nV<25w}x{Vd>!}^R_7tF z7&knPfHcMc$I!cj4NHN~EZWnMF@%h={0+T6cpBGBS6#QRiWMa zkpffmD6aBCi)er0mJ+LKBR3oJutd1V00y4Vz{xS4u)S3;?%w3Z{CoR!}4Qk zeI$8f&n#Vyb>$W##@})07mN7!#R}?$AGn>G9A6Efs-*IkM|~sl4$uN%=-)Xg9NR zJ=yo#g!z&7-5{LLTBD_znQdiPP$k#eY%<)r#=0v57b#e4o^ENA?Djwd8A~5&+RI>D zPezxyQYMm0u6+sehb0afC!k!zOHRs3?*bw3FQ2nA6d~3Cp$$_CQ%E1=v&`t+$Ezrl zf(kh}h-Zk2xw6RbB)v&8)Kw9o?MxvTDPFSHq7&~|bD+E~H4g7HCZk0P8FGT|M?bT6 z=4;Lon3lubP7uw`ZP!3gizpm}-$*TKv^cjh!eNTS7;Eo#yQBT!)2toBi{_mW#h~wa zZuI8x)^O<*Lm@682)pwot3=*T)+)Z>M%h~p3#epjA=Yi9E#ALiB&$TMIe5fXXLb?~ zu9I4bc8k4{CrR5^WIAO&K#$a4cGDF}ZCRT;78t8cTbVXwU}dK>#ttBl%Pm^$R(7A) zYkOZ9&a~3ck;Z2BPJ}Dx;}aihi_oM}=cQ7RgYRETE5w)f()MbFTk4X(C07O(gs`jD z8Dt>k+B}|ckW*s#gF+5TGMy9-+6&pgK2OdLKYkbmaa5| z+-30Kp5xmxRc*KyeFkM3bsE}4#YB*Vl3F>*xo3EunWq6al%#M$gQsy55tDqm)_$(|MRO6H>vg zb~jshDt&Q%ez;<1ZMU1d+RdzsH=h&~ zyOv4q*5_6XtqH)L@k>IEwoJ9Pg<)Dr`5Fw$JiN+FE`krCLMW!RXa;f`K_ODrHp*GZ z#$z>Dm54hHB{X{(HpHB!iyX3U*{V${j5aAlTko~`mRDJu$0|r@T;;V%N59K)Uu~5U z|0*lfALlS}$@GD>?RV$~*uobaJRYNO+t#u+BUP;XNvck00KAM_d}?g;T!+tcG-swd ztI7?d0$JE2^!es*-u9F!zT~Qnb?M9g(Od3ZhO{09H#eG9eqDT#?2i!?n$L%vlfO9(^BacUx>S8%>5wjiv{-Owo56R%Kd>!pL-H>?>{L-gb#UCk`asNwSl8Pg zHcku9!i4Yg?-sAr_-A;_F@_~pEHMDI@;eH8`mwgf8d5qzjQA}IomK)h&G;7 zilnUPT$8R8p7Q0FGqiffE8C15$Z;6p7o9nIAF*1GIj|^+EEjo%in@ngvD4dc99%^N zZVjippe7oG8;}Dn`k6(7NfD`>I>?b)+cIk^mzHpqtCQs83@e?us)4;A*{N7NUw;iJ zGpOiruC~kIRLeoSX}Ks<#U8TU@jdO($@kmE;C{5}i%KR+U7?nNMt6t&7djh|I1`^% zo*3=2Vc*`{GciIjso?nfbu_Q^ESlh2G;+7N)wT)QLKxB^H(IP1XnRwwCZi5~6Jk=Q zbA(5lSN6N3#ubL1Qwl5YJq}p?n(LZ6<_Z}o(0&D*&iT4LT1224UoEl=oK~`3sY8tp zm4#SjO-}U~FhB>U6|4590aOMOy{5Oy_pDNR%Y#`i{}fCM}BH#;u(8;_8<- zEPT^Z;3TF^#oafP88*a3Ppt}Ed5pkz$c~jFzS<4?XK`tRgmg3xEi@TfW1duxu^?u0 z#7vB!G_=Ov$rMAr%HndG~ zs&PKAwtmW5X)00@GC=~C+VQ^U5mja_QT2hXwQd}4j-EnI`C4fxy6+yy?!RF?_&-Q83mdo{#}}f3!nz8z=sh!GlQLrpuA#+%fdI3Ut^`>|rqW$Rj(g-rwZ+VQd++Dsc%aOH4Ph0N#5?4et7 z^XZI@5Eo3dez8xJQ5u^^fBs5J>78|J6R+|V-oZ5Uty$D}zeSUr0aT;E_jpEG{7T(z z|F)d*p82WOoa`SqaeltR_UR>$4!$kn2E1S1Vu*V6{QHwOpZO07_9jouJ|7IE3ZdS{ z?Wxw8q8JDj6Rq=^wQ!3^-7Vi_*LPZBzJ7Hm^WDt;Wx*Q#$)nj$n|mV%^3VJ{dZjdk z#!Lvq#JYJ}Lk^}wErvyvlqx*t7TP#T4kN9+L?ZJ>Lw(^Ik;p%;H^C-aC3RAaXWe2L zE=8CNzc&OCk*gAMn9*EqpyKLtVDzx85`Le?r>u{nGeJ@aGXEjr;31vwENWRN1IO;J zWloN$4j%H=woG!2?tzCV1uvl&hRTMTs|M21Mc#3;Z)JiWtGc!f*vWfRk0=!`ZNfOx zx?qic^UG7~m(!OA7gjfrRdP2Qa?@~MZyx$S9?zwQ>Xziz?tLw|Ho5zCDC_IDr;xQh z#-|yX`&I$k-g~cX554=w6{=4BH|1yY1k&Q<7+D$W^{tqF%eTEZM$-yW<+f2B1A_?L z@_e)5v>~hNoI9Jb3f|Y?FsrPXMn)Nb1%takN80+yrjTGz^x(76TKY-1qVjOd`?OsX z&iV4{Hk3)1Za$;ph$b`3gNQh8O*1<`xRWXpMPHn>oM!Fg$^+(2tpkChRCxrX9yMD} zop@qfz1pCaZ7|E8c5m3C0nX1;tV+`S)c=ZhT&C{w+d9fpCpR7uF}RVDo>Nz&tAVqQ zZe4M7yos!6T|qU1v2G_7J3{%J!gdJxPlG&ED1K_wsVn1jxuv*wM4M;4iiwCP0(2~ZTf3S;2@i}E2~_Azfa zVcyj#-X9X`p0@vbHTsk&F2pmKc2iE4`wDNohD991(d|zQ)sBxkMYHg&!47BzEQH>)znCf?w0VkOsO>?!;y6VxExs zu|ADdIowF3bmR`Rx#fMoXI?A2U*ILUgd6b(J}=o;H4FF)_XBzgzx0*)3YK?{QtEUH zXTHe%f-taP7%MduNNTV)t9k$;LJjmi2*Te8(%-5+%mm+z1Kp5A4AwJvLvy${YL1 z`5Kp5nDM}f->3-J=BM&4e-MqGiakUTF6da7(dwit3~MYEIF~n}d~F=-U)J||>^S3` zL?Xxqcu{^v6>j0xGEH%Qfu1#SMI@Cm^W9A=4EJdpRN$ceXbw^$BMo_Rm)%+0Jjv@7 z^o~A=KvjTSU_f;v>iBlIQ&F+_Xw$#qk*ExdCIkg&8t_t&9HjJ#$ZJD@O^{+3QcsJfAWq z*z10Hz>#jmLUMsl_v$mUFHUKLkyEBdRt+i6I!O^jesie&)VWo+`9bh!<*G+uwgp!Z1G?tR_L})|YqLps5=_s2!15 zqR~=2msC1J*!@llwYb4N&fxHVcsm`OJ+#<=u$oC2aQwmIS`t@d_1LPo9BIdsz|7lF z@wux>_(GVxvUS*13XqDkMvbz#nFuxzRYYgxMo_gf1{X2$Jh!=%Sk!n;K_qF0OIa!^ zSEoF~IlP`>jnar*#p~}fvd{(*5@jA9pHg&D(rce$tLAdJ4WRARqrG_a33lzXnqd68q z+)UJ;ot+%7h%lPSnijuy$WO#RcfC_fG}kCh7#y-RbP!TCVygeF-CK&)Z(K0pQ`yuO zF{&_!TKi#cSINw~G79f4eC5~sspv~DeVd=KKdyMUmp&t>3P=C+~fupP)kh4 z#Zf_05QnGJ0SR+leE^T)pd+=sw)Bc>Vt;3(VYw7 zJj8}{r8=eRM&<=DW1Tjkean1^$>c0AM`}JaakWIuZORu%8Zm)~x~64iGLcLsy;-l= zorV@SXRY?vK*iE#MH-(JmO2&3wXFMQQ4LTPHCljewe>~%sc^h+J?tb*E!#-(=C21P z3tt!(cic*?2v*I^@6r|4urUH@+DKaIM^J0i&W*KJ)!OcjKQ%-Z?lpQggvIwmLn!8M5Hn`95U!CVmF<2yN#%iCdnX=6ELEj1+3rFa^~U zD>Fpy)6lroXoDUQk-epi6w-Ly{gQu7P5Rhzvp>GBVD;5`fkAfJMVQE zX3TaE`qbB<#)m*4kfDgzI(2k91%w3%4T+^M^@7OU8ZS#!iAg5tT0{1Jj9k+wr_EwW z64sD(A+E1X#7JRj?_p%lXa?DemIOm#V9V&z49|&4EWJbF} zk(j4e(ZbpqBXrLZfi5etlO_U|t-9c$)Ra%Uj2=*X(f0}0hV23eVLxBqNP2%SL33X* zbg=kzeLN?+jJ%3Ym{zE^l1Lr-=#J@qeFl`a4l#&$f}x9^N#)zum@nf}i~!PGPAyE@ zG*FPkuo>^SH@-@+lX%$*3(>LH@-JF1vQ8=!K!OkJ?|X9^m}RpiOSv}AyumS)R?$|G zVhdhSSQ*&0yX*OjpbYNSHbSBxld4>j4=oft!W)}=ydUdQRiJUm2EA1)l<8=m2f z?TM z6GD#-5@_ii3pZJvS*3+OKjw*&>YPf+PY~F`q~;t-5ASN?>(H}}?opCu6Klh<8zZmc zvW{l!LT|{NNa0|T1+coZiO~Z44tQKJr-asQ%^3*H4BaV!$1$IQE}!Cdsuv63ui}TY zWcKRNLua6e@VL-Z^SEFqK!#Zgc>m4F_lT`9O1m>|<6{ zxVo*MOo#3{8FQL`fn*Xm^hf_N`JU{(_@R>!W;njknboKe8(ALpSu=7fp`cbyeV4mk zlXEDp?kD@qPgt)Pelk}Yi;2qR?hY6Z`*HMP_jj98PSeA2p;`6=@K?_-kGECSsoZ)MO=3Qr?EBk_ip<7O2Ebx6fn$^**g1N}A59OcBzs0z8L9g9C z(p{gf>kN3ip&7ojwh@nK;c^ZZl&p{6mDww>UmAziePIvnIrp43^s)U%p!Moc=RO~e zR)5?2a2oMf+gZ|{XCSN4@|BVc`*Qh@6i(by-$wnUY^+;%d`ZjtO}%zA`uiq*12p7a ze$5h&!PJ31-D=gG#xAn6w{c>!);JzlBfR7XUxqGg{^U<4&)vF$7Kz!Cbu#bDbz&Wz zm8^NkI^^~~zBlJ!s;JMRdRAN37h=G4F;$xn7h}iJTF@D%Zb(=sf?u@EaST}8ISeUi zkLx|{nc0%d(mO4Vf2>czYBa@{@4}al)6~i_9Fua|a6NMSurpeqX;PYYD&_RMCqr48 zp{EL2r!eR#;4S(Lv=0Qfu4ZO-W(&wee_US6XYx+j7)ma9*=u9xj#hyW>%4!zQKKJd zu+5#ZG`?Fi2e5)`{HBqS78EjL6uJfR+FSWQ7X=#QvbbevWsTJav*XH`olKlcM708) z(`?>3?Fu}tS-UreY_YjAXW8eI&bcx-B2pZZX7jdoU2CsCAmi;QdqI%=W2_&1T&c7* zLDl}!mOovOWUs$;XkFQ%+t1?iP#_mX5&^$vv< zS`++|KNMQk*Q}a8?p03b(1i^Vej2gC)sF>}22&Co>WJ_56|a8$QnR@jO6ksKFmU9y zJ^C&uek-n$&3t$@W%u&Z2p3&;0vW-wPRF;Hv^D|t^_{k^Km;>F zaqjhrrhgu@r{DoUv;nss9nZ6#fvB0G-(Es@X0|*LN3*X!X3We26EG*fd+5aT$Zd9J z_TWSsusAMDX6N_Bqza{nPc);D>A9(-U%<+aUArhf>i<<9p)*)u{vA zeMslkS)Q*caa?v{uSQd2Tg7>KH`j!t*pk-9!}FwV69WJgf@BSN~YjCFVwfd&?^Q@itp4;a<2 z>uP|I{a!RyU+rz4u;N$l7iY`{yKN;vG_n3_?R&Xu{r+1z`hwO?tE_8>WGM|>F#?Bg z>uv=JG{I&s`{fX>W!t}SQF8D*1EB(1gnRmC5@xI*7BfA<7nfLgMp&W@VXpG@byE*M zMt#ydSgfXZ@+eIjEGNsTP2A3suai%ruZ^jOt*C)}%|im~;VXXl*_@%e_Q+Xq1yYk+ z-IoGg%Vgx(KP%rDxl-D_eM=*|`oOlbsQpC}Z$|Ji*YRn;WV#uyw<3L@^fA9X-u8ha zJnLE--=c`B^n}Q)dSFeBm1sX}SAGa~Ujm#MPBwKh@zI>ZgQcynb@iX`O4Ib#@AaBD zS_sOFxotW!B0V%h3{tOjRU~O5YHn;!6h4-I?652+>2n$c%RFD>ft4Ny%P}Z1DLY^K z&P#yrjOyG`mXG1%a-CN6bwid#41Stvqyk?V>8}-HPn^D5$$cU@lu}RUw^72do_6!U zvJ%<9*Y)(d5~kqru95@y;WY;Dudne*85nJvxS$Xk)T@x$_nMy78>(|3Et1KVW;*Lc zspV62IVJl8Gv+-E;Kf~b$qWjF6c+2FFFU_(@jA-=)fIl6en*qD)Si}Av}@L+o65xI;~kGtmD_Io7~I-5U?959PzH@%<* z2WBy`J?i34rCwq5IDTG|d<7QSo~8H`*;`a=g*>Ys&AZcT{6V6P0Y@?lkw~)4O}P zIlXZO2j3W34ZoEs=t$KFsC5+{tg|U#DlDJ7VoHn^f=2BOIZYi6wDf5*BUcLjWE6VZ z=)p;q`8rw)QL{+v#@EBI+pJ()cr^5J#hrp+dY}5QlU9R9+CL}!im1zUB!FM=)MMwp z!?;H;dqtaDyyB%{oy;A)0u3@RySz-ZG-5oIsf4MOk6!R~98nxWXg1L-RR)$c;5nBD z4-4-?z#}_?zSM0Hh!0P#udC7Ezq$B40D=U@ssO~E%Z?HV{VDB$Y8PQGV7fTudJcs>y7^ok<4UGi#M0_V|A0^ zHevTZl)vmbiYXkiHj;Xq-D_aTrq`1ykRWiFf7ejHhC6k_DoK0A?ND0QPw8#p@SJ?B zd}XdSoAzZNJc}!VkqKS&kmnbJsDk8Z6>q>~9^zL(Hn~#k{&;CB7+<8)#A-v@*YCxh zG$K6!<=%QbDrG6l+I3g8SD-Iip)|3d6FV!MLB$hT90TER9_pPK^H47wor%k&Z==iZ zMOfjfc0_yP!9IJ7@6JHoa(5|m;(y+pa~_I;~hchmv2m_U$%LCS-T3 zAFm}X?Rwn4$o)d^C)D6*> zW2L8~Y`Vzm#Ok-TE*rI*F=@yvm@msOrZbHBa~SSc(k|ssH}T!A6hvos$umgvFQQOdC}%ez;zMUKuyuw<|)IW8uC!=|$|{W!{fWMdhyw(qU| zah#V;v`o-Dpf})VuVpi$>ospoSkM!sm-muxe3*jHSQ9(S5|a45;sNZAP9^&+>q`H8 zp3!A(o$a3K4tyO38+g%SNzTm~ih@aNY@H8{#AH;!nCoi@Zs_Ksf#V_=Z%;l~ z9TDxyP~HQkee(V^NE)6|OEZ=ueakd_`)`!7gYwo7QY-cU7O%=d0#$U z=Utj!%42Q>eu=&)5E5gXa$vzXZX2eAmfv0ujJ|S6GuE%S+pY7C+{8$}2QQ1*mF#-` zDU`cF&?ZZh6Mxy|W`@u523oIXH$a{Z5mP?vldYdX+caR+g>;-d199f}-(2@yh!E~M z>2{I#^Y9mpGYbq+XeYpeGkj9BEx6-Q4XAD@lMLE28|@E1yH2~grv7sHCj`}+%cFxn zp-OApI!-x8S+xsp8lFq^oxRJ|Ep0X&S$b)vu532^DNAxU zSuv_xeNP(7;!T%jvtsMquTEmHP29_3aAh-2T#0Dp-#;D6D=3Glhv>g%{piscYVrdg z=XOw<_}u%+bMX<)OZ(5edOm9fn~{88Lk2`&nOrOw?|HCTMVw-|#Y*sZ+T&dAV%z2H zWjl@96^X~in=P!!s_*jX@^UV71(G!MCS}29LJD3cpz@gzFXavk<(B#^hX>KatG>N~ zS2!28{blxeBoU7InQfVCKY)GZ$1YQv$*a+tzAfbaD9bq=1r15$lb)T^2`&{d1O2Z= zrw@~9j7X;@fhL|@tzD~SOln=tyPS*{tWgpnag;o-B8ETL??#We++gN*l^;B0x-q*V zUy``^bv^Wkqt$}6TCV4ke1lQ%XW>4~wcy==1w~y(p`%@SX+eAb9xHQHU9N?sd#YFe z`dzClXCV9ubFPx`4WXI&KJ+p?`sUnLZ=K=@^#H-HWncLzIF4oyn~)>`x)4pOh3nN28)AF(ys9t*DHq8o05%{S>s= zFIL;CW=1wC!~R##&1Opb+W~Atm^zY~sI9yuHf$h%NiJvf-3?7_AkDI7%5E+)5Qusb zBcfHkQZuOcovQpyNAI(oRIS}YkxFQK!Ql%npSROnAIFy$uYK=WrTN)aGSnG7`?GkW zCjUe9;?Sg}x{Z}Z)vzLbG@ zdu-#B&ZPJ1WZ>0lI%A*7`lr=Jon`+1fdOH?*lJRbftTGsCHT~kPJXm+oC5r=P+}@1 zMmbG55&AKgJKomYh7f+?N(1x-HJ_#Rz&^_P-8Ipkt!rNKQ<^u-_?Qwc@iVDfe;+=3 z2+kUv*}aU&l8?2J92}8Uh+-Syy(>SsSMz>$3F8-Ntq>8o6j&I@biRk*8mgen-F|X8Bb-a}B`JGsCcTe%0=WVm<&2hQm*}(PN~`Z!!MKxjc@qS_ zGi~+7_i48wAKjJTRj+p2s}FQfI%MWgwo+70xx1g(pO1;7^@`jT;t%o=b?(@T5Fuc9 z#+8h2a4S-62UD@Ly0HYb*;+6nxZf~-du7=!f9)}=DQazOYkzY$K-%VwnQPrn>y;mV zsVvn!KbroqYiDCS(RB$j*3spUso;4`Wv1?J=8-8JVW7l{3YdmR+4s-t1q?Gj?Rq_Y z@^BaUXOE!hZ+n3!y`S0*c21JHBs&arVV%FW*(u{q*i$|)K15-g7_ujyutt6xlDqk+ zc}Hokom@ShS%EZ&hBJy>5MkD2AkRzTU^!{pc}fV;)@iJ*t*H=Q@>>lq4#}k3hf_q; z?4oolbIlXvqj#UWLe4-%{{6J!tph_dsUDukPNNeW=R42poKR}u_+6l>24EN6BUd-% z^}f}0j!?L}Zf`7V3J-+FYqJdYxnZ*4l)!|2b z!GRTjUQ$*u?#9vDEVI=#{H5Yd{xHFa)3jKZ z-rJpm;y6ly(Y(CQom}oW0k@c8oPXf*#$rXvK3S-*2I<6X=lAzx`RaAqt6Jw`Lv7iTAxlNTf1MuwQ`Xvkz6<*EPaV3 z7?phNE-rHNig)6bNPmjY8HjtJHzp@%wXwGv0JHN=DeQcCGF&4BWfy;e zto)7r>A>lSj^o&un~ji!?pHBKvo)`l3*hnj_cvgy`k~b42df%|Oj;P{WX<&cboZ%L zXB?}+V-?fhMa$_5q^V0vwwHVIui*S3Io(*y#^W9r-3Vi&j|ELf2gm>+F2YAA@W-^x zPc%P_yv%xm3vU-4dE>Bjrdi$St(|74KPrfu#mwtENOPPo*Y|yXqka_ahTEB(`lUm# z@UpBE`Ychw`A7p}N!wMf?zN%u#A~9awZ9!Jucg(NP>#xm3&#eO=Lz1iC|lIf_*_QY z?PNJ{yXEufILet$r53AQ@=&1)S|<}TAQ8%(T3d3zr}Qy>923DhaXsqugHblA5n_2~ zR)bP+)o4|^_@$D(zB&xz`Fz(uH~|X6cWYwEVjTSEh2>i|EttX^?(Bi2;k`+6!~G z-H`qXS4c3a-Cxk$e>M9S$Hpc8vpAhA8?8$(IT{}2jW-B@=#LAuAiBMN`Fz+cVyNL| zUbQ$#HQ=g@FOGOA<@yP*4n5rCTQf70)^I<5D9x5_gu=5^7PlV#ZZM^~)U<AF5OO zz1dd&Q5GZnmtGTm{~gqHLigg%v5{@M*wK_CZ_9Bb!Di!8u;jd0=N>yD3PW4C*j;!l z_UF@!6cw-7Gt-nV(!Qq^oQ|2u<#ri{Oqq1ebIGeGOn^n%8a1QJ*sG#-Svz;?3T~CI zfxBm6mn&~d>GN47FkQ!1&SfRi#@or8~`& z?eU^nTHZA30Y~`+t*J44QMHVf(HrCPy{VC@FSJo?Yjt;emtN;$14ozDo@Ynh(oBut ztK|l>sX1yIO$|xjr6VJaV*I7V#p|P9d&?n)Gl3^=K46zysRW$-Gvw;WE)(u}A;n*o zbrbPvJVru>YsTDhbV9&=If*@O#uCf$IgB<73?%?e^Os`Yb`Twp%lyjLg0E- z6R(MAS(3}TCP#BR-kI&vS=I`X6T);jpg;87Q|Y#{U{8&@MR#=SuwvJVv900 zZ4n*yz&i3A|3lv0@!QPIn;+7$tdA8aJ9_0t?)b-lrmj^|h_W>3XdYTKFKFeLQmQqS zH>P)Ivoinn8WkhR*4?*Yuw)guwLYCuSZl(a6uqq%i+>R>n1l7hr1)jf&iRNu-}0=f zOnP8EYV4>t52GyT6cGDVhq!SbtY!I!Y2A$h3D|Wa;Nd;qDbXCmf6|fMN@*m5B)s;p)hZius~Q=94I8uW*XXm`dk za}rt93TxU|6>?!=dZt4$tkK~C`EeRIw018~`0IHaD_HeDzJZ6>dZ_C>7i}~X?h>JNN-LU_Qr>}sE@_GKp zpi#Q>=P^PKBS7LzklLj5?8Y`M zXb}GEr+7h3Zud90<`p4GcWdTI*Vofu5C2fcfauf1W00wA_TU}hO{~dI`3`KYJThKosh(@)gwZgNN~g{v|8|ND)?* zCO%l_zz~(m!$&H?-@zIGt1Vz?yRJ3Cw?JBDNH*4C)^lcWPsLTC*8^N)D~Vs#jo^Z8 zb}=_3Dx8Unx9^#~@qa0#GJ7k$iQ}!BqHMp*9|RmYjd9jAi|4p+ZEGb$Tz7$h)q5HX z6ApBM;Nn)tAtYe+TL96rn3zbXx7T|Ic50i-2X^oXt+E|;H>wD=gWpCh>64+JgXZHhX|`X|yLV*aL8&^wNA2lz*K>ah6pC>EvW zzMQy4ys^c@oA!SwHTF4!^$#ibM|K}ST|bpfU1?alCHe5vY_~5%a$3yxiyY_QIH$|@ zqU3^Asj)cDzaD;_p&uC18&88>nbnJ)NkqDoPF!h#2-Et`Y8uMyw-?tVoL4%X0HDGrrk(j=i z+-6d*0?%1G_QR@X-964uxTUgKqNVYdnS`Bx3zF zHx|7ySM%WbBX(gd^vH|NV-g3cdUBSm=(3OvhlFR-kac#Ok5 zJVunq`vJfK%;x`sSir*J5t@H?Z(9!jTr!wLxLTHTp43B^2nz>|#V0(+oU|7ES=tNL5K7Ia9!v z-vmbT^^oV}dRmYX1m$6iZnXq&F2?h_eSZo_gG$Ha0!fK!cL(Vg) z>+rQcwwN&%&#?D4yRp4aODli@GX-6bFea&--{F!0?16!_bAiF7%PqB3C!d+PAh^X= z!l(9C|NXJPzl)zEw@Ut@EcAVo(#r~yB5ZPOU%M5R;zGLK9Dr$EguS4ZBc2OnizP22 zBK})v)g@TPZ}TfBi0{SS#BZ`@D^U|Liu`>Tqnsko9?K3N3=g3>-#V{%v3;rP-RR}@ z0cjp{GOu%u%cgrLd{>zxCym!iNuPtYW-#1cLx|{xgo-@cdjCz4Kl>j%foLi4XGhE( z@ZrDc<9Po-Lb2k_j9xdph*gt>^zszZ&>^L>7;}Dt@0Uvid7aAddJQ9cfq^`cr`3up zZZ(5$pY^XvbZ`e{sy-HS(ikC*R16vllf4sHyt#Y7k+b0J^RKB0`9X`XZg2Yq)CV%6 zlBeL63ZA`#`}|&wMHGmGviLkUHsbrlBK|v~ElKW@g2KA31%Zf|LK&KG{o^#lwlAsq z$FT@NJw7|LWr{az8%kCjvB|FXmz7~t91=7n185;H(!6ri*t^5jM6bNgT%hLFLkcAn zO#I)4Ck%5cr!14-4izlhHVAqhHir@=RAB1UQYnNZxjKJiShX)+IXF&5TSGnG9w;T} zr!MuIL+~-}!E&`)Z%5}6hN7#ocfR^oFzPag*i*)dGbI~I-ApXW-)F9z!_+9*!_*7w z`g?mHgN;aGVdX?&CpcnOZDZgUJmQ7jk>{1I#i;HQd3;(r+rH-h1jW(_ZPfAf&pxMY znWzVa^yJagG%v(R(>gd^@*fI1trpue>7@&xy z*_cR2TesyoA=n5Et}jIhq?s@QH$^`dAiv}>#pJQzKOw-QdkP}tea81no1R}5{9kSf zaJRI~6EI#deF#<(@LI$h8O1Xn(m*z_2V4aC7+fIYlo3Nqyj-dKV7!jvkYlT!kw5jA z-7#jBRukSxq7gN}?z`l_ja9`A`^+uAw9o-Uz>*tHZ@v5`z z`NLyG62)o={!7YU4($muuM4cTD zCaE3o2b!=V>sP-eEy89s%EJJDhVj@t3?q;O@CwEYY55DnP$Cmkq{kv+_q9Oad3bmj zVeULXWr&~}+KEgS19LHj$|ncbs^|C6lSA@3p0Y#Bs8o|!y&~m_1LCkypR&^zDU{fH zxk<|*5*fMyM#Sr(J`Ios2L{OM5F;=Qt)_rxA_D0Q!6bMgNn9l1W{sSA4k5uHhmd?C zEP;8vMsPF`b$#qiFlQc>ra`c1pda`b_mHiX{0P-n!?yt?8eVnT=Wd*CY1!md#n^*O z__0(|b}aFQ;q3HKeDVN7)}3*+!TJ+`SA-RG)?tt2(HE)iU<-&TyspHMcV&l`wh<^5 zVao$o!vUIqKe7Ou^*=@!YO_v&=lfzqf*A@5@}dD|@kQsr-N{B$L{%m-I1L&%qJc>T zZ!n9W(F=)8p)ZmLVH4t~g)_gd+m;Lo-!_PqcjsXo8mt}!FCAPw{(NtsVKv(7q75&Y zOFNj0>{6Q*@3HQJDsjAER&j9>fK2r+J1*4EjfCTvyJl)b+lfO=BRMKOED37k&P>~9 zD&8!JzxnLih4`JPUCL~XAK`Z{N(1PzShBR_RCM9tNguN;t%(^Tz(w#p9sIt;PB2LY zYZ=6+w~Ir-#Lh;P%=R=W4}12~FNF_z*3Y*Sw-}O-7jmU%ux`a^V8zMz zNUWJ!;<(B$268vR@~4p-G)PBafbn%O!0b>X5W%aj)=>ziD4aTrRE1EJ?^)JoV*gM8 zVI;TswP#799a2DU^-UrG!7nD!P2wXi&S=%U5hs-(m6Ux@2w}r31S6DzccMrI`bUWa zlMJJ#8SL!=(mWtXZrK+_!f8-9H8uIgiV7#41=p-kTo#g#KQ%AT@ieeVW$Sr=v=^9z zi7^ixf~5jHli8s;^u{0+Lw4=B@Z9LrBzCC$3EYJhs)TWvbtPu4qk~ZfDN>jM=qF-@ z=7Edo3W-^jh_nb=xgLkqJDh_h3L!wI4am30yV%;Ze*V5tzG&+x60&}iZ*DsyDV+Rp zE3%;kM!50-i`CypB{EVHa}y)Vjvv3rsdM6oM{pX{_VaB-H>M;^dqT?~CDE~X&@wVG z-sc2^lScxlG1920sV#fYIQimmSx>VpU3ukgM3dPW9x&4ImzI_mw_|%XolI&keK_-r zRPj#{r-*Lc)1X11u6%Y7HV3wi7JUz=C@2547>${P#46!ayhwn|GH{40F&ipCPhc%8 z2kPretmjGuwIIc8yFY$uOW2rzF0L2;C(Zg8@*6j{7)JclO7vo>0DG<4 z6arNxobHw#f;FOGGr-MS_Q0aV9rk=^03lg>U%?Bq&CB1}&Kd8Q{7)+Q`=W4pFbs^k z#PVbTw#GxSWR>w60daZcK(yB}C%~ycG7d}D_ye;c4K!o}sj2mNZR#rQP`f6QZ(j|iVY|yfIp;laXg&fR%Dl8 zyp+T%v;UC<^e3Gz3q%ZnnQAg#FaUAN0RZ9o_z=24d3wIyw8RJeKM{TMN+uDxXVPZl zQnF%3d6usO6&evqP($k|9LsyPM^MHKxsj0Q1}Xp`F9823GsY&gv=9O<4d#3w%*mx4 zvj2a|1;U1M#n;x>26Gi8&>QkAf#Ps+@4{0D;o~M27)Eu`UV-kHOcCUS5v#Xm@mk17 zpu$pMQU!FN3=$T7nj$kQX9f-n?- zuYvx6u>SxT@O!;(yGdB?!~dZ;Yqynx@yWarWIhcb!Bc>uDxrC;mnlEW84)`t2wUNL zYqE`l6+FCpJ6Zn^MUdW_5D!d3m6eD6fcP7hq*#HiaHAb^tsM*^X8lhY3W?dF;eYw! zCI=4TaXfY`K>PI_f{5$Izu_Fu%h=Tsv9@;%*U^5n^z{%e@=c(jN}|A8J=7Z-{6zpX z0lD(~Qx1&IWlewotA0nPb4kmaWSXuzUL0l?gj$7b2(Y2=( z9dcwR10jt{C$z=N_pX=Hb>unWi3t3K(-iI6$fUq{fa(V@iFPEi0RS};GxG!UPOHBl zl_h+7BE)l9DOzhCNy7onui$$#HkPf#0Vb?u(#sOtP#L+^xGP?*4XZz#@(4Z_d3B38 z6`2im)&MNjWAjYJrPq=Sz6@2=&4g{re+mP@!hbV|f1Tg2v^}`;xK!d4i&t9OExl%} z5f7O3AU%y!iC$W6*qcsU535TOp#4GZq75GR<4d4#)YXYRp7Nl~#m57$3pddV724i! zR;lpbgYEACDxLA|g%mu<(TvQHnf*G1+Xc%m9GaDqKTi8)MQ z?K}yFnpZtCK4j0BUX-xYs4@@3JmMf+65<7qi_U}O-_>3Dg^tVbYD!;l);M(2V{S44 zCJzffuzwDaQu}`!!2D}efroqP{DuAS4H_iB6JDy zi#@H>F~-=EiqX)R*a}0@&{(W(xYEeFyAMTLr;icFpbFV2kfEV^y837&Bx!GNFFZpz zTA9&LxL8qvpM!%#0(b&7-jo5gwn7d8>ePmlTBnmbRL_fUD#HBA%|wC^GW7Lr)eYJO z`q`T;HGx=!f|J#>rM-I54>B5la9o345E@hW+ekhoIZ~T!*4{H+t~?Adp$({QL%4U~ z{ghh6hAJGc-xZb3rXFd=X$~|reY3A>Ciut;9_jJ%@xPWF1WrZ<7Xl6S&YFY&l~MA5 zh=_nsji5cHXmj!{KE;}AL7p=(J=gBvEV{N!t558h=YEhK7qJ zhKA7#u>qcp49&rnW7w$sTkLtY&|N zW^1s*;Wjq#=;&c#M7n3u8m@yL+`5fF3=svRRA5UGU`qfFHds0k5E5u$wi!(a7!v)b z&RNQR|7R6ulMEx!ZJ#lZ`LUn@hfhRzk&)2|^uK;>DMv_v z7tAX+8LbmZPcJSm&Mq!~0Tl*T7~$ce@d@;ge~bS}CkMomk0b#vn2%S|<~acfAPGN^ zUYuWmpIliuFUH31JuI(d%VpiGiK-GiQ~dKW+jGkkP(czAfRF|DUQDf4lL0)#grA_Bmy zEFKDA6n&zjqep>~o+x08$Werkrl%BeDH?@Ur3)}KJIr!fe*ioG#M}#JUWnnI&F7?P z81`0QdSApA-wTH%f#v_2=0yUu0^@{(qs;LgbjIp`E`N|er-l>`42cskBEmL+K8_D6T3X6PcN!@bB9WntpqH_+(dx=_PweEkL~IL8*Nv&(p zR-FStTJ;;5N7aM*_&}JAEacw-QQbX3_8|^207dYcAm5U-1i=4Y!_5TSqZ)st=B{50?plSn(xkkeidc#yNwS(H$?~CV9IL(< z92`oQDtc54Kp{Ngp@_mUqt`8@A8i&pb|0rG^~h*M0>7dSP;CE;oJ?>?7F??XF+Z9H z0lwcf1;G3`I663JG&)c^1W2%H83KXWwne0qKNg~bA4x`lyhlezavlAhkq+U$C|ZV; z8hxN7zro8b$Bz$QJ1_b{7ur=%KyC1BbeoM4cwJOkc19w7mK3Bc5T&i+C0 zj#|3{%|h^oC=cw%p>&IUaXF-?aCkWo*%180XWx5`a7L~FUfII~3gCjv*3oBQIs0YcQlX(*!ZfC40A6LPzB zkNH>pawfk((6;c5Vc5HgM$wym+s4Uf`NlnX!!wkbnQ;xT7brQwZAq;Y>KmAie@s)( zXM6>+R3Hrj%U5iF7iA-IVS)K)U+D~V7Yb-%ecSOoFg!Y98b`B(-+{S=2fG^> z8iZOS%a4K!)0(-QxmNBUS)AO8RcaR>GkyrBHs~uGtYYrxTAlx){qlik!q;~1>Y{Hk$v5sEV`{0i*75_NKfZ%as)pP(T|3++Jwf7u z|1bEhsK(y(V#oySMLl&Fp^uVqPR3Lla}Gh9_k z<qiLM}W3ofy|YsD2r>;I~$1r#^RDDEr&Tl+t;M!h_KY zbxN&2bw=Uhmbrjhkzu+wNIh6>5CGB*i@~%_xCaM#K(dRp?Ax~;1x$@HsAi>5;b??K0!?8YXjcZX9~JQ) z&q@N$)p?GF`Ro}g;4uS^ta*kH;(Ja&k4MNaODCXX;TnKo;C+>cN(9z+tAo6@3{1%H zn%ZC#bay#9Ws=japZ?$dT4*v)^-Qy|D=Mm)e81=|TfcR6{&HK8dXLu90UloFY}Uux zShhAz)u(i-`Z7GcijA!Qs`zlUihbdH#B)=9{Op9v&H<{wH#xEC9h0J`r)R?6=Wa4L zT#($oT`ex6Z!-4}Wsji)yMu878=tTK9;=z#?J!~Unq8FGH%ry~JZVGYoBXa=o~U=6 z&n_`@`7dJn67g!btEyK%Wrv&l<}0J$xx|wOosvQIs^y`oh0b3_JgUp;Z=I^@hevYT z>c9TZp4S_lnmg0(B$y`o%B^ei>M!?EpAo$h_@3M*KWY10GToelZv84p#bE*x>XA|) z)W@V+fvVW#b_V5#d7BK^wAI&_3@rRHhU#6z>>?LvvQ3`moYo(4#JI)@&5O*vi!re< zb^VyUTZ;7=`hLjFPxUjquI;4;b;DhfOt<*EzhCuDj9E#aW}Y>i63>r53_@wj4}x~f zz8q{{c(X6qV#4fUSOGSpGWtBgx(>B;$Rzo)jg+8eGadN^Zvy@^<2UV{DuM=g)5P!} z3c*%t!f(~zSev<#x6-l@Ge_f*FMHv~sPnlBAJ;&z+JW-23ljzCm`R9XH3QT9w|CVU zzoYL+O?*j>wNU3<9O6csM9W31-a?s_)rtFf%jffwKT(vru>^B0Si^AU;3TEBnVTma zD|G|Sw8+L@`)hU~Xp;#yosXWLZo&q3fC1Ob7t+{26s1)^^z7D{&GpKC*9)^T%G@nG z_{R1Nr6P`LWKK`kgqulUN2d#CM_r@cL7)0Sb=aGj?I!izyLWyubC-tt))+8%rHsv` zckduI^}lTS8&!gu-c>&^&9}~}%X`dqotc<3T}m!Lz~sgJ2=5o5Gq=;QH(Kc2JQ>@~ zfm^0lsRl5U(#__`O^ygx_Vn^{0saD`36$o@Zzc++o>!>ODJkQ=9LVWZ|VYu+-ol%ZO}ghDyMV8gpXWe^q=kc~ueeuD3a`S%SNmYGxf~HnC~y zC=>B+RNArfZTV(KsmFXu1qTPQwY9ZgIjRDz+^-@{cTMMA$h&G2-E(M3M$0#tX~idr zJ}vgfWS;up5vE2CNibJvx*kZs08+D8xh?q3r2_R8@r}sxJKxkjPi`57dE#CegFLn- zT`rMaK4Q@(^w#i*J@IYe^bLE*c8v^EC)Ny(cQsxKS1L98v%MzLXIIdkxQvSE1p{AV zdbM6|zP*--giWk!6Au%Arf~;^{d&uME)#0+(lBMvRT|9`q>0=VDjWNf1C!2LHP&mb z?_xS7a~5V>shspH0ln@e(qmbw>l}&em79Rt*O@Gkn^?O`urgPoD=s_0E~h*>s)go> z`%Ox;OE=4Hiho(3n!b7415?&fJ~1yWW!f#@IB1_J-+B$LIc66{bt#8+H|v=mRGAuH zKtrw9JGwV$RP!xdaA9+I3wosb=TJM7NH`77vZgu&3^MhJ= zb=|uV)8Qki_p)|nDaw+H54Wto_2sH7H&btQbt%^DdSzu3s&&sy8Dvj?b=JFF8Tn-- zJ6VEfI$ri9!>s2rqXfSwhS{hUDz2ri?pp9!sH5BdOeTFV+;v%)!X$)(QY69AJu)Pm z@Ph*y#NIi+<3qta-&%tsQc10DN72ytHdQ!f32F9rZLql;(!WA5_RM#^Rx*TzMQtzd zgv{-(x$sPm3Bs)?acE%~91S%0DeP6!r4gvSG~j~Bt!wt?WUGUgra2)9*%`(#&Ol%# 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 - dplyr::rename(site_id = field_site_id) +site_list <- readr::read_csv("USGS_site_metadata.csv", + show_col_types = FALSE) +# should this be updated to a usgsrc4cast-drivers path? or are we keeping all drivers in +# neon4cast-drivers? s3_stage2 <- arrow::s3_bucket("bio230014-bucket01/neon4cast-drivers/noaa/gefs-v12/stage2", endpoint_override = "sdsc.osn.xsede.org", access_key= Sys.getenv("OSN_KEY"), @@ -29,7 +30,8 @@ df <- arrow::open_dataset(s3_stage2) |> curr_date <- Sys.Date() last_week <- dplyr::tibble(reference_datetime = as.character(seq(curr_date - lubridate::days(7), curr_date - lubridate::days(1), by = "1 day"))) -missing_dates <- dplyr::anti_join(last_week, df, by = "reference_datetime") |> dplyr::pull(reference_datetime) +missing_dates <- dplyr::anti_join(last_week, df, by = "reference_datetime") |> + dplyr::pull(reference_datetime) if(length(missing_dates) > 0){ for(i in 1:length(missing_dates)){ @@ -49,12 +51,16 @@ if(length(missing_dates) > 0){ dplyr::collect() |> dplyr::mutate(reference_datetime = missing_dates[i]) - hourly_df <- to_hourly(site_df, use_solar_geom = TRUE, psuedo = FALSE) |> + hourly_df <- to_hourly(site_df, + use_solar_geom = TRUE, + psuedo = FALSE) |> dplyr::mutate(ensemble = as.numeric(stringr::str_sub(ensemble, start = 4, end = 5)), reference_datetime = lubridate::as_date(reference_datetime)) |> dplyr::rename(parameter = ensemble) - arrow::write_dataset(hourly_df, path = s3_stage2, partitioning = c("reference_datetime", "site_id")) + arrow::write_dataset(hourly_df, + path = s3_stage2, + partitioning = c("reference_datetime", "site_id")) } } diff --git a/drivers/generate_stage3.R b/drivers/generate_stage3.R index 86edf09c26..7314144572 100644 --- a/drivers/generate_stage3.R +++ b/drivers/generate_stage3.R @@ -3,16 +3,17 @@ source("https://raw.githubusercontent.com/eco4cast/neon4cast/ci_upgrade/R/to_hou #install_mc() mc_alias_set("osn", "sdsc.osn.xsede.org", "", "") +# TODO: update path to usgsrc4cast-drivers? mc_mirror("osn/bio230014-bucket01/neon4cast-drivers/noaa/gefs-v12/pseudo", "pseudo") df <- arrow::open_dataset("pseudo") |> dplyr::filter(variable %in% c("PRES","TMP","RH","UGRD","VGRD","APCP","DSWRF","DLWRF")) -site_list <- readr::read_csv(paste0("https://github.com/eco4cast/", - "neon4cast-noaa-download/", - "raw/master/noaa_download_site_list.csv"), - show_col_types = FALSE) |> dplyr::pull(site_id) +site_list <- readr::read_csv(paste0("https://github.com/eco4cast/usgsrc4cast-ci/", + "raw/main/USGS_site_metadata.csv"), + show_col_types = FALSE) |> + dplyr::pull(site_id) s3 <- arrow::s3_bucket("bio230014-bucket01/neon4cast-drivers/noaa/gefs-v12", endpoint_override = "sdsc.osn.xsede.org", diff --git a/drivers/update_stage3.R b/drivers/update_stage3.R index 5a8cf567b0..36352a1cff 100644 --- a/drivers/update_stage3.R +++ b/drivers/update_stage3.R @@ -1,9 +1,9 @@ source("https://raw.githubusercontent.com/eco4cast/neon4cast/ci_upgrade/R/to_hourly.R") -site_list <- readr::read_csv(paste0("https://github.com/eco4cast/", - "neon4cast-noaa-download/", - "raw/master/noaa_download_site_list.csv"), - show_col_types = FALSE) |> dplyr::pull(site_id) +site_list <- readr::read_csv(paste0("https://github.com/eco4cast/usgsrc4cast-ci/", + "raw/main/USGS_site_metadata.csv"), + show_col_types = FALSE) |> + dplyr::pull(site_id) future::plan("future::multisession", workers = 8) diff --git a/scoring/build_score_inventory.R b/scoring/build_score_inventory.R index 645689afb3..fba2215c1a 100644 --- a/scoring/build_score_inventory.R +++ b/scoring/build_score_inventory.R @@ -1,7 +1,9 @@ library(tidyverse) config <- yaml::read_yaml("challenge_configuration.yaml") -s3 <- arrow::s3_bucket(paste0(config$scores_bucket, "/parquet"), endpoint_override = config$endpoint, anonymous = TRUE) +s3 <- arrow::s3_bucket(paste0(config$scores_bucket, "/parquet"), + endpoint_override = config$endpoint, + anonymous = TRUE) bucket <- config$scores_bucket inventory_df <- arrow::open_dataset(s3) |> @@ -14,15 +16,18 @@ inventory_df <- arrow::open_dataset(s3) |> path_full = glue::glue("{bucket}/parquet/project_id={project_id}/duration={duration}/variable={variable}/model_id={model_id}/date={date}/part-0.parquet"), endpoint =config$endpoint) -sites <- readr::read_csv(config$site_table,show_col_types = FALSE) |> +sites <- readr::read_csv(config$site_table, + show_col_types = FALSE) |> select(field_site_id, latitude, longitude) |> rename(site_id = field_site_id) -inventory_df <- dplyr::left_join(inventory_df, sites, by = "site_id") +inventory_df <- dplyr::left_join(inventory_df, sites, + by = "site_id") s3_inventory <- arrow::s3_bucket(config$inventory_bucket, endpoint_override = config$endpoint, access_key = Sys.getenv("OSN_KEY"), secret_key = Sys.getenv("OSN_SECRET")) -arrow::write_dataset(inventory_df, path = s3_inventory$path(glue::glue("catalog/scores/project_id={config$project_id}"))) +arrow::write_dataset(inventory_df, + path = s3_inventory$path(glue::glue("catalog/scores/project_id={config$project_id}"))) diff --git a/scoring/scoring.R b/scoring/scoring.R index 3b18209c52..7eef5c4f8b 100644 --- a/scoring/scoring.R +++ b/scoring/scoring.R @@ -27,7 +27,9 @@ s3$CreateDir("scores") Sys.setenv("AWS_EC2_METADATA_DISABLED"="TRUE") Sys.unsetenv("AWS_DEFAULT_REGION") -s3_inv <- arrow::s3_bucket(paste0(config$inventory_bucket,"/catalog/forecasts/project_id=", config$project_id), endpoint_override = endpoint) +s3_inv <- arrow::s3_bucket(paste0(config$inventory_bucket,"/catalog/forecasts/project_id=", + config$project_id), + endpoint_override = endpoint) variable_duration <- arrow::open_dataset(s3_inv) |> dplyr::distinct(variable, duration, project_id) |> @@ -48,10 +50,14 @@ furrr::future_walk(1:nrow(variable_duration), function(k, variable_duration, con print(variable_duration[k,]) - s3_targets <- arrow::s3_bucket(glue::glue(config$targets_bucket,"/project_id={project_id}"), endpoint_override = endpoint) - s3_scores <- arrow::s3_bucket(config$scores_bucket, endpoint_override = endpoint) - s3_prov <- arrow::s3_bucket(config$prov_bucket, endpoint_override = endpoint) - s3_inv <- arrow::s3_bucket(paste0(config$inventory_bucket,"/catalog/forecasts"), endpoint_override = endpoint) + s3_targets <- arrow::s3_bucket(glue::glue(config$targets_bucket,"/project_id={project_id}"), + endpoint_override = endpoint) + s3_scores <- arrow::s3_bucket(config$scores_bucket, + endpoint_override = endpoint) + s3_prov <- arrow::s3_bucket(config$prov_bucket, + endpoint_override = endpoint) + s3_inv <- arrow::s3_bucket(paste0(config$inventory_bucket,"/catalog/forecasts"), + endpoint_override = endpoint) local_prov <- paste0(project_id,"-",duration,"-",variable, "-scoring_provenance.csv") @@ -68,7 +74,8 @@ furrr::future_walk(1:nrow(variable_duration), function(k, variable_duration, con s3_scores_path <- s3_scores$path(glue::glue("parquet/project_id={project_id}/duration={duration}/variable={variable}")) - s3_targets <- arrow::s3_bucket(glue::glue(config$targets_bucket), endpoint_override = endpoint) + s3_targets <- arrow::s3_bucket(glue::glue(config$targets_bucket), + endpoint_override = endpoint) target <- arrow::open_csv_dataset(s3_targets, schema = arrow::schema( diff --git a/targets/_targets.R b/targets/_targets.R index ad84283e18..4222116aa9 100644 --- a/targets/_targets.R +++ b/targets/_targets.R @@ -35,6 +35,8 @@ list( site_url = paste0("https://waterdata.usgs.gov/monitoring-location/", site_no)) %>% relocate(site_id) %>% relocate(site_url, .before = colocated) %>% + rename(latitude = dec_lat_va, + longitude = dec_long_va) %>% write_csv(file = out_file) return(out_file) } From 3a384816e51ca1d2f1817235600eb35859c6a6d3 Mon Sep 17 00:00:00 2001 From: Zwart Date: Wed, 20 Dec 2023 14:38:38 -0800 Subject: [PATCH 23/26] adding concatonate --- .github/workflows/targets.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/targets.yaml b/.github/workflows/targets.yaml index ed9fb4ef10..c0d731838e 100644 --- a/.github/workflows/targets.yaml +++ b/.github/workflows/targets.yaml @@ -23,7 +23,7 @@ jobs: - name: Generate targets shell: Rscript {0} run: | - install.packages("clustermq", "dataRetrieval", "RCurl", "tarchetypes", "targets") + install.packages(c("clustermq", "dataRetrieval", "RCurl", "tarchetypes", "targets")) setwd("targets") targets::tar_make() From c6073114b5c918ae88adb49af0e1386029226ceb Mon Sep 17 00:00:00 2001 From: Zwart Date: Wed, 20 Dec 2023 14:58:58 -0800 Subject: [PATCH 24/26] adding project id and duration to targets file --- targets/_targets.R | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/targets/_targets.R b/targets/_targets.R index 4222116aa9..fa183aa27a 100644 --- a/targets/_targets.R +++ b/targets/_targets.R @@ -32,8 +32,9 @@ list( whatNWISsites(sites = site_list_id) %>% tibble() %>% mutate(site_id = paste(agency_cd, site_no, sep = "-"), + project_id = "usgsrc4cast", site_url = paste0("https://waterdata.usgs.gov/monitoring-location/", site_no)) %>% - relocate(site_id) %>% + relocate(site_id, project_id) %>% relocate(site_url, .before = colocated) %>% rename(latitude = dec_lat_va, longitude = dec_long_va) %>% @@ -121,7 +122,9 @@ list( site_id = site_no, observation = chl_ug_L) %>% mutate(variable = "chla", - site_id = paste0("USGS-", site_id)) %>% + site_id = paste0("USGS-", site_id), + project_id = "usgsrc4cast", + duration = "P1D") %>% select(datetime, site_id, variable, observation) write_csv(out, file = out_file) return(out_file) From 8d5229e0dfa2960bdf1a9590b27d55204d3faabe Mon Sep 17 00:00:00 2001 From: Zwart Date: Wed, 20 Dec 2023 15:07:13 -0800 Subject: [PATCH 25/26] dur --- targets/_targets.R | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/targets/_targets.R b/targets/_targets.R index fa183aa27a..b4953bf570 100644 --- a/targets/_targets.R +++ b/targets/_targets.R @@ -125,7 +125,8 @@ list( site_id = paste0("USGS-", site_id), project_id = "usgsrc4cast", duration = "P1D") %>% - select(datetime, site_id, variable, observation) + select(datetime, site_id, #project_id, duration, + variable, observation) write_csv(out, file = out_file) return(out_file) }, From 3f93b69cfa979b5d0781fa09737deff49de2e057 Mon Sep 17 00:00:00 2001 From: Zwart Date: Wed, 20 Dec 2023 15:14:18 -0800 Subject: [PATCH 26/26] adding project id --- USGS_site_metadata.csv | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/USGS_site_metadata.csv b/USGS_site_metadata.csv index badaffae99..bbf584d711 100644 --- a/USGS_site_metadata.csv +++ b/USGS_site_metadata.csv @@ -1,11 +1,11 @@ -site_id,agency_cd,site_no,station_nm,site_tp_cd,dec_lat_va,dec_long_va,site_url,colocated,queryTime -USGS-14211720,USGS,14211720,"WILLAMETTE RIVER AT PORTLAND, OR",ST-TS,45.5175,-122.6691667,https://waterdata.usgs.gov/monitoring-location/14211720,FALSE,2023-12-19T00:46:32Z -USGS-14211010,USGS,14211010,"CLACKAMAS RIVER NEAR OREGON CITY, OR",ST,45.3792874,-122.5773134,https://waterdata.usgs.gov/monitoring-location/14211010,FALSE,2023-12-19T00:46:32Z -USGS-14181500,USGS,14181500,"NORTH SANTIAM RIVER AT NIAGARA, OR",ST,44.75377778,-122.2974444,https://waterdata.usgs.gov/monitoring-location/14181500,FALSE,2023-12-19T00:46:32Z -USGS-05586300,USGS,05586300,"ILLINOIS RIVER AT FLORENCE, IL",ST,39.63275,-90.6076667,https://waterdata.usgs.gov/monitoring-location/05586300,FALSE,2023-12-19T00:46:32Z -USGS-05558300,USGS,05558300,"ILLINOIS RIVER AT HENRY, IL",ST,41.10727778,-89.3562222,https://waterdata.usgs.gov/monitoring-location/05558300,FALSE,2023-12-19T00:46:32Z -USGS-05553700,USGS,05553700,"ILLINOIS RIVER AT STARVED ROCK, IL",ST,41.3247564,-88.9839693,https://waterdata.usgs.gov/monitoring-location/05553700,FALSE,2023-12-19T00:46:32Z -USGS-05543010,USGS,05543010,"ILLINOIS RIVER AT SENECA, IL",ST,41.29988889,-88.6141944,https://waterdata.usgs.gov/monitoring-location/05543010,FALSE,2023-12-19T00:46:32Z -USGS-05549500,USGS,05549500,"FOX RIVER NEAR MCHENRY, IL",ST,42.3100222,-88.2514745,https://waterdata.usgs.gov/monitoring-location/05549500,FALSE,2023-12-19T00:46:32Z -USGS-01427510,USGS,01427510,DELAWARE RIVER AT CALLICOON NY,ST,41.75675,-75.0574167,https://waterdata.usgs.gov/monitoring-location/01427510,FALSE,2023-12-19T00:46:32Z -USGS-01463500,USGS,01463500,Delaware River at Trenton NJ,ST,40.22166667,-74.7780556,https://waterdata.usgs.gov/monitoring-location/01463500,FALSE,2023-12-19T00:46:32Z +site_id,project_id,agency_cd,site_no,station_nm,site_tp_cd,latitude,longitude,site_url,colocated,queryTime +USGS-14211720,usgsrc4cast,USGS,14211720,"WILLAMETTE RIVER AT PORTLAND, OR",ST-TS,45.5175,-122.6691667,https://waterdata.usgs.gov/monitoring-location/14211720,FALSE,2023-12-20T22:59:24Z +USGS-14211010,usgsrc4cast,USGS,14211010,"CLACKAMAS RIVER NEAR OREGON CITY, OR",ST,45.3792874,-122.5773134,https://waterdata.usgs.gov/monitoring-location/14211010,FALSE,2023-12-20T22:59:24Z +USGS-14181500,usgsrc4cast,USGS,14181500,"NORTH SANTIAM RIVER AT NIAGARA, OR",ST,44.75377778,-122.2974444,https://waterdata.usgs.gov/monitoring-location/14181500,FALSE,2023-12-20T22:59:24Z +USGS-05586300,usgsrc4cast,USGS,05586300,"ILLINOIS RIVER AT FLORENCE, IL",ST,39.63275,-90.6076667,https://waterdata.usgs.gov/monitoring-location/05586300,FALSE,2023-12-20T22:59:24Z +USGS-05558300,usgsrc4cast,USGS,05558300,"ILLINOIS RIVER AT HENRY, IL",ST,41.10727778,-89.3562222,https://waterdata.usgs.gov/monitoring-location/05558300,FALSE,2023-12-20T22:59:24Z +USGS-05553700,usgsrc4cast,USGS,05553700,"ILLINOIS RIVER AT STARVED ROCK, IL",ST,41.3247564,-88.9839693,https://waterdata.usgs.gov/monitoring-location/05553700,FALSE,2023-12-20T22:59:24Z +USGS-05543010,usgsrc4cast,USGS,05543010,"ILLINOIS RIVER AT SENECA, IL",ST,41.29988889,-88.6141944,https://waterdata.usgs.gov/monitoring-location/05543010,FALSE,2023-12-20T22:59:24Z +USGS-05549500,usgsrc4cast,USGS,05549500,"FOX RIVER NEAR MCHENRY, IL",ST,42.3100222,-88.2514745,https://waterdata.usgs.gov/monitoring-location/05549500,FALSE,2023-12-20T22:59:24Z +USGS-01427510,usgsrc4cast,USGS,01427510,DELAWARE RIVER AT CALLICOON NY,ST,41.75675,-75.0574167,https://waterdata.usgs.gov/monitoring-location/01427510,FALSE,2023-12-20T22:59:24Z +USGS-01463500,usgsrc4cast,USGS,01463500,Delaware River at Trenton NJ,ST,40.22166667,-74.7780556,https://waterdata.usgs.gov/monitoring-location/01463500,FALSE,2023-12-20T22:59:24Z