calcCO2 <- function(df, pool, labTemp = 'default', labPa = 'default', ...) {
labParams <- list(
labTemp = labTemp,
labPa = labPa
)
allColumns <- sum(
grepl(
paste(
c('lab_co2_lab_temp',
'lab_co2_lab_press',
'lab_co2_co2ppm'),
collapse = '|'
),
colnames(df)
)
) == 3
if (nrow(df) == 1 & allColumns) {
cst_to_get <- c('lab_press_avg_atm', 'lab_temp_avg_degC', 'vol_sa', 'vol_water', 'c_const', 'gas_const_r_atm')
constants <- getRows(pool, 'constants', name %in% cst_to_get, columns = c('name', 'value'))
for (param in names(labParams)) {
if (param == 'labTemp') {
cstName <- 'lab_temp_avg_degC'
dbName <- 'lab_co2_lab_temp'
} else {
cstName <- 'lab_press_avg_atm'
dbName <- 'lab_co2_lab_press'
}
if (labParams[[param]] == 'db') {
labParams[[param]] <- df %>% pull(dbName)
if (param == 'labPa') labParams[[param]] <- labParams[[param]] / 1013.25
} else if (labParams[[param]] == 'cst') {
labParams[[param]] <- constants %>%
filter(name == cstName) %>%
pull('value')
} else if (labParams[[param]] == 'default') {
labParams[[param]] <- df %>% pull(dbName)
if (param == 'labPa') labParams[[param]] <- labParams[[param]] / 1013.25
if (is.na(labParams[[param]])) labParams[[param]] <- constants %>%
filter(name == cstName) %>%
pull('value')
}
}
labParams$labTemp <- labParams$labTemp + 273.15
co2 <- df %>% select(starts_with('lab_co2_co2ppm')) %>% pull()
vol_sa <- constants %>% filter(name == 'vol_sa') %>% pull('value')
vol_water <- constants %>% filter(name == 'vol_water') %>% pull('value')
c_const <- constants %>% filter(name == 'c_const') %>% pull('value')
gas_const_r_atm <- constants %>% filter(name == 'gas_const_r_atm') %>% pull('value')
if (!any(is.na(c(co2, vol_sa, vol_water, c_const, gas_const_r_atm, labParams$labTemp, labParams$labPa)))) {
exponent <- exp(c_const * (1/labParams$labTemp - 1/298.15))
dividend <- co2 * labParams$labPa * (vol_sa + 0.034 * exponent * vol_water * gas_const_r_atm * labParams$labTemp)
divisor <- gas_const_r_atm * vol_water * labParams$labTemp
if (divisor != 0) {
return(
dividend / divisor
)
}
}
}
as.numeric(NA)
}