Introduction to Fluxtools

Kesondra Key

2025-08-27

library(fluxtools)
## Welcome to fluxtools V0.6.0
## 
## To start the app: run_fluxtools()
## To apply Physical Range Module (PRM) filters: use apply_prm()
## 
## For additional help: see ?run_fluxtools, ?apply_prm, browseVignettes('fluxtools')
## To view citation: citation('fluxtools')

Overview

fluxtools is an R package that provides an interactive Shiny‐based QA/QC environment to explore or remove data in the AmeriFlux BASE (or Fluxnet) format. In just a few clicks, you can:

  1. Upload eddy covariance data in a .csv format (AmeriFlux standard naming and timestamp conventions)
  2. Visualize any two numeric columns against time (or each other)
  3. Highlight statistical outliers (±σ from a linear fit) and add them to your point-removal R code
  4. Manually select and remove data points via a lasso or box. Selecting these adds to the accumulated removal code
  5. Copy and paste the generated code into your own R script for reproducible QA/QC
  6. Download a “cleaned” CSV with excluded values (using “apply removals”) set to NA and an R script for reproducibility

This vignette shows you how to install, launch, and use the main Shiny app—run_flux_qaqc()—and walks through a typical workflow.


Installation

You can install fluxtools from CRAN, or directly from GitHub:

# Install from CRAN 
install.packages("fluxtools")

# Install from GitHub
library(devtools) 
devtools::install_github("kesondrakey/fluxtools")

Launching the Shiny App

Load fluxtools and launch the QA/QC application:

library(fluxtools)

# Run the app
run_fluxtools()

Example workflow

  1. Upload: Select your AmeriFlux-style CSV (e.g., US_VT1_HH_202401010000_202501010000.csv). Files can be up to 1GB (larger file sizes might be harder on the Shiny interface)

  2. Choose Year(s): By default “all” is selected, but you can subset to specific years

  3. Choose variables: TIMESTAMP_START is on the x-axis by default. Change the y-axis to your variable of interest (e.g., FC_1_1_1). The generated R code focuses on removing the y-axis variable

  4. Select data: Use the box or lasso to select points. This populates the “Current” code box with something like:

   df <- df %>%
     mutate(
       FC_1_1_1 = case_when(
         TIMESTAMP_START == '202401261830' ~ NA_real_,
         TIMESTAMP_START == '202401270530' ~ NA_real_,

         TRUE ~ FC_1_1_1
       )
     )
  1. Flag data and Accumulate code: With points still selected, click “Flag data.” Selected points turn orange, and code is appended to the “Accumulated” box, allowing multiple selections per session.

  2. Unflag data: Use the box or lasso to de-select points and remove from the Accumulated code box.

  3. Clear Selection: To reset all selections from the current y-variable, click “Clear Selection” to reset the current view.

  4. Switch variables: Change y to any other variable (e.g., SWC_1_1_1) and select more points. Click “Flag data” Code for both variables to appear:

   df <- df %>%
     mutate(
       FC_1_1_1 = case_when(
         TIMESTAMP_START == '202401261830' ~ NA_real_,
         TIMESTAMP_START == '202401270530' ~ NA_real_,

         TRUE ~ FC_1_1_1
       )
     )

   df <- df %>%
     mutate(
       SWC_1_1_1 = case_when(
         TIMESTAMP_START == '202403261130' ~ NA_real_,
         TIMESTAMP_START == '202403270800' ~ NA_real_,

         TRUE ~ SWC_1_1_1
       )
     )
  1. Compare variables: Change to variables you would like to compare (e.g., change y to TA_1_1_1 and x to T_SONIC_1_1_1). The app computes an R² via simple linear regression. The top R² is based on points before removals, and once data is selected, a second R² will pop up - calculating the linear regression assuming the selected points have been removed

  2. Highlight outliers: Use the slider to select ±σ residuals. Click “Select all ±σ outliers” to append them to the Accumulated code. Click “Clear ±σ outliers” to deselect and remove from the code box

  3. Copy all: Click the Copy Icon to the right of the current or accumulated code box and paste into your own R script for documentation

  4. Apply Removals: Click “Apply Removals” to remove each selected data points, from the current y-variable, to replace points with NA in a new .csv (raw data is unaffected), available using ‘export cleaned data’ and remove these values from view

  5. Reload original data: Make a mistake or want a fresh start? Click Reload original data to reload the .csv from above to start over

  6. Export cleaned data: Download a ZIP containing:

Physical Boundary Module (PRM) function:

The Physical Range Module (PRM) removes out-of-range values to NA based on similar variables using patterns like ^SWC($|_) or ^P($|_).
Columns containing "QC" are skipped by default. No columns are removed.

Source of ranges: AmeriFlux Technical Documents, Table A1 (Physical Range Module).

Quick start

# tiny demo dataset with a few out-of-range values
set.seed(1)
df <- tibble::tibble(
  TIMESTAMP_START = seq.POSIXt(as.POSIXct("2024-01-01", tz = "UTC"),
                               length.out = 10, by = "30 min"),
  SWC_1_1_1 = c(10, 20, 150, NA, 0.5, 99, 101, 50, 80, -3),  # bad: 150, 101, -3; 0.5 triggers SWC unit note
  P         = c(0, 10, 60, NA, 51, 3, 0, 5, 100, -1),        # bad: 60, 51, 100, -1
  RH_1_1_1  = c(10, 110, 50, NA, 0, 100, -5, 101, 75, 30),   # bad: 110, -5, 101
  SWC_QC    = sample(0:2, 10, replace = TRUE)                # QC col should be ignored
)

# To see the Physical Boundary Module (PRM) rules:
get_prm_rules()

#Apply filter to all relevant variables
res <- apply_prm(df)

# PRM summary (counts and % replaced per column)
res$summary

# Only set range for SWC 
df_filtered_swc <- apply_prm(df, include = "SWC")

# Only set range for SWC + P 
df_filtered_swc_P <- apply_prm(df, include = c("SWC", "P"))

Physical Range Module Values

Variable Min Max Description Units
COND_WATER 0 10000 Conductivity of water uS cm^-1
DO 0 NA Dissolved oxygen in water umol L^-1
PCH4 0 NA Dissolved methane (CH4) in water nmolCH4 mol^-1
PCO2 0 10000 Dissolved carbon dioxide (CO2) in water umolCO2 mol^-1
PN2O 0 NA Dissolved nitrous oxide (N2O) in water nmolN2O mol^-1
PPFD_UW_IN 0 2400 Photosynthetic photon flux density, underwater, incoming umolPhotons m^-2 s^-1
TW -20 50 Water temperature deg C
DBH 0 500 Tree diameter at breast height cm
LEAF_WET 0 100 Leaf wetness (0-100) %
SAP_DT -10 10 Sapflow probe temperature difference deg C
T_BOLE -50 70 Bole temperature deg C
T_CANOPY -50 70 Canopy/surface temperature deg C
CH4 0 15000 Methane (CH4) mole fraction (wet air) nmolCH4 mol^-1
CH4_MIXING_RATIO 0 15000 Methane (CH4) mole fraction (dry air) nmolCH4 mol^-1
CO 0 NA Carbon monoxide (CO) mole fraction (wet air) nmolCO mol^-1
CO2 150 1200 Carbon dioxide (CO2) mole fraction (wet air) umolCO2 mol^-1
CO2_SIGMA 0 150 Std. dev. of CO2 mole fraction (wet air) umolCO2 mol^-1
CO2C13 NA -6 Stable isotope delta13C of CO2 (permil) permil
FC -100 100 CO2 turbulent flux (no storage correction) umolCO2 m^-2 s^-1
FCH4 -500 4000 CH4 turbulent flux (no storage correction) nmolCH4 m^-2 s^-1
H2O 0 100 Water vapor in mole fraction (wet air) mmolH2O mol^-1
H2O_MIXING_RATIO 0 100 Water vapor in mole fraction (dry air) mmolH2O mol^-1
H2O_SIGMA 0 15 Std. dev. of water vapor mole fraction mmolH2O mol^-1
N2O 0 NA N2O mole fraction (wet air) nmolN2O mol^-1
N2O_MIXING_RATIO 0 NA N2O mole fraction (dry air) nmolN2O mol^-1
NO 0 NA NO mole fraction (wet air) nmolNO mol^-1
NO2 0 NA NO2 mole fraction (wet air) nmolNO2 mol^-1
O3 0 NA O3 mole fraction (wet air) nmolO3 mol^-1
SC -100 100 CO2 storage flux umolCO2 m^-2 s^-1
SO2 0 NA SO2 mole fraction (wet air) nmolSO2 mol^-1
FH2O -10 20 Water vapor (H2O) turbulent flux (no storage correction) mmolH2O m^-2 s^-1
G -250 400 Soil heat flux W m^-2
H -450 900 Sensible heat flux (no storage correction) W m^-2
LE -450 900 Latent heat flux (no storage correction) W m^-2
SG -100 250 Soil heat storage flux above plates W m^-2
SH -150 150 Sensible heat storage flux W m^-2
SLE -150 150 Latent heat storage flux W m^-2
PA 60 105 Atmospheric pressure kPa
PBLH 0 3000 Planetary boundary layer height m
RH 0 100 Relative humidity (0-100) %
T_SONIC -50 50 Sonic temperature deg C
T_SONIC_SIGMA 0 5 Std. dev. of sonic temperature deg C
TA -50 50 Air temperature deg C
VPD 0 80 Vapor pressure deficit hPa
D_SNOW 0 500 Snow depth cm
P 0 50 Precipitation mm
P_RAIN 0 50 Rainfall mm
P_SNOW 0 50 Snowfall mm
RUNOFF 0 200 Runoff mm
STEMFLOW 0 200 Stemflow mm
THROUGHFALL 0 20 Throughfall mm
ALB 0 100 Albedo (0-100) %
APAR 0 2300 Absorbed PAR umolPhoton m^-2 s^-1
EVI -1 1 Enhanced Vegetation Index nondimensional
FAPAR 0 100 Fraction of absorbed PAR (0-100) %
FIPAR 0 100 Fraction of intercepted PAR (0-100) %
LW_BC_IN 50 600 Longwave radiation, below canopy incoming W m^-2
LW_BC_OUT 100 750 Longwave radiation, below canopy outgoing W m^-2
LW_IN 50 600 Longwave radiation, incoming W m^-2
LW_OUT 100 750 Longwave radiation, outgoing W m^-2
MCRI 0 10 Carotenoid Reflectance Index nondimensional
MTCI 0 10 MERIS Terrestrial Chlorophyll Index nondimensional
NDVI -1 1 Normalized Difference Vegetation Index nondimensional
NETRAD -200 1100 Net radiation W m^-2
NIRV 0 2 Near Infrared Vegetation Index W m^-2 sr^-1 nm^-1
PPFD_BC_IN 0 2400 PPFD, below canopy incoming umolPhoton m^-2 s^-1
PPFD_BC_OUT 0 2000 PPFD, below canopy outgoing umolPhoton m^-2 s^-1
PPFD_DIF 0 1400 PPFD, diffuse incoming umolPhoton m^-2 s^-1
PPFD_DIR 0 2400 PPFD, direct incoming umolPhoton m^-2 s^-1
PPFD_IN 0 2400 PPFD, incoming umolPhoton m^-2 s^-1
PPFD_OUT 0 2000 PPFD, outgoing umolPhoton m^-2 s^-1
PRI -1 1 Photochemical Reflectance Index nondimensional
R_UVA 0 85 UVA radiation, incoming W m^-2
R_UVB 0 20 UVB radiation, incoming W m^-2
REDCI 0 10 Red-Edge Chlorophyll Index nondimensional
REP 400 800 Red-Edge Position nm
SPEC_NIR_IN 0 2 NIR band radiation, incoming (hemispherical) W m^-2 nm^-1
SPEC_NIR_OUT 0 2 NIR band radiation, outgoing W m^-2 sr^-1 nm^-1
SPEC_NIR_REFL 0 1 NIR band reflectance nondimensional
SPEC_PRI_REF_IN 0 2 PRI reference band radiation, incoming W m^-2 nm^-1
SPEC_PRI_REF_OUT 0 2 PRI reference band radiation, outgoing W m^-2 sr^-1 nm^-1
SPEC_PRI_REF_REFL 0 1 PRI reference band reflectance nondimensional
SPEC_PRI_TGT_IN 0 2 PRI target band radiation, incoming W m^-2 nm^-1
SPEC_PRI_TGT_OUT 0 2 PRI target band radiation, outgoing W m^-2 sr^-1 nm^-1
SPEC_PRI_TGT_REFL 0 1 PRI target band reflectance nondimensional
SPEC_RED_IN 0 2 Red band radiation, incoming (hemispherical) W m^-2 nm^-1
SPEC_RED_OUT 0 2 Red band radiation, outgoing W m^-2 sr^-1 nm^-1
SPEC_RED_REFL 0 1 Red band reflectance nondimensional
SR 0 10 Simple Ratio nondimensional
SW_BC_IN 0 1300 Shortwave radiation, below canopy incoming W m^-2
SW_BC_OUT 0 800 Shortwave radiation, below canopy outgoing W m^-2
SW_DIF 0 750 Shortwave radiation, diffuse incoming W m^-2
SW_DIR 0 1300 Shortwave radiation, direct incoming W m^-2
SW_IN 0 1300 Shortwave radiation, incoming W m^-2
SW_OUT 0 800 Shortwave radiation, outgoing W m^-2
TCARI 0 10 Transformed Chlorophyll Absorption in Reflectance Index nondimensional
SWC 0 100 Soil water content (volumetric, 0-100) %
SWP -750 0 Soil water potential kPa
TS -40 65 Soil temperature deg C
TSN -40 4 Snow temperature deg C
WTD -10 10 Water table depth m
TAU -10 2 Momentum flux kg m^-1 s^-2
U_SIGMA 0 12 Std. dev. of along-wind velocity m s^-1
USTAR 0 8 Friction velocity m s^-1
V_SIGMA 0 10 Std. dev. of cross-wind velocity m s^-1
W_SIGMA 0 5 Std. dev. of vertical velocity m s^-1
WD 0 360 Wind direction degree
WD_SIGMA 0 180 Std. dev. of wind direction degree
WS 0 40 Wind speed m s^-1
WS_MAX 0 50 Max wind speed in averaging period m s^-1
GPP -30 100 Gross primary productivity umolCO2 m^-2 s^-1
NEE -100 100 Net ecosystem exchange umolCO2 m^-2 s^-1
RECO -20 50 Ecosystem respiration umolCO2 m^-2 s^-1

Fluxtools is an independent project and is not affiliated with or endorsed by the AmeriFlux Network. “AmeriFlux” is a registered trademark of Lawrence Berkeley National Laboratory and is used here for identification purposes only.