summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Ranke <johannes.ranke@jrwb.de>2026-02-06 17:52:07 +0100
committerJohannes Ranke <johannes.ranke@jrwb.de>2026-02-06 17:52:07 +0100
commit4134a2aa07b819a6dbe59129880402395c7a484a (patch)
tree1c70d07f19629bfe9580de396406118747584cdf
parent8fd8f9c04492cce60c1cd1e6b9a53057990ec31e (diff)
parent1bbaa8ecc33d70e84a8e2c8ece4619ef3aa60029 (diff)
Merge branch 'UK_drainage_with_units' into patch-1
-rw-r--r--DESCRIPTION2
-rw-r--r--R/PEC_sw_drainage_UK.R50
-rw-r--r--R/PEC_sw_exposit.R3
-rw-r--r--R/TOXSWA_cwa.R2
-rw-r--r--log/build.log3
-rw-r--r--log/check.log19
-rw-r--r--log/test.log6
-rw-r--r--man/PEC_sw_drainage_UK.Rd9
-rw-r--r--man/PEC_sw_exposit_runoff.Rd3
-rw-r--r--man/TOXSWA_cwa.Rd2
-rw-r--r--tests/testthat/test_UK_drainage.R21
11 files changed, 77 insertions, 43 deletions
diff --git a/DESCRIPTION b/DESCRIPTION
index 047d427..16f04c2 100644
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -2,7 +2,7 @@ Package: pfm
Type: Package
Title: Utilities for Pesticide Fate Modelling
Version: 0.6.4
-Date: 2026-01-05
+Date: 2026-02-06
Authors@R: c(
person("Johannes Ranke", email = "johannes.ranke@agroscope.admin.ch",
role = c("aut", "cre"),
diff --git a/R/PEC_sw_drainage_UK.R b/R/PEC_sw_drainage_UK.R
index 2c7e28f..d5f0bab 100644
--- a/R/PEC_sw_drainage_UK.R
+++ b/R/PEC_sw_drainage_UK.R
@@ -4,11 +4,14 @@
#' published on the CRC website. Degradation before the start of the drainage period is taken into account if
#' `latest_application` is specified and the degradation parameters are given either as a `soil_DT50` or a `model`.
#'
-#' @param rate Application rate in g/ha
+#' @param rate Application rate in g/ha or with a compatible unit specified
+#' with the units package
#' @param interception The fraction of the application rate that does not reach the soil
-#' @param Koc The sorption coefficient normalised to organic carbon in L/kg
+#' @param Koc The sorption coefficient normalised to organic carbon in L/kg or a unit specified
+#' with the units package
#' @param latest_application Latest application date, formatted as e.g. "01 July"
-#' @param soil_DT50 Soil degradation half-life, if SFO kinetics are to be used
+#' @param soil_DT50 Soil degradation half-life, if SFO kinetics are to be used, in
+#' days or a time unit specified with the units package
#' @param model The soil degradation model to be used. Either one of "FOMC",
#' "DFOP", "HS", or "IORE", or an mkinmod object
#' @param model_parms A named numeric vector containing the model parameters
@@ -27,42 +30,55 @@
#' PEC_sw_drainage_UK(150, Koc = 100)
#' PEC_sw_drainage_UK(60, interception = 0.5, Koc = 550,
#' latest_application = "01 July", soil_DT50 = 200)
-
-PEC_sw_drainage_UK <- function(rate, interception = 0, Koc,
- latest_application = NULL, soil_DT50 = NULL,
- model = NULL, model_parms = NULL)
+PEC_sw_drainage_UK <- function(rate,
+ interception = 0, Koc,
+ latest_application = NULL, soil_DT50 = NULL,
+ model = NULL, model_parms = NULL)
{
- percentage_lost <- SSLRC_mobility_classification(Koc)[[2]]
- if (inherits(rate, "units") && !identical(as.character(units(rate)), "g/ha")) stop("rate must have units g/ha, not ", units(rate))
- amount_available <- as.numeric(rate) * (1 - interception) # g/ha
+ # Set default units if not specified and convert to units used in the calculations
+ if (!inherits(rate, "units")) rate <- set_units(rate, "g/ha")
+ rate_g_ha <- as.numeric(set_units(rate, "g/ha"))
+
+ if (!inherits(Koc, "units")) Koc <- set_units(Koc, "L/kg")
+ Koc_L_kg <- as.numeric(set_units(Koc, "L/kg"))
+
+ if (!missing(soil_DT50)) {
+ if (!inherits(soil_DT50, "units")) {
+ soil_DT50_d <- soil_DT50
+ }
+ soil_DT50_d <- as.numeric(set_units(soil_DT50, "d"))
+ }
+
+ percentage_lost <- SSLRC_mobility_classification(Koc_L_kg)[[2]]
+ amount_available <- rate_g_ha * (1 - interception) # amount in g for 1 ha
if (!missing(latest_application)) {
lct <- Sys.getlocale("LC_TIME")
tmp <- Sys.setlocale("LC_TIME", "C")
- if (latest_application == "29 February") {
+ if (latest_application == "29 February") { # Use a leap year
ref_year <- 2000
- } else { ref_year <- 1999}
+ } else { ref_year <- 1999} # Use a non-leap year
latest <- as.Date(paste(latest_application, ref_year), "%d %b %Y")
if (is.na(latest)) stop("Please specify the latest application in the format '%d %b', e.g. '01 July'")
tmp <- Sys.setlocale("LC_TIME", lct)
degradation_time <- as.numeric(difftime(as.Date(paste0(ref_year,"-10-01")), units = "days", latest))
if (degradation_time > 0) {
if (!missing(soil_DT50)) {
- k = log(2)/soil_DT50
+ k = log(2)/soil_DT50_d
as.Date(paste(latest_application, "1999"), "%d %B %Y")
amount_available <- amount_available * exp(-k * degradation_time)
if (!missing(model)) stop("You already supplied a soil_DT50 value, implying SFO kinetics")
- }
+ }
if (!missing(model)) {
- fraction_left <- pfm_degradation(model, parms = model_parms,
+ fraction_left <- pfm_degradation(model, parms = model_parms,
times = degradation_time)[1, "parent"]
amount_available <- fraction_left * amount_available
}
}
- }
+ }
volume = 130000 # L/ha
- PEC = set_units(1e6 * (percentage_lost/100) * amount_available / volume, "µg/L")
+ PEC = set_units(1e6 * (percentage_lost/100) * amount_available / volume, "\u00B5g/L")
return(PEC)
}
diff --git a/R/PEC_sw_exposit.R b/R/PEC_sw_exposit.R
index 282a1ac..a157189 100644
--- a/R/PEC_sw_exposit.R
+++ b/R/PEC_sw_exposit.R
@@ -52,7 +52,8 @@
#'
#' @importFrom units as_units set_units drop_units
#' @importFrom dplyr across mutate
-#' @param rate The application rate in g/ha
+#' @param rate Application rate in g/ha or with a compatible unit specified
+#' with the units package
#' @param interception The fraction intercepted by the crop
#' @param Koc The sorption coefficient to soil organic carbon
#' @param DT50 The soil half-life in days
diff --git a/R/TOXSWA_cwa.R b/R/TOXSWA_cwa.R
index b132beb..b2f7619 100644
--- a/R/TOXSWA_cwa.R
+++ b/R/TOXSWA_cwa.R
@@ -147,7 +147,7 @@ plot.TOXSWA_cwa <- function(x, time_column = c("datetime", "t", "t_firstjan", "t
#' and some associated statistics. like maximum moving window average
#' concentrations, and dataframes holding the events exceeding specified
#' thresholds. Usually, an instance of this class will be generated
-#' by \code{\link{read.TOXSWA_cwa}}.
+#' by [read.TOXSWA_cwa].
#'
#' @export
#' @format An [R6::R6Class] generator object.
diff --git a/log/build.log b/log/build.log
index e6b9b08..5b3f7ee 100644
--- a/log/build.log
+++ b/log/build.log
@@ -3,6 +3,9 @@
* checking DESCRIPTION meta-information ... OK
* checking for LF line-endings in source and make files and shell scripts
* checking for empty or unneeded directories
+Removed empty directory ‘pfm/inst/testdata/SwashProjects/Project_1/MACRO’
+Removed empty directory ‘pfm/inst/testdata/SwashProjects/Project_1’
+Removed empty directory ‘pfm/inst/testdata/SwashProjects’
* re-saving image files
* building ‘pfm_0.6.4.tar.gz’
diff --git a/log/check.log b/log/check.log
index 4e23c07..5deae11 100644
--- a/log/check.log
+++ b/log/check.log
@@ -1,10 +1,10 @@
-* using log directory ‘/home/agsad.admin.ch/f80868656/projects/pfm/pfm.Rcheck’
+* using log directory ‘/home/jranke/git/pfm/pfm.Rcheck’
* using R version 4.5.2 (2025-10-31)
* using platform: x86_64-pc-linux-gnu
* R was compiled by
- gcc (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0
- GNU Fortran (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0
-* running under: Ubuntu 24.04.3 LTS
+ gcc (Debian 14.2.0-19) 14.2.0
+ GNU Fortran (Debian 14.2.0-19) 14.2.0
+* running under: Debian GNU/Linux 13 (trixie)
* using session charset: UTF-8
* using options ‘--no-tests --as-cran’
* checking for file ‘pfm/DESCRIPTION’ ... OK
@@ -14,7 +14,7 @@
* checking CRAN incoming feasibility ... NOTE
Maintainer: ‘Johannes Ranke <johannes.ranke@agroscope.admin.ch>’
-Size of tarball: 8534480 bytes
+Size of tarball: 8533512 bytes
* checking package namespace information ... OK
* checking package dependencies ... OK
* checking if this is a source package ... OK
@@ -66,16 +66,13 @@ Size of tarball: 8534480 bytes
* checking for unstated dependencies in ‘tests’ ... OK
* checking tests ... SKIPPED
* checking PDF version of manual ... OK
-* checking HTML version of manual ... NOTE
-Skipping checking HTML validation: no command 'tidy' found.
-Please obtain a recent version of HTML Tidy by downloading a binary
-release or compiling the source code from <https://www.html-tidy.org/>.
+* checking HTML version of manual ... OK
* checking for non-standard things in the check directory ... OK
* checking for detritus in the temp directory ... OK
* DONE
-Status: 2 NOTEs
+Status: 1 NOTE
See
- ‘/home/agsad.admin.ch/f80868656/projects/pfm/pfm.Rcheck/00check.log’
+ ‘/home/jranke/git/pfm/pfm.Rcheck/00check.log’
for details.
diff --git a/log/test.log b/log/test.log
index 815e792..7204076 100644
--- a/log/test.log
+++ b/log/test.log
@@ -9,10 +9,10 @@
✔ | 1 | Actual and time weighted average concentrations for SFO kinetics
✔ | 9 | FOCUS Step 1 calculations
✔ | 8 | FOCUS Steps 12 input files
-✔ | 7 | Read and analyse TOXSWA cwa files [2.8s]
-✔ | 15 | UK drainage PEC calculations
+✔ | 7 | Read and analyse TOXSWA cwa files [2.6s]
+✔ | 17 | UK drainage PEC calculations
══ Results ═════════════════════════════════════════════════════════════════════════════════════════
Duration: 3.8 s
-[ FAIL 0 | WARN 0 | SKIP 0 | PASS 80 ]
+[ FAIL 0 | WARN 0 | SKIP 0 | PASS 82 ]
diff --git a/man/PEC_sw_drainage_UK.Rd b/man/PEC_sw_drainage_UK.Rd
index 6125c3c..af020c6 100644
--- a/man/PEC_sw_drainage_UK.Rd
+++ b/man/PEC_sw_drainage_UK.Rd
@@ -15,15 +15,18 @@ PEC_sw_drainage_UK(
)
}
\arguments{
-\item{rate}{Application rate in g/ha}
+\item{rate}{Application rate in g/ha or with a compatible unit specified
+with the units package}
\item{interception}{The fraction of the application rate that does not reach the soil}
-\item{Koc}{The sorption coefficient normalised to organic carbon in L/kg}
+\item{Koc}{The sorption coefficient normalised to organic carbon in L/kg or a unit specified
+with the units package}
\item{latest_application}{Latest application date, formatted as e.g. "01 July"}
-\item{soil_DT50}{Soil degradation half-life, if SFO kinetics are to be used}
+\item{soil_DT50}{Soil degradation half-life, if SFO kinetics are to be used, in
+days or a time unit specified with the units package}
\item{model}{The soil degradation model to be used. Either one of "FOMC",
"DFOP", "HS", or "IORE", or an mkinmod object}
diff --git a/man/PEC_sw_exposit_runoff.Rd b/man/PEC_sw_exposit_runoff.Rd
index 393ed29..60c9b9f 100644
--- a/man/PEC_sw_exposit_runoff.Rd
+++ b/man/PEC_sw_exposit_runoff.Rd
@@ -21,7 +21,8 @@ PEC_sw_exposit_runoff(
)
}
\arguments{
-\item{rate}{The application rate in g/ha}
+\item{rate}{Application rate in g/ha or with a compatible unit specified
+with the units package}
\item{interception}{The fraction intercepted by the crop}
diff --git a/man/TOXSWA_cwa.Rd b/man/TOXSWA_cwa.Rd
index 0e8a953..126fed4 100644
--- a/man/TOXSWA_cwa.Rd
+++ b/man/TOXSWA_cwa.Rd
@@ -11,7 +11,7 @@ An R6 class for holding TOXSWA water concentration (cwa) data
and some associated statistics. like maximum moving window average
concentrations, and dataframes holding the events exceeding specified
thresholds. Usually, an instance of this class will be generated
-by \code{\link{read.TOXSWA_cwa}}.
+by \link{read.TOXSWA_cwa}.
}
\examples{
H_sw_R1_stream <- read.TOXSWA_cwa("00003s_pa.cwa",
diff --git a/tests/testthat/test_UK_drainage.R b/tests/testthat/test_UK_drainage.R
index defecbb..75d9c98 100644
--- a/tests/testthat/test_UK_drainage.R
+++ b/tests/testthat/test_UK_drainage.R
@@ -24,15 +24,23 @@ test_that("UK drainflow PECs are correct", {
# This is the first example calculation from the data requirements handbook, where they give
# 8.07 µg/L as the result (obviously a rounding error).
- expect_equal(round(PEC_sw_drainage_UK(150, interception = 0, Koc = 100), 4), 8.0769)
+ expect_equal(round(PEC_sw_drainage_UK(150, interception = 0, Koc = 100), 4),
+ as_units(8.0769, "\u00B5g/L"))
+
+ # Same as above, but using units for the input
+ expect_equal(round(PEC_sw_drainage_UK(as_units(0.15, "kg/ha"), interception = 0,
+ Koc = as_units(100, "mL/g")), 4),
+ as_units(8.0769, "\u00B5g/L"))
# This is the second example calculation from the data requirements handbook
- expect_equal(round(PEC_sw_drainage_UK(90, interception = 0, Koc = 10), 4), 13.1538)
+ expect_equal(round(PEC_sw_drainage_UK(90, interception = 0, Koc = 10), 4),
+ as_units(13.1538, "\u00B5g/L"))
# This is the third example calculation from the data requirements handbook,
expect_equal(round(PEC_sw_drainage_UK(60, interception = 0.5, Koc = 550,
- latest_application = "01 July",
- soil_DT50 = 200), 2), 0.84)
+ latest_application = "01 July",
+ soil_DT50 = 200), 2),
+ as_units(0.84, "\u00B5g/L"))
expect_error(round(PEC_sw_drainage_UK(60, interception = 0.5, Koc = 550,
latest_application = "100 July",
@@ -42,6 +50,11 @@ test_that("UK drainflow PECs are correct", {
latest_application = "29 February",
soil_DT50 = 200), 2))
+ expect_silent(round(PEC_sw_drainage_UK(60, interception = 0.5, Koc = 550,
+ latest_application = "29 February",
+ soil_DT50 = as_units(200, "d")), 2))
+
+
# Test that PECsw do not increase if the application is after the beginning
# of the drainflow period
expect_equal(

Contact - Imprint