diff --git a/.github/workflows/build_push_analyze_pad_qaqc_envscn.yml b/.github/workflows/build_push_analyze_pad_qaqc_envscn.yml index 5f8535ffc..6ba29cde1 100644 --- a/.github/workflows/build_push_analyze_pad_qaqc_envscn.yml +++ b/.github/workflows/build_push_analyze_pad_qaqc_envscn.yml @@ -3,7 +3,7 @@ name: "Build-push_analyze_pad_qaqc_envscn" on: push: branches: - - 'master' + - 'swc.dev' paths: - 'modules_combined/qaqc_plau_and_radiation_custom/**' - 'modules/padded_timeseries_analyzer/**' diff --git a/flow/flow.envscn.temp.flags/TEST_SUMMARY.txt b/flow/flow.envscn.temp.flags/TEST_SUMMARY.txt new file mode 100644 index 000000000..edab779fe --- /dev/null +++ b/flow/flow.envscn.temp.flags/TEST_SUMMARY.txt @@ -0,0 +1,358 @@ +################################################################################ +# Test Suite Summary for Temperature Flag Functions +# File: test-wrap-envscn-temp-flags.R +# Author: Teresa Burlingame +# Date: February 2026 +# Last Updated: February 26, 2026 +################################################################################ + +================================================================================ +UNIT TESTS (Tests 1-5) +================================================================================ + +TEST 1: def.sort.qf.cols - Column Sorting Function +-------------------------------------------------------------------------------- +Description: Tests the sorting of quality flag columns +Test Cases (3 tests): + 1.1 Correctly sorts quality flag columns with depth numbers + 1.2 Handles empty input + 1.3 Handles columns without depth numbers + +Key Validations: + - Static columns (readout_time) come first + - tempTest columns are sorted numerically by depth (e.g., 01, 02, 03) + - All columns are preserved in output + - Empty inputs return empty output without error + +================================================================================ + +TEST 2: def.find.temp.sensor - Sensor Selection Logic +-------------------------------------------------------------------------------- +Description: Tests the logic for finding the closest temperature sensor +Test Cases (5 tests): + 2.1 Finds closest sensor to target depth and identifies neighbors + 2.2 Handles sensors with all NA depths (returns NULL) + 2.3 Breaks ties by preferring shallower (less negative) sensors + 2.4 Identifies edge sensors without neighbors on one side + 2.5 Filters out sensors with NA depths from consideration + +Key Validations: + - Returns sensor closest to target depth + - Correctly identifies higher (shallower/less negative) neighbors + - Correctly identifies lower (deeper/more negative) neighbors + - Returns NULL when no valid sensors exist + - Handles boundary conditions (shallowest/deepest sensors) + - Shallowest sensor has no higher neighbor + - Deepest sensor has no lower neighbor + +================================================================================ + +TEST 3: def.load.temp.sensors - Temperature Sensor Data Loading +-------------------------------------------------------------------------------- +Description: Tests loading temperature sensor metadata from location files +Test Cases (5 tests): + 3.1 Loads temperature sensor metadata successfully from test data + 3.2 Handles empty directories (returns empty data frame) + 3.3 Averages depths when multiple location files exist for same sensor + 3.4 Returns empty data frame when no location files present + 3.5 Handles missing z_offset field in location files (results in NA depth) + +Key Validations: + - Returns data frame with required columns: sensor_id, depth_m, data_path, location_path + - Sensor IDs have correct prefix (temp-soil_) + - Depths are numeric and non-positive (at or below surface, <= 0) + - File paths exist and are accessible + - Multiple location files for same sensor result in averaged depth + - Missing z_offset field leads to NA in depth_m column + +================================================================================ + +TEST 4: def.calc.temp.flags - Temperature Flag Calculation +-------------------------------------------------------------------------------- +Description: Tests the core temperature flag calculation logic +Test Cases (3 tests): + 4.1 Basic flag calculation (freezing check: temp < uncertainty) + 4.2 Handles neighbors that are too far away (exceeds distance threshold) + 4.3 Falls back to neighbor data when primary sensor is flagged (finalQF != 0) + +Key Validations: + - Flag = 1 when soilTempMean < soilTempExpUncert (potential freezing) + - Flag = 0 when temperature is above uncertainty threshold (not frozen) + - Flag = -1 when primary sensor has bad QF and neighbors too far or unavailable + - Correctly averages neighbor sensor data when needed + - Respects distance threshold for neighbor selection (default 0.15m) + - Uses primary sensor when finalQF = 0 (good data) + - Uses neighbor average when primary sensor finalQF != 0 (flagged data) + +Flag Meanings: + 0 = Data is good (not frozen) + 1 = Data flagged (potentially frozen: soilTempMean < soilTempExpUncert) + -1 = Cannot determine (missing, unreliable, or neighbors too distant) + +================================================================================ + +TEST 5: def.apply.temp.flags - Flag Application to High-Frequency Data +-------------------------------------------------------------------------------- +Description: Tests joining minute-interval flags to high-frequency soil moisture +Test Cases (2 tests): + 5.1 Correctly joins flags to high-frequency data based on timestamps + 5.2 Handles timestamps outside any temperature interval (remain -1) + +Key Validations: + - High-frequency data points correctly matched to minute intervals + - Points inside temperature intervals receive corresponding flag (0 or 1) + - Points outside temperature intervals retain -1 flag + - Temporal overlap logic works correctly using foverlaps + - readout_time used for temporal matching + +================================================================================ +INTEGRATION TESTS (Test 6) +================================================================================ + +Description: Full end-to-end testing with realistic data scenarios +All integration tests verify: + - Output directory structure created correctly + - Flag parquet files written successfully + - All 8 tempTestDepth columns present (depth01 through depth08) + - Flags have valid values only: -1, 0, or 1 + - Timestamp column (readout_time) preserved + +Total Integration Tests: 8 + +-------------------------------------------------------------------------------- +TEST 6.1: Baseline Test with Good Data +-------------------------------------------------------------------------------- +Scenario: Normal operating conditions with complete valid data +Data: + - Good soil moisture data with valid depths and threshold file + - Good temperature sensor data with valid locations and z_offset +Test Data Path: + - DirIn: pfs/envscn_temp_flags/enviroscan/tests/good_data/ + - DirTemp: pfs/envscn_temp_flags/temp/tests/good_data/ +Expected Result: + - Flags calculated successfully + - Mix of 0, 1, and -1 values based on actual conditions + - All 8 tempTestDepth columns present and populated + +-------------------------------------------------------------------------------- +TEST 6.2: Missing Soil Moisture Depths +-------------------------------------------------------------------------------- +Scenario: Depth information missing from soil moisture data files +Data: + - Soil moisture data WITHOUT depth metadata in location files + - Good temperature sensor data +Test Data Path: + - DirIn: pfs/envscn_temp_flags/enviroscan/tests/no_depths/ + - DirTemp: pfs/envscn_temp_flags/temp/tests/good_data/ +Expected Result: + - All flags set to -1 (cannot match sensors to depths without depth info) + - Process completes without error + - tempTestDepth01QF and all other depth columns contain only -1 + +-------------------------------------------------------------------------------- +TEST 6.3: Freezing Temperature Conditions +-------------------------------------------------------------------------------- +Scenario: All temperature values indicate freezing conditions +Data: + - Good soil moisture data with valid depths + - Temperature data with all values < uncertainty threshold (simulated freezing) +Test Data Path: + - DirIn: pfs/envscn_temp_flags/enviroscan/tests/good_data/ + - DirTemp: pfs/envscn_temp_flags/temp/tests/all_freezing/ +Expected Result: + - Most/all flags set to 1 (flagged as frozen) + - Demonstrates frozen soil detection logic + - tempTestDepth02QF expected to be 1 for all rows + +-------------------------------------------------------------------------------- +TEST 6.4: Missing Temperature Data Directory +-------------------------------------------------------------------------------- +Scenario: Temperature sensor data directory does not exist +Data: + - Good soil moisture data + - Non-existent temperature data path +Test Data Path: + - DirIn: pfs/envscn_temp_flags/enviroscan/tests/good_data/ + - DirTemp: pfs/envscn_temp_flags/temp/tests/no_temp_data/2020/10/14 +Expected Result: + - All flags set to -1 (no temperature data available) + - Process completes without error (graceful degradation) + - All 8 tempTestDepth columns contain only -1 + +-------------------------------------------------------------------------------- +TEST 6.5: Missing z_offset in Location Files +-------------------------------------------------------------------------------- +Scenario: Temperature sensor location files lack z_offset field +Data: + - Good soil moisture data + - Temperature location files missing z_offset field (cannot determine depth) +Test Data Path: + - DirIn: pfs/envscn_temp_flags/enviroscan/tests/good_data/ + - DirTemp: pfs/envscn_temp_flags/temp/tests/no_z_offset/ +Expected Result: + - Some flags may be -1 where depth cannot be determined + - Process continues with available data + - Valid values (0, 1, -1) only + - All 8 tempTestDepth columns present + +-------------------------------------------------------------------------------- +TEST 6.6: Missing Threshold Configuration File +-------------------------------------------------------------------------------- +Scenario: Required threshold configuration file is absent from soil moisture data +Data: + - Soil moisture data WITHOUT threshold/thresholds.json file + - Temperature data present but not reached due to error +Test Data Path: + - DirIn: pfs/envscn_temp_flags/enviroscan/tests/no_thresholds/ + - DirTemp: pfs/envscn_temp_flags/temp/tests/no_temp_data/ +Expected Result: + - Function throws error (threshold file is mandatory) + - Error handling test validates proper failure mode + - wrap.envscn.temp.flags() exits with expect_error + +-------------------------------------------------------------------------------- +TEST 6.7: NULL DirTemp Parameter (Required for Tests) +-------------------------------------------------------------------------------- +Scenario: DirTemp parameter provided as NULL (function should handle gracefully) +Data: + - Good soil moisture data with valid depths + - DirTemp = NULL (no temperature data path specified) +Test Data Path: + - DirIn: pfs/envscn_temp_flags/enviroscan/tests/good_data/ + - DirTemp: NULL +Expected Result: + - Function runs successfully (does not error) + - All flags set to -1 (no temperature data available) + - Process completes and writes output files + - All 8 tempTestDepth columns present with -1 values +Note: This validates that temp directory is required but NULL is acceptable + +-------------------------------------------------------------------------------- +TEST 6.8: Combined DirIn and DirTemp (Filter-Joiner Output) +-------------------------------------------------------------------------------- +Scenario: Testing with data structure where enviroscan and temp-soil are + in the same parent directory (post filter-joiner combination) +Data: + - Combined directory structure with both enviroscan and temp-soil subdirs + - DirTemp is calculated as dirname(dirname(DirIn)) within test +Test Data Path: + - DirIn: pfs/envscn_temp_flags/combined/tests/2025/10/17/ + conc-h2o-soil-salinity_GRSM001501/enviroscan/CFGLOC105245/ + - DirTemp: (calculated) ...conc-h2o-soil-salinity_GRSM001501/ +Expected Result: + - Flags calculated successfully with combined data structure + - All 8 tempTestDepth columns present + - Valid flag values (0, 1, -1) throughout + - Demonstrates compatibility with filter-joiner pipeline output + +================================================================================ +TEST DATA ORGANIZATION +================================================================================ + +Test data is organized under: tests/testthat/pfs/envscn_temp_flags/ + +Structure: + temp/ # Temperature sensor data + tests/ + good_data/ # Normal operating data with valid depths + multiple_depth/ # Multiple location files per sensor (test averaging) + no_locations/ # Missing location files + no_z_offset/ # Location files without z_offset field + all_freezing/ # All temperatures below freezing threshold + 2025/10/14/ # Empty directory for "no data" test + + enviroscan/ # Soil moisture data + tests/ + good_data/ # Normal operating data with valid depths + no_depths/ # Missing depth metadata in location files + no_thresholds/ # Missing threshold configuration file + + combined/ # Combined structure (post filter-joiner) + tests/ + 2025/10/17/ + conc-h2o-soil-salinity_GRSM001501/ + enviroscan/ # Soil moisture subdirectory + temp-soil_*/ # Temperature sensor subdirectories + +Test data was created from production data using copy scripts: + - Truncated to 50 rows per parquet file for efficiency + - Maintains realistic data structure and relationships + - Filtered to single group (GRSM001501) for combined tests + +================================================================================ +TESTING INSTRUCTIONS +================================================================================ + +To run all tests: + cd ~/github/NEON-IS-data-processing/flow/flow.envscn.temp.flags + Rscript run_unit_tests.R + +To run tests interactively in R: + setwd("~/github/NEON-IS-data-processing/flow/tests/testthat") + library(testthat) + test_file("test-wrap-envscn-temp-flags.R") + +To run a specific test by name: + test_file("test-wrap-envscn-temp-flags.R", filter = "sort.qf.cols") + test_file("test-wrap-envscn-temp-flags.R", filter = "find.temp.sensor") + test_file("test-wrap-envscn-temp-flags.R", filter = "Integration test with good data") + +To run only unit tests (skip integration tests): + test_file("test-wrap-envscn-temp-flags.R", filter = "Test def\\.") + +To run only integration tests: + test_file("test-wrap-envscn-temp-flags.R", filter = "Integration test") + +Before running tests: + 1. Ensure test data exists in tests/testthat/pfs/envscn_temp_flags/ + 2. Verify working directory is correct + 3. Required libraries: testthat, data.table, arrow, jsonlite + 4. Source required function files (done automatically by run_unit_tests.R) + +Test Data Requirements: + - Test data must be in tests/testthat/pfs/envscn_temp_flags/ + - Combined test data must be in combined/tests/ subdirectory + - Tests will skip if data directories don't exist (except error tests) + +================================================================================ +COVERAGE SUMMARY +================================================================================ + +Total Test Suites: 13 (5 unit test suites + 8 integration tests) +Total Test Cases: 26 + - Unit Tests: 18 test cases across 5 functions + - Integration Tests: 8 end-to-end scenarios + +Unit Test Coverage: + ✓ Column sorting and organization (3 tests) + ✓ Sensor depth matching logic (5 tests) + ✓ Sensor metadata loading and parsing (5 tests) + ✓ Flag calculation with fallback logic (3 tests) + ✓ Temporal flag application (2 tests) + +Integration Test Coverage: + ✓ Normal operating conditions + ✓ Missing metadata (depths, locations, z_offset) + ✓ Missing data (temperature sensors, directories) + ✓ Edge conditions (freezing temperatures) + ✓ Error conditions (missing required files) + ✓ NULL parameter handling (DirTemp = NULL) + ✓ Combined data structure (filter-joiner pipeline output) + +Functions Tested: + - def.sort.qf.cols() - Column sorting + - def.find.temp.sensor() - Sensor matching + - def.load.temp.sensors() - Metadata loading + - def.calc.temp.flags() - Flag calculation + - def.apply.temp.flags() - Flag application + - wrap.envscn.temp.flags() - Main wrapper function + +Test Assertions: 80+ + - Structural validations (column presence, data types) + - Logical validations (flag values, neighbor selection) + - Edge case handling (empty data, missing fields) + - Error handling (required parameters, missing files) + +================================================================================ +END OF TEST SUMMARY +================================================================================ diff --git a/flow/flow.envscn.temp.flags/def.apply.temp.flags.R b/flow/flow.envscn.temp.flags/def.apply.temp.flags.R new file mode 100644 index 000000000..5836189b6 --- /dev/null +++ b/flow/flow.envscn.temp.flags/def.apply.temp.flags.R @@ -0,0 +1,84 @@ +############################################################################################## +#' @title Apply temperature flags to high-frequency data + +#' @author +#' Teresa Burlingame \email{tburlingame@battelleecology.org} + +#' @description +#' Join minute-interval temperature flags to high-frequency (e.g., 10-second) soil moisture data +#' using time-based overlap matching. + +#' @param dataSm Data frame containing soil moisture data with readout_time column +#' @param tempData Data frame with temperature flags (startDateTime, endDateTime, temp_flag) +#' @param qfColName Character. Name of the QF column to update in dataSm +#' @param log A logger object. Defaults to NULL. + +#' @return Updated dataSm data frame with qfColName column populated with temperature flags + +#' @references +#' License: GNU AFFERO GENERAL PUBLIC LICENSE Version 3, 19 November 2007 + +#' @seealso Currently none + +#' @export + +# changelog and author contributions / copyrights +# Teresa Burlingame (2025-02-17) +#' original creation +############################################################################################## +def.apply.temp.flags <- function(dataSm, + tempData, + qfColName, + log = NULL) { + + # Initialize log if not provided + if (base::is.null(log)) { + log <- NEONprocIS.base::def.log.init() + } + + # Convert to data.table for efficient joins + dtSm <- data.table::as.data.table(dataSm) + dtTemp <- data.table::as.data.table(tempData)[, .(startDateTime, endDateTime, temp_flag)] + + # Ensure proper datetime format + dtSm[, `:=`( + readout_start = base::as.POSIXct(readout_time, tz = "UTC"), + readout_end = base::as.POSIXct(readout_time, tz = "UTC") + )] + + dtTemp[, `:=`( + startDateTime = base::as.POSIXct(startDateTime, tz = "UTC"), + endDateTime = base::as.POSIXct(endDateTime, tz = "UTC"), + temp_flag = base::as.integer(temp_flag) + )] + + # Set key for foverlaps (required on the interval table) + data.table::setkey(dtTemp, startDateTime, endDateTime) + + # Perform overlap join - find which minute interval each point falls within + joined <- data.table::foverlaps( + x = dtSm[, .(readout_start, readout_end, .rows = .I)], + y = dtTemp[, .(startDateTime, endDateTime, temp_flag)], + by.x = c("readout_start", "readout_end"), + by.y = c("startDateTime", "endDateTime"), + type = "within", # point must fall within interval + nomatch = NA_integer_ + ) + + # Get current QF values + newQf <- dataSm[[qfColName]] + + # Update QF values where we found a matching interval + hasMatch <- !base::is.na(joined$temp_flag) + newQf[joined$.rows[hasMatch]] <- joined$temp_flag[hasMatch] + + # Assign back to original data frame + dataSm[[qfColName]] <- newQf + + numMatched <- base::sum(hasMatch) + numTotal <- base::nrow(dataSm) + log$debug(base::paste0('Applied temperature flags: ', numMatched, ' / ', numTotal, + ' rows matched (', base::round(100 * numMatched / numTotal, 1), '%)')) + + return(dataSm) +} diff --git a/flow/flow.envscn.temp.flags/def.calc.temp.flags.R b/flow/flow.envscn.temp.flags/def.calc.temp.flags.R new file mode 100644 index 000000000..2fb20397f --- /dev/null +++ b/flow/flow.envscn.temp.flags/def.calc.temp.flags.R @@ -0,0 +1,159 @@ +############################################################################################## +#' @title Calculate temperature test flags for soil moisture data + +#' @author +#' Teresa Burlingame \email{tburlingame@battelleecology.org} + +#' @description +#' Calculate temperature-based quality flags by comparing soil temperature to uncertainty. +#' If primary sensor is flagged, uses average of neighboring sensors. + +#' @param sensorInfo List containing 'closest' sensor and 'neighbors' list (from def.find.temp.sensor) +#' @param targetDepth Numeric. The target depth (in meters) for distance validation +#' @param distThreshold Numeric. Maximum allowed distance (in meters) between sensor and target depth +#' @param log A logger object. Defaults to NULL. + +#' @return Data frame with columns: +#' \describe{ +#' \item{startDateTime}{Start time of measurement interval} +#' \item{endDateTime}{End time of measurement interval} +#' \item{temp_flag}{Flag value: 0=pass, 1=fail, -1=test not run} +#' } + +#' @references +#' License: GNU AFFERO GENERAL PUBLIC LICENSE Version 3, 19 November 2007 + +#' @seealso Currently none + +#' @export + +# changelog and author contributions / copyrights +# Teresa Burlingame (2025-02-17) +#' original creation +############################################################################################## +def.calc.temp.flags <- function(sensorInfo, + targetDepth = NULL, + distThreshold = NULL, + log = NULL) { + + # Initialize log if not provided + if (base::is.null(log)) { + log <- NEONprocIS.base::def.log.init() + } + + # Constants + QF_PASS <- 0L + QF_FAIL <- 1L + QF_NA <- -1L + TEMP_DIFF_THRESHOLD <- 1 # degrees + + # Read primary sensor data + closestSensor <- sensorInfo$closest + tempDataClose <- NEONprocIS.base::def.read.parq(closestSensor$data_path) + + # Initialize output data frame + tempData <- tempDataClose[, c('startDateTime', 'endDateTime')] + tempData$temp_flag <- NA_integer_ + + # Check if primary sensor has good data (finalQF == 0) + idxGood <- !base::is.na(tempDataClose$finalQF) & tempDataClose$finalQF == QF_PASS + + if (base::all(idxGood)) { + # All primary sensor data is good - use it directly + log$debug(base::paste0('Using primary sensor ', closestSensor$sensor_id, ' (all data good)')) + tempData$temp_flag <- base::as.integer( + tempDataClose$soilTempMean < tempDataClose$soilTempExpUncert + ) + + } else { + # Some primary data is flagged - need to use neighbors for those intervals + log$debug(base::paste0('Primary sensor has flagged data, attempting neighbor average')) + + # Use primary sensor where data is good + tempData$temp_flag[idxGood] <- base::as.integer( + tempDataClose$soilTempMean[idxGood] < tempDataClose$soilTempExpUncert[idxGood] + ) + + # Try to use neighbor average for flagged intervals + nextHigher <- sensorInfo$neighbors$higher + nextLower <- sensorInfo$neighbors$lower + + # Check if neighbors exist and are within acceptable distance + useNeighbors <- FALSE + if (!base::is.null(nextHigher) && !base::is.null(nextLower) && !base::is.null(targetDepth) && !base::is.null(distThreshold)) { + distHigher <- base::abs(targetDepth - nextHigher$depth_m) + distLower <- base::abs(targetDepth - nextLower$depth_m) + + if (distHigher > distThreshold || distLower > distThreshold) { + log$warn(base::paste0('Neighbor sensors exceed ', distThreshold, 'm distance threshold. ', + 'Higher: ', base::round(distHigher, 3), 'm, ', + 'Lower: ', base::round(distLower, 3), 'm. ', + 'Skipping neighbor averaging.')) + } else { + useNeighbors <- TRUE + } + } else if (!base::is.null(nextHigher) && !base::is.null(nextLower)) { + # targetDepth or distThreshold not provided, proceed without distance check (legacy behavior) + useNeighbors <- TRUE + } + + if (useNeighbors) { + # Read neighbor data + tempDataHigher <- NEONprocIS.base::def.read.parq(nextHigher$data_path) + tempDataLower <- NEONprocIS.base::def.read.parq(nextLower$data_path) + + # Filter for good data only (finalQF < 1) + tempDataHigher <- tempDataHigher[tempDataHigher$finalQF < 1, ] + tempDataLower <- tempDataLower[tempDataLower$finalQF < 1, ] + + # Calculate test statistic for each neighbor + tempDataLower$zeroCheckLow <- tempDataLower$soilTempMean - tempDataLower$soilTempExpUncert + tempDataHigher$zeroCheckHigh <- tempDataHigher$soilTempMean - tempDataHigher$soilTempExpUncert + + # Join neighbor data + tempDataJoin <- base::merge( + tempDataLower[, c("startDateTime", "endDateTime", "zeroCheckLow")], + tempDataHigher[, c("startDateTime", "endDateTime", "zeroCheckHigh")], + by = c("startDateTime", "endDateTime"), + all = TRUE + ) + + # Calculate average of neighbor checks + tempDataJoin$avgZeroCheck <- base::rowMeans( + base::cbind(tempDataJoin$zeroCheckLow, tempDataJoin$zeroCheckHigh), + na.rm = TRUE + ) + tempDataJoin$avgZeroCheck[base::is.nan(tempDataJoin$avgZeroCheck)] <- NA_real_ + + # Test if average is less than threshold + tempDataJoin$zeroCheck <- base::ifelse( + base::is.na(tempDataJoin$avgZeroCheck), + NA_integer_, + base::as.integer(tempDataJoin$avgZeroCheck < TEMP_DIFF_THRESHOLD) + ) + + # Merge with primary data and fill in gaps + tempData <- base::merge( + tempData, + tempDataJoin[, c("startDateTime", "endDateTime", "zeroCheck")], + by = c("startDateTime", "endDateTime"), + all.x = TRUE + ) + + # Use neighbor check where primary flag is NA + idxNeedNeighbor <- base::is.na(tempData$temp_flag) + tempData$temp_flag[idxNeedNeighbor] <- tempData$zeroCheck[idxNeedNeighbor] + tempData$zeroCheck <- NULL + + log$debug(base::paste0('Filled ', base::sum(idxNeedNeighbor & !base::is.na(tempData$temp_flag)), + ' intervals using neighbor average')) + } else { + log$warn('Insufficient neighbor sensors to calculate backup flags') + } + } + + # Set remaining NA values to -1 (test could not be run) + tempData$temp_flag[base::is.na(tempData$temp_flag)] <- QF_NA + + return(tempData) +} diff --git a/flow/flow.envscn.temp.flags/def.find.temp.sensor.R b/flow/flow.envscn.temp.flags/def.find.temp.sensor.R new file mode 100644 index 000000000..79e6afa09 --- /dev/null +++ b/flow/flow.envscn.temp.flags/def.find.temp.sensor.R @@ -0,0 +1,90 @@ +############################################################################################## +#' @title Find closest temperature sensor to target depth + +#' @author +#' Teresa Burlingame \email{tburlingame@battelleecology.org} + +#' @description +#' Identify the temperature sensor with depth closest to the target depth. +#' In case of tie, prefers shallower (less negative/more positive) depth. + +#' @param targetDepth Numeric value. Target depth in meters (negative = below surface) +#' @param sensorDepthDf Data frame with columns sensor_id, depth_m, data_path, location_path +#' @param log A logger object. Defaults to NULL. + +#' @return A list with two elements: +#' \describe{ +#' \item{closest}{Data frame row for the closest sensor} +#' \item{neighbors}{List with elements 'higher' and 'lower' containing neighbor sensor info} +#' } + +#' @references +#' License: GNU AFFERO GENERAL PUBLIC LICENSE Version 3, 19 November 2007 + +#' @seealso Currently none + +#' @export + +# changelog and author contributions / copyrights +# Teresa Burlingame (2025-02-17) +#' original creation +############################################################################################## +def.find.temp.sensor <- function(targetDepth, + sensorDepthDf, + log = NULL) { + + # Initialize log if not provided + if (base::is.null(log)) { + log <- NEONprocIS.base::def.log.init() + } + + # Filter out sensors with missing depths + validSensors <- sensorDepthDf[!base::is.na(sensorDepthDf$depth_m), ] + + if (base::nrow(validSensors) == 0) { + log$warn('no valid temperature depths found, all data will be flagged -1') + return(NULL) + } + + # Calculate absolute difference from target depth + validSensors$abs_diff <- base::abs(validSensors$depth_m - targetDepth) + + # Sort by: 1) smallest difference, 2) shallowest depth, 3) sensor_id (for stability) + validSensors <- validSensors[base::order(validSensors$abs_diff, + -validSensors$depth_m, + validSensors$sensor_id), ] + + # Select closest sensor + closestSensor <- validSensors[1, c("sensor_id", "depth_m", "data_path", "location_path")] + closestDepth <- closestSensor$depth_m + + # Find neighbor sensors (one shallower, one deeper) + # Shallower = greater depth_m (less negative) + higherSensors <- validSensors[validSensors$depth_m > closestDepth, ] + if (base::nrow(higherSensors) > 0) { + higherSensors <- higherSensors[base::order(higherSensors$depth_m, higherSensors$sensor_id), ] + nextHigher <- higherSensors[1, c("sensor_id", "depth_m", "data_path", "location_path")] + } else { + nextHigher <- NULL + } + + # Deeper = smaller depth_m (more negative) + lowerSensors <- validSensors[validSensors$depth_m < closestDepth, ] + if (base::nrow(lowerSensors) > 0) { + lowerSensors <- lowerSensors[base::order(-lowerSensors$depth_m, lowerSensors$sensor_id), ] + nextLower <- lowerSensors[1, c("sensor_id", "depth_m", "data_path", "location_path")] + } else { + nextLower <- NULL + } + + log$debug(base::paste0('Closest sensor to depth ', targetDepth, 'm: ', + closestSensor$sensor_id, ' (', closestDepth, 'm)')) + + return(base::list( + closest = closestSensor, + neighbors = base::list( + higher = nextHigher, + lower = nextLower + ) + )) +} diff --git a/flow/flow.envscn.temp.flags/def.load.temp.sensors.R b/flow/flow.envscn.temp.flags/def.load.temp.sensors.R new file mode 100644 index 000000000..5dc88dcac --- /dev/null +++ b/flow/flow.envscn.temp.flags/def.load.temp.sensors.R @@ -0,0 +1,147 @@ +############################################################################################## +#' @title Load temperature sensor metadata and data paths + +#' @author +#' Teresa Burlingame \email{tburlingame@battelleecology.org} + +#' @description +#' Extract temperature sensor IDs, depths, and file paths from a directory structure. +#' Parses location files to extract z_offset (depth) and matches with corresponding data files. + +#' @param DirTemp Character value. Path to directory containing temperature sensor data with +#' subdirectories structured as temp-soil_SENSORID/data/ and temp-soil_SENSORID/location/ + +#' @param log A logger object as produced by NEONprocIS.base::def.log.init to produce structured log +#' output. Defaults to NULL. + +#' @return A data frame with columns: +#' \describe{ +#' \item{sensor_id}{Sensor identifier (e.g., temp-soil_GRSM005501)} +#' \item{depth_m}{Sensor depth in meters (negative = below surface)} +#' \item{location_path}{Path to location JSON file} +#' \item{data_path}{Path to data parquet file} +#' } + +#' @references +#' License: GNU AFFERO GENERAL PUBLIC LICENSE Version 3, 19 November 2007 + +#' @seealso Currently none + +#' @export + +# changelog and author contributions / copyrights +# Teresa Burlingame (2025-02-17) +# original creation +############################################################################################## +def.load.temp.sensors <- function(DirTemp, + log = NULL) { + + # Initialize log if not provided + if (base::is.null(log)) { + log <- NEONprocIS.base::def.log.init() + } + + # Initialize log if not provided + if (base::is.null(DirTemp)) { + log$warn("no temperature data found, returning NULL") + filesTempData <- NULL + filesTempLocation <- NULL + } else { + # Find all temperature sensor files + filesTemp <- base::list.files(DirTemp, full.names = TRUE, recursive = TRUE) + # Filter for 1-minute data files and location JSON files + filesTempData <- filesTemp[base::grepl("/temp-soil_[^/]+/data/[^/]+001\\.parquet$", filesTemp)] + filesTempLocation <- filesTemp[base::grepl("/temp-soil_[^/]+/location/[^/]*_locations\\.json$", filesTemp)] + } + + if (base::length(filesTempData) == 0) { + log$warn(base::paste0('No temperature data files found in ', DirTemp)) + return(data.frame(sensor_id = character(), depth_m = numeric(), + location_path = character(), data_path = character())) + } + + if (base::length(filesTempLocation) == 0) { + log$warn(base::paste0('No temperature location files found in ', DirTemp, + '. Temperature test will not run.')) + return(data.frame(sensor_id = character(), depth_m = numeric(), + location_path = character(), data_path = character())) + } + + # Helper function to extract sensor ID from path + extract_sensor_id <- function(paths) { + matches <- base::regmatches(paths, base::regexpr("temp-soil_[^/]+", paths)) + return(matches) + } + + # Helper function to extract z_offset from location JSON + extract_z_offset <- function(path) { + base::tryCatch({ + locData <- jsonlite::fromJSON(path, simplifyVector = FALSE) + zOffset <- locData$features[[1]]$properties$locations$features[[1]]$properties$z_offset + # Check if zOffset is NULL or has length 0 + if (base::is.null(zOffset) || base::length(zOffset) == 0) { + return(NA_real_) + } + return(base::as.numeric(zOffset)) + }, error = function(e) { + return(NA_real_) + }) + } + + + # Build location metadata table + sensorIds <- extract_sensor_id(filesTempLocation) + depths <- base::vapply(filesTempLocation, extract_z_offset, numeric(1)) + + dfLocations <- data.frame( + sensor_id = sensorIds, + depth_m = depths, + location_path = filesTempLocation, + stringsAsFactors = FALSE + ) + + # Check for duplicate sensor_ids and average depths if found + dupCheck <- base::table(dfLocations$sensor_id) + dupSensors <- base::names(dupCheck)[dupCheck > 1] + + if (base::length(dupSensors) > 0) { + log$warn(base::paste0('Multiple location files found for sensor(s): ', + base::paste(dupSensors, collapse = ', '), + '. Averaging depths.')) + + # Average depths for duplicate sensors + avgDepths <- stats::aggregate( + depth_m ~ sensor_id, + data = dfLocations, + FUN = function(x) base::mean(x, na.rm = TRUE) + ) + firstPaths <- dfLocations[!base::duplicated(dfLocations$sensor_id), c('sensor_id', 'location_path')] + dfLocations <- base::merge(avgDepths, firstPaths, by = 'sensor_id') + } else { + dfLocations <- dfLocations[!base::duplicated(dfLocations$sensor_id), ] + } + + # Build data file table + dataIds <- extract_sensor_id(filesTempData) + dfData <- data.frame( + sensor_id = dataIds, + data_path = filesTempData, + stringsAsFactors = FALSE + ) + dfData <- dfData[!base::duplicated(dfData$sensor_id), ] + + # Join location and data information + sensorDepthDf <- base::merge(dfLocations, dfData, by = "sensor_id", all = FALSE) + + # Validate that all depths were successfully extracted + if (base::any(base::is.na(sensorDepthDf$depth_m))) { + failedSensors <- sensorDepthDf$sensor_id[base::is.na(sensorDepthDf$depth_m)] + log$warn(base::paste0('Failed to extract depth from location files for: ', + base::paste(failedSensors, collapse = ', '))) + } + + log$info(base::paste0('Loaded ', base::nrow(sensorDepthDf), ' temperature sensors')) + log$debug(base::paste0('Temp sensors found: ', sensorDepthDf$sensor_id)) + + return(sensorDepthDf) +} diff --git a/flow/flow.envscn.temp.flags/def.sort.qf.cols.R b/flow/flow.envscn.temp.flags/def.sort.qf.cols.R new file mode 100644 index 000000000..569ad0a5c --- /dev/null +++ b/flow/flow.envscn.temp.flags/def.sort.qf.cols.R @@ -0,0 +1,84 @@ +############################################################################################## +#' @title Sort quality flag columns in standard order + +#' @author +#' Teresa Burlingame \email{tburlingame@battelleecology.org} + +#' @description +#' Sort QF columns by depth, then test type, then variable type. +#' Order: readout_time, then for each depth (01-08): +#' VSIC/VSWCfactory/VSWCsoilSpecific x Null/Gap/Range/Step/Persistence/Spike, then tempTest + +#' @param cols Character vector of column names to sort + +#' @return Character vector of column names in sorted order + +#' @references +#' License: GNU AFFERO GENERAL PUBLIC LICENSE Version 3, 19 November 2007 + +#' @seealso Currently none + +#' @ export + +# changelog and author contributions / copyrights +# Teresa Burlingame (2025-02-17) +#' original creation +############################################################################################## +def.sort.qf.cols <- function(cols) { + + # Keep readout_time first + readoutCol <- cols[cols == "readout_time"] + + # Get all QF columns + qfCols <- cols[base::grepl("QF$", cols)] + + # Extract components for sorting + sortDf <- data.frame( + col = qfCols, + stringsAsFactors = FALSE + ) + + # Classify variable type + sortDf$varType <- base::ifelse( + base::grepl("^VSIC", sortDf$col), "1_VSIC", + base::ifelse( + base::grepl("^VSWCfactory", sortDf$col), "2_VSWCfactory", + base::ifelse( + base::grepl("^VSWCsoilSpecific", sortDf$col), "3_VSWCsoilSpecific", + "4_temp" + ) + ) + ) + + # Extract depth number + sortDf$depth <- base::suppressWarnings(base::as.numeric( + base::gsub(".*Depth(\\d+).*|.*depth(\\d+).*", "\\1\\2", sortDf$col) + )) + + # Classify QF test type + sortDf$qfType <- base::ifelse( + base::grepl("NullQF$", sortDf$col), "1_Null", + base::ifelse( + base::grepl("GapQF$", sortDf$col), "2_Gap", + base::ifelse( + base::grepl("RangeQF$", sortDf$col), "3_Range", + base::ifelse( + base::grepl("StepQF$", sortDf$col), "4_Step", + base::ifelse( + base::grepl("PersistenceQF$", sortDf$col), "5_Persistence", + base::ifelse( + base::grepl("SpikeQF$", sortDf$col), "6_Spike", + "7_tempTest" + ) + ) + ) + ) + ) + ) + + # Sort by depth, then test type, then variable type + sortDf <- sortDf[base::order(sortDf$depth, sortDf$qfType, sortDf$varType), ] + + # Combine readout_time first, then sorted QF columns + return(base::c(readoutCol, sortDf$col)) +} diff --git a/flow/flow.envscn.temp.flags/dockerfile_in_combined_module.txt b/flow/flow.envscn.temp.flags/dockerfile_in_combined_module.txt new file mode 100644 index 000000000..57353332f --- /dev/null +++ b/flow/flow.envscn.temp.flags/dockerfile_in_combined_module.txt @@ -0,0 +1 @@ +analyze_pad_qaqc_envscn diff --git a/flow/flow.envscn.temp.flags/flow.envscn.temp.flags.R b/flow/flow.envscn.temp.flags/flow.envscn.temp.flags.R new file mode 100644 index 000000000..2175393b8 --- /dev/null +++ b/flow/flow.envscn.temp.flags/flow.envscn.temp.flags.R @@ -0,0 +1,205 @@ +############################################################################################## +#' @title Assess soil temperature closest to sensor depths to determine if data should be flagged. + +#' @author +#' Teresa Burlingame \email{tburlingame@battelleecology.org} \cr +#' +#' @description Workflow. Use envirscan data and prt locations to match sensors based on depth, +#' assess temperature of soil, if too cold, flag data. If nearest isn't available average neighbors and +#' check if data below 1C. +#' +#' General code workflow: +#' Parse input parameters +#' Determine datums to process (set of files/folders to process as a single unit) +#' For each datum: +#' Create output directories and copy (by symbolic link) unmodified components +#' Read in the L0 data files into arrow datasets +#' check if data needs temperature test (threshold) +#' Calculate nearest sensors +#' check for freezing temperatures +#' flag as necessary +#' write flags to output file +#' +#' This script is run at the command line with the following arguments. Each argument must be a string +#' in the format "Para=value", where "Para" is the intended parameter name and "value" is the value of +#' the parameter. Note: If the "value" string begins with a $ (e.g. $DIR_IN), the value of the +#' parameter will be assigned from the system environment variable matching the value string. +#' +#' The arguments are: +#' +#' 1. "DirIn=value", where value is the path to the input data directory. +#' The input repo should be structured by source ID as follows: +#' #/pfs/BASE_REPO/#/yyyy/mm/dd/group/ where # indicates any number of parent and child directories +#' of any name, so long as they are not 'pfs' or recognizable as the 'yyyy/mm/dd' structure which indicates +#' the 4-digit year, 2-digit month, and' 2-digit day. The source-id is the unique identifier of the sensor. \cr +#' +#' Nested within the path for each location is (at a minimum) the folder: +#' /sensor/location/data +#' /sensor/location/flags +#' /temp-sensor-group/data +#' /temp-sensor-group/location +#' The data/flags folders holds any number of daily data/flags files padded around the yyyy/mm/dd in the input path. +#' #' +#' There may be other folders at the same level as the data directory. They are ignored and not passed +#' to the output unless indicated in SubDirCopy. +#' +#' 2. "DirOut=value", where the value is the output path that will replace the #/pfs/BASE_REPO portion +#' of \code{DirIn}. +#' +#' 3. "DirErr=value", where the value is the output path to place the path structure of errored datums that will +#' replace the #/pfs/BASE_REPO portion of \code{DirIn}. +#' +#' 4. "SchmQF=value" (optional), where value is the full path to schema for the QF flags after inputing custom flags +#' +#' Ensure that any schema input here matches the column order of the auto-generated schema, +#' simply making any desired changes to column names. +#' +#' 6. "DirSubCopy=value" (optional), where value is the names of additional subfolders, separated by +#' pipes, at the same level as the data folder that are to be copied with a +#' symbolic link to the output path. May NOT include 'data'. +#' +#' Note: This script implements logging described in \code{\link[NEONprocIS.base]{def.log.init}}, +#' which uses system environment variables if available. +#' +#' @return A repository with the computed enviroscan flags and data in DirOut, where DirOut replaces BASE_REPO but +#' otherwise retains the child directory structure of the input path. The terminal directories of each +#' sensor location folder are "data" and "flags". +#' +#' @references +#' License: (example) GNU AFFERO GENERAL PUBLIC LICENSE Version 3, 19 November 2007 + +#' @keywords Currently none + +#' @examples +#' Not Run - Stepping through the code in Rstudio +#' Sys.setenv(DIR_IN="DirIn=/scratch/pfs/concH2oSoilSalinity_pad_qaqc_join/2025/10/17/conc-h2o-soil-salinity_GRSM001501/") +#' log <- NEONprocIS.base::def.log.init(Lvl = "debug") +#' arg = c( "DirIn=$DIR_IN", +#' "DirOut=/scratch/pfs/tb_out", +#' "DirErr=/scratch/pfs/tb_out/errored_datums") +#' Then copy and paste rest of workflow into the command window + +#' @seealso Currently none. + +# changelog and author contributions / copyrights +# Teresa Burlingame (2025-02-16) +# original creation +############################################################################################## +library(foreach) +library(doParallel) +# # Source the wrapper function and other dependency functions. Assume it is in the working directory +source("./wrap.envscn.temp.flags.R") +source("./def.apply.temp.flags.R") +source("./def.find.temp.sensor.R") +source("./def.load.temp.sensors.R") +source("./def.sort.qf.cols.R") +source("./def.calc.temp.flags.R") + +# # Pull in command line arguments (parameters) +arg <- base::commandArgs(trailingOnly = TRUE) + +# Start logging +log <- NEONprocIS.base::def.log.init() + +# Use environment variable to specify how many cores to run on +numCoreUse <- base::as.numeric(Sys.getenv('PARALLELIZATION_INTERNAL')) +numCoreAvail <- parallel::detectCores() +if (base::is.na(numCoreUse)){ + numCoreUse <- 1 +} +if(numCoreUse > numCoreAvail){ + numCoreUse <- numCoreAvail +} +log$debug(paste0(numCoreUse, ' of ',numCoreAvail, ' available cores will be used for internal parallelization.')) + +# Parse the input arguments into parameters +Para <- + NEONprocIS.base::def.arg.pars( + arg = arg, + NameParaReqd = c( + "DirIn", + "DirOut", + "DirErr" + ), + NameParaOptn = c( + "DirSubCopy", + "SchmQf" + ), + log = log + ) + + +# Echo arguments +log$debug(base::paste0('Input directory: ', Para$DirIn)) +log$debug(base::paste0('Output directory: ', Para$DirOut)) +log$debug(base::paste0('Error directory: ', Para$DirErr)) +#log$debug(base::paste0('Temperature directory: ', Para$DirTemp)) + +# Retrieve output schema for flags +FileSchmQf <- Para$SchmQf + +# Read in the schema +if(base::is.null(FileSchmQf) || FileSchmQf == 'NA'){ + FileSchmQf <- NULL +} else { + FileSchmQf <- base::paste0(base::readLines(FileSchmQf),collapse='') +} + +# Retrieve optional subdirectories to copy over +DirSubCopy <- base::unique(Para$DirSubCopy) +log$debug(base::paste0( + 'Additional subdirectories to copy: ', + base::paste0(DirSubCopy, collapse = ',') +)) + +# What are the expected subdirectories of each input path +#nameDirSub <- c('data','flags') +nameDirSub <- c('enviroscan') +log$debug(base::paste0( + 'Minimum expected subdirectories of each datum path: ', + base::paste0(nameDirSub, collapse = ',') +)) + +# Find all the input paths (datums). We will process each one. +DirIn <- + NEONprocIS.base::def.dir.in(DirBgn = Para$DirIn, + nameDirSub = nameDirSub, + log = log) + + +# Process each datum path +doParallel::registerDoParallel(numCoreUse) +foreach::foreach(idxDirIn = DirIn) %dopar% { + log$info(base::paste0('Processing path to datum: ', idxDirIn)) + # Run the wrapper function for each datum, with error routing + tryCatch( + withCallingHandlers( + wrap.envscn.temp.flags(DirIn=idxDirIn, + DirOutBase=Para$DirOut, + DirTemp=idxDirIn, + SchmQf=FileSchmQf, + DirSubCopy=DirSubCopy, + log=log + ), + error = function(err) { + call.stack <- base::sys.calls() # is like a traceback within "withCallingHandlers" + + # Re-route the failed datum + NEONprocIS.base::def.err.datm( + err=err, + call.stack=call.stack, + DirDatm=idxDirIn, + DirErrBase=Para$DirErr, + RmvDatmOut=TRUE, + DirOutBase=Para$DirOut, + log=log + ) + } + ), + # This simply to avoid returning the error + error=function(err) {} + ) + +return() + +} # End loop around datum paths diff --git a/flow/flow.envscn.temp.flags/renv.lock b/flow/flow.envscn.temp.flags/renv.lock new file mode 100644 index 000000000..c1bd54e93 --- /dev/null +++ b/flow/flow.envscn.temp.flags/renv.lock @@ -0,0 +1,220 @@ +{ + "R": { + "Version": "4.1.3", + "Repositories": [ + { + "Name": "CRAN", + "URL": "https://cran.rstudio.com" + } + ] + }, + "Packages": { + "R6": { + "Package": "R6", + "Version": "2.6.1", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "d4335fe7207f1c01ab8c41762f5840d4", + "Requirements": [] + }, + "askpass": { + "Package": "askpass", + "Version": "1.2.1", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "c39f4155b3ceb1a9a2799d700fbd4b6a", + "Requirements": [ + "sys" + ] + }, + "codetools": { + "Package": "codetools", + "Version": "0.2-18", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "019388fc48e48b3da0d3a76ff94608a8", + "Requirements": [] + }, + "covr": { + "Package": "covr", + "Version": "3.5.1", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "6d80a9fc3c0c8473153b54fa54719dfd", + "Requirements": [ + "crayon", + "digest", + "httr", + "jsonlite", + "rex", + "withr", + "yaml" + ] + }, + "crayon": { + "Package": "crayon", + "Version": "1.5.3", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "859d96e65ef198fd43e82b9628d593ef", + "Requirements": [] + }, + "curl": { + "Package": "curl", + "Version": "5.1.0", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "9123f3ef96a2c1a93927d828b2fe7d4c", + "Requirements": [] + }, + "data.table": { + "Package": "data.table", + "Version": "1.18.0", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "498817481016697c065f66fe14f3bcce", + "Requirements": [] + }, + "digest": { + "Package": "digest", + "Version": "0.6.29", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "cf6b206a045a684728c3267ef7596190", + "Requirements": [] + }, + "doParallel": { + "Package": "doParallel", + "Version": "1.0.17", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "451e5edf411987991ab6a5410c45011f", + "Requirements": [ + "foreach", + "iterators" + ] + }, + "foreach": { + "Package": "foreach", + "Version": "1.5.2", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "618609b42c9406731ead03adf5379850", + "Requirements": [ + "codetools", + "iterators" + ] + }, + "fs": { + "Package": "fs", + "Version": "1.6.6", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "7eb1e342eee7e0a7449c49cdaa526d39", + "Requirements": [] + }, + "httr": { + "Package": "httr", + "Version": "1.4.7", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "ac107251d9d9fd72f0ca8049988f1d7f", + "Requirements": [ + "R6", + "curl", + "jsonlite", + "mime", + "openssl" + ] + }, + "iterators": { + "Package": "iterators", + "Version": "1.0.14", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "8954069286b4b2b0d023d1b288dce978", + "Requirements": [] + }, + "jsonlite": { + "Package": "jsonlite", + "Version": "2.0.0", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "b0776f526d36d8bd4a3344a88fe165c4", + "Requirements": [] + }, + "lazyeval": { + "Package": "lazyeval", + "Version": "0.2.2", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "d908914ae53b04d4c0c0fd72ecc35370", + "Requirements": [] + }, + "mime": { + "Package": "mime", + "Version": "0.13", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "0ec19f34c72fab674d8f2b4b1c6410e1", + "Requirements": [] + }, + "openssl": { + "Package": "openssl", + "Version": "2.3.2", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "bc54d87ebf858b28de18df4bca6528d3", + "Requirements": [ + "askpass" + ] + }, + "renv": { + "Package": "renv", + "Version": "0.16.0", + "Source": "GitHub", + "RemoteType": "github", + "RemoteHost": "api.github.com", + "RemoteRepo": "renv", + "RemoteUsername": "rstudio", + "RemoteRef": "0.16.0", + "RemoteSha": "0e3aab27a928eb261819a3fc45a3ee2b4ba902a5", + "Hash": "9e5e2246d73254a29a4182f4e8257c09", + "Requirements": [] + }, + "rex": { + "Package": "rex", + "Version": "1.2.1", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "ae34cd56890607370665bee5bd17812f", + "Requirements": [ + "lazyeval" + ] + }, + "sys": { + "Package": "sys", + "Version": "3.4.3", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "de342ebfebdbf40477d0758d05426646", + "Requirements": [] + }, + "withr": { + "Package": "withr", + "Version": "3.0.2", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "cc2d62c76458d425210d1eb1478b30b4", + "Requirements": [] + }, + "yaml": { + "Package": "yaml", + "Version": "2.3.12", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "7cd77cb32abd9220d744307e9fc94ffb", + "Requirements": [] + } + } +} diff --git a/flow/flow.envscn.temp.flags/run_unit_tests.R b/flow/flow.envscn.temp.flags/run_unit_tests.R new file mode 100644 index 000000000..54d41be5e --- /dev/null +++ b/flow/flow.envscn.temp.flags/run_unit_tests.R @@ -0,0 +1,16 @@ +#coverage report of unit tests. change directories to local repo as needed. + +library (covr) +setwd("~/GitHub/NEON-IS-data-processing/flow/tests/testthat") +baseDir = "~/GitHub/NEON-IS-data-processing/flow" +cov <- covr::file_coverage( + source_files = c(paste0(baseDir,"/flow.envscn.temp.flags/def.sort.qf.cols.R"), + paste0(baseDir,"/flow.envscn.temp.flags/def.find.temp.sensor.R"), + paste0(baseDir, "/flow.envscn.temp.flags/def.apply.temp.flags.R"), + paste0(baseDir,"/flow.envscn.temp.flags/wrap.envscn.temp.flags.R"), + paste0(baseDir,"/flow.envscn.temp.flags/def.calc.temp.flags.R"), + paste0(baseDir,"/flow.envscn.temp.flags/def.load.temp.sensors.R")), + test_files = "~/GitHub/NEON-IS-data-processing/flow/tests/testthat/test-wrap-envscn-temp-flags.R" +) + +covr::report(cov) diff --git a/flow/flow.envscn.temp.flags/wrap.envscn.temp.flags.R b/flow/flow.envscn.temp.flags/wrap.envscn.temp.flags.R new file mode 100644 index 000000000..0e626c5a0 --- /dev/null +++ b/flow/flow.envscn.temp.flags/wrap.envscn.temp.flags.R @@ -0,0 +1,330 @@ +############################################################################################## +#' @title Assess soil temperature closest to sensor depths to determine if data should be flagged. + +#' @author +#' Teresa Burlingame \email{tburlingame@battelleecology.org} \cr + +#' @description Workflow. Determine if test is to be run based on thresholds, find closests temperature sensor, +#' read in data and check if it is below freezing. If the closest sensor is flagged, do an average of the one above and one below +#' and check to see if the average of the temperatures are less than 1 degree. If one or both are unavailable, flag NA +#' +#' @param DirIn Character value. The input path to the data from a single source ID, structured as follows: +#' #/pfs/BASE_REPO/#/yyyy/mm/dd/#/location-id, where # indicates any number of parent and child directories +#' of any name, so long as they are not 'pfs' or recognizable as the 'yyyy/mm/dd' structure which indicates +#' the 4-digit year, 2-digit month, and' 2-digit day. The location-id is the unique identifier of the location. \cr +#' +#' Nested within this path are (at a minimum) the folders: +#' /data +#' /flags + +#' The flags folder holds two files containing basic plausibility and calibration quality flags for +#' the central processing day only. These files should respectively be named in the convention: +#' SOURCETYPE_LOCATIONID_YYYY-MM-DD_flagsPlausibility.parquet +#' All other files in this directory will be ignored. +#' +#' The threshold folder contains a single file named thresholds.json that holds threshold parameters +#' applicable to the smoothing algorithm. +#' +#' @param DirTemp Character value. The input path to the temperature data that is used to perform the the temperature test. +#' Location files are used to determine depth of the sensors and pair with the appropriate enviroscan depth. +#' Then the data is read in to perform tests. +#' +#' @param DirOutBase Character value. The output path that will replace the #/pfs/BASE_REPO portion of DirIn. +#' +#' @param SchmQf (Optional). A json-formatted character string containing the schema for the standard calibration and +#' plausibility QFs as well as the custom QFs tempTestDepth##QF + +#' @param DirSubCopy (optional) Character vector. The names of additional subfolders at +#' the same level as the data/flags/threshold folders in the input path that are to be copied with a +#' symbolic link to the output path (i.e. carried through as-is). Note that the 'stats' and 'flags' directories +#' are automatically populated in the output and cannot be included here. + +#' @param log A logger object as produced by NEONprocIS.base::def.log.init to produce structured log +#' output. Defaults to NULL, in which the logger will be created and used within the function. See NEONprocIS.base::def.log.init +#' for more details. +#' +#' @return A repository in DirOutBase containing the quality flags of the three different enviroscan data streams:" +#' VSIC, VSWCFactory and VSWCSoilSpecific. Standard flags are read in, then a test for frozen soil is performed. +#' +#' @references +#' License: (example) GNU AFFERO GENERAL PUBLIC LICENSE Version 3, 19 November 2007 + +#' @keywords Currently none + +#' @examples +#' # NOT RUN +#' +#' "DirIn=/scratch/pfs/concH2oSoilSalinity_pad_qaqc_join/2025/10/17/conc-h2o-soil-salinity_GRSM001501/", +#' "DirTemp=/scratch/pfs/concH2oSoilSalinity_pad_qaqc_join/2025/10/17/conc-h2o-soil-salinity_GRSM005501/", +#' "DirOut=/scratch/pfs/tb_out", +#' "DirErr=/scratch/pfs/tb_out/errored_datums" +#' wrap.envscn.temp.flags(DirIn,DirOutBase,DirTemp,DirSubCopy) + +#' @seealso Currently none + +# changelog and author contributions / copyrights +# Teresa Burlingame (2025-02-16) +# Initial creation +############################################################################################## +wrap.envscn.temp.flags <- function(DirIn, + DirOutBase, + DirTemp = DirIn, + SchmQf = NULL, + DirSubCopy = NULL, + log = NULL +){ + + # Start logging if not already initialized + if(base::is.null(log)){ + log <- NEONprocIS.base::def.log.init() + } + #Set variable for enviroscan Dir in + DirInEnviro <- NEONprocIS.base::def.dir.in(DirIn, nameDirSub = c('data', 'flags')) + # def dir in with 'data'/flags' + ###clean up all below to look for DirInEnviro. + + # Gather info about the input directory and create the output directory. + InfoDirIn <- NEONprocIS.base::def.dir.splt.pach.time(DirInEnviro,log=log) + dirInData <- fs::path(DirInEnviro,'data') + dirInQf <- fs::path(DirInEnviro,'flags') + + dirOut <- fs::path(DirOutBase,InfoDirIn$dirRepo) + dirOutQf <- fs::path(dirOut,'flags') + + #dirOutData <- fs::path(dirOut,'data') + NEONprocIS.base::def.dir.crea(DirBgn = dirOut, + DirSub = c('flags'), + log = log) + + # Copy with a symbolic link the desired subfolders + DirSubCopy <- base::unique(base::setdiff(DirSubCopy, c('flags'))) + if(base::length(DirSubCopy) > 0){ + NEONprocIS.base::def.dir.copy.symb(DirSrc = fs::path(DirInEnviro, DirSubCopy), + DirDest = dirOut, + LnkSubObj = FALSE, + log = log) + } + + # ===== Load and validate thresholds ===== + dirInThrsh <- fs::path(DirInEnviro, 'threshold') + fileThsh <- base::list.files(dirInThrsh) + + if (base::length(fileThsh) == 0) { + log$error(base::paste0('No threshold files found in ', dirInThrsh)) + stop() + } + + if (base::length(fileThsh) > 1) { + log$debug(base::paste0('Multiple threshold files found: ', base::paste(fileThsh, collapse = ', '))) + fileThsh <- fileThsh[1] + log$info(base::paste0('Using first threshold file: ', fileThsh)) + } + + thsh <- NEONprocIS.qaqc::def.read.thsh.qaqc.df( + NameFile = fs::path(dirInThrsh, fileThsh) + ) + + # Define expected terms and threshold names + termTest <- c("VSICDepth01", "VSICDepth02", "VSICDepth03", "VSICDepth04", + "VSICDepth05", "VSICDepth06", "VSICDepth07", "VSICDepth08") + tempTestName <- "tempTest" + + ############# + #dummy TODO delete after thresholds finalized + tempTestName <- "Range Threshold Soft Min" + thshSubset <- thsh[thsh$threshold_name == tempTestName & thsh$term_name %in% termTest, ] + thshSubset$threshold_name <- "tempTest" + + #replace with just thshSubset <- thsh[thsh$threshold_name == tempTestName & thsh$term_name %in% termTest, ] + + ############### + + # Filter thresholds for temperature test + + if (base::nrow(thshSubset) == 0) { + log$error(base::paste0('No "', tempTestName, '" thresholds found for terms: ', + base::paste(termTest, collapse = ', '))) + stop() + } + + # Create threshold lookup: term_name -> number_value + thresholdLookup <- stats::setNames(thshSubset$number_value, thshSubset$term_name) + + # Validate all expected terms have threshold values + missingTerms <- termTest[!termTest %in% base::names(thresholdLookup)] + if (base::length(missingTerms) > 0) { + log$error(base::paste0('Missing "', tempTestName, '" thresholds for: ', + base::paste(missingTerms, collapse = ', '))) + stop() + } + + # ===== Load enviroscan data ===== + fileData <- base::list.files(dirInData, pattern = '.parquet', full.names = FALSE) + + # Read the datasets + data <- NEONprocIS.base::def.read.parq.ds(fileIn=fs::path(dirInData,fileData), + VarTime='readout_time', + RmvDupl=TRUE, + Df=TRUE, + log=log) + + # Filter to soil moisture columns and essential metadata + soilCols <- base::names(data)[base::grepl("SoilMoisture", base::names(data))] + + keepStatic <- c("source_id", "site_id", "readout_time") + keepCols <- c(keepStatic, base::intersect(soilCols, base::names(data))) + dataSm <- data[, keepCols, drop = FALSE] + + # Extract depth keys (e.g., "01", "02", etc.) + depthKeys <- base::sub("^depth(\\d{2})SoilMoisture$", "\\1", soilCols) + + # Initialize temperature test QF columns (default: -1 = test not run) + qfCols <- base::paste0("tempTestDepth", depthKeys, "QF") + dataSm[qfCols] <- -1L + + # ===== Map thresholds to data column names ===== + # Convert threshold names from "VSICDepth02" to "depth02SoilMoisture" + base::names(thresholdLookup) <- base::sub( + "^VSICDepth(\\d{2})$", + "depth\\1SoilMoisture", + base::names(thresholdLookup) + ) + + # ===== Load temperature sensor metadata ===== + sensorDepthDf <- def.load.temp.sensors(DirTemp = DirTemp, log = log) + + # Check if we have any temperature sensors available + if (nrow(sensorDepthDf) == 0) { + log$warn("No temperature sensors available. All temperature test flags will remain -1 (test not run).") + # Skip temperature testing - flags already initialized to -1 + } else { + # ===== Apply temperature test to each depth ===== + for (col in soilCols) { + + depthNum <- base::sub("^depth(\\d{2}).*$", "\\1", col) + qfName <- base::paste0("tempTestDepth", depthNum, "QF") + + # Check if test should be run (threshold value: 0 = skip, 1 = run) + if (thresholdLookup[[col]] == 0) { + log$info(base::paste0('Skipping temperature test for ', col, ' (threshold = 0)')) + dataSm[[qfName]] <- 0L # Automatic pass + + } else if (thresholdLookup[[col]] == 1) { + log$debug(base::paste0('Running temperature test for ', col)) + + # Find target depth from maximum sensor depth in the data + targetDepth <- suppressWarnings(base::max(dataSm[[col]], na.rm = TRUE)) + + # Check if target depth is valid + if (!base::is.finite(targetDepth) || base::is.na(targetDepth)) { + log$warn(base::paste0('No valid depth data found for ', col, + '. Temperature test flag will remain -1 (test not run).')) + # Leave flag at -1 (already initialized) + } else { + # Find closest temperature sensor + sensorInfo <- def.find.temp.sensor( + targetDepth = targetDepth, + sensorDepthDf = sensorDepthDf, + log = log + ) + + # Check if a matching sensor was found + if (base::is.null(sensorInfo)) { + log$warn(base::paste0('No temperature sensor found for ', col, + ' at depth ', targetDepth, 'm. Temperature test flag will remain -1 (test not run).')) + # Leave flag at -1 (already initialized) + } else { + # Determine distance threshold based on depth level + depthLevel <- base::as.numeric(depthNum) + if (depthLevel <= 2) { + distThreshold <- 0.15 # Levels 1-2 + } else if (depthLevel <= 5) { + distThreshold <- 0.35 # Levels 3-5 + } else { + distThreshold <- 0.75 # Levels 6-8 + } + + # Check if sensor is within acceptable distance + sensorDepthClose <- sensorInfo$closest$depth_m + + depthDiffClose <- base::abs(targetDepth - sensorDepthClose) + + if (depthDiffClose > distThreshold) { + log$warn(base::paste0('Temperature sensor for ', col , ' is ', + base::round(depthDiffClose, 3), 'm away from target depth ', + targetDepth, 'm (max allowed: ', distThreshold, 'm for level ', depthLevel, '). ', + 'Temperature test flag will remain -1 (test not run).')) + # Leave flag at -1 (already initialized) + } else { + # Calculate temperature flags + tempData <- def.calc.temp.flags( + sensorInfo = sensorInfo, + targetDepth = targetDepth, + distThreshold = distThreshold, + log = log + ) + + # Apply flags to high-frequency data + dataSm <- def.apply.temp.flags( + dataSm = dataSm, + tempData = tempData, + qfColName = qfName, + log = log + ) + } + } + } + } + } # End temperature test loop + } # End check for available sensors + + # ===== Merge with existing plausibility flags ===== + qfFlags <- dataSm[, c("readout_time", qfCols)] + + fileQfPlau <- base::list.files(dirInQf, pattern = 'Plausibility.parquet', full.names = FALSE) + + if (base::length(fileQfPlau) == 0) { + log$error(base::paste0('No plausibility flag files found in ', dirInQf)) + stop() + } + + qfPlau <- NEONprocIS.base::def.read.parq.ds( + fileIn = fs::path(dirInQf, fileQfPlau), + VarTime = 'readout_time', + RmvDupl = TRUE, + Df = TRUE, + log = log + ) + + # Combine plausibility flags with temperature test flags + qfAll <- base::merge(qfPlau, qfFlags, by = "readout_time", all = TRUE) + + # ===== Sort columns in standard order ===== + sortedCols <- def.sort.qf.cols(base::names(qfAll)) + qfAll <- qfAll[, sortedCols] + + # ===== Write output ===== + nameFileQfOut <- fs::path(dirOutQf, fileQfPlau) + + rptWrite <- base::try( + NEONprocIS.base::def.wrte.parq( + data = qfAll, + NameFile = nameFileQfOut, + log = log + ), + silent = TRUE + ) + + if ('try-error' %in% base::class(rptWrite)) { + log$error(base::paste0( + 'Cannot write output to ', nameFileQfOut, '. ', + base::attr(rptWrite, "condition") + )) + stop() + } else { + log$info(base::paste0('Wrote updated flags to ', nameFileQfOut)) + } + + return() +} + diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/enviroscan/CFGLOC105245/data/enviroscan_CFGLOC105245_2025-10-17.parquet b/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/enviroscan/CFGLOC105245/data/enviroscan_CFGLOC105245_2025-10-17.parquet new file mode 100644 index 000000000..acf55f927 Binary files /dev/null and b/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/enviroscan/CFGLOC105245/data/enviroscan_CFGLOC105245_2025-10-17.parquet differ diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/enviroscan/CFGLOC105245/flags/enviroscan_CFGLOC105245_2025-10-17_flagsPlausibility.parquet b/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/enviroscan/CFGLOC105245/flags/enviroscan_CFGLOC105245_2025-10-17_flagsPlausibility.parquet new file mode 100644 index 000000000..82de2a9fc Binary files /dev/null and b/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/enviroscan/CFGLOC105245/flags/enviroscan_CFGLOC105245_2025-10-17_flagsPlausibility.parquet differ diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/enviroscan/CFGLOC105245/threshold/thresholds.json b/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/enviroscan/CFGLOC105245/threshold/thresholds.json new file mode 100644 index 000000000..78012a2e6 --- /dev/null +++ b/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/enviroscan/CFGLOC105245/threshold/thresholds.json @@ -0,0 +1,5604 @@ +{ + "thresholds":[ + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSICDepth02", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 360, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 3600, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSICDepth03", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 360, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 3600, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSICDepth04", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 360, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 3600, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSICDepth05", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 360, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 3600, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSICDepth06", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 360, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 3600, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSICDepth07", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 360, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 3600, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSICDepth08", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 360, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 3600, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSICDepth01", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 360, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 3600, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Step Test value" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Step Test value" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Step Test value" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Step Test value" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Step Test value" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Step Test value" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Step Test value" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Step Test value" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Step Test value" + } + ] +} diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001501/data/temp-soil_GRSM001501_2025-10-17_ST_1_minute_001.parquet b/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001501/data/temp-soil_GRSM001501_2025-10-17_ST_1_minute_001.parquet new file mode 100644 index 000000000..f4fa3485d Binary files /dev/null and b/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001501/data/temp-soil_GRSM001501_2025-10-17_ST_1_minute_001.parquet differ diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001501/data/temp-soil_GRSM001501_2025-10-17_ST_30_minute_030.parquet b/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001501/data/temp-soil_GRSM001501_2025-10-17_ST_30_minute_030.parquet new file mode 100644 index 000000000..edea6f6fb Binary files /dev/null and b/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001501/data/temp-soil_GRSM001501_2025-10-17_ST_30_minute_030.parquet differ diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001501/location/CFGLOC105248.json b/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001501/location/CFGLOC105248.json new file mode 100644 index 000000000..81f2e7167 --- /dev/null +++ b/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001501/location/CFGLOC105248.json @@ -0,0 +1,39 @@ +{ + "features":[ + { + "AngNedZaxs":"NA", + "AngPtch":"0", + "Cal$PrdLab":"one time before installation", + "Data Rate":"0.1", + "DistZaxsLvlMeasSoil":"-0.020", + "FreqSamp":"0.1", + "HOR":"001", + "IS Processing Default Start Date":"2017-08-20T00:00:00Z", + "Required Asset Management Location Code":"CFGLOC105248", + "VER":"501", + "geometry":null, + "location":"plot1", + "properties":{ + "active_periods":[ + { + "start_date":"2025-10-17T00:00:00Z", + "end_date":"2025-10-18T00:00:00Z" + } + ], + "context":[ + + ], + "description":"Great Smoky Mountains Soil Temp Profile SP1, Z1 Depth", + "domain":"D07", + "name":"CFGLOC105248", + "site":"GRSM", + "type":"CONFIG" + }, + "subLocation":"depth1", + "subSystem":"temp-profile", + "system":"soil", + "type":"Feature" + } + ], + "type":"FeatureCollection" +} diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001501/location/prt_17977_locations.json b/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001501/location/prt_17977_locations.json new file mode 100644 index 000000000..03a543431 --- /dev/null +++ b/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001501/location/prt_17977_locations.json @@ -0,0 +1,409 @@ +{ + "features":[ + { + "AngNedZaxs":"NA", + "AngPtch":"0", + "asset_manufacturer":"Thermometrics", + "asset_model":"R000-00000011", + "asset_software_version":null, + "Cal$PrdLab":"one time before installation", + "Data Rate":"0.1", + "DistZaxsLvlMeasSoil":"-0.020", + "FreqSamp":"0.1", + "geometry":null, + "HOR":"001", + "location":"plot1", + "properties":{ + "context":[ + + ], + "domain":"D07", + "install_date":"2025-10-17T00:00:00Z", + "locations":{ + "features":[ + { + "geometry":null, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-18T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "State province", + "TN" + ], + [ + "UTM Zone", + "17N" + ] + ], + "reference_location":{ + "geometry":null, + "properties":{ + "locations":{ + "features":[ + { + "geometry":{ + "coordinates":[ + [ + -83.5014972, + 35.6884778, + 581.91 + ], + [ + -83.5015528, + 35.6884806, + 581.91 + ], + [ + -83.50155, + 35.688525, + 581.17 + ], + [ + -83.5014944, + 35.6885222, + 581.17 + ], + [ + -83.5014972, + 35.6884778, + 581.91 + ] + ], + "type":"Polygon" + }, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-18T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "AngAzXaxsRefeSoil", + "C4" + ], + [ + "AngAzYaxsRefeSoil", + "C2" + ], + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "ElevSoilC1", + "581.9073" + ], + [ + "ElevSoilC2", + "581.9073" + ], + [ + "ElevSoilC3", + "581.1691" + ], + [ + "ElevSoilC4", + "581.1691" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "LatSoilC1", + "35.6884778" + ], + [ + "LatSoilC2", + "35.6884806" + ], + [ + "LatSoilC3", + "35.6885250" + ], + [ + "LatSoilC4", + "35.6885222" + ], + [ + "locDisturb", + "1.24,3.18,NA and 0.94,2.68,NA and 1.72,2.68,NA and 1.72,3.13,NA and 2.11,2.90,NA" + ], + [ + "LonSoilC1", + "-83.5014972" + ], + [ + "LonSoilC2", + "-83.5015528" + ], + [ + "LonSoilC3", + "-83.5015500" + ], + [ + "LonSoilC4", + "-83.5014944" + ], + [ + "Orientation Number", + "2" + ], + [ + "RefeSoil", + "C1" + ], + [ + "Required Asset Management Location Code", + "SOILPL105236" + ], + [ + "State province", + "TN" + ], + [ + "UTM Zone", + "17N" + ], + [ + "x Azimuth Angle", + 3 + ], + [ + "y Azimuth Angle", + 274 + ] + ], + "reference_location":null, + "start_date":"2025-10-17T00:00:00Z", + "x_offset": 0, + "y_offset": 0, + "z_offset": 0 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + }, + "name":"SOILPL105236" + }, + "type":"Feature" + }, + "start_date":"2025-10-17T00:00:00Z", + "x_offset": 1.34, + "y_offset": 2.74, + "z_offset": -0.02 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + }, + "name":"CFGLOC105248", + "remove_date":"2025-10-18T00:00:00Z", + "site":"GRSM", + "site_location":{ + "features":[ + { + "geometry":{ + "coordinates":[ + -83.50195, + 35.68896, + 575.396725 + ], + "type":"Point" + }, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-18T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "AERONET_XREF", + "NEON_GRSM" + ], + [ + "AngAzWindPrim", + "140-320" + ], + [ + "AngAzWindScnd", + "NA" + ], + [ + "AngAzWindTrty", + "NA" + ], + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "DEIMS-SDR Site ID", + "https://deims.org/30f887c3-135b-41e8-9f44-9b084ce2b3bd" + ], + [ + "DistZaxsCnpy", + "31" + ], + [ + "DistZaxsDisp", + "20.2" + ], + [ + "Dom", + "D07" + ], + [ + "DURATION", + "Gradient" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "HABITAT", + "Terrestrial" + ], + [ + "IS Processing Default Start Date", + "2017-08-20T00:00:00Z" + ], + [ + "NEONSCI_FIELD_SITE_URL_PATH", + "great-smoky-mountains-national-park-twin-creeks" + ], + [ + "Pf$AngEnuXaxs", + "NA" + ], + [ + "Pf$AngEnuYaxs", + "NA" + ], + [ + "Pf$Ofst", + "NA" + ], + [ + "PrdDcmpMax", + "3" + ], + [ + "PrdIncrAgrDcmp", + "1" + ], + [ + "PrdIncrCalc", + "1" + ], + [ + "PrdIncrPf", + "1" + ], + [ + "PrdWndwAgrDcmp", + "5" + ], + [ + "PrdWndwCalc", + "3" + ], + [ + "PrdWndwPf", + "9" + ], + [ + "PresAtmSite", + "93630" + ], + [ + "Private", + "FALSE" + ], + [ + "Read", + "HDF5" + ], + [ + "Required Asset Management Location Code", + "GRSM" + ], + [ + "Site Timezone", + "US/Eastern" + ], + [ + "State Abbreviation", + "TN" + ], + [ + "State province", + "TN" + ], + [ + "TypeEco", + "Hardwood deciduous forest dominated by oaks and maples" + ], + [ + "TypeSoil", + "Spivey-Santeetlah-Nowhere complex, 8 to 15 percent slopes" + ], + [ + "UTM Zone", + "17N" + ], + [ + "ZoneTime", + "EST" + ] + ], + "reference_location":null, + "start_date":"2025-10-17T00:00:00Z", + "x_offset": 0, + "y_offset": 0, + "z_offset": 0 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + } + }, + "Required Asset Management Location Code":"CFGLOC105248", + "subLocation":"depth1", + "subSystem":"temp-profile", + "system":"soil", + "type":"Feature", + "VER":"501" + } + ], + "source_id": 17977, + "source_type":"prt", + "type":"FeatureCollection" +} diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001502/data/temp-soil_GRSM001502_2025-10-17_ST_1_minute_001.parquet b/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001502/data/temp-soil_GRSM001502_2025-10-17_ST_1_minute_001.parquet new file mode 100644 index 000000000..7e1e0a08d Binary files /dev/null and b/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001502/data/temp-soil_GRSM001502_2025-10-17_ST_1_minute_001.parquet differ diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001502/data/temp-soil_GRSM001502_2025-10-17_ST_30_minute_030.parquet b/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001502/data/temp-soil_GRSM001502_2025-10-17_ST_30_minute_030.parquet new file mode 100644 index 000000000..78361384e Binary files /dev/null and b/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001502/data/temp-soil_GRSM001502_2025-10-17_ST_30_minute_030.parquet differ diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001502/location/CFGLOC105250.json b/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001502/location/CFGLOC105250.json new file mode 100644 index 000000000..d92a7c15c --- /dev/null +++ b/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001502/location/CFGLOC105250.json @@ -0,0 +1,39 @@ +{ + "features":[ + { + "AngNedZaxs":"NA", + "AngPtch":"0", + "Cal$PrdLab":"one time before installation", + "Data Rate":"0.1", + "DistZaxsLvlMeasSoil":"-0.060", + "FreqSamp":"0.1", + "HOR":"001", + "IS Processing Default Start Date":"2017-08-20T00:00:00Z", + "Required Asset Management Location Code":"CFGLOC105250", + "VER":"502", + "geometry":null, + "location":"plot1", + "properties":{ + "active_periods":[ + { + "start_date":"2025-10-17T00:00:00Z", + "end_date":"2025-10-18T00:00:00Z" + } + ], + "context":[ + + ], + "description":"Great Smoky Mountains Soil Temp Profile SP1, Z2 Depth", + "domain":"D07", + "name":"CFGLOC105250", + "site":"GRSM", + "type":"CONFIG" + }, + "subLocation":"depth2", + "subSystem":"temp-profile", + "system":"soil", + "type":"Feature" + } + ], + "type":"FeatureCollection" +} diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001502/location/prt_20052_locations.json b/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001502/location/prt_20052_locations.json new file mode 100644 index 000000000..157b8d254 --- /dev/null +++ b/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001502/location/prt_20052_locations.json @@ -0,0 +1,409 @@ +{ + "features":[ + { + "AngNedZaxs":"NA", + "AngPtch":"0", + "asset_manufacturer":"Thermometrics", + "asset_model":"R000-00000011", + "asset_software_version":null, + "Cal$PrdLab":"one time before installation", + "Data Rate":"0.1", + "DistZaxsLvlMeasSoil":"-0.060", + "FreqSamp":"0.1", + "geometry":null, + "HOR":"001", + "location":"plot1", + "properties":{ + "context":[ + + ], + "domain":"D07", + "install_date":"2025-10-17T00:00:00Z", + "locations":{ + "features":[ + { + "geometry":null, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-18T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "State province", + "TN" + ], + [ + "UTM Zone", + "17N" + ] + ], + "reference_location":{ + "geometry":null, + "properties":{ + "locations":{ + "features":[ + { + "geometry":{ + "coordinates":[ + [ + -83.5014972, + 35.6884778, + 581.91 + ], + [ + -83.5015528, + 35.6884806, + 581.91 + ], + [ + -83.50155, + 35.688525, + 581.17 + ], + [ + -83.5014944, + 35.6885222, + 581.17 + ], + [ + -83.5014972, + 35.6884778, + 581.91 + ] + ], + "type":"Polygon" + }, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-18T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "AngAzXaxsRefeSoil", + "C4" + ], + [ + "AngAzYaxsRefeSoil", + "C2" + ], + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "ElevSoilC1", + "581.9073" + ], + [ + "ElevSoilC2", + "581.9073" + ], + [ + "ElevSoilC3", + "581.1691" + ], + [ + "ElevSoilC4", + "581.1691" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "LatSoilC1", + "35.6884778" + ], + [ + "LatSoilC2", + "35.6884806" + ], + [ + "LatSoilC3", + "35.6885250" + ], + [ + "LatSoilC4", + "35.6885222" + ], + [ + "locDisturb", + "1.24,3.18,NA and 0.94,2.68,NA and 1.72,2.68,NA and 1.72,3.13,NA and 2.11,2.90,NA" + ], + [ + "LonSoilC1", + "-83.5014972" + ], + [ + "LonSoilC2", + "-83.5015528" + ], + [ + "LonSoilC3", + "-83.5015500" + ], + [ + "LonSoilC4", + "-83.5014944" + ], + [ + "Orientation Number", + "2" + ], + [ + "RefeSoil", + "C1" + ], + [ + "Required Asset Management Location Code", + "SOILPL105236" + ], + [ + "State province", + "TN" + ], + [ + "UTM Zone", + "17N" + ], + [ + "x Azimuth Angle", + 3 + ], + [ + "y Azimuth Angle", + 274 + ] + ], + "reference_location":null, + "start_date":"2025-10-17T00:00:00Z", + "x_offset": 0, + "y_offset": 0, + "z_offset": 0 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + }, + "name":"SOILPL105236" + }, + "type":"Feature" + }, + "start_date":"2025-10-17T00:00:00Z", + "x_offset": 1.34, + "y_offset": 2.74, + "z_offset": -0.06 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + }, + "name":"CFGLOC105250", + "remove_date":"2025-10-18T00:00:00Z", + "site":"GRSM", + "site_location":{ + "features":[ + { + "geometry":{ + "coordinates":[ + -83.50195, + 35.68896, + 575.396725 + ], + "type":"Point" + }, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-18T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "AERONET_XREF", + "NEON_GRSM" + ], + [ + "AngAzWindPrim", + "140-320" + ], + [ + "AngAzWindScnd", + "NA" + ], + [ + "AngAzWindTrty", + "NA" + ], + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "DEIMS-SDR Site ID", + "https://deims.org/30f887c3-135b-41e8-9f44-9b084ce2b3bd" + ], + [ + "DistZaxsCnpy", + "31" + ], + [ + "DistZaxsDisp", + "20.2" + ], + [ + "Dom", + "D07" + ], + [ + "DURATION", + "Gradient" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "HABITAT", + "Terrestrial" + ], + [ + "IS Processing Default Start Date", + "2017-08-20T00:00:00Z" + ], + [ + "NEONSCI_FIELD_SITE_URL_PATH", + "great-smoky-mountains-national-park-twin-creeks" + ], + [ + "Pf$AngEnuXaxs", + "NA" + ], + [ + "Pf$AngEnuYaxs", + "NA" + ], + [ + "Pf$Ofst", + "NA" + ], + [ + "PrdDcmpMax", + "3" + ], + [ + "PrdIncrAgrDcmp", + "1" + ], + [ + "PrdIncrCalc", + "1" + ], + [ + "PrdIncrPf", + "1" + ], + [ + "PrdWndwAgrDcmp", + "5" + ], + [ + "PrdWndwCalc", + "3" + ], + [ + "PrdWndwPf", + "9" + ], + [ + "PresAtmSite", + "93630" + ], + [ + "Private", + "FALSE" + ], + [ + "Read", + "HDF5" + ], + [ + "Required Asset Management Location Code", + "GRSM" + ], + [ + "Site Timezone", + "US/Eastern" + ], + [ + "State Abbreviation", + "TN" + ], + [ + "State province", + "TN" + ], + [ + "TypeEco", + "Hardwood deciduous forest dominated by oaks and maples" + ], + [ + "TypeSoil", + "Spivey-Santeetlah-Nowhere complex, 8 to 15 percent slopes" + ], + [ + "UTM Zone", + "17N" + ], + [ + "ZoneTime", + "EST" + ] + ], + "reference_location":null, + "start_date":"2025-10-17T00:00:00Z", + "x_offset": 0, + "y_offset": 0, + "z_offset": 0 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + } + }, + "Required Asset Management Location Code":"CFGLOC105250", + "subLocation":"depth2", + "subSystem":"temp-profile", + "system":"soil", + "type":"Feature", + "VER":"502" + } + ], + "source_id": 20052, + "source_type":"prt", + "type":"FeatureCollection" +} diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001503/data/temp-soil_GRSM001503_2025-10-17_ST_1_minute_001.parquet b/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001503/data/temp-soil_GRSM001503_2025-10-17_ST_1_minute_001.parquet new file mode 100644 index 000000000..f28452095 Binary files /dev/null and b/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001503/data/temp-soil_GRSM001503_2025-10-17_ST_1_minute_001.parquet differ diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001503/data/temp-soil_GRSM001503_2025-10-17_ST_30_minute_030.parquet b/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001503/data/temp-soil_GRSM001503_2025-10-17_ST_30_minute_030.parquet new file mode 100644 index 000000000..ac4f3ffa9 Binary files /dev/null and b/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001503/data/temp-soil_GRSM001503_2025-10-17_ST_30_minute_030.parquet differ diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001503/location/CFGLOC105252.json b/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001503/location/CFGLOC105252.json new file mode 100644 index 000000000..64b21c403 --- /dev/null +++ b/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001503/location/CFGLOC105252.json @@ -0,0 +1,39 @@ +{ + "features":[ + { + "AngNedZaxs":"NA", + "AngPtch":"0", + "Cal$PrdLab":"one time before installation", + "Data Rate":"0.1", + "DistZaxsLvlMeasSoil":"-0.160", + "FreqSamp":"0.1", + "HOR":"001", + "IS Processing Default Start Date":"2017-08-20T00:00:00Z", + "Required Asset Management Location Code":"CFGLOC105252", + "VER":"503", + "geometry":null, + "location":"plot1", + "properties":{ + "active_periods":[ + { + "start_date":"2025-10-17T00:00:00Z", + "end_date":"2025-10-18T00:00:00Z" + } + ], + "context":[ + + ], + "description":"Great Smoky Mountains Soil Temp Profile SP1, Z3 Depth", + "domain":"D07", + "name":"CFGLOC105252", + "site":"GRSM", + "type":"CONFIG" + }, + "subLocation":"depth3", + "subSystem":"temp-profile", + "system":"soil", + "type":"Feature" + } + ], + "type":"FeatureCollection" +} diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001503/location/prt_24766_locations.json b/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001503/location/prt_24766_locations.json new file mode 100644 index 000000000..c87906f66 --- /dev/null +++ b/flow/tests/testthat/pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/temp-soil_GRSM001503/location/prt_24766_locations.json @@ -0,0 +1,409 @@ +{ + "features":[ + { + "AngNedZaxs":"NA", + "AngPtch":"0", + "asset_manufacturer":"Thermometrics", + "asset_model":"R000-00000011", + "asset_software_version":null, + "Cal$PrdLab":"one time before installation", + "Data Rate":"0.1", + "DistZaxsLvlMeasSoil":"-0.160", + "FreqSamp":"0.1", + "geometry":null, + "HOR":"001", + "location":"plot1", + "properties":{ + "context":[ + + ], + "domain":"D07", + "install_date":"2025-10-17T00:00:00Z", + "locations":{ + "features":[ + { + "geometry":null, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-18T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "State province", + "TN" + ], + [ + "UTM Zone", + "17N" + ] + ], + "reference_location":{ + "geometry":null, + "properties":{ + "locations":{ + "features":[ + { + "geometry":{ + "coordinates":[ + [ + -83.5014972, + 35.6884778, + 581.91 + ], + [ + -83.5015528, + 35.6884806, + 581.91 + ], + [ + -83.50155, + 35.688525, + 581.17 + ], + [ + -83.5014944, + 35.6885222, + 581.17 + ], + [ + -83.5014972, + 35.6884778, + 581.91 + ] + ], + "type":"Polygon" + }, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-18T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "AngAzXaxsRefeSoil", + "C4" + ], + [ + "AngAzYaxsRefeSoil", + "C2" + ], + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "ElevSoilC1", + "581.9073" + ], + [ + "ElevSoilC2", + "581.9073" + ], + [ + "ElevSoilC3", + "581.1691" + ], + [ + "ElevSoilC4", + "581.1691" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "LatSoilC1", + "35.6884778" + ], + [ + "LatSoilC2", + "35.6884806" + ], + [ + "LatSoilC3", + "35.6885250" + ], + [ + "LatSoilC4", + "35.6885222" + ], + [ + "locDisturb", + "1.24,3.18,NA and 0.94,2.68,NA and 1.72,2.68,NA and 1.72,3.13,NA and 2.11,2.90,NA" + ], + [ + "LonSoilC1", + "-83.5014972" + ], + [ + "LonSoilC2", + "-83.5015528" + ], + [ + "LonSoilC3", + "-83.5015500" + ], + [ + "LonSoilC4", + "-83.5014944" + ], + [ + "Orientation Number", + "2" + ], + [ + "RefeSoil", + "C1" + ], + [ + "Required Asset Management Location Code", + "SOILPL105236" + ], + [ + "State province", + "TN" + ], + [ + "UTM Zone", + "17N" + ], + [ + "x Azimuth Angle", + 3 + ], + [ + "y Azimuth Angle", + 274 + ] + ], + "reference_location":null, + "start_date":"2025-10-17T00:00:00Z", + "x_offset": 0, + "y_offset": 0, + "z_offset": 0 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + }, + "name":"SOILPL105236" + }, + "type":"Feature" + }, + "start_date":"2025-10-17T00:00:00Z", + "x_offset": 1.34, + "y_offset": 2.74, + "z_offset": -0.16 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + }, + "name":"CFGLOC105252", + "remove_date":"2025-10-18T00:00:00Z", + "site":"GRSM", + "site_location":{ + "features":[ + { + "geometry":{ + "coordinates":[ + -83.50195, + 35.68896, + 575.396725 + ], + "type":"Point" + }, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-18T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "AERONET_XREF", + "NEON_GRSM" + ], + [ + "AngAzWindPrim", + "140-320" + ], + [ + "AngAzWindScnd", + "NA" + ], + [ + "AngAzWindTrty", + "NA" + ], + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "DEIMS-SDR Site ID", + "https://deims.org/30f887c3-135b-41e8-9f44-9b084ce2b3bd" + ], + [ + "DistZaxsCnpy", + "31" + ], + [ + "DistZaxsDisp", + "20.2" + ], + [ + "Dom", + "D07" + ], + [ + "DURATION", + "Gradient" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "HABITAT", + "Terrestrial" + ], + [ + "IS Processing Default Start Date", + "2017-08-20T00:00:00Z" + ], + [ + "NEONSCI_FIELD_SITE_URL_PATH", + "great-smoky-mountains-national-park-twin-creeks" + ], + [ + "Pf$AngEnuXaxs", + "NA" + ], + [ + "Pf$AngEnuYaxs", + "NA" + ], + [ + "Pf$Ofst", + "NA" + ], + [ + "PrdDcmpMax", + "3" + ], + [ + "PrdIncrAgrDcmp", + "1" + ], + [ + "PrdIncrCalc", + "1" + ], + [ + "PrdIncrPf", + "1" + ], + [ + "PrdWndwAgrDcmp", + "5" + ], + [ + "PrdWndwCalc", + "3" + ], + [ + "PrdWndwPf", + "9" + ], + [ + "PresAtmSite", + "93630" + ], + [ + "Private", + "FALSE" + ], + [ + "Read", + "HDF5" + ], + [ + "Required Asset Management Location Code", + "GRSM" + ], + [ + "Site Timezone", + "US/Eastern" + ], + [ + "State Abbreviation", + "TN" + ], + [ + "State province", + "TN" + ], + [ + "TypeEco", + "Hardwood deciduous forest dominated by oaks and maples" + ], + [ + "TypeSoil", + "Spivey-Santeetlah-Nowhere complex, 8 to 15 percent slopes" + ], + [ + "UTM Zone", + "17N" + ], + [ + "ZoneTime", + "EST" + ] + ], + "reference_location":null, + "start_date":"2025-10-17T00:00:00Z", + "x_offset": 0, + "y_offset": 0, + "z_offset": 0 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + } + }, + "Required Asset Management Location Code":"CFGLOC105252", + "subLocation":"depth3", + "subSystem":"temp-profile", + "system":"soil", + "type":"Feature", + "VER":"503" + } + ], + "source_id": 24766, + "source_type":"prt", + "type":"FeatureCollection" +} diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/enviroscan/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/data/enviroscan_CFGLOC105360_2025-10-17.parquet b/flow/tests/testthat/pfs/envscn_temp_flags/enviroscan/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/data/enviroscan_CFGLOC105360_2025-10-17.parquet new file mode 100644 index 000000000..ed9637905 Binary files /dev/null and b/flow/tests/testthat/pfs/envscn_temp_flags/enviroscan/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/data/enviroscan_CFGLOC105360_2025-10-17.parquet differ diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/enviroscan/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/flags/enviroscan_CFGLOC105360_2025-10-17_flagsPlausibility.parquet b/flow/tests/testthat/pfs/envscn_temp_flags/enviroscan/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/flags/enviroscan_CFGLOC105360_2025-10-17_flagsPlausibility.parquet new file mode 100644 index 000000000..9ceba7483 Binary files /dev/null and b/flow/tests/testthat/pfs/envscn_temp_flags/enviroscan/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/flags/enviroscan_CFGLOC105360_2025-10-17_flagsPlausibility.parquet differ diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/enviroscan/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/location/CFGLOC105360.json b/flow/tests/testthat/pfs/envscn_temp_flags/enviroscan/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/location/CFGLOC105360.json new file mode 100644 index 000000000..1262bf2fa --- /dev/null +++ b/flow/tests/testthat/pfs/envscn_temp_flags/enviroscan/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/location/CFGLOC105360.json @@ -0,0 +1,22 @@ +{ + "features":[ + { + "Data Rate":"0.1", + "geometry":null, + "HOR":"005", + "properties":{ + "active_periods":[ + { + "start_date":"2025-10-17T00:00:00Z", + "end_date":"2025-10-18T00:00:00Z" + } + ], + "description":"Great Smoky Mountains Soil Water Content Profile SP5", + "name":"CFGLOC105360", + "site":"GRSM" + }, + "VER":"501" + } + ], + "type":"FeatureCollection" +} diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/enviroscan/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/location/enviroscan_46446_locations.json b/flow/tests/testthat/pfs/envscn_temp_flags/enviroscan/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/location/enviroscan_46446_locations.json new file mode 100644 index 000000000..aa19c24b0 --- /dev/null +++ b/flow/tests/testthat/pfs/envscn_temp_flags/enviroscan/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/location/enviroscan_46446_locations.json @@ -0,0 +1,96 @@ +{ + "features":[ + { + "Data Rate":"0.1", + "DistZaxsLvlMeasSoil":"-0.065,-0.165,-0.265,-0.365,-0.465,-0.565,-0.665,-0.865", + "geometry":null, + "HOR":"005", + "LvlMeasSoil":"8", + "properties":{ + "install_date":"2025-10-17T00:00:00Z", + "locations":{ + "features":[ + { + "geometry":null, + "properties":{ + "alpha": 2, + "beta": 0, + "end_date":"2025-10-18T00:00:00Z", + "gamma": 170, + "reference_location":{ + "geometry":null, + "properties":{ + "locations":{ + "features":[ + { + "geometry":{ + "coordinates":[ + [ + -83.50135, + 35.6892, + 576.39 + ], + [ + -83.5014028, + 35.6892, + 575.2 + ], + [ + -83.5014028, + 35.6892444, + 575.2 + ], + [ + -83.5013472, + 35.6892444, + 576.39 + ], + [ + -83.50135, + 35.6892, + 576.39 + ] + ], + "type":"Polygon" + }, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-18T00:00:00Z", + "gamma": 0, + "reference_location":null, + "start_date":"2025-10-17T00:00:00Z", + "x_offset": 0, + "y_offset": 0, + "z_offset": 0 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + }, + "name":"SOILPL105351" + }, + "type":"Feature" + }, + "start_date":"2025-10-17T00:00:00Z", + "x_offset": 0.56, + "y_offset": 2.9, + "z_offset": -0.005 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + }, + "name":"CFGLOC105360", + "remove_date":"2025-10-18T00:00:00Z", + "site":"GRSM" + }, + "VER":"501" + } + ], + "source_id": 46446, + "source_type":"enviroscan", + "type":"FeatureCollection" +} diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/enviroscan/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/threshold/thresholds.json b/flow/tests/testthat/pfs/envscn_temp_flags/enviroscan/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/threshold/thresholds.json new file mode 100644 index 000000000..78012a2e6 --- /dev/null +++ b/flow/tests/testthat/pfs/envscn_temp_flags/enviroscan/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/threshold/thresholds.json @@ -0,0 +1,5604 @@ +{ + "thresholds":[ + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSICDepth02", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 360, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 3600, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSICDepth03", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 360, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 3600, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSICDepth04", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 360, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 3600, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSICDepth05", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 360, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 3600, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSICDepth06", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 360, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 3600, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSICDepth07", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 360, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 3600, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSICDepth08", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 360, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 3600, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSICDepth01", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 360, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 3600, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Step Test value" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Step Test value" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Step Test value" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Step Test value" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Step Test value" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Step Test value" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Step Test value" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Step Test value" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Step Test value" + } + ] +} diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/enviroscan/tests/no_depths/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/data/enviroscan_CFGLOC105360_2025-10-17.parquet b/flow/tests/testthat/pfs/envscn_temp_flags/enviroscan/tests/no_depths/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/data/enviroscan_CFGLOC105360_2025-10-17.parquet new file mode 100644 index 000000000..f665ab69e Binary files /dev/null and b/flow/tests/testthat/pfs/envscn_temp_flags/enviroscan/tests/no_depths/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/data/enviroscan_CFGLOC105360_2025-10-17.parquet differ diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/enviroscan/tests/no_depths/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/flags/enviroscan_CFGLOC105360_2025-10-17_flagsPlausibility.parquet b/flow/tests/testthat/pfs/envscn_temp_flags/enviroscan/tests/no_depths/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/flags/enviroscan_CFGLOC105360_2025-10-17_flagsPlausibility.parquet new file mode 100644 index 000000000..643b8e595 Binary files /dev/null and b/flow/tests/testthat/pfs/envscn_temp_flags/enviroscan/tests/no_depths/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/flags/enviroscan_CFGLOC105360_2025-10-17_flagsPlausibility.parquet differ diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/enviroscan/tests/no_depths/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/threshold/thresholds.json b/flow/tests/testthat/pfs/envscn_temp_flags/enviroscan/tests/no_depths/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/threshold/thresholds.json new file mode 100644 index 000000000..78012a2e6 --- /dev/null +++ b/flow/tests/testthat/pfs/envscn_temp_flags/enviroscan/tests/no_depths/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/threshold/thresholds.json @@ -0,0 +1,5604 @@ +{ + "thresholds":[ + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSICDepth02", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 360, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 3600, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth02", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSICDepth03", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 360, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 3600, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth03", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSICDepth04", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 360, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 3600, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth04", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSICDepth05", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 360, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 3600, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth05", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSICDepth06", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 360, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 3600, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth06", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSICDepth07", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 360, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 3600, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth07", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSICDepth08", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 360, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 3600, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth08", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSICDepth01", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 360, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 3600, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 20000, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"ion-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2000-01-01T00:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSICDepth01", + "threshold_name":"Step Test value" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth02", + "threshold_name":"Step Test value" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth03", + "threshold_name":"Step Test value" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth04", + "threshold_name":"Step Test value" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth05", + "threshold_name":"Step Test value" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth06", + "threshold_name":"Step Test value" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth07", + "threshold_name":"Step Test value" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth08", + "threshold_name":"Step Test value" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"factory", +"soil", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCfactoryDepth01", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth02", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth03", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth04", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth05", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth06", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth07", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth08", + "threshold_name":"Step Test value" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 12, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Despiking MAD" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Despiking maximum consecutive points (n)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 60, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Despiking maximum (%) missing points per window" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value":null, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":"A", + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Despiking Method" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 10, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Despiking window size - points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Despiking window step - points." + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Gap Test value - # missing points" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.0001, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Persistence (change)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 86400, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Persistence (time - seconds)" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Range Threshold Hard Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Range Threshold Hard Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 1, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Range Threshold Soft Max" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": -0.4, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Range Threshold Soft Min" + }, + { + "context":[ +"soil", +"soil-specific", +"water-content" + ], + "end_date":null, + "end_day_of_year":null, + "is_date_constrained":"N", + "location_name":"GRSM", + "number_value": 0.01, + "start_date":"2021-10-13T12:00:00Z", + "start_day_of_year":null, + "string_value":null, + "term_name":"VSWCsoilSpecificDepth01", + "threshold_name":"Step Test value" + } + ] +} diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/enviroscan/tests/no_thresholds/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/data/enviroscan_CFGLOC105360_2025-10-17.parquet b/flow/tests/testthat/pfs/envscn_temp_flags/enviroscan/tests/no_thresholds/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/data/enviroscan_CFGLOC105360_2025-10-17.parquet new file mode 100644 index 000000000..ed9637905 Binary files /dev/null and b/flow/tests/testthat/pfs/envscn_temp_flags/enviroscan/tests/no_thresholds/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/data/enviroscan_CFGLOC105360_2025-10-17.parquet differ diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/enviroscan/tests/no_thresholds/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/flags/enviroscan_CFGLOC105360_2025-10-17_flagsPlausibility.parquet b/flow/tests/testthat/pfs/envscn_temp_flags/enviroscan/tests/no_thresholds/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/flags/enviroscan_CFGLOC105360_2025-10-17_flagsPlausibility.parquet new file mode 100644 index 000000000..9ceba7483 Binary files /dev/null and b/flow/tests/testthat/pfs/envscn_temp_flags/enviroscan/tests/no_thresholds/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/flags/enviroscan_CFGLOC105360_2025-10-17_flagsPlausibility.parquet differ diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/enviroscan/tests/no_thresholds/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/threshold/thresholds.json b/flow/tests/testthat/pfs/envscn_temp_flags/enviroscan/tests/no_thresholds/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/threshold/thresholds.json new file mode 100644 index 000000000..5c2015a39 --- /dev/null +++ b/flow/tests/testthat/pfs/envscn_temp_flags/enviroscan/tests/no_thresholds/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/threshold/thresholds.json @@ -0,0 +1 @@ +{ "thresholds":[]} \ No newline at end of file diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/all_freezing/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/data/temp-soil_GRSM005503_2025-10-17_ST_1_minute_001.parquet b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/all_freezing/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/data/temp-soil_GRSM005503_2025-10-17_ST_1_minute_001.parquet new file mode 100644 index 000000000..6da0ee7f9 Binary files /dev/null and b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/all_freezing/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/data/temp-soil_GRSM005503_2025-10-17_ST_1_minute_001.parquet differ diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/all_freezing/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/location/CFGLOC105367.json b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/all_freezing/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/location/CFGLOC105367.json new file mode 100644 index 000000000..c2c02e79d --- /dev/null +++ b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/all_freezing/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/location/CFGLOC105367.json @@ -0,0 +1,39 @@ +{ + "features":[ + { + "AngNedZaxs":"NA", + "AngPtch":"0", + "Cal$PrdLab":"one time before installation", + "Data Rate":"0.1", + "DistZaxsLvlMeasSoil":"-0.165", + "FreqSamp":"0.1", + "HOR":"005", + "IS Processing Default Start Date":"2017-08-20T00:00:00Z", + "Required Asset Management Location Code":"CFGLOC105367", + "VER":"503", + "geometry":null, + "location":"plot5", + "properties":{ + "active_periods":[ + { + "start_date":"2025-10-17T00:00:00Z", + "end_date":"2025-10-18T00:00:00Z" + } + ], + "context":[ + + ], + "description":"Great Smoky Mountains Soil Temp Profile SP5, Z3 Depth", + "domain":"D07", + "name":"CFGLOC105367", + "site":"GRSM", + "type":"CONFIG" + }, + "subLocation":"depth3", + "subSystem":"temp-profile", + "system":"soil", + "type":"Feature" + } + ], + "type":"FeatureCollection" +} diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/all_freezing/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/location/prt_20057_locations.json b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/all_freezing/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/location/prt_20057_locations.json new file mode 100644 index 000000000..8a391859c --- /dev/null +++ b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/all_freezing/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/location/prt_20057_locations.json @@ -0,0 +1,409 @@ +{ + "features":[ + { + "AngNedZaxs":"NA", + "AngPtch":"0", + "asset_manufacturer":"Thermometrics", + "asset_model":"R000-00000011", + "asset_software_version":null, + "Cal$PrdLab":"one time before installation", + "Data Rate":"0.1", + "DistZaxsLvlMeasSoil":"-0.165", + "FreqSamp":"0.1", + "geometry":null, + "HOR":"005", + "location":"plot5", + "properties":{ + "context":[ + + ], + "domain":"D07", + "install_date":"2025-10-17T00:00:00Z", + "locations":{ + "features":[ + { + "geometry":null, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-18T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "State province", + "TN" + ], + [ + "UTM Zone", + "17N" + ] + ], + "reference_location":{ + "geometry":null, + "properties":{ + "locations":{ + "features":[ + { + "geometry":{ + "coordinates":[ + [ + -83.50135, + 35.6892, + 576.39 + ], + [ + -83.5014028, + 35.6892, + 575.2 + ], + [ + -83.5014028, + 35.6892444, + 575.2 + ], + [ + -83.5013472, + 35.6892444, + 576.39 + ], + [ + -83.50135, + 35.6892, + 576.39 + ] + ], + "type":"Polygon" + }, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-18T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "AngAzXaxsRefeSoil", + "C4" + ], + [ + "AngAzYaxsRefeSoil", + "C2" + ], + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "ElevSoilC1", + "576.39" + ], + [ + "ElevSoilC2", + "575.20" + ], + [ + "ElevSoilC3", + "575.20" + ], + [ + "ElevSoilC4", + "576.39" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "LatSoilC1", + "35.6892000" + ], + [ + "LatSoilC2", + "35.6892000" + ], + [ + "LatSoilC3", + "35.6892444" + ], + [ + "LatSoilC4", + "35.6892444" + ], + [ + "locDisturb", + "1.32,2.3,NA and 0.160,3.175,NA and 0.160,2.725,NA and 1.720,3.175,NA and 1.72,2.725,NA" + ], + [ + "LonSoilC1", + "-83.5013500" + ], + [ + "LonSoilC2", + "-83.5014028" + ], + [ + "LonSoilC3", + "-83.5014028" + ], + [ + "LonSoilC4", + "-83.5013472" + ], + [ + "Orientation Number", + "2" + ], + [ + "RefeSoil", + "C1" + ], + [ + "Required Asset Management Location Code", + "SOILPL105351" + ], + [ + "State province", + "TN" + ], + [ + "UTM Zone", + "17N" + ], + [ + "x Azimuth Angle", + 3 + ], + [ + "y Azimuth Angle", + 270 + ] + ], + "reference_location":null, + "start_date":"2025-10-17T00:00:00Z", + "x_offset": 0, + "y_offset": 0, + "z_offset": 0 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + }, + "name":"SOILPL105351" + }, + "type":"Feature" + }, + "start_date":"2025-10-17T00:00:00Z", + "x_offset": 1.285, + "y_offset": 2.975, + "z_offset": -0.165 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + }, + "name":"CFGLOC105367", + "remove_date":"2025-10-18T00:00:00Z", + "site":"GRSM", + "site_location":{ + "features":[ + { + "geometry":{ + "coordinates":[ + -83.50195, + 35.68896, + 575.396725 + ], + "type":"Point" + }, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-18T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "AERONET_XREF", + "NEON_GRSM" + ], + [ + "AngAzWindPrim", + "140-320" + ], + [ + "AngAzWindScnd", + "NA" + ], + [ + "AngAzWindTrty", + "NA" + ], + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "DEIMS-SDR Site ID", + "https://deims.org/30f887c3-135b-41e8-9f44-9b084ce2b3bd" + ], + [ + "DistZaxsCnpy", + "31" + ], + [ + "DistZaxsDisp", + "20.2" + ], + [ + "Dom", + "D07" + ], + [ + "DURATION", + "Gradient" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "HABITAT", + "Terrestrial" + ], + [ + "IS Processing Default Start Date", + "2017-08-20T00:00:00Z" + ], + [ + "NEONSCI_FIELD_SITE_URL_PATH", + "great-smoky-mountains-national-park-twin-creeks" + ], + [ + "Pf$AngEnuXaxs", + "NA" + ], + [ + "Pf$AngEnuYaxs", + "NA" + ], + [ + "Pf$Ofst", + "NA" + ], + [ + "PrdDcmpMax", + "3" + ], + [ + "PrdIncrAgrDcmp", + "1" + ], + [ + "PrdIncrCalc", + "1" + ], + [ + "PrdIncrPf", + "1" + ], + [ + "PrdWndwAgrDcmp", + "5" + ], + [ + "PrdWndwCalc", + "3" + ], + [ + "PrdWndwPf", + "9" + ], + [ + "PresAtmSite", + "93630" + ], + [ + "Private", + "FALSE" + ], + [ + "Read", + "HDF5" + ], + [ + "Required Asset Management Location Code", + "GRSM" + ], + [ + "Site Timezone", + "US/Eastern" + ], + [ + "State Abbreviation", + "TN" + ], + [ + "State province", + "TN" + ], + [ + "TypeEco", + "Hardwood deciduous forest dominated by oaks and maples" + ], + [ + "TypeSoil", + "Spivey-Santeetlah-Nowhere complex, 8 to 15 percent slopes" + ], + [ + "UTM Zone", + "17N" + ], + [ + "ZoneTime", + "EST" + ] + ], + "reference_location":null, + "start_date":"2025-10-17T00:00:00Z", + "x_offset": 0, + "y_offset": 0, + "z_offset": 0 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + } + }, + "Required Asset Management Location Code":"CFGLOC105367", + "subLocation":"depth3", + "subSystem":"temp-profile", + "system":"soil", + "type":"Feature", + "VER":"503" + } + ], + "source_id": 20057, + "source_type":"prt", + "type":"FeatureCollection" +} diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/data/temp-soil_GRSM005503_2025-10-17_ST_1_minute_001.parquet b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/data/temp-soil_GRSM005503_2025-10-17_ST_1_minute_001.parquet new file mode 100644 index 000000000..13081052e Binary files /dev/null and b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/data/temp-soil_GRSM005503_2025-10-17_ST_1_minute_001.parquet differ diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/location/CFGLOC105367.json b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/location/CFGLOC105367.json new file mode 100644 index 000000000..c2c02e79d --- /dev/null +++ b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/location/CFGLOC105367.json @@ -0,0 +1,39 @@ +{ + "features":[ + { + "AngNedZaxs":"NA", + "AngPtch":"0", + "Cal$PrdLab":"one time before installation", + "Data Rate":"0.1", + "DistZaxsLvlMeasSoil":"-0.165", + "FreqSamp":"0.1", + "HOR":"005", + "IS Processing Default Start Date":"2017-08-20T00:00:00Z", + "Required Asset Management Location Code":"CFGLOC105367", + "VER":"503", + "geometry":null, + "location":"plot5", + "properties":{ + "active_periods":[ + { + "start_date":"2025-10-17T00:00:00Z", + "end_date":"2025-10-18T00:00:00Z" + } + ], + "context":[ + + ], + "description":"Great Smoky Mountains Soil Temp Profile SP5, Z3 Depth", + "domain":"D07", + "name":"CFGLOC105367", + "site":"GRSM", + "type":"CONFIG" + }, + "subLocation":"depth3", + "subSystem":"temp-profile", + "system":"soil", + "type":"Feature" + } + ], + "type":"FeatureCollection" +} diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/location/prt_20057_locations.json b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/location/prt_20057_locations.json new file mode 100644 index 000000000..8a391859c --- /dev/null +++ b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/location/prt_20057_locations.json @@ -0,0 +1,409 @@ +{ + "features":[ + { + "AngNedZaxs":"NA", + "AngPtch":"0", + "asset_manufacturer":"Thermometrics", + "asset_model":"R000-00000011", + "asset_software_version":null, + "Cal$PrdLab":"one time before installation", + "Data Rate":"0.1", + "DistZaxsLvlMeasSoil":"-0.165", + "FreqSamp":"0.1", + "geometry":null, + "HOR":"005", + "location":"plot5", + "properties":{ + "context":[ + + ], + "domain":"D07", + "install_date":"2025-10-17T00:00:00Z", + "locations":{ + "features":[ + { + "geometry":null, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-18T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "State province", + "TN" + ], + [ + "UTM Zone", + "17N" + ] + ], + "reference_location":{ + "geometry":null, + "properties":{ + "locations":{ + "features":[ + { + "geometry":{ + "coordinates":[ + [ + -83.50135, + 35.6892, + 576.39 + ], + [ + -83.5014028, + 35.6892, + 575.2 + ], + [ + -83.5014028, + 35.6892444, + 575.2 + ], + [ + -83.5013472, + 35.6892444, + 576.39 + ], + [ + -83.50135, + 35.6892, + 576.39 + ] + ], + "type":"Polygon" + }, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-18T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "AngAzXaxsRefeSoil", + "C4" + ], + [ + "AngAzYaxsRefeSoil", + "C2" + ], + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "ElevSoilC1", + "576.39" + ], + [ + "ElevSoilC2", + "575.20" + ], + [ + "ElevSoilC3", + "575.20" + ], + [ + "ElevSoilC4", + "576.39" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "LatSoilC1", + "35.6892000" + ], + [ + "LatSoilC2", + "35.6892000" + ], + [ + "LatSoilC3", + "35.6892444" + ], + [ + "LatSoilC4", + "35.6892444" + ], + [ + "locDisturb", + "1.32,2.3,NA and 0.160,3.175,NA and 0.160,2.725,NA and 1.720,3.175,NA and 1.72,2.725,NA" + ], + [ + "LonSoilC1", + "-83.5013500" + ], + [ + "LonSoilC2", + "-83.5014028" + ], + [ + "LonSoilC3", + "-83.5014028" + ], + [ + "LonSoilC4", + "-83.5013472" + ], + [ + "Orientation Number", + "2" + ], + [ + "RefeSoil", + "C1" + ], + [ + "Required Asset Management Location Code", + "SOILPL105351" + ], + [ + "State province", + "TN" + ], + [ + "UTM Zone", + "17N" + ], + [ + "x Azimuth Angle", + 3 + ], + [ + "y Azimuth Angle", + 270 + ] + ], + "reference_location":null, + "start_date":"2025-10-17T00:00:00Z", + "x_offset": 0, + "y_offset": 0, + "z_offset": 0 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + }, + "name":"SOILPL105351" + }, + "type":"Feature" + }, + "start_date":"2025-10-17T00:00:00Z", + "x_offset": 1.285, + "y_offset": 2.975, + "z_offset": -0.165 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + }, + "name":"CFGLOC105367", + "remove_date":"2025-10-18T00:00:00Z", + "site":"GRSM", + "site_location":{ + "features":[ + { + "geometry":{ + "coordinates":[ + -83.50195, + 35.68896, + 575.396725 + ], + "type":"Point" + }, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-18T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "AERONET_XREF", + "NEON_GRSM" + ], + [ + "AngAzWindPrim", + "140-320" + ], + [ + "AngAzWindScnd", + "NA" + ], + [ + "AngAzWindTrty", + "NA" + ], + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "DEIMS-SDR Site ID", + "https://deims.org/30f887c3-135b-41e8-9f44-9b084ce2b3bd" + ], + [ + "DistZaxsCnpy", + "31" + ], + [ + "DistZaxsDisp", + "20.2" + ], + [ + "Dom", + "D07" + ], + [ + "DURATION", + "Gradient" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "HABITAT", + "Terrestrial" + ], + [ + "IS Processing Default Start Date", + "2017-08-20T00:00:00Z" + ], + [ + "NEONSCI_FIELD_SITE_URL_PATH", + "great-smoky-mountains-national-park-twin-creeks" + ], + [ + "Pf$AngEnuXaxs", + "NA" + ], + [ + "Pf$AngEnuYaxs", + "NA" + ], + [ + "Pf$Ofst", + "NA" + ], + [ + "PrdDcmpMax", + "3" + ], + [ + "PrdIncrAgrDcmp", + "1" + ], + [ + "PrdIncrCalc", + "1" + ], + [ + "PrdIncrPf", + "1" + ], + [ + "PrdWndwAgrDcmp", + "5" + ], + [ + "PrdWndwCalc", + "3" + ], + [ + "PrdWndwPf", + "9" + ], + [ + "PresAtmSite", + "93630" + ], + [ + "Private", + "FALSE" + ], + [ + "Read", + "HDF5" + ], + [ + "Required Asset Management Location Code", + "GRSM" + ], + [ + "Site Timezone", + "US/Eastern" + ], + [ + "State Abbreviation", + "TN" + ], + [ + "State province", + "TN" + ], + [ + "TypeEco", + "Hardwood deciduous forest dominated by oaks and maples" + ], + [ + "TypeSoil", + "Spivey-Santeetlah-Nowhere complex, 8 to 15 percent slopes" + ], + [ + "UTM Zone", + "17N" + ], + [ + "ZoneTime", + "EST" + ] + ], + "reference_location":null, + "start_date":"2025-10-17T00:00:00Z", + "x_offset": 0, + "y_offset": 0, + "z_offset": 0 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + } + }, + "Required Asset Management Location Code":"CFGLOC105367", + "subLocation":"depth3", + "subSystem":"temp-profile", + "system":"soil", + "type":"Feature", + "VER":"503" + } + ], + "source_id": 20057, + "source_type":"prt", + "type":"FeatureCollection" +} diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005504/data/temp-soil_GRSM005504_2025-10-17_ST_1_minute_001.parquet b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005504/data/temp-soil_GRSM005504_2025-10-17_ST_1_minute_001.parquet new file mode 100644 index 000000000..990cf8175 Binary files /dev/null and b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005504/data/temp-soil_GRSM005504_2025-10-17_ST_1_minute_001.parquet differ diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005504/location/CFGLOC105369.json b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005504/location/CFGLOC105369.json new file mode 100644 index 000000000..ffef1dd05 --- /dev/null +++ b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005504/location/CFGLOC105369.json @@ -0,0 +1,39 @@ +{ + "features":[ + { + "AngNedZaxs":"NA", + "AngPtch":"0", + "Cal$PrdLab":"one time before installation", + "Data Rate":"0.1", + "DistZaxsLvlMeasSoil":"-0.265", + "FreqSamp":"0.1", + "HOR":"005", + "IS Processing Default Start Date":"2017-08-20T00:00:00Z", + "Required Asset Management Location Code":"CFGLOC105369", + "VER":"504", + "geometry":null, + "location":"plot5", + "properties":{ + "active_periods":[ + { + "start_date":"2025-10-17T00:00:00Z", + "end_date":"2025-10-18T00:00:00Z" + } + ], + "context":[ + + ], + "description":"Great Smoky Mountains Soil Temp Profile SP5, Z4 Depth", + "domain":"D07", + "name":"CFGLOC105369", + "site":"GRSM", + "type":"CONFIG" + }, + "subLocation":"depth4", + "subSystem":"temp-profile", + "system":"soil", + "type":"Feature" + } + ], + "type":"FeatureCollection" +} diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005504/location/prt_20037_locations.json b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005504/location/prt_20037_locations.json new file mode 100644 index 000000000..3cf237c1b --- /dev/null +++ b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005504/location/prt_20037_locations.json @@ -0,0 +1,409 @@ +{ + "features":[ + { + "AngNedZaxs":"NA", + "AngPtch":"0", + "asset_manufacturer":"Thermometrics", + "asset_model":"R000-00000011", + "asset_software_version":null, + "Cal$PrdLab":"one time before installation", + "Data Rate":"0.1", + "DistZaxsLvlMeasSoil":"-0.265", + "FreqSamp":"0.1", + "geometry":null, + "HOR":"005", + "location":"plot5", + "properties":{ + "context":[ + + ], + "domain":"D07", + "install_date":"2025-10-17T00:00:00Z", + "locations":{ + "features":[ + { + "geometry":null, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-18T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "State province", + "TN" + ], + [ + "UTM Zone", + "17N" + ] + ], + "reference_location":{ + "geometry":null, + "properties":{ + "locations":{ + "features":[ + { + "geometry":{ + "coordinates":[ + [ + -83.50135, + 35.6892, + 576.39 + ], + [ + -83.5014028, + 35.6892, + 575.2 + ], + [ + -83.5014028, + 35.6892444, + 575.2 + ], + [ + -83.5013472, + 35.6892444, + 576.39 + ], + [ + -83.50135, + 35.6892, + 576.39 + ] + ], + "type":"Polygon" + }, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-18T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "AngAzXaxsRefeSoil", + "C4" + ], + [ + "AngAzYaxsRefeSoil", + "C2" + ], + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "ElevSoilC1", + "576.39" + ], + [ + "ElevSoilC2", + "575.20" + ], + [ + "ElevSoilC3", + "575.20" + ], + [ + "ElevSoilC4", + "576.39" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "LatSoilC1", + "35.6892000" + ], + [ + "LatSoilC2", + "35.6892000" + ], + [ + "LatSoilC3", + "35.6892444" + ], + [ + "LatSoilC4", + "35.6892444" + ], + [ + "locDisturb", + "1.32,2.3,NA and 0.160,3.175,NA and 0.160,2.725,NA and 1.720,3.175,NA and 1.72,2.725,NA" + ], + [ + "LonSoilC1", + "-83.5013500" + ], + [ + "LonSoilC2", + "-83.5014028" + ], + [ + "LonSoilC3", + "-83.5014028" + ], + [ + "LonSoilC4", + "-83.5013472" + ], + [ + "Orientation Number", + "2" + ], + [ + "RefeSoil", + "C1" + ], + [ + "Required Asset Management Location Code", + "SOILPL105351" + ], + [ + "State province", + "TN" + ], + [ + "UTM Zone", + "17N" + ], + [ + "x Azimuth Angle", + 3 + ], + [ + "y Azimuth Angle", + 270 + ] + ], + "reference_location":null, + "start_date":"2025-10-17T00:00:00Z", + "x_offset": 0, + "y_offset": 0, + "z_offset": 0 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + }, + "name":"SOILPL105351" + }, + "type":"Feature" + }, + "start_date":"2025-10-17T00:00:00Z", + "x_offset": 1.285, + "y_offset": 2.975, + "z_offset": -0.265 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + }, + "name":"CFGLOC105369", + "remove_date":"2025-10-18T00:00:00Z", + "site":"GRSM", + "site_location":{ + "features":[ + { + "geometry":{ + "coordinates":[ + -83.50195, + 35.68896, + 575.396725 + ], + "type":"Point" + }, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-18T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "AERONET_XREF", + "NEON_GRSM" + ], + [ + "AngAzWindPrim", + "140-320" + ], + [ + "AngAzWindScnd", + "NA" + ], + [ + "AngAzWindTrty", + "NA" + ], + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "DEIMS-SDR Site ID", + "https://deims.org/30f887c3-135b-41e8-9f44-9b084ce2b3bd" + ], + [ + "DistZaxsCnpy", + "31" + ], + [ + "DistZaxsDisp", + "20.2" + ], + [ + "Dom", + "D07" + ], + [ + "DURATION", + "Gradient" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "HABITAT", + "Terrestrial" + ], + [ + "IS Processing Default Start Date", + "2017-08-20T00:00:00Z" + ], + [ + "NEONSCI_FIELD_SITE_URL_PATH", + "great-smoky-mountains-national-park-twin-creeks" + ], + [ + "Pf$AngEnuXaxs", + "NA" + ], + [ + "Pf$AngEnuYaxs", + "NA" + ], + [ + "Pf$Ofst", + "NA" + ], + [ + "PrdDcmpMax", + "3" + ], + [ + "PrdIncrAgrDcmp", + "1" + ], + [ + "PrdIncrCalc", + "1" + ], + [ + "PrdIncrPf", + "1" + ], + [ + "PrdWndwAgrDcmp", + "5" + ], + [ + "PrdWndwCalc", + "3" + ], + [ + "PrdWndwPf", + "9" + ], + [ + "PresAtmSite", + "93630" + ], + [ + "Private", + "FALSE" + ], + [ + "Read", + "HDF5" + ], + [ + "Required Asset Management Location Code", + "GRSM" + ], + [ + "Site Timezone", + "US/Eastern" + ], + [ + "State Abbreviation", + "TN" + ], + [ + "State province", + "TN" + ], + [ + "TypeEco", + "Hardwood deciduous forest dominated by oaks and maples" + ], + [ + "TypeSoil", + "Spivey-Santeetlah-Nowhere complex, 8 to 15 percent slopes" + ], + [ + "UTM Zone", + "17N" + ], + [ + "ZoneTime", + "EST" + ] + ], + "reference_location":null, + "start_date":"2025-10-17T00:00:00Z", + "x_offset": 0, + "y_offset": 0, + "z_offset": 0 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + } + }, + "Required Asset Management Location Code":"CFGLOC105369", + "subLocation":"depth4", + "subSystem":"temp-profile", + "system":"soil", + "type":"Feature", + "VER":"504" + } + ], + "source_id": 20037, + "source_type":"prt", + "type":"FeatureCollection" +} diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005505/data/temp-soil_GRSM005505_2025-10-17_ST_1_minute_001.parquet b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005505/data/temp-soil_GRSM005505_2025-10-17_ST_1_minute_001.parquet new file mode 100644 index 000000000..d8b9bdba4 Binary files /dev/null and b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005505/data/temp-soil_GRSM005505_2025-10-17_ST_1_minute_001.parquet differ diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005505/location/CFGLOC105371.json b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005505/location/CFGLOC105371.json new file mode 100644 index 000000000..f31e680a7 --- /dev/null +++ b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005505/location/CFGLOC105371.json @@ -0,0 +1,39 @@ +{ + "features":[ + { + "AngNedZaxs":"NA", + "AngPtch":"0", + "Cal$PrdLab":"one time before installation", + "Data Rate":"0.1", + "DistZaxsLvlMeasSoil":"-0.365", + "FreqSamp":"0.1", + "HOR":"005", + "IS Processing Default Start Date":"2017-08-20T00:00:00Z", + "Required Asset Management Location Code":"CFGLOC105371", + "VER":"505", + "geometry":null, + "location":"plot5", + "properties":{ + "active_periods":[ + { + "start_date":"2025-10-17T00:00:00Z", + "end_date":"2025-10-18T00:00:00Z" + } + ], + "context":[ + + ], + "description":"Great Smoky Mountains Soil Temp Profile SP5, Z5 Depth", + "domain":"D07", + "name":"CFGLOC105371", + "site":"GRSM", + "type":"CONFIG" + }, + "subLocation":"depth5", + "subSystem":"temp-profile", + "system":"soil", + "type":"Feature" + } + ], + "type":"FeatureCollection" +} diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005505/location/prt_23800_locations.json b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005505/location/prt_23800_locations.json new file mode 100644 index 000000000..98c240f10 --- /dev/null +++ b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005505/location/prt_23800_locations.json @@ -0,0 +1,409 @@ +{ + "features":[ + { + "AngNedZaxs":"NA", + "AngPtch":"0", + "asset_manufacturer":"Thermometrics", + "asset_model":"R000-00000011", + "asset_software_version":null, + "Cal$PrdLab":"one time before installation", + "Data Rate":"0.1", + "DistZaxsLvlMeasSoil":"-0.365", + "FreqSamp":"0.1", + "geometry":null, + "HOR":"005", + "location":"plot5", + "properties":{ + "context":[ + + ], + "domain":"D07", + "install_date":"2025-10-17T00:00:00Z", + "locations":{ + "features":[ + { + "geometry":null, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-18T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "State province", + "TN" + ], + [ + "UTM Zone", + "17N" + ] + ], + "reference_location":{ + "geometry":null, + "properties":{ + "locations":{ + "features":[ + { + "geometry":{ + "coordinates":[ + [ + -83.50135, + 35.6892, + 576.39 + ], + [ + -83.5014028, + 35.6892, + 575.2 + ], + [ + -83.5014028, + 35.6892444, + 575.2 + ], + [ + -83.5013472, + 35.6892444, + 576.39 + ], + [ + -83.50135, + 35.6892, + 576.39 + ] + ], + "type":"Polygon" + }, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-18T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "AngAzXaxsRefeSoil", + "C4" + ], + [ + "AngAzYaxsRefeSoil", + "C2" + ], + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "ElevSoilC1", + "576.39" + ], + [ + "ElevSoilC2", + "575.20" + ], + [ + "ElevSoilC3", + "575.20" + ], + [ + "ElevSoilC4", + "576.39" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "LatSoilC1", + "35.6892000" + ], + [ + "LatSoilC2", + "35.6892000" + ], + [ + "LatSoilC3", + "35.6892444" + ], + [ + "LatSoilC4", + "35.6892444" + ], + [ + "locDisturb", + "1.32,2.3,NA and 0.160,3.175,NA and 0.160,2.725,NA and 1.720,3.175,NA and 1.72,2.725,NA" + ], + [ + "LonSoilC1", + "-83.5013500" + ], + [ + "LonSoilC2", + "-83.5014028" + ], + [ + "LonSoilC3", + "-83.5014028" + ], + [ + "LonSoilC4", + "-83.5013472" + ], + [ + "Orientation Number", + "2" + ], + [ + "RefeSoil", + "C1" + ], + [ + "Required Asset Management Location Code", + "SOILPL105351" + ], + [ + "State province", + "TN" + ], + [ + "UTM Zone", + "17N" + ], + [ + "x Azimuth Angle", + 3 + ], + [ + "y Azimuth Angle", + 270 + ] + ], + "reference_location":null, + "start_date":"2025-10-17T00:00:00Z", + "x_offset": 0, + "y_offset": 0, + "z_offset": 0 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + }, + "name":"SOILPL105351" + }, + "type":"Feature" + }, + "start_date":"2025-10-17T00:00:00Z", + "x_offset": 1.285, + "y_offset": 2.975, + "z_offset": -0.365 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + }, + "name":"CFGLOC105371", + "remove_date":"2025-10-18T00:00:00Z", + "site":"GRSM", + "site_location":{ + "features":[ + { + "geometry":{ + "coordinates":[ + -83.50195, + 35.68896, + 575.396725 + ], + "type":"Point" + }, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-18T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "AERONET_XREF", + "NEON_GRSM" + ], + [ + "AngAzWindPrim", + "140-320" + ], + [ + "AngAzWindScnd", + "NA" + ], + [ + "AngAzWindTrty", + "NA" + ], + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "DEIMS-SDR Site ID", + "https://deims.org/30f887c3-135b-41e8-9f44-9b084ce2b3bd" + ], + [ + "DistZaxsCnpy", + "31" + ], + [ + "DistZaxsDisp", + "20.2" + ], + [ + "Dom", + "D07" + ], + [ + "DURATION", + "Gradient" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "HABITAT", + "Terrestrial" + ], + [ + "IS Processing Default Start Date", + "2017-08-20T00:00:00Z" + ], + [ + "NEONSCI_FIELD_SITE_URL_PATH", + "great-smoky-mountains-national-park-twin-creeks" + ], + [ + "Pf$AngEnuXaxs", + "NA" + ], + [ + "Pf$AngEnuYaxs", + "NA" + ], + [ + "Pf$Ofst", + "NA" + ], + [ + "PrdDcmpMax", + "3" + ], + [ + "PrdIncrAgrDcmp", + "1" + ], + [ + "PrdIncrCalc", + "1" + ], + [ + "PrdIncrPf", + "1" + ], + [ + "PrdWndwAgrDcmp", + "5" + ], + [ + "PrdWndwCalc", + "3" + ], + [ + "PrdWndwPf", + "9" + ], + [ + "PresAtmSite", + "93630" + ], + [ + "Private", + "FALSE" + ], + [ + "Read", + "HDF5" + ], + [ + "Required Asset Management Location Code", + "GRSM" + ], + [ + "Site Timezone", + "US/Eastern" + ], + [ + "State Abbreviation", + "TN" + ], + [ + "State province", + "TN" + ], + [ + "TypeEco", + "Hardwood deciduous forest dominated by oaks and maples" + ], + [ + "TypeSoil", + "Spivey-Santeetlah-Nowhere complex, 8 to 15 percent slopes" + ], + [ + "UTM Zone", + "17N" + ], + [ + "ZoneTime", + "EST" + ] + ], + "reference_location":null, + "start_date":"2025-10-17T00:00:00Z", + "x_offset": 0, + "y_offset": 0, + "z_offset": 0 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + } + }, + "Required Asset Management Location Code":"CFGLOC105371", + "subLocation":"depth5", + "subSystem":"temp-profile", + "system":"soil", + "type":"Feature", + "VER":"505" + } + ], + "source_id": 23800, + "source_type":"prt", + "type":"FeatureCollection" +} diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005501/data/temp-soil_GRSM005501_2025-10-18_ST_1_minute_001.parquet b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005501/data/temp-soil_GRSM005501_2025-10-18_ST_1_minute_001.parquet new file mode 100644 index 000000000..9aa63717f Binary files /dev/null and b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005501/data/temp-soil_GRSM005501_2025-10-18_ST_1_minute_001.parquet differ diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005501/data/temp-soil_GRSM005501_2025-10-18_ST_30_minute_030.parquet b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005501/data/temp-soil_GRSM005501_2025-10-18_ST_30_minute_030.parquet new file mode 100644 index 000000000..7ad17f233 Binary files /dev/null and b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005501/data/temp-soil_GRSM005501_2025-10-18_ST_30_minute_030.parquet differ diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005501/location/CFGLOC105363.json b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005501/location/CFGLOC105363.json new file mode 100644 index 000000000..b05200eb6 --- /dev/null +++ b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005501/location/CFGLOC105363.json @@ -0,0 +1,39 @@ +{ + "features":[ + { + "AngNedZaxs":"NA", + "AngPtch":"0", + "Cal$PrdLab":"one time before installation", + "Data Rate":"0.1", + "DistZaxsLvlMeasSoil":"-0.025", + "FreqSamp":"0.1", + "HOR":"005", + "IS Processing Default Start Date":"2017-08-20T00:00:00Z", + "Required Asset Management Location Code":"CFGLOC105363", + "VER":"501", + "geometry":null, + "location":"plot5", + "properties":{ + "active_periods":[ + { + "start_date":"2025-10-18T00:00:00Z", + "end_date":"2025-10-19T00:00:00Z" + } + ], + "context":[ + + ], + "description":"Great Smoky Mountains Soil Temp Profile SP5, Z1 Depth", + "domain":"D07", + "name":"CFGLOC105363", + "site":"GRSM", + "type":"CONFIG" + }, + "subLocation":"depth1", + "subSystem":"temp-profile", + "system":"soil", + "type":"Feature" + } + ], + "type":"FeatureCollection" +} diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005501/location/prt_24772_locations.json b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005501/location/prt_24772_locations.json new file mode 100644 index 000000000..5057e87e3 --- /dev/null +++ b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005501/location/prt_24772_locations.json @@ -0,0 +1,409 @@ +{ + "features":[ + { + "AngNedZaxs":"NA", + "AngPtch":"0", + "asset_manufacturer":"Thermometrics", + "asset_model":"R000-00000011", + "asset_software_version":null, + "Cal$PrdLab":"one time before installation", + "Data Rate":"0.1", + "DistZaxsLvlMeasSoil":"-0.025", + "FreqSamp":"0.1", + "geometry":null, + "HOR":"005", + "location":"plot5", + "properties":{ + "context":[ + + ], + "domain":"D07", + "install_date":"2025-10-18T00:00:00Z", + "locations":{ + "features":[ + { + "geometry":null, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-19T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "State province", + "TN" + ], + [ + "UTM Zone", + "17N" + ] + ], + "reference_location":{ + "geometry":null, + "properties":{ + "locations":{ + "features":[ + { + "geometry":{ + "coordinates":[ + [ + -83.50135, + 35.6892, + 576.39 + ], + [ + -83.5014028, + 35.6892, + 575.2 + ], + [ + -83.5014028, + 35.6892444, + 575.2 + ], + [ + -83.5013472, + 35.6892444, + 576.39 + ], + [ + -83.50135, + 35.6892, + 576.39 + ] + ], + "type":"Polygon" + }, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-19T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "AngAzXaxsRefeSoil", + "C4" + ], + [ + "AngAzYaxsRefeSoil", + "C2" + ], + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "ElevSoilC1", + "576.39" + ], + [ + "ElevSoilC2", + "575.20" + ], + [ + "ElevSoilC3", + "575.20" + ], + [ + "ElevSoilC4", + "576.39" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "LatSoilC1", + "35.6892000" + ], + [ + "LatSoilC2", + "35.6892000" + ], + [ + "LatSoilC3", + "35.6892444" + ], + [ + "LatSoilC4", + "35.6892444" + ], + [ + "locDisturb", + "1.32,2.3,NA and 0.160,3.175,NA and 0.160,2.725,NA and 1.720,3.175,NA and 1.72,2.725,NA" + ], + [ + "LonSoilC1", + "-83.5013500" + ], + [ + "LonSoilC2", + "-83.5014028" + ], + [ + "LonSoilC3", + "-83.5014028" + ], + [ + "LonSoilC4", + "-83.5013472" + ], + [ + "Orientation Number", + "2" + ], + [ + "RefeSoil", + "C1" + ], + [ + "Required Asset Management Location Code", + "SOILPL105351" + ], + [ + "State province", + "TN" + ], + [ + "UTM Zone", + "17N" + ], + [ + "x Azimuth Angle", + 3 + ], + [ + "y Azimuth Angle", + 270 + ] + ], + "reference_location":null, + "start_date":"2025-10-18T00:00:00Z", + "x_offset": 0, + "y_offset": 0, + "z_offset": 0 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + }, + "name":"SOILPL105351" + }, + "type":"Feature" + }, + "start_date":"2025-10-18T00:00:00Z", + "x_offset": 1.285, + "y_offset": 2.975, + "z_offset": -0.005 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + }, + "name":"CFGLOC105363", + "remove_date":"2025-10-19T00:00:00Z", + "site":"GRSM", + "site_location":{ + "features":[ + { + "geometry":{ + "coordinates":[ + -83.50195, + 35.68896, + 575.396725 + ], + "type":"Point" + }, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-19T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "AERONET_XREF", + "NEON_GRSM" + ], + [ + "AngAzWindPrim", + "140-320" + ], + [ + "AngAzWindScnd", + "NA" + ], + [ + "AngAzWindTrty", + "NA" + ], + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "DEIMS-SDR Site ID", + "https://deims.org/30f887c3-135b-41e8-9f44-9b084ce2b3bd" + ], + [ + "DistZaxsCnpy", + "31" + ], + [ + "DistZaxsDisp", + "20.2" + ], + [ + "Dom", + "D07" + ], + [ + "DURATION", + "Gradient" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "HABITAT", + "Terrestrial" + ], + [ + "IS Processing Default Start Date", + "2017-08-20T00:00:00Z" + ], + [ + "NEONSCI_FIELD_SITE_URL_PATH", + "great-smoky-mountains-national-park-twin-creeks" + ], + [ + "Pf$AngEnuXaxs", + "NA" + ], + [ + "Pf$AngEnuYaxs", + "NA" + ], + [ + "Pf$Ofst", + "NA" + ], + [ + "PrdDcmpMax", + "3" + ], + [ + "PrdIncrAgrDcmp", + "1" + ], + [ + "PrdIncrCalc", + "1" + ], + [ + "PrdIncrPf", + "1" + ], + [ + "PrdWndwAgrDcmp", + "5" + ], + [ + "PrdWndwCalc", + "3" + ], + [ + "PrdWndwPf", + "9" + ], + [ + "PresAtmSite", + "93630" + ], + [ + "Private", + "FALSE" + ], + [ + "Read", + "HDF5" + ], + [ + "Required Asset Management Location Code", + "GRSM" + ], + [ + "Site Timezone", + "US/Eastern" + ], + [ + "State Abbreviation", + "TN" + ], + [ + "State province", + "TN" + ], + [ + "TypeEco", + "Hardwood deciduous forest dominated by oaks and maples" + ], + [ + "TypeSoil", + "Spivey-Santeetlah-Nowhere complex, 8 to 15 percent slopes" + ], + [ + "UTM Zone", + "17N" + ], + [ + "ZoneTime", + "EST" + ] + ], + "reference_location":null, + "start_date":"2025-10-18T00:00:00Z", + "x_offset": 0, + "y_offset": 0, + "z_offset": 0 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + } + }, + "Required Asset Management Location Code":"CFGLOC105363", + "subLocation":"depth1", + "subSystem":"temp-profile", + "system":"soil", + "type":"Feature", + "VER":"501" + } + ], + "source_id": 24772, + "source_type":"prt", + "type":"FeatureCollection" +} diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005501/location/prt_24773_locations.json b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005501/location/prt_24773_locations.json new file mode 100644 index 000000000..08b566fa0 --- /dev/null +++ b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005501/location/prt_24773_locations.json @@ -0,0 +1,409 @@ +{ + "features":[ + { + "AngNedZaxs":"NA", + "AngPtch":"0", + "asset_manufacturer":"Thermometrics", + "asset_model":"R000-00000011", + "asset_software_version":null, + "Cal$PrdLab":"one time before installation", + "Data Rate":"0.1", + "DistZaxsLvlMeasSoil":"-0.025", + "FreqSamp":"0.1", + "geometry":null, + "HOR":"005", + "location":"plot5", + "properties":{ + "context":[ + + ], + "domain":"D07", + "install_date":"2025-10-18T00:00:00Z", + "locations":{ + "features":[ + { + "geometry":null, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-19T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "State province", + "TN" + ], + [ + "UTM Zone", + "17N" + ] + ], + "reference_location":{ + "geometry":null, + "properties":{ + "locations":{ + "features":[ + { + "geometry":{ + "coordinates":[ + [ + -83.50135, + 35.6892, + 576.39 + ], + [ + -83.5014028, + 35.6892, + 575.2 + ], + [ + -83.5014028, + 35.6892444, + 575.2 + ], + [ + -83.5013472, + 35.6892444, + 576.39 + ], + [ + -83.50135, + 35.6892, + 576.39 + ] + ], + "type":"Polygon" + }, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-19T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "AngAzXaxsRefeSoil", + "C4" + ], + [ + "AngAzYaxsRefeSoil", + "C2" + ], + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "ElevSoilC1", + "576.39" + ], + [ + "ElevSoilC2", + "575.20" + ], + [ + "ElevSoilC3", + "575.20" + ], + [ + "ElevSoilC4", + "576.39" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "LatSoilC1", + "35.6892000" + ], + [ + "LatSoilC2", + "35.6892000" + ], + [ + "LatSoilC3", + "35.6892444" + ], + [ + "LatSoilC4", + "35.6892444" + ], + [ + "locDisturb", + "1.32,2.3,NA and 0.160,3.175,NA and 0.160,2.725,NA and 1.720,3.175,NA and 1.72,2.725,NA" + ], + [ + "LonSoilC1", + "-83.5013500" + ], + [ + "LonSoilC2", + "-83.5014028" + ], + [ + "LonSoilC3", + "-83.5014028" + ], + [ + "LonSoilC4", + "-83.5013472" + ], + [ + "Orientation Number", + "2" + ], + [ + "RefeSoil", + "C1" + ], + [ + "Required Asset Management Location Code", + "SOILPL105351" + ], + [ + "State province", + "TN" + ], + [ + "UTM Zone", + "17N" + ], + [ + "x Azimuth Angle", + 3 + ], + [ + "y Azimuth Angle", + 270 + ] + ], + "reference_location":null, + "start_date":"2025-10-18T00:00:00Z", + "x_offset": 0, + "y_offset": 0, + "z_offset": 0 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + }, + "name":"SOILPL105351" + }, + "type":"Feature" + }, + "start_date":"2025-10-18T00:00:00Z", + "x_offset": 1.285, + "y_offset": 2.975, + "z_offset": -0.009 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + }, + "name":"CFGLOC105363", + "remove_date":"2025-10-19T00:00:00Z", + "site":"GRSM", + "site_location":{ + "features":[ + { + "geometry":{ + "coordinates":[ + -83.50195, + 35.68896, + 575.396725 + ], + "type":"Point" + }, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-19T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "AERONET_XREF", + "NEON_GRSM" + ], + [ + "AngAzWindPrim", + "140-320" + ], + [ + "AngAzWindScnd", + "NA" + ], + [ + "AngAzWindTrty", + "NA" + ], + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "DEIMS-SDR Site ID", + "https://deims.org/30f887c3-135b-41e8-9f44-9b084ce2b3bd" + ], + [ + "DistZaxsCnpy", + "31" + ], + [ + "DistZaxsDisp", + "20.2" + ], + [ + "Dom", + "D07" + ], + [ + "DURATION", + "Gradient" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "HABITAT", + "Terrestrial" + ], + [ + "IS Processing Default Start Date", + "2017-08-20T00:00:00Z" + ], + [ + "NEONSCI_FIELD_SITE_URL_PATH", + "great-smoky-mountains-national-park-twin-creeks" + ], + [ + "Pf$AngEnuXaxs", + "NA" + ], + [ + "Pf$AngEnuYaxs", + "NA" + ], + [ + "Pf$Ofst", + "NA" + ], + [ + "PrdDcmpMax", + "3" + ], + [ + "PrdIncrAgrDcmp", + "1" + ], + [ + "PrdIncrCalc", + "1" + ], + [ + "PrdIncrPf", + "1" + ], + [ + "PrdWndwAgrDcmp", + "5" + ], + [ + "PrdWndwCalc", + "3" + ], + [ + "PrdWndwPf", + "9" + ], + [ + "PresAtmSite", + "93630" + ], + [ + "Private", + "FALSE" + ], + [ + "Read", + "HDF5" + ], + [ + "Required Asset Management Location Code", + "GRSM" + ], + [ + "Site Timezone", + "US/Eastern" + ], + [ + "State Abbreviation", + "TN" + ], + [ + "State province", + "TN" + ], + [ + "TypeEco", + "Hardwood deciduous forest dominated by oaks and maples" + ], + [ + "TypeSoil", + "Spivey-Santeetlah-Nowhere complex, 8 to 15 percent slopes" + ], + [ + "UTM Zone", + "17N" + ], + [ + "ZoneTime", + "EST" + ] + ], + "reference_location":null, + "start_date":"2025-10-18T00:00:00Z", + "x_offset": 0, + "y_offset": 0, + "z_offset": 0 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + } + }, + "Required Asset Management Location Code":"CFGLOC105363", + "subLocation":"depth1", + "subSystem":"temp-profile", + "system":"soil", + "type":"Feature", + "VER":"501" + } + ], + "source_id": 24772, + "source_type":"prt", + "type":"FeatureCollection" +} diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005502/data/temp-soil_GRSM005502_2025-10-18_ST_1_minute_001.parquet b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005502/data/temp-soil_GRSM005502_2025-10-18_ST_1_minute_001.parquet new file mode 100644 index 000000000..fa4c3d7b1 Binary files /dev/null and b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005502/data/temp-soil_GRSM005502_2025-10-18_ST_1_minute_001.parquet differ diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005502/data/temp-soil_GRSM005502_2025-10-18_ST_30_minute_030.parquet b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005502/data/temp-soil_GRSM005502_2025-10-18_ST_30_minute_030.parquet new file mode 100644 index 000000000..9b544ae69 Binary files /dev/null and b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005502/data/temp-soil_GRSM005502_2025-10-18_ST_30_minute_030.parquet differ diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005502/location/CFGLOC105365.json b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005502/location/CFGLOC105365.json new file mode 100644 index 000000000..37cf4e86d --- /dev/null +++ b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005502/location/CFGLOC105365.json @@ -0,0 +1,39 @@ +{ + "features":[ + { + "AngNedZaxs":"NA", + "AngPtch":"0", + "Cal$PrdLab":"one time before installation", + "Data Rate":"0.1", + "DistZaxsLvlMeasSoil":"-0.065", + "FreqSamp":"0.1", + "HOR":"005", + "IS Processing Default Start Date":"2017-08-20T00:00:00Z", + "Required Asset Management Location Code":"CFGLOC105365", + "VER":"502", + "geometry":null, + "location":"plot5", + "properties":{ + "active_periods":[ + { + "start_date":"2025-10-18T00:00:00Z", + "end_date":"2025-10-19T00:00:00Z" + } + ], + "context":[ + + ], + "description":"Great Smoky Mountains Soil Temp Profile SP5, Z2 Depth", + "domain":"D07", + "name":"CFGLOC105365", + "site":"GRSM", + "type":"CONFIG" + }, + "subLocation":"depth2", + "subSystem":"temp-profile", + "system":"soil", + "type":"Feature" + } + ], + "type":"FeatureCollection" +} diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005502/location/prt_18574_locations.json b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005502/location/prt_18574_locations.json new file mode 100644 index 000000000..9842f91dc --- /dev/null +++ b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005502/location/prt_18574_locations.json @@ -0,0 +1,409 @@ +{ + "features":[ + { + "AngNedZaxs":"NA", + "AngPtch":"0", + "asset_manufacturer":"Thermometrics", + "asset_model":"R000-00000011", + "asset_software_version":null, + "Cal$PrdLab":"one time before installation", + "Data Rate":"0.1", + "DistZaxsLvlMeasSoil":"-0.065", + "FreqSamp":"0.1", + "geometry":null, + "HOR":"005", + "location":"plot5", + "properties":{ + "context":[ + + ], + "domain":"D07", + "install_date":"2025-10-18T00:00:00Z", + "locations":{ + "features":[ + { + "geometry":null, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-19T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "State province", + "TN" + ], + [ + "UTM Zone", + "17N" + ] + ], + "reference_location":{ + "geometry":null, + "properties":{ + "locations":{ + "features":[ + { + "geometry":{ + "coordinates":[ + [ + -83.50135, + 35.6892, + 576.39 + ], + [ + -83.5014028, + 35.6892, + 575.2 + ], + [ + -83.5014028, + 35.6892444, + 575.2 + ], + [ + -83.5013472, + 35.6892444, + 576.39 + ], + [ + -83.50135, + 35.6892, + 576.39 + ] + ], + "type":"Polygon" + }, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-19T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "AngAzXaxsRefeSoil", + "C4" + ], + [ + "AngAzYaxsRefeSoil", + "C2" + ], + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "ElevSoilC1", + "576.39" + ], + [ + "ElevSoilC2", + "575.20" + ], + [ + "ElevSoilC3", + "575.20" + ], + [ + "ElevSoilC4", + "576.39" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "LatSoilC1", + "35.6892000" + ], + [ + "LatSoilC2", + "35.6892000" + ], + [ + "LatSoilC3", + "35.6892444" + ], + [ + "LatSoilC4", + "35.6892444" + ], + [ + "locDisturb", + "1.32,2.3,NA and 0.160,3.175,NA and 0.160,2.725,NA and 1.720,3.175,NA and 1.72,2.725,NA" + ], + [ + "LonSoilC1", + "-83.5013500" + ], + [ + "LonSoilC2", + "-83.5014028" + ], + [ + "LonSoilC3", + "-83.5014028" + ], + [ + "LonSoilC4", + "-83.5013472" + ], + [ + "Orientation Number", + "2" + ], + [ + "RefeSoil", + "C1" + ], + [ + "Required Asset Management Location Code", + "SOILPL105351" + ], + [ + "State province", + "TN" + ], + [ + "UTM Zone", + "17N" + ], + [ + "x Azimuth Angle", + 3 + ], + [ + "y Azimuth Angle", + 270 + ] + ], + "reference_location":null, + "start_date":"2025-10-18T00:00:00Z", + "x_offset": 0, + "y_offset": 0, + "z_offset": 0 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + }, + "name":"SOILPL105351" + }, + "type":"Feature" + }, + "start_date":"2025-10-18T00:00:00Z", + "x_offset": 1.285, + "y_offset": 2.975, + "z_offset": -0.065 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + }, + "name":"CFGLOC105365", + "remove_date":"2025-10-19T00:00:00Z", + "site":"GRSM", + "site_location":{ + "features":[ + { + "geometry":{ + "coordinates":[ + -83.50195, + 35.68896, + 575.396725 + ], + "type":"Point" + }, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-19T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "AERONET_XREF", + "NEON_GRSM" + ], + [ + "AngAzWindPrim", + "140-320" + ], + [ + "AngAzWindScnd", + "NA" + ], + [ + "AngAzWindTrty", + "NA" + ], + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "DEIMS-SDR Site ID", + "https://deims.org/30f887c3-135b-41e8-9f44-9b084ce2b3bd" + ], + [ + "DistZaxsCnpy", + "31" + ], + [ + "DistZaxsDisp", + "20.2" + ], + [ + "Dom", + "D07" + ], + [ + "DURATION", + "Gradient" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "HABITAT", + "Terrestrial" + ], + [ + "IS Processing Default Start Date", + "2017-08-20T00:00:00Z" + ], + [ + "NEONSCI_FIELD_SITE_URL_PATH", + "great-smoky-mountains-national-park-twin-creeks" + ], + [ + "Pf$AngEnuXaxs", + "NA" + ], + [ + "Pf$AngEnuYaxs", + "NA" + ], + [ + "Pf$Ofst", + "NA" + ], + [ + "PrdDcmpMax", + "3" + ], + [ + "PrdIncrAgrDcmp", + "1" + ], + [ + "PrdIncrCalc", + "1" + ], + [ + "PrdIncrPf", + "1" + ], + [ + "PrdWndwAgrDcmp", + "5" + ], + [ + "PrdWndwCalc", + "3" + ], + [ + "PrdWndwPf", + "9" + ], + [ + "PresAtmSite", + "93630" + ], + [ + "Private", + "FALSE" + ], + [ + "Read", + "HDF5" + ], + [ + "Required Asset Management Location Code", + "GRSM" + ], + [ + "Site Timezone", + "US/Eastern" + ], + [ + "State Abbreviation", + "TN" + ], + [ + "State province", + "TN" + ], + [ + "TypeEco", + "Hardwood deciduous forest dominated by oaks and maples" + ], + [ + "TypeSoil", + "Spivey-Santeetlah-Nowhere complex, 8 to 15 percent slopes" + ], + [ + "UTM Zone", + "17N" + ], + [ + "ZoneTime", + "EST" + ] + ], + "reference_location":null, + "start_date":"2025-10-18T00:00:00Z", + "x_offset": 0, + "y_offset": 0, + "z_offset": 0 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + } + }, + "Required Asset Management Location Code":"CFGLOC105365", + "subLocation":"depth2", + "subSystem":"temp-profile", + "system":"soil", + "type":"Feature", + "VER":"502" + } + ], + "source_id": 18574, + "source_type":"prt", + "type":"FeatureCollection" +} diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/data/temp-soil_GRSM005503_2025-10-18_ST_1_minute_001.parquet b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/data/temp-soil_GRSM005503_2025-10-18_ST_1_minute_001.parquet new file mode 100644 index 000000000..8c7b32398 Binary files /dev/null and b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/data/temp-soil_GRSM005503_2025-10-18_ST_1_minute_001.parquet differ diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/data/temp-soil_GRSM005503_2025-10-18_ST_30_minute_030.parquet b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/data/temp-soil_GRSM005503_2025-10-18_ST_30_minute_030.parquet new file mode 100644 index 000000000..934804e95 Binary files /dev/null and b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/data/temp-soil_GRSM005503_2025-10-18_ST_30_minute_030.parquet differ diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/location/CFGLOC105367.json b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/location/CFGLOC105367.json new file mode 100644 index 000000000..749748023 --- /dev/null +++ b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/location/CFGLOC105367.json @@ -0,0 +1,39 @@ +{ + "features":[ + { + "AngNedZaxs":"NA", + "AngPtch":"0", + "Cal$PrdLab":"one time before installation", + "Data Rate":"0.1", + "DistZaxsLvlMeasSoil":"-0.165", + "FreqSamp":"0.1", + "HOR":"005", + "IS Processing Default Start Date":"2017-08-20T00:00:00Z", + "Required Asset Management Location Code":"CFGLOC105367", + "VER":"503", + "geometry":null, + "location":"plot5", + "properties":{ + "active_periods":[ + { + "start_date":"2025-10-18T00:00:00Z", + "end_date":"2025-10-19T00:00:00Z" + } + ], + "context":[ + + ], + "description":"Great Smoky Mountains Soil Temp Profile SP5, Z3 Depth", + "domain":"D07", + "name":"CFGLOC105367", + "site":"GRSM", + "type":"CONFIG" + }, + "subLocation":"depth3", + "subSystem":"temp-profile", + "system":"soil", + "type":"Feature" + } + ], + "type":"FeatureCollection" +} diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/location/prt_20057_locations.json b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/location/prt_20057_locations.json new file mode 100644 index 000000000..bdad30f8c --- /dev/null +++ b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/location/prt_20057_locations.json @@ -0,0 +1,409 @@ +{ + "features":[ + { + "AngNedZaxs":"NA", + "AngPtch":"0", + "asset_manufacturer":"Thermometrics", + "asset_model":"R000-00000011", + "asset_software_version":null, + "Cal$PrdLab":"one time before installation", + "Data Rate":"0.1", + "DistZaxsLvlMeasSoil":"-0.165", + "FreqSamp":"0.1", + "geometry":null, + "HOR":"005", + "location":"plot5", + "properties":{ + "context":[ + + ], + "domain":"D07", + "install_date":"2025-10-18T00:00:00Z", + "locations":{ + "features":[ + { + "geometry":null, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-19T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "State province", + "TN" + ], + [ + "UTM Zone", + "17N" + ] + ], + "reference_location":{ + "geometry":null, + "properties":{ + "locations":{ + "features":[ + { + "geometry":{ + "coordinates":[ + [ + -83.50135, + 35.6892, + 576.39 + ], + [ + -83.5014028, + 35.6892, + 575.2 + ], + [ + -83.5014028, + 35.6892444, + 575.2 + ], + [ + -83.5013472, + 35.6892444, + 576.39 + ], + [ + -83.50135, + 35.6892, + 576.39 + ] + ], + "type":"Polygon" + }, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-19T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "AngAzXaxsRefeSoil", + "C4" + ], + [ + "AngAzYaxsRefeSoil", + "C2" + ], + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "ElevSoilC1", + "576.39" + ], + [ + "ElevSoilC2", + "575.20" + ], + [ + "ElevSoilC3", + "575.20" + ], + [ + "ElevSoilC4", + "576.39" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "LatSoilC1", + "35.6892000" + ], + [ + "LatSoilC2", + "35.6892000" + ], + [ + "LatSoilC3", + "35.6892444" + ], + [ + "LatSoilC4", + "35.6892444" + ], + [ + "locDisturb", + "1.32,2.3,NA and 0.160,3.175,NA and 0.160,2.725,NA and 1.720,3.175,NA and 1.72,2.725,NA" + ], + [ + "LonSoilC1", + "-83.5013500" + ], + [ + "LonSoilC2", + "-83.5014028" + ], + [ + "LonSoilC3", + "-83.5014028" + ], + [ + "LonSoilC4", + "-83.5013472" + ], + [ + "Orientation Number", + "2" + ], + [ + "RefeSoil", + "C1" + ], + [ + "Required Asset Management Location Code", + "SOILPL105351" + ], + [ + "State province", + "TN" + ], + [ + "UTM Zone", + "17N" + ], + [ + "x Azimuth Angle", + 3 + ], + [ + "y Azimuth Angle", + 270 + ] + ], + "reference_location":null, + "start_date":"2025-10-18T00:00:00Z", + "x_offset": 0, + "y_offset": 0, + "z_offset": 0 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + }, + "name":"SOILPL105351" + }, + "type":"Feature" + }, + "start_date":"2025-10-18T00:00:00Z", + "x_offset": 1.285, + "y_offset": 2.975, + "z_offset": -0.165 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + }, + "name":"CFGLOC105367", + "remove_date":"2025-10-19T00:00:00Z", + "site":"GRSM", + "site_location":{ + "features":[ + { + "geometry":{ + "coordinates":[ + -83.50195, + 35.68896, + 575.396725 + ], + "type":"Point" + }, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-19T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "AERONET_XREF", + "NEON_GRSM" + ], + [ + "AngAzWindPrim", + "140-320" + ], + [ + "AngAzWindScnd", + "NA" + ], + [ + "AngAzWindTrty", + "NA" + ], + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "DEIMS-SDR Site ID", + "https://deims.org/30f887c3-135b-41e8-9f44-9b084ce2b3bd" + ], + [ + "DistZaxsCnpy", + "31" + ], + [ + "DistZaxsDisp", + "20.2" + ], + [ + "Dom", + "D07" + ], + [ + "DURATION", + "Gradient" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "HABITAT", + "Terrestrial" + ], + [ + "IS Processing Default Start Date", + "2017-08-20T00:00:00Z" + ], + [ + "NEONSCI_FIELD_SITE_URL_PATH", + "great-smoky-mountains-national-park-twin-creeks" + ], + [ + "Pf$AngEnuXaxs", + "NA" + ], + [ + "Pf$AngEnuYaxs", + "NA" + ], + [ + "Pf$Ofst", + "NA" + ], + [ + "PrdDcmpMax", + "3" + ], + [ + "PrdIncrAgrDcmp", + "1" + ], + [ + "PrdIncrCalc", + "1" + ], + [ + "PrdIncrPf", + "1" + ], + [ + "PrdWndwAgrDcmp", + "5" + ], + [ + "PrdWndwCalc", + "3" + ], + [ + "PrdWndwPf", + "9" + ], + [ + "PresAtmSite", + "93630" + ], + [ + "Private", + "FALSE" + ], + [ + "Read", + "HDF5" + ], + [ + "Required Asset Management Location Code", + "GRSM" + ], + [ + "Site Timezone", + "US/Eastern" + ], + [ + "State Abbreviation", + "TN" + ], + [ + "State province", + "TN" + ], + [ + "TypeEco", + "Hardwood deciduous forest dominated by oaks and maples" + ], + [ + "TypeSoil", + "Spivey-Santeetlah-Nowhere complex, 8 to 15 percent slopes" + ], + [ + "UTM Zone", + "17N" + ], + [ + "ZoneTime", + "EST" + ] + ], + "reference_location":null, + "start_date":"2025-10-18T00:00:00Z", + "x_offset": 0, + "y_offset": 0, + "z_offset": 0 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + } + }, + "Required Asset Management Location Code":"CFGLOC105367", + "subLocation":"depth3", + "subSystem":"temp-profile", + "system":"soil", + "type":"Feature", + "VER":"503" + } + ], + "source_id": 20057, + "source_type":"prt", + "type":"FeatureCollection" +} diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_locations/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/data/temp-soil_GRSM005503_2025-10-17_ST_1_minute_001.parquet b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_locations/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/data/temp-soil_GRSM005503_2025-10-17_ST_1_minute_001.parquet new file mode 100644 index 000000000..13081052e Binary files /dev/null and b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_locations/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/data/temp-soil_GRSM005503_2025-10-17_ST_1_minute_001.parquet differ diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_locations/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/data/temp-soil_GRSM005503_2025-10-17_ST_30_minute_030.parquet b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_locations/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/data/temp-soil_GRSM005503_2025-10-17_ST_30_minute_030.parquet new file mode 100644 index 000000000..b350d7dcc Binary files /dev/null and b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_locations/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/data/temp-soil_GRSM005503_2025-10-17_ST_30_minute_030.parquet differ diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_locations/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005504/data/temp-soil_GRSM005504_2025-10-17_ST_1_minute_001.parquet b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_locations/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005504/data/temp-soil_GRSM005504_2025-10-17_ST_1_minute_001.parquet new file mode 100644 index 000000000..990cf8175 Binary files /dev/null and b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_locations/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005504/data/temp-soil_GRSM005504_2025-10-17_ST_1_minute_001.parquet differ diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_locations/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005504/data/temp-soil_GRSM005504_2025-10-17_ST_30_minute_030.parquet b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_locations/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005504/data/temp-soil_GRSM005504_2025-10-17_ST_30_minute_030.parquet new file mode 100644 index 000000000..07e0b6ebe Binary files /dev/null and b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_locations/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005504/data/temp-soil_GRSM005504_2025-10-17_ST_30_minute_030.parquet differ diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_z_offset/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/data/temp-soil_GRSM005503_2025-10-17_ST_1_minute_001.parquet b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_z_offset/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/data/temp-soil_GRSM005503_2025-10-17_ST_1_minute_001.parquet new file mode 100644 index 000000000..13081052e Binary files /dev/null and b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_z_offset/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/data/temp-soil_GRSM005503_2025-10-17_ST_1_minute_001.parquet differ diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_z_offset/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/location/CFGLOC105367.json b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_z_offset/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/location/CFGLOC105367.json new file mode 100644 index 000000000..c2c02e79d --- /dev/null +++ b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_z_offset/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/location/CFGLOC105367.json @@ -0,0 +1,39 @@ +{ + "features":[ + { + "AngNedZaxs":"NA", + "AngPtch":"0", + "Cal$PrdLab":"one time before installation", + "Data Rate":"0.1", + "DistZaxsLvlMeasSoil":"-0.165", + "FreqSamp":"0.1", + "HOR":"005", + "IS Processing Default Start Date":"2017-08-20T00:00:00Z", + "Required Asset Management Location Code":"CFGLOC105367", + "VER":"503", + "geometry":null, + "location":"plot5", + "properties":{ + "active_periods":[ + { + "start_date":"2025-10-17T00:00:00Z", + "end_date":"2025-10-18T00:00:00Z" + } + ], + "context":[ + + ], + "description":"Great Smoky Mountains Soil Temp Profile SP5, Z3 Depth", + "domain":"D07", + "name":"CFGLOC105367", + "site":"GRSM", + "type":"CONFIG" + }, + "subLocation":"depth3", + "subSystem":"temp-profile", + "system":"soil", + "type":"Feature" + } + ], + "type":"FeatureCollection" +} diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_z_offset/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/location/prt_20057_locations.json b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_z_offset/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/location/prt_20057_locations.json new file mode 100644 index 000000000..8a391859c --- /dev/null +++ b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_z_offset/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005503/location/prt_20057_locations.json @@ -0,0 +1,409 @@ +{ + "features":[ + { + "AngNedZaxs":"NA", + "AngPtch":"0", + "asset_manufacturer":"Thermometrics", + "asset_model":"R000-00000011", + "asset_software_version":null, + "Cal$PrdLab":"one time before installation", + "Data Rate":"0.1", + "DistZaxsLvlMeasSoil":"-0.165", + "FreqSamp":"0.1", + "geometry":null, + "HOR":"005", + "location":"plot5", + "properties":{ + "context":[ + + ], + "domain":"D07", + "install_date":"2025-10-17T00:00:00Z", + "locations":{ + "features":[ + { + "geometry":null, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-18T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "State province", + "TN" + ], + [ + "UTM Zone", + "17N" + ] + ], + "reference_location":{ + "geometry":null, + "properties":{ + "locations":{ + "features":[ + { + "geometry":{ + "coordinates":[ + [ + -83.50135, + 35.6892, + 576.39 + ], + [ + -83.5014028, + 35.6892, + 575.2 + ], + [ + -83.5014028, + 35.6892444, + 575.2 + ], + [ + -83.5013472, + 35.6892444, + 576.39 + ], + [ + -83.50135, + 35.6892, + 576.39 + ] + ], + "type":"Polygon" + }, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-18T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "AngAzXaxsRefeSoil", + "C4" + ], + [ + "AngAzYaxsRefeSoil", + "C2" + ], + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "ElevSoilC1", + "576.39" + ], + [ + "ElevSoilC2", + "575.20" + ], + [ + "ElevSoilC3", + "575.20" + ], + [ + "ElevSoilC4", + "576.39" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "LatSoilC1", + "35.6892000" + ], + [ + "LatSoilC2", + "35.6892000" + ], + [ + "LatSoilC3", + "35.6892444" + ], + [ + "LatSoilC4", + "35.6892444" + ], + [ + "locDisturb", + "1.32,2.3,NA and 0.160,3.175,NA and 0.160,2.725,NA and 1.720,3.175,NA and 1.72,2.725,NA" + ], + [ + "LonSoilC1", + "-83.5013500" + ], + [ + "LonSoilC2", + "-83.5014028" + ], + [ + "LonSoilC3", + "-83.5014028" + ], + [ + "LonSoilC4", + "-83.5013472" + ], + [ + "Orientation Number", + "2" + ], + [ + "RefeSoil", + "C1" + ], + [ + "Required Asset Management Location Code", + "SOILPL105351" + ], + [ + "State province", + "TN" + ], + [ + "UTM Zone", + "17N" + ], + [ + "x Azimuth Angle", + 3 + ], + [ + "y Azimuth Angle", + 270 + ] + ], + "reference_location":null, + "start_date":"2025-10-17T00:00:00Z", + "x_offset": 0, + "y_offset": 0, + "z_offset": 0 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + }, + "name":"SOILPL105351" + }, + "type":"Feature" + }, + "start_date":"2025-10-17T00:00:00Z", + "x_offset": 1.285, + "y_offset": 2.975, + "z_offset": -0.165 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + }, + "name":"CFGLOC105367", + "remove_date":"2025-10-18T00:00:00Z", + "site":"GRSM", + "site_location":{ + "features":[ + { + "geometry":{ + "coordinates":[ + -83.50195, + 35.68896, + 575.396725 + ], + "type":"Point" + }, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-18T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "AERONET_XREF", + "NEON_GRSM" + ], + [ + "AngAzWindPrim", + "140-320" + ], + [ + "AngAzWindScnd", + "NA" + ], + [ + "AngAzWindTrty", + "NA" + ], + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "DEIMS-SDR Site ID", + "https://deims.org/30f887c3-135b-41e8-9f44-9b084ce2b3bd" + ], + [ + "DistZaxsCnpy", + "31" + ], + [ + "DistZaxsDisp", + "20.2" + ], + [ + "Dom", + "D07" + ], + [ + "DURATION", + "Gradient" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "HABITAT", + "Terrestrial" + ], + [ + "IS Processing Default Start Date", + "2017-08-20T00:00:00Z" + ], + [ + "NEONSCI_FIELD_SITE_URL_PATH", + "great-smoky-mountains-national-park-twin-creeks" + ], + [ + "Pf$AngEnuXaxs", + "NA" + ], + [ + "Pf$AngEnuYaxs", + "NA" + ], + [ + "Pf$Ofst", + "NA" + ], + [ + "PrdDcmpMax", + "3" + ], + [ + "PrdIncrAgrDcmp", + "1" + ], + [ + "PrdIncrCalc", + "1" + ], + [ + "PrdIncrPf", + "1" + ], + [ + "PrdWndwAgrDcmp", + "5" + ], + [ + "PrdWndwCalc", + "3" + ], + [ + "PrdWndwPf", + "9" + ], + [ + "PresAtmSite", + "93630" + ], + [ + "Private", + "FALSE" + ], + [ + "Read", + "HDF5" + ], + [ + "Required Asset Management Location Code", + "GRSM" + ], + [ + "Site Timezone", + "US/Eastern" + ], + [ + "State Abbreviation", + "TN" + ], + [ + "State province", + "TN" + ], + [ + "TypeEco", + "Hardwood deciduous forest dominated by oaks and maples" + ], + [ + "TypeSoil", + "Spivey-Santeetlah-Nowhere complex, 8 to 15 percent slopes" + ], + [ + "UTM Zone", + "17N" + ], + [ + "ZoneTime", + "EST" + ] + ], + "reference_location":null, + "start_date":"2025-10-17T00:00:00Z", + "x_offset": 0, + "y_offset": 0, + "z_offset": 0 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + } + }, + "Required Asset Management Location Code":"CFGLOC105367", + "subLocation":"depth3", + "subSystem":"temp-profile", + "system":"soil", + "type":"Feature", + "VER":"503" + } + ], + "source_id": 20057, + "source_type":"prt", + "type":"FeatureCollection" +} diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_z_offset/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005504/data/temp-soil_GRSM005504_2025-10-17_ST_1_minute_001.parquet b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_z_offset/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005504/data/temp-soil_GRSM005504_2025-10-17_ST_1_minute_001.parquet new file mode 100644 index 000000000..990cf8175 Binary files /dev/null and b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_z_offset/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005504/data/temp-soil_GRSM005504_2025-10-17_ST_1_minute_001.parquet differ diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_z_offset/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005504/location/CFGLOC105369.json b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_z_offset/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005504/location/CFGLOC105369.json new file mode 100644 index 000000000..ffef1dd05 --- /dev/null +++ b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_z_offset/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005504/location/CFGLOC105369.json @@ -0,0 +1,39 @@ +{ + "features":[ + { + "AngNedZaxs":"NA", + "AngPtch":"0", + "Cal$PrdLab":"one time before installation", + "Data Rate":"0.1", + "DistZaxsLvlMeasSoil":"-0.265", + "FreqSamp":"0.1", + "HOR":"005", + "IS Processing Default Start Date":"2017-08-20T00:00:00Z", + "Required Asset Management Location Code":"CFGLOC105369", + "VER":"504", + "geometry":null, + "location":"plot5", + "properties":{ + "active_periods":[ + { + "start_date":"2025-10-17T00:00:00Z", + "end_date":"2025-10-18T00:00:00Z" + } + ], + "context":[ + + ], + "description":"Great Smoky Mountains Soil Temp Profile SP5, Z4 Depth", + "domain":"D07", + "name":"CFGLOC105369", + "site":"GRSM", + "type":"CONFIG" + }, + "subLocation":"depth4", + "subSystem":"temp-profile", + "system":"soil", + "type":"Feature" + } + ], + "type":"FeatureCollection" +} diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_z_offset/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005504/location/prt_20037_locations.json b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_z_offset/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005504/location/prt_20037_locations.json new file mode 100644 index 000000000..8355c31c6 --- /dev/null +++ b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_z_offset/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005504/location/prt_20037_locations.json @@ -0,0 +1,407 @@ +{ + "features":[ + { + "AngNedZaxs":"NA", + "AngPtch":"0", + "asset_manufacturer":"Thermometrics", + "asset_model":"R000-00000011", + "asset_software_version":null, + "Cal$PrdLab":"one time before installation", + "Data Rate":"0.1", + "DistZaxsLvlMeasSoil":"-0.265", + "FreqSamp":"0.1", + "geometry":null, + "HOR":"005", + "location":"plot5", + "properties":{ + "context":[ + + ], + "domain":"D07", + "install_date":"2025-10-17T00:00:00Z", + "locations":{ + "features":[ + { + "geometry":null, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-18T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "State province", + "TN" + ], + [ + "UTM Zone", + "17N" + ] + ], + "reference_location":{ + "geometry":null, + "properties":{ + "locations":{ + "features":[ + { + "geometry":{ + "coordinates":[ + [ + -83.50135, + 35.6892, + 576.39 + ], + [ + -83.5014028, + 35.6892, + 575.2 + ], + [ + -83.5014028, + 35.6892444, + 575.2 + ], + [ + -83.5013472, + 35.6892444, + 576.39 + ], + [ + -83.50135, + 35.6892, + 576.39 + ] + ], + "type":"Polygon" + }, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-18T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "AngAzXaxsRefeSoil", + "C4" + ], + [ + "AngAzYaxsRefeSoil", + "C2" + ], + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "ElevSoilC1", + "576.39" + ], + [ + "ElevSoilC2", + "575.20" + ], + [ + "ElevSoilC3", + "575.20" + ], + [ + "ElevSoilC4", + "576.39" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "LatSoilC1", + "35.6892000" + ], + [ + "LatSoilC2", + "35.6892000" + ], + [ + "LatSoilC3", + "35.6892444" + ], + [ + "LatSoilC4", + "35.6892444" + ], + [ + "locDisturb", + "1.32,2.3,NA and 0.160,3.175,NA and 0.160,2.725,NA and 1.720,3.175,NA and 1.72,2.725,NA" + ], + [ + "LonSoilC1", + "-83.5013500" + ], + [ + "LonSoilC2", + "-83.5014028" + ], + [ + "LonSoilC3", + "-83.5014028" + ], + [ + "LonSoilC4", + "-83.5013472" + ], + [ + "Orientation Number", + "2" + ], + [ + "RefeSoil", + "C1" + ], + [ + "Required Asset Management Location Code", + "SOILPL105351" + ], + [ + "State province", + "TN" + ], + [ + "UTM Zone", + "17N" + ], + [ + "x Azimuth Angle", + 3 + ], + [ + "y Azimuth Angle", + 270 + ] + ], + "reference_location":null, + "start_date":"2025-10-17T00:00:00Z", + "x_offset": 0, + "y_offset": 0 + + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + }, + "name":"SOILPL105351" + }, + "type":"Feature" + }, + "start_date":"2025-10-17T00:00:00Z", + "x_offset": 1.285, + "y_offset": 2.975 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + }, + "name":"CFGLOC105369", + "remove_date":"2025-10-18T00:00:00Z", + "site":"GRSM", + "site_location":{ + "features":[ + { + "geometry":{ + "coordinates":[ + -83.50195, + 35.68896, + 575.396725 + ], + "type":"Point" + }, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-18T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "AERONET_XREF", + "NEON_GRSM" + ], + [ + "AngAzWindPrim", + "140-320" + ], + [ + "AngAzWindScnd", + "NA" + ], + [ + "AngAzWindTrty", + "NA" + ], + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "DEIMS-SDR Site ID", + "https://deims.org/30f887c3-135b-41e8-9f44-9b084ce2b3bd" + ], + [ + "DistZaxsCnpy", + "31" + ], + [ + "DistZaxsDisp", + "20.2" + ], + [ + "Dom", + "D07" + ], + [ + "DURATION", + "Gradient" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "HABITAT", + "Terrestrial" + ], + [ + "IS Processing Default Start Date", + "2017-08-20T00:00:00Z" + ], + [ + "NEONSCI_FIELD_SITE_URL_PATH", + "great-smoky-mountains-national-park-twin-creeks" + ], + [ + "Pf$AngEnuXaxs", + "NA" + ], + [ + "Pf$AngEnuYaxs", + "NA" + ], + [ + "Pf$Ofst", + "NA" + ], + [ + "PrdDcmpMax", + "3" + ], + [ + "PrdIncrAgrDcmp", + "1" + ], + [ + "PrdIncrCalc", + "1" + ], + [ + "PrdIncrPf", + "1" + ], + [ + "PrdWndwAgrDcmp", + "5" + ], + [ + "PrdWndwCalc", + "3" + ], + [ + "PrdWndwPf", + "9" + ], + [ + "PresAtmSite", + "93630" + ], + [ + "Private", + "FALSE" + ], + [ + "Read", + "HDF5" + ], + [ + "Required Asset Management Location Code", + "GRSM" + ], + [ + "Site Timezone", + "US/Eastern" + ], + [ + "State Abbreviation", + "TN" + ], + [ + "State province", + "TN" + ], + [ + "TypeEco", + "Hardwood deciduous forest dominated by oaks and maples" + ], + [ + "TypeSoil", + "Spivey-Santeetlah-Nowhere complex, 8 to 15 percent slopes" + ], + [ + "UTM Zone", + "17N" + ], + [ + "ZoneTime", + "EST" + ] + ], + "reference_location":null, + "start_date":"2025-10-17T00:00:00Z", + "x_offset": 0, + "y_offset": 0 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + } + }, + "Required Asset Management Location Code":"CFGLOC105369", + "subLocation":"depth4", + "subSystem":"temp-profile", + "system":"soil", + "type":"Feature", + "VER":"504" + } + ], + "source_id": 20037, + "source_type":"prt", + "type":"FeatureCollection" +} diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_z_offset/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005505/data/temp-soil_GRSM005505_2025-10-17_ST_1_minute_001.parquet b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_z_offset/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005505/data/temp-soil_GRSM005505_2025-10-17_ST_1_minute_001.parquet new file mode 100644 index 000000000..d8b9bdba4 Binary files /dev/null and b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_z_offset/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005505/data/temp-soil_GRSM005505_2025-10-17_ST_1_minute_001.parquet differ diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_z_offset/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005505/location/CFGLOC105371.json b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_z_offset/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005505/location/CFGLOC105371.json new file mode 100644 index 000000000..f31e680a7 --- /dev/null +++ b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_z_offset/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005505/location/CFGLOC105371.json @@ -0,0 +1,39 @@ +{ + "features":[ + { + "AngNedZaxs":"NA", + "AngPtch":"0", + "Cal$PrdLab":"one time before installation", + "Data Rate":"0.1", + "DistZaxsLvlMeasSoil":"-0.365", + "FreqSamp":"0.1", + "HOR":"005", + "IS Processing Default Start Date":"2017-08-20T00:00:00Z", + "Required Asset Management Location Code":"CFGLOC105371", + "VER":"505", + "geometry":null, + "location":"plot5", + "properties":{ + "active_periods":[ + { + "start_date":"2025-10-17T00:00:00Z", + "end_date":"2025-10-18T00:00:00Z" + } + ], + "context":[ + + ], + "description":"Great Smoky Mountains Soil Temp Profile SP5, Z5 Depth", + "domain":"D07", + "name":"CFGLOC105371", + "site":"GRSM", + "type":"CONFIG" + }, + "subLocation":"depth5", + "subSystem":"temp-profile", + "system":"soil", + "type":"Feature" + } + ], + "type":"FeatureCollection" +} diff --git a/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_z_offset/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005505/location/prt_23800_locations.json b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_z_offset/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005505/location/prt_23800_locations.json new file mode 100644 index 000000000..98c240f10 --- /dev/null +++ b/flow/tests/testthat/pfs/envscn_temp_flags/temp/tests/no_z_offset/2025/10/17/conc-h2o-soil-salinity_GRSM005501/temp-soil_GRSM005505/location/prt_23800_locations.json @@ -0,0 +1,409 @@ +{ + "features":[ + { + "AngNedZaxs":"NA", + "AngPtch":"0", + "asset_manufacturer":"Thermometrics", + "asset_model":"R000-00000011", + "asset_software_version":null, + "Cal$PrdLab":"one time before installation", + "Data Rate":"0.1", + "DistZaxsLvlMeasSoil":"-0.365", + "FreqSamp":"0.1", + "geometry":null, + "HOR":"005", + "location":"plot5", + "properties":{ + "context":[ + + ], + "domain":"D07", + "install_date":"2025-10-17T00:00:00Z", + "locations":{ + "features":[ + { + "geometry":null, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-18T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "State province", + "TN" + ], + [ + "UTM Zone", + "17N" + ] + ], + "reference_location":{ + "geometry":null, + "properties":{ + "locations":{ + "features":[ + { + "geometry":{ + "coordinates":[ + [ + -83.50135, + 35.6892, + 576.39 + ], + [ + -83.5014028, + 35.6892, + 575.2 + ], + [ + -83.5014028, + 35.6892444, + 575.2 + ], + [ + -83.5013472, + 35.6892444, + 576.39 + ], + [ + -83.50135, + 35.6892, + 576.39 + ] + ], + "type":"Polygon" + }, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-18T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "AngAzXaxsRefeSoil", + "C4" + ], + [ + "AngAzYaxsRefeSoil", + "C2" + ], + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "ElevSoilC1", + "576.39" + ], + [ + "ElevSoilC2", + "575.20" + ], + [ + "ElevSoilC3", + "575.20" + ], + [ + "ElevSoilC4", + "576.39" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "LatSoilC1", + "35.6892000" + ], + [ + "LatSoilC2", + "35.6892000" + ], + [ + "LatSoilC3", + "35.6892444" + ], + [ + "LatSoilC4", + "35.6892444" + ], + [ + "locDisturb", + "1.32,2.3,NA and 0.160,3.175,NA and 0.160,2.725,NA and 1.720,3.175,NA and 1.72,2.725,NA" + ], + [ + "LonSoilC1", + "-83.5013500" + ], + [ + "LonSoilC2", + "-83.5014028" + ], + [ + "LonSoilC3", + "-83.5014028" + ], + [ + "LonSoilC4", + "-83.5013472" + ], + [ + "Orientation Number", + "2" + ], + [ + "RefeSoil", + "C1" + ], + [ + "Required Asset Management Location Code", + "SOILPL105351" + ], + [ + "State province", + "TN" + ], + [ + "UTM Zone", + "17N" + ], + [ + "x Azimuth Angle", + 3 + ], + [ + "y Azimuth Angle", + 270 + ] + ], + "reference_location":null, + "start_date":"2025-10-17T00:00:00Z", + "x_offset": 0, + "y_offset": 0, + "z_offset": 0 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + }, + "name":"SOILPL105351" + }, + "type":"Feature" + }, + "start_date":"2025-10-17T00:00:00Z", + "x_offset": 1.285, + "y_offset": 2.975, + "z_offset": -0.365 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + }, + "name":"CFGLOC105371", + "remove_date":"2025-10-18T00:00:00Z", + "site":"GRSM", + "site_location":{ + "features":[ + { + "geometry":{ + "coordinates":[ + -83.50195, + 35.68896, + 575.396725 + ], + "type":"Point" + }, + "properties":{ + "alpha": 0, + "beta": 0, + "end_date":"2025-10-18T00:00:00Z", + "gamma": 0, + "location_properties":[ + [ + "AERONET_XREF", + "NEON_GRSM" + ], + [ + "AngAzWindPrim", + "140-320" + ], + [ + "AngAzWindScnd", + "NA" + ], + [ + "AngAzWindTrty", + "NA" + ], + [ + "Country", + "USA" + ], + [ + "County", + "Sevier" + ], + [ + "DEIMS-SDR Site ID", + "https://deims.org/30f887c3-135b-41e8-9f44-9b084ce2b3bd" + ], + [ + "DistZaxsCnpy", + "31" + ], + [ + "DistZaxsDisp", + "20.2" + ], + [ + "Dom", + "D07" + ], + [ + "DURATION", + "Gradient" + ], + [ + "Geodetic datum", + "WGS84" + ], + [ + "HABITAT", + "Terrestrial" + ], + [ + "IS Processing Default Start Date", + "2017-08-20T00:00:00Z" + ], + [ + "NEONSCI_FIELD_SITE_URL_PATH", + "great-smoky-mountains-national-park-twin-creeks" + ], + [ + "Pf$AngEnuXaxs", + "NA" + ], + [ + "Pf$AngEnuYaxs", + "NA" + ], + [ + "Pf$Ofst", + "NA" + ], + [ + "PrdDcmpMax", + "3" + ], + [ + "PrdIncrAgrDcmp", + "1" + ], + [ + "PrdIncrCalc", + "1" + ], + [ + "PrdIncrPf", + "1" + ], + [ + "PrdWndwAgrDcmp", + "5" + ], + [ + "PrdWndwCalc", + "3" + ], + [ + "PrdWndwPf", + "9" + ], + [ + "PresAtmSite", + "93630" + ], + [ + "Private", + "FALSE" + ], + [ + "Read", + "HDF5" + ], + [ + "Required Asset Management Location Code", + "GRSM" + ], + [ + "Site Timezone", + "US/Eastern" + ], + [ + "State Abbreviation", + "TN" + ], + [ + "State province", + "TN" + ], + [ + "TypeEco", + "Hardwood deciduous forest dominated by oaks and maples" + ], + [ + "TypeSoil", + "Spivey-Santeetlah-Nowhere complex, 8 to 15 percent slopes" + ], + [ + "UTM Zone", + "17N" + ], + [ + "ZoneTime", + "EST" + ] + ], + "reference_location":null, + "start_date":"2025-10-17T00:00:00Z", + "x_offset": 0, + "y_offset": 0, + "z_offset": 0 + }, + "type":"Feature" + } + ], + "type":"FeatureCollection" + } + }, + "Required Asset Management Location Code":"CFGLOC105371", + "subLocation":"depth5", + "subSystem":"temp-profile", + "system":"soil", + "type":"Feature", + "VER":"505" + } + ], + "source_id": 23800, + "source_type":"prt", + "type":"FeatureCollection" +} diff --git a/flow/tests/testthat/test-wrap-envscn-temp-flags.R b/flow/tests/testthat/test-wrap-envscn-temp-flags.R new file mode 100644 index 000000000..f3b088c28 --- /dev/null +++ b/flow/tests/testthat/test-wrap-envscn-temp-flags.R @@ -0,0 +1,977 @@ +######################################################################################################## +#' @title Unit tests for temperature flag functions + +#' @author +#' Teresa Burlingame \email{tburlingame@battelleecology.org} + +#' @description Comprehensive unit tests for the envscn temperature flags workflow, +#' including helper functions def.load.temp.sensors, def.find.temp.sensor, +#' def.calc.temp.flags, def.apply.temp.flags, def.sort.qf.cols, and the main +#' wrap.envscn.temp.flags function. + +######################################################################################################## + +# Define test context + +# Load required libraries +library(testthat) +library(data.table) +library(arrow) +library(jsonlite) + +# uncomment if running directly, change dirs as needed +#Source the functions under test +setwd("~/GitHub/NEON-IS-data-processing/flow/tests/testthat") + +flow_dir <- "~/GitHub/NEON-IS-data-processing/flow/flow.envscn.temp.flags/" + +source(file.path(flow_dir, "def.load.temp.sensors.R")) +source(file.path(flow_dir, "def.find.temp.sensor.R")) +source(file.path(flow_dir, "def.calc.temp.flags.R")) +source(file.path(flow_dir, "def.apply.temp.flags.R")) +source(file.path(flow_dir, "def.sort.qf.cols.R")) +source(file.path(flow_dir, "wrap.envscn.temp.flags.R")) + +######################################################################################################## +# Test 1: def.sort.qf.cols +######################################################################################################## +test_that("Test def.sort.qf.cols sorts columns correctly", { + # Test input with mixed order + cols <- c("tempTestDepth03QF", "readout_time", "depth01SoilMoisturePlausibilityQF", + "tempTestDepth01QF", "depth02SoilMoisturePlausibilityQF", + "tempTestDepth02QF") + + sorted <- def.sort.qf.cols(cols) + + # Check that static columns come first + expect_equal(sorted[1], c("readout_time")) + + # Check that tempTest columns are sorted numerically + tempCols <- sorted[grepl("tempTest", sorted)] + expect_equal(tempCols, c("tempTestDepth01QF", "tempTestDepth02QF", "tempTestDepth03QF")) + + # Check that all columns are present + expect_equal(length(sorted), length(cols)) + expect_true(all(cols %in% sorted)) +}) + +test_that("Test def.sort.qf.cols handles empty input", { + expect_equal(def.sort.qf.cols(character(0)), character(0)) +}) + +test_that("Test def.sort.qf.cols handles columns without depth numbers", { + cols <- c("readout_time", "genericQF", "someOtherColumnQF") + sorted <- def.sort.qf.cols(cols) + + # readout_time should be first + expect_equal(sorted[1], "readout_time") + # Other columns should be present + expect_equal(length(sorted), length(cols)) +}) + +######################################################################################################## +# Test 2: def.find.temp.sensor +######################################################################################################## +test_that("Test def.find.temp.sensor finds closest sensor", { + # Create test sensor data + sensorDf <- data.frame( + sensor_id = c("temp-soil_SITE001", "temp-soil_SITE002", "temp-soil_SITE003"), + depth_m = c(-0.10, -0.30, -0.50), + data_path = c("/path/to/data1.parquet", "/path/to/data2.parquet", "/path/to/data3.parquet"), + location_path = c("/path/to/loc1.json", "/path/to/loc2.json", "/path/to/loc3.json"), + stringsAsFactors = FALSE + ) + + # Test finding sensor closest to -0.25m + result <- def.find.temp.sensor(targetDepth = -0.25, sensorDepthDf = sensorDf, log = NULL) + + expect_equal(result$closest$sensor_id, "temp-soil_SITE002") + expect_equal(result$closest$depth_m, -0.30) + + # Check neighbors + expect_equal(result$neighbors$higher$sensor_id, "temp-soil_SITE001") # -0.10 is higher (less negative) + expect_equal(result$neighbors$lower$sensor_id, "temp-soil_SITE003") # -0.50 is lower (more negative) +}) + +test_that("Test def.find.temp.sensor with no valid temperature depths", { + # Create test sensor data + sensorDf <- data.frame( + sensor_id = c("temp-soil_SITE001", "temp-soil_SITE002", "temp-soil_SITE003"), + depth_m = c(NA,NA,NA), + data_path = c("/path/to/data1.parquet", "/path/to/data2.parquet", "/path/to/data3.parquet"), + location_path = c("/path/to/loc1.json", "/path/to/loc2.json", "/path/to/loc3.json"), + stringsAsFactors = FALSE + ) + + # Test finding sensor closest to -0.25m + result <- def.find.temp.sensor(targetDepth = -0.25, sensorDepthDf = sensorDf, log = NULL) + + expect_null(result) + +}) + + +test_that("Test def.find.temp.sensor handles tie with shallower preference", { + # Create sensors equidistant from target + sensorDf <- data.frame( + sensor_id = c("temp-soil_SITE001", "temp-soil_SITE002"), + depth_m = c(-0.20, -0.40), + data_path = c("/path/to/data1.parquet", "/path/to/data2.parquet"), + location_path = c("/path/to/loc1.json", "/path/to/loc2.json"), + stringsAsFactors = FALSE + ) + + # Target at -0.30 is equidistant from both (-0.20 and -0.40) + result <- def.find.temp.sensor(targetDepth = -0.30, sensorDepthDf = sensorDf, log = NULL) + + # Should prefer the shallower sensor (-0.20 is less negative) + expect_equal(result$closest$sensor_id, "temp-soil_SITE001") + expect_equal(result$closest$depth_m, -0.20) +}) + +test_that("Test def.find.temp.sensor handles edge sensors without neighbors", { + sensorDf <- data.frame( + sensor_id = c("temp-soil_SITE001", "temp-soil_SITE002", "temp-soil_SITE003"), + depth_m = c(-0.10, -0.30, -0.50), + data_path = c("/path/to/data1.parquet", "/path/to/data2.parquet", "/path/to/data3.parquet"), + location_path = c("/path/to/loc1.json", "/path/to/loc2.json", "/path/to/loc3.json"), + stringsAsFactors = FALSE + ) + + # Test shallowest sensor + result <- def.find.temp.sensor(targetDepth = -0.05, sensorDepthDf = sensorDf, log = NULL) + expect_equal(result$closest$sensor_id, "temp-soil_SITE001") + expect_null(result$neighbors$higher) # No shallower sensor + expect_equal(result$neighbors$lower$sensor_id, "temp-soil_SITE002") + + # Test deepest sensor + result <- def.find.temp.sensor(targetDepth = -0.60, sensorDepthDf = sensorDf, log = NULL) + expect_equal(result$closest$sensor_id, "temp-soil_SITE003") + expect_equal(result$neighbors$higher$sensor_id, "temp-soil_SITE002") + expect_null(result$neighbors$lower) # No deeper sensor +}) + +test_that("Test def.find.temp.sensor filters NA depths", { + sensorDf <- data.frame( + sensor_id = c("temp-soil_SITE001", "temp-soil_SITE002", "temp-soil_SITE003"), + depth_m = c(-0.10, NA, -0.50), + data_path = c("/path/to/data1.parquet", "/path/to/data2.parquet", "/path/to/data3.parquet"), + location_path = c("/path/to/loc1.json", "/path/to/loc2.json", "/path/to/loc3.json"), + stringsAsFactors = FALSE + ) + + # Should ignore sensor with NA depth + result <- def.find.temp.sensor(targetDepth = -0.30, sensorDepthDf = sensorDf, log = NULL) + + # Should choose between the two valid sensors + expect_true(result$closest$sensor_id %in% c("temp-soil_SITE001", "temp-soil_SITE003")) + expect_false(is.na(result$closest$depth_m)) +}) + +######################################################################################################## +# Test 3: def.load.temp.sensors +######################################################################################################## +test_that("Test def.load.temp.sensors with test data", { + # Use the actual test data + DirTemp <- file.path(getwd(), "pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501") + + # Only run this test if the test data exists + if (dir.exists(DirTemp)) { + result <- def.load.temp.sensors(DirTemp = DirTemp, log = NULL) + + # Check that we got a data frame back + expect_s3_class(result, "data.frame") + + # Check required columns exist + expect_true(all(c("sensor_id", "depth_m", "data_path", "location_path") %in% names(result))) + + # Check that sensor_ids contain the expected prefix + if (nrow(result) > 0) { + expect_true(all(grepl("^temp-soil_", result$sensor_id))) + + # Check that depths are numeric and negative (below surface) + expect_true(all(is.numeric(result$depth_m))) + expect_true(all(result$depth_m <= 0, na.rm = TRUE)) + + # Check that paths exist + expect_true(all(file.exists(result$data_path))) + expect_true(all(file.exists(result$location_path))) + } + } else { + skip("Test data not available") + } +}) + +# Test with empty directory (no temperature sensor data) +test_that("Test def.load.temp.sensors with no data", { + # Use fake location + DirTemp <- file.path(getwd(), "pfs/envscn_temp_flags/temp/2025/10/14/") + + # Only run this test if the test data exists + + result <- def.load.temp.sensors(DirTemp = DirTemp, log = NULL) + + # Check that we got a data frame back + expect_equal(nrow(result), 0) + +}) + +# Test with multiple location files for same sensor (should average depths) +test_that("Test def.load.temp.sensors with more than one depth", { + # Use the actual test data + DirTemp <- file.path(getwd(), "pfs/envscn_temp_flags/temp/tests/multiple_depth/2025/10/18/conc-h2o-soil-salinity_GRSM005501/") + + # Only run this test if the test data exists + if (dir.exists(DirTemp)) { + result <- def.load.temp.sensors(DirTemp = DirTemp, log = NULL) + # Should average multiple depths for same sensor + expect_equal(result$depth_m[result$sensor_id=="temp-soil_GRSM005501"], mean(c(-.005, -.009))) + } else { + skip("Test data not available") + } +}) + +# Test with no location files +test_that("Test def.load.temp.sensors no location data found", { + # Use the test data + DirTemp <- file.path(getwd(), "pfs/envscn_temp_flags/temp/tests/no_locations/2025/10/17/conc-h2o-soil-salinity_GRSM005501/") + + # Only run this test if the test data exists + if (dir.exists(DirTemp)) { + result <- def.load.temp.sensors(DirTemp = DirTemp, log = NULL) + # Should return empty data frame + expect_equal(nrow(result), 0) + } else { + skip("Test data not available") + } +}) + +# Test with missing z_offset in location file (should result in NA depth) +test_that("Test def.load.temp.sensors with missing z_offset", { + # Use the actual test data + DirTemp <- file.path(getwd(), "pfs/envscn_temp_flags/temp/tests/no_z_offset/2025/10/17/conc-h2o-soil-salinity_GRSM005501/") + # Only run this test if the test data exists + if (dir.exists(DirTemp)) { + result <- def.load.temp.sensors(DirTemp = DirTemp, log = NULL) + # Should have NA in depth_m column + expect_true(any(is.na(result$depth_m))) + } else { + skip("Test data not available") + } +}) + + +######################################################################################################## +# Test 4: def.calc.temp.flags +######################################################################################################## +test_that("Test def.calc.temp.flags basic functionality", { + # Create temp directory for test data + tmpDir <- tempdir() + testDataPath <- file.path(tmpDir, "test_temp_data.parquet") + + # Create test temperature data + testTempData <- data.frame( + startDateTime = as.POSIXct(c("2025-10-17 00:00:00", "2025-10-17 00:01:00", + "2025-10-17 00:02:00"), tz = "UTC"), + endDateTime = as.POSIXct(c("2025-10-17 00:01:00", "2025-10-17 00:02:00", + "2025-10-17 00:03:00"), tz = "UTC"), + soilTempMean = c(5.0, -2.0, 3.0), # Temperature values + soilTempExpUncert = c(1.0, 1.0, 1.0), # Uncertainty values + finalQF = c(0L, 0L, 0L) # All good data + ) + + # Write test data + arrow::write_parquet(testTempData, testDataPath) + + # Create sensor info + sensorInfo <- list( + closest = data.frame( + sensor_id = "temp-soil_TEST001", + depth_m = -0.20, + data_path = testDataPath, + location_path = "/fake/path.json", + stringsAsFactors = FALSE + ), + neighbors = list( + higher = NULL, + lower = NULL + ) + ) + + # Calculate flags + result <- def.calc.temp.flags(sensorInfo = sensorInfo, log = NULL) + + # Check structure + expect_true(all(c("startDateTime", "endDateTime", "temp_flag") %in% names(result))) + expect_equal(nrow(result), 3) + + # Check flag logic: temp_flag = 1 if soilTempMean < soilTempExpUncert + # Row 1: 5.0 < 1.0 = FALSE -> 0 + # Row 2: -2.0 < 1.0 = TRUE -> 1 + # Row 3: 3.0 < 1.0 = FALSE -> 0 + expect_equal(result$temp_flag, c(0L, 1L, 0L)) + + # Cleanup + unlink(testDataPath) +}) + +test_that("Test def.calc.temp.flags neighbor too far", { + # Create temp directory for test data + tmpDir <- tempdir() + testDataPath1 <- file.path(tmpDir, "test_temp_data1.parquet") + testDataPath2 <- file.path(tmpDir, "test_temp_data2.parquet") + testDataPath3 <- file.path(tmpDir, "test_temp_data3.parquet") + + # Create test temperature data with some flagged intervals + testTempData1 <- data.frame( + startDateTime = as.POSIXct(c("2025-10-17 00:00:00", "2025-10-17 00:01:00"), tz = "UTC"), + endDateTime = as.POSIXct(c("2025-10-17 00:01:00", "2025-10-17 00:02:00"), tz = "UTC"), + soilTempMean = c(5.0, -2.0), + soilTempExpUncert = c(1.0, 1.0), + finalQF = c(1L, 1L) # Both intervals are flagged + ) + + # Neighbor sensors with good data + testTempData2 <- data.frame( + startDateTime = as.POSIXct(c("2025-10-17 00:00:00", "2025-10-17 00:01:00"), tz = "UTC"), + endDateTime = as.POSIXct(c("2025-10-17 00:01:00", "2025-10-17 00:02:00"), tz = "UTC"), + soilTempMean = c(4.5, 0.5), + soilTempExpUncert = c(1.0, 1.0), + finalQF = c(0L, 0L) # All good + ) + + testTempData3 <- data.frame( + startDateTime = as.POSIXct(c("2025-10-17 00:00:00", "2025-10-17 00:01:00"), tz = "UTC"), + endDateTime = as.POSIXct(c("2025-10-17 00:01:00", "2025-10-17 00:02:00"), tz = "UTC"), + soilTempMean = c(4.8, 0.3), + soilTempExpUncert = c(1.0, 1.0), + finalQF = c(0L, 0L) # All good + ) + + # Write test data + arrow::write_parquet(testTempData1, testDataPath1) + arrow::write_parquet(testTempData2, testDataPath2) + arrow::write_parquet(testTempData3, testDataPath3) + + # Create sensor info with neighbors + sensorInfo <- list( + closest = data.frame( + sensor_id = "temp-soil_TEST001", + depth_m = -0.20, + data_path = testDataPath1, + location_path = "/fake/path1.json", + stringsAsFactors = FALSE + ), + neighbors = list( + higher = data.frame( + sensor_id = "temp-soil_TEST002", + depth_m = -0.10, + data_path = testDataPath2, + location_path = "/fake/path2.json", + stringsAsFactors = FALSE + ), + lower = data.frame( + sensor_id = "temp-soil_TEST003", + depth_m = -1.5, + data_path = testDataPath3, + location_path = "/fake/path3.json", + stringsAsFactors = FALSE + ) + ) + ) + + # Calculate flags with distance check + result <- def.calc.temp.flags( + sensorInfo = sensorInfo, + targetDepth = -0.20, + distThreshold = 0.15, + log = NULL + ) + + # Check structure + expect_equal(nrow(result), 2) + + # First interval: primary sensor flagged and neighbor too far (>0.15m) + expect_equal(result$temp_flag[1], -1L) + + + # Cleanup + unlink(c(testDataPath1, testDataPath2, testDataPath3)) +}) + + +test_that("Test def.calc.temp.flags with flagged primary sensor", { + # Create temp directory for test data + tmpDir <- tempdir() + testDataPath1 <- file.path(tmpDir, "test_temp_data1.parquet") + testDataPath2 <- file.path(tmpDir, "test_temp_data2.parquet") + testDataPath3 <- file.path(tmpDir, "test_temp_data3.parquet") + + # Create test temperature data with some flagged intervals + testTempData1 <- data.frame( + startDateTime = as.POSIXct(c("2025-10-17 00:00:00", "2025-10-17 00:01:00"), tz = "UTC"), + endDateTime = as.POSIXct(c("2025-10-17 00:01:00", "2025-10-17 00:02:00"), tz = "UTC"), + soilTempMean = c(5.0, -2.0), + soilTempExpUncert = c(1.0, 1.0), + finalQF = c(0L, 1L) # Second interval is flagged + ) + + # Neighbor sensors with good data + testTempData2 <- data.frame( + startDateTime = as.POSIXct(c("2025-10-17 00:00:00", "2025-10-17 00:01:00"), tz = "UTC"), + endDateTime = as.POSIXct(c("2025-10-17 00:01:00", "2025-10-17 00:02:00"), tz = "UTC"), + soilTempMean = c(4.5, 0.5), + soilTempExpUncert = c(1.0, 1.0), + finalQF = c(0L, 0L) # All good + ) + + testTempData3 <- data.frame( + startDateTime = as.POSIXct(c("2025-10-17 00:00:00", "2025-10-17 00:01:00"), tz = "UTC"), + endDateTime = as.POSIXct(c("2025-10-17 00:01:00", "2025-10-17 00:02:00"), tz = "UTC"), + soilTempMean = c(4.8, 0.3), + soilTempExpUncert = c(1.0, 1.0), + finalQF = c(0L, 0L) # All good + ) + + # Write test data + arrow::write_parquet(testTempData1, testDataPath1) + arrow::write_parquet(testTempData2, testDataPath2) + arrow::write_parquet(testTempData3, testDataPath3) + + # Create sensor info with neighbors + sensorInfo <- list( + closest = data.frame( + sensor_id = "temp-soil_TEST001", + depth_m = -0.20, + data_path = testDataPath1, + location_path = "/fake/path1.json", + stringsAsFactors = FALSE + ), + neighbors = list( + higher = data.frame( + sensor_id = "temp-soil_TEST002", + depth_m = -0.10, + data_path = testDataPath2, + location_path = "/fake/path2.json", + stringsAsFactors = FALSE + ), + lower = data.frame( + sensor_id = "temp-soil_TEST003", + depth_m = -0.30, + data_path = testDataPath3, + location_path = "/fake/path3.json", + stringsAsFactors = FALSE + ) + ) + ) + + # Calculate flags with distance check + result <- def.calc.temp.flags( + sensorInfo = sensorInfo, + targetDepth = -0.20, + distThreshold = 0.15, + log = NULL + ) + + # Check structure + expect_equal(nrow(result), 2) + + # First interval: primary sensor is good, should use it + expect_equal(result$temp_flag[1], 0L) # 5.0 < 1.0 = FALSE -> 0 + + # Second interval: primary sensor is flagged, should use neighbor average + # Neighbor avg: ((0.5 - 1.0) + (0.3 - 1.0)) / 2 = (-0.5 + -0.7) / 2 = -0.6 + # avgZeroCheck < 1.0 = TRUE -> 1 + expect_equal(result$temp_flag[2], 1L) + + # Cleanup + unlink(c(testDataPath1, testDataPath2, testDataPath3)) +}) + +######################################################################################################## +# Test 5: def.apply.temp.flags +######################################################################################################## +test_that("Test def.apply.temp.flags joins flags correctly", { + # Create high-frequency soil moisture data + dataSm <- data.frame( + readout_time = as.POSIXct(c( + "2025-10-17 00:00:05", "2025-10-17 00:00:15", "2025-10-17 00:00:25", + "2025-10-17 00:01:05", "2025-10-17 00:01:15", "2025-10-17 00:01:25" + ), tz = "UTC"), + depth01SoilMoisture = c(0.25, 0.26, 0.24, 0.27, 0.25, 0.26), + tempTestDepth01QF = rep(-1L, 6) # Initialize to -1 + ) + + # Create minute-interval temperature flags + tempData <- data.frame( + startDateTime = as.POSIXct(c("2025-10-17 00:00:00", "2025-10-17 00:01:00"), tz = "UTC"), + endDateTime = as.POSIXct(c("2025-10-17 00:01:00", "2025-10-17 00:02:00"), tz = "UTC"), + temp_flag = c(0L, 1L) + ) + + # Apply flags + result <- def.apply.temp.flags( + dataSm = dataSm, + tempData = tempData, + qfColName = "tempTestDepth01QF", + log = NULL + ) + + # Check that flags were applied correctly + # First 3 rows fall in first minute interval (flag = 0) + expect_equal(result$tempTestDepth01QF[1:3], c(0L, 0L, 0L)) + + # Last 3 rows fall in second minute interval (flag = 1) + expect_equal(result$tempTestDepth01QF[4:6], c(1L, 1L, 1L)) +}) + +test_that("Test def.apply.temp.flags handles missing intervals", { + # Create data with some points outside the temp data intervals + dataSm <- data.frame( + readout_time = as.POSIXct(c( + "2025-10-17 00:00:05", # Inside first interval + "2025-10-17 00:02:05", # Outside any interval + "2025-10-17 00:01:05" # Inside second interval + ), tz = "UTC"), + depth01SoilMoisture = c(0.25, 0.26, 0.27), + tempTestDepth01QF = rep(-1L, 3) + ) + + tempData <- data.frame( + startDateTime = as.POSIXct(c("2025-10-17 00:00:00", "2025-10-17 00:01:00"), tz = "UTC"), + endDateTime = as.POSIXct(c("2025-10-17 00:01:00", "2025-10-17 00:02:00"), tz = "UTC"), + temp_flag = c(0L, 1L) + ) + + result <- def.apply.temp.flags( + dataSm = dataSm, + tempData = tempData, + qfColName = "tempTestDepth01QF", + log = NULL + ) + + # First row should get flag 0 + expect_equal(result$tempTestDepth01QF[1], 0L) + + # Second row has no matching interval, should remain -1 + expect_equal(result$tempTestDepth01QF[2], -1L) + + # Third row should get flag 1 + expect_equal(result$tempTestDepth01QF[3], 1L) +}) + + + +######################################################################################################## +# Test 6: Integration tests with real data - various edge cases and failure scenarios +######################################################################################################## +test_that("Integration test with good data (baseline)", { + # Use actual test data paths + DirIn <- file.path(getwd(), "pfs/envscn_temp_flags/enviroscan/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/") + DirTemp <- file.path(getwd(), "pfs/envscn_temp_flags/temp/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501") + DirOutBase <- file.path(tempdir(), "test_output") + + # Only run if test data exists + if (dir.exists(DirIn) && dir.exists(DirTemp)) { + # Clean output directory + if (dir.exists(DirOutBase)) { + unlink(DirOutBase, recursive = TRUE) + } + + # Run the wrap function + + wrap.envscn.temp.flags( + DirIn = DirIn, + DirOutBase = DirOutBase, + DirTemp = DirTemp, + DirSubCopy = c("data", "location", "threshold"), + log = NULL + ) + + # Check that output was created + expect_true(dir.exists(DirOutBase)) + + # Check that flags directory was created + flagsDir <- file.path(DirOutBase, "enviroscan/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/flags") + expect_true(dir.exists(flagsDir)) + + # Check that flag file exists + flagFiles <- list.files(flagsDir, pattern = "flagsPlausibility.parquet") + expect_equal(length(flagFiles), 1) + + # Read and validate the output + flagData <- arrow::read_parquet(file.path(flagsDir, flagFiles[1])) + + # Check that tempTest columns were added + tempTestCols <- names(flagData)[grepl("tempTestDepth", names(flagData))] + expect_true(length(tempTestCols) == 8) + + # Check that flags have valid values (0, 1, or -1) + for (col in tempTestCols) { + expect_true(all(flagData[[col]] %in% c(-1L, 0L, 1L))) + } + + # Check that timestamps are present + expect_true("readout_time" %in% names(flagData)) + + # Cleanup + unlink(DirOutBase, recursive = TRUE) + } else { + skip("Test data not available") + } +}) + +# Test with missing depth values in soil moisture data +test_that("Integration test with missing soil moisture depths", { + # Use actual test data paths + # Soil moisture data missing depth information + DirIn <- file.path(getwd(), "pfs/envscn_temp_flags/enviroscan/tests/no_depths/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/") + # Temperature data is good + DirTemp <- file.path(getwd(), "pfs/envscn_temp_flags/temp/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501") + DirOutBase <- file.path(tempdir(), "test_output") + + # Only run if test data exists + if (dir.exists(DirIn) && dir.exists(DirTemp)) { + # Clean output directory + if (dir.exists(DirOutBase)) { + unlink(DirOutBase, recursive = TRUE) + } + + # Run the wrap function + + wrap.envscn.temp.flags( + DirIn = DirIn, + DirOutBase = DirOutBase, + DirTemp = DirTemp, + DirSubCopy = c("data", "location", "threshold"), + log = NULL + ) + + # Check that output was created + expect_true(dir.exists(DirOutBase)) + + # Check that flags directory was created + flagsDir <- file.path(DirOutBase, "enviroscan/tests/no_depths/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/flags") + expect_true(dir.exists(flagsDir)) + + # Check that flag file exists + flagFiles <- list.files(flagsDir, pattern = "flagsPlausibility.parquet") + expect_equal(length(flagFiles), 1) + + # Read and validate the output + flagData <- arrow::read_parquet(file.path(flagsDir, flagFiles[1])) + + # Check that data is all -1 due to missing depth information + expect_true(all(flagData$tempTestDepth01QF), -1) + + tempTestCols <- names(flagData)[grepl("tempTestDepth", names(flagData))] + + # Check that flags have valid values (0, 1, or -1) + for (col in tempTestCols) { + expect_true(all(flagData[[col]] %in% c(-1L, 0L, 1L))) + } + + # Check that timestamps are present + expect_true("readout_time" %in% names(flagData)) + + # Cleanup + unlink(DirOutBase, recursive = TRUE) + } else { + skip("Test data not available") + } +}) + + +# Test with freezing temperature conditions +test_that("Integration test with all freezing data", { + # Use actual test data paths + # Good soil moisture data + DirIn <- file.path(getwd(), "pfs/envscn_temp_flags/enviroscan/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/") + # Temperature data with all freezing values + DirTemp <- file.path(getwd(), "pfs/envscn_temp_flags/temp/tests/all_freezing/2025/10/17/conc-h2o-soil-salinity_GRSM005501/") + DirOutBase <- file.path(tempdir(), "test_output") + + # Only run if test data exists + if (dir.exists(DirIn) && dir.exists(DirTemp)) { + # Clean output directory + if (dir.exists(DirOutBase)) { + unlink(DirOutBase, recursive = TRUE) + } + + # Run the wrap function + + wrap.envscn.temp.flags( + DirIn = DirIn, + DirOutBase = DirOutBase, + DirTemp = DirTemp, + DirSubCopy = c("data", "location", "threshold"), + log = NULL + ) + + # Check that output was created + expect_true(dir.exists(DirOutBase)) + + # Check that flags directory was created + flagsDir <- file.path(DirOutBase, "enviroscan/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/flags") + expect_true(dir.exists(flagsDir)) + + # Check that flag file exists + flagFiles <- list.files(flagsDir, pattern = "flagsPlausibility.parquet") + expect_equal(length(flagFiles), 1) + + # Read and validate the output + flagData <- arrow::read_parquet(file.path(flagsDir, flagFiles[1])) + + # Check that data was flagged as frozen + expect_true(all(flagData$tempTestDepth02QF), 1) + + tempTestCols <- names(flagData)[grepl("tempTestDepth", names(flagData))] + + # Check that flags have valid values (0, 1, or -1) + for (col in tempTestCols) { + expect_true(all(flagData[[col]] %in% c(-1L, 0L, 1L))) + } + + # Check that timestamps are present + expect_true("readout_time" %in% names(flagData)) + + # Cleanup + unlink(DirOutBase, recursive = TRUE) + } else { + skip("Test data not available") + } +}) + +# Test with missing temperature data directory +test_that("Integration test with no temperature data", { + # Use actual test data paths + # Good soil moisture data + DirIn <- file.path(getwd(), "pfs/envscn_temp_flags/enviroscan/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/") + # Non-existent temperature data path + DirTemp <- file.path(getwd(), "pfs/envscn_temp_flags/temp/tests/no_temp_data/2020/10/14") + DirOutBase <- file.path(tempdir(), "test_output") + + # Run the wrap function + + wrap.envscn.temp.flags( + DirIn = DirIn, + DirOutBase = DirOutBase, + DirTemp = DirTemp, + DirSubCopy = c("data", "location", "threshold"), + log = NULL + ) + + # Check that output was created + expect_true(dir.exists(DirOutBase)) + + # Check that flags directory was created + flagsDir <- file.path(DirOutBase, "enviroscan/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/flags") + expect_true(dir.exists(flagsDir)) + + # Check that flag file exists + flagFiles <- list.files(flagsDir, pattern = "flagsPlausibility.parquet") + expect_equal(length(flagFiles), 1) + + # Read and validate the output + flagData <- arrow::read_parquet(file.path(flagsDir, flagFiles[1])) + + + tempTestCols <- names(flagData)[grepl("tempTestDepth", names(flagData))] + + # All flags should be -1 when no temperature data is available + for (col in tempTestCols) { + expect_true(all(flagData[[col]] %in% c(-1L))) + } + + # Check that all 8 columns are present + expect_true(length(tempTestCols)==8) + + # Check that timestamps are present + expect_true("readout_time" %in% names(flagData)) + + # Cleanup + unlink(DirOutBase, recursive = TRUE) + +}) + + +# Test with missing z_offset in temperature sensor location files +test_that("Integration test with missing z_offset", { + # Use actual test data paths + DirIn <- file.path(getwd(), "pfs/envscn_temp_flags/enviroscan/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/") + # Temperature data with location files missing z_offset field + DirTemp <- file.path(getwd(), "pfs/envscn_temp_flags/temp/tests/no_z_offset/2025/10/17/conc-h2o-soil-salinity_GRSM005501/") + DirOutBase <- file.path(tempdir(), "test_output") + + # Run the wrap function + + wrap.envscn.temp.flags( + DirIn = DirIn, + DirOutBase = DirOutBase, + DirTemp = DirTemp, + DirSubCopy = c("data", "location", "threshold"), + log = NULL + ) + + # Check that output was created + expect_true(dir.exists(DirOutBase)) + + # Check that flags directory was created + flagsDir <- file.path(DirOutBase, "enviroscan/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/flags/") + expect_true(dir.exists(flagsDir)) + + # Check that flag file exists + flagFiles <- list.files(flagsDir, pattern = "flagsPlausibility.parquet") + expect_equal(length(flagFiles), 1) + + # Read and validate the output + flagData <- arrow::read_parquet(file.path(flagsDir, flagFiles[1])) + + tempTestCols <- names(flagData)[grepl("tempTestDepth", names(flagData))] + + # Flags should have valid values (may have some -1 for missing z_offset) + for (col in tempTestCols) { + expect_true(all(flagData[[col]] %in% c(0L, 1L,-1L))) + } + + # Check that all 8 columns are present + expect_true(length(tempTestCols)==8) + + # Check that timestamps are present + expect_true("readout_time" %in% names(flagData)) + + # Cleanup + unlink(DirOutBase, recursive = TRUE) + +}) + + +test_that("Integration test with missing threshold file (expect error)", { + # Use actual test data paths + # Soil moisture data without threshold configuration file + DirIn <- file.path(getwd(), "pfs/envscn_temp_flags/enviroscan/tests/no_thresholds/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/") + # Temperature data path (test should fail before reaching here) + DirTemp <- file.path(getwd(), "pfs/envscn_temp_flags/temp/tests/no_temp_data/2020/10/14") + DirOutBase <- file.path(tempdir(), "test_output") + + # Run the wrap function + + expect_error(wrap.envscn.temp.flags( + DirIn = DirIn, + DirOutBase = DirOutBase, + DirTemp = DirTemp, + DirSubCopy = c("data", "location", "threshold"), + log = NULL + )) + + # Cleanup + unlink(DirOutBase, recursive = TRUE) + +}) + +test_that("Integration test with temp directory - required for tests", { + # Use actual test data paths + # Soil moisture data without threshold configuration file + DirIn <- file.path(getwd(), "pfs/envscn_temp_flags/enviroscan/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/") + # Temperature data path (test should fail before reaching here) + DirTemp <- NULL + DirOutBase <- file.path(tempdir(), "test_output") + + # Run the wrap function + + wrap.envscn.temp.flags( + DirIn = DirIn, + DirOutBase = DirOutBase, + DirTemp = DirTemp, + DirSubCopy = c("data", "location", "threshold"), + log = NULL + ) + + # Check that output was created + expect_true(dir.exists(DirOutBase)) + + # Check that flags directory was created + flagsDir <- file.path(DirOutBase, "enviroscan/tests/good_data/2025/10/17/conc-h2o-soil-salinity_GRSM005501/enviroscan/CFGLOC105360/flags") + expect_true(dir.exists(flagsDir)) + + # Check that flag file exists + flagFiles <- list.files(flagsDir, pattern = "flagsPlausibility.parquet") + expect_equal(length(flagFiles), 1) + + # Read and validate the output + flagData <- arrow::read_parquet(file.path(flagsDir, flagFiles[1])) + + + tempTestCols <- names(flagData)[grepl("tempTestDepth", names(flagData))] + + # All flags should be -1 when no temperature data is available + for (col in tempTestCols) { + expect_true(all(flagData[[col]] %in% c(-1L))) + } + + # Check that all 8 columns are present + expect_true(length(tempTestCols)==8) + + # Check that timestamps are present + expect_true("readout_time" %in% names(flagData)) + # Cleanup + unlink(DirOutBase, recursive = TRUE) + +}) + +test_that("Integration test with combined DirIn and DirTemp", { + # Use actual test data paths + DirIn <- file.path(getwd(), "pfs/envscn_temp_flags/combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/enviroscan/CFGLOC105245/") + DirOutBase <- file.path(tempdir(), "test_output") + + # Only run if test data exists + if (dir.exists(DirIn) ) { + # Clean output directory + if (dir.exists(DirOutBase)) { + unlink(DirOutBase, recursive = TRUE) + } + + #add flow logic for DirTemp + DirTemp = dirname(dirname(DirIn)) + + # Run the wrap function + wrap.envscn.temp.flags( + DirIn = DirIn, + DirOutBase = DirOutBase, + DirTemp = DirTemp, + DirSubCopy = c("data", "location", "threshold"), + log = NULL + ) + + # Check that output was created + expect_true(dir.exists(DirOutBase)) + + # Check that flags directory was created + flagsDir <- file.path(DirOutBase, "combined/tests/2025/10/17/conc-h2o-soil-salinity_GRSM001501/enviroscan/CFGLOC105245/flags") + expect_true(dir.exists(flagsDir)) + + # Check that flag file exists + flagFiles <- list.files(flagsDir, pattern = "flagsPlausibility.parquet") + expect_equal(length(flagFiles), 1) + + # Read and validate the output + flagData <- arrow::read_parquet(file.path(flagsDir, flagFiles[1])) + + # Check that tempTest columns were added + tempTestCols <- names(flagData)[grepl("tempTestDepth", names(flagData))] + expect_true(length(tempTestCols) == 8) + + # Check that flags have valid values (0, 1, or -1) + for (col in tempTestCols) { + expect_true(all(flagData[[col]] %in% c(-1L, 0L, 1L))) + } + + # Check that timestamps are present + expect_true("readout_time" %in% names(flagData)) + + # Cleanup + unlink(DirOutBase, recursive = TRUE) + } else { + skip("Test data not available") + } +}) diff --git a/modules/threshold_loader/requirements.txt b/modules/threshold_loader/requirements.txt index 166046be7..52c9e0845 100644 --- a/modules/threshold_loader/requirements.txt +++ b/modules/threshold_loader/requirements.txt @@ -1,2 +1,3 @@ -environs==6.0.0 +environs==11.0.0 +marshmallow==3.21.3 structlog==21.5.0 \ No newline at end of file diff --git a/modules/threshold_loader/tests/test_threshold_loader.py b/modules/threshold_loader/tests/test_threshold_loader.py index b681e9ecd..4f02e58bc 100644 --- a/modules/threshold_loader/tests/test_threshold_loader.py +++ b/modules/threshold_loader/tests/test_threshold_loader.py @@ -1,4 +1,21 @@ #!/usr/bin/env python3 +""" +Test suite for threshold_loader module. + +This test suite validates the threshold loading functionality with support for multiple contexts. + +UNIT TESTS (run by default with pytest): +- test_write_file: Basic threshold loading and JSON serialization +- test_exact_context_matching: Validates exact context matching (excludes partial/superset matches) +- test_multiple_contexts_filtering: Tests filtering with multiple context sets +- test_empty_context_handling: Tests 'none' context (empty context list) +- test_duplicate_threshold_handling: Verifies duplicate thresholds are deduplicated + +INTEGRATION TESTS (skipped by default, require database access): +- test_main: Backward compatibility with single CTXT environment variable +- test_main_new: New multi-context functionality (CTXT_1, CTXT_2, CTXT_3, ...) + +""" import os import json from pathlib import Path @@ -38,7 +55,7 @@ def get_thresholds(term) -> Iterator[Threshold]: number_value=10, string_value='value') - load_thresholds(get_thresholds, self.out_path, 'term_name', 'context1|context2') + load_thresholds(get_thresholds, self.out_path, 'term_name', ['context1|context2']) expected_path = self.out_path.joinpath('thresholds.json') self.assertTrue(expected_path.exists()) with open(expected_path, 'r') as threshold_file: @@ -69,8 +86,215 @@ def get_thresholds(term) -> Iterator[Threshold]: self.assertTrue(string_value == 'value') print(json.dumps(json_data, indent=2, sort_keys=False)) - @unittest.skip('Integration test skipped due to long process time.') + def test_exact_context_matching(self): + """Test that only thresholds with exact context matches are returned.""" + + def get_thresholds(term) -> Iterator[Threshold]: + # Exact match: soil|ion-content + yield Threshold( + threshold_name='exact_match', + term_name=term, + location_name='CPER', + context=['soil', 'ion-content'], + start_date='2024-01-01', + end_date=None, + is_date_constrained=False, + start_day_of_year=1, + end_day_of_year=365, + number_value=100.0, + string_value=None + ) + + # Partial match: only soil (should be excluded) + yield Threshold( + threshold_name='partial_match', + term_name=term, + location_name='CPER', + context=['soil'], + start_date='2024-01-01', + end_date=None, + is_date_constrained=False, + start_day_of_year=1, + end_day_of_year=365, + number_value=200.0, + string_value=None + ) + + # Superset: soil|ion-content|extra (should be excluded) + yield Threshold( + threshold_name='superset_match', + term_name=term, + location_name='CPER', + context=['soil', 'ion-content', 'extra'], + start_date='2024-01-01', + end_date=None, + is_date_constrained=False, + start_day_of_year=1, + end_day_of_year=365, + number_value=300.0, + string_value=None + ) + + load_thresholds(get_thresholds, self.out_path, 'term_name', ['soil|ion-content']) + expected_path = self.out_path.joinpath('thresholds.json') + + with open(expected_path, 'r') as threshold_file: + json_data = json.load(threshold_file) + thresholds = json_data['thresholds'] + + # Should have exactly 1 threshold + self.assertEqual(len(thresholds), 1) + self.assertEqual(thresholds[0]['threshold_name'], 'exact_match') + + def test_multiple_contexts_filtering(self): + """Test filtering with multiple context sets.""" + + def get_thresholds(term) -> Iterator[Threshold]: + # Matches first context + yield Threshold( + threshold_name='match_context1', + term_name=term, + location_name='CPER', + context=['soil', 'ion-content'], + start_date='2024-01-01', + end_date=None, + is_date_constrained=False, + start_day_of_year=1, + end_day_of_year=365, + number_value=100.0, + string_value=None + ) + + # Matches second context + yield Threshold( + threshold_name='match_context2', + term_name=term, + location_name='CPER', + context=['soil', 'water-content', 'factory'], + start_date='2024-01-01', + end_date=None, + is_date_constrained=False, + start_day_of_year=1, + end_day_of_year=365, + number_value=200.0, + string_value=None + ) + + # Matches neither + yield Threshold( + threshold_name='no_match', + term_name=term, + location_name='CPER', + context=['water', 'generic'], + start_date='2024-01-01', + end_date=None, + is_date_constrained=False, + start_day_of_year=1, + end_day_of_year=365, + number_value=999.0, + string_value=None + ) + + load_thresholds(get_thresholds, self.out_path, 'term_name', + ['soil|ion-content', 'soil|water-content|factory']) + expected_path = self.out_path.joinpath('thresholds.json') + + with open(expected_path, 'r') as threshold_file: + json_data = json.load(threshold_file) + thresholds = json_data['thresholds'] + + # Should have exactly 2 thresholds + self.assertEqual(len(thresholds), 2) + threshold_names = [t['threshold_name'] for t in thresholds] + self.assertIn('match_context1', threshold_names) + self.assertIn('match_context2', threshold_names) + self.assertNotIn('no_match', threshold_names) + + def test_empty_context_handling(self): + """Test handling of empty contexts (none).""" + + def get_thresholds(term) -> Iterator[Threshold]: + # No context + yield Threshold( + threshold_name='no_context', + term_name=term, + location_name='CPER', + context=[], + start_date='2024-01-01', + end_date=None, + is_date_constrained=False, + start_day_of_year=1, + end_day_of_year=365, + number_value=100.0, + string_value=None + ) + + # Has context (should be excluded) + yield Threshold( + threshold_name='has_context', + term_name=term, + location_name='CPER', + context=['soil'], + start_date='2024-01-01', + end_date=None, + is_date_constrained=False, + start_day_of_year=1, + end_day_of_year=365, + number_value=200.0, + string_value=None + ) + + load_thresholds(get_thresholds, self.out_path, 'term_name', ['none']) + expected_path = self.out_path.joinpath('thresholds.json') + + with open(expected_path, 'r') as threshold_file: + json_data = json.load(threshold_file) + thresholds = json_data['thresholds'] + + # Should have exactly 1 threshold with no context + self.assertEqual(len(thresholds), 1) + self.assertEqual(thresholds[0]['threshold_name'], 'no_context') + self.assertEqual(thresholds[0]['context'], []) + + def test_duplicate_threshold_handling(self): + """Test that duplicate thresholds are handled correctly.""" + + def get_thresholds(term) -> Iterator[Threshold]: + # Same threshold multiple times + for i in range(3): + yield Threshold( + threshold_name='duplicate_threshold', + term_name=term, + location_name='CPER', + context=['soil', 'ion-content'], + start_date='2024-01-01', + end_date='2024-12-31', + is_date_constrained=True, + start_day_of_year=1, + end_day_of_year=365, + number_value=100.0, + string_value=None + ) + + load_thresholds(get_thresholds, self.out_path, 'term_name', ['soil|ion-content']) + expected_path = self.out_path.joinpath('thresholds.json') + + with open(expected_path, 'r') as threshold_file: + json_data = json.load(threshold_file) + thresholds = json_data['thresholds'] + + # Should only have 1 threshold (duplicates removed) + self.assertEqual(len(thresholds), 1) + self.assertEqual(thresholds[0]['threshold_name'], 'duplicate_threshold') + + # ========== INTEGRATION TESTS (Database access required) ========== + # These tests are skipped by default to avoid requiring database credentials. + # To run them, remove the skip logic, install requirements, provide database credentials via environment variables, then run: + # python3 -m pytest threshold_loader/tests/test_threshold_loader.py -v + + @unittest.skip("Integration test - requires database access. See comment above for how to run.") def test_main(self): + """Test backward compatibility with single CTXT environment variable.""" self.configure_mount() os.environ['TERM'] = 'veloXaxs|veloYaxs|veloZaxs|veloSoni|tempSoni' os.environ['CTXT'] = '3Dwind' @@ -79,3 +303,17 @@ def test_main(self): threshold_loader_main.main() expected_path = Path(self.out_path, 'thresholds.json') self.assertTrue(expected_path.exists()) + + @unittest.skip("Integration test - requires database access. See comment above for how to run.") + def test_main_new(self): + """Test new multi-context functionality with CTXT_1, CTXT_2, CTXT_3 variables.""" + self.configure_mount() + os.environ['TERM'] = 'VSWCfactoryDepth02|VSICDepth02|VSWCsoilSpecificDepth02' + os.environ['CTXT_1'] = 'soil|ion-content' + os.environ['CTXT_2'] = 'soil|water-content|factory' + os.environ['CTXT_3'] = 'soil|water-content|soil-specific' + os.environ['OUT_PATH'] = str(self.out_path) + os.environ['LOG_LEVEL'] = 'DEBUG' + threshold_loader_main.main() + expected_path = Path(self.out_path, 'thresholds.json') + self.assertTrue(expected_path.exists()) \ No newline at end of file diff --git a/modules/threshold_loader/threshold_loader.py b/modules/threshold_loader/threshold_loader.py index 6cc801cbe..9402c2128 100644 --- a/modules/threshold_loader/threshold_loader.py +++ b/modules/threshold_loader/threshold_loader.py @@ -1,31 +1,55 @@ #!/usr/bin/env python3 from pathlib import Path import json -from typing import Callable, Iterator +from typing import Callable, Iterator, List from data_access.types.threshold import Threshold -def load_thresholds(get_thresholds: Callable[[str], Iterator[Threshold]], out_path: Path, term: str, context: str): +def load_thresholds(get_thresholds: Callable[[str], Iterator[Threshold]], out_path: Path, term: str, contexts: List[str]): """ - Write a threshold file into the output path. + Write a threshold file into the output path with combined results from multiple context sets. :param get_thresholds: Function yielding thresholds. :param out_path: The path for writing results. :param term: The term name. - :param context: The context code. + :param contexts: List of context strings (each with pipe-separated values). """ + # Create output directory if it doesn't exist + out_path.mkdir(parents=True, exist_ok=True) + with open(Path(out_path,'thresholds.json'), 'w') as file: - thresholds = [] - if context == 'none': - context_l = [] - else: - context_l = context.split("|") - for threshold in get_thresholds(term=term): - if threshold[3]: - if set(context_l).issubset(set(threshold[3])): - thresholds.append(threshold._asdict()) - threshold_data = {} - threshold_data.update({'thresholds': thresholds}) + all_thresholds = [] + seen = set() # Track unique thresholds to avoid duplicates + + # Get all thresholds once (generator, so materialize it to a list) + all_db_thresholds = list(get_thresholds(term=term)) + + # Process each context set + for context in contexts: + context_l = context.split("|") if context != 'none' else [] + + # Filter thresholds by this context + for threshold in all_db_thresholds: + threshold_contexts = threshold.context if threshold.context else [] + + # Exact context match: threshold must have exactly these contexts (no more, no less) + # If no context filter (empty list), only match thresholds with no contexts + if set(context_l) == set(threshold_contexts): + # Create unique key including dates to avoid losing seasonal thresholds + unique_key = ( + threshold.threshold_name, + threshold.term_name, + threshold.location_name, + threshold.start_date, + threshold.end_date, + threshold.start_day_of_year, + threshold.end_day_of_year + ) + if unique_key not in seen: + seen.add(unique_key) + all_thresholds.append(threshold._asdict()) + + threshold_data = {'thresholds': all_thresholds} json_data = json.dumps(threshold_data, indent=4, sort_keys=True, default=str) file.write(json_data) diff --git a/modules/threshold_loader/threshold_loader_main.py b/modules/threshold_loader/threshold_loader_main.py index 30266444d..402629fa6 100644 --- a/modules/threshold_loader/threshold_loader_main.py +++ b/modules/threshold_loader/threshold_loader_main.py @@ -18,15 +18,31 @@ def main() -> None: env = environs.Env() out_path: Path = env.path('OUT_PATH') term: str = env.str('TERM') - context: str = env.str('CTXT') + + # Read multiple context sets - support CTXT_1, CTXT_2, CTXT_3, etc. + contexts = [] + for i in range(1, 100): # Support up to 99 context sets + ctxt_var = f'CTXT_{i}' + context = env.str(ctxt_var, default=None) + if context: + contexts.append(context) + else: + break # Stop at first missing number + + # Fallback to single CTXT for backward compatibility + if not contexts: + context = env.str('CTXT', default='none') + contexts = [context] + log_level: str = env.log_level('LOG_LEVEL', 'INFO') log_config.configure(log_level) log = get_logger() log.debug(f'out_path: {out_path}') + log.debug(f'contexts: {contexts}') db_config = read_from_mount(Path('/var/db_secret')) with closing(DbConnector(db_config)) as connector: get_thresholds_partial = partial(get_thresholds, connector=connector) - load_thresholds(get_thresholds_partial, out_path, term=term, context=context) + load_thresholds(get_thresholds_partial, out_path, term=term, contexts=contexts) if __name__ == "__main__": diff --git a/modules_combined/analyze_pad_qaqc_envscn/Dockerfile b/modules_combined/analyze_pad_qaqc_envscn/Dockerfile new file mode 100644 index 000000000..2e0f410a5 --- /dev/null +++ b/modules_combined/analyze_pad_qaqc_envscn/Dockerfile @@ -0,0 +1,70 @@ +# Dockerfile for NEON IS Data Processing - Combined padded_timeseries_analyzer and Basic QA/QC module (plausibility) and enviroscan custom flagging +# Example command (must be run from project root directory to include both modules in Docker context): +# Build with the following command +# docker build --no-cache -t neon-is-qaqc-plau-envscn -f ./modules_combined/analyze_pad_qaqc_envsc/Dockerfile . + +# Start with the neon-is-pack-qaqc-r image. +FROM us-central1-docker.pkg.dev/neon-shared-service/neonscience/neon-is-pack-qaqc-r:v1.1.10 + +ARG MODULE_DIR="modules" +ARG APP_DIR_1="padded_timeseries_analyzer" +ARG APP_DIR_2="filter_joiner" +ARG COMMON_DIR="common" +ARG CONTAINER_APP_DIR="/usr/src/app" +ENV PYTHONPATH="${PYTHONPATH}:${CONTAINER_APP_DIR}" + +WORKDIR ${CONTAINER_APP_DIR} + +COPY ${MODULE_DIR}/${APP_DIR_1}/requirements.txt ${CONTAINER_APP_DIR}/${APP_DIR_1}/requirements.txt +COPY ${MODULE_DIR}/${APP_DIR_2}/requirements.txt ${CONTAINER_APP_DIR}/${APP_DIR_2}/requirements.txt + + +RUN apt update && \ + apt-get install -y --no-install-recommends \ + python3.8 && \ + apt install -y python3-pip && \ + python3 -mpip install --no-cache-dir --upgrade pip setuptools wheel && \ + python3 -mpip install --no-cache-dir -r ${CONTAINER_APP_DIR}/${APP_DIR_1}/requirements.txt && \ + python3 -mpip install --no-cache-dir -r ${CONTAINER_APP_DIR}/${APP_DIR_2}/requirements.txt && \ + apt-get autoremove -y && \ + apt-get autoclean -y && \ + rm -rf /var/lib/apt/lists/* + +# Copy in python code +COPY ${MODULE_DIR}/${APP_DIR_1} ${CONTAINER_APP_DIR}/${APP_DIR_1} +COPY ${MODULE_DIR}/${APP_DIR_2} ${CONTAINER_APP_DIR}/${APP_DIR_2} +COPY ${MODULE_DIR}/${COMMON_DIR} ${CONTAINER_APP_DIR}/${COMMON_DIR} + +# Build in the threshold selection module +ARG MODULE_DIR="flow" +ARG APP_DIR="flow.qaqc.plau" + +# Copy the lockfile and restore known working versions of R dependency packages +COPY ./${MODULE_DIR}/${APP_DIR}/renv.lock ./renv.lock +RUN R -e 'renv::restore(lockfile="./renv.lock")' + +# Copy in application code +COPY ./${MODULE_DIR}/${APP_DIR}/wrap.qaqc.plau.R . +COPY ./${MODULE_DIR}/${APP_DIR}/flow.qaqc.plau.R . + +# Create app user +RUN groupadd appuser && \ + useradd appuser -g appuser + +# Build in the custom radiation flags +ARG APP_DIR2="flow.envscn.temp.flags" + +# Copy the lockfile and restore known working versions of R dependency packages +COPY ./${MODULE_DIR}/${APP_DIR2}/renv.lock ./renv.lock2 +RUN R -e 'renv::restore(lockfile="./renv.lock2")' + +# Copy in application code +COPY ./${MODULE_DIR}/${APP_DIR2}/wrap.envscn.temp.flags.R . +COPY ./${MODULE_DIR}/${APP_DIR2}/flow.envscn.temp.flags.R . +COPY ./${MODULE_DIR}/${APP_DIR2}/def.apply.temp.flags.R . +COPY ./${MODULE_DIR}/${APP_DIR2}/def.calc.temp.flags.R . +COPY ./${MODULE_DIR}/${APP_DIR2}/def.find.temp.sensor.R . +COPY ./${MODULE_DIR}/${APP_DIR2}/def.load.temp.sensors.R . +COPY ./${MODULE_DIR}/${APP_DIR2}/def.sort.qf.cols.R . +# Run as app user +USER appuser diff --git a/pipe/concH2oSoilSalinity/concH2oSoilSalinity_analyze_pad_qaqc_join_custom.yaml b/pipe/concH2oSoilSalinity/concH2oSoilSalinity_analyze_pad_qaqc_join_custom.yaml new file mode 100644 index 000000000..ba82648f7 --- /dev/null +++ b/pipe/concH2oSoilSalinity/concH2oSoilSalinity_analyze_pad_qaqc_join_custom.yaml @@ -0,0 +1,164 @@ +--- +pipeline: + name: concH2oSoilSalinity_analyze_pad_qaqc_join_custom +transform: + image_pull_secrets: + - battelleecology-quay-read-all-pull-secret + image: us-central1-docker.pkg.dev/neon-shared-service/neonscience/neon-is-qaqc-plau-envscn:sha-c97793e + cmd: + - sh + - "-c" + - |- + /bin/bash <<'EOF' + + # Use bash-scrict mode. See http://redsymbol.net/articles/unofficial-bash-strict-mode/ + set -euo pipefail + IFS=$'\n\t' + + echo "=== Starting pipeline ===" + + # Refresh interim directories with each datum (otherwise they persist and cause probs) + rm -rf /tmp/pfs/padded_analyzer + rm -rf /tmp/pfs/padded_analyzerCopy + mkdir -p /tmp/pfs/padded_analyzer + + rm -rf /tmp/qaqc_plau + rm -rf /tmp/qaqc_plauCopy + mkdir -p /tmp/qaqc_plau + + rm -rf /tmp/pfs/joined_data + rm -rf /tmp/pfs/joined_dataCopy + mkdir -p /tmp/pfs/joined_data + + # ---- Run first module - padded_timeseries_analyzer ---- + # This validates the padded data from thresh_select_ts_pad has complete manifests + + echo "=== Running padded_timeseries_analyzer ===" + # set outpath for pad analyzer + export OUT_PATH=/tmp/pfs/padded_analyzer + + python3 -m padded_timeseries_analyzer.padded_timeseries_analyzer.padded_timeseries_analyzer_main + + # Copy output to another interim folder to destroy links (cannot daisy chain links from pfs input to output) + cp -rL /tmp/pfs/padded_analyzer /tmp/pfs/padded_analyzerCopy || : # Allow to fail without exit code (happens if step above produced no output) + rm -r -f /tmp/pfs/padded_analyzer + + echo "=== Padded analyzer complete ===" + + # Run second module - qaqc plausibility + + Rscript ./flow.qaqc.plau.R \ + DirIn=/tmp/pfs/padded_analyzerCopy \ + DirOut=/tmp/qaqc_plau \ + DirErr=/pfs/out/errored_datums \ + "TermTest1=VSICDepth02:null|gap|range(rmv)|step(rmv)|persistence(rmv)|spike(rmv)" \ + "TermTest2=VSICDepth03:null|gap|range(rmv)|step(rmv)|persistence(rmv)|spike(rmv)" \ + "TermTest3=VSICDepth04:null|gap|range(rmv)|step(rmv)|persistence(rmv)|spike(rmv)" \ + "TermTest4=VSICDepth05:null|gap|range(rmv)|step(rmv)|persistence(rmv)|spike(rmv)" \ + "TermTest5=VSICDepth06:null|gap|range(rmv)|step(rmv)|persistence(rmv)|spike(rmv)" \ + "TermTest6=VSICDepth07:null|gap|range(rmv)|step(rmv)|persistence(rmv)|spike(rmv)" \ + "TermTest7=VSICDepth08:null|gap|range(rmv)|step(rmv)|persistence(rmv)|spike(rmv)" \ + "TermTest8=VSICDepth01:null|gap|range(rmv)|step(rmv)|persistence(rmv)|spike(rmv)" \ + "TermTest9=VSWCfactoryDepth02:null|gap|range(rmv)|step(rmv)|persistence(rmv)|spike(rmv)" \ + "TermTest10=VSWCfactoryDepth03:null|gap|range(rmv)|step(rmv)|persistence(rmv)|spike(rmv)" \ + "TermTest11=VSWCfactoryDepth04:null|gap|range(rmv)|step(rmv)|persistence(rmv)|spike(rmv)" \ + "TermTest12=VSWCfactoryDepth05:null|gap|range(rmv)|step(rmv)|persistence(rmv)|spike(rmv)" \ + "TermTest13=VSWCfactoryDepth06:null|gap|range(rmv)|step(rmv)|persistence(rmv)|spike(rmv)" \ + "TermTest14=VSWCfactoryDepth07:null|gap|range(rmv)|step(rmv)|persistence(rmv)|spike(rmv)" \ + "TermTest15=VSWCfactoryDepth08:null|gap|range(rmv)|step(rmv)|persistence(rmv)|spike(rmv)" \ + "TermTest16=VSWCfactoryDepth01:null|gap|range(rmv)|step(rmv)|persistence(rmv)|spike(rmv)" \ + "TermTest17=VSWCsoilSpecificDepth02:null|gap|range(rmv)|step(rmv)|persistence(rmv)|spike(rmv)" \ + "TermTest18=VSWCsoilSpecificDepth03:null|gap|range(rmv)|step(rmv)|persistence(rmv)|spike(rmv)" \ + "TermTest19=VSWCsoilSpecificDepth04:null|gap|range(rmv)|step(rmv)|persistence(rmv)|spike(rmv)" \ + "TermTest20=VSWCsoilSpecificDepth05:null|gap|range(rmv)|step(rmv)|persistence(rmv)|spike(rmv)" \ + "TermTest21=VSWCsoilSpecificDepth06:null|gap|range(rmv)|step(rmv)|persistence(rmv)|spike(rmv)" \ + "TermTest22=VSWCsoilSpecificDepth07:null|gap|range(rmv)|step(rmv)|persistence(rmv)|spike(rmv)" \ + "TermTest23=VSWCsoilSpecificDepth08:null|gap|range(rmv)|step(rmv)|persistence(rmv)|spike(rmv)" \ + "TermTest24=VSWCsoilSpecificDepth01:null|gap|range(rmv)|step(rmv)|persistence(rmv)|spike(rmv)" \ + "DirSubCopy=location|threshold" + + # Copy output to another interim folder to destroy links (cannot daisy chain links from pfs input to output) + cp -rL /tmp/qaqc_plau /tmp/qaqc_plauCopy || : # Allow to fail without exit code (happens if step above produced no output) + rm -r -f /tmp/qaqc_plau + + # ---- Run third module - filter-joiner ---- + # Now join the base qc data with temperature data to prep for second test + + echo "=== Running filter_joiner to add temperature data ===" + export DATA_PATH=/tmp/qaqc_plauCopy + export OUT_PATH=/tmp/pfs/joined_data + python3 -m filter_joiner.filter_joiner_main + + cp -rL /tmp/pfs/joined_data /tmp/pfs/joined_dataCopy || : # Allow to fail without exit code (happens if step above produced no output) + rm -r -f /tmp/pfs/joined_data + + echo "=== Filter_joiner complete ===" + + Rscript ./flow.envscn.temp.flags.R \ + DirIn=/tmp/pfs/joined_dataCopy \ + DirOut=/pfs/out \ + DirErr=/pfs/out/errored_datums \ + "DirSubCopy=data|location|flags" \ + SchmQf=$SCHEMA_FLAGS + + + EOF + env: + # Environment variables for padded timeseries analyzer + LOG_LEVEL: DEBUG + ERR_PATH: /pfs/out/errored_datums + RELATIVE_PATH_INDEX: "3" + LINK_TYPE: COPY + # Environment variables for filter-joiner + CONFIG: | + --- + # Join validated padded data with temperature data + input_paths: + - path: + name: QAQC_DATA + # Filter validated output from qaqc + ##NOTE: Filter joiner came after qaqc, so no /pfs/ in glob to keep indices in line + glob_pattern: /tmp/qaqc_plauCopy/*/*/*/*/** + # Join on Y/M/D/group + join_indices: [3,4,5,6] + - path: + name: TEMP_PATH + # Filter for temperature data + glob_pattern: /pfs/TEMP_PATH/*/*/*/*/temp-soil*/** + # Join on named location (already joined below by day) + join_indices: [3,4,5,6] +input: + cross: + - pfs: + name: SCHEMA_FLAGS + repo: concH2oSoilSalinity_avro_schemas + glob: /concH2oSoilSalinity/concH2oSoilSalinity_flags_plausibility.avsc + - join: + - pfs: + name: DATA_PATH + repo: concH2oSoilSalinity_thresh_select_ts_pad + glob: /(*)/(*)/(*) + joinOn: $1/$2/$3 + - pfs: + name: TEMP_PATH + repo: concH2oSoilSalinity_group_path + glob: /(*)/(*)/(*) + joinOn: $1/$2/$3 + empty_files: false +parallelism_spec: + constant: 5 +autoscaling: true +resource_requests: + memory: 2G + cpu: 5.5 +resource_limits: + memory: 4G + cpu: 7 +sidecar_resource_requests: + memory: 3G + cpu: 0.3 +datum_set_spec: + number: 1 +scheduling_spec: + node_selector: + cloud.google.com/compute-class: pach-pipeline-class diff --git a/pipe/concH2oSoilSalinity/concH2oSoilSalinity_group_assignment.yaml b/pipe/concH2oSoilSalinity/concH2oSoilSalinity_group_assignment.yaml index 68cd56acb..c00f96896 100644 --- a/pipe/concH2oSoilSalinity/concH2oSoilSalinity_group_assignment.yaml +++ b/pipe/concH2oSoilSalinity/concH2oSoilSalinity_group_assignment.yaml @@ -23,7 +23,7 @@ input: - pfs: name: DIR_IN repo: concH2oSoilSalinity_group_loader - glob: /aspirated-single/* + glob: /conc-h2o-soil-salinity/* - pfs: name: FILE_YEAR repo: enviroscan_cron_daily_and_date_control diff --git a/pipe/concH2oSoilSalinity/concH2oSoilSalinity_group_path.yaml b/pipe/concH2oSoilSalinity/concH2oSoilSalinity_group_path.yaml new file mode 100644 index 000000000..b83592a0d --- /dev/null +++ b/pipe/concH2oSoilSalinity/concH2oSoilSalinity_group_path.yaml @@ -0,0 +1,71 @@ +--- +pipeline: + name: concH2oSoilSalinity_group_path +transform: + image: us-central1-docker.pkg.dev/neon-shared-service/neonscience/neon-is-group-path:v1.0.1 + cmd: + - /bin/bash + stdin: + - '#!/bin/bash' + - python3 -m group_path.group_path_main + env: + GROUP: conc-h2o-soil-salinity_ + LOG_LEVEL: INFO + OUT_PATH: /pfs/out + # ERR_PATH can be changed, it is user specified + ERR_PATH: /pfs/out/errored_datums + GROUP_ASSIGNMENT_YEAR_INDEX: '4' + GROUP_ASSIGNMENT_MONTH_INDEX: '5' + GROUP_ASSIGNMENT_DAY_INDEX: '6' + GROUP_ASSIGNMENT_MEMBER_INDEX: '7' + GROUP_ASSIGNMENT_DATA_TYPE_INDEX: '8' + LOCATION_FOCUS_SOURCE_TYPE_INDEX: '3' + LOCATION_FOCUS_YEAR_INDEX: '4' + LOCATION_FOCUS_MONTH_INDEX: '5' + LOCATION_FOCUS_DAY_INDEX: '6' + LOCATION_FOCUS_LOCATION_INDEX: '7' + LOCATION_FOCUS_DATA_TYPE_INDEX: '8' + GROUP_FOCUS_YEAR_INDEX: '3' + GROUP_FOCUS_MONTH_INDEX: '4' + GROUP_FOCUS_DAY_INDEX: '5' + GROUP_FOCUS_GROUP_INDEX: '6' +input: +# The input to the group_path module must be a join between the group_assignment module and the union of any/all +# data repos that are currently in a location focus structure or a (different/L1+ dependency) group focus structure + join: + - pfs: + # name must be GROUP_ASSIGNMENT_PATH + name: GROUP_ASSIGNMENT_PATH + repo: concH2oSoilSalinity_group_assignment + glob: /conc-h2o-soil-salinity/(2025/10/(16|17|18)) + joinOn: $1 + outer_join: True + - pfs: + name: LOCATION_FOCUS_PATH + repo: enviroscan_fill_date_gaps_and_regularize + glob: /*/(2025/10/(16|17|18)) + joinOn: $1 + outer_join: True + - pfs: + name: GROUP_FOCUS_PATH + repo: tempSoil_level1_group_consolidate_srf + glob: /(2025/10/(16|17|18)) + joinOn: $1 + outer_join: True +parallelism_spec: + constant: 5 +autoscaling: true +resource_requests: + memory: 600M + cpu: 0.4 +resource_limits: + memory: 2G + cpu: 1.2 +sidecar_resource_requests: + memory: 3G + cpu: 1 +datum_set_spec: + number: 1 +scheduling_spec: + node_selector: + cloud.google.com/compute-class: pach-pipeline-class diff --git a/pipe/concH2oSoilSalinity/concH2oSoilSalinity_thresh_select_ts_pad.yaml b/pipe/concH2oSoilSalinity/concH2oSoilSalinity_thresh_select_ts_pad.yaml new file mode 100644 index 000000000..38742856d --- /dev/null +++ b/pipe/concH2oSoilSalinity/concH2oSoilSalinity_thresh_select_ts_pad.yaml @@ -0,0 +1,90 @@ +--- +pipeline: + name: concH2oSoilSalinity_thresh_select_ts_pad +transform: + image: us-central1-docker.pkg.dev/neon-shared-service/neonscience/neon-is-thsh-slct-ts-pad:v2.2.0 + cmd: + - sh + - "-c" + - |- + /bin/bash <<'EOF' + # Use bash-scrict mode. See http://redsymbol.net/articles/unofficial-bash-strict-mode/ + set -euo pipefail + IFS=$'\n\t' + # Refresh interim directories with each datum (otherwise they persist and cause probs) + rm -rf /tmp/threshold_select + rm -rf /tmp/threshold_selectCopy + mkdir -p /tmp/threshold_select + # Run first module - threshold_select + Rscript ./flow.thsh.slct.R \ + DirIn=$REPO_LOCATIONS \ + DirOut=/tmp/threshold_select \ + DirErr=/pfs/out/errored_datums \ + FileThsh=$FILE_THRESHOLDS \ + "TermCtxt1=VSICDepth02|soil|ion-content" \ + "TermCtxt2=VSICDepth03|soil|ion-content" \ + "TermCtxt3=VSICDepth04|soil|ion-content" \ + "TermCtxt4=VSICDepth05|soil|ion-content" \ + "TermCtxt5=VSICDepth06|soil|ion-content" \ + "TermCtxt6=VSICDepth07|soil|ion-content" \ + "TermCtxt7=VSICDepth08|soil|ion-content" \ + "TermCtxt8=VSICDepth01|soil|ion-content" \ + "TermCtxt9=VSWCfactoryDepth02|soil|water-content|factory" \ + "TermCtxt10=VSWCfactoryDepth03|soil|water-content|factory" \ + "TermCtxt11=VSWCfactoryDepth04|soil|water-content|factory" \ + "TermCtxt12=VSWCfactoryDepth05|soil|water-content|factory" \ + "TermCtxt13=VSWCfactoryDepth06|soil|water-content|factory" \ + "TermCtxt14=VSWCfactoryDepth07|soil|water-content|factory" \ + "TermCtxt15=VSWCfactoryDepth08|soil|water-content|factory" \ + "TermCtxt16=VSWCfactoryDepth01|soil|water-content|factory" \ + "TermCtxt17=VSWCsoilSpecificDepth02|soil|water-content|soil-specific" \ + "TermCtxt18=VSWCsoilSpecificDepth03|soil|water-content|soil-specific" \ + "TermCtxt19=VSWCsoilSpecificDepth04|soil|water-content|soil-specific" \ + "TermCtxt20=VSWCsoilSpecificDepth05|soil|water-content|soil-specific" \ + "TermCtxt21=VSWCsoilSpecificDepth06|soil|water-content|soil-specific" \ + "TermCtxt22=VSWCsoilSpecificDepth07|soil|water-content|soil-specific" \ + "TermCtxt23=VSWCsoilSpecificDepth08|soil|water-content|soil-specific" \ + "TermCtxt24=VSWCsoilSpecificDepth01|soil|water-content|soil-specific" \ + "DirSubCopy=data|location|uncertainty_coef|uncertainty_data" + # Copy output to another interim folder to destroy links (cannot daisy chain links from pfs input to output) + cp -rL /tmp/threshold_select /tmp/threshold_selectCopy || : # Allow to fail without exit code (happens if step above produced no output) + rm -r -f /tmp/threshold_select + # Run second module - timeseries_padder + python3 -m timeseries_padder.timeseries_padder.variable_pad_main --yearindex 3 --monthindex 4 --dayindex 5 --locindex 8 --subdirindex 9 + EOF + env: + DATA_PATH: /tmp/threshold_selectCopy + OUT_PATH: /pfs/out + LOG_LEVEL: INFO + PAD_DIR: data + COPY_DIR: location,uncertainty_coef,uncertainty_data # Can be multiple, separated by commas without spaces. Directories other than the pad directory to copy to the output + RELATIVE_PATH_INDEX: '3' + PARALLELIZATION_INTERNAL: '5' # For threshold select module +output_branch: master +input: + cross: + - pfs: + name: REPO_LOCATIONS + repo: concH2oSoilSalinity_group_path + glob: /*/*/*/*/enviroscan + - pfs: + name: FILE_THRESHOLDS + repo: concH2oSoilSalinity_threshold + glob: /thresholds.json +parallelism_spec: + constant: 5 +autoscaling: true +resource_requests: + memory: 1.5G + cpu: 5.5 +resource_limits: + memory: 3G + cpu: 6.5 +sidecar_resource_requests: + memory: 4G + cpu: 1 +datum_set_spec: + number: 1 +scheduling_spec: + node_selector: + cloud.google.com/compute-class: pach-pipeline-class diff --git a/pipe/concH2oSoilSalinity/concH2oSoilSalinity_threshold.yaml b/pipe/concH2oSoilSalinity/concH2oSoilSalinity_threshold.yaml new file mode 100644 index 000000000..577088ef1 --- /dev/null +++ b/pipe/concH2oSoilSalinity/concH2oSoilSalinity_threshold.yaml @@ -0,0 +1,41 @@ +--- +pipeline: + name: concH2oSoilSalinity_threshold +transform: + # image_pull_secrets: + # - battelleecology-quay-read-all-pull-secret + image: us-central1-docker.pkg.dev/neon-shared-service/neonscience/neon-is-threshold-loader:sha-efbad02 + cmd: + - /bin/bash + stdin: + - '#!/bin/bash' + - python3 -m threshold_loader.threshold_loader_main + env: + OUT_PATH: /pfs/out + LOG_LEVEL: INFO + TERM: VSICDepth01|VSICDepth02|VSICDepth03|VSICDepth04|VSICDepth05|VSICDepth06|VSICDepth07|VSICDepth08|VSWCfactoryDepth01|VSWCfactoryDepth02|VSWCfactoryDepth03|VSWCfactoryDepth04|VSWCfactoryDepth05|VSWCfactoryDepth06|VSWCfactoryDepth07|VSWCfactoryDepth08|VSWCsoilSpecificDepth01|VSWCsoilSpecificDepth02|VSWCsoilSpecificDepth03|VSWCsoilSpecificDepth04|VSWCsoilSpecificDepth05|VSWCsoilSpecificDepth06|VSWCsoilSpecificDepth07|VSWCsoilSpecificDepth08 + #if you are pulling multiple term and they have different contexts, list them here numerically. + CTXT_1: soil|ion-content + CTXT_2: soil|water-content|factory + CTXT_3: soil|water-content|soil-specific + secrets: + - name: pdr-secret + mount_path: /var/db_secret +input: + pfs: + repo: enviroscan_cron_daily_and_date_control_tick + glob: /* + empty_files: true +autoscaling: true +resource_requests: + memory: 32M + cpu: 0.05 +resource_limits: + memory: 200M + cpu: 0.5 +sidecar_resource_requests: + memory: 120M + cpu: 0.1 +scheduling_spec: + node_selector: + cloud.google.com/compute-class: pach-pipeline-class \ No newline at end of file diff --git a/pipe/concH2oSoilSalinity/pipe_list_concH2oSoilSalinity.txt b/pipe/concH2oSoilSalinity/pipe_list_concH2oSoilSalinity.txt new file mode 100644 index 000000000..ba6815195 --- /dev/null +++ b/pipe/concH2oSoilSalinity/pipe_list_concH2oSoilSalinity.txt @@ -0,0 +1,6 @@ +concH2oSoilSalinity_group_loader.yaml +concH2oSalinity_group_assignment.yaml +concH2oSalinity_group_path.yaml +concH2oSalinity_threshold.yaml +concH2oSalinity_thresh_select_ts_pad.yaml +concH2oSalinity_analyze_pad_qaqc_join_custom.yaml \ No newline at end of file diff --git a/pipe/enviroscan/pipe_list_enviroscan_development.txt b/pipe/enviroscan/pipe_list_enviroscan_development.txt index 19346723d..e124f4052 100644 --- a/pipe/enviroscan/pipe_list_enviroscan_development.txt +++ b/pipe/enviroscan/pipe_list_enviroscan_development.txt @@ -7,4 +7,7 @@ enviroscan_calibration_assignment.yaml enviroscan_calibration_group_and_convert.yaml enviroscan_location_asset.yaml enviroscan_location_asset_assignment.yaml -enviroscan_location_group_and_restructure.yaml \ No newline at end of file +enviroscan_location_group_and_restructure.yaml +enviroscan_location_loader.yaml +enviroscan_location_active_dates_assignment.yaml +enviroscan_fill_date_gaps_and_regularize.yaml