From ccb51bf7f1718d0ff6ef9512a95d887ed80d327d Mon Sep 17 00:00:00 2001 From: Phi-S <926151+Phi-S@users.noreply.github.com> Date: Thu, 30 Apr 2026 10:02:39 +0200 Subject: [PATCH 1/4] documentation improvements and added pipeline overview --- README.md | 1002 +---------------------------- docs/compare_regression_models.md | 44 ++ docs/generate_regressions.md | 249 +++++++ docs/modify_model_results.md | 256 ++++++++ docs/plot_control.md | 68 ++ docs/read_data.md | 358 +++++++++++ docs/write_model_results.md | 32 + img/flow.drawio | 104 +++ img/flow.png | Bin 0 -> 110417 bytes 9 files changed, 1123 insertions(+), 990 deletions(-) create mode 100644 docs/compare_regression_models.md create mode 100644 docs/generate_regressions.md create mode 100644 docs/modify_model_results.md create mode 100644 docs/plot_control.md create mode 100644 docs/read_data.md create mode 100644 docs/write_model_results.md create mode 100644 img/flow.drawio create mode 100644 img/flow.png diff --git a/README.md b/README.md index d1835fa..328ad28 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ [![CRAN downloads](https://cranlogs.r-pkg.org/badges/last-month/pam)](https://cran.r-project.org/package=pam) [![CRAN total downloads](https://cranlogs.r-pkg.org/badges/grand-total/pam)](https://cran.r-project.org/package=pam) + ## Introduction Rapid light curves recorded via the pulse‐amplitude modulation (PAM) technique are widely used to characterize photosynthesis, enabling the determination of key photosynthetic parameters. However, deriving these kinetic parameters from raw data requires fitting to regression models, a process traditionally involving laborious and error‐prone manual steps. Our R package pam streamlines this process by automating regression analysis, enabling fast and reproducible processing of large datasets. It provides the models of Vollenweider (1965), Platt et al. (1980), Eilers and Peeters (1988) and Walsby (1997). @@ -34,7 +35,7 @@ install.packages("remotes") remotes::install_github("biotoolbox/pam", subdir = "src", ref = "dev") ``` -## Usage +## Examples Examples of usage can be found in the `examples` directory. @@ -42,998 +43,19 @@ Examples of usage can be found in the `examples` directory. ## Functions -### read_universal_data() - -#### Description - -This function reads a universal CSV file, computes $$ETR$$ values, and returns a processed intermediate table. - -#### Parameters - -- **csv_path**: A string representing the file path to the CSV file. -- **etr_factor**: A numeric value used as a factor for calculating ETR. Default is `0.84`. -- **fraction_photosystem_I**: A numeric value representing the relative distribution of absorbed PAR to photosystem I used in the ETR calculation formula. Default is `0.5`. -Calculated as: $$\textit{Fraction of Photosystem I} = \frac{PPS 1}{PPS 1+2}$$ -- **fraction_photosystem_II**: A numeric value representing the relative distribution of absorbed PAR to photosystem II used in the ETR calculation formula. Default is `0.5`. -Calculated as: $$\textit{Fraction of Photosystem II} = \frac{PPS 2}{PPS 1+2}$$ - -#### Details - -ETR values are calculated using the following formula: - -$$ \textit{ETR (I or II)} = PAR \cdot \textit{ETR–Factor} \cdot \textit{Fraction of Photosystem (I or II)} \cdot \textit{Yield (I or II)} $$ - -The function processes the provided CSV file by: - -- Reading the CSV data using `read.csv()`. -- Converting the data into a `data.table`. -- Validating the raw data structure with `validate_raw_intermediate_csv()`. -- Iterating through each row to calculate ETR values for both `yield_1` and `yield_2` using `calc_etr()`. - -#### Return - -Returning a new table containing the original `par`, `yield_1`, `yield_2`, and the calculated `etr_1` and `etr_2` columns. - -#### Example - -```r -data <- read_dual_pam_data("path/to/data.csv", -etr_factor = 0.84, -fraction_photosystem_I = 0.5, -fraction_photosystem_II = 0.5) -``` - -#### References - -- Heinz Walz GmbH. (2024). *DUAL-PAM-100 DUAL-PAM/F MANUAL, 5th Edition, April 2024, Chapter 7 (pp. 162-172).* Heinz Walz GmbH, Effeltrich, Germany. Available at: [DUAL-PAM-100 Manual](https://www.walz.com/files/downloads/dualpamed05.pdf) - ---- - -### read_dual_pam_data() - -#### Description - -This function reads the original CSV file as created by the [DUAL-PAM-100](https://www.walz.com/products/dual-pam-100/) software, processes it by calculating $$ETR$$ values, and returns a cleaned dataset. - -#### Parameters - -- **csv_path**: A string representing the file path to the CSV file. -- **remove_recovery**: Automatic removal of recovery measurements after the actual Pi curve for an accurate regression. Default is `TRUE`. -- **etr_factor**: A numeric value used as a factor for calculating ETR. Default is `0.84`. -- **fraction_photosystem_I**: A numeric value representing the relative distribution of absorbed PAR to photosystem I used in the ETR calculation formula. Default is `0.5`. -Calculated as: $$\textit{Fraction of Photosystem I} = \frac{PPS 1}{PPS 1+2}$$ -- **fraction_photosystem_II**: A numeric value representing the relative distribution of absorbed PAR to photosystem II used in the ETR calculation formula. Default is `0.5`. -Calculated as: $$\textit{Fraction of Photosystem II} = \frac{PPS 2}{PPS 1+2}$$ - -#### Details - -ETR values are calculated using the following formula: - -$$ \textit{ETR (I or II)} = PAR \cdot \textit{ETR–Factor} \cdot \textit{Fraction of Photosystem (I or II)} \cdot \textit{Yield (I or II)} $$ - -The function processes the provided CSV file by: - -- Reading the CSV data using `read.csv()` and converting it to a `data.table`. -- Validating the raw Dual-PAM data with `validate_dual_pam_data()`. -- Filtering rows where the column `ID` equals `SP` -- Combining the `Date` and `Time` columns to create a `DateTime` column and ordering the data chronologically. -- Calculating initial ETR values from `Pm.-Det.` and `Fm-Det.` rows using `calc_etr()`. -- Iterating through all rows with `Action == "P.+F. SP"` to calculate ETR values for both `Y.I.` and `Y.II.` -- Stopping at the recovery period if `remove_recovery = TRUE`. - - -#### Return - -- Returning a table containing `par`, `yield_1`, `yield_2`, and the calculated `etr_1` and `etr_2` columns. - -#### Example - -```r -data <- read_dual_pam_data("path/to/data.csv", -remove_recovery = TRUE, -etr_factor = 0.84, -fraction_photosystem_I = 0.5, -fraction_photosystem_II = 0.5) -``` - -#### References - -- Heinz Walz GmbH. (2024). *DUAL-PAM-100 DUAL-PAM/F MANUAL, 5th Edition, April 2024, Chapter 7 (pp. 162-172).* Heinz Walz GmbH, Effeltrich, Germany. Available at: [DUAL-PAM-100 Manual](https://www.walz.com/files/downloads/dualpamed05.pdf) - ---- - -### read_dual_pam_single_channel_p700_data() - -#### Description - -This function reads the original CSV file as created by the [DUAL-PAM-100](https://www.walz.com/products/dual-pam-100/) software in single channel mode (P700), processes it by calculating $$ETR$$ values for Photosystem I, and returns a cleaned dataset. - -#### Parameters - -- **csv_path**: A string representing the file path to the CSV file. -- **remove_recovery**: Automatic removal of recovery measurements after the actual Pi curve for an accurate regression. Default is `TRUE`. -- **etr_factor**: A numeric value used as a factor for calculating ETR. Default is `0.84`. -- **fraction_photosystem_I**: A numeric value representing the relative distribution of absorbed PAR to Photosystem I used in the ETR calculation formula. Default is `0.5`. - Calculated as: $$\textit{Fraction of Photosystem I} = \frac{PPS 1}{PPS 1+2}$$ -- **fraction_photosystem_II**: A numeric value representing the relative distribution of absorbed PAR to Photosystem II. Default is `0.5`. - (Must sum with Photosystem I fraction to 1.) - -#### Details - -ETR values for Photosystem I are calculated using the following formula: - -$$ \textit{ETR (I)} = PAR \cdot \textit{ETR–Factor} \cdot \textit{Fraction of Photosystem I} \cdot \textit{Yield (I)} $$ - -The function processes the provided CSV file by: - -- Reading the CSV data using `read.csv()` and converting it to a `data.table`. -- Validating the raw Dual-PAM data with `validate_dual_pam_single_channel_p700_data()`. -- Filtering rows where the column `ID` equals `SP`. -- Combining the `Date` and `Time` columns to create a `DateTime` column and ordering the data chronologically. -- Extracting the initial Pm.-Det. measurement at `PAR = 0` to calculate the first ETR value. -- Iterating through all rows with `Action == "P700 SP"` to calculate ETR values for Photosystem I (`Y.I.`). -- Stopping at the recovery period if `remove_recovery = TRUE`. - -#### Return - -- Returning a table containing: - - `par`: Photosynthetically active radiation. - - `yield_1`: Yield of Photosystem I. - - `yield_2`: `NA` (not available in single channel PS I mode). - - `etr_1`: Calculated ETR for Photosystem I. - - `etr_2`: `NA` (not available in single channel PS I mode). - -#### Example - -```r -data <- read_dual_pam_single_channel_p700_data( - "path/to/data.csv", - remove_recovery = TRUE, - etr_factor = 0.84, - fraction_photosystem_I = 0.5, - fraction_photosystem_II = 0.5 -) -``` - -#### References - -- Heinz Walz GmbH. (2024). *DUAL-PAM-100 DUAL-PAM/F MANUAL, 5th Edition, April 2024, Chapter 7 (pp. 162-172).* Heinz Walz GmbH, Effeltrich, Germany. Available at: [DUAL-PAM-100 Manual](https://www.walz.com/files/downloads/dualpamed05.pdf) ---- - -### read_dual_pam_single_channel_fluo_data() - -#### Description - -This function reads the original CSV file as created by the [DUAL-PAM-100](https://www.walz.com/products/dual-pam-100/) software in single channel mode (Fluo), processes it by calculating $$ETR$$ values for Photosystem II, and returns a cleaned dataset. - -#### Parameters - -- **csv_path**: A string representing the file path to the CSV file. -- **remove_recovery**: Automatic removal of recovery measurements after the actual Pi curve for an accurate regression. Default is `TRUE`. -- **etr_factor**: A numeric value used as a factor for calculating ETR. Default is `0.84`. -- **fraction_photosystem_I**: A numeric value representing the relative distribution of absorbed PAR to Photosystem I. Default is `0.5`. -- **fraction_photosystem_II**: A numeric value representing the relative distribution of absorbed PAR to Photosystem II used in the ETR calculation formula. Default is `0.5`. - Calculated as: $$\textit{Fraction of Photosystem II} = \frac{PPS 2}{PPS 1+2}$$ - -#### Details - -ETR values for Photosystem II are calculated using the following formula: - -$$ \textit{ETR (II)} = PAR \cdot \textit{ETR–Factor} \cdot \textit{Fraction of Photosystem II} \cdot \textit{Yield (II)} $$ - -The function processes the provided CSV file by: - -- Reading the CSV data using `read.csv()` and converting it to a `data.table`. -- Validating the raw Dual-PAM data with `validate_dual_pam_single_channel_fluo_data()`. -- Filtering rows where the column `ID` equals `SP`. -- Combining the `Date` and `Time` columns to create a `DateTime` column and ordering the data chronologically. -- Extracting the initial **Fm-Det.** measurement at `PAR = 0` to calculate the first ETR value. -- Iterating through all rows with `Action == "Fluo. SP"` to calculate ETR values for Photosystem II (`Y.II.`). -- Stopping at the recovery period if `remove_recovery = TRUE`. - -#### Return - -- Returning a table containing: - - `par`: Photosynthetically active radiation. - - `yield_1`: `NA` (not available in single channel Photosystem II mode). - - `yield_2`: Yield of Photosystem II. - - `etr_1`: `NA` (not available in single channel Photosystem II mode). - - `etr_2`: Calculated ETR for Photosystem II. - -#### Example - -```r -data <- read_dual_pam_single_channel_fluo_data( - "path/to/data.csv", - remove_recovery = TRUE, - etr_factor = 0.84, - fraction_photosystem_I = 0.5, - fraction_photosystem_II = 0.5 -) -``` - -#### References - -- Heinz Walz GmbH. (2024). *DUAL-PAM-100 DUAL-PAM/F MANUAL, 5th Edition, April 2024, Chapter 7 (pp. 162-172).* Heinz Walz GmbH, Effeltrich, Germany. Available at: [DUAL-PAM-100 Manual](https://www.walz.com/files/downloads/dualpamed05.pdf) ---- - -### read_junior_pam_data() - -#### Description - -This function reads the original CSV file from [JUNIOR-PAM](https://www.walz.com/products/junior-pam/) as created by the WinControl software, processes it by calculating $$ETR$$ values, and returns a cleaned dataset. - -#### Parameters - -- **csv_path**: A string representing the file path to the CSV file. -- **remove_recovery**: Automatic removal of recovery measurements after the actual Pi curve for an accurate regression. Default is `TRUE`. -- **etr_factor**: A numeric value used as a factor for calculating ETR. Default is `0.84`. -- **fraction_photosystem_I**: A numeric value representing the relative distribution of absorbed PAR to photosystem I used in the ETR calculation formula. Default is `0.5`. -Calculated as: $$\textit{Fraction of Photosystem I} = \frac{PPS 1}{PPS 1+2}$$ -- **fraction_photosystem_II**: A numeric value representing the relative distribution of absorbed PAR to photosystem II used in the ETR calculation formula. Default is `0.5`. -Calculated as: $$\textit{Fraction of Photosystem II} = \frac{PPS 2}{PPS 1+2}$$ - -#### Details - -ETR values are calculated using the following formula: - -$$ \textit{ETR (II)} = PAR \cdot \textit{ETR–Factor} \cdot \textit{Fraction of Photosystem (II)} \cdot \textit{Yield (II)} $$ - -The function processes the provided CSV file by: - -- Reading the CSV data using `read.csv()` and converting it to a `data.table`. -- Validating the raw Junior-PAM data with `validate_junior_pam_data()`. -- Renaming columns to standard names (`PAR`, `Y.II`.) if necessary. -- Filtering rows where Type equals `"FO"` or `"F"`. -- Ordering by `Time (rel/ms)` column. -- Iterating through all rows to calculate ETR values for `Y.II.` using `calc_etr()`. -- Stopping at the recovery period if `remove_recovery = TRUE`. - -To ensure the file is imported correctly, please export the CSV file using the default settings: -![Plot](img/export_junior_pam.png) - -#### Return - -Returning a table containing `par`, `yield_1` (NA), `yield_2`, `etr_1` (NA), and `etr_2`. - -#### Example - -```r -data <- read_junior_pam_data("path/to/data.csv", -remove_recovery = TRUE, -etr_factor = 0.84, -fraction_photosystem_I = 0.5, -fraction_photosystem_II = 0.5) -``` - -#### References - -- Heinz Walz GmbH. (2024). *DUAL-PAM-100 DUAL-PAM/F MANUAL, 5th Edition, April 2024, Chapter 7 (pp. 162-172).* Heinz Walz GmbH, Effeltrich, Germany. Available at: [DUAL-PAM-100 Manual](https://www.walz.com/files/downloads/dualpamed05.pdf) - ---- - -### read_pam_2500_data() - -#### Description - -This function reads the original CSV file generated by the [PAM-2500](https://www.walz.com/products/pam-2500/) software, processes it by calculating $$ETR$$ values for Photosystem II, and returns a cleaned dataset. - -#### Parameters - -- **csv_path**: A string representing the file path to the CSV file. -- **remove_recovery**: Logical value indicating whether recovery measurements after the actual Pi curve should be removed. Default is `TRUE`. -- **etr_factor**: A numeric value used as a factor for calculating ETR. Default is `0.84`. -- **fraction_photosystem_I**: A numeric value representing the relative distribution of absorbed PAR to photosystem I. Default is `0.5`. - Calculated as: $$\textit{Fraction of Photosystem I} = \frac{PPS 1}{PPS 1+2}$$ -- **fraction_photosystem_II**: A numeric value representing the relative distribution of absorbed PAR to photosystem II. Default is `0.5`. - Calculated as: $$\textit{Fraction of Photosystem II} = \frac{PPS 2}{PPS 1+2}$$ - - -#### Details - -ETR values are calculated using the following formula: - -$$ \textit{ETR (II)} = PAR \cdot \textit{ETR–Factor} \cdot \textit{Fraction of Photosystem II} \cdot \textit{Yield (II)} $$ - -The function processes the provided CSV file by: - -- Reading the CSV file using `read.csv()` with `;` as separator and converting it to a `data.table`. -- Validating the dataset using `validate_pam_2500_data()`. -- Filtering rows where the column `No.` contains numeric entries only. -- Combining the `Date` and `Time` columns into a `DateTime` column and sorting the dataset chronologically. -- Iterating through all rows to: - - Extract `PAR` and `Y.II.` values. - - Calculate ETR for Photosystem II using `calc_etr()`. -- Optionally stopping at the recovery phase if `remove_recovery = TRUE`, defined as a decrease in PAR values. -- Constructing a result table with calculated values. - - -#### Return - -- A `data.table` containing the following columns: - - - `par`: Photosynthetically active radiation - - `yield_1`: Placeholder column (`NA`) - - `yield_2`: Effective quantum yield of Photosystem II - - `etr_1`: Placeholder column (`NA`) - - `etr_2`: Calculated electron transport rate for Photosystem II - - -#### Example - -```r -data <- read_pam_2500_data( - "path/to/data.csv", - remove_recovery = TRUE, - etr_factor = 0.84, - fraction_photosystem_I = 0.5, - fraction_photosystem_II = 0.5 -) -``` - -#### References - -- Heinz Walz GmbH. (2024). *DUAL-PAM-100 DUAL-PAM/F MANUAL, 5th Edition, April 2024, Chapter 7 (pp. 162-172).* Heinz Walz GmbH, Effeltrich, Germany. Available at: [DUAL-PAM-100 Manual](https://www.walz.com/files/downloads/dualpamed05.pdf) - ---- - -### vollenweider_generate_regression_ETR_I() and vollenweider_generate_regression_ETR_II() - -This function generates a regression model based on Vollenweider (1965). Original naming conventions from the publication are used. - -#### Parameters - -- **data**: A `data.table` containing the input data, processed according to the corresponding read function (e.g. `read_dual_pam_data`). -- **etr_type**: A character string specifying the column name of the response variable (ETR I or ETR II) to be used in the model. -- **pmax_start_value**: Numeric. The starting value for the parameter $$p_{max}$$ in the model. Defaults to `pmax_start_values_vollenweider_default`. -- **a_start_value**: Numeric. The starting value for the parameter $$a$$ in the model. Defaults to `a_start_values_vollenweider_default`. -- **alpha_start_value**: Numeric. The starting value for the parameter $$\alpha$$ in the model. Defaults to `alpha_start_values_vollenweider_default`. -- **n_start_value**: Numeric. The starting value for the parameter $$n$$ in the model. Defaults to `n_start_values_vollenweider_default`. - -#### Return - -A list containing the following elements: - -- **etr_regression_data**: A `data.table` with the predicted values of ETR I or ETR II to each PAR based on the fitted model. -- **residual_sum_of_squares**: Difference between observed and predicted ETR values, expressed as the sum of squared residuals. -- **root_mean_squared_error**: Difference between observed and predicted ETR values, expressed as the root mean squared error. -- **relative_root_mean_squared_error**: Difference between observed and predicted ETR values, expressed as the relative root mean squared error, normalized by the mean. -- **residual_sum_of_squares**: The deviation between the actual and predicted ETR values. -- **pmax**: The maximum electron transport rate without photoinhibition ($$p_{max}$$). -- **a**: The obtained parameter $$a$$. -- **alpha**: The obtained parameter $$\alpha$$. -- **n**: The obtained parameter $$n$$. -- **popt**: The maximum electron transport rate with photoinhibition ($$p_{opt}$$). A function computes predicted photosynthetic rates for each PAR value and tracks the maximum rate observed and is therefore modified from the original approach: - -```r - popt <- 0 - pars <- c() - predictions <- c() - for (p in min(data$PAR):max(data$PAR)) { - pars <- c(pars, p) - prediction <- pmax * (((a * p) / (sqrt(1 + (a * p)^2))) * (1 / (sqrt(1 + (alpha * p)^2)^n))) - predictions <- c( - predictions, - prediction - ) - - if (prediction > popt) { - popt <- prediction - } - } -``` - -- **ik**: PAR where the transition point from light limitation to light saturation is achieved without photoinhibition ($$I_k$$). Calculated as: - -$$I_k = \\frac{1}{a}$$ - -- **iik**: PAR where the transition point from light limitation to light saturation is achieved with photoinhibition ($$I_k^\prime$$). Calculated as: - -$$I_k^\prime = \frac{I_k \cdot p_{opt}}{p_{max}}$$ - -- **pmax_popt_and_ik_iik_ratio**: Ratio of $$p_{max}$$ to $$p_{opt}$$ and $$I_k$$ to $$I_k^\prime$$ ($$p_{max} / p_{opt}$$). Calculated as: - -$$\\p_max\\_popt\\_and\\_ik\\_iik\\_ratio = \frac{I_k}{I_k^\prime}$$ - -#### Details - -This function uses non-linear least squares fitting to estimate the parameters for the Vollenweider model, which describes the relationship between PAR and ETR. The model used is: - -$$p = p_{max} \cdot \frac{a \cdot i}{\sqrt{1 + (a \cdot i)^2}} \cdot \frac{1}{\left(\sqrt{1 + (\alpha \cdot i)^2}\right)^n}$$ - -It is valid: $$i = PAR; p = ETR$$ - -#### Example - -```r -result_vollenweider_ETR_II <- vollenweider_generate_regression_ETR_II(data, - pmax_start_value = 40, - a_start_value = 0.1, - alpha_start_value = -0.0001, - n_start_value = 350) -``` - -#### References - -Vollenweider, R. A. (1965). *Calculation models of photosynthesis-depth curves and some implications regarding day rate estimates in primary production measurements*, p. 427-457. In C. R. Goldman [ed.], *Primary Productivity in Aquatic Environments*. Mem. Ist. Ital. Idrobiol., 18 Suppl., University of California Press, Berkeley. - ---- - -### platt_generate_regression_ETR_I() and platt_generate_regression_ETR_II() - -This function generates a regression model based on Platt (1980). Original naming conventions from the publication are used. - -#### Parameters - -- **data**: A `data.table` containing the input data from `read_dual_pam_data`. -- **alpha_start_value**: Numeric. The starting value for the parameter $$\alpha$$ in the model. Defaults to `alpha_start_value_platt_default`. -- **beta_start_value**: Numeric. The starting value for the parameter $$\beta$$ in the model. Defaults to `beta_start_value_platt_default`. -- **ps_start_value**: Numeric. The starting value for the parameter $$p_s$$ in the model. Defaults to `ps_start_value_platt_default`. - -#### Return - -A list containing the following elements: - -- **etr_regression_data**: A `data.table` with the predicted values of ETR I or ETR II to each PAR based on the fitted model. -- **residual_sum_of_squares**: Difference between observed and predicted ETR values, expressed as the sum of squared residuals. -- **root_mean_squared_error**: Difference between observed and predicted ETR values, expressed as the root mean squared error. -- **relative_root_mean_squared_error**: Difference between observed and predicted ETR values, expressed as the relative root mean squared error, normalized by the mean. -- **ps**: The maximum electron transport rate without photoinhibition ($$P_s$$). -- **alpha**: The initial slope of the light curve ($$\alpha$$). -- **beta**: The photoinhibition of the light curve ($$\beta$$). -- **pm**: The maximum electron transport rate with photoinhibition ($$P_m$$). Calculated as: - -$$P_m = P_s \cdot \left(\frac{\alpha}{\alpha + \beta}\right) \cdot \left(\left(\frac{\beta}{\alpha + \beta}\right)^{\frac{\beta}{\alpha}}\right)$$ - -- **ik**: PAR where the transition point from light limitation to light saturation is achieved with photoinhibition ($$I_k$$). Calculated as: - -$$I_k = \frac{P_m}{\alpha}$$ - -- **is**: PAR where the transition point from light limitation to light saturation is achieved without photoinhibition ($$I_s$$). Calculated as: - -$$I_s = \frac{P_s}{\alpha}$$ - -- **im**: The PAR at which the maximum electron transport rate is achieved with photoinhibition ($$I_m$$). Calculated as: - -$$I_m = \left(\frac{P_s}{\alpha}\right) \cdot \log\left(\frac{\alpha + \beta}{\beta}\right)$$ - -- **ib**: ($$I_b$$) Calculated as: - -$$I_b = \frac{P_s}{\beta}$$ - -#### Details - -This function uses non-linear least squares fitting to estimate the parameters for the Platt model, which describes the relationship between PAR and ETR. The model used is: - -$$P = P_s \cdot \left(1 - e^\frac{{-\alpha \cdot I}}{P_s}\right) \cdot e^\left(\frac{{-\beta \cdot I}}{P_s}\right)$$ - -It is valid: $$I = PAR; p = ETR$$ - -#### Example - -```r -result_platt_ETR_II <- platt_generate_regression_ETR_II(data, - alpha_start_value = 0.3, - beta_start_value = 0.01, - ps_start_value = 30) -``` - -#### References - -Platt, T., Gallegos, C. L., & Harrison, W. G. (1980). *Photoinhibition of photosynthesis in natural assemblages of marine phytoplankton*. Journal of Marine Research, 38(4). Retrieved from . - ---- - -### eilers_peeters_generate_regression_ETR_I() and eilers_peeters_generate_regression_ETR_II() - -This function generates a regression model based on Eilers-Peeters (1988). Original naming conventions from the publication are used. All parameters are calculated taking photoinhibition into account. - -#### Parameters - -- **data**: A `data.table` containing the input data from `read_dual_pam_data`. -- **a_start_value**: Numeric. The starting value for the parameter $$a$$ in the model. Defaults to `a_start_values_eilers_peeters_default`. -- **b_start_value**: Numeric. The starting value for the parameter $$b$$ in the model. Defaults to `b_start_values_eilers_peeters_default`. -- **c_start_value**: Numeric. The starting value for the parameter $$c$$ in the model. Defaults to `c_start_values_eilers_peeters_default`. +

+ Processing pipeline overview +

-#### Return +For detailed information about these functions, visit the respective documentation: -A list containing the following elements: +- [Read CSV Data](docs/read_data.md) — Reads the raw data CSV files and returns the intermediate table. +- [Generate Regressions](docs/generate_regressions.md) — Generates ETR regression data from the chosen model. +- [Modify Model Results](docs/modify_model_results.md) — Modifies parameter naming to a standard approach and adds parameters from other models. +- [Plot Control](docs/plot_control.md) — Generates control plots for visual fit validation. +- [Write Model Results](docs/write_model_results.md) — Exports the regression results as CSV files. +- [Compare Regression Models](docs/compare_regression_models.md) — Scores models against each other for one data set. -- **etr_regression_data**: A `data.table` with the predicted values of ETR I or ETR II to each PAR based on the fitted model. -- **residual_sum_of_squares**: Difference between observed and predicted ETR values, expressed as the sum of squared residuals. -- **root_mean_squared_error**: Difference between observed and predicted ETR values, expressed as the root mean squared error. -- **relative_root_mean_squared_error**: Difference between observed and predicted ETR values, expressed as the relative root mean squared error, normalized by the mean. -- **a**: The obtained parameter $$a$$. -- **b**: The obtained parameter $$b$$. -- **c**: The obtained parameter $$c$$. -- **pm**: The maximum electron transport rate ($$p_m$$). Calculated as: - -$$p_m = \frac{1}{b + 2 \sqrt{a \cdot c}}$$ - -- **s**: The initial slope of the light curve ($$s$$). Calculated as: - -$$s = \frac{1}{c}$$ - -- **ik**: PAR where the transition point from light limitation to light saturation is achieved ($$I_k$$). Calculated as: - -$$I_k = \frac{c}{b + 2 \sqrt{a \cdot c}}$$ - -- **im**: The PAR at which the maximum electron transport rate is achieved ($$I_m$$). Calculated as: - -$$I_m = \sqrt{\frac{c}{a}}$$ - -- **w**: The sharpness of the peak ($$w$$). Calculated as: - -$$w = \frac{b}{\sqrt{a \cdot c}}$$ - -#### Details - -This function uses non-linear least squares fitting to estimate the parameters for the Eilers-Peeters model, which describes the relationship between PAR and ETR. The model used is: - -$$ p = \frac{I}{a \cdot I^2 + b \cdot I + c} $$ - -It is valid: $$I = PAR$$; $$p = ETR$$ - -#### Example - -```r -result_eilers_peeters_ETR_II <- eilers_peeters_generate_regression_ETR_II(data, -a_start_value = 0.00004, -b_start_value = 0.004, -c_start_value = 5) -``` - -#### References - -Eilers, P. H. C., & Peeters, J. C. H. (1988). *A model for the relationship between light intensity and the rate of photosynthesis in phytoplankton.* Ecological Modelling, 42(3-4), 199-215. [doi:10.1016/0304-3800(88)90057-9](https://doi.org/10.1016/0304-3800(88)90057-9). - ---- - -### walsby_generate_regression_ETR_I() and walsby_generate_regression_ETR_II() - -This function generates a regression model based on Walsby (1997) in a modified version without the respiration term. Naming conventions from Romoth (2019) are used. ETRmax is calculated without taking photoinhibition into account. - -#### Parameters - -- **data**: A `data.table` containing the input data from `read_dual_pam_data`. -- **etr_max_start_value**: Numeric. The starting value for the parameter $$ETR_{max}$$ in the model. Defaults to `etr_max_start_value_walsby_default`. -- **alpha_start_value**: Numeric. The starting value for the parameter $$\alpha$$ in the model. Defaults to `alpha_start_value_walsby_default`. -- **beta_start_value**: Numeric. The starting value for the parameter $$\beta$$ in the model. Defaults to `beta_start_value_walsby_default`. - -#### Return - -A list containing the following elements: - -- **etr_regression_data**: A `data.table` with the predicted values of ETR I or ETR II to each PAR based on the fitted model. -- **residual_sum_of_squares**: Difference between observed and predicted ETR values, expressed as the sum of squared residuals. -- **root_mean_squared_error**: Difference between observed and predicted ETR values, expressed as the root mean squared error. -- **relative_root_mean_squared_error**: Difference between observed and predicted ETR values, expressed as the relative root mean squared error, normalized by the mean. -- **etr_max**: The maximum electron transport rate without photoinhibition ($$ETR_{max}$$). -- **alpha**: The initial slope of the light curve ($$\alpha$$). -- **beta**: The photoinhibition of the light curve ($$\beta$$). - -#### Details - -This function uses non-linear least squares fitting to estimate the parameters for the Walsby model, which describes the relationship between PAR and ETR I. The model used is: - -$$ETR = ETR_{max} \cdot \left(1 - e^{\left(-\frac{\alpha \cdot I}{ETR_{max}}\right)}\right) + \beta \cdot I$$ - -It is valid: $$I = PAR$$ - -#### References - -Walsby, A. E. (1997). Numerical integration of phytoplankton photosynthesis through time and depth in a water column. *New Phytologist*, 136(2), 189-209. - -Romoth, K., Nowak, P., Kempke, D., Dietrich, A., Porsche, C., & Schubert, H. (2019). Acclimation limits of *Fucus evanescens* along the salinity gradient of the southwestern Baltic Sea. *Botanica Marina*, 62(1), 1-12. - ---- - -### vollenweider_modified() - -This function adds parameters that were not originally included in the Vollenweider (1965) model, but were introduced by other models and renames the parameters to a standardised one for all models. See the table below. - -#### Parameters - -- **model_result**: A list containing the results of the model, including parameters such as `pmax`, `alpha`, and `ik`. - -#### Return - -Returns a modified model result as a list with the following elements: - -- **etr_type**: ETR Type based on the model result. -- **etr_regression_data**: Regression data with ETR predictions based on the fitted model. -- **residual_sum_of_squares**: Difference between observed and predicted ETR values, expressed as the sum of squared residuals. -- **root_mean_squared_error**: Difference between observed and predicted ETR values, expressed as the root mean squared error. -- **relative_root_mean_squared_error**: Difference between observed and predicted ETR values, expressed as the relative root mean squared error, normalized by the mean. -- **a**: obtained paramter `a`, here equal to `etrmax_without_photoinhibition` -- **b**: obtained paramter `b`, transfered as `a` -- **c**: obtained paramter `c`, here transfered as `alpha` -- **d**: obtained paramter `c`, here transfered as `n` -- **alpha**: The initial slope of the light curve, calculated as: - -$${alpha} = \frac{{etrmax\\_with\\_photoinhibition}}{{ik\\_with\\_photoinhibition}}$$ - -- **beta**: Not available, here set to `NA_real_` -- **etrmax_with_photoinhibition**: The maximum electron transport rate with photoinhibition, transfered as `popt` -- **etrmax_without_photoinhibition**: The maximum electron transport rate without photoinhibition, transfered as: `pmax` -- **ik_with_photoinhibition**: PAR where the transition point from light limitation to light saturation is achieved taking photoinhibition into account, transfered as: `iik` -- **ik_without_photoinhibition**: PAR where the transition point from light limitation to light saturation is achieved not taking photoinhibition into account, transfered as: `ik` -- **im_with_photoinhibition**: The PAR at which the maximum electron transport rate is achieved by taking photoinhibition into account. Although $I_m$ was mentioned in the original publication, no general solution was presented. Therefore, we decided to include it only in the modified version. Determined as: - -```r - etr_regression_data <- get_etr_regression_data_from_model_result(model_result) - im_with_photoinhibition <- etr_regression_data[etr_regression_data[[prediction_name]] == max(etr_regression_data[[prediction_name]]), ][[PAR_name]] -``` - -- **w**: Not available, here set to `NA_real_` -- **ib**: Not available, here set to `NA_real_` -- **etrmax_without_with_ratio**: Ratio of `etrmax_without_photoinhibition` / `etrmax_with_photoinhibition` and `ik_without_photoinhibition` / `ik_with_photoinhibition`, transfered as: `pmax_popt_and_ik_iik_ratio` - -#### Details - -This function validates the `model_result` input and processes relevant parameters for the Vollenweider model, creating a structured list using `create_modified_model_result`. This standardized output allows for consistent analysis and comparison across different models. - -#### Examples - -```r -modified_result_vollenweider <- vollenweider_modified(model_result_vollenweider) -``` ---- - -### platt_modified() - -This function adds parameters that were not originally included in the Platt (1980) model, but were introduced by other models and renames the parameters to a standardised one for all models. See the table below. - -#### Parameters - -- **model_result**: A list containing the results of the model, including parameters such as `etr_max`, `alpha`, and `beta`. - -#### Return - -Returns a modified model result as a list with the following elements: - -- **etr_type**: ETR Type based on the model result. -- **etr_regression_data**: Regression data with ETR predictions based on the fitted model. -- **residual_sum_of_squares**: Difference between observed and predicted ETR values, expressed as the sum of squared residuals. -- **root_mean_squared_error**: Difference between observed and predicted ETR values, expressed as the root mean squared error. -- **relative_root_mean_squared_error**: Difference between observed and predicted ETR values, expressed as the relative root mean squared error, normalized by the mean. -- **a**: obtained paramter `a`, here equal to `etrmax_without_photoinhibition` -- **b**: obtained paramter `b`, here equal to `alpha` -- **c**: obtained paramter `c`, here equal to `beta` -- **d**: not available, here set to `NA_real_` -- **alpha**: The initial slope of the light curve, transfered unchanged as `alpha` -- **beta**: The photoinhibition of the light curve, transfered unchanged as `beta` -- **etrmax_with_photoinhibition**: The maximum electron transport rate with photoinhibition, transfered as `pm` -- **etrmax_without_photoinhibition**: The maximum electron transport rate without photoinhibition, transfered as: `ps` -- **ik_with_photoinhibition**: PAR where the transition point from light limitation to light saturation is achieved taking photoinhibition into account, transfered as: `ik` -- **ik_without_photoinhibition**: PAR where the transition point from light limitation to light saturation is achieved not taking photoinhibition into account, transfered as: `is` -- **im_with_photoinhibition**: The PAR at which the maximum electron transport rate is achieved by taking photoinhibition into account, transfered as: `im` -- **w**: Not available, here set to `NA_real_` -- **ib**: Transfered unchange as: `ib` -- **etrmax_without_with_ratio**: Ratio of `etrmax_without_photoinhibition` / `etrmax_with_photoinhibition` and `ik_without_photoinhibition` / `ik_with_photoinhibition`. Calculated as: - -$${{etrmax\\_without\\_with\\_ratio}} = \frac{{etrmax\\_without\\_photoinhibition}}{{etrmax\\_with\\_photoinhibition}}$$ - -#### Details - -This function validates the `model_result` input and processes relevant parameters for the Platt model, creating a structured list using `create_modified_model_result`. This standardized output allows for consistent analysis and comparison across different models. - -#### Examples - -```r -modified_result_platt <- platt_modified(model_result_platt) -``` - ---- - -### eilers_peeters_modified() - -This function adds parameters that were not originally included in the Eilers and Peeters (1988) model, but were introduced by other models and renames the parameters to a standardised one for all models. See the table below. - -#### Parameters - -- **model_result**: A list containing the results of the model, including parameters such as `a`, `b`, `c`, `s`, `pm`, `ik`, `im`, and `w`. - -#### Return - -Returns a modified model result as a list with the following elements: - -- **etr_type**: ETR Type based on the model result. -- **etr_regression_data**: Regression data with ETR predictions based on the fitted model. -- **residual_sum_of_squares**: Difference between observed and predicted ETR values, expressed as the sum of squared residuals. -- **root_mean_squared_error**: Difference between observed and predicted ETR values, expressed as the root mean squared error. -- **relative_root_mean_squared_error**: Difference between observed and predicted ETR values, expressed as the relative root mean squared error, normalized by the mean. -- **a**: The obtained parameter $$a$$ -- **b**: The obtained parameter $$b$$ -- **c**: The obtained parameter $$c$$ -- **d**: Not available, here set to `NA_real_` -- **alpha**: The initial slope of the light curve, transfered unchanged as `s` -- **beta**: Not available, here set to `NA_real_` -- **etrmax_with_photoinhibition**: The maximum electron transport rate with photoinhibition, transfered as `pm` -- **etrmax_without_photoinhibition**: Not available, here set to `NA_real_` -- **ik_with_photoinhibition**: PAR where the transition point from light limitation to light saturation is achieved taking photoinhibition into account, transfered as `ik` -- **ik_without_photoinhibition**: Not available, here set to `NA_real_` -- **im_with_photoinhibition**: The PAR at which the maximum electron transport rate is achieved by taking photoinhibition into account, transfered as`im` -- **w**: The sharpness of the peak, transfered as `w` -- **ib**: Not available, here set to `NA_real_` -- **etrmax_without_with_ratio**: Not available, here set to `NA_real_` - -#### Details - -This function validates the `model_result` input, extracts relevant parameters for the modified Eilers-Peeters model, and creates a structured list using `create_modified_model_result`. The list serves as a standardized output format for further analysis. - -#### Examples - -```r -# Example usage for eilers_peeters_modified -modified_result <- eilers_peeters_modified(model_result_eilers_peeters) -``` ---- - -### walsby_modified() - -This function adds parameters that were not originally included in the Walsby (1997) model, but were introduced by other models and renames the parameters to a standardised one for all models. See the table below. - -#### Parameters - -- **model_result**: A list containing the results of the model, including parameters such as `etr_max`, `alpha`, and `beta`. - -#### Return - -Returns a modified model result as a list with the following elements: - -- **etr_type**: ETR Type based on the model result. -- **etr_regression_data**: Regression data with ETR predictions based on the fitted model. -- **residual_sum_of_squares**: Difference between observed and predicted ETR values, expressed as the sum of squared residuals. -- **root_mean_squared_error**: Difference between observed and predicted ETR values, expressed as the root mean squared error. -- **relative_root_mean_squared_error**: Difference between observed and predicted ETR values, expressed as the relative root mean squared error, normalized by the mean. -- **a**: obtained paramter `a`, here equal to `etrmax_without_photoinhibition` -- **b**: obtained paramter `b`, here equal to `alpha` -- **c**: obtained paramter `c`, here equal to `beta` -- **d**: not available, here set to `NA_real_` -- **alpha**: The initial slope of the light curve, transfered unchanged as `alpha` -- **beta**: The photoinhibition of the light curve, transfered unchanged as `beta` -- **etrmax_with_photoinhibition**: The maximum electron transport rate with photoinhibition, determined as: - -```r - etr_regression_data <- get_etr_regression_data_from_model_result(model_result) - etr_max_row <- etr_regression_data[etr_regression_data[[prediction_name]] == max(etr_regression_data[[prediction_name]]), ] - etrmax_with_photoinhibition <- etr_max_row[[prediction_name]] -``` - -- **etrmax_without_photoinhibition**: The maximum electron transport rate without photoinhibition, transfered as: `etr_max` -- **ik_with_photoinhibition**: PAR where the transition point from light limitation to light saturation is achieved taking photoinhibition into account, calculated as: - -$$ik\\_with\\_photoinhibition = \frac{etrmax\\_with\\_photoinhibition}{alpha}$$ - -- **ik_without_photoinhibition**: PAR where the transition point from light limitation to light saturation is achieved not taking photoinhibition into account, calculated as: - -$$ik\\_without\\_photoinhibition = \frac{etrmax\\_without\\_photoinhibition}{alpha}$$ - -- **im_with_photoinhibition**: The PAR at which the maximum electron transport rate is achieved by taking photoinhibition into account, calculated as: - -```r - etr_regression_data <- get_etr_regression_data_from_model_result(model_result) - etr_max_row <- etr_regression_data[etr_regression_data[[prediction_name]] == max(etr_regression_data[[prediction_name]]), ] - im_with_photoinhibition <- etr_max_row[[PAR_name]] -``` - -- **w**: Not available, here set to `NA_real_` -- **ib**: Not available, here set to `NA_real_` -- **etrmax_without_with_ratio**: Ratio of `etrmax_without_photoinhibition` / `etrmax_with_photoinhibition` and `ik_without_photoinhibition` / `ik_with_photoinhibition`. Calculated as: - -$${{etrmax\\_without\\_with\\_ratio}} = \frac{{etrmax\\_without\\_photoinhibition}}{{etrmax\\_with\\_photoinhibition}}$$ - -#### Details - -This function validates the `model_result` input and processes relevant parameters for the Walsby model, creating a structured list using `create_modified_model_result`. This standardized output allows for consistent analysis and comparison across different photosynthesis models. - -#### Examples - -```r -modified_result <- walsby_modified(model_result_walsby) -``` ---- - -### Naming overview - -#### Publication-accurate naming and the respective modified naming - -modified |Eilers and Peeters |Platt |Walsby |Vollenweider | -|-|-|-|-|-| -|residual_sum_of_squares |residual_sum_of_squares |residual_sum_of_squares |residual_sum_of_squares |residual_sum_of_squares | -|root_mean_squared_error |root_mean_squared_error |root_mean_squared_error |root_mean_squared_error |root_mean_squared_error | -|relative_root_mean_squared_error |relative_root_mean_squared_error |relative_root_mean_squared_error |relative_root_mean_squared_error |relative_root_mean_squared_error | -|a |a |ps |etr_max |pmax | -|b |b |alpha |alpha |a | -|c |c |beta |beta |alpha | -|d |NA |NA |NA |n | -|alpha |s |alpha |alpha |NA | -|beta |NA |beta |beta |NA | -|etrmax_with_photoinhibition |pm |pm |NA |popt | -|etrmax_without_photoinhibition |NA |ps |etr_max |pmax | -|ik_with_photoinhibition |ik |ik |NA |iik | -|ik_without_photoinhibition |NA |is |NA |ik | -|im_with_photoinhibition |im |im |NA |NA | -|w |w |NA |NA |NA | -|ib |NA |ib |NA |NA | -|etrmax_without_with_ratio |NA |NA |NA |pmax_popt_and_ik_iik_ratio | - ---- - -#### Publication-accurate naming and the respective modified naming with additional calculations not included in the original publication - -|modified |Eilers and Peeters |Platt |Walsby |Vollenweider | -|-|-|-|-|-| -|residual_sum_of_squares |residual_sum_of_squares |residual_sum_of_squares |residual_sum_of_squares |residual_sum_of_squares | -|root_mean_squared_error |root_mean_squared_error |root_mean_squared_error |root_mean_squared_error |root_mean_squared_error | -|relative_root_mean_squared_error |relative_root_mean_squared_error |relative_root_mean_squared_error |relative_root_mean_squared_error |relative_root_mean_squared_error | -|a |a |ps |etr_max |pmax | -|b |b |alpha |alpha |a | -|c |c |beta |beta |alpha | -|d |NA |NA |NA |n | -|alpha |s |alpha |alpha |real_alpha | -|beta |NA |beta |beta |NA | -|etrmax_with_photoinhibition |pm |pm |etrmax_with_photoinhibition |popt | -|etrmax_without_photoinhibition |NA |ps |etr_max |pmax | -|ik_with_photoinhibition |ik |ik |ik_with_photoinhibition |iik | -|ik_without_photoinhibition |NA |is |ik_without_photoinhibition |ik | -|im_with_photoinhibition |im |im |im_with_photoinhibition |im_with_photoinhibition | -|w |w |NA |NA |NA | -|ib |NA |ib |NA |NA | -|etrmax_without_with_ratio |NA |etrmax_without_with_ratio |etrmax_without_with_ratio |pmax_popt_and_ik_iik_ratio | - ---- - -### compare_regression_models_ETR_I() and compare_regression_models_ETR_II() - -This function compares different regression models. - -#### Parameters - -- **data_dir**: A character string specifying the directory where the input data files are located. -- **read_func**: Function used to read the CSV files (e.g., `read_dual_pam_data`) - -#### Return - -A vector containing the total points assigned to each regression model based on their performance. Models are ranked based on the calculated deviation of the difference between observed and predicted values. Rating: - -- 1st: 3 points -- 2nd: 2 points -- 3rd: 1 point -- 4th: 0 points - -#### Details - -This function allows a straightforward comparison of the models: Eilers-Peeters (1988), Platt (1980), Vollenweider (1965), and Walsby (1997). The results can guide users in selecting the most appropriate model for their data. If regression is not possible for a model, no points are awarded for the file for any of the models. Start values cannot be adjusted in this function. - -#### Example - -```r -#raw data file directory -data_dir_compare <- file.path(getwd(), "data") - -#compare regression models -compare_regression_models_ETR_II <- compare_regression_models_ETR_II(data_dir_compare, read_dual_pam_data) -print(compare_regression_models_ETR_II) -``` - -#### References - -Eilers, P. H. C., & Peeters, J. C. H. (1988). *A model for the relationship between light intensity and the rate of photosynthesis in phytoplankton.* Ecological Modelling, 42(3-4), 199-215. [doi:10.1016/0304-3800(88)90057-9](https://doi.org/10.1016/0304-3800(88)90057-9). - -Platt, T., Gallegos, C. L., & Harrison, W. G. (1980). *Photoinhibition of photosynthesis in natural assemblages of marine phytoplankton*. Journal of Marine Research, 38(4). Retrieved from . - -Romoth, K., Nowak, P., Kempke, D., Dietrich, A., Porsche, C., & Schubert, H. (2019). Acclimation limits of *Fucus evanescens* along the salinity gradient of the southwestern Baltic Sea. *Botanica Marina*, 62(1), 1-12. - -Vollenweider, R. A. (1965). *Calculation models of photosynthesis-depth curves and some implications regarding day rate estimates in primary production measurements*, p. 427-457. In C. R. Goldman [ed.], *Primary Productivity in Aquatic Environments*. Mem. Ist. Ital. Idrobiol., 18 Suppl., University of California Press, Berkeley. - -Walsby, A. E. (1997). Numerical integration of phytoplankton photosynthesis through time and depth in a water column. *New Phytologist*, 136(2), 189-209. - ---- - -### plot_control() - -This function creates a control plot for the used model based on the provided data and model results. - -#### Parameters - -- **data**: A `data.table` containing the original ETR and yield data for the plot. -- **model_result**: A list containing the fitting results of the used model and the calculated parameters (alpha, ik, etc.). -- **title**: A character string that specifies the title of the plot. -- **color**: A color specification for the regression line in the plot. - -#### Return - -A plot displaying the original ETR and Yield values and the regression data. A table below the plot shows the calculated data (alpha, ik, etc.). - -#### Example - -```r -plot_control_eilers_peeters_ETR_II <- plot_control( - data = pam_data, - model_result = modified_model_result_eilers_peeters_ETR_II, - title = "eilers_peeters ETR II modified 20240925.csv", - color = "purple" -) -print(plot_control_eilers_peeters_ETR_II) -``` - -![Plot](img/test-eilers_peeters_etr_II_modified_control_plot_20240925.jpg) - ---- - -### combo_plot_control() - -The `combo_plot_control()` function generates a combined plot of electron transport rate (ETR) data and regression model predictions, along with a customized table summarizing the parameters for each model. - -#### Parameters - -- **title**: A character string specifying the title for the plot. -- **data**: A data frame containing the raw input data for ETR and Photosynthetically Active Radiation (PAR). -- **model_results**: A list of model results, where each model result is a list containing regression data and parameters for ETR. -- **name_list**: A list of names corresponding to each model result. These names will be used in the legend and table. -- **color_list**: A list of color values for each model result. Colors are used to differentiate lines on the plot. - -#### Return - -A plot displaying the original ETR and Yield values and the regression data from different models. A table below the plot shows the calculated data (alpha, ik, etc.). - -#### Examples - -```r -test_data_file <- file.path(getwd(), "data", "dual_pam_data", "20240925.csv") - data <- read_dual_pam_data(test_data_file) - - eilers_peeters <- eilers_peeters_modified(eilers_peeters_generate_regression_ETR_II(data)) - platt <- platt_modified(platt_generate_regression_ETR_II(data)) - walsby <- walsby_modified(walsby_generate_regression_ETR_II(data)) - vollenweider <- vollenweider_modified(vollenweider_generate_regression_ETR_II(data)) - - plot <- combo_plot_control( - "etr II test-combo_plot_control_20240925.csv", - data, - list(eilers_peeters, platt, walsby, vollenweider), - list("eilers_peeters", "platt", "walsby", "vollenweider"), - list("purple", "blue", "green", "red") - ) -``` - -![combo Plot](img/test_combo_plot_control_etr_II.jpg) - ---- - -### write_model_result_csv() - -This function exports the raw input data, regression data, and model parameters into separate CSV files for easy access and further analysis. - -#### Parameters - -- **dest_dir**: A character string specifying the directory where the CSV files will be saved. -- **name**: A character string specifying the base name for the output files. -- **data**: A data frame containing the raw input data used in the model. -- **model_result**: A list containing the model results, including parameter values and regression data. - -#### Details - -This function creates three CSV files: - -1. **`name_raw_data.csv`**: Contains the original raw data used in the model. -2. **`name_regression_data.csv`**: Contains the regression data with predictions for electron transport rate (ETR). -3. **`name_model_result.csv`**: Contains the parameter values from the model results (excluding regression data), including parameters like `alpha`, `beta`, and `etr_max`. - -Each file will be named using the `name` parameter as a prefix, followed by a specific suffix for clarity. - -#### Examples - -```r -write_model_result_csv( - dest_dir = "output", - name = "eilers_peeters_experiment_001", - data = raw_data, - model_result = model_result_eilers_peeters -) -``` --- ## Test coverage diff --git a/docs/compare_regression_models.md b/docs/compare_regression_models.md new file mode 100644 index 0000000..8bb92b8 --- /dev/null +++ b/docs/compare_regression_models.md @@ -0,0 +1,44 @@ +### compare_regression_models_ETR_I() and compare_regression_models_ETR_II() + +This function compares different regression models. + +#### Parameters + +- **data_dir**: A character string specifying the directory where the input data files are located. +- **read_func**: Function used to read the CSV files (e.g., `read_dual_pam_data`) + +#### Return + +A vector containing the total points assigned to each regression model based on their performance. Models are ranked based on the calculated deviation of the difference between observed and predicted values. Rating: + +- 1st: 3 points +- 2nd: 2 points +- 3rd: 1 point +- 4th: 0 points + +#### Details + +This function allows a straightforward comparison of the models: Eilers-Peeters (1988), Platt (1980), Vollenweider (1965), and Walsby (1997). The results can guide users in selecting the most appropriate model for their data. If regression is not possible for a model, no points are awarded for the file for any of the models. Start values cannot be adjusted in this function. + +#### Example + +```r +#raw data file directory +data_dir_compare <- file.path(getwd(), "data") + +#compare regression models +compare_regression_models_ETR_II <- compare_regression_models_ETR_II(data_dir_compare, read_dual_pam_data) +print(compare_regression_models_ETR_II) +``` + +#### References + +Eilers, P. H. C., & Peeters, J. C. H. (1988). *A model for the relationship between light intensity and the rate of photosynthesis in phytoplankton.* Ecological Modelling, 42(3-4), 199-215. [doi:10.1016/0304-3800(88)90057-9](https://doi.org/10.1016/0304-3800(88)90057-9). + +Platt, T., Gallegos, C. L., & Harrison, W. G. (1980). *Photoinhibition of photosynthesis in natural assemblages of marine phytoplankton*. Journal of Marine Research, 38(4). Retrieved from . + +Romoth, K., Nowak, P., Kempke, D., Dietrich, A., Porsche, C., & Schubert, H. (2019). Acclimation limits of *Fucus evanescens* along the salinity gradient of the southwestern Baltic Sea. *Botanica Marina*, 62(1), 1-12. + +Vollenweider, R. A. (1965). *Calculation models of photosynthesis-depth curves and some implications regarding day rate estimates in primary production measurements*, p. 427-457. In C. R. Goldman [ed.], *Primary Productivity in Aquatic Environments*. Mem. Ist. Ital. Idrobiol., 18 Suppl., University of California Press, Berkeley. + +Walsby, A. E. (1997). Numerical integration of phytoplankton photosynthesis through time and depth in a water column. *New Phytologist*, 136(2), 189-209. diff --git a/docs/generate_regressions.md b/docs/generate_regressions.md new file mode 100644 index 0000000..d550b73 --- /dev/null +++ b/docs/generate_regressions.md @@ -0,0 +1,249 @@ + +### vollenweider_generate_regression_ETR_I() and vollenweider_generate_regression_ETR_II() + +This function generates a regression model based on Vollenweider (1965). Original naming conventions from the publication are used. + +#### Parameters + +- **data**: A `data.table` containing the input data, processed according to the corresponding read function (e.g. `read_dual_pam_data`). +- **etr_type**: A character string specifying the column name of the response variable (ETR I or ETR II) to be used in the model. +- **pmax_start_value**: Numeric. The starting value for the parameter $$p_{max}$$ in the model. Defaults to `pmax_start_values_vollenweider_default`. +- **a_start_value**: Numeric. The starting value for the parameter $$a$$ in the model. Defaults to `a_start_values_vollenweider_default`. +- **alpha_start_value**: Numeric. The starting value for the parameter $$\alpha$$ in the model. Defaults to `alpha_start_values_vollenweider_default`. +- **n_start_value**: Numeric. The starting value for the parameter $$n$$ in the model. Defaults to `n_start_values_vollenweider_default`. + +#### Return + +A list containing the following elements: + +- **etr_regression_data**: A `data.table` with the predicted values of ETR I or ETR II to each PAR based on the fitted model. +- **residual_sum_of_squares**: Difference between observed and predicted ETR values, expressed as the sum of squared residuals. +- **root_mean_squared_error**: Difference between observed and predicted ETR values, expressed as the root mean squared error. +- **relative_root_mean_squared_error**: Difference between observed and predicted ETR values, expressed as the relative root mean squared error, normalized by the mean. +- **residual_sum_of_squares**: The deviation between the actual and predicted ETR values. +- **pmax**: The maximum electron transport rate without photoinhibition ($$p_{max}$$). +- **a**: The obtained parameter $$a$$. +- **alpha**: The obtained parameter $$\alpha$$. +- **n**: The obtained parameter $$n$$. +- **popt**: The maximum electron transport rate with photoinhibition ($$p_{opt}$$). A function computes predicted photosynthetic rates for each PAR value and tracks the maximum rate observed and is therefore modified from the original approach: + +```r + popt <- 0 + pars <- c() + predictions <- c() + for (p in min(data$PAR):max(data$PAR)) { + pars <- c(pars, p) + prediction <- pmax * (((a * p) / (sqrt(1 + (a * p)^2))) * (1 / (sqrt(1 + (alpha * p)^2)^n))) + predictions <- c( + predictions, + prediction + ) + + if (prediction > popt) { + popt <- prediction + } + } +``` + +- **ik**: PAR where the transition point from light limitation to light saturation is achieved without photoinhibition ($$I_k$$). Calculated as: + +$$I_k = \\frac{1}{a}$$ + +- **iik**: PAR where the transition point from light limitation to light saturation is achieved with photoinhibition ($$I_k^\prime$$). Calculated as: + +$$I_k^\prime = \frac{I_k \cdot p_{opt}}{p_{max}}$$ + +- **pmax_popt_and_ik_iik_ratio**: Ratio of $$p_{max}$$ to $$p_{opt}$$ and $$I_k$$ to $$I_k^\prime$$ ($$p_{max} / p_{opt}$$). Calculated as: + +$$\\p_max\\_popt\\_and\\_ik\\_iik\\_ratio = \frac{I_k}{I_k^\prime}$$ + +#### Details + +This function uses non-linear least squares fitting to estimate the parameters for the Vollenweider model, which describes the relationship between PAR and ETR. The model used is: + +$$p = p_{max} \cdot \frac{a \cdot i}{\sqrt{1 + (a \cdot i)^2}} \cdot \frac{1}{\left(\sqrt{1 + (\alpha \cdot i)^2}\right)^n}$$ + +It is valid: $$i = PAR; p = ETR$$ + +#### Example + +```r +result_vollenweider_ETR_II <- vollenweider_generate_regression_ETR_II(data, + pmax_start_value = 40, + a_start_value = 0.1, + alpha_start_value = -0.0001, + n_start_value = 350) +``` + +#### References + +Vollenweider, R. A. (1965). *Calculation models of photosynthesis-depth curves and some implications regarding day rate estimates in primary production measurements*, p. 427-457. In C. R. Goldman [ed.], *Primary Productivity in Aquatic Environments*. Mem. Ist. Ital. Idrobiol., 18 Suppl., University of California Press, Berkeley. + +--- + +### platt_generate_regression_ETR_I() and platt_generate_regression_ETR_II() + +This function generates a regression model based on Platt (1980). Original naming conventions from the publication are used. + +#### Parameters + +- **data**: A `data.table` containing the input data from `read_dual_pam_data`. +- **alpha_start_value**: Numeric. The starting value for the parameter $$\alpha$$ in the model. Defaults to `alpha_start_value_platt_default`. +- **beta_start_value**: Numeric. The starting value for the parameter $$\beta$$ in the model. Defaults to `beta_start_value_platt_default`. +- **ps_start_value**: Numeric. The starting value for the parameter $$p_s$$ in the model. Defaults to `ps_start_value_platt_default`. + +#### Return + +A list containing the following elements: + +- **etr_regression_data**: A `data.table` with the predicted values of ETR I or ETR II to each PAR based on the fitted model. +- **residual_sum_of_squares**: Difference between observed and predicted ETR values, expressed as the sum of squared residuals. +- **root_mean_squared_error**: Difference between observed and predicted ETR values, expressed as the root mean squared error. +- **relative_root_mean_squared_error**: Difference between observed and predicted ETR values, expressed as the relative root mean squared error, normalized by the mean. +- **ps**: The maximum electron transport rate without photoinhibition ($$P_s$$). +- **alpha**: The initial slope of the light curve ($$\alpha$$). +- **beta**: The photoinhibition of the light curve ($$\beta$$). +- **pm**: The maximum electron transport rate with photoinhibition ($$P_m$$). Calculated as: + +$$P_m = P_s \cdot \left(\frac{\alpha}{\alpha + \beta}\right) \cdot \left(\left(\frac{\beta}{\alpha + \beta}\right)^{\frac{\beta}{\alpha}}\right)$$ + +- **ik**: PAR where the transition point from light limitation to light saturation is achieved with photoinhibition ($$I_k$$). Calculated as: + +$$I_k = \frac{P_m}{\alpha}$$ + +- **is**: PAR where the transition point from light limitation to light saturation is achieved without photoinhibition ($$I_s$$). Calculated as: + +$$I_s = \frac{P_s}{\alpha}$$ + +- **im**: The PAR at which the maximum electron transport rate is achieved with photoinhibition ($$I_m$$). Calculated as: + +$$I_m = \left(\frac{P_s}{\alpha}\right) \cdot \log\left(\frac{\alpha + \beta}{\beta}\right)$$ + +- **ib**: ($$I_b$$) Calculated as: + +$$I_b = \frac{P_s}{\beta}$$ + +#### Details + +This function uses non-linear least squares fitting to estimate the parameters for the Platt model, which describes the relationship between PAR and ETR. The model used is: + +$$P = P_s \cdot \left(1 - e^\frac{{-\alpha \cdot I}}{P_s}\right) \cdot e^\left(\frac{{-\beta \cdot I}}{P_s}\right)$$ + +It is valid: $$I = PAR; p = ETR$$ + +#### Example + +```r +result_platt_ETR_II <- platt_generate_regression_ETR_II(data, + alpha_start_value = 0.3, + beta_start_value = 0.01, + ps_start_value = 30) +``` + +#### References + +Platt, T., Gallegos, C. L., & Harrison, W. G. (1980). *Photoinhibition of photosynthesis in natural assemblages of marine phytoplankton*. Journal of Marine Research, 38(4). Retrieved from . + +--- + +### eilers_peeters_generate_regression_ETR_I() and eilers_peeters_generate_regression_ETR_II() + +This function generates a regression model based on Eilers-Peeters (1988). Original naming conventions from the publication are used. All parameters are calculated taking photoinhibition into account. + +#### Parameters + +- **data**: A `data.table` containing the input data from `read_dual_pam_data`. +- **a_start_value**: Numeric. The starting value for the parameter $$a$$ in the model. Defaults to `a_start_values_eilers_peeters_default`. +- **b_start_value**: Numeric. The starting value for the parameter $$b$$ in the model. Defaults to `b_start_values_eilers_peeters_default`. +- **c_start_value**: Numeric. The starting value for the parameter $$c$$ in the model. Defaults to `c_start_values_eilers_peeters_default`. + +#### Return + +A list containing the following elements: + +- **etr_regression_data**: A `data.table` with the predicted values of ETR I or ETR II to each PAR based on the fitted model. +- **residual_sum_of_squares**: Difference between observed and predicted ETR values, expressed as the sum of squared residuals. +- **root_mean_squared_error**: Difference between observed and predicted ETR values, expressed as the root mean squared error. +- **relative_root_mean_squared_error**: Difference between observed and predicted ETR values, expressed as the relative root mean squared error, normalized by the mean. +- **a**: The obtained parameter $$a$$. +- **b**: The obtained parameter $$b$$. +- **c**: The obtained parameter $$c$$. +- **pm**: The maximum electron transport rate ($$p_m$$). Calculated as: + +$$p_m = \frac{1}{b + 2 \sqrt{a \cdot c}}$$ + +- **s**: The initial slope of the light curve ($$s$$). Calculated as: + +$$s = \frac{1}{c}$$ + +- **ik**: PAR where the transition point from light limitation to light saturation is achieved ($$I_k$$). Calculated as: + +$$I_k = \frac{c}{b + 2 \sqrt{a \cdot c}}$$ + +- **im**: The PAR at which the maximum electron transport rate is achieved ($$I_m$$). Calculated as: + +$$I_m = \sqrt{\frac{c}{a}}$$ + +- **w**: The sharpness of the peak ($$w$$). Calculated as: + +$$w = \frac{b}{\sqrt{a \cdot c}}$$ + +#### Details + +This function uses non-linear least squares fitting to estimate the parameters for the Eilers-Peeters model, which describes the relationship between PAR and ETR. The model used is: + +$$ p = \frac{I}{a \cdot I^2 + b \cdot I + c} $$ + +It is valid: $$I = PAR$$; $$p = ETR$$ + +#### Example + +```r +result_eilers_peeters_ETR_II <- eilers_peeters_generate_regression_ETR_II(data, +a_start_value = 0.00004, +b_start_value = 0.004, +c_start_value = 5) +``` + +#### References + +Eilers, P. H. C., & Peeters, J. C. H. (1988). *A model for the relationship between light intensity and the rate of photosynthesis in phytoplankton.* Ecological Modelling, 42(3-4), 199-215. [doi:10.1016/0304-3800(88)90057-9](https://doi.org/10.1016/0304-3800(88)90057-9). + +--- + +### walsby_generate_regression_ETR_I() and walsby_generate_regression_ETR_II() + +This function generates a regression model based on Walsby (1997) in a modified version without the respiration term. Naming conventions from Romoth (2019) are used. ETRmax is calculated without taking photoinhibition into account. + +#### Parameters + +- **data**: A `data.table` containing the input data from `read_dual_pam_data`. +- **etr_max_start_value**: Numeric. The starting value for the parameter $$ETR_{max}$$ in the model. Defaults to `etr_max_start_value_walsby_default`. +- **alpha_start_value**: Numeric. The starting value for the parameter $$\alpha$$ in the model. Defaults to `alpha_start_value_walsby_default`. +- **beta_start_value**: Numeric. The starting value for the parameter $$\beta$$ in the model. Defaults to `beta_start_value_walsby_default`. + +#### Return + +A list containing the following elements: + +- **etr_regression_data**: A `data.table` with the predicted values of ETR I or ETR II to each PAR based on the fitted model. +- **residual_sum_of_squares**: Difference between observed and predicted ETR values, expressed as the sum of squared residuals. +- **root_mean_squared_error**: Difference between observed and predicted ETR values, expressed as the root mean squared error. +- **relative_root_mean_squared_error**: Difference between observed and predicted ETR values, expressed as the relative root mean squared error, normalized by the mean. +- **etr_max**: The maximum electron transport rate without photoinhibition ($$ETR_{max}$$). +- **alpha**: The initial slope of the light curve ($$\alpha$$). +- **beta**: The photoinhibition of the light curve ($$\beta$$). + +#### Details + +This function uses non-linear least squares fitting to estimate the parameters for the Walsby model, which describes the relationship between PAR and ETR I. The model used is: + +$$ETR = ETR_{max} \cdot \left(1 - e^{\left(-\frac{\alpha \cdot I}{ETR_{max}}\right)}\right) + \beta \cdot I$$ + +It is valid: $$I = PAR$$ + +#### References + +Walsby, A. E. (1997). Numerical integration of phytoplankton photosynthesis through time and depth in a water column. *New Phytologist*, 136(2), 189-209. + +Romoth, K., Nowak, P., Kempke, D., Dietrich, A., Porsche, C., & Schubert, H. (2019). Acclimation limits of *Fucus evanescens* along the salinity gradient of the southwestern Baltic Sea. *Botanica Marina*, 62(1), 1-12. \ No newline at end of file diff --git a/docs/modify_model_results.md b/docs/modify_model_results.md new file mode 100644 index 0000000..8a95cb1 --- /dev/null +++ b/docs/modify_model_results.md @@ -0,0 +1,256 @@ + + +### vollenweider_modified() + +This function adds parameters that were not originally included in the Vollenweider (1965) model, but were introduced by other models and renames the parameters to a standardised one for all models. See the table below. + +#### Parameters + +- **model_result**: A list containing the results of the model, including parameters such as `pmax`, `alpha`, and `ik`. + +#### Return + +Returns a modified model result as a list with the following elements: + +- **etr_type**: ETR Type based on the model result. +- **etr_regression_data**: Regression data with ETR predictions based on the fitted model. +- **residual_sum_of_squares**: Difference between observed and predicted ETR values, expressed as the sum of squared residuals. +- **root_mean_squared_error**: Difference between observed and predicted ETR values, expressed as the root mean squared error. +- **relative_root_mean_squared_error**: Difference between observed and predicted ETR values, expressed as the relative root mean squared error, normalized by the mean. +- **a**: obtained paramter `a`, here equal to `etrmax_without_photoinhibition` +- **b**: obtained paramter `b`, transfered as `a` +- **c**: obtained paramter `c`, here transfered as `alpha` +- **d**: obtained paramter `c`, here transfered as `n` +- **alpha**: The initial slope of the light curve, calculated as: + +$${alpha} = \frac{{etrmax\\_with\\_photoinhibition}}{{ik\\_with\\_photoinhibition}}$$ + +- **beta**: Not available, here set to `NA_real_` +- **etrmax_with_photoinhibition**: The maximum electron transport rate with photoinhibition, transfered as `popt` +- **etrmax_without_photoinhibition**: The maximum electron transport rate without photoinhibition, transfered as: `pmax` +- **ik_with_photoinhibition**: PAR where the transition point from light limitation to light saturation is achieved taking photoinhibition into account, transfered as: `iik` +- **ik_without_photoinhibition**: PAR where the transition point from light limitation to light saturation is achieved not taking photoinhibition into account, transfered as: `ik` +- **im_with_photoinhibition**: The PAR at which the maximum electron transport rate is achieved by taking photoinhibition into account. Although $I_m$ was mentioned in the original publication, no general solution was presented. Therefore, we decided to include it only in the modified version. Determined as: + +```r + etr_regression_data <- get_etr_regression_data_from_model_result(model_result) + im_with_photoinhibition <- etr_regression_data[etr_regression_data[[prediction_name]] == max(etr_regression_data[[prediction_name]]), ][[PAR_name]] +``` + +- **w**: Not available, here set to `NA_real_` +- **ib**: Not available, here set to `NA_real_` +- **etrmax_without_with_ratio**: Ratio of `etrmax_without_photoinhibition` / `etrmax_with_photoinhibition` and `ik_without_photoinhibition` / `ik_with_photoinhibition`, transfered as: `pmax_popt_and_ik_iik_ratio` + +#### Details + +This function validates the `model_result` input and processes relevant parameters for the Vollenweider model, creating a structured list using `create_modified_model_result`. This standardized output allows for consistent analysis and comparison across different models. + +#### Examples + +```r +modified_result_vollenweider <- vollenweider_modified(model_result_vollenweider) +``` +--- + +### platt_modified() + +This function adds parameters that were not originally included in the Platt (1980) model, but were introduced by other models and renames the parameters to a standardised one for all models. See the table below. + +#### Parameters + +- **model_result**: A list containing the results of the model, including parameters such as `etr_max`, `alpha`, and `beta`. + +#### Return + +Returns a modified model result as a list with the following elements: + +- **etr_type**: ETR Type based on the model result. +- **etr_regression_data**: Regression data with ETR predictions based on the fitted model. +- **residual_sum_of_squares**: Difference between observed and predicted ETR values, expressed as the sum of squared residuals. +- **root_mean_squared_error**: Difference between observed and predicted ETR values, expressed as the root mean squared error. +- **relative_root_mean_squared_error**: Difference between observed and predicted ETR values, expressed as the relative root mean squared error, normalized by the mean. +- **a**: obtained paramter `a`, here equal to `etrmax_without_photoinhibition` +- **b**: obtained paramter `b`, here equal to `alpha` +- **c**: obtained paramter `c`, here equal to `beta` +- **d**: not available, here set to `NA_real_` +- **alpha**: The initial slope of the light curve, transfered unchanged as `alpha` +- **beta**: The photoinhibition of the light curve, transfered unchanged as `beta` +- **etrmax_with_photoinhibition**: The maximum electron transport rate with photoinhibition, transfered as `pm` +- **etrmax_without_photoinhibition**: The maximum electron transport rate without photoinhibition, transfered as: `ps` +- **ik_with_photoinhibition**: PAR where the transition point from light limitation to light saturation is achieved taking photoinhibition into account, transfered as: `ik` +- **ik_without_photoinhibition**: PAR where the transition point from light limitation to light saturation is achieved not taking photoinhibition into account, transfered as: `is` +- **im_with_photoinhibition**: The PAR at which the maximum electron transport rate is achieved by taking photoinhibition into account, transfered as: `im` +- **w**: Not available, here set to `NA_real_` +- **ib**: Transfered unchange as: `ib` +- **etrmax_without_with_ratio**: Ratio of `etrmax_without_photoinhibition` / `etrmax_with_photoinhibition` and `ik_without_photoinhibition` / `ik_with_photoinhibition`. Calculated as: + +$${{etrmax\\_without\\_with\\_ratio}} = \frac{{etrmax\\_without\\_photoinhibition}}{{etrmax\\_with\\_photoinhibition}}$$ + +#### Details + +This function validates the `model_result` input and processes relevant parameters for the Platt model, creating a structured list using `create_modified_model_result`. This standardized output allows for consistent analysis and comparison across different models. + +#### Examples + +```r +modified_result_platt <- platt_modified(model_result_platt) +``` + +--- + +### eilers_peeters_modified() + +This function adds parameters that were not originally included in the Eilers and Peeters (1988) model, but were introduced by other models and renames the parameters to a standardised one for all models. See the table below. + +#### Parameters + +- **model_result**: A list containing the results of the model, including parameters such as `a`, `b`, `c`, `s`, `pm`, `ik`, `im`, and `w`. + +#### Return + +Returns a modified model result as a list with the following elements: + +- **etr_type**: ETR Type based on the model result. +- **etr_regression_data**: Regression data with ETR predictions based on the fitted model. +- **residual_sum_of_squares**: Difference between observed and predicted ETR values, expressed as the sum of squared residuals. +- **root_mean_squared_error**: Difference between observed and predicted ETR values, expressed as the root mean squared error. +- **relative_root_mean_squared_error**: Difference between observed and predicted ETR values, expressed as the relative root mean squared error, normalized by the mean. +- **a**: The obtained parameter $$a$$ +- **b**: The obtained parameter $$b$$ +- **c**: The obtained parameter $$c$$ +- **d**: Not available, here set to `NA_real_` +- **alpha**: The initial slope of the light curve, transfered unchanged as `s` +- **beta**: Not available, here set to `NA_real_` +- **etrmax_with_photoinhibition**: The maximum electron transport rate with photoinhibition, transfered as `pm` +- **etrmax_without_photoinhibition**: Not available, here set to `NA_real_` +- **ik_with_photoinhibition**: PAR where the transition point from light limitation to light saturation is achieved taking photoinhibition into account, transfered as `ik` +- **ik_without_photoinhibition**: Not available, here set to `NA_real_` +- **im_with_photoinhibition**: The PAR at which the maximum electron transport rate is achieved by taking photoinhibition into account, transfered as`im` +- **w**: The sharpness of the peak, transfered as `w` +- **ib**: Not available, here set to `NA_real_` +- **etrmax_without_with_ratio**: Not available, here set to `NA_real_` + +#### Details + +This function validates the `model_result` input, extracts relevant parameters for the modified Eilers-Peeters model, and creates a structured list using `create_modified_model_result`. The list serves as a standardized output format for further analysis. + +#### Examples + +```r +# Example usage for eilers_peeters_modified +modified_result <- eilers_peeters_modified(model_result_eilers_peeters) +``` +--- + +### walsby_modified() + +This function adds parameters that were not originally included in the Walsby (1997) model, but were introduced by other models and renames the parameters to a standardised one for all models. See the table below. + +#### Parameters + +- **model_result**: A list containing the results of the model, including parameters such as `etr_max`, `alpha`, and `beta`. + +#### Return + +Returns a modified model result as a list with the following elements: + +- **etr_type**: ETR Type based on the model result. +- **etr_regression_data**: Regression data with ETR predictions based on the fitted model. +- **residual_sum_of_squares**: Difference between observed and predicted ETR values, expressed as the sum of squared residuals. +- **root_mean_squared_error**: Difference between observed and predicted ETR values, expressed as the root mean squared error. +- **relative_root_mean_squared_error**: Difference between observed and predicted ETR values, expressed as the relative root mean squared error, normalized by the mean. +- **a**: obtained paramter `a`, here equal to `etrmax_without_photoinhibition` +- **b**: obtained paramter `b`, here equal to `alpha` +- **c**: obtained paramter `c`, here equal to `beta` +- **d**: not available, here set to `NA_real_` +- **alpha**: The initial slope of the light curve, transfered unchanged as `alpha` +- **beta**: The photoinhibition of the light curve, transfered unchanged as `beta` +- **etrmax_with_photoinhibition**: The maximum electron transport rate with photoinhibition, determined as: + +```r + etr_regression_data <- get_etr_regression_data_from_model_result(model_result) + etr_max_row <- etr_regression_data[etr_regression_data[[prediction_name]] == max(etr_regression_data[[prediction_name]]), ] + etrmax_with_photoinhibition <- etr_max_row[[prediction_name]] +``` + +- **etrmax_without_photoinhibition**: The maximum electron transport rate without photoinhibition, transfered as: `etr_max` +- **ik_with_photoinhibition**: PAR where the transition point from light limitation to light saturation is achieved taking photoinhibition into account, calculated as: + +$$ik\\_with\\_photoinhibition = \frac{etrmax\\_with\\_photoinhibition}{alpha}$$ + +- **ik_without_photoinhibition**: PAR where the transition point from light limitation to light saturation is achieved not taking photoinhibition into account, calculated as: + +$$ik\\_without\\_photoinhibition = \frac{etrmax\\_without\\_photoinhibition}{alpha}$$ + +- **im_with_photoinhibition**: The PAR at which the maximum electron transport rate is achieved by taking photoinhibition into account, calculated as: + +```r + etr_regression_data <- get_etr_regression_data_from_model_result(model_result) + etr_max_row <- etr_regression_data[etr_regression_data[[prediction_name]] == max(etr_regression_data[[prediction_name]]), ] + im_with_photoinhibition <- etr_max_row[[PAR_name]] +``` + +- **w**: Not available, here set to `NA_real_` +- **ib**: Not available, here set to `NA_real_` +- **etrmax_without_with_ratio**: Ratio of `etrmax_without_photoinhibition` / `etrmax_with_photoinhibition` and `ik_without_photoinhibition` / `ik_with_photoinhibition`. Calculated as: + +$${{etrmax\\_without\\_with\\_ratio}} = \frac{{etrmax\\_without\\_photoinhibition}}{{etrmax\\_with\\_photoinhibition}}$$ + +#### Details + +This function validates the `model_result` input and processes relevant parameters for the Walsby model, creating a structured list using `create_modified_model_result`. This standardized output allows for consistent analysis and comparison across different photosynthesis models. + +#### Examples + +```r +modified_result <- walsby_modified(model_result_walsby) +``` +--- + +### Naming overview + +#### Publication-accurate naming and the respective modified naming + +modified |Eilers and Peeters |Platt |Walsby |Vollenweider | +|-|-|-|-|-| +|residual_sum_of_squares |residual_sum_of_squares |residual_sum_of_squares |residual_sum_of_squares |residual_sum_of_squares | +|root_mean_squared_error |root_mean_squared_error |root_mean_squared_error |root_mean_squared_error |root_mean_squared_error | +|relative_root_mean_squared_error |relative_root_mean_squared_error |relative_root_mean_squared_error |relative_root_mean_squared_error |relative_root_mean_squared_error | +|a |a |ps |etr_max |pmax | +|b |b |alpha |alpha |a | +|c |c |beta |beta |alpha | +|d |NA |NA |NA |n | +|alpha |s |alpha |alpha |NA | +|beta |NA |beta |beta |NA | +|etrmax_with_photoinhibition |pm |pm |NA |popt | +|etrmax_without_photoinhibition |NA |ps |etr_max |pmax | +|ik_with_photoinhibition |ik |ik |NA |iik | +|ik_without_photoinhibition |NA |is |NA |ik | +|im_with_photoinhibition |im |im |NA |NA | +|w |w |NA |NA |NA | +|ib |NA |ib |NA |NA | +|etrmax_without_with_ratio |NA |NA |NA |pmax_popt_and_ik_iik_ratio | + +--- + +#### Publication-accurate naming and the respective modified naming with additional calculations not included in the original publication + +|modified |Eilers and Peeters |Platt |Walsby |Vollenweider | +|-|-|-|-|-| +|residual_sum_of_squares |residual_sum_of_squares |residual_sum_of_squares |residual_sum_of_squares |residual_sum_of_squares | +|root_mean_squared_error |root_mean_squared_error |root_mean_squared_error |root_mean_squared_error |root_mean_squared_error | +|relative_root_mean_squared_error |relative_root_mean_squared_error |relative_root_mean_squared_error |relative_root_mean_squared_error |relative_root_mean_squared_error | +|a |a |ps |etr_max |pmax | +|b |b |alpha |alpha |a | +|c |c |beta |beta |alpha | +|d |NA |NA |NA |n | +|alpha |s |alpha |alpha |real_alpha | +|beta |NA |beta |beta |NA | +|etrmax_with_photoinhibition |pm |pm |etrmax_with_photoinhibition |popt | +|etrmax_without_photoinhibition |NA |ps |etr_max |pmax | +|ik_with_photoinhibition |ik |ik |ik_with_photoinhibition |iik | +|ik_without_photoinhibition |NA |is |ik_without_photoinhibition |ik | +|im_with_photoinhibition |im |im |im_with_photoinhibition |im_with_photoinhibition | +|w |w |NA |NA |NA | +|ib |NA |ib |NA |NA | +|etrmax_without_with_ratio |NA |etrmax_without_with_ratio |etrmax_without_with_ratio |pmax_popt_and_ik_iik_ratio | diff --git a/docs/plot_control.md b/docs/plot_control.md new file mode 100644 index 0000000..a60ed16 --- /dev/null +++ b/docs/plot_control.md @@ -0,0 +1,68 @@ +### plot_control() + +This function creates a control plot for the used model based on the provided data and model results. + +#### Parameters + +- **data**: A `data.table` containing the original ETR and yield data for the plot. +- **model_result**: A list containing the fitting results of the used model and the calculated parameters (alpha, ik, etc.). +- **title**: A character string that specifies the title of the plot. +- **color**: A color specification for the regression line in the plot. + +#### Return + +A plot displaying the original ETR and Yield values and the regression data. A table below the plot shows the calculated data (alpha, ik, etc.). + +#### Example + +```r +plot_control_eilers_peeters_ETR_II <- plot_control( + data = pam_data, + model_result = modified_model_result_eilers_peeters_ETR_II, + title = "eilers_peeters ETR II modified 20240925.csv", + color = "purple" +) +print(plot_control_eilers_peeters_ETR_II) +``` + +![Plot](img/test-eilers_peeters_etr_II_modified_control_plot_20240925.jpg) + +--- + +### combo_plot_control() + +The `combo_plot_control()` function generates a combined plot of electron transport rate (ETR) data and regression model predictions, along with a customized table summarizing the parameters for each model. + +#### Parameters + +- **title**: A character string specifying the title for the plot. +- **data**: A data frame containing the raw input data for ETR and Photosynthetically Active Radiation (PAR). +- **model_results**: A list of model results, where each model result is a list containing regression data and parameters for ETR. +- **name_list**: A list of names corresponding to each model result. These names will be used in the legend and table. +- **color_list**: A list of color values for each model result. Colors are used to differentiate lines on the plot. + +#### Return + +A plot displaying the original ETR and Yield values and the regression data from different models. A table below the plot shows the calculated data (alpha, ik, etc.). + +#### Examples + +```r +test_data_file <- file.path(getwd(), "data", "dual_pam_data", "20240925.csv") + data <- read_dual_pam_data(test_data_file) + + eilers_peeters <- eilers_peeters_modified(eilers_peeters_generate_regression_ETR_II(data)) + platt <- platt_modified(platt_generate_regression_ETR_II(data)) + walsby <- walsby_modified(walsby_generate_regression_ETR_II(data)) + vollenweider <- vollenweider_modified(vollenweider_generate_regression_ETR_II(data)) + + plot <- combo_plot_control( + "etr II test-combo_plot_control_20240925.csv", + data, + list(eilers_peeters, platt, walsby, vollenweider), + list("eilers_peeters", "platt", "walsby", "vollenweider"), + list("purple", "blue", "green", "red") + ) +``` + +![combo Plot](img/test_combo_plot_control_etr_II.jpg) \ No newline at end of file diff --git a/docs/read_data.md b/docs/read_data.md new file mode 100644 index 0000000..ee7c8dc --- /dev/null +++ b/docs/read_data.md @@ -0,0 +1,358 @@ +## Those functions all read raw data CSV files, compute $$ETR$$ values, and return a processed intermediate table. + +#### Parameters + +- **csv_path**: A string representing the file path to the CSV file. +- **etr_factor**: A numeric value used as a factor for calculating ETR. Default is `0.84`. +- **fraction_photosystem_I**: A numeric value representing the relative distribution of absorbed PAR to photosystem I used in the ETR calculation formula. Default is `0.5`. +Calculated as: $$\textit{Fraction of Photosystem I} = \frac{PPS 1}{PPS 1+2}$$ +- **fraction_photosystem_II**: A numeric value representing the relative distribution of absorbed PAR to photosystem II used in the ETR calculation formula. Default is `0.5`. +Calculated as: $$\textit{Fraction of Photosystem II} = \frac{PPS 2}{PPS 1+2}$$ + +#### Details + +ETR values are calculated using the following formula: + +$$ \textit{ETR (I or II)} = PAR \cdot \textit{ETR–Factor} \cdot \textit{Fraction of Photosystem (I or II)} \cdot \textit{Yield (I or II)} $$ + +The function processes the provided CSV file by: + +- Reading the CSV data using `read.csv()`. +- Converting the data into a `data.table`. +- Validating the raw data structure with `validate_raw_intermediate_csv()`. +- Iterating through each row to calculate ETR values for both `yield_1` and `yield_2` using `calc_etr()`. + +--- + +### read_universal_data() + +#### Description + +This function reads a universal CSV file, computes $$ETR$$ values, and returns a processed intermediate table. + +#### Parameters + +- **csv_path**: A string representing the file path to the CSV file. +- **etr_factor**: A numeric value used as a factor for calculating ETR. Default is `0.84`. +- **fraction_photosystem_I**: A numeric value representing the relative distribution of absorbed PAR to photosystem I used in the ETR calculation formula. Default is `0.5`. +Calculated as: $$\textit{Fraction of Photosystem I} = \frac{PPS 1}{PPS 1+2}$$ +- **fraction_photosystem_II**: A numeric value representing the relative distribution of absorbed PAR to photosystem II used in the ETR calculation formula. Default is `0.5`. +Calculated as: $$\textit{Fraction of Photosystem II} = \frac{PPS 2}{PPS 1+2}$$ + +#### Details + +ETR values are calculated using the following formula: + +$$ \textit{ETR (I or II)} = PAR \cdot \textit{ETR–Factor} \cdot \textit{Fraction of Photosystem (I or II)} \cdot \textit{Yield (I or II)} $$ + +The function processes the provided CSV file by: + +- Reading the CSV data using `read.csv()`. +- Converting the data into a `data.table`. +- Validating the raw data structure with `validate_raw_intermediate_csv()`. +- Iterating through each row to calculate ETR values for both `yield_1` and `yield_2` using `calc_etr()`. + +#### Return + +Returning a new table containing the original `par`, `yield_1`, `yield_2`, and the calculated `etr_1` and `etr_2` columns. + +#### Example + +```r +data <- read_dual_pam_data("path/to/data.csv", +etr_factor = 0.84, +fraction_photosystem_I = 0.5, +fraction_photosystem_II = 0.5) +``` + +#### References + +- Heinz Walz GmbH. (2024). *DUAL-PAM-100 DUAL-PAM/F MANUAL, 5th Edition, April 2024, Chapter 7 (pp. 162-172).* Heinz Walz GmbH, Effeltrich, Germany. Available at: [DUAL-PAM-100 Manual](https://www.walz.com/files/downloads/dualpamed05.pdf) + +--- + +### read_dual_pam_data() + +#### Description + +This function reads the original CSV file as created by the [DUAL-PAM-100](https://www.walz.com/products/dual-pam-100/) software, processes it by calculating $$ETR$$ values, and returns a cleaned dataset. + +#### Parameters + +- **csv_path**: A string representing the file path to the CSV file. +- **remove_recovery**: Automatic removal of recovery measurements after the actual Pi curve for an accurate regression. Default is `TRUE`. +- **etr_factor**: A numeric value used as a factor for calculating ETR. Default is `0.84`. +- **fraction_photosystem_I**: A numeric value representing the relative distribution of absorbed PAR to photosystem I used in the ETR calculation formula. Default is `0.5`. +Calculated as: $$\textit{Fraction of Photosystem I} = \frac{PPS 1}{PPS 1+2}$$ +- **fraction_photosystem_II**: A numeric value representing the relative distribution of absorbed PAR to photosystem II used in the ETR calculation formula. Default is `0.5`. +Calculated as: $$\textit{Fraction of Photosystem II} = \frac{PPS 2}{PPS 1+2}$$ + +#### Details + +ETR values are calculated using the following formula: + +$$ \textit{ETR (I or II)} = PAR \cdot \textit{ETR–Factor} \cdot \textit{Fraction of Photosystem (I or II)} \cdot \textit{Yield (I or II)} $$ + +The function processes the provided CSV file by: + +- Reading the CSV data using `read.csv()` and converting it to a `data.table`. +- Validating the raw Dual-PAM data with `validate_dual_pam_data()`. +- Filtering rows where the column `ID` equals `SP` +- Combining the `Date` and `Time` columns to create a `DateTime` column and ordering the data chronologically. +- Calculating initial ETR values from `Pm.-Det.` and `Fm-Det.` rows using `calc_etr()`. +- Iterating through all rows with `Action == "P.+F. SP"` to calculate ETR values for both `Y.I.` and `Y.II.` +- Stopping at the recovery period if `remove_recovery = TRUE`. + + +#### Return + +- Returning a table containing `par`, `yield_1`, `yield_2`, and the calculated `etr_1` and `etr_2` columns. + +#### Example + +```r +data <- read_dual_pam_data("path/to/data.csv", +remove_recovery = TRUE, +etr_factor = 0.84, +fraction_photosystem_I = 0.5, +fraction_photosystem_II = 0.5) +``` + +#### References + +- Heinz Walz GmbH. (2024). *DUAL-PAM-100 DUAL-PAM/F MANUAL, 5th Edition, April 2024, Chapter 7 (pp. 162-172).* Heinz Walz GmbH, Effeltrich, Germany. Available at: [DUAL-PAM-100 Manual](https://www.walz.com/files/downloads/dualpamed05.pdf) + +--- + +### read_dual_pam_single_channel_p700_data() + +#### Description + +This function reads the original CSV file as created by the [DUAL-PAM-100](https://www.walz.com/products/dual-pam-100/) software in single channel mode (P700), processes it by calculating $$ETR$$ values for Photosystem I, and returns a cleaned dataset. + +#### Parameters + +- **csv_path**: A string representing the file path to the CSV file. +- **remove_recovery**: Automatic removal of recovery measurements after the actual Pi curve for an accurate regression. Default is `TRUE`. +- **etr_factor**: A numeric value used as a factor for calculating ETR. Default is `0.84`. +- **fraction_photosystem_I**: A numeric value representing the relative distribution of absorbed PAR to Photosystem I used in the ETR calculation formula. Default is `0.5`. + Calculated as: $$\textit{Fraction of Photosystem I} = \frac{PPS 1}{PPS 1+2}$$ +- **fraction_photosystem_II**: A numeric value representing the relative distribution of absorbed PAR to Photosystem II. Default is `0.5`. + (Must sum with Photosystem I fraction to 1.) + +#### Details + +ETR values for Photosystem I are calculated using the following formula: + +$$ \textit{ETR (I)} = PAR \cdot \textit{ETR–Factor} \cdot \textit{Fraction of Photosystem I} \cdot \textit{Yield (I)} $$ + +The function processes the provided CSV file by: + +- Reading the CSV data using `read.csv()` and converting it to a `data.table`. +- Validating the raw Dual-PAM data with `validate_dual_pam_single_channel_p700_data()`. +- Filtering rows where the column `ID` equals `SP`. +- Combining the `Date` and `Time` columns to create a `DateTime` column and ordering the data chronologically. +- Extracting the initial Pm.-Det. measurement at `PAR = 0` to calculate the first ETR value. +- Iterating through all rows with `Action == "P700 SP"` to calculate ETR values for Photosystem I (`Y.I.`). +- Stopping at the recovery period if `remove_recovery = TRUE`. + +#### Return + +- Returning a table containing: + - `par`: Photosynthetically active radiation. + - `yield_1`: Yield of Photosystem I. + - `yield_2`: `NA` (not available in single channel PS I mode). + - `etr_1`: Calculated ETR for Photosystem I. + - `etr_2`: `NA` (not available in single channel PS I mode). + +#### Example + +```r +data <- read_dual_pam_single_channel_p700_data( + "path/to/data.csv", + remove_recovery = TRUE, + etr_factor = 0.84, + fraction_photosystem_I = 0.5, + fraction_photosystem_II = 0.5 +) +``` + +#### References + +- Heinz Walz GmbH. (2024). *DUAL-PAM-100 DUAL-PAM/F MANUAL, 5th Edition, April 2024, Chapter 7 (pp. 162-172).* Heinz Walz GmbH, Effeltrich, Germany. Available at: [DUAL-PAM-100 Manual](https://www.walz.com/files/downloads/dualpamed05.pdf) +--- + +### read_dual_pam_single_channel_fluo_data() + +#### Description + +This function reads the original CSV file as created by the [DUAL-PAM-100](https://www.walz.com/products/dual-pam-100/) software in single channel mode (Fluo), processes it by calculating $$ETR$$ values for Photosystem II, and returns a cleaned dataset. + +#### Parameters + +- **csv_path**: A string representing the file path to the CSV file. +- **remove_recovery**: Automatic removal of recovery measurements after the actual Pi curve for an accurate regression. Default is `TRUE`. +- **etr_factor**: A numeric value used as a factor for calculating ETR. Default is `0.84`. +- **fraction_photosystem_I**: A numeric value representing the relative distribution of absorbed PAR to Photosystem I. Default is `0.5`. +- **fraction_photosystem_II**: A numeric value representing the relative distribution of absorbed PAR to Photosystem II used in the ETR calculation formula. Default is `0.5`. + Calculated as: $$\textit{Fraction of Photosystem II} = \frac{PPS 2}{PPS 1+2}$$ + +#### Details + +ETR values for Photosystem II are calculated using the following formula: + +$$ \textit{ETR (II)} = PAR \cdot \textit{ETR–Factor} \cdot \textit{Fraction of Photosystem II} \cdot \textit{Yield (II)} $$ + +The function processes the provided CSV file by: + +- Reading the CSV data using `read.csv()` and converting it to a `data.table`. +- Validating the raw Dual-PAM data with `validate_dual_pam_single_channel_fluo_data()`. +- Filtering rows where the column `ID` equals `SP`. +- Combining the `Date` and `Time` columns to create a `DateTime` column and ordering the data chronologically. +- Extracting the initial **Fm-Det.** measurement at `PAR = 0` to calculate the first ETR value. +- Iterating through all rows with `Action == "Fluo. SP"` to calculate ETR values for Photosystem II (`Y.II.`). +- Stopping at the recovery period if `remove_recovery = TRUE`. + +#### Return + +- Returning a table containing: + - `par`: Photosynthetically active radiation. + - `yield_1`: `NA` (not available in single channel Photosystem II mode). + - `yield_2`: Yield of Photosystem II. + - `etr_1`: `NA` (not available in single channel Photosystem II mode). + - `etr_2`: Calculated ETR for Photosystem II. + +#### Example + +```r +data <- read_dual_pam_single_channel_fluo_data( + "path/to/data.csv", + remove_recovery = TRUE, + etr_factor = 0.84, + fraction_photosystem_I = 0.5, + fraction_photosystem_II = 0.5 +) +``` + +#### References + +- Heinz Walz GmbH. (2024). *DUAL-PAM-100 DUAL-PAM/F MANUAL, 5th Edition, April 2024, Chapter 7 (pp. 162-172).* Heinz Walz GmbH, Effeltrich, Germany. Available at: [DUAL-PAM-100 Manual](https://www.walz.com/files/downloads/dualpamed05.pdf) +--- + +### read_junior_pam_data() + +#### Description + +This function reads the original CSV file from [JUNIOR-PAM](https://www.walz.com/products/junior-pam/) as created by the WinControl software, processes it by calculating $$ETR$$ values, and returns a cleaned dataset. + +#### Parameters + +- **csv_path**: A string representing the file path to the CSV file. +- **remove_recovery**: Automatic removal of recovery measurements after the actual Pi curve for an accurate regression. Default is `TRUE`. +- **etr_factor**: A numeric value used as a factor for calculating ETR. Default is `0.84`. +- **fraction_photosystem_I**: A numeric value representing the relative distribution of absorbed PAR to photosystem I used in the ETR calculation formula. Default is `0.5`. +Calculated as: $$\textit{Fraction of Photosystem I} = \frac{PPS 1}{PPS 1+2}$$ +- **fraction_photosystem_II**: A numeric value representing the relative distribution of absorbed PAR to photosystem II used in the ETR calculation formula. Default is `0.5`. +Calculated as: $$\textit{Fraction of Photosystem II} = \frac{PPS 2}{PPS 1+2}$$ + +#### Details + +ETR values are calculated using the following formula: + +$$ \textit{ETR (II)} = PAR \cdot \textit{ETR–Factor} \cdot \textit{Fraction of Photosystem (II)} \cdot \textit{Yield (II)} $$ + +The function processes the provided CSV file by: + +- Reading the CSV data using `read.csv()` and converting it to a `data.table`. +- Validating the raw Junior-PAM data with `validate_junior_pam_data()`. +- Renaming columns to standard names (`PAR`, `Y.II`.) if necessary. +- Filtering rows where Type equals `"FO"` or `"F"`. +- Ordering by `Time (rel/ms)` column. +- Iterating through all rows to calculate ETR values for `Y.II.` using `calc_etr()`. +- Stopping at the recovery period if `remove_recovery = TRUE`. + +To ensure the file is imported correctly, please export the CSV file using the default settings: +![Plot](img/export_junior_pam.png) + +#### Return + +Returning a table containing `par`, `yield_1` (NA), `yield_2`, `etr_1` (NA), and `etr_2`. + +#### Example + +```r +data <- read_junior_pam_data("path/to/data.csv", +remove_recovery = TRUE, +etr_factor = 0.84, +fraction_photosystem_I = 0.5, +fraction_photosystem_II = 0.5) +``` + +#### References + +- Heinz Walz GmbH. (2024). *DUAL-PAM-100 DUAL-PAM/F MANUAL, 5th Edition, April 2024, Chapter 7 (pp. 162-172).* Heinz Walz GmbH, Effeltrich, Germany. Available at: [DUAL-PAM-100 Manual](https://www.walz.com/files/downloads/dualpamed05.pdf) + +--- + +### read_pam_2500_data() + +#### Description + +This function reads the original CSV file generated by the [PAM-2500](https://www.walz.com/products/pam-2500/) software, processes it by calculating $$ETR$$ values for Photosystem II, and returns a cleaned dataset. + +#### Parameters + +- **csv_path**: A string representing the file path to the CSV file. +- **remove_recovery**: Logical value indicating whether recovery measurements after the actual Pi curve should be removed. Default is `TRUE`. +- **etr_factor**: A numeric value used as a factor for calculating ETR. Default is `0.84`. +- **fraction_photosystem_I**: A numeric value representing the relative distribution of absorbed PAR to photosystem I. Default is `0.5`. + Calculated as: $$\textit{Fraction of Photosystem I} = \frac{PPS 1}{PPS 1+2}$$ +- **fraction_photosystem_II**: A numeric value representing the relative distribution of absorbed PAR to photosystem II. Default is `0.5`. + Calculated as: $$\textit{Fraction of Photosystem II} = \frac{PPS 2}{PPS 1+2}$$ + + +#### Details + +ETR values are calculated using the following formula: + +$$ \textit{ETR (II)} = PAR \cdot \textit{ETR–Factor} \cdot \textit{Fraction of Photosystem II} \cdot \textit{Yield (II)} $$ + +The function processes the provided CSV file by: + +- Reading the CSV file using `read.csv()` with `;` as separator and converting it to a `data.table`. +- Validating the dataset using `validate_pam_2500_data()`. +- Filtering rows where the column `No.` contains numeric entries only. +- Combining the `Date` and `Time` columns into a `DateTime` column and sorting the dataset chronologically. +- Iterating through all rows to: + - Extract `PAR` and `Y.II.` values. + - Calculate ETR for Photosystem II using `calc_etr()`. +- Optionally stopping at the recovery phase if `remove_recovery = TRUE`, defined as a decrease in PAR values. +- Constructing a result table with calculated values. + + +#### Return + +- A `data.table` containing the following columns: + + - `par`: Photosynthetically active radiation + - `yield_1`: Placeholder column (`NA`) + - `yield_2`: Effective quantum yield of Photosystem II + - `etr_1`: Placeholder column (`NA`) + - `etr_2`: Calculated electron transport rate for Photosystem II + + +#### Example + +```r +data <- read_pam_2500_data( + "path/to/data.csv", + remove_recovery = TRUE, + etr_factor = 0.84, + fraction_photosystem_I = 0.5, + fraction_photosystem_II = 0.5 +) +``` + +#### References + +- Heinz Walz GmbH. (2024). *DUAL-PAM-100 DUAL-PAM/F MANUAL, 5th Edition, April 2024, Chapter 7 (pp. 162-172).* Heinz Walz GmbH, Effeltrich, Germany. Available at: [DUAL-PAM-100 Manual](https://www.walz.com/files/downloads/dualpamed05.pdf) diff --git a/docs/write_model_results.md b/docs/write_model_results.md new file mode 100644 index 0000000..78ed0ea --- /dev/null +++ b/docs/write_model_results.md @@ -0,0 +1,32 @@ + +### write_model_result_csv() + +This function exports the raw input data, regression data, and model parameters into separate CSV files for easy access and further analysis. + +#### Parameters + +- **dest_dir**: A character string specifying the directory where the CSV files will be saved. +- **name**: A character string specifying the base name for the output files. +- **data**: A data frame containing the raw input data used in the model. +- **model_result**: A list containing the model results, including parameter values and regression data. + +#### Details + +This function creates three CSV files: + +1. **`name_raw_data.csv`**: Contains the original raw data used in the model. +2. **`name_regression_data.csv`**: Contains the regression data with predictions for electron transport rate (ETR). +3. **`name_model_result.csv`**: Contains the parameter values from the model results (excluding regression data), including parameters like `alpha`, `beta`, and `etr_max`. + +Each file will be named using the `name` parameter as a prefix, followed by a specific suffix for clarity. + +#### Examples + +```r +write_model_result_csv( + dest_dir = "output", + name = "eilers_peeters_experiment_001", + data = raw_data, + model_result = model_result_eilers_peeters +) +``` \ No newline at end of file diff --git a/img/flow.drawio b/img/flow.drawio new file mode 100644 index 0000000..0f45cf1 --- /dev/null +++ b/img/flow.drawio @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/flow.png b/img/flow.png new file mode 100644 index 0000000000000000000000000000000000000000..58157ef6d205f1295ed1773c35cd0695065baa66 GIT binary patch literal 110417 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 KQtwiNQvMG*&ak}z literal 0 HcmV?d00001 From 88e086e83ed2da0ec671c74ab6cbfdc159e7b4ca Mon Sep 17 00:00:00 2001 From: Phi-S <926151+Phi-S@users.noreply.github.com> Date: Thu, 30 Apr 2026 12:57:15 +0200 Subject: [PATCH 2/4] updated and reorganized documentation --- README.md | 98 +++--------- docs/dev.md | 22 +++ .../compare_regression_models.md | 14 +- docs/{ => functions}/generate_regressions.md | 62 ++++---- docs/{ => functions}/modify_model_results.md | 61 ++++---- docs/{ => functions}/plot_control.md | 24 +-- docs/{ => functions}/read_data.md | 146 +++++++----------- docs/{ => functions}/write_model_results.md | 17 +- examples/Example_combo_plot_control.R | 28 ---- examples/Example_compare_models.R | 20 --- examples/Example_multiple_data.R | 74 --------- examples/Example_single_data.R | 28 ---- examples/example_combo_plot_control.R | 48 ++++++ examples/example_compare_models.R | 14 ++ examples/example_multiple_data.R | 47 ++++++ examples/example_single_data.R | 44 ++++++ img/flow.drawio | 121 ++++++++------- img/flow.png | Bin 110417 -> 119906 bytes 18 files changed, 407 insertions(+), 461 deletions(-) create mode 100644 docs/dev.md rename docs/{ => functions}/compare_regression_models.md (93%) rename docs/{ => functions}/generate_regressions.md (90%) rename docs/{ => functions}/modify_model_results.md (92%) rename docs/{ => functions}/plot_control.md (90%) rename docs/{ => functions}/read_data.md (78%) rename docs/{ => functions}/write_model_results.md (85%) delete mode 100644 examples/Example_combo_plot_control.R delete mode 100644 examples/Example_compare_models.R delete mode 100644 examples/Example_multiple_data.R delete mode 100644 examples/Example_single_data.R create mode 100644 examples/example_combo_plot_control.R create mode 100644 examples/example_compare_models.R create mode 100644 examples/example_multiple_data.R create mode 100644 examples/example_single_data.R diff --git a/README.md b/README.md index 328ad28..4f0f725 100644 --- a/README.md +++ b/README.md @@ -37,90 +37,30 @@ remotes::install_github("biotoolbox/pam", subdir = "src", ref = "dev") ## Examples -Examples of usage can be found in the `examples` directory. +Examples of usage can be found in the [examples](examples/) directory: ---- +- [Single CSV](examples/example_single_data.R) --> Reads a single CSV, generates regression data using Eilers and Peeters model, modifies the model result, generates control plot and exports the plot as jpg and the result as csv files. +- [Multiple CSV's](examples/example_multiple_data.R) --> Reads multiple CSV files, generates regression data using Eilers and Peeters model, modifies the model result, generates control plot and exports the plots as pdf and the result as csv files. +- [Combo control plot](examples/example_combo_plot_control.R) --> Generates one control plot containing all models from a single csv file and exports the plot as jpg. +- [Compare models](examples/example_compare_models.R) --> Compares all models against each other based on one data set and prints the score. ## Functions -

- Processing pipeline overview -

- For detailed information about these functions, visit the respective documentation: -- [Read CSV Data](docs/read_data.md) — Reads the raw data CSV files and returns the intermediate table. -- [Generate Regressions](docs/generate_regressions.md) — Generates ETR regression data from the chosen model. -- [Modify Model Results](docs/modify_model_results.md) — Modifies parameter naming to a standard approach and adds parameters from other models. -- [Plot Control](docs/plot_control.md) — Generates control plots for visual fit validation. -- [Write Model Results](docs/write_model_results.md) — Exports the regression results as CSV files. -- [Compare Regression Models](docs/compare_regression_models.md) — Scores models against each other for one data set. - ---- -## Test coverage - -```r -cov <- covr::package_coverage() -covr::percent_coverage(cov) -``` -90.05935 % - ---- +- [Read CSV Data](docs/functions/read_data.md) --> Reads the raw data CSV files and returns the intermediate table. +- [Generate Regressions](docs/functions/generate_regressions.md) --> Generates ETR regression data from the chosen model. +- [Modify Model Results](docs/functions/modify_model_results.md) --> Modifies parameter naming to a standard approach and adds parameters from other models. +- [Plot Control](docs/functions/plot_control.md) --> Generates control plots for visual fit validation. +- [Write Model Results](docs/functions/write_model_results.md) --> Exports the regression results as CSV files. +- [Compare Regression Models](docs/functions/compare_regression_models.md) --> Scores models against each other for one data set. -## known issues - -#### subscript out of bounds - -``` -Skipped file: 20231214_14_W6_T5_ML.csv because of error: Error in eilers_peeters[["residual_sum_of_squares"]]: subscript out of bounds -``` - -This could indicate that Pm lable in the Action column is at the wrong position in the csv raw data file. Error could be caused by WALZ-Software. - -#### Removed rows in combo_plot_control - -``` -Warnings: -1: Removed 1 row containing missing values or values outside the scale range (`geom_point()`). -2: Removed 1 row containing missing values or values outside the scale range (`geom_point()`). -3: Removed 1 row containing missing values or values outside the scale range (`geom_line()`). -``` - -All points and lines present. Reason for warning messages unknown. Possibly a problem in the library ggplot2. - -### test all - -```r -library(devtools); -devtools::test(); -``` - -### test specific file - -```R -library(devtools); -devtools::load_all(); -library(testthat); -test_file('$$path')" -``` - -## Linux dependencies for devtools - -Ubuntu: -libxml2-dev libssl-dev libcurl4-openssl-dev libfontconfig1-dev libharfbuzz-dev libfribidi-dev libfreetype6-dev libpng-dev libtiff5-dev libjpeg-dev - -Debian: -libxml2-dev libssl-dev libcurl4-openssl-dev libfontconfig1-dev libharfbuzz-dev libfribidi-dev libfreetype6-dev libpng-dev libjpeg-dev libfreetype6-dev libpng-dev libtiff5-dev libjpeg-dev - -R Packages: -install.packages("data.table") -install.packages("dplyr") -install.packages("ggplot2") -install.packages("minpack.lm") -install.packages("SciViews") -install.packages("ggthemes") -install.packages("gridExtra") -install.packages("cowplot") +

+ Processing pipeline overview +

-packages <- readLines("packages.txt") -install.packages(packages) +## Help +- The current version and patch notes can be found under [Releases](https://github.com/biotoolbox/pam/releases). +- Bug reports can be posted under [Issues](https://github.com/biotoolbox/pam/issues). +- Deeper insights can be found under [developer documentation](docs/dev.md). +- A good source for general help can be the [rstats Reddit Community](https://www.reddit.com/r/rstats/). \ No newline at end of file diff --git a/docs/dev.md b/docs/dev.md new file mode 100644 index 0000000..d344cf4 --- /dev/null +++ b/docs/dev.md @@ -0,0 +1,22 @@ +# Developer documentation + +## Branches +- The [main](https://github.com/biotoolbox/pam/tree/main) branch is always up to date with the version published on [cran](https://cran.r-project.org/web/packages/pam/index.html). +- The [dev](https://github.com/biotoolbox/pam/tree/dev) branch is stable but under active development and will eventually merged into the [main](https://github.com/biotoolbox/pam/tree/main) branch. + +## Makefile +- In the [Makefile](../Makefile) are some shortcuts for commonly used commands (install, test, build). + +## Required R packages +- To install all required R package dependencies for development you can use those commands: +``` +packages <- readLines("packages.txt") +install.packages(packages) +``` + +## Custom helper functions +If additionally helper functions are needed (e.g. removing certain data points), it is possible to intercept the intermediate_table between the read and the generate_regression function. + +

+ Processing pipeline overview +

\ No newline at end of file diff --git a/docs/compare_regression_models.md b/docs/functions/compare_regression_models.md similarity index 93% rename from docs/compare_regression_models.md rename to docs/functions/compare_regression_models.md index 8bb92b8..4a8043d 100644 --- a/docs/compare_regression_models.md +++ b/docs/functions/compare_regression_models.md @@ -1,13 +1,15 @@ -### compare_regression_models_ETR_I() and compare_regression_models_ETR_II() +# compare regression models This function compares different regression models. -#### Parameters +## compare_regression_models_ETR_I() and compare_regression_models_ETR_II() + +### Parameters - **data_dir**: A character string specifying the directory where the input data files are located. - **read_func**: Function used to read the CSV files (e.g., `read_dual_pam_data`) -#### Return +### Return A vector containing the total points assigned to each regression model based on their performance. Models are ranked based on the calculated deviation of the difference between observed and predicted values. Rating: @@ -16,11 +18,11 @@ A vector containing the total points assigned to each regression model based on - 3rd: 1 point - 4th: 0 points -#### Details +### Details This function allows a straightforward comparison of the models: Eilers-Peeters (1988), Platt (1980), Vollenweider (1965), and Walsby (1997). The results can guide users in selecting the most appropriate model for their data. If regression is not possible for a model, no points are awarded for the file for any of the models. Start values cannot be adjusted in this function. -#### Example +### Example ```r #raw data file directory @@ -31,7 +33,7 @@ compare_regression_models_ETR_II <- compare_regression_models_ETR_II(data_dir_co print(compare_regression_models_ETR_II) ``` -#### References +### References Eilers, P. H. C., & Peeters, J. C. H. (1988). *A model for the relationship between light intensity and the rate of photosynthesis in phytoplankton.* Ecological Modelling, 42(3-4), 199-215. [doi:10.1016/0304-3800(88)90057-9](https://doi.org/10.1016/0304-3800(88)90057-9). diff --git a/docs/generate_regressions.md b/docs/functions/generate_regressions.md similarity index 90% rename from docs/generate_regressions.md rename to docs/functions/generate_regressions.md index d550b73..4d622f0 100644 --- a/docs/generate_regressions.md +++ b/docs/functions/generate_regressions.md @@ -1,9 +1,12 @@ +# Generate regression model data -### vollenweider_generate_regression_ETR_I() and vollenweider_generate_regression_ETR_II() +Those functions will generate regression data with the chosen model and ETR type (e.g. platt_generate_regression_ETR_II). +Original naming conventions from the publication are used. -This function generates a regression model based on Vollenweider (1965). Original naming conventions from the publication are used. -#### Parameters +## vollenweider_generate_regression_ETR_I() and vollenweider_generate_regression_ETR_II() + +### Parameters - **data**: A `data.table` containing the input data, processed according to the corresponding read function (e.g. `read_dual_pam_data`). - **etr_type**: A character string specifying the column name of the response variable (ETR I or ETR II) to be used in the model. @@ -12,7 +15,7 @@ This function generates a regression model based on Vollenweider (1965). Origina - **alpha_start_value**: Numeric. The starting value for the parameter $$\alpha$$ in the model. Defaults to `alpha_start_values_vollenweider_default`. - **n_start_value**: Numeric. The starting value for the parameter $$n$$ in the model. Defaults to `n_start_values_vollenweider_default`. -#### Return +### Return A list containing the following elements: @@ -57,7 +60,7 @@ $$I_k^\prime = \frac{I_k \cdot p_{opt}}{p_{max}}$$ $$\\p_max\\_popt\\_and\\_ik\\_iik\\_ratio = \frac{I_k}{I_k^\prime}$$ -#### Details +### Details This function uses non-linear least squares fitting to estimate the parameters for the Vollenweider model, which describes the relationship between PAR and ETR. The model used is: @@ -65,7 +68,7 @@ $$p = p_{max} \cdot \frac{a \cdot i}{\sqrt{1 + (a \cdot i)^2}} \cdot \frac{1}{\l It is valid: $$i = PAR; p = ETR$$ -#### Example +### Example ```r result_vollenweider_ETR_II <- vollenweider_generate_regression_ETR_II(data, @@ -75,24 +78,22 @@ result_vollenweider_ETR_II <- vollenweider_generate_regression_ETR_II(data, n_start_value = 350) ``` -#### References +### References Vollenweider, R. A. (1965). *Calculation models of photosynthesis-depth curves and some implications regarding day rate estimates in primary production measurements*, p. 427-457. In C. R. Goldman [ed.], *Primary Productivity in Aquatic Environments*. Mem. Ist. Ital. Idrobiol., 18 Suppl., University of California Press, Berkeley. ---- -### platt_generate_regression_ETR_I() and platt_generate_regression_ETR_II() -This function generates a regression model based on Platt (1980). Original naming conventions from the publication are used. +## platt_generate_regression_ETR_I() and platt_generate_regression_ETR_II() -#### Parameters +### Parameters - **data**: A `data.table` containing the input data from `read_dual_pam_data`. - **alpha_start_value**: Numeric. The starting value for the parameter $$\alpha$$ in the model. Defaults to `alpha_start_value_platt_default`. - **beta_start_value**: Numeric. The starting value for the parameter $$\beta$$ in the model. Defaults to `beta_start_value_platt_default`. - **ps_start_value**: Numeric. The starting value for the parameter $$p_s$$ in the model. Defaults to `ps_start_value_platt_default`. -#### Return +### Return A list containing the following elements: @@ -123,7 +124,7 @@ $$I_m = \left(\frac{P_s}{\alpha}\right) \cdot \log\left(\frac{\alpha + \beta}{\b $$I_b = \frac{P_s}{\beta}$$ -#### Details +### Details This function uses non-linear least squares fitting to estimate the parameters for the Platt model, which describes the relationship between PAR and ETR. The model used is: @@ -131,7 +132,7 @@ $$P = P_s \cdot \left(1 - e^\frac{{-\alpha \cdot I}}{P_s}\right) \cdot e^\left(\ It is valid: $$I = PAR; p = ETR$$ -#### Example +### Example ```r result_platt_ETR_II <- platt_generate_regression_ETR_II(data, @@ -140,24 +141,22 @@ result_platt_ETR_II <- platt_generate_regression_ETR_II(data, ps_start_value = 30) ``` -#### References +### References Platt, T., Gallegos, C. L., & Harrison, W. G. (1980). *Photoinhibition of photosynthesis in natural assemblages of marine phytoplankton*. Journal of Marine Research, 38(4). Retrieved from . ---- -### eilers_peeters_generate_regression_ETR_I() and eilers_peeters_generate_regression_ETR_II() -This function generates a regression model based on Eilers-Peeters (1988). Original naming conventions from the publication are used. All parameters are calculated taking photoinhibition into account. +## eilers_peeters_generate_regression_ETR_I() and eilers_peeters_generate_regression_ETR_II() -#### Parameters +### Parameters - **data**: A `data.table` containing the input data from `read_dual_pam_data`. - **a_start_value**: Numeric. The starting value for the parameter $$a$$ in the model. Defaults to `a_start_values_eilers_peeters_default`. - **b_start_value**: Numeric. The starting value for the parameter $$b$$ in the model. Defaults to `b_start_values_eilers_peeters_default`. - **c_start_value**: Numeric. The starting value for the parameter $$c$$ in the model. Defaults to `c_start_values_eilers_peeters_default`. -#### Return +### Return A list containing the following elements: @@ -188,7 +187,7 @@ $$I_m = \sqrt{\frac{c}{a}}$$ $$w = \frac{b}{\sqrt{a \cdot c}}$$ -#### Details +### Details This function uses non-linear least squares fitting to estimate the parameters for the Eilers-Peeters model, which describes the relationship between PAR and ETR. The model used is: @@ -196,7 +195,7 @@ $$ p = \frac{I}{a \cdot I^2 + b \cdot I + c} $$ It is valid: $$I = PAR$$; $$p = ETR$$ -#### Example +### Example ```r result_eilers_peeters_ETR_II <- eilers_peeters_generate_regression_ETR_II(data, @@ -205,24 +204,22 @@ b_start_value = 0.004, c_start_value = 5) ``` -#### References +### References Eilers, P. H. C., & Peeters, J. C. H. (1988). *A model for the relationship between light intensity and the rate of photosynthesis in phytoplankton.* Ecological Modelling, 42(3-4), 199-215. [doi:10.1016/0304-3800(88)90057-9](https://doi.org/10.1016/0304-3800(88)90057-9). ---- -### walsby_generate_regression_ETR_I() and walsby_generate_regression_ETR_II() -This function generates a regression model based on Walsby (1997) in a modified version without the respiration term. Naming conventions from Romoth (2019) are used. ETRmax is calculated without taking photoinhibition into account. +### walsby_generate_regression_ETR_I() and walsby_generate_regression_ETR_II() -#### Parameters +### Parameters - **data**: A `data.table` containing the input data from `read_dual_pam_data`. - **etr_max_start_value**: Numeric. The starting value for the parameter $$ETR_{max}$$ in the model. Defaults to `etr_max_start_value_walsby_default`. - **alpha_start_value**: Numeric. The starting value for the parameter $$\alpha$$ in the model. Defaults to `alpha_start_value_walsby_default`. - **beta_start_value**: Numeric. The starting value for the parameter $$\beta$$ in the model. Defaults to `beta_start_value_walsby_default`. -#### Return +### Return A list containing the following elements: @@ -234,7 +231,7 @@ A list containing the following elements: - **alpha**: The initial slope of the light curve ($$\alpha$$). - **beta**: The photoinhibition of the light curve ($$\beta$$). -#### Details +### Details This function uses non-linear least squares fitting to estimate the parameters for the Walsby model, which describes the relationship between PAR and ETR I. The model used is: @@ -242,7 +239,12 @@ $$ETR = ETR_{max} \cdot \left(1 - e^{\left(-\frac{\alpha \cdot I}{ETR_{max}}\rig It is valid: $$I = PAR$$ -#### References +This function generates a regression model based on Walsby (1997) in a modified version without the respiration term. +Naming conventions from Romoth (2019) are used. +ETRmax is calculated without taking photoinhibition into account. + + +### References Walsby, A. E. (1997). Numerical integration of phytoplankton photosynthesis through time and depth in a water column. *New Phytologist*, 136(2), 189-209. diff --git a/docs/modify_model_results.md b/docs/functions/modify_model_results.md similarity index 92% rename from docs/modify_model_results.md rename to docs/functions/modify_model_results.md index 8a95cb1..ca1ff9b 100644 --- a/docs/modify_model_results.md +++ b/docs/functions/modify_model_results.md @@ -1,14 +1,14 @@ +# Modify model results +Those function standardize the naming of the model results depending on the model chosen. -### vollenweider_modified() +## vollenweider_modified() -This function adds parameters that were not originally included in the Vollenweider (1965) model, but were introduced by other models and renames the parameters to a standardised one for all models. See the table below. - -#### Parameters +### Parameters - **model_result**: A list containing the results of the model, including parameters such as `pmax`, `alpha`, and `ik`. -#### Return +### Return Returns a modified model result as a list with the following elements: @@ -41,26 +41,24 @@ $${alpha} = \frac{{etrmax\\_with\\_photoinhibition}}{{ik\\_with\\_photoinhibitio - **ib**: Not available, here set to `NA_real_` - **etrmax_without_with_ratio**: Ratio of `etrmax_without_photoinhibition` / `etrmax_with_photoinhibition` and `ik_without_photoinhibition` / `ik_with_photoinhibition`, transfered as: `pmax_popt_and_ik_iik_ratio` -#### Details +### Details This function validates the `model_result` input and processes relevant parameters for the Vollenweider model, creating a structured list using `create_modified_model_result`. This standardized output allows for consistent analysis and comparison across different models. -#### Examples +### Examples ```r modified_result_vollenweider <- vollenweider_modified(model_result_vollenweider) ``` ---- -### platt_modified() -This function adds parameters that were not originally included in the Platt (1980) model, but were introduced by other models and renames the parameters to a standardised one for all models. See the table below. +## platt_modified() -#### Parameters +### Parameters - **model_result**: A list containing the results of the model, including parameters such as `etr_max`, `alpha`, and `beta`. -#### Return +### Return Returns a modified model result as a list with the following elements: @@ -86,27 +84,27 @@ Returns a modified model result as a list with the following elements: $${{etrmax\\_without\\_with\\_ratio}} = \frac{{etrmax\\_without\\_photoinhibition}}{{etrmax\\_with\\_photoinhibition}}$$ -#### Details +### Details This function validates the `model_result` input and processes relevant parameters for the Platt model, creating a structured list using `create_modified_model_result`. This standardized output allows for consistent analysis and comparison across different models. -#### Examples +### Examples ```r modified_result_platt <- platt_modified(model_result_platt) ``` ---- -### eilers_peeters_modified() + +## eilers_peeters_modified() This function adds parameters that were not originally included in the Eilers and Peeters (1988) model, but were introduced by other models and renames the parameters to a standardised one for all models. See the table below. -#### Parameters +### Parameters - **model_result**: A list containing the results of the model, including parameters such as `a`, `b`, `c`, `s`, `pm`, `ik`, `im`, and `w`. -#### Return +### Return Returns a modified model result as a list with the following elements: @@ -130,27 +128,24 @@ Returns a modified model result as a list with the following elements: - **ib**: Not available, here set to `NA_real_` - **etrmax_without_with_ratio**: Not available, here set to `NA_real_` -#### Details +### Details This function validates the `model_result` input, extracts relevant parameters for the modified Eilers-Peeters model, and creates a structured list using `create_modified_model_result`. The list serves as a standardized output format for further analysis. -#### Examples +### Examples ```r # Example usage for eilers_peeters_modified modified_result <- eilers_peeters_modified(model_result_eilers_peeters) ``` ---- - -### walsby_modified() -This function adds parameters that were not originally included in the Walsby (1997) model, but were introduced by other models and renames the parameters to a standardised one for all models. See the table below. +## walsby_modified() -#### Parameters +### Parameters - **model_result**: A list containing the results of the model, including parameters such as `etr_max`, `alpha`, and `beta`. -#### Return +### Return Returns a modified model result as a list with the following elements: @@ -196,20 +191,20 @@ $$ik\\_without\\_photoinhibition = \frac{etrmax\\_without\\_photoinhibition}{alp $${{etrmax\\_without\\_with\\_ratio}} = \frac{{etrmax\\_without\\_photoinhibition}}{{etrmax\\_with\\_photoinhibition}}$$ -#### Details +### Details This function validates the `model_result` input and processes relevant parameters for the Walsby model, creating a structured list using `create_modified_model_result`. This standardized output allows for consistent analysis and comparison across different photosynthesis models. -#### Examples +### Examples ```r modified_result <- walsby_modified(model_result_walsby) ``` ---- -### Naming overview -#### Publication-accurate naming and the respective modified naming +## Naming overview + +### Publication-accurate naming and the respective modified naming modified |Eilers and Peeters |Platt |Walsby |Vollenweider | |-|-|-|-|-| @@ -231,9 +226,9 @@ modified |Eilers and Peeters |Platt |Walsby |Vollenweider |ib |NA |ib |NA |NA | |etrmax_without_with_ratio |NA |NA |NA |pmax_popt_and_ik_iik_ratio | ---- -#### Publication-accurate naming and the respective modified naming with additional calculations not included in the original publication + +### Publication-accurate naming and the respective modified naming with additional calculations not included in the original publication |modified |Eilers and Peeters |Platt |Walsby |Vollenweider | |-|-|-|-|-| diff --git a/docs/plot_control.md b/docs/functions/plot_control.md similarity index 90% rename from docs/plot_control.md rename to docs/functions/plot_control.md index a60ed16..b6b9f6a 100644 --- a/docs/plot_control.md +++ b/docs/functions/plot_control.md @@ -1,19 +1,21 @@ -### plot_control() +# Control plots + +## plot_control() This function creates a control plot for the used model based on the provided data and model results. -#### Parameters +### Parameters - **data**: A `data.table` containing the original ETR and yield data for the plot. - **model_result**: A list containing the fitting results of the used model and the calculated parameters (alpha, ik, etc.). - **title**: A character string that specifies the title of the plot. - **color**: A color specification for the regression line in the plot. -#### Return +### Return A plot displaying the original ETR and Yield values and the regression data. A table below the plot shows the calculated data (alpha, ik, etc.). -#### Example +### Example ```r plot_control_eilers_peeters_ETR_II <- plot_control( @@ -25,15 +27,13 @@ plot_control_eilers_peeters_ETR_II <- plot_control( print(plot_control_eilers_peeters_ETR_II) ``` -![Plot](img/test-eilers_peeters_etr_II_modified_control_plot_20240925.jpg) - ---- +![Plot](../../img/test-eilers_peeters_etr_II_modified_control_plot_20240925.jpg) -### combo_plot_control() +## combo_plot_control() The `combo_plot_control()` function generates a combined plot of electron transport rate (ETR) data and regression model predictions, along with a customized table summarizing the parameters for each model. -#### Parameters +### Parameters - **title**: A character string specifying the title for the plot. - **data**: A data frame containing the raw input data for ETR and Photosynthetically Active Radiation (PAR). @@ -41,11 +41,11 @@ The `combo_plot_control()` function generates a combined plot of electron transp - **name_list**: A list of names corresponding to each model result. These names will be used in the legend and table. - **color_list**: A list of color values for each model result. Colors are used to differentiate lines on the plot. -#### Return +### Return A plot displaying the original ETR and Yield values and the regression data from different models. A table below the plot shows the calculated data (alpha, ik, etc.). -#### Examples +### Examples ```r test_data_file <- file.path(getwd(), "data", "dual_pam_data", "20240925.csv") @@ -65,4 +65,4 @@ test_data_file <- file.path(getwd(), "data", "dual_pam_data", "20240925.csv") ) ``` -![combo Plot](img/test_combo_plot_control_etr_II.jpg) \ No newline at end of file +![combo Plot](../../img/test_combo_plot_control_etr_II.jpg) \ No newline at end of file diff --git a/docs/read_data.md b/docs/functions/read_data.md similarity index 78% rename from docs/read_data.md rename to docs/functions/read_data.md index ee7c8dc..3adb7f1 100644 --- a/docs/read_data.md +++ b/docs/functions/read_data.md @@ -1,36 +1,12 @@ -## Those functions all read raw data CSV files, compute $$ETR$$ values, and return a processed intermediate table. +# Read data -#### Parameters +Those functions read raw data CSV files, compute the $$ETR$$ values, and are returning an intermediate table. -- **csv_path**: A string representing the file path to the CSV file. -- **etr_factor**: A numeric value used as a factor for calculating ETR. Default is `0.84`. -- **fraction_photosystem_I**: A numeric value representing the relative distribution of absorbed PAR to photosystem I used in the ETR calculation formula. Default is `0.5`. -Calculated as: $$\textit{Fraction of Photosystem I} = \frac{PPS 1}{PPS 1+2}$$ -- **fraction_photosystem_II**: A numeric value representing the relative distribution of absorbed PAR to photosystem II used in the ETR calculation formula. Default is `0.5`. -Calculated as: $$\textit{Fraction of Photosystem II} = \frac{PPS 2}{PPS 1+2}$$ - -#### Details - -ETR values are calculated using the following formula: - -$$ \textit{ETR (I or II)} = PAR \cdot \textit{ETR–Factor} \cdot \textit{Fraction of Photosystem (I or II)} \cdot \textit{Yield (I or II)} $$ - -The function processes the provided CSV file by: - -- Reading the CSV data using `read.csv()`. -- Converting the data into a `data.table`. -- Validating the raw data structure with `validate_raw_intermediate_csv()`. -- Iterating through each row to calculate ETR values for both `yield_1` and `yield_2` using `calc_etr()`. +## read_universal_data() ---- +### Description -### read_universal_data() - -#### Description - -This function reads a universal CSV file, computes $$ETR$$ values, and returns a processed intermediate table. - -#### Parameters +### Parameters - **csv_path**: A string representing the file path to the CSV file. - **etr_factor**: A numeric value used as a factor for calculating ETR. Default is `0.84`. @@ -39,7 +15,7 @@ Calculated as: $$\textit{Fraction of Photosystem I} = \frac{PPS 1}{PPS 1+2}$$ - **fraction_photosystem_II**: A numeric value representing the relative distribution of absorbed PAR to photosystem II used in the ETR calculation formula. Default is `0.5`. Calculated as: $$\textit{Fraction of Photosystem II} = \frac{PPS 2}{PPS 1+2}$$ -#### Details +### Details ETR values are calculated using the following formula: @@ -52,11 +28,11 @@ The function processes the provided CSV file by: - Validating the raw data structure with `validate_raw_intermediate_csv()`. - Iterating through each row to calculate ETR values for both `yield_1` and `yield_2` using `calc_etr()`. -#### Return +### Return Returning a new table containing the original `par`, `yield_1`, `yield_2`, and the calculated `etr_1` and `etr_2` columns. -#### Example +### Example ```r data <- read_dual_pam_data("path/to/data.csv", @@ -65,19 +41,15 @@ fraction_photosystem_I = 0.5, fraction_photosystem_II = 0.5) ``` -#### References +### References - Heinz Walz GmbH. (2024). *DUAL-PAM-100 DUAL-PAM/F MANUAL, 5th Edition, April 2024, Chapter 7 (pp. 162-172).* Heinz Walz GmbH, Effeltrich, Germany. Available at: [DUAL-PAM-100 Manual](https://www.walz.com/files/downloads/dualpamed05.pdf) ---- -### read_dual_pam_data() -#### Description +## read_dual_pam_data() -This function reads the original CSV file as created by the [DUAL-PAM-100](https://www.walz.com/products/dual-pam-100/) software, processes it by calculating $$ETR$$ values, and returns a cleaned dataset. - -#### Parameters +### Parameters - **csv_path**: A string representing the file path to the CSV file. - **remove_recovery**: Automatic removal of recovery measurements after the actual Pi curve for an accurate regression. Default is `TRUE`. @@ -87,7 +59,11 @@ Calculated as: $$\textit{Fraction of Photosystem I} = \frac{PPS 1}{PPS 1+2}$$ - **fraction_photosystem_II**: A numeric value representing the relative distribution of absorbed PAR to photosystem II used in the ETR calculation formula. Default is `0.5`. Calculated as: $$\textit{Fraction of Photosystem II} = \frac{PPS 2}{PPS 1+2}$$ -#### Details +### Details + +Device: [DUAL-PAM-100](https://www.walz.com/products/dual-pam-100/) + +Mode: Dual channel mode (P700 + Fluo) ETR values are calculated using the following formula: @@ -103,12 +79,11 @@ The function processes the provided CSV file by: - Iterating through all rows with `Action == "P.+F. SP"` to calculate ETR values for both `Y.I.` and `Y.II.` - Stopping at the recovery period if `remove_recovery = TRUE`. - -#### Return +### Return - Returning a table containing `par`, `yield_1`, `yield_2`, and the calculated `etr_1` and `etr_2` columns. -#### Example +### Example ```r data <- read_dual_pam_data("path/to/data.csv", @@ -118,19 +93,15 @@ fraction_photosystem_I = 0.5, fraction_photosystem_II = 0.5) ``` -#### References +### References - Heinz Walz GmbH. (2024). *DUAL-PAM-100 DUAL-PAM/F MANUAL, 5th Edition, April 2024, Chapter 7 (pp. 162-172).* Heinz Walz GmbH, Effeltrich, Germany. Available at: [DUAL-PAM-100 Manual](https://www.walz.com/files/downloads/dualpamed05.pdf) ---- -### read_dual_pam_single_channel_p700_data() -#### Description +## read_dual_pam_single_channel_p700_data() -This function reads the original CSV file as created by the [DUAL-PAM-100](https://www.walz.com/products/dual-pam-100/) software in single channel mode (P700), processes it by calculating $$ETR$$ values for Photosystem I, and returns a cleaned dataset. - -#### Parameters +### Parameters - **csv_path**: A string representing the file path to the CSV file. - **remove_recovery**: Automatic removal of recovery measurements after the actual Pi curve for an accurate regression. Default is `TRUE`. @@ -140,7 +111,11 @@ This function reads the original CSV file as created by the [DUAL-PAM-100](https - **fraction_photosystem_II**: A numeric value representing the relative distribution of absorbed PAR to Photosystem II. Default is `0.5`. (Must sum with Photosystem I fraction to 1.) -#### Details +### Details + +Device: [DUAL-PAM-100](https://www.walz.com/products/dual-pam-100/) + +Mode: Single channel mode (P700) ETR values for Photosystem I are calculated using the following formula: @@ -156,16 +131,16 @@ The function processes the provided CSV file by: - Iterating through all rows with `Action == "P700 SP"` to calculate ETR values for Photosystem I (`Y.I.`). - Stopping at the recovery period if `remove_recovery = TRUE`. -#### Return +### Return - Returning a table containing: - `par`: Photosynthetically active radiation. - `yield_1`: Yield of Photosystem I. - - `yield_2`: `NA` (not available in single channel PS I mode). + - `yield_2`: `NA` (not available in single channel mode (P700)). - `etr_1`: Calculated ETR for Photosystem I. - - `etr_2`: `NA` (not available in single channel PS I mode). + - `etr_2`: `NA` (not available in single channel mode (P700)). -#### Example +### Example ```r data <- read_dual_pam_single_channel_p700_data( @@ -177,18 +152,14 @@ data <- read_dual_pam_single_channel_p700_data( ) ``` -#### References +### References - Heinz Walz GmbH. (2024). *DUAL-PAM-100 DUAL-PAM/F MANUAL, 5th Edition, April 2024, Chapter 7 (pp. 162-172).* Heinz Walz GmbH, Effeltrich, Germany. Available at: [DUAL-PAM-100 Manual](https://www.walz.com/files/downloads/dualpamed05.pdf) ---- - -### read_dual_pam_single_channel_fluo_data() -#### Description -This function reads the original CSV file as created by the [DUAL-PAM-100](https://www.walz.com/products/dual-pam-100/) software in single channel mode (Fluo), processes it by calculating $$ETR$$ values for Photosystem II, and returns a cleaned dataset. +## read_dual_pam_single_channel_fluo_data() -#### Parameters +### Parameters - **csv_path**: A string representing the file path to the CSV file. - **remove_recovery**: Automatic removal of recovery measurements after the actual Pi curve for an accurate regression. Default is `TRUE`. @@ -197,7 +168,11 @@ This function reads the original CSV file as created by the [DUAL-PAM-100](https - **fraction_photosystem_II**: A numeric value representing the relative distribution of absorbed PAR to Photosystem II used in the ETR calculation formula. Default is `0.5`. Calculated as: $$\textit{Fraction of Photosystem II} = \frac{PPS 2}{PPS 1+2}$$ -#### Details +### Details + +Device: [DUAL-PAM-100](https://www.walz.com/products/dual-pam-100/) + +Mode: Single channel mode (Fluo) ETR values for Photosystem II are calculated using the following formula: @@ -213,7 +188,7 @@ The function processes the provided CSV file by: - Iterating through all rows with `Action == "Fluo. SP"` to calculate ETR values for Photosystem II (`Y.II.`). - Stopping at the recovery period if `remove_recovery = TRUE`. -#### Return +### Return - Returning a table containing: - `par`: Photosynthetically active radiation. @@ -222,7 +197,7 @@ The function processes the provided CSV file by: - `etr_1`: `NA` (not available in single channel Photosystem II mode). - `etr_2`: Calculated ETR for Photosystem II. -#### Example +### Example ```r data <- read_dual_pam_single_channel_fluo_data( @@ -234,18 +209,14 @@ data <- read_dual_pam_single_channel_fluo_data( ) ``` -#### References +### References - Heinz Walz GmbH. (2024). *DUAL-PAM-100 DUAL-PAM/F MANUAL, 5th Edition, April 2024, Chapter 7 (pp. 162-172).* Heinz Walz GmbH, Effeltrich, Germany. Available at: [DUAL-PAM-100 Manual](https://www.walz.com/files/downloads/dualpamed05.pdf) ---- - -### read_junior_pam_data() -#### Description -This function reads the original CSV file from [JUNIOR-PAM](https://www.walz.com/products/junior-pam/) as created by the WinControl software, processes it by calculating $$ETR$$ values, and returns a cleaned dataset. +## read_junior_pam_data() -#### Parameters +### Parameters - **csv_path**: A string representing the file path to the CSV file. - **remove_recovery**: Automatic removal of recovery measurements after the actual Pi curve for an accurate regression. Default is `TRUE`. @@ -255,7 +226,9 @@ Calculated as: $$\textit{Fraction of Photosystem I} = \frac{PPS 1}{PPS 1+2}$$ - **fraction_photosystem_II**: A numeric value representing the relative distribution of absorbed PAR to photosystem II used in the ETR calculation formula. Default is `0.5`. Calculated as: $$\textit{Fraction of Photosystem II} = \frac{PPS 2}{PPS 1+2}$$ -#### Details +### Details + +Device: [JUNIOR-PAM](https://www.walz.com/products/junior-pam/) ETR values are calculated using the following formula: @@ -272,13 +245,13 @@ The function processes the provided CSV file by: - Stopping at the recovery period if `remove_recovery = TRUE`. To ensure the file is imported correctly, please export the CSV file using the default settings: -![Plot](img/export_junior_pam.png) +![Plot](../../img/export_junior_pam.png) -#### Return +### Return Returning a table containing `par`, `yield_1` (NA), `yield_2`, `etr_1` (NA), and `etr_2`. -#### Example +### Example ```r data <- read_junior_pam_data("path/to/data.csv", @@ -288,19 +261,15 @@ fraction_photosystem_I = 0.5, fraction_photosystem_II = 0.5) ``` -#### References +### References - Heinz Walz GmbH. (2024). *DUAL-PAM-100 DUAL-PAM/F MANUAL, 5th Edition, April 2024, Chapter 7 (pp. 162-172).* Heinz Walz GmbH, Effeltrich, Germany. Available at: [DUAL-PAM-100 Manual](https://www.walz.com/files/downloads/dualpamed05.pdf) ---- - -### read_pam_2500_data() -#### Description -This function reads the original CSV file generated by the [PAM-2500](https://www.walz.com/products/pam-2500/) software, processes it by calculating $$ETR$$ values for Photosystem II, and returns a cleaned dataset. +## read_pam_2500_data() -#### Parameters +### Parameters - **csv_path**: A string representing the file path to the CSV file. - **remove_recovery**: Logical value indicating whether recovery measurements after the actual Pi curve should be removed. Default is `TRUE`. @@ -310,8 +279,9 @@ This function reads the original CSV file generated by the [PAM-2500](https://ww - **fraction_photosystem_II**: A numeric value representing the relative distribution of absorbed PAR to photosystem II. Default is `0.5`. Calculated as: $$\textit{Fraction of Photosystem II} = \frac{PPS 2}{PPS 1+2}$$ +### Details -#### Details +Device: [PAM-2500](https://www.walz.com/products/pam-2500/) ETR values are calculated using the following formula: @@ -329,8 +299,7 @@ The function processes the provided CSV file by: - Optionally stopping at the recovery phase if `remove_recovery = TRUE`, defined as a decrease in PAR values. - Constructing a result table with calculated values. - -#### Return +### Return - A `data.table` containing the following columns: @@ -340,8 +309,7 @@ The function processes the provided CSV file by: - `etr_1`: Placeholder column (`NA`) - `etr_2`: Calculated electron transport rate for Photosystem II - -#### Example +### Example ```r data <- read_pam_2500_data( @@ -353,6 +321,6 @@ data <- read_pam_2500_data( ) ``` -#### References +### References - Heinz Walz GmbH. (2024). *DUAL-PAM-100 DUAL-PAM/F MANUAL, 5th Edition, April 2024, Chapter 7 (pp. 162-172).* Heinz Walz GmbH, Effeltrich, Germany. Available at: [DUAL-PAM-100 Manual](https://www.walz.com/files/downloads/dualpamed05.pdf) diff --git a/docs/write_model_results.md b/docs/functions/write_model_results.md similarity index 85% rename from docs/write_model_results.md rename to docs/functions/write_model_results.md index 78ed0ea..007ea36 100644 --- a/docs/write_model_results.md +++ b/docs/functions/write_model_results.md @@ -1,16 +1,17 @@ - -### write_model_result_csv() +# Write model result This function exports the raw input data, regression data, and model parameters into separate CSV files for easy access and further analysis. -#### Parameters +## write_model_result_csv() + +### Parameters - **dest_dir**: A character string specifying the directory where the CSV files will be saved. - **name**: A character string specifying the base name for the output files. - **data**: A data frame containing the raw input data used in the model. - **model_result**: A list containing the model results, including parameter values and regression data. -#### Details +### Details This function creates three CSV files: @@ -20,13 +21,13 @@ This function creates three CSV files: Each file will be named using the `name` parameter as a prefix, followed by a specific suffix for clarity. -#### Examples +### Examples ```r write_model_result_csv( dest_dir = "output", - name = "eilers_peeters_experiment_001", - data = raw_data, - model_result = model_result_eilers_peeters + name = "001", + data = intermediate_table, + model_result = model_result ) ``` \ No newline at end of file diff --git a/examples/Example_combo_plot_control.R b/examples/Example_combo_plot_control.R deleted file mode 100644 index e862800..0000000 --- a/examples/Example_combo_plot_control.R +++ /dev/null @@ -1,28 +0,0 @@ -##### example for combo plot control#### -install.packages("remotes") -remotes::install_github("biotoolbox/pam", subdir = "src") -library("pam") -library("ggplot2") - -#### raw data file directory#### -script_dir <- dirname(sys.frame(1)$ofile) -data_path <- file.path(script_dir, "data", "20231122_01.csv") -data <- read_dual_pam_data(data_path) -output_dir <- file.path(script_dir, "output") -dir.create(output_dir, showWarnings = FALSE) - -#### getting model results#### -model_result_eilers_peeters_ETR_II_modified <- eilers_peeters_modified(eilers_peeters_generate_regression_ETR_II(data)) -model_result_platt_ETR_II_modified <- platt_modified(platt_generate_regression_ETR_II(data)) -model_result_vollenweider_ETR_II_modified <- vollenweider_modified(vollenweider_generate_regression_ETR_II(data)) -model_result_walsby_ETR_II_modified <- walsby_modified(walsby_generate_regression_ETR_II(data)) - -#### combo_plot_control#### -model_results <- list(model_result_eilers_peeters_ETR_II_modified, model_result_platt_ETR_II_modified, model_result_vollenweider_ETR_II_modified, model_result_walsby_ETR_II_modified) -name_list <- list("Eilers & Peeters", "Platt", "Vollenweider", "Walsby") -color_list <- list("blue", "red", "green", "orange") - -combo_plot_control <- combo_plot_control("combo_plot_control_20231122_01.csv", data, model_results, name_list, color_list) -print(combo_plot_control) -ggsave("combo_plot_control_20231122_01.jpg", plot = combo_plot_control, width = 10, height = 22, path = output_dir) -#### diff --git a/examples/Example_compare_models.R b/examples/Example_compare_models.R deleted file mode 100644 index 04a6a54..0000000 --- a/examples/Example_compare_models.R +++ /dev/null @@ -1,20 +0,0 @@ -##### example for compare regression models#### -# install library pam -install.packages("remotes") -remotes::install_github("biotoolbox/pam", subdir = "src") -library("pam") - -#### read_dual_pam_data()#### -# raw data file directory -script_dir <- dirname(sys.frame(1)$ofile) -data_dir <- file.path(script_dir, "data", "dual_pam_data", "bulk") - -#### compare_regression_models_ETR_II#### -compare_regression_models_ETR_II_result <- compare_regression_models_ETR_II(data_dir, read_dual_pam_data) -print(compare_regression_models_ETR_II_result) -#### - -#### This warning is expected#### -# file: 20231214_10.csv processed with warning: simpleWarning in value[[3L]](cond): warning while -# calculating platt model: simpleWarning in value[[3L]](cond): failed to calculate im: warning: simpleWarning in -# log((alpha + beta)/beta): NaNs wurden erzeugt diff --git a/examples/Example_multiple_data.R b/examples/Example_multiple_data.R deleted file mode 100644 index e3d8c41..0000000 --- a/examples/Example_multiple_data.R +++ /dev/null @@ -1,74 +0,0 @@ -##### example for multiple files with eilers and peeters model#### -install.packages("remotes") -remotes::install_github("biotoolbox/pam", subdir = "src") -library("pam") - - -#### raw data file directory#### -script_dir <- dirname(sys.frame(1)$ofile) -data_dir <- file.path(script_dir, "data", "dual_pam_data", "bulk") -output_dir <- file.path(script_dir, "output") -dir.create(output_dir, showWarnings = FALSE) -output_path_pdf <- file.path(output_dir, "eilers_peters_plot_control.pdf") -reload_data_dir <- output_dir - -#### read_dual_pam_data()#### -csv_files <- - list.files( - path = data_dir, - pattern = "\\.csv$", - full.names = TRUE - ) -data_list <- list() -for (file in csv_files) { - data_list <- append(data_list, list(list( - file_name = basename(file), - data = read_dual_pam_data(file) - ))) -} - -#### eilers_peeters_generate_regression_ETR_II()#### -results_list <- list() -for (data_entry in data_list) { - model_result <- - eilers_peeters_generate_regression_ETR_II(data_entry$data) - results_list <- append(results_list, list( - list( - file_name = data_entry$file_name, - data = data_entry$data, - model_result = model_result - ) - )) -} - -#### Function to create plots and save to PDF#### -pdf(output_path_pdf, onefile = TRUE) -for (result_entry in results_list) { - title <- result_entry$file_name - data <- result_entry$data - model_result <- result_entry$model_result - plot <- plot_control( - data = data, - model_result = model_result, - title = title, - color = "black" - ) - print(plot) - cat("Processed file:", title, "\n") -} -dev.off() - - -#### write_model_result_csv #### -for (result_entry in results_list) { - file_name <- result_entry$file_name - data <- result_entry$data - model_result_eilers_peeters_ETR_II <- result_entry$model_result - write_model_result_csv( - output_dir, - file_name, - data, - model_result_eilers_peeters_ETR_II - ) - cat("Processed file:", file_name, "\n") -} diff --git a/examples/Example_single_data.R b/examples/Example_single_data.R deleted file mode 100644 index 083fad0..0000000 --- a/examples/Example_single_data.R +++ /dev/null @@ -1,28 +0,0 @@ -##### simple example for one file with eilers and peeters model#### -# install library pam -install.packages("remotes") -remotes::install_github("biotoolbox/pam", subdir = "src") -library("pam") -library("ggplot2") - -#### read_dual_pam_data()#### -script_dir <- dirname(sys.frame(1)$ofile) -data_path <- file.path(script_dir, "data", "20231122_01.csv") -data <- read_dual_pam_data(data_path) -output_dir <- file.path(script_dir, "output") -dir.create(output_dir, showWarnings = FALSE) - -#### eilers_peeters_generate_regression_ETR_II()#### -model_result_eilers_peeters_ETR_II <- eilers_peeters_generate_regression_ETR_II(data) - -#### eilers_peeters_modified()#### -model_result_eilers_peeters_ETR_II_modified <- eilers_peeters_modified(model_result_eilers_peeters_ETR_II) - -#### plot_control()#### -plot_control_eilers_peeters_ETRII_modifed <- plot_control(data, model_result_eilers_peeters_ETR_II_modified, "plot_control_eilers_peeters_ETRII_modifed_20231122_01.jpg", color = "blue") -print(plot_control_eilers_peeters_ETRII_modifed) -ggsave("20231122_01.jpg", plot = plot_control_eilers_peeters_ETRII_modifed, path = output_dir, width = 10, height = 10) - -#### write_model_result_csv#### -write_model_result_csv(output_dir, "20231122_01.csv", data, model_result_eilers_peeters_ETR_II_modified) -#### diff --git a/examples/example_combo_plot_control.R b/examples/example_combo_plot_control.R new file mode 100644 index 0000000..33acd9e --- /dev/null +++ b/examples/example_combo_plot_control.R @@ -0,0 +1,48 @@ +# example for combo plot control +install.packages("pam") +library("pam") +library("ggplot2") + +script_dir <- file.path(getwd(), "examples") +data_path <- file.path(script_dir, "data", "20231122_01.csv") +data <- read_dual_pam_data(data_path) +output_dir <- file.path(script_dir, "output") +dir.create(output_dir, showWarnings = FALSE) + +# generating regression data +eilers_peeters <- eilers_peeters_generate_regression_ETR_II(data) +platt <- platt_generate_regression_ETR_II(data) +vollenweider <- vollenweider_generate_regression_ETR_II(data) +walsby <- walsby_generate_regression_ETR_II(data) + +# modifying model results +eilers_peeters_modified <- eilers_peeters_modified(eilers_peeters) +platt_modified <- platt_modified(platt) +vollenweider_modified <- vollenweider_modified(vollenweider) +walsby_modified <- walsby_modified(walsby) + +# creating combo control plot +model_results <- list( + eilers_peeters_modified, + platt_modified, + vollenweider_modified, + walsby_modified +) +name_list <- list("Eilers & Peeters", "Platt", "Vollenweider", "Walsby") +color_list <- list("blue", "red", "green", "orange") + +combo_plot_control <- combo_plot_control( + "combo_plot_control_20231122_01.csv", + data, + model_results, + name_list, + color_list +) +print(combo_plot_control) +ggsave( + "combo_plot_control_20231122_01.jpg", + plot = combo_plot_control, + width = 10, + height = 22, + path = output_dir +) diff --git a/examples/example_compare_models.R b/examples/example_compare_models.R new file mode 100644 index 0000000..b54e4f7 --- /dev/null +++ b/examples/example_compare_models.R @@ -0,0 +1,14 @@ +# example for comparing regression models +install.packages("pam") +library("pam") + +script_dir <- file.path(getwd(), "examples") +data_dir <- file.path(script_dir, "data", "bulk") + +result <- compare_regression_models_ETR_II(data_dir, read_dual_pam_data) +print(result) + +# Those warnings are expected +# platt: failed to calculate im: warning: simpleWarning in log((alpha + beta)/beta): NaNs produced +# skipped file: 20231214_12.csv because of error: Error in value[[3L]](cond): error while calculating vollenweider model: Error in nlsModel(formula, mf, start, wts): singular gradient matrix at initial parameter estimates +# skipped file: 20231214_15.csv because of error: Error in value[[3L]](cond): error while calculating vollenweider model: Error in nlsModel(formula, mf, start, wts): singular gradient matrix at initial parameter estimates diff --git a/examples/example_multiple_data.R b/examples/example_multiple_data.R new file mode 100644 index 0000000..60d0b4b --- /dev/null +++ b/examples/example_multiple_data.R @@ -0,0 +1,47 @@ +# example for processing multiple files with the eilers and peeters model +install.packages("pam") +library("pam") + +script_dir <- file.path(getwd(), "examples") +data_dir <- file.path(script_dir, "data", "bulk") +output_dir <- file.path(script_dir, "output") +dir.create(output_dir, showWarnings = FALSE) +output_path_pdf <- file.path(output_dir, "eilers_peters_plot_control.pdf") +reload_data_dir <- output_dir + +pdf(output_path_pdf, onefile = TRUE) +csv_files <- + list.files( + path = data_dir, + pattern = "\\.csv$", + full.names = TRUE + ) +for (file in csv_files) { + file_name <- basename(file) + cat("Processing file:", file_name, "\n") + + # reading raw data csv + intermediate_table <- read_dual_pam_data(file) + + # generating regression model result + model_result <- + eilers_peeters_generate_regression_ETR_II(intermediate_table) + + # generating control plot + plot <- plot_control( + data = intermediate_table, + model_result = model_result, + title = file_name, + color = "black" + ) + print(plot) + + # exporting intermediate table and model result + write_model_result_csv( + output_dir, + file_name, + intermediate_table, + model_result + ) +} +dev.off() diff --git a/examples/example_single_data.R b/examples/example_single_data.R new file mode 100644 index 0000000..e90061a --- /dev/null +++ b/examples/example_single_data.R @@ -0,0 +1,44 @@ +# simple example for one file with eilers and peeters model +install.packages("pam") +library("pam") +library("ggplot2") + +script_dir <- file.path(getwd(), "examples") +data_path <- file.path(script_dir, "data", "20231122_01.csv") +output_dir <- file.path(script_dir, "output") +dir.create(output_dir, showWarnings = FALSE) + +# reading raw data csv +data <- read_dual_pam_data(data_path) + +# generating model result +model_result <- eilers_peeters_generate_regression_ETR_II(data) + +# modifying model result +model_result_modified <- eilers_peeters_modified(model_result) + +# generating plot +plot <- plot_control( + data, + model_result_modified, + "plot_control_eilers_peeters_ETR_II_modifed_20231122_01.jpg", + color = "blue" +) +print(plot) + +# exporting plot +ggsave( + "20231122_01.jpg", + plot = plot, + path = output_dir, + width = 10, + height = 10 +) + +# exporting intermediate table and model result data +write_model_result_csv( + output_dir, + "20231122_01.csv", + data, + model_result_modified +) diff --git a/img/flow.drawio b/img/flow.drawio index 0f45cf1..2338b6f 100644 --- a/img/flow.drawio +++ b/img/flow.drawio @@ -1,102 +1,115 @@ - + - + - - + + - + - - + + - - + + - - - - + - - - - - + + - - - - + - - - + + - - + + + + - - + + + + + - - - - - - - + - - + + + - + + - + + + + + + + - - + + + + - - + + - + - - + + - + - - + + - - + + + + + + + + - - + + + + + + + + + + diff --git a/img/flow.png b/img/flow.png index 58157ef6d205f1295ed1773c35cd0695065baa66..a4f5bfbf0c495413d2d6452626d45a7cdd6d82ef 100644 GIT binary patch literal 119906 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

~cK)RQL5zlSIgo7~ve|L; zEb;GAU$Vk56dKR7V={*1(nDi;an%w;@sDrowH_{u(@+M(*Mg_GJxK${uX}Nti+3`~ z{f2%q6*SM|79}GisGGed*lvY+cm3Ow64|JUrs9X@>@A)Q>yO$PqDH-$&<@-$D+Lq`K^Dn>Xg}Bq+7$bdbI3B_2nZ)a+N9lN{Q&bg%t_QSk&} z)8HO~hm^BN3*CxxsxvBQlxVA5->pf?IA@={*UVC>#l*H)9Pa`vLN+|izN7W=vt8Zl z^jg%!EAB~@Kp#n5Bgf`Nhx8F`4xt}mPo{KUWbGU%?qnmaS}%&bpqQy?g=^s-)i>7y32@2W+Xs|7RHPCvHLG~Qjp ztY2-Y=1HtNq;cCKO=RWr%rhyEy4Pm|U$}oWJ4-I-&m_#NuAjl~m`mMNz?sikLTPLp zzsZutZo!TJNcuo4mN`?l(2^^+x2)Dh!>zngLqVJTnbx~(HzmiN7VCUfx+x%o{tdJX z>qA>zBcUGURj-vAU-lxu_|g^`kFr===U2V?bmHxjF3T~g!s9hm+js=v1ip(U zyeJDN$rHmyYM*Hq6DsxVTlfe+$|`Os#?S7QxL?_g)?y4WWmTi_;|>%%nODBNU^8?* z!@ey9@0i6yRd-Di-Qi4?-bXw54Q(#-m56nDQF!*FXNXw==@;L9i>IQ_fwpDB$5ZYE zJg@)h>T*U^H~#Rh4tWm>XEd4ccEMGgYoBS)q$icI;C^eLxe5Nrme6J#O=t}p#wO82 zTUN%kWgQua+g!`I;fNBk}eO=+Xt=~ly+kF z&F$i8vkZPEr?QmqjRLAhGK(z<(LaxpwbP`F3P z^!NIzJo(-{kJ(xJvo#EVz?d4n@-?fy<$lLOI%&m5DpHF9N>nke;>DTE6Id`VFU6H7 zIr>e=j4tybGQ=SH{321L;RP>*!mVo$*;vi>GIJ5CxV9$HgdxsKuE?UY{FjN-Qx=PE zwcYrHO@5;Njs&b`RjTLsUqpLWq?dJkQzi%$8gCe49J=ky=m(ZNuO-o~_ml+ona zj2BujSn36dF7Pd*_;zI7HW}KrbV$xs$L(i0W}dcDKc;j=)c7$yUIQ`$|y!+HXP|PFL!*IriUV- zQWKBMT={enrAZ>**Ka3mxdKi6;hmpn3;aMJ4oC?zjIyLI$+FAQAMcB4w0B(CI;CVml6bFlr9L@qqsM z5EWu44hMf5SGg>1Eq)M^jk_6s-Z)X5_-ZeeO~iG$%<|ble1nv5$(aw$r`{n6{KAgj zhbkUb&hCRmlT+Lo!NUunQUfe(YJ1n+fD6)Yl8;mQVH=-!cU}S?(H@vtb9#z&u94OC zl1AGmS38`-Y1WnJD}~0z_E!LQQst&tv7?apR>_GnINN7M=xlUC^4$~o@o8Bzqk;Nv z<6+K`18E|i$>B}l{dCBF_Vs(E?S|(Sjo0I?tG(Bi`ZRVG3(J_Q*ru=O+V*(*N;d%K zB(w6uGa>vKxC_r6!VI!tql6^S_X%}gmlsQ=t3LT2AL7jFoC}ol*+&A^bKrE`ItOky z1Bp#b?hN<8SnFnsXL16Q5ph~vDhDe|*#1xVF4a+%&>}8Talf+C2`nL3ucwjPybe0t zKUjSgT^mo^S;X{d!%bKk5BQ4AU-7W={ieY%B!9CZ5L2GHNIaUqgO_qXnA?W7Q4oyy zt=^N-v`%LxTbWKZXQFL#H8@wASkVb(sMOt<^Mmbn#vTVA03GRZFzgN40Pz&6p(!7? zkPaD#=ZT56)hk{M``?AgNON(I_0B6+tdp-x+f`lJhUs5FFPBaKt46k^a^qsR4uMNd=9-yB=HT)a+xiqb{)X#;(dzj1c?dE{HmMeLzQTojGG6fET&A4FV)3cki)oB5oO|4!uHhYM z9#r0bo^Q_<#SV*X3HQflL?<+0Qqlcc&I;U7Md^Ia{)opB<;XF#8yPR+ zZ@|d2wg~R_5I^s7oV$7`J*X%ISw$ z`T&&TfZBU;4JCLSBa>iP3Zp^?!lyCR*KQ29vS=+Ty`Y{kgG5)cs0%Btmmqv6RQ1lS%k97|`4oGRW)~JQtA5A!yrR>!jQ4TnfK#k4TUUNycV-;|ItmO58Uy=U9rE} zpltcuj?Z_LCrE`#^M56^`-nXqCPnNfHl1C3ZMc zDd4OHpLU*LH*P(8_8o-_XLHd`<+f>Mm&o1b&YBy3p1#Sa>AZuCl3%&k2dY#Yl1BRNwkkXa>N_oSe)%B%gKAXeZMFE4uHix0xgK&KR zYDFm?+<>>};oAhh*0frG{pa6Z-BKC*cZFWpS`vEoTt9jRKcUI7`?Yg@&h~`R zkFE-lgv57YUb|G62%WaAA@SPwTqWmK;$q3cvNqVo;Ni6=?8e_CE(a4PajSK4ZEnp$ zhlnhx{BUI)^m<$7wlvG$&oySafa|9>eTHThT%qQ*gbBb@BZW-#m^9Au9}c#C>0f(^YkMKi$j3fq*WV{GhWtsb z(Tmjbp!(K&HgQ&zqxhULCVZPFWKoQJh7GoPf|6@{p-vHBKFbkv@1!{KGJm-(x9|Zb z^QYe&I4%j@#ifxCi7I!NhOy{dbv?oo?MZRUHRte;MqGMv*{vquyTb9uZ!U;8mgnW}F zn;d9UmnNrjdbIV8I7hptNNYw$$AOWl>Nfhm;1OLc`j>4vG|&MoyRI z3EE$>9r;$%)uNTSkK8qLy-%ZrL5LxB?>4`O=c7rW=Kc#P@!)DFT+TapRNQV63@j5O zap+p+l06XQf@m#ZqX3f5JPXH9*m01%Qb0&w-%XGuiPOiThjuW-Y5GwTr;@(Ril`ok zPa@5Wlfz~>x$09}*zV)sOWlZM*SiKT>V1>{Y1lxYiiJrl(@LR3xy%W=SSJOI4_Zg0 z>8EvCa)kUtQ3$;!NdAA4=tBtD|1~@K|K^)Ai24vx+Xll|w1Jbm69SI*z$|%h3%qaH zh^@fU{N~|*j|f>dvzfv(gVCE_5Sb%Dj)%=lQD?b;%~VO;k$!QD`0s@0F0IdV_F`* zdPZV^i|$W>F_P*WBhN#;);N*Ks|BQtHrUG-3^`bU3c!~itIn@QiP_zCSDvH^wLxfG z8(@ZPPZG`t1Zbv+W~d#!z;*;Qkc&-A@HMV`HBF{Sq;%5VqWf=pF?(4&1yd}V>ItKC zyRq&oF>zUKpt|m2?u0LV(ljId7swBj5Su+S783!;VWN}w3^SOD%#mT5TWSA;Rs7D} z4K65m4}OGEJa_#=_ewAXtxF&Q06#t)c`tD{o`|3kWDk@jjD7}X&jV{G8*i{|PyQv{ zfK!$-$~*kpCfRNw!5xFltDArnOJ-2_++p;ysF!AdHM?{CyeIc(7!J*Zu=}ExCEfOj zPu|scjHREw>ZOm&;>ph&B4nCG)k zCB#0X!Wf@v;mPC(zuKpJ6m`|KZGMAd%KN-19RR_E-Kr3d32;$028c+oWn4 z+-M{B8vh6RSNaq(rMpFufo-*JShaYVA?hlLrdJz;fjSZhS9za{q6zKqCCI`U4Z|;g z9F6160PvLvhV3`e$L`oGoC@NLe4q7ziJ>ILCCP*uBMgrZh_FgeyU|2@%Inoeo z`3gjO>?25?$EiV$B6qlPsu&%~`zZS+()IQD222KArB$+0;PU999w_+&eh>v0Mli?U z+e8~N%_(P<0fx6diYrMxg-jblq*(8hx?te%@pdrQ?LktNh6}grl2>KN>fxgkA@?~E zNrPr)Ydg$?YE8{7inl8~0VgW36hb7EgEucTrS5X0d3hp0^40Bkh&a#p1XohSvg5T= zgQ1%-Z~#d%Zk<^ZzWqfBTlpJt6NG`5Fq16l*8G>i>T-cK%-dYn9~}sZDM?5$>1Id6 z${CAGG!uVgBcfKGN^RsuAnz}j2hiD#cGFvx5==zn)~&#UUXL!zLtnYSu^dygeFp1#@(u6pKxDaIX5ig@uN zX|5zBZ&sc*B+e|=NApa`5LsY!OU`y<&ekrL)M3H;eHvwtnrtG;r^qX&65YD_oO>Ud z|L|h(%YAq=xB<1X7_-g0=a5tG&%mnZ_mUAr7_*a2z!&p&#vAHhMdrUk6s${EtouGC zLM7pz#S=*DxlW@12319%cNt1>cYld7ui=Kv=Ui9UB4(iQAN;IhLr>yyHuc^o3N)g+ zy`1T!aZ+RW-H=LB_bXzPO-yCA9e5iGU$jMjskUHG2_)`ZZI+8z^)f`ST$W2^?iaNA zW*2@IEejK@45w1GctPReW6qg!dBY?JKWASYdq9rhxUb)kikXUcnT-A|AgA-<7~kpL zk4^uQXEN8yI@y^b{K)bN!(@-rnU?O0If;#0sq80R^MN+=i4U0kFWSsUy2Y~ZA8p2q zixK9M{V>#G`EU}3q+!LJxq`ZnMGutyXC3}^hhQZN$mre1Vg@Hk(sY%fLQ)351V4if zOTcas!=T@ajI@5u;*7%;RA!*->97M{^T&v%N#i)cbz?_hTBzYQh>?sQ*!dB&Kj;4E z?tFDscpyI=c%%Qw;PDArG(~gS`mD`2L{}N99;U>Y{FdlBaIIlEl_!JZ$jeURNE#9i zO`8nI^S61)dk=uv_!4<&78(35s#k(xSkZrYq6p<8Aj_6QK^0;c;!`&|Kf1n>6RW(2 z8kI&AWKbLkqAx~`$09PAs~YihB)*Fjorv9;aUDE3A61-PaZbkD#r_Lk4Ae2KP2+8& zY*#V+UL;DV9-DuZeW%3p%5t~EwsR&7maU4VL&u>*d~mUkW}ZG-EJye>%Z|TMu=;M- z;LTzElcds3%sv^j zA%<`U_b6VR5$hV6d?xpIv2$%9x-UteSiqto1T692qprmu%$E=xx1+S%VbST6J9y1g zZ9B*{_G#WEzH>*JD_&I|zO+ZXSM8B`rbqixji0^i&e$=KshB2PMde><3&PN|(`L)}DC_7|cWAsamEc`V2=U`}P(`2*& zs<0*db=VRycp$ME=k&O&M0?SQs=?Mj(L;Pp28!nx;cFmJ-?!izyuU#nr=;~xs~qG*=5!F_{k-| zu$zg792)tgf)tvih73_emwUXMeguCoy4 z`IDJ5SluF?mMWVpHmbM+;bS7@@SbkEk{xn!nXZPe^K9!T_AIyqE^B#1f=LD5LKrj< zt@uRx!Zcft$PJ}AJuY^OAknVrHLT}Yhi%PGuEexvLXD*+OVU0^Js)<@B7$RHLvt~& zsl_|kI5tUj6usYsb}LtAd7{imZu3$Thtb5n@mSvpBPzN*F|+u6;>^?E z003`ty+WKBaueYzMxve1hQe5|!fY#9Ow-aH$-mgMiD|518eGB_-$&+{OWBGf$^Nn7 zAs~()^F*NyJCg2^Vp(v~44@XiA+Yfi?f64yc-v<`TBo%o&Igc zw8e&n6G{xe#^-BJa`FYFc!_AmORsT=WUBC(3jS?az}ew~6O+I}WHlF3?>u|;g(4Xx z&0YpXFV8NCnM$*J#*&#kY+gqVmrr8EJOq+y6wUodt<7k-PcOncdnAtJ$~thoS>gDC zsFwad2;8|X67)|Ae&ENg7jLh#TI!&vM27`pr&zBry_WbcF(s$plCpYJVjbK6TlHlz zww0S78AiG1fa;b5EhKIsNM$%aeuqkWe2_79(+&0e0uwA_!qaml`@o(*N+@mG+k_15L3Y5hMql2wjmS1Ic2hg7At+wJo` z*E33VEJ))VNx0CyH|nQcF9WwmWJ8{}5ECND{R>RRT>ZTWw{tyxNZ?xXF7kl{tO<}F zcgqoS87?e6f^Ox4^Fs<(22{(Vap!W2F04z;6HHXTW(57zsl-{eK94$En{%ch)9#GEA8O(_jeG06h z+wFuH(6kDFn}OV>7()*dgrIrcHV^tPr{xC@i~Gh>B1eM8l#0ZdMDmBrtzV`ZaF`_K z9}e+(AuuR4)@INTe3DFN#B1wgqhg=a)qi9$&LD#=sREPPgJs@({bp2eUl8(FDa;!z zw|nOVDQ0=6(`XDf4Kg~|qbArHwaZA(WAa#TurUwM&*}Za9U>m7gD;Yqmf!z3bodH| z6c-GZij#&2!bgfCWh?Lh(omLS8Ym>?rGGR6dZa5<6Ga z2bm&rsJ?KaT$|p;1HbdXu=7uC;8|{Nw}|~jGUW>9*c~(%f%AGJlF!+9iQ~?!T=;z1 z?Sn@(9aJ)NEx&R<3--Tppg*Y;h1z_6bqFM&^$U5)?obolC_prNw&0`d+3SxUsPnc| zea(kR&;edw8<}1j=i;5_4SG2d)ase2Ldo8n@V6ED%3zi_)2~S#by=P57w&!nAi@x@ zwIn!?>!4X%SV1LB7HF#kbK%t|>0AyC{w~mnZdTyaq|pl0!oS;#*qMDa>!2goylI`x_aou=`y9_4T7vnS6>gV zOpz9tivIcW@)9y1Hf-tex6#|C1vO9_OGD)9mqSsWS0dr`*EIY4jgiYalT>6cr0!g2 zTmkBF*wfeRkZ>h9B|I=2CaM;3Tr&|6)c1fhlq~O>-yEdx_OSVt2GLwigh5U>S?2qy zz@K-pCN=*!sM7uuHh=7HnJSoM*%*ngP=@w*LgBve{)#RVj>vl*hD4}Ba9C%z7b3W2 zK6+WyW$~%=Lsa3J;*&13S=YNYfrnBDHKXMG$CWQ2yM6FwnWytYj9bY-@*mK*aX)9K zX}`3MewR!L;c+S=PP`7rGG^CW*{j8BSWherUU(us-dgV-q((PI| zQQQBJNaTZEYa%&vKoGHyWwk;!kHbS7J}x$9ln32%+Q(;H=J5cKzdgVAIfP7Uzzh?8 z5@gV(J6+fK-N?N7mDE$?^>gT$nK3vPR){=*;Kj2w!885~bceej=ugSbyxdAmuBnBu z{XgUqexdafYN{`Y0N$x0zjU?lH1%Kq7$*1gz%ZrhJ+PR-P-mI{FDa(KEBNLH_OH_a zZagoJjH57ukl2;}I%hbM_c^mZKq5&$hKXj#17V+t6(ewZL~-HLV{r*20(%1C%1%vH zmo}=YOeA@X|-mnl!W;e~w;$qm5C(xCekvssJ zyneJrU(u^h7+f}1{;0b7Qi%@JAOugi9y0bIjf>*5U2f(6x|C1;#E9kuf{dBl+XQfg zb2-;b;6`oF&F#W0LTiT&ED-l!0-v<}Vs$L_((NQv2_}d-DrB6F#Y`C&Q>=uT6Bom- zc##}4*xwcQkTyBz96_te457R(`KV+K_JMDr>mv1O^5x1*Li7|=TdZ5n_e+Wg(03<5 z$>_?0SSd15&spK>o5{Z|OCY24)3hq@UA#amS>N;KHZVF zH5a>IfESQ+gWOg9j01-fe7ExwJ?*&ZqJbxg4sUqaM!tx|#6zEV_@Whts!!j~LfDat zP0>>=!cbS`2Zl4A z;>eb>R3=Ynknmrg$a39ep2OQiLjVp=UNoQAT&n0e={WP8t#2;LFY~tZoik`8Qdfc~ zqBZqNWXE~Gv*8-PufNQNAW&oJf7WQA1OJMlzA6dh$xO*`^%NP1e=I#}>1x~Pv7;dG zhW=~fOaTuIQ?b}#-QPmecB6Wi?>*v}{)hk#t9=6@Bl*|t&qK#_^q4Fz02^VGDW*29 zIxI90D~39xrT2;W3AgDB*$}f_5*C58=ttf_Epc%%W5m?4Cz&}V)@gVK>3YoS;I_$e z^l(V2+edYpPmxUBHTvkH9mTuCdCPPPXL$!T;k2<0>aNBGD|~xCul~WnQ@iUneL$c3 z=$-SEVITaS8w~FqX!F{oGo6L`mh@bxDa~_XN(FS{hLY!ZpY@w3>+f`vqZ@eXSm&nL zxUVnQi~Hy2d&YS?gOYx^y^?E}4T?V@5UUIIoX>bW!HEGz)OM zXSDg8_7^nl+T&(wKLLBr^`D_Jl8KkS_IkUsiXAJCLj}cd;y++xJzp-CvZcg_BbN1g z=Dq8Rk0U+wFR}l779tWZXzhdo^{b3bxmmeCp%Z!c-tM-f*O51zuW_DBMb8=01g#d+j>JIjtv#vqEh>n^)g>Z#{YKo0%$6wHNekbw zLuR6;yp5PGViQ&C^)yY0T?mj#QaFw~i6BN4&k_-}E7 zuHT%6^>3o{Wma~xlYRKilsXV<$hj)~kXw5v>K`>^Amo>+kty3bllYLYNCBV-D<(UF z;|MLI(cpyi)uB1Mw?b}z#6Ip#_@BMC(5}Aw4Wo$*{`hLFe9Aq1;}D*}bW_ZPD95Fg zx~C-LbqFEhLJqDv6HnZWc=dq2(Z=jotr>X16csE|?Az89_45wdR$Z4Xqf?8ARbt3D z&Cne+@m2K%r;;?IK*&+5sFtQnef}4VgT~~zE}XX`IfE9AJ1!>G(IXLh=4PmmQrSq05mJFXaFsG|Ej@Uby_WK->P<%H7l4_fDixZ2& z2cAMumTQ?_s>qH-jxfCkE1bmP|A3gkW?Qo2{}$5xe~FyR*uM%1*10fFtq>$7E(m!6 zO?_qrkR3zPgAgiXs2lIfuL2V(+JP$KhVb}Nq;+07^}3^z@?QXPKk8Bd)V(>PJP`HX zGzlG47Kn~=G~vpCNNE{FzlBVbdn4k`-w2Udh)=W4KqRm3!ZGpaCGM$vKfo)P1dg@p zSE>zQLVVkVG=hKH*Enk;1)dgAVPDTe1_d*W4h=w@YHi>R!y_}`&Y40(wjGQtZHPrp z+^Q7k1gR8%ty&QGOa;TI>~COET)@fga_x91BTSkI3IjD)8^kl8d}68tb;q5>KitUF z2w#^eu=0qn28_J=PrHm+pGgt?SnPtV63FmUk6J~-b>F)Nr4Sv67~I=TR2Qs1F=Nfk zuAhD=h6LymEp@obUtj_}9$*Itl0QrIM#P80(Y<$DAve1XevLrYPaXjUD7I@Jj!++WLb4GJ9PG{90Ooc-nv**c&O}^DZO~ z`PM*2iSCipkaJM;bdN)popu&p!IjzT1mqI7y>U3hk4(sA53G~q9Iu8o5MBjS>?z70 z;N|K$eW_zWALiXHz&?U+p#YX4R+ovkgo)|vXIPcS{o{{&0-TxvPVB`aNx#WO@VA{< zhs(y;Uv@7N-S`Nj6%5$|ipR2e)pj-y7WC$+IvmN~xf%f6*F=g$RZaA=Z-Xa?&C@fD zpRbODUrGsfOSQf51-uMWK&j;OR{TPy31ycc`Eo(XOiN>{XUBQjTj#gT_4rRNx_sqw ztEz`!VBx4A-C_)ft7E{m*i(sG*v~UisJ-*th1Ab5@WFfK{Dz@Jm<{xs&dFia*r(Bp zQ}5@pV6eoRh!05|1|vXz*BOsY&zHZcWV8k3&`yIz~JkMXxAI~56aol&A+cod&y58^eb)K(fC>Fr8CX)KvXekQ~k?2hF zZ*|4{p>%+5o;3{U$zbpyf(f?&j8Lz%s055RJOb-AULJ~Df`lwTup8C6_dpTA8@0%8 za{B{2sL*csJsm`eJ-_{~GR=b8Xz(5Oi~=QBHF3kwFcdCoApDfz0~VetZ`@)FqKAd( z7i=jQHaEcR_r)m_-Ydx1Nc#K9t<}CFYlHmNpRvqhCO=Nwg>Z+G&Q=0iRqj@KPAtE> z_4z@V0%-?*6QVqG`j_&||0n6jIq!JEz8lmqgTg@ovzFxq`2(?|9jY%uFC(3~_!z>! zgb+jW2B7k$|L8dTN=fv_fF+OIb3ujqJ%Rg(8ekanm+tvI$lRiPliH3^FS-Qt5rd7+M*t(Nz(tN=lTd+fRe+AOJ@{ZPC zz^WGI2>Lkh-n};8+MB@}y%6#7=JO+8zabVvEI~sLz>l8#d7=#7+6sivfCka;echylJ{-vatb$_SYt} zD8$=C(`X%UUCZb83)f(3<96yCpD%%#bkM!VV6D&VDfb$AG9z$L z8RuX``CQK{Z0C85xXb%H)q*+zaFpo z(?~I_6Fetuv@>m=^=9e&PXp}ex$6+rcZa{1BlcnV>Y47nwcfij2YgRFtAm_dpS*L2 z0&tyO;jR#oQ$*LBu{xJ_=y*E5H%V1!l3HJ8!w?rF)!7s6yMvq0?$t{Yp5j7Lwp%~9 zE;RWbZW>iuAdx}>_P2#AuL52t`A`HwhdM;|R6b$LtuO5;ajU1D@Zy^=V$qBC~D|%Edsfx*%Rlf^fGB z@nlnB*~5Rnd%?QYaqTLmgtDsbik=~X?3~iP@jdmn+B>fOHvO`sqJ$HCiGVOFbn5)B zP%Z@m)RoLxS4ro%Vk`K?fVO9VY@NTns7KR@7~Og0!jZGtDZt9yQ_GIN zvQ)>;8?0Yv!*0HZg+5z2{vhc<14bK$&(TK?li76ju1gA^nh^_Ne9&CA`0EI82Cj(X zpC-~rFuM(_Rc3Fq^}<|!^Rq9-gQQz43#E!m?04w@I-fChPW>P!9nTl|T2{vFb`0Qh zOaskb$~dqx6qu0uo;)+S9K+j12qs1VHa|Yt5j4?opvIdb>B{Y=jq6V4hh_c7i6kgQmy3Ap#dva z{!^p?OovbM*XuSU=#N4F;uc~SVFluc6@qJ6P-S^xoL$KCyXX=u4}lG9dgeVD}5F!!PiK1ADTk44wAr zyiqE5&5oC^Q-)l-O)lblDBrQE^|Ez6xW?I$Q>M}j(>4z9Y7eWb!qF=uwO^d#RqAlDIAuf4C*5IcD8i19Fojf`!tLv`O0Ppz58 zZ`*9Ybo}9?%0eT^u%NzYr|tr9tm-pnrqw{^#9Jmuh>S{_E&T~3r4wa(VR5r6FvHVN zJ!v$r##Ayg3>yjx(}lizV+PQZyT! z(#Y;!g4yP0qlylPt<0XlPOP1_;4pYtrL*`ev!gvcJ2H{7AzFb+rsyQ_`tF#zaP=U! zdmUs*PKz)S=<~VDHw!*+f77SpCxz}GE3_h@N$h++ilmNo*If=?`=4@Ia3*&|l&~*4 z2ZRo)R9v09aPLt}m{lbg+O=C@6qB$!JKgtj&D+3(M4c`$-965@M7F7lu8Wk2;vS$e zxH+|G?A2aXS!2czhEDsiADn74Wi*-(_FxZ=PJuz*Z_H;(WI4I`w={{ve(L5#{$Gv@WUL9PT+;Z%<`x4#Rs#QA_fD<2 zM0ZbuF6H1@e%mn@8Vu4>dH#-QfPjJJa5!X@7iW}^a45o0mNL}fey1@l$Syxx?v2b7 zI_kZyK@H!1>ldE-KFq}xa@+51QabnXn+h{4y?36BB`DG^M;I*&B&j=NL?veP*eCVR zgmC{eu$nMIjMT3FN;s+Lnr7?AC6lu&v*7`DahD*MZHi(`u)51i3GO`xf*DmkPu);U$ndaMZw1o`@HjOKrl?g zk^riW>=zL5KLEWMMF@D_doGDVPU}Tg!^{@{!*?={O|+7uUEjppCuDw=yj;-yfb!@* z?g_u?=5oCj`Z~DIKHL9rV|t0}S7z|+v_Y8QoLceEPA!Gtq|{K8@qyvfF>@9ooHziX zCzgvv^bRC+?bO=W$0aL&{GYFEf_hj;5zFiwcqpQ7KgEG&W+T*VwiZ2ZOUt2~IT%8) zd3pQP^>{*>vPh-W-SPl~#!4U|#o6yfGjw)5qT)zfkA`!_XdS)m0BqU2R zdH-kO`Ej6g2!i2Br6PE>ZQorgn{4q}8@#;VD1zmLigNLTu9?EEj4tkP>`L~JmB4wv z0aoM1*9E~tD+it`Nr}YuKYQH6_xJAh3o$e;))Y-HP8Sys*)<=H`R4Twd_2M-$oW8x zGw^7FpW`z=0N7Wx>8yQ0JJEP(mwV!YN8Fcy-*%;>d&qBxkBSSx&u03i~8Qf_izOBt~rG^!~Vu!!}4XCqd?E ze)R{rWuty>8#fV$)q6WrG-Abnz9_=03Ya)uy6xWCLZV&?V5v;me-sG4sIfD0#Z!^!Z?0bswLvbx2 zpDx|3i}G+-7%uX;csn!;nYG$=*Z>>U&8M*Yr3znhj*eR=YVSlzFql97H5A#gQ1$3_ z%R=FC?Fe0jV)!(=xAN@oU+PDqe4@r~7Cau*8i{M|3dc|TO3dXfO-R&hEf!JeaqnKP zgeq&+X2GR!fp3ShN4wg1NWrSKLA#D-aOv~UBAULURqe9x7t8f-JhiH2?oEE}Ci70^ z;uJ64zj%X=xw$?AVdKY%yy)HCX~o8Pr*>mlMoDT5x1rBMmKQ7Pzz2D z?;yIy6l$C}P9OGteNlQ)OH+Xlsb8zpai0~<(b5URap@;HQ6a#cz4{WZ$EjzC4)xmv zrmf$G<;Lkvh+nsOXAD)q*mK0K}>;;xMH$$z) zzA(fN>L^r@ezt7=fcntrEef{<4KB-|AH^DTQK#;D*hVs*B!Z`hv=r1 zc;jZeR@kzy{6Pk=SGgwv*Pm0fog~tU#qVQ9{j~B{&-uCQvzYV$!_`ry_CYm zxo_@d&2+BE?Wy0m^tPxM()7StS_O-A_wr6#FxP6Jjpny~s(RU$xpj7ksb*W%8Z?>e zq-x-|S$r&DCGEMXMc(`g*ey^@vFwsRWjj}|?s09px!A_eVh@6#Mz5FzzsCM2Dj2nP zO>n+?S$T+N=XT!rz-6D2jvUfWn8+-2ix{PUK7tcA65eji9pBHyz5c@T*1n?rJ2dNR z-~wJ-m|!T|o0V@gkVQB1ts%eT^gK(A7OXCuHe{r@PQ62?Pu&gql6L*v;^H6)=_O}ZMAMNkfJ4)KE$dIpz(i<7J z^tc=|#-)LCNfU|5qNjE~xqZst{59ebl450bwCdUr^IyVZ=NkU5H0!8brM2MRUg3C_ zeD+E#j5Vb4Rm$8ww))mD5m(3phSW%27&lrngv$97Kv;`-z0 z(L41ait}UlxLF*A9Kot=9z9^#;0}&HVz)xWo*Toi?|?T<#w)lml=Q zX{~|##@pP&WRkKHuE3>_!=&j6h8^RpN0K!;M3RL`*kY?ei1I zRjUM%?=ANYE9o4c-=n7&>`Kg6u&GQi;&52Zj6ccWiwE?)(3k!h#9;7~$)*NG zTYjUEcKO^4fmkN0fozI~q*BEO!M#Jd*XH~FJUgkE=u)0pc~;_Hgw#UOQlXmIU<78V;qvzp5@6zXiEYi*5KKpiCcC>WsCK_;Y)Ly6=eiQ8l5!YsZPv?9Pf%B}m0>GUnK>-A@pD~sb?y46~jf?Kr8_b28GTw^O= z25$8nC<}jIyTnGwxU|h(`{O6#PHtJF($8?;y^QiN{eeEq<#uto!uM?T*U5P&2z;es zSgCU{z-TNsobf%8UL{cT!$E&1L);_jFDZv&Y`B7Icpf*?!?` zVcIZq$f-9-<@87;S~4zL(xw}7_75|D^0+8b%G*mgtS9Kv%j#k3BpkScMl(Ll*IkJV zn(S8baS7)9L_pQteAN5}l`G`nKG} zfu0wlawOJDhtPjqcpb14?>5_xlbecy`}R-3KA zz*Z20!gn(24-TplLb@s3%_sDXMzAwEVW_%$gnK+^`&fOZPGNRX1nzU%FxokASCEMk zQYqirNv!VtDm*%8B!!L>O>{bBY#0n|)V;gyS0)xy?zxs?>?m4(!rHraUcPo5s9sLz zXk7+cf8*`6gC6JWuTjiwZ8aZn3pP0;W7lg-;Sht`gf|BANd5jO}NWFP&Q}C0KYF5}s}xn-m<`wmN)SYb5h!smTYA zA9j;yL6=gMHS#1cYttO;^!0t52LyKpRfwyx1|xb(CHfc{G2a6sM_C^0jBARpMo7)55bUJQ}q5I;3{R=r--Tnn0f-du- zOss3g=%4cwt3%}9OxD|b#+8mL#t{>8f7@*`G52r;cFA=M|7kU`F?o9Qa-iLl*DGex zrxfzB`)R$Ncv~4xpPub=eU}>q#?#gjjT+*p2~{yWhyvIa$eU&-u|rHS79?knb*h&I z?6{+3NJ^YcBsmy)`^egrn=TU=6C>$tLror=+V8mDXfViMBPUd>)oHIkT`XjKKg3IW zPS;RyGQh@Rpw}-h>l}kfK@izd0F1q6 zpheFCu&>+rk-1H-=Knlu#8%g&WQhD1Xoajx<9yxdNMj}xq)Sgdf;?&=svwdRYz-2v zAc&(4l)R2RQylreb_NC#93ZTS(gaZ(>(5?jo7{bQ1^gSsu7R~if_Tg(K3B%3Ge#qL zwmS%*Q8GkW4-RcWfTQOpL^lSqDWgp|L<|#I`8t6)#DnO~{>;%J#Y}Yz#+GiYvpwFE z_o1`C0xk1`+SDpA`FeKx6$2E*hg%T$PLL=adN)U9`v*Yw8+UTVO&|P4T>wQZTqJ=wQXnLFp93gdC;4|pgQEQg@+7Tg_fF$`2)cbW)^*Kf_-vJ)&>XoX_`I8mw#Q$p{A!XsL~_11rkv6#&vjGP9rZ6M^TK3`EW@6d(OJ z#EcYh3{em<69Mhc1R^;CRhcm2!`u8S^1}*zgF^HV`0yHgKa~93$jrk0!E9mO5~q-| zBc8Y#ES!B7*VW2ZIQz&Ju==_pcIn#OEP_pE@Ez?Q|6od@7yqDEbTJVZ)T5 zvS(MF5eeZQ#KUz`1+gR@(b>pvI0MF{SM|Uo@y5Z%?Z;a>>OqzAE(o}+Z(rubtZpFA zxLZ&NOKT!#n|E}d6Djpa?oQg>`LXfoL}%WobW=FlEW<%H)%@%p0&u{kv~x0!`nJ^O z*al3YdCrU+q}Hz^o;~14KHd@l!nCjxc8ghiKWg$msO_DD!Y)(P%J!2nc#iz%xKL+T z+ls*%@8G$F6xT0eyn|<;zRdTpF4RLrb1eYym%fZ*bqTB_LrCRz9m#Htf*W@A(|UaK zO5L{AET!oJ#pe;?8~gjfG32VA4TCK>^q3oV%YP0in4=yeQg}jM|1m&*2$OMb26{xx zb!@6781ZQAg7)P07r9U`z7<-G=iDPRvXyoUo-KlP_n>TmE>h-ru|_J)FOkh(-G2SnZPmw?M(GG9*wg()hjk^oj1Yg*G5GE7?)fZjzrcL=%(Y1v;6I$ z!7<+r&Z+z$;=KLGig(p3=AuLaovBeJT}sXn8AIoG{PUErGj!kolMB`Vow*{()#GW| zQ_uHGm{WE1=N|80rjvV7*H7R2vF@G3RtgdK>Ix*1@8}1J2jqbfc1G}f)0JrEt^yUY zeJLG2wGsLWlRB6>wENhB@OkivZulV4i}4cVO*eqlaSvuxRhOU2@((b#9g^p^oMG#V z$LWAyNdP+&mzW5r&bqaVFs+gLkY|~#hEXC`t3BN<0iNv`{~gQKyU19Pbo8v)wLj<)Ux~2G9O21rKLGMDr;Fa z(I_1~iL2zzmm|nSVVJgkN2T97+p5)1#Qwjl(kN}I)l2zorH48sj;B4N&Ud#cf7NFA zJ~X2JLrBGYTqm4gkS|N!ElMyRbZ|2&4L~_PqvidyN(^zCRD23PHY_lpxhr&VK8L+O z3ADKXDjmLX(dRymL4hYYNb%Pya?Z5G2>s2^9{ee<(}gkO zyLTKeTHF9b*Z}r$F;c3c|5ow9R`B1k-%Z5)>HwN{WYuDdys4rEUcf^M=RO+=JN=pd zwHm&mTw>3b7<+45&2MajqOAZ+%AF(ikJq>7&-iJ>l>kT&kbc75O^LR7Tdatt zz3)a6HJrNR4(>dX_6--(F{m9L&E)GPVVu7Cyc)U;2c=N%m2@5Xu#I^6S6fQWGD$XG z%Fhd{R7}^q@^0KP<5qWO8KBNtk3i9m*Z3uz1P@AHhfvpr3 z9MTwj%B5dPw;FK=Tv3ePrE}Xzv+IoNScHKzlJ(!VC}Kj?&R8rqL5xs#=vXt4lsg$y zb4hU2_%>GWToMYr4v&4)xSyqhL!V^zH+^B?VtX{MMe=Pw2U>Q=o8JsQok$zTi6!+; z>=S<5e3MYTL2Q93vwP9Tfg<8+Fd;_Vg0Y4fbB|Wic-K#wDIwX7kdcGk|8hl{1D1xm$2~>XfT;Fyo2)mBAq7Kamnz&peqN%S z%)V!|Q>4~`wA7+LT2Gp5yT^{M^~^WZXr-26>q>RbIEiA`vMN7=o?IcU@B#UcX5=4b zdLqLp%X@|Xj6M|gbQZ>QLnfiT>>5%3_C9lmMxT9h1opad0*}(}BNTR8yDNXc$3;%E zs>l$l4fgYv5;M&yJH!aD{#%+4OmJ+@=U`vjUWoGx< zNvo5xkkiX~13>>@^reZog3RdhQX zn0hGUp&_dgNjj+b@JY(%Jlk<%Wi2^4eEGmh0r`3PP|B0$ck}39PFdfL@Pqv>tCnoz zUL2tb-)7gkMN&L~9(QAev1Nwm1EL@Lhcn&TVPDUk1zPjUm))oD7);xw&0u8pO|ow% zwi_zqCx2(%y|wLJQ-Jub6V4V(^w>Mr*rku{{CD;$Hu4_%;**wgb^Il3*e&$1tDyl!C+cYpt`=$0YNscE`1IQn|jH^ha7d z8J9Ag=>rO#W#eHQHmPhSl*>UCy`r?e0D&XUt`NcZ&Pz!>{++=` zvNc_&lpO^;B}bopBSsbOEmO^UtX=ZzjBx+AXa#Kj{8yogx1mN6;%`HW4ZCwKwpA6R zMaLX-+97v7GdX~{4F8Iu)bM=zPyI{Z*dNd7e~n+-UWT8(o)kqDnptSy^wDMLnf^kR zdL!H)A~iazw%MkbdO>$*W}jbr#v;tQ0K=t)inzWyy-(UL@5zx6gAt-u%fQOExFM|_T{7Qnh@@ZoblJD}(bXPBcMlj_i=C%cYqhXimYYb&2N*f^#i3*`AQW5m+fEB)VFwW7La7NlR?Jjs3>kgiy--J+9S$h4@Y(*Zn$#z18(2{#UBeL z2LKbVQKFZiM2m!1ni;9hDjPy`}Pldmtc{wytjqr}^)E>nbX|*+lJ9i0AfcBzg0161* z`be%i&sWvv7aE}G?PX+etUFgG@v-hmsn|$dq5Sbp0D3(}Y+9K&f~2opzTQ6zwhW>I zj-HV(Ko#_2X{ON%l>Pf0PL3LF7wbc5@!#~skMzFw2_6Kq{pP#-9S>EIDO>Su+-5K5 z_Tc6+;k?;31)wCD*=&HkEo&j7PI1_5W?BE@{*q2`q7VgZ1VQ`f-d`5|Vu`sUnpZl` zDP8uYtG%(NJs^4RMt+{Z9F+W2RBwMNr>&vD`O7E-seRRqca|b)}_PKoeI4IJ>8H>pg(5E@d_p_6Vs>>{bl-v8rlUXt-P^s^s}y3i z1uCDcG`$e9^47H>53RCc(KF^hUQhX?sF{SHP@f9w+WhwB=JB@G-j+d~g{+ZbFp3cu zaC~#ue5Ew>-a@`dreNFJ8p5PSOm&7-A6v}8gP&QzI(=6Qd}rKyGdE`7lGD>1&v$~( zk{5)AC57w=RtJv^wN4nYit73IpimVH4h}L+fYUkB{H5t;t|K?0@A;eHs8T1w zGH==N)#k~|Gc%UaM}K9|6FzgXQl99rnmnM9zk?x<@1^-Q2zO|o>0xpV7;V|^|XFpFBF`-xXdvYn9 zZv$X%YOKUvNmK?RQ)GWsQ{Y`F=yDVW!mAOvsqNsLFt$X;OC>0y+Fgu{Z=esdnco9; zGA7>tUNS1kf@1B4+kju;4OLgYq~{ELH|UYVNaw> zDR8+JU!Hv2vt}Ap^fmdp{yhCU;kF|_HMxocBn>Q0lt=XK38Gt{qKQg((+VhxHW*n^@`-Ra{b zZ88}tHWgTnMEV?YM$#K`ET;AhmU`awtuX2isu%SL1aT%&?yP=*sXoa_dZKx>Gq1cv zJZIS7_|8l9&$I5q@>0Q|RqI*nxklV{g?#e#4}inzBc}A7KY>S%y?>!eRpaH!18uVp z`F!IB4({yCThe$HF0s@ym#J_h)|h}{q_=((7kw83johcLtSuFEVkNJcmiz)D^;`_~ zrt5a-PJMRxVYG@nnYZ@7T)V!sXr%FL1R)Mca2|x z1?wS-Emj6FIpU8=Q>5cN4+Vb>1lF~GcvdQlN$ua&os^!4gN6tmY=*RhUspgjqtd&; zkJ^TzFQzq}BgG4U$m1WN?p=mXR!Bzt$ka#&20falB27#^or+rM6K zkW}>A4Ci=d^(J>C%|f_cu4szcmKVE^~l z%p5#ViV&!FcX7P8LKpxa6Z*GZKd*95#L^|Co+Vg99Bbj;?0zR(Ij*R_a z)=svVfW2Sf6P^WqcY9k_;*ZpJu&&}#h-QBw&k(10ps@E$SHkY5Y*bHm`F~q7Ra=ZX z)kx9Gn|x(+T_WgdnOsM%C3gV5o`j&4jsR*Em7u_a#;NDtd9-3iHu)Nl%e>Md+W@Vg zHIE5)BwkU;VRt}gH7y}$x3W-fk)kO@H`|uz9Ul0d|D8VUG-oPN!2#w9HxK4A=bwHR zu|00Mm-f@M$b?CiAJb&ysnzd^^XQRb@7%8O{#*t@29aWTuwbH@Jef3o6#hP9!^;A* z$z+_fXYyEiY_IC+(u&r=+}pp0qtEj@dS*ksdZ+hVvec_d9RgpFZ|D6ee9`ccigrM!r}0I2p~iAU=f*9zpNdOcR!7&-*sT# zpy7EAS+OTsS+GgS)A7<=8PEdU%e!SJu;UlUq)lSE->T*w=>WpC_{X-jhnpgjDGL{r zg|UwKAF<@1#1^H*YV$;|{hkW_-+|g7uUn0!!><_SV&n!dQANwKlqD`NrD4XI+9&Cy zsKKaXR>F+9Z~cxfa*(DAb^UXZUH9CCedbCC*98PdnHOVQ8;Jj$8;GJVUhN^m55P z&8;`Mb&@f(o7QO z81gB4{gQOx^@X!lNDWC(IF&_jD{Q(`aPNaB(t{fP2|;Rka{Vq7yXvHNgcB~!`047a zSDVP93Hdvwy`@gpzoPHh`}XjYe%_(SkBLm=D{tHOp&Cq>C;0e}RH2exsin*)a!#G< z>dx#MekHe^0|(3>?e6?gMc|2O|b&pch@n45EHC@U&L`9 zOkBvt5?QsYFz539(YNC=edeSKZW@BeSRr ziICe?wUtfVPOM+Y?NES92^TrMY#%50#k1$#MtNIGdnv9=`rY}5DpeVOR(m8y{fi^v zT>CeJU*UTBmwQ`jxzvp^T`t|VcFJM;u)@AYrOJrXp9`-&KZKuXT{um46;Yx)B49eN zWBF6l*W%QHiI#bO0;x&X-_zE~DVc%Wc+c3oqum9sujgh+exSIF#xpLlRmBc)hQwfw z#Vl+N@o`dRx)ae4lK-m!TJD@=LbKYJv-CU1*(ykjj_!`Tfyw1b;8_Y*yC0O$;Mun( z|0R{4P)Vkcu++(TxjC0_)mia!9lkcYO(HBzr!+9eWe8woQ)B6D{cIa&4hiVI+9F1V?k?rT&hNJ=gzLF%$=PL(!hQGUivy(`qNd`D_Md6=PpwlFS z`1aY)2#hZW2+thauC{$1T$LtNKZd}tMyg!kD9+dz0pa1`>;Raqp zZWl|!{4}QkmaNXfJ1Sg7enUhypZBp4;H-7>{S#RvQ(%4hg+{802c5n)0>_fL#Knx$ z1-WbT-BTkq)d++fIz~xmcrod1cOzbh$VRXl1R!fh@wrQAB0wOOfR>r0nW`*ZR;Y)( zw}j3Lz*|2asipAWK1*dR2<{c?g67GyH~7=<9^nz8oVOl{M03PaMUZZmiH=P^qioUy z7dN*o<3GRC3O*OuJkbgB;>~MarGA%dJE3iG{Hq~}u&Pah zp_ptP-J6Tix{o)gUQbDCTx#nrhWI_$>xq+ubI)G>qTSoOM!vRK|l6nV`p~6 zLWzbpl$tXzlV?NfVt~MUzit*i$w!=(+$vL~FALGdg05OazV%HG2fZ>RG$z9e=ng@w zNd?&A%s_>lmG$CSRYoU-Q1XjsQ68bUVB(ns-%Coqv72WG=Gw#S&(vSVz=Ps<&fO7n zT^x2?VOaHpmE?e?0cpgWSIC^08hy>S0LsfQcsPW9ZQTE@)|v)!3y%3PAoe#S{+TR3 zbMjY1qp6JgH&~69;@Ebf0gFYnu_8XBeSHc|{REpqSdWWCC;S_i7mVm?4-5O~55>Sv z?r%*DvEEPj?f&l{_mP0l-n;l9iL}*8|7(db_$F9rz0F0`w5-fx;ja16H}WWW3KrpF z*K+OyPa*h?*UnMdL&Wfp0Cz-?Wa>xYaJd4Vj$|Z4bqb)48$3;1ur4wA@QpfQO~kKV zR@o@Kvb3W($bj8$1AdWU!pff9pDQlUwz(>hfwi$yBxZAF2EZE{aU#aD{)&E^XP?BO zK8|CW$aT&T(NeyL^j-Mk-$5@)$pWzUs>l!|39p`th&DdkREEqywXKj&!PG)0PhHKC z3(q4!Cf&uZGK4|e6ArIV!Y%AmR?D1$Zqe@VEDpes@MsvxdkHvH-P;Q^(S70a&^w4J z0Xxt}ktN6{q3Mk^Y6!Ikdi^7stKGa^RJ>s&3KRZVFD?kj zhxj;S*_sp4E1weion+F*boQh^f~JRPPh8Ic`aMeyOURwmpTsuAD=ONUD`vj1B(T(T zOC31@isr11r9OH#c}ywrayHu}aTMk_1C}x9B=LZx;8p|ZpN*AF>Bq)C>;iJi40K1+ zJI3Jk5%bDed!YXKHd7B#lPZ&0a0W%el`ai|Uy9%e+XAQTo6C3R@4D0(K^f~Vs->{?+~}1Vk7%vH#4hA;JGH;pDpetoLMrr$aT$=elw7i z%8K-PhJtA1bKB0(FFkpkO>f!)8t*Q|<@Z`x8SGC|Z2dqv5w=&8R+Ppqr0VE@(^@Fz z&64x7?T;CP<1^TKNx*(DDAT{>N8tO76_Yqcg&!pM7gHPQ=#TPC&jq7~T=1g6+8KvH z-Y!T@-;Ldxp?w%C1A- zCU(Wp0r@r&3*by(+4gLlkNK8vS33h&u z#)>GUZqRoLORc&`-UfdE4ece>>}##@k$T~UdT?`%IMh%e#hW4 zd_3Q~(APa^zj|zYf!r1Zjrg|>-s=-Plb(m4N!6y?)}g2$EGy-JLZ?5V^=<3GDSEw# zDl5<1rgfL|#ZfSSm~%9ckT+fWonn>XFMIWZmSXw1OQml_8>fa&*o z8Dl6dlv+SppTv%+`}t%lH(td+Iw61_hgv$pLp^`wmNk(Y=Pp4i;>CD!Xvu3c*Zms0 z$31i)HIIhrz{eYzZtp{x%4d@yLAR%GOy_L;8>mQsCgIgOYp|6#UrxuTvoq0+9b9jjO!Z0qANgLXtY$PB#_Vggdi)X2(XYrB zdz_ALFazBz`>BFCA*b$SURyp{1froEHE3$|af&z`G2$Wg|9+q1&mlK(nc{@m(6pR# z;8E>idZwLqVV5!sC6nC7XeMm~4cAHxO^b!awlgD5X=>9MPar%^gVM4YL&etR zu;4c@#uiRvZLR2ESLL$E+^l$$l+K{Dz1ovVe*O{YN+NH~vY2RUQpcQj9U|H~3hHp6 z_IO$y8!Uywq!W&Cfq1uO#`Rc)N~I(h0@S&lPop2&W2|2tvLM=??Lurgc0sqeQS6*D zPT}tHGpuN-1G)Q0PZ+F_9`&3tDiDm8S&yPN&bA@NFfzxpqn!vWz^nj>U6sMQvgmxh$gxhdq3Gn8nP`OS5oRyXKa0H%M5DgzkLcw|MHC z*6??tmcYVI?3mWH$f(?bB@r4sx~V5plsKO(CRl3qEGd9X>eN;dkB0J|+!Mivgz+9; zzHhP@9c$&&cvK1>$=aCylqTO$%q3e08Ezx9IC?hq2dtD+bmhd$E36T5SH>;MD(;hiQ(i;OG;Td~$XZ#_qPeo0_1LzHq|2)t#|R64 zJI-A}&-yNjsremb&t>uR_45%QJNwFa^o}G>`+QPplPYn5Z-Py@fhFDHX_2qJ@5vy% zHkTIOuoEjIe4T60yYg|7VNItdMRHpmJoSy*>9|7U0Nh-c2bDXHCoVG5vM};+@6;SGx*Tu<{ykNNlK2nwuX}2pZc3yosDyS@9d&8osf~?BrXpj)^EUZ^TRA#L#Cv80RMj%NPgPF<#cOJm#;vNj=@hF8nx=#YiomZ`m^M#Ws ziZ?no%t^GUe=w#&{;S^Gsz@q=iArUD_8(>hM1jO$rb;-FUodNxTy2R=Mdp5vQUx?ld zXIC8Zo{(tY8Q&mtcHlC5Xk&zjE&{Y}xtDCB<#v~f0CDxpT`>9Q4jXq%4moZ>qWS%O zM-JX1BMB?P!%VK0T;Fv_lRV!I#%|;5Pi_Z$${sXCQmmo4y^O@ver`M$l@F&`mBpaI0Y>gaxCl3ogiIf_6XP6i@!B22<{ zj-RZ`P-jJ~rJ}S6oprwxYcAhNLad`ymR;tS?N#!2;t)5maUi|V)~c=H=W;qN z`i%q*W5b|Y4Q_?|wVZ@p5f2r~!f^>1kdk6U7sNxUmWXf@vd@_kkA0SkHwcRzFwB$2 z0p0$vga6f=!YGs`|JNUY+K+ACK=jXU5F5{hc$sN}KhE3+P)f2_U=b3a=$Bo)czOKm zl{_;n6;U$WJ29AikTsDf1lkIRre2e{vzv){Qkmqd%`brS2T_VDqfHsWE>M7aU+1GVs zoemVQstM|7=+=6;Bpu!Sro_&5b=slpt+x>gySny;#3dO=!-sZGzSV+T%Afh@CjG8l zHJgl4JK#%iz#>`}4;=u_%t^jlNx@O`^QRzIg(IGstDbh4ms@r(yuN-$#2gIO(j?6T ziBz&N?zg~93p^lWy7AkAx#OAdTT|d(&e_j2X0waV^u;e&x=sT&1?;VkxL{STPe9IZ z42bnLP8N>|2adqrP6SBLgTQ9|T*uk>|3J8LP$YCBZ4c0NH0FP+SUkt%OOm?E5c>$H zoao4|tkG}k&xjfz?jO^|6Z%DGpFqL^g2d0?_~}=jgG#W~@(c!CmR_Lr{2SFQ{yv+h zspAdmZ|9bN=rmk`{qvF<9sWZja<;3)gO)6Tk7;FQaSD0y@pt_cf=JEpE?4dB$_7qhZrOX-aP} z!s_Lo!I&@~*|YLM^#M=!V}y$+f5^jPN6vXEkM$@VvkCo|XV3wR zp2|3Q{7@!)KjM4$yeNDwL!)v_QijFD$*%UrHM^bqM44-bwu^5oE}GJWr{g&99*4jp zdk5%oU2(f$L~;TeOS}^=rb%c$J__u{gTM2=H9$Q?{ZI`lgZ5w}E#;Il|Iw&bhe?DD zge7<9}r1uSvaHp8yZ#VAC3hXeTUbV;_vn7LI+7k`k)%4j;O^o zvnB>pqOD=X&W_5(5^s-b!DGMXzsXDYtJ^zz87s=H%7`SL8*mPG1 z+%K#}(c$+d2i<;^e2~{yb@$obG8s@hs6pxQq>zjuN?=`rt1MD*g#-Ilk3Ht?ymTZS z8iVc;+a?(3&lYwqo-XGu-nIq%cS?tvb!2zyW9THdQa)E&Ry0aGy0*9k{Yd4JWSM{pu7I z5c*=b{P1Pt-kW6W<9!DC-g-1)Q%6kAhLWlwiFO|83jm7d_vIaU(87=D=B-uzfq!Z; z7^g^#W!p_4+)O}jE;pveC0o{{AmeM2a&3(=PPOxK)UKy}Em#bHm4%MD{Kxt6!?o%% zDPE%%xb2mwhj-QY0=a4+m@`Rg#BDJLBIB>(#ZN}e18kTmgW4~xaPs+OItZHvhi*u?^ zoOJ`~&@u40DB247J@@Y_#KMd!t2uh1Tk|+Px-^@{MWvw0Hif6MH<}lEXpShUlAO@! z07wIzKqnA5S76GGEgXucwazo$FNHfTwCtyN&iO-c(Y|k)oBYGpgoO{WGt!9(w#u8u zK;|G5-lZk_+Py?T-5O+v(-EHwd?UpUzPlaxeYE$xA$LhXGe$u?%Fm<}keDY1*+lHk z8wc5D*c7d=j?lzJGJ?1yu}RJTjLE+jP1=F8NTesptWj3HYjji{=p%Mhor6Q30px6q zFsUoqx9uxrVV3jbYZa|ct2-;Sz5r@&5E%+_h2K(hrU${^E|C1D`3|7YgSA3^5UXZ- zpX%Uyy>8^8f$Td|C2)Q--~*XLsqsA5{&L*02>YX#cT)91ut$-rg_&k%qehaAZ^s}d zBog<>?cLw_a=&+fOvtYg25Dlw9Jlxdz(mI%WS75HKb`(9*1i`&V__D6>%)=zr+_CU zHKA$t+4SeeTTkjgp>bdSJa(Pu3YME*;z~6gK}@5u9ss3%O*2R zVFEN{Xl@0v6gCcdjNL<|VpF!Bqp8G<3;6q*m@N*19k<)!0yJm0jn_QganFE#1zI!X z5h5ngUUcMSuf@^4N*GRH7jsnw;QT!U;%3{!zADcFh|gK%je8{2SihQx_@`8^bYu@k z+8Eseb9M2F&3koe4$VxX7$BcnRfKaQzFX+!@-qXW@Xp-ufPV zQxgdKEtFCZ$F)rOu%`8GcdfEW2JDK3@o_0Md}k}D`s#d#cy+g>slPvWjzwg*k%>^o zyP~kukR7IE#n>w762rZ|%07R#eD@%2Gjl>hKQtYoX3vB(-!Z(Z_a$|oN-UK=U1ZjI zaoks;)dRb$@JAig9Y&NQ%fev(6AC4bTRB0I(gCQ}jUeddgqf8$YJda6^}4-+Dl1Jw zubO_%@HnKhOVW2M5hvX9G*-;CO=`-OYQG|-UYgXktM8Z-v~Z$?o)%D7*+ zBG4g$gGBe(tG%W-8Bc}v-8!tj?Mow$^1%t%>@7h`M^t8>U!syWGcf5BO_uE|CgPk` zF52W6oiW=v#wp8QZul$6R`O)Dh>mOEL{$G#-pRPUiU^i%L{!TJ&ZUtkT>>?z0&2w} zESlFtrst}=_aQAGbJU4d6W~`y6Em=np1P{AV{C4t^}vH9Z$+SYyd% zx)st zNp9syHm_9!?}X->&7^o(3mTsj3!(xl!#p{q&srPrjD`74Kv|gV;XFW`AtvDEAbW%E zcKZ%osv-H{etly#q^;#8QCkd?M66F5vSEs!0YV|g{FO)%xr|tP4=rs9+jtR`+uB{~ zSaJDQ-V**#-FFbB|G_Zd-}>aO zJtF!^QRq^upV_AVpcy6G9+66lCv`HmowQKXj!7CAK}*5@WOL7l{VPy1Pdv}WEoCR# zCGc#i4GkBMmF-2s?stqIE)>2>mUj92@bikR1=h3+QOK`1Um*lags_+I`+XEX?=$_7 zTBLG~WZh6&133MYYpW`1H!jBDcScz$g%Fw9hqpnU^cz*urj*_WM#X!!PC3dYv)gUK zk3-#S7m^D#&Uk3{Vg{rUBclKXKK)WGD#}It6=IcWV_IIrKGgWM^_?MUHNkcZ>1^rs zwiFT6c)#lX-OwN(S}zE+%A=w(w{@i=dDs(D$%`^A%r_Ls@C<-|Tc|}7!=7iJqq4a&=QTIGGy~+&b0WA3 z=1z=>=NDy;FHnsG0t_&ZK$KD=pCzC<`+idpaHf%-Fr5AePeqtjrl`oc z53#V7y)wn;H8kKFQKM~0UDxi0mEW2J-w+j5O0kE??i)CQ1$mZ!OE)TyeMXM4XJ$bT z(JMqn)p^HDPthl;=tZ$d9Y#z!Z@$NomL$?2O{8$s2czyqI!fs!K8ofPX5JDThXau* znA*m}10;!d{p)jHMI1CS$Hd#Pd9;~6q8>WDI~z7uXZAm@N=_i5oGgd|)?V;u>AIqr z_W-aZNA6-e$t80es{hWfUJrC8jKQ0QR~t4)0QB5jDN-OKA|_vZ)VZ|H3i%l~f$c$~ zk$^wv)R-_ZHx!>f>S?=WHImJ3Bty6V-MOir;O~HgE#H;JE+OJQbeU_4!h%pH6ujn; zOibK?*bq)7xXN3vUiH8?!gs{fabT*>Yk1L2!gM=lr)|XbhcEzjLjS~8aI>7_y8Qj- zl0C3eKcf`lNpR;-#oNx*Z~SUgNUjWr@d+oX)MwS;&h7icV^G|=EBXn~Ax-T|hGS|Q zV5X&`9XG!a`es*$oV|VOPVP{)c4EzFst$F7rz2ajG+~J*Ut_;tb?KZ9RnA#cELPXK zT{P?Um?WW{JbE4!Hd-5UTYg0}(jMIm=BS_!Py6*;=a9`lGHOjXeQeEG)kq79ofXf~d^MaokxmEm5L z*<$o`gP_Bi&RZ}Ky0wL?uYrl*U-NN6JlmXuhf2)K%g}>c&+VS~zR9u(R@9m#B{nkS z&8Gaol|98{m#je?mVNfdN#&`yywyrAJ7h>VzSd;R?@k6P$MqfO{R6Za0vu{m-NwA& z7XKbe#b)i2uP1gc*PU(GR`~^ zAXDgZFMzhaTmzt&3#S?$&h9yR#BAy+Y0hi202a6;?3}6fhAq=H<{|qJ7CJhqjMtq1 z-aI7LnYy=y6ER~HtxBg+i$87uk>qxx>+|fy<3Jgz5;uR;wJ#*<$VsXfd+lsJY2Bjq zs|vqEW~+KLTLhTFlzEZKJMKz#!Z{vDI{|&fU8jy`ZOyRI(}!CA!Dqm1n=f)Mc>q$D zuBT)1m1YPe5pATbh2UEGuJwX&IZ2${1!aTOMR9v5Lz_TwJgyy7QIIU#+F{z)KxZ+I zp;Gz=eD+p<>?AVJUQjC^ww#w(=lkj{K1TJ1`VCX9KJwpps*d`e$IQECJj}O9Zz7t% z{f>;GuA|2OQa>G3l|S+lC^s(1#I`P)mOdUeoQ!6cKXbW_lms(UAu;F>!KLhXa!r(Q z?UHACPh$jZNIaAaG&-y+&mKpST6u-gtwwS?T-)}fg zohIhmgu56R{B5Z=+EoU8^g?4@qRf}CmMW4Sx>Bv%a|RC`x%19-g_DmLW@@;I?s>Kq z@DA(CUoTQn>3_DU>DvC_YodxI?S#epRuF)g!K6Ulq*Uqdpb8UR-lI%5*rwZo7r<;i{?c(MlR?dgLtpLmAn86V>w^ z4u7xn{b#vbFGO?RqXFcBN3leN4g(5vQ=GDBavG4WsFSs=(2D9fIK?~>q1**C9_)_|?EBj>els8B z{_nz)#64PAyhCIB#Z)50=o1x>-j8 zPpH;o{2F=bd8fHLTR834GoMdK=|mk`Wv*wu7_kB5h?Z{#jCyLolgi$io%vy^kbI@I zPCSd4Avbna+rtQh6>Z{L?{`nrtvOn59Mzf;>peZC8@$V6k*05U3IZ<=PiINs!}8#k zu;O6>siUrh{h~A1S-~8}GJE`D`+lf!%5p`*q^TRjF8@d}u~R7uE+7>w@G7yAe)h(6 zbFK7miy~(#jzFm}u`;GuE_>~T7jfDizxAB~jcfti#is94rEZ6Y?aVG!1EB-ZZLIEB zwV}e8wtBLa_J@Zhe)|l_LI{Omg`swI7$5KP_d4Q6Pn5h9jr@&jvf3$D^}z?C_r)da zWf(efK;F}Ab!ko@+KxYu@4A@@kC-!qRT!(DOvXNEQ!XVcm8xJvWCoP3r}X$UDhLnV zPzPm)siCeh8)hObGgHMg*ZTf!(@`P$t!OQkui<6h zc^3|Tfo`_0uMK-|zdnB8y&LkSaNVM{wl`Ypc}vF4e(EeTRBH1gN-YD&4Pvw8R>LxO z(_B6Cb0hF0S4NnAci+A+CGm#a1wBxp?A}OWe;7NzYbrO~)PtXy$@yi)ss%T5=+E{? zI1!5rGH*(9ZuJBz56Ch>BSP0REo+Z+7uRa3!N?Y+Cr$>GbdkN+wuutt(JIL$+R6ZA zq#r68Yg`pUO>F=5>;p= zWJpU^qI4vGYtLiD9=Y$-&J%oXA%RJDBUI7J67ce=Gcou(Mb&9DJx*CIb#0#1UBDEz*qjFsFn*-n)Hq~t0*Z5h&o7jo}`#~miItX zR1|VsP)iU_K~m=6`Dy_iZ8(4Ws~R}&aT#=j&Rf!qq9W@71A~pn%$s%H2q)J00^Q&Q z9}uB_>>9=z#26jRbnSIcJDssk1k|cI*5n^ABLjE8UkP@d432@@)!jU}Bd%suQ&b7i z{N*LH7(*j=#6A_!%5WhT^8bqN(p^;?|4x^Om43g; zUP=?x(i;Ozj15UOVT(5D8Tr{&3m)EKtU*{2M6G2P2$-8Jwz;iW67ahrd4~e3{3xXf zWb6Xg24E!A7&ouDlZjmqFEx<$F{*ES4D|xurqUTTvd5pHMz#hH8riTIp(ZFMaw7N) zszx3Iz7@bC1R_WV%@z1}dv1v(8oR>#C2I)*1#Odz+%;7BtVEda)YAIH1xQRFvHyOd zJ`Tj+;>?6Hbw>lVfZf_LeC+NqL2}-Qq^{|!wS{t;wjv2Ba*UD^0!q+{wNIo3`~?uf zZ8D=Bn*hj!8x2>_hPq=-Hhg2rDdh87V(;QFvbu}C<}E#6*z5!7dD{5(j_ub-XC_2N zmAE&b6I_Fgc`rXCl?|w(aJ$bes&6O$nlo!KIw0d6ephoz1}(Qe4q;FW@5N=7>HBD zdw$%fd+zfM7;V$6d;$VuJT!G+HhVq55wWPfXs+C)vY>dQTVuvPIdmTr0$bF8A=-#q zdPb@IT!5%vte*+)R5adf2f;OL3XS6eF94L7l$GSrLn;3?w)1n= zx3cXV4nl7D^VmQ`-!imY#w#HtB4YU2Tc@~~N*$mjXWO6!Ze?RoU#t&3Ak@Z^dfN_$ zUgP;NEY+~E+s>YFc9V4p^(W7nL-p1^5~89LLhuZ~ZN~*b1d2^n9l2siNogvGDJyiO zrLltPivdd z>-aL4q_J;^3%uG3itBG*^njQpilW^OVgYd2U7)usYohB3e~-KN&FQhclSO?#B8|Jf zjwm8h*rZ&M->YXmRP|32l$%Y!78ioD^42nM_haNRa03^H+>skWUS37)SBEh_cAPI8 zUjlrVuPI|SjOPdGhC~@ z<=7CFpn%*8#(+}n$Gd;nUblX=?f4)Rafn6VlJW>qMwKZ|bTJC{hUb*Tt2zmU5I}I_ zVax2wQF{yqd0S6@|0H-r2D*gCuT<9tZHGD5PNA}IV#2qU^A+mN1^^p6{?qGwt^1Ot z_X97&w`DtRKJo+r;+8q_-;|BXuRgvB%agGh=T07>K%!j4;yW5}?+WiHArCH6@i%svzR24R1|4mYMX z*mwdf;x$g(y`#_nMU9JMGJ!F*l!mZGErk(b;+Y{#7)&NlM{|A7}*9WGKb9_1f!V zirHB`Km0`Eb>4c@r(Xcg2bLvC3>hIT?36YxmYqg2|Fx**-u+ZjZgy%d&JNIssToU08m}Op35OUNog{^SqqZl5bZxl*;+F8w4x}NVsXj@bQLyd zhH{EE$F3VPFFO<&aLUNffMFe)Hs;zp1aN)*3=-?WOaHX*kvJz>vIyo0&FjXhi1ZM8 z2FM_W3(n`A-o1gcvJn6??&E-jOG)N9oA|!{l9GUvc$IB3@%_@k2-EyavE3#u8KVz@ zY7$Yg2E)=+fUK0cdf^ZCRE|o&H^sn;`zDA4VgcgQ0ah#5Lff6YJv2g98_x~8_J!hV z%3>0TvDY@-MHmIT1(-0D%1kFjuweFP?er))D+3C}^nFo=Hd1_XXb>C1?i=7vxFGt$ zOTQZy%!{bocy1lH_8B1PmRiOoFcEo>VJ)I-?2hHfwSf$|$E{?UQKkYbF%5T+4Z=mR z-*&IFK1%{w0XW00GOgNAIBisD*4#bSZs}7>%gURr%at->T6@CqYcUv+@aY1uffShh zgxn!gXYqnkxIS*AoVLc-FWfU5I(wq?@0eKe!q+#9ww7F|+uDISfPv#c>)=PyuBi%wzTI~&B% zhIHXM_O6M`BjsTizQ+bPe)m>0qG^v&xX2}SenQJy*WD>vA$z)HGIO>FHbgljq*u5p zDJO}{^fK#xCA#fwe48qpS3nfD*02Qj#qtYMS3Lk%O>mh!%Css4ySCvT)td?Jb=H@* z>G0%a#CUL%j55Pq?tS&iP^7rE$CJtgcf~~q6W~~UotcXf&wtM$iP)PS^fr>-h;nSE zpGjXeez7Wu2{W7v(|S|(jo4u%4wG(XhTjEV%6K|hDRBOghDG~uWY`8ZWA^$y0-$HK z{w-gL>vZDVk3W&tzlZLp=WB*lR;hoAe|W)}eZ)@pu=Z4kW~36;qk2c5`a4{V7(LBA zT7!fK%&Wp!F=v+=)W|Vq=i|w5@_uk6QI;yoYC-elKB?#^@q_NMAIuPj>*g8f$5Of% zFR(88u7gPaX4|Hn8A#cj%An(S{+msksbF9;`*ohO&zkv^nSo%s@k<0}WkIDsy(Lns z_sgS!6I2IGE2UOMmiIpQZlkcGGL($MoonUb{1Tqu5!vz?N}%c@aQ?&DZ^Ik&e^4L$ zmXS%BO5r?gEbkSgHm6GV_h#J84kS=pyoZJiQoZh@NB zKpds`S50(@Su$0{H$sId1M-hUg}nbsUkQzej??tEP-E>6>_veBn9uFz8ILI>4+PR) z5~5Y22eX}1%dxu1NG_O1+9_DhX!VHcu|xE%$bagOr_F?qVQC zsZ-)()1=kA)<_j;qKlI_{&t;JUy_six@gBv*e%0S9SIC(OLLWw*S+IjMg_DUF znaU&n4;sgOP)Pd!S?NF|1c#>m|NEbtYSaH4??$vZ4tdL*1Ko2_Ll%B+0nXVtpi9Rf zf1Zf-)qyvZgX({tnH~q0-J745torYwM=q8izsaBAA{S@^HoR~P6l<;LZR!4qWK%9= z0y!E&DX5vt`3OcGGM_~K(|^YWvM2CtN7#NZDSQ`jqi+iTezVMcJxX?Oo!?JfbSIR) zeG$Lcn1K%+5KGtLm(kWs=x1h3z_0y%7ielOfiu^pT9%*;zcUBo_su}`|GPIFP&(XO zSOdJjowH|bsQQ)zMUf%T<_^a1TLh2ac!VXwfX;Z}p&7Az%ivlropF4jw2kNXHz;c!U^b?Y)t&rGO1wex#j%C*?h0~BEk9F-DP0`t7o(5v5 zt6G+sreJ3F>q*r8R|TsW@>d1hk@Dy9T$S#O;%u6Y$G?Q7@N3QZv_*A-K5Y!nrXNFr z<~s*$$KbMet%>x}{d-Lp%QmHEz?1*|(FSZ}k?fT0|9hb(^wXr?Kx(uR?ms_bq08+K zbr35k!_1J#vk68t%&lX+_x!u!_H;y@gKwPr^9`=npCAl{bVw%#QnglrLnzlBL&d<% z5?o!%x1+TFS9aIqpD>8=Mt;Lo-F)9D0T zu(8_|{bwE@gY<_H%7Q2MyNo6Y+t0d}e2#F+j3Ix%*tf%I9m?1Wx7VQbDhsSTFFLXH z&!=#3u3JE*X$7jG_+z4H4SjK2tY>rZc}a~ahGRqS)*RC_Eu#~osYfd#WlgiP(BlRK z!mC2y+RbD@`hUN@-2xQ-@rVPG)B+UA7r3oJlkizOmJto*%Fjc$zpl5`Dpnnq6-Pq1 zA41<#kH+fTq=41hEj|2uQ2#6+`~K;56KG=9s#y1u{r)_eBvh9gK0_3;@$kEf9#?rW z%}6^*8@=}RSXP>2sg9>?Kn&h#Fi!sF4K8wIfnBX(AT=O{i-?XP8qA_AF2QucS z*!*5Ugr?rxa2D^;$md`!Qy)HK6^0WxXY)11XRsT@2&{{X&L#fd20kg`TVE-cUd?EX zUExgoD8^vom~kCj<|n~7c92~8C-$;@hBQ4E(U0FC9!8v4am7_D4cYRmf>OiVo%kNq zT)&S*+i*t{ZbKs3->qk6_&Y{sZ1(`h5lbK1gmERf8;YP?HC`yp-Sd&U<0du>@IJSS zxFt}~s3?IMTu z7f^6(nPmM*7i=kMNT|@^Oos(=-zA+rEo6%{ooLpPL_=-|@uW83+ZNTBdj7dpkC8`E z68&xDWcW#%kCp6}Wg>a~@*dN;iS{q>wjI@K&y|Avj^tFkSr!aMq(^rxc$|5KFT%AiMv0Cp{#|-4r?kKH>jDCdLiA9Cfxv z9jtj+0}!EXg&fM-0Q?K>m*!0T|J*-D;v%n-5crO|E`v?Tgiz+3uBKD4!5eb5cRZeVzl_-918w&GiB)7>usR``wcydz= zncpMXV?DHJChWWwE+IuZ?7-2qQz8TnwENMdX950!T~Lyuk=qJDf+uZ=60(2qdGZBd zy7M%mv1edHzb>`aUF)z4PdVLTD`SJUxJ?KPsM)MAG~0dW?A@E}zax-0{SjzQND24% zKc7%snan=_E#qpmUmFrloHF>}ps#=HRnXI`yIG~d#BVcVdb`;VMQ4`jwotEN%RMtP zRBCgdJ*yB9{r2aqAIX58zCyvVL5Dyll2hQ8a@xa|Q*@|6M6Uh5V>M*1KbM@k+;e7Q z%j)-e;X@ZJ__qq?bUR_9NAJw0CrEWW!v2LYJ9+W0wwZ8+-eWp^l z_Q%gZuhfakeimPe-uW@IO!=`7^hNSC_7k1}npJ$;lY`xSlqpmMBQ)&17a-*2q>A~m z@hF0P&0!I@lVbq)U|`~L!2PW!U%S%%I?PC!09EaJ1&u7rds%nIEm|FsnFFZIKQ3l0ZFzaKa$ za;zyn9@elBqc&k|o19Y+wNm@B{C;TvGNY-0-25*Mvj^#&e<|#bPcAW6wl3 z_h{*TJH6e9|KFDc08$-6a4uKN%aSDQ;b$f6QA|M;{YE%uXI5-}E)S=orSh)9F`b|3!^Z7&9BupicBLOZD*NEmL^>(Ff9 zg4heutpN8t9Fs*B6)upNq}A>OEVgwgE;JRf8Y5miCi$On3Pin3w>^^3y#ACmc%yLm zB#M*wPX7jyk2uXmShoyplwNNT@V{wY5AzIUJ{I7^erKF`OUZN2QJ>+B;^8Be`D{C+ zs1e#Ok?V)efa6j}6OfqeH!J@5Q+OphF9J;=Io;R*WlNs{0Bu>g_OCwYLRZU6;asFs z4&+)R(9)=FD>x4lnfFWc;BbHeYKi}=`Jg6)3KRm;%DM?q@vw%DOHqR;vFEYuz2sBEanld@gwR6t_RmB^p5n6#x}_%>P7@ zYh3>bg3lkn{JB2*GZt!yR#~P|9c1GGauETu%SfritMU+v`~`eQ5nvWtNJ;DhRuicf zkDT6>ac=u3(MU86x;H4U{41^rTu?Kup=06atWFWLd*lXfjq>l6}6THCi zh}isV;7OYzV!#_{LNrTxI}M+is~Z|$s9DsyDUL(qH_$K;lKMfnw~r!SP&e#*!x6LU zhd>IAfm~NCXGJ7#R(?v_BaJw8!6V0^5gs3}S2%f(BVAvagJIAN) z6p*zuK&LNTakJ0#-D&S~ihu7ZsGF1yu3SX63ILQ}oH)C|LaFRw<)l}Znd_WQJc}bG z9)Qnqcvj2#+c!9bM3;&w9xox#`e{^}#>XqXA2#_pcWAmAcIc_@TqUtA%tKE`J|{~e z@$C#ycXls?vM{yG>IhC5~G2vDSEc(EyH-OeSJ#;+25Qh zY8n}@|0HtMqE7Y3dB3NqHHRb}p#?CZGu3xrZ&Oq=dqMCkkW8eV0^~ojI<}DANxrV1 zU|r+LfhA|`RD`X4xBfmt`%G!7>!7K%b8XfA91>B!I3I*c38dBvpIV#M8Q!LS3WKTc zI@RNaJKL^zeSMGfa_3DCI`PVs2%xpb2p)e?RPj()3Cw(dgD{((T%9y}yKV>R+l>Q3 zK2iP-#D`X9gS$Z%M%3l@KxKC;G@pM0@s~$<4Y?pwL)TH+b9FBG3HN{T%L`>d+Ehg#XjrNg25TJI%3giK+eM4#H8RB8AL4oDC6= z#uqD!At{Igq?#?^2Fz_jrC;`lZJ_5msQv(Aj%yDSRoj;X9N4#7Z+~QW>5F39z&Xq~ z()-i5F!@Yl1I9eEY}z+ZESs)ho4W+%*t&0kR0Wg%tQgYnSGRTE-)5a*tN1dwO35jmc z!|okxsT6fLH!n;|5?6jSDtwYrOG}<~-ufaf0Ltcl|AU;oe)Fc0E~B!kRmV)Wy52{r zyy91k?8TR9B7J0W<%tinlyFPLe#t-aRPTW0;|~51n_EwUr?(W|jPJyh+J8NbZTkc# zr!|Mv&!T<|;m$sF(;C!8eS!PgB5<_1?>x=RGQWgJ4@q;mK)>6Xe@$B5?GiCq-+@a@ z#GMmKtay8Sz!CO3jZC{i2eCJ0?_MUp4Db@JDazCqWSe9MQ;ADTYDOZ;F1{Voms47A zw($Elb10p(ezEIdblZO6d* zKOANS*4%H~2@KrNE3quK;wTU7n)<4P<8*qa13t@*5cY%wNMV(>w+z{+ZOV{UH1Dgj zTG?7jcUq}6k#iE%6nLg}DabbL)DZvp`?(Cm67@V5CFOF4aF8b^J(jzVbLWxLa$O`y zzdUL_7<|1`>1i|F5%&boa3x;Zngp^nYs;zljNUDccUe9=}2(nRPcUg(9zfCoIyFZwN{lbk4AETX`gJ%q^J#svse`% z+2w=1`}I9zE7-7y#T011#wr|>Wnn1v1NCH85>>|GPv0Dvv;1o=eeK6Fm{++j@_oLG zk^bKBWr^hv7r=Z#)TS|m3df{>{PK$p#c@6tJ$K&p&QqQBlR;yqAL{<#Zb3o7kdFhm zqug*gY^IN-#UuR)>2Fyhe?T)2;F%Yt&sfnKNd#p08)iI`ShK_=7R8rl zwd3%k+>XedAuzd?`*O`3G~mzPa1&K898GJF7VWzwh4Y9qdJA>-?i}Z5SIocE!7#u{ z8N1_`X=b2mO5f7ok@(O?v~N%WM@Ghs_xaG=0BNz5lOBs$(6u-h;I%UCw7q`JLz3JP z@xerwaa%%ree|j8xNO0QJGhL-1xctIB8D+1IMc<`r9-~x5@Qp8KTnM zucWK=9FwxSWjI+r(MTIo=@FcwXgHjxBK609HthZB6>;PI+2PlDr{+5!9D-eKblmIH zt6}wE?Wxl}cfO@mcHZIBCHwK}UOhb7mKk`!#wtn)+HSTBZ%W5aUw(@6&pq}1(?8#$ zEhuC1xJ|A~nrbo#(_y6r=rXpK>^S*|NV#w@kJd%iz{lMw7yRIu`IN|>GnCA@ET1P7 zq8?8v2-Hr@JN{vRX*liU?)^+15|IM#YMMiGbXb!*SBlJ94~p{4{&SD9#YVP5+O<*# z6o~k%T+|69IchwMAPBm~K-iv|zDepo-;ZfY7ZyJ1d@Fr8-BJ1P52ju~LTBW-l|KH- z-iOBfwhYook3sR=HtEf$D?X4!Y0!~FDNc=q;4dIApZLZO>W$iZwQv{=)%`ZJ^y3N~ zgKo>qkPuINJ5qJ`8j<`@{+RDHuK0ud|f@a+*#?+k97L>jO2bJsh48AF947^JzD#UK6qJIvvby1GCPHimSR>8sZct#7Ae_u6A?+j$bJX&;b= znx~smba1$9|B=D+@14t{t~#p#cqpRuwpel{KfiytC@C(PskXPk0gU)h#=sezTNRj1 zPn|$^R3zeum57t>U;&D31Xz*zl_r(XM+VUf_RPg*ezquj-<%pK4B}A_z7rsrFrgeu z140)sJbXUgAR`L(*_x(C$QdUxvAP&h8V+eQ8rCR!N*V->L(+bd8E5#G`QLZqq>$Kw z4(?ZdAuv#EA;G@T(qRyo)dZrLt=Jk;jXkZjKg_zLpndQe5;2!QKScBQkxOF-V**}h zD0i!sgxJd3Zc9)TEB0|~iGG{OeQp9A9a4wBId>U9qOAdpu*_I z=!zbrjf@^nv-OEZ0;KLxpxj)OIq{Fpf8IqQ3L`REoV)`8m4=!G_*V=^Wxq)F$eujm zqUg_=+_^oFw=0GQ$OL`H|7Xe4e^59G(57Na127{>#UvBR=leORjPFWpn*M>Ms&KTi z*4d@M3ya*1>^A8#fi83{WK!1F>$_|tUhA0DJ^>m#eR>HyS%tl-BZo_PHKAxfbe_IS z@$Vz+FNeBJ#|gx{3n-{cy2Rl0af&G+!ZEB=^p8t4L%vQw-{uEY%LP@iI~)4O08jeQ z2B8jx0?^E55@L^xRteJH&}D`Mci|_TE$Ab~UPl1ix-VPoFt`q=Du&1cbjb;Wn0C}VBS_5bwvqearA)U3@hrEo4a6yflX*(J z^%J>wMI}a(LkVvS8&J-CHf&DL^%xzBmvX9iXMk5`i7%l6A9Qmz#5o?`SZ8OUU_3@Lt8*h*O=Sq^^ zKNvU;$w9-64E92gG%) zQjfn&q?r4ewydt;0`_NOEZLLBY#c=<)uX&iP zbDLWsi_i0%2;!8v6vc9Hf4%AU2g`Hn+t-izu#qc&ZDd<6Xgn;?6ir66X(uGVzH>d? z&sc>`e0tvGV@gi7iS*ClFg5&{BO6D%nv70G7OM|7e}#Den#d(R-xnWu`=sBZ|h5zhPsNPA)q%AxJyT~7h25r#>M)~g+thW)qGvNRgqJ$Cz_ zD~q20E*dNst1`QE3fXxPmYK>OjIi?dpDR6Q@_)QU_2!8$#b3+!UecDUGBNSBL2UC) zTSNx_7`78D+jsokC0ATf4+p`l$N?4kWw3l{_^R`FuUj`M5LHzF`wP6f{OAAPmwp9i zTx!?f)#SrVm(lW{%iPIKjd%Oc^Wl%9Bwzo#!3|iNDEeOf=lRFEPJ!JEKOC)|MaL@t+lK$bLKd35x_LRnfMoq^A5B=6{==u_W35V6u?5s!|g z`s$JghaZHbPVI#=)}SLnIN%>QicDr)o$Hz`WB{Tb&205m5Vq(t9IuDxz=@x!G*0gX z;!kmEeB}#mGdQ^Ld<)c7zHomj$##C1O5sEzrz}$r?WDuDQxIfs^`IC+F#189;ipb; zrzq!o=>_NU@3*HkP$Kpx&E0^M0m!8~Z|}BHi1O+BJXv!1|M2DT^8t62SHW3#`ptng zqVGnyPadVgs?II>e(X#i$z_tB|8fmt-u#{pEl9@P|#2X6?>O$>HSNa)#zqA*;^kmEyOAK<& zY50yjND)&OoqtHm-T+983nY>YKQWR37x|^86>FCU--f?7Qy62V*>E&$jW5B>=;Mmb zZTGdlofmba57A-Ejd(rI1N7aryfASfJO=s+N~eM2(H)_ZZ6x&&bWzJXH0+H=Uvxl5 z^0iy2{6KB^G=I+}l00>S?VfifesY0JCC8A3(em?48~yLE-2l)c4glnban*&kPQR}l z)}&8@^)2WV#i22;QO0>k?oOkO=fe77!!HgQ?+ezgPI&#gCWtKMEsg>n!Am9K{;5_c zH^|OweTJ|OwP78m)~R&7pEdSy6e#-o!{n#iuU|n~F?E;m@Yeg)PG(}Hi#pRkU;Nq> z7hzLSl=va`%%;{GQA=A=_$Efu8FwCH8XsXRmwuUBweZ7a7y=NVNr_+Dn-fken9`}e z`5AL&L!lceLnEC>_RY+~+M2gpdq&OxaufiKi#Swv{P?*4VaMv&4FA+8z#Gzf#tNfZ zKOUcw|EHI5_C~n1F+@wYF_Z>v61o9O-Mv_HtP;Ym3miRFGgF1D?iAKXc-xUWG5FN! z@`H%b_$}y4tjn5cU3!l*y&4H}%%E%yOtz(lH!|o7+Ra*i1?A#w5DNlt$rEM}CFe7c zTH!(ke*G+h^&3olKBD$FF(hj)xnF~BSG_uQaRV>>%x(>~QGuE5bnJK}ScB8@=9UU`U2f7l^KFH)b=u91^EaNP0?9{OW~X#%7TE-oXkt$j<9Y(@XIDX@pF}zIjjORiGAVz8QrU z7-3*-jx}lI!H=ce4_QD{eH?Y?nt)Ava7g|Mn5S@}++}$y8VH66)5gYndDTZ22< z5e^K>WPuoH5=|Xj-m*C?+bOtGipCcRKO%-0usJj`7oL>Au)(`5`)?0?a5<`wX#6qX(8S=bdOP z3)CsuDp%6*5h`G2gb$(Ay$Sr&8_|F_GsRv41@a1?keWubsB~tR^AMK)a9@ap&C=R$Jn=T$H0D=7&V>^>j?SBW#)YjG!_&*apM?kve0+@jdwA!!vi_9jV}afqcU>&bS@MT z0nl*UJlHPUczO#1uwj2Z7D!Aj4)5Mm#thvHo8H#r0mgVfU-k#XyR)KJEz;h&slWT@ z#A~jn^HS3zFf)3SLGUtg#K^NTvH2hp_jh3E@x1&ApJc(_8uGCEAJQ=^3bHm~k-hQ?&Zo=ub$HD#6`@1=O# zl$eG&82)YG1>cnrx)?TP?S_c&_eP)Wq}$pGZC@;sAS4N;=cOVN{HBNj3{;pQ!wh7` zzVqFW;XzpJbd%P~%h3()h%e_yV}SdEJ06FT3*kUT+6#8y`8#$af!>@|l+z79b@COI zh%>M}P#wXABnJw|XI}(-D2i{fl)s>_(Lm$r_*nLJM{q2nP!UKH*2xoilckB zkse1u4@>fmybDpO>K0bb-fIz53a!;4E#C4UIysj4u!U}@#A>ZR&4$4vGjL=r=(=qM z@Nnj96}6@>U@^PhdptV<)NJenbfS%h~FlxDc418SQ_yS?Dqru4g*Bs)3aA@bVswXZFFAo zG^WB|_1*w_k?WL*AieM+O6d*LjlE)7S%nKU9u83ZfQGn3gyt2B-^ymdS+3G7tzvR4` zlDmHh!xvH<=4aGC&8r-smv9ai=EPd%&S^!A8R{SZP}LX$X4Em%_ixhKSV(`t?nM-P zea1)N1LyNw3ilobyQxMFThsAjoMas(uk_Lpb@yPQu*sVE)V5Y%8QiYR?2qY*T~ax= zbO~NsEx9RW78&?^X(5(Vyg^Jw_upN;+h6v^(T3v%z88<~hZJEKI#;?_^`Dip?e-K{rl5Kp&1R(W z6L=~4g>H?rn36+gV2w*8p?qj+9nTR{dK$xC6?*y~bechFhwgN!)D8Y(zzQiSnt zJ-0-KUmYg*wSL04ma_BeYEIR#zG%6FaQV*4y!v() zT<1BZU{m8vE23>#Q-$>W`XIU0xi{)DlS1;I71n4Wnk%RW-Q7&)~PRi|C}P- zRPs=Cp?-bGb|U#gW1pERByFp;mzfle8jMCeGYu)crxyqmCLYcg7;qum?N4Og`JWd{`Y80nu#e*( z?Fn-=zWEg@)Edw6OFw^j8N$XQLOA!1qG-fNjOf>g{oR=y7te(ilfFPt_WWB;cD$6Z z8(m_pM9rtP#oin$jBn^UiL39KF_h7*N2H0wrR>7?N1W+hvnoA_R!>p{iW0v(@#FN> zUH*qmuKFJzt}p&IBGMy8TWEdxE%k8Rt$y!9_vF}&ep(w#-D%pA{E(34x32x^-^64! zy+ou0$+xVUy5nC!(^`Pr-Z@h3V;nFpB-3i`7DLa{WFQB$oU^5UspQIT1Bvw4e>Yg} z&116f)I%n1;+Mc8E9Kz?4M#`K_7$z8)8TLW)?(MzpswNM+4Ee)GIaFz&b7#H8mwnf z=$U7#HHGILsHnK9S#I)?m`d{sQISw(t$T8B8DEBJ+C8!PiCZJgo)_)k{-gc8`6Q>Q zp0xTzsC0J8>r%~R!!MdV9qsn!Jr(--60Vfm0zrk96#Dl}cALG-Q{8sh%x8)(VC)W& zAfw7#q~)cB`Pn_OWmZbi%wK&@>Ba!b#k%&%cj42YANy+`EdB4AAW#%VoY%3jeDY~O ziRrV8@#VPKOXk%!#|DufDmP7Tx5vW0r)whK zGv5mw_Im0(9Yv8#>Xhq!s%WO!n6raLHE~z(Go9tgcyT|8AjF+1)gPZ*E3`d={f z@Rtqbr?sIw_@}YKW<-z`fhq<9`8qV z<;>s&NFlD<>-i9J=fD${gEi_H0j`=ju{k57-Iifotvz@7O<%k?7d`6WX{x3=*b93_KK_5c0Co*Vk zO*ul?c-96b-~PEJiL*@#99?T{)BL>U!HjR7SFT^Yy`+6~dcDzHjHxY5lTJMJjDkR; zF3r8cy0{Djslo#Kifmj6nIdaMSheZxIQ4*_mw9w59F-#YkiW0LbZwiRm zA9y^wWh!Tg^u^rk(yg<;S^GlkO`zlXb&-cVS zhG?R1Tt$Q2nYF5NAXqKp6yo`CR$tftO3BEbTT2<13;8dz&m4xY}*Dg z6Ph4-nkpx}hlgVE5r_9VPf4EeJ4A+d5{U=$k6^?pLKW=NvX2jFVHXBL)*5OPsHQ&* zNXrw~HG=tXAU9Bv&5{K$ZD~`nmb3(utEw+~Ox^*8ieTyv3ek27QEw_hQ3jIck^%C7 zFLEbft^jJomj{5P@B{EAtqd^sudh4+X#tCcuZ|Q-1He__i{Sa|72!`Ms5+q?1Yab+ z&DZxrVbbWug0DoUzB@!Z@dQA?Clb zc)8E73zT%G*CQaj=>Oy=h!xor7Xw@_Qn!JxV9fi`Z6|_!e)~9jvxeRr>(r(4Jfu2Xyxhj`ka%4yh3GLGG}THC@~80| z^Wd!oSpjV$h|TxF$gw8y1LQ&j*MFuv2Z0Ls`12d$<;v(6p?7}FCWU}>6fQrO7b-7C z{>4P`AF=SD;fcv@7cTWnydj*W@pQ?M;9EeMc~{X$`V=^JKLGk3Lw6%s4)H*EoSTg& zTf%372iIRbXe51MJ)?i$E%_|Rapr{nt~wRdY4`!3n%_V0zJ$~rfxpTP@6n}BEh?Qx z=!R}FnoP!ml6PKZ&lF!B@qMwIi;B!$YHjKT|2#jJOb+TM;#oez=%$3B&u=w^!CP$4 z`Atqdu-A5t6$E!PAc*!Hn2a|8QBeD_Kk&}ay&XmMJ#-9nmglqh5q!k)G6&W0{Z+kj zHwU_V9~3~YKSrcxJzN(qeKeSGK>4}3@{<`Z3zcUEsb^eEk2F(=4rC(W;YjKlKo-pc z7l@11@6K#MD_=R>Q#t`_^g)4iM(*bqM55!lW44`jBpGZrWKslo-+Fy3_PC_)O_9nv z>GJ!V!|M_qM;*-c$oH#5BnjKd5-F}_y0y(5W--Xf67_lm;|vLFKz6?TqAK7Nbb`&O zd67uwOZ+x~@cJGZ@;^E}=Q~Ka_w3CO(kS=~Il}08(`aF29qD(d-a=!V?4To2egI+8 zp+GG)brFkA%c;_4ZKM&5%z2<{DyVV+qroT_?k`t>j#kA4vToykvpfB-7a~mjO;?5n z-xycc$^AH0a=6mpTdttDO7-Z09Gy6WdT7HJ%xIq&Z7KI3lc6M+b_eL^q@l^Kl|G4eQIyTuWBQun}l5s=` z**OXo%8rt3vgw$itio-tP>CayBqO_pL`I>ADBsuH=ll76e}DCO+;_*gx~}*2dOhb& zUkiF5wy{K|afh=@oP;c`5-x^_*uvtvMt1#{Elh(Did0>MbM=D8W!LZUz)3gBt~g~7 zVi{zU$Ad6J($P$TBSp7Ra_-ziE{p2`**@;RdJGjUJO$!9&7t#WS(VaoiW96(%|=)9cQ7}jDBn8yAJ>xuOc)33}C|;kPu62T)$Gy7484< zq(tK2WkXk1f=S5$5p>#fMivR%`9_6v0KrP$I&;OI^L_2pid{+Bk=g5_wvd{ETTN)d zFUimeEV1__^V%dk0yN`RY00@) zvZ;?(2zU>+D-K)rSn)PWG)mJ2m2A1fdQK0Bvxnz-1h6lur&^j(VU-lC^+F*!A{x{a z^}p1=(Up9jxl|&lBNjfOyHhrgg15FnVuidhxbM33aklS3{2}ljRI{b-S?qUjnqaIX zo1_~RUctS@J)H^Y;kg?pEF9&-$^@Czk)M|1_L0+GBNE>B#sTchCxiCxxbp(M z6XH%>ud`5+=RSb&Ovzi;IC&}E^$v4%MusOf-pgnxuZYfs&ub)vGepK6jwaQk$G?bU zs=I);#;k&r&Xcy6`1G=w1ml3X(6m*5dTh{c?Lku7l{-4g8v&Q7n3N8Y$1P1kZ3-(i z*U&}A`nqE;!>_^?t)rLJLsHZh0JnJz;DB}hdjmmbm|W^K6wioUSB1cYpHf!03OkyK z;N#M8`o0rqcZKHf2oR;Kbf)pKye_-5Y-3i}=maX%PJ9fypuAL8jGO*eUmF5CS^uQi zL#4skNr1mD7~p%j+@;?6RFs3xR-svT#qhLK{^(Dl0l{9 zQmjN1Yz}Rmn`)dHPeDmGE8j3pmrs7Z$s%pY=refevjvgj4G$6Xk{g28jZyN6=Xul* zdtd8`oe9`b89d8svnh7~(Z)?j{sv7EgKtoh&?q@v3bLdnXkTSX8TG}Ca?2>{8wjrc z`~-;pw%RigbB;})y{rtstvMZ^gC3U7Q*LgCt=vjB_ieMU{K=^-fXs`X3L@GB$>R7f-2}+@v&}|vhy#!_GYB7sOad=;5;x0Mqs_9A<^bd}UC8q@ zMR@GedU+YQTv%D{Vm2=r+19tE9$N_Gk4GK8>RnieGAgCuC6M%sl{SgwWo{lg8Kn5c z8h9xftCs~w72ND;g!<#1;Rj#@x~7ohrR5B#wxu$#8JAahYA1LIC(RP1m6-eL7R3j- z+}u*IAn$piIDA&B1bGsgWl^Dsx~6`-%07J0W~DbP(%=G+kFwb)7lNDJ44tJ1RVxU? zPS!srd0D#oFq_(h9Jj7Jsej`BM%Hu1rI9xu4vZt!9hH(ZUABx$l5Qt4g5_WCrdNWS z=YjeC>LnPgqkVuZjYR-z8sUd=(V z0~Hl&60$q!;F%Y>Ie5DFm=1*H}ILwBPc8PY}Q*2XNLRk)f5zTk|@ACOB z0MmIQ&k8^Ax{pfykbDa9Hu^!hfd4|&ys7@!xVH}JbC0h6G{1%RV`2TogHGBYn6O+l zwt)A$@G65<7cLeE_SN%1(^-(k&<5;(7Zd|?-i|-@mEh0L#!+_BKezq~Fn7|GEwk}6 zfKw!|&O%#|`Ma)aLw9n_azM~ul;Sj8`JkdWBy|o|)uPtefbTX-B(Pwuqfq=c9k1iU zccW779LW{Wx{wxM7Q(@O+|AiBPSOu%rC5~M8S1A|`TMibe~2|l0}v4mti06jh=lV7 zZ`bJG<$ov}HT{0_Kp1LY0@lS^F6^D*PFpInudKkUQ0az9xhoacHTm)(!P6r z1!@o0-EV9zv5hY`MeCFZr>GzMNKJ069*fSkm=soRWZn!a{f>kjp>I*lJ{tLl4{KNd zZG^wlU0>zvP}dHfPd=G>3!Q#>Kp(mUe}Kc4`+hIHR)#;;7`#G6TcWfEmw9KxJ|3G}HEsB%1<$-9vt8Nb>L(#Hzz+cJr^!LH;$f-6BDP4vu zUs&W2^V@sdy?OS;^Bt3IL{}kp2E>*3*MN5J9ry!-;QQ}|SoMjejE?>bZ{WCGR~8pF z2Iek~_tifjQG0iVA7C9YWP8(yHAR^{wa62(e;eKp{dV6c})t~&c?b5Xhfur~0J?jXJI8t0cA|mGa_Kzt)&;mtSS=)*tbLD!I z0FU=`|Gu*%cove-l#%tdHhS2Vc_3-WCrtA1&83dVjZ`8Uj0N1k4dPr39>HYS!0I_w z593cPDq9|KSW_U7`I)xJ4v-#LQ9OhA5XqlsB(!}SR`Kmu7=sA< z`R>iALH%7aGPaugmLBlH&BAJtEbJf`V#sSi9S69lp?)q`>Dc~Y@FSK4^~r31I5K$6vs+NB!m|mB=WR=O*UzM##L44p8qO zM7dfHaEGtvR}ck*N*8*T@5@X`AVIrQZ!Gi3H?TP7xSq4%z-lf&VAkg;-@Ct&GkW9b zlZs|mZE=1mz>Lg&uTi{R`3$*2=ak&GHD=%Xm(bArtI{;z-g$j~wk;NJbB*LhmX&QS zH|wdBiw{<=Kp0R`z8}^z+tryW%Je&|ru^=X+3TNgVpIqhtqyBvPZoZG7NN>rfiknu zo(tB8wS!D6g=f^UF?L=3*!jy2kK&zQyHA2*V%erSS_`OD`9+_P%2aM1;>)-On$3q# zc@nsaz6x4b93hXp5+9um%ID565q{;%@C#@SR30C-CNWZAD!)5m$24}mgez6?Xh$2% zmiJjZzXralb*3>oG@1K1^KQAR!y8 zscnvydttpw(-}^Z)_$KWpgM;b@e6<(F5bQ>CzI5SZm+t|+`lpkt!C3Nr4N7;-6@hn{!3r_jJbcj)r2 zpPTl?vpaGfQr!6=ZpZ$u#cI81zPEqDpn3}h1R_Vc{5z~VhR6ToxA!dCHVMRBEH-re zv~#D5PH`{^QmV{tnq{lFR~<^2l$dvUMp%EE9j%_N>FZ+v|rSo6}TL zR!8>{lDrG$Q!v)%AQH;~R5W$?hk}plGA()Mg)^i=Tos$2Jc!hDf0r}5kAL^9G`efP z)W*Mg(j}8YQ84O<`;jmuK?&n^%Y&(oor32uYv!n zPIb2tlYgO9JrR3Q$MP0~dzMR$?Yoar=c<%)$_pgsCbeoWQM8_xGKPOXfnLyDwDRus@|;Sqq#Lsuw74!t7!Cz5|CQkv$?jD!)}5Kn81P71PWK+_7*iyYd78xW zKF_{9PfP(E%~$H&-HJ~5@m!dM?KSE@Mh;`fZy7da;p)nMoZ(3G&~wPSXMttsIXfj$ zzSW|MA?GD%)|)g~(oo~Yy-bV@~{-{`fTivlq*lHM3~4T zk=!6SrDu7vm*CRmZ^4q>b5wR(CpBJd^vX3z{+$7Bj?72W<~bN@=~2M1$LkU@oNEEv z(x5<;{7_Joq$+uw>MATEj4(&F@KThA4QD>}bbS5q@1`4QN*UmNm1X|}M@eY@^5If( z5)sY}+YVvNAujEAmm%)=D#)LxL9R)e!JeQA>Qo<%Q_lp{QRqxWnACgd1{uU9b&@XrLDOp>Ii_tiR3M|${Be8tT%1DncP=9bk(kOY&UqLpT zwj(c5xWX93$CB}v$HSIn+6u2eB-3)C){(3Qe}sJI`6{$JAZ%tW?RdaT!PqEdiyDaV zzH6yYr{}AN!Xp3*w0%l$S%|*>|7wdb!dGZP2MC|w^!fk3AtiWZ|MuK#L;HNPE=19vb2FPsCQiM42aKMTY#n}LNEsh^hIPZ6e_AC3zb*! zNSj$XGu%LZK(nA-P2+l5xgY#g!P_5xgpSYrKe1y!$T0&#sScl?s<}UY16*{{dn^E{ zJw~4G)alJ=gnJ{eH?qP?XIA|MK$#Kg;5>i4t4B*lfvjqggL?YUtVaV>slWVCym1gT z<8Fi;3J`WoT?6&yA%uT_;CZ~^4wvDyd^hX5t~>a{E<6f#>h?xC7trllI!i(EHvM|B<_c5XQd|@dCAw{L*c{2wn0~0BIaYu%1ud z42WbWzJyOYmh<6mw*7~~F*0AEs;u>;*;Ch%D2YK}oa3`lyzT7zqM<_3bClW``%rlI ze?yZp>ziUNdMvlP0@AZ3zC2a%=-*AEZ86o{`7*OuoRa+Z?y&~In}omr>26aUYzAoI zHXRB~q|@0`Z_p*DqKl*b#Q|<8Z`fmdez?YXz_!nj<#gk+!(7*H9V9}p@1wF|)P?zi zxf~hq(JOwv9j29o5J?y^dUwD2pd1*aK8pf%h2TG}d+dXm$exBIyLjm9t1Avh$Oh;N z6=5Azo#Ef#Huy%Uo#}+KrFUOghYD&b6${h3n92H36##njw{P)`!}50+2`ypp*%K^C zf#Xm0s{b)yg|YN=>mg+Ym%KVwNX`NfROyp;`>&PFJ(NQY46kC z*AsP)UltI-aU|uHpBTX+Fa%_rkd%`5U$AQ=!&#J25i2%sDPXn-dtr*JXh_^p&J{lG#fyXC_;*?N=Wn*e@zyBu zVsJ;dKcifex!6Yv0^M2FHvKpFRWF`0Sp5f2BCp!Fe%*^+ko%G}uNU$*xJ96$blw~MKcz&I9ZtuQ-@i>es)U-&-PV!ueq2O|I;e_gL#1XTPfa z>n;Jx29hZ3-e%41r0_%m?aMr+m!8V_6N628#!=o1f)tQ0kcJFHZbiYKEKh%9@YO>5 zb|_JvG-@kapgZFS%~^^gx)co!t1}K*8|CA=OutQbds=a%Q42lVhYG`wd#0UYr-6a= zJg2JvB`ISO&y5>veoq;m%22SZJ$b1j^8Uk(tJJ6hFfA*JK?deOgq>Mri- z8r(EJpBUM_56W0Wnt$hFEztw9y=%ltiBAhSLBW(P>rwvV?x)MiXDSG!dc4PB(VkG5 zkIe0{>-Gobc{h_pJ0G~t)&;nD^N`rqAojtKde|DiKlFPd!$T%#Se?C(#RtRI#;Lt@ zI+qmhf1mQ(sos}b!Yjd!c&Z+;n8wx#WBxU!K!KA19Un-vj$?Kp zm>Re8uHoKixJ6jq9fIx;&A1ctljVyy^QfEEV0)YF0_=!GZJ#2wkuREQ8-fXI6<=yo z=k+@4{X@DpWXYM^zYY1^>znRd;rB~_o?gVW<_~Pbh2cnv9kvTSPWcEHaV-W1Iil$k zZJWZ8eANXSawdw>uL=VF6ih*!tzslBOMHN+1|@&191b=mjhbYnGQ{AdE{Rz(#Z8?| zEu1siwgdcXb{xeeQZ;UzS`2aWsaB!Ftztq6V$4O%WY~p=P0W@4{1iv{vOcjKzwZ37 zf?54Kk*Yz#f1=YPci{TX8k+EIfnFa4tlqZER-z7-u2tK8sZ!=jq;l?*EVqF7Otyl+ zrXVHu%0A6u0rmQr$PFn?^?TIV_UmusQ}%;NNO%W~^mHsWe$$$_n+rB)&=<=~RukS$Y*$$97zpaO5utO&CN2iCnEeA7GaBW5 zMF>pWkr+jC5W*~ksC3yHj_}C#=EDLXHAzEd$SGdvnVOTjC1? zPKkAk1%Z7dXCuap=IuSxTf^2Qf^u4F^R5|Bk2FsEZ^5qm zbNgnWhpxA9$9yLjHUQjnyk8He{sF;0o`S&mCmA-TWd?}yAvetTr8m?BVO?d6X<#}T zMuCce%b430XDgy8gJIKz3{(8t-@*Qn0E&2D@fM?CB*QdtRgz1bFYb`iw(IT2sOGze z7UVFrr`RSmwv+T@2c6_1by~6EacMU~YtjLrXgD$L_1N()(>|*~Gw)F+TkTa&yMP_Cz|YD4w7!f3)kZxwQf3Wj^ho zD)CoEFEWm`_)5Gmb9?!RM+#14{JS!9c~0w%T&(J)-krZLNvs}@*`uc1v=`qv*1ofa z$0UB7RHB_#d(pWzCX&fCFn)&ozUoC){?ngW^etYo&C`T<4-d^m<|~nh#BCJz3i&Vf z?kMnw`XAv`ab4ii_q00gL@i?PuNhoZn;d2#-dC~s>zGUam0y#t$@z(k{^-4tobQGU zvANJq=0m2{3GzS>Et@YU$}<`UBzRJ#{LAcZBQvEJ6L=plDn8m2^i=QsM8hl9|L{v} z+I9BP5xzA}|A=pU!}_%`VZXJWc$f=O>M}O)QLq=#Hay~CSytRWQ6RQVYWwt!?xh08 z!iYJ%y!t2OOGdpf*GFvKVj`7TLvEiV$IOJ;3hSELT{JB}9C=Y9%-eL*Fl_%(l}k)i zV4~kyP4aZNo5A@(-}4xq#Qv!RKosbIR( zG|vRzhie+<@uxO4?x&HqXxZ29<*+ie#TEE@qPUr9 zN30lsy%dkDVp^J}{}soL*Kv!JF6Q2_=u66W7tOtA zd4F{8kC!_(&`-u|{4vr$H|MfQV(sw+FP|I@XE6~s!CVj6jg_4hwN?*xZ<++%S2)_Y zdv8}TNbd6*EVSK9F8;(F1)Goop}@d8oEK?tdfzh(?veDyt>~?&O^*IWZ~p!;l;h~r zsSY=www%!Cp)_~>JAS>of$XhkE%cS~Lnk`#V2S;d4eFINV5zL^G<=&gNy+|Wqw`(zH+yaNS`(*n+k1uH`n z^jT@ZkL2ai!v7Agmj3y&LRbI9Tr0LSOFSiBCq^|&nQ8RBZM_{BCp6+e>$NiHH-C@e zB6mAgRzvNY(qAO!GT>>*_k`EzO`TgDiLO>yp#BmDp77|QYx;vfrzFp=8gKSLHSKpU zyNOG1l%T;=JmWKSBlO*lSM2EAEep0aQK|k-~Gyowj_Iaiot9v702}MSqTG~=-tZIat?K9!X#>g#Hf1%dJem}7B?KJgT(R(*cxhXOq z`&(Sid42M2Sji9b02od3^^=b6RyEw#P>V5?On#^192Ta!dZX)jgTwPq_+CMrJkEEc zplC(>`?l!8-|zYNYo(&=C3P_&JwCFD%)vfPTK9ELx}$7M+h#a5-y%t@rS`W!x|PPN z|8HY&i#qza{w(dZn?;RuIVWfSMMC;=hvIWS9gWWs*BlxL&^H>U#I!OT8pj_fRb^&e zPCqKRaix;H)Kb^tUyBn3t==RtbM?A?o1Bw|^M^wmS1xqX%G{8Uxb5lLNyP!Mg!R*) z(sx{NhP^_CPc_F9fJ)H3$|WIjzFge}mZkNjH=FTQ?vJ7OW&+euhJEL!-p?Wv4l=R* zqb_L!vt|}OVBVR*Eu4;h{7;;QbUHwL#)}L?dyEyd!>4E_7bA}ATZ9fz9h228s|LvB zHFEXUg889$*XQ+ViSys4_>m5x1tdj3HL@i?t9bip)zApd%R27P0V_$1DkRbO0x^gc za3Tydpg6e`F!hZrI=w!l`C~WaLd=T03OlpA!%=T$ovT@cUHnUs$Q4L3 zvFZk)50^F6-OCN>v2@#c$>Ky@W#5FFWtrRxgrJWgZ)JeqXN&$IvcbF{)AC$P!658a zoZ}gF?WdPOfl%QF?^}9UrSsKXj8q<6NR?6EhE*;GoHoL-#bxyRPT(aOQeIk0wz1e6 z9yr&p52Z{0t@}A0d^lz~yp}zRvQ~yOqdp_>;s3%Rgw;rQ)N(#^{rRqAh{*N#ck9o# z*L5RzBSeqf{}A~f9&lJ>zV;!|4Arik}K=3={eQCIN{ zCm)@&flmnsNa8dqT?NAAnnWhRlfy@4rXGXq&uy)2hf^ywB+u1Vr>)e+VzqSmD0=}& z&|c#~^-%dYvI0_l%9fB&TaCtZ++8Bm(!TuHfm;zuSAD(sD@nvjCjlOtOS6d=9W@R9 zHVSO1g=F}_H_Zj4=IAWn%u0NBwbIIrYaP!HQIICYMiW_xNew;&9aF08_ zUq$zA%jg>D`!bg)%}@ia&6Pi(HjM$YGzK68<@O^W5Aj3yh3`#URTgbjsuiU12>v}) zHEV9r3n0)09wlia6}KlAseY`@PRAJ=@k%lgp5c z8xsoAp723}m$qMfZ4nIH0EoOVdpU;7$->Fx4i{!K3!Ol z+crGJk)S2_LPA&W(qHoAzy{Zh*vwx)Cw@hI2*(IY zC7y?_in-;Ja(lm@@AL8jlo)tE)8zQ1$kp?q{qnspChsEe5>+hp_=q99JQd9W76Bf3 zSx1jMrb_cp{W17EqM30i#+Vz3)<@#HWX(T|M@XaQ=6n#nKQRQs1~=zEafwTgPm=fo z_(te^7W5su214mb;GViBWn3&3pTm~yf$|FxEJ^2yypHN0F9If(;%Z4NRjVBm3L*$M zhjTCeOjFFAmLSP7tNZ6Z!Z`kEihw!rqgwx#xA`;QejA^El1e~r#~dg^Hr=O#L;nHn zBVCnc0~v>N0m0ci;KG(5f|P>e?GAEfBYHBZa%Hg@9WsYAB?@!W3 zx|DMv&!SkhQ5Nz9DT<}K5QLAdfkLRGQUHvvALVd)@%-Or&4kZad5G-oL5i53gO>hD_674{*Ft#9a<2e2+|qnmBg%NPm&#g6nK9m(2kZm zzc9u1Pcez}fu3qYW#Q(c155KZm+B7`WcxIRK7SKMw(^O+&9IdYv=R|#(yd_9o{&!N z(5K{K zpMi5BZeJOs-7gqitZgEJBR%=nYVlj#F`>81qXipWSUJ@JN{(-pd|b}bZc+EErh-34T~_@hmAMagr^5`u>~b24U*-mqV9#;kW{!q{ z0QL%88*LKjHw>x`R8ixRO`71&(#e}~SMxk>haX`pkiGA-$G`0;5VF4CKg^`x@#82y zYQZ0HzwR7Coa7F#kfnQc_t!>QZ#OGj`7rUbsO^fUj+|f8;q+;X<;9Y^&v^q{tX+$z=W&SoW3DWz1J@-?%Y^uhu&xKq0Q$o%lfE&>3-oAWyhS>R!YtaV1VD zTw%cFW%CN|$=%brGjiZ+PVT6_gcw_iFr;m&YxtD@bzXDykicF$(z=$$epy#Z&XhZP z@*CTI8VZrV^zD3i7MAMvzb{zMyx{kc2typs`eC+=Oy|P?NTWVAA;1-hndBFnM4~ml z`GR|37KYm5rPvZH@j$Yi8}mu!iI!b@37s;-cz)Z$HM>4ow*$-{B48+XBY|$U*k) z!7e@5TKM7-PpPTHPr-6)lFOP6>0~dF+7R_G9qH|$>qqm&b90NHpF(j%T#vd2tcm@J z@KxV71X5726Kyj|qr6}KVbGe6<1&wp!E`)rdPj9+D#3Evcc%2zp#r)N-5*;9#r#)=94 zP6#Qr#p=@GW4HvG>D`3Mj*FHxHIB+;E1_4Z$KO;776=T9VWii^@Q0p`{Yg68eW(hZQr%SVpBT$zLiMP*9>4(X7tcC%pTniu{M0eXPr@ud9S$8Xu!ui}DHMJy z?O~r!`@>WX{8RVaw^vRRj_?m5dO-HO1B%?DB zLl7UUi<#S|5#+gcNPtJn!(RNP{gv|4*&P^8le145iQg`wi}!eiWu3ScAE0hD)f&G* zoT8Jdyk|Ds>o=G8(`kOMb}N>P0oSmtkkWghf&C&(X(=_GfSYr>2QZKQkt2r?v(5Rv z6Q43Fr?Ra~YI?2CIc6*e4lT8V(TFWce)@F%2azQ8Vtv~m&cbX)!3$xhDiXIV{1zKW z+U0yrp6KrCs+|>q3#QuU|4>4<_~bypJnskSVv&{!qEZm_|0U5Yq-a*57v{V?xYrCJ=~H}umrop2f`gD>xuP*L-Y73d)s{Gr<>$cU{F1OxSqeMlOsTuKqB?fa|tw{}{=9 zqPm+{nMe?WFBhFo!)|DyU|deoAed}jVP1#L7|^NceR#J&*`R_xFuo|0zw(}QYH_Bh zt(TYDJ-I_B-zpG20u~&t%Tc@|RZ{E&7-P zCMr!H_;rxkxoMPnob#$12-^}JopHbQ3@br9|75YQJ<68xI3_ioNK!;p1;TF5%C_^8 zXoH}P**Rfx**nfUax;<9ZGBXQDOjQ^x7=&ouEpy~_-y|Tx!Sa5TQ}?YwNCdkOA*NE znS!UE`LWX%qLp(=c5;NrNz0T)*4mH48G5z5SRMNv=LHdvoSY5kb}lQ(IB%1hqk*e# z$u73kqr#3-HXm093URiMSyTM=?2*yPjaAuBwyK@{W)Y#=4v)g6ooZkU2$D;LoPd_C z)0;&*9aPgiBkkV#9OY#&#&SD|$0w8RPCZJFaJ7|e+b}n(rtcW7{0+N65r5$0E+vIa z=Ua|2VFWxUmp%WBkCzURSU5dzy^?3JW&_EK2{&F^+#%Hqi0%Gnz#CvmCsHeAeCl0@ zWx5izKSRrvhWLbZ3o%^D~bvUcRT3=hc9@Ea9sOUR9Ybhze5#z`Q$;) zO6lAgSKDM8$un;vsqO2S)uA8z-U7ay{3E=Bl(~J8wfTPi%GpyoYoB{os9SthS6>7D zYEL*xkOb|mBR8teK)VGmC8r)C_G@S4fAswRgF1NN3SP~5TT+6q^rkXI%*?rQI%i3_ zIpi~$k70N{t3W2=5X*|%$EX`+1IcSH)TSsjQ zSt!+3L-giX1wJZ9C1w!rTNvv^IeIOM2g#odU=J8CzmR&RmY(keqfXRtCEx&xn!!Ya zE9aknzNeb7Og_{u*P??V<&boB?&4xpf<(8&hjqTdC7^|dQP*$54^^)kNLxt+>fv}J zFM@o54*Xw_6!<<&po&%qp~fOr;IOT8m~b>xIdi#JVZPBAOcN8$kU#c3{YmOlGO6AN zBIHeWL7?uewAUwEUCaps=}`w`SL_6kCS7n;z4tgTiozE??OU>EP?_$2emDaWvr2nA zv#%~Y@3YRLA?<6(H=PP%(wWLau|6yhW8Aj&-gqZZel;md6T z^g&Riz0i{=kx#8kQ=Uka8`dZ>B|Sef#o!59Ms*izfj$pNVJWOY<{R9qaVx9-%B4X5 z%i6+@b?QcuV85x;|ERZ63r%dRTR-OA@Lb4A>#{o&(8QnZvvSZICzCmUuvY{%>2C7 zo0HUPwxwI$M>CE0!N6%J4_opPdr6@5Wp}lnxqm2U^XIK@$7mzkJdNDZLNWl z{mdXH)6wARqhEgMs+85Ld$6CTOHgRWGAh=)e0IEB5dRDzx>YZOxn<% zO}@1w!9V!K?fA~)l>Xp<~RKd$+{Z4{mNqP-nR)%*v; z@n$;fEBL?i9yUjBMN4OiT7efgfGL6gwHh7VKm8QHvsLNK{a>36`@D(N|Cvr*Tc!|z z*=}1S(q7*SFCjw>Q}^fsYj2+Sn_tBp{v}7SOs-9v%G#)TBi%TtYeJ>y24OIL{Ca3i zD(?eE^zH=S`AhoIIxRRgW;HS+m+2AXAM@&D{V z@=E+)pPl6MT#Gua_Jm17Ap9=#3bjVT;znKx9C~!?4o&ac6?YpT$G8rYiXB zs2~%l=?E{CDg)?m0uoYA%Srr@BkVsjCmJo0H2!KTeGm?P9wkPxVT1CZh;m(9GV1QW z8Mh@84Q8^Y-{u}(#=_BeH&Tb5CS9gky%Id}z-z|sTcxEMr0aB z4{Ksu*TZf9HI?3eeVCU|b7gurxBZb)<%sht)rsm?ItF0_IuMjxABwYZEK--JOaq!+ z5Cs(0-NG+aHDh&iA4^yL)$qt@lrAS!NUs>4ny&94qm6>cy^U4f;k_&huVkZBn) z|I1UwN|{wzE-4GV$+P^UlvH57p+uRS47wK;Tz(kqaf?SC4+KZ4Rt>Hg_f2#DTZP;5 z`(WflofNQkg2z*Qzx`{%^JxW?K@?{Gu^GHj(X$rv;B8YSM)xCVY&^&NLim-P@eQrV zN_Q=2k$2RApaO18LVM=E%3uEJvv#VYY_zMCIu}7|vDyrtEZbt~%Qas3EyCx{%^VRn z$O*b)hV(>q;&Z(zDZ=-?KD0x#?C}2C_zrQr@ndk?xFTR|lmS`rcx>_t~y1HEJV$8}VcbX8PNoX}G~ WcJk_*9BKG}Bu1x9^{RE9BmNI5WByzK literal 110417 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 KQtwiNQvMG*&ak}z From 44b49918a5e8e19388c53ac73c88cb6b711f18c5 Mon Sep 17 00:00:00 2001 From: JulienBoehm <180776296+JulienBoehm@users.noreply.github.com> Date: Thu, 30 Apr 2026 13:31:08 +0200 Subject: [PATCH 3/4] =?UTF-8?q?updated=20syntax=20error=20in=20readme=20(-?= =?UTF-8?q?->=20to=20=E2=86=92)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 4f0f725..b838b71 100644 --- a/README.md +++ b/README.md @@ -39,21 +39,21 @@ remotes::install_github("biotoolbox/pam", subdir = "src", ref = "dev") Examples of usage can be found in the [examples](examples/) directory: -- [Single CSV](examples/example_single_data.R) --> Reads a single CSV, generates regression data using Eilers and Peeters model, modifies the model result, generates control plot and exports the plot as jpg and the result as csv files. -- [Multiple CSV's](examples/example_multiple_data.R) --> Reads multiple CSV files, generates regression data using Eilers and Peeters model, modifies the model result, generates control plot and exports the plots as pdf and the result as csv files. -- [Combo control plot](examples/example_combo_plot_control.R) --> Generates one control plot containing all models from a single csv file and exports the plot as jpg. -- [Compare models](examples/example_compare_models.R) --> Compares all models against each other based on one data set and prints the score. +- [Single CSV](examples/example_single_data.R) → Reads a single CSV, generates regression data using Eilers and Peeters model, modifies the model result, generates control plot and exports the plot as jpg and the result as csv files. +- [Multiple CSV's](examples/example_multiple_data.R) → Reads multiple CSV files, generates regression data using Eilers and Peeters model, modifies the model result, generates control plot and exports the plots as pdf and the result as csv files. +- [Combo control plot](examples/example_combo_plot_control.R) → Generates one control plot containing all models from a single csv file and exports the plot as jpg. +- [Compare models](examples/example_compare_models.R) → Compares all models against each other based on one data set and prints the score. ## Functions For detailed information about these functions, visit the respective documentation: -- [Read CSV Data](docs/functions/read_data.md) --> Reads the raw data CSV files and returns the intermediate table. -- [Generate Regressions](docs/functions/generate_regressions.md) --> Generates ETR regression data from the chosen model. -- [Modify Model Results](docs/functions/modify_model_results.md) --> Modifies parameter naming to a standard approach and adds parameters from other models. -- [Plot Control](docs/functions/plot_control.md) --> Generates control plots for visual fit validation. -- [Write Model Results](docs/functions/write_model_results.md) --> Exports the regression results as CSV files. -- [Compare Regression Models](docs/functions/compare_regression_models.md) --> Scores models against each other for one data set. +- [Read CSV Data](docs/functions/read_data.md) → Reads the raw data CSV files and returns the intermediate table. +- [Generate Regressions](docs/functions/generate_regressions.md) → Generates ETR regression data from the chosen model. +- [Modify Model Results](docs/functions/modify_model_results.md) → Modifies parameter naming to a standard approach and adds parameters from other models. +- [Plot Control](docs/functions/plot_control.md) → Generates control plots for visual fit validation. +- [Write Model Results](docs/functions/write_model_results.md) → Exports the regression results as CSV files. +- [Compare Regression Models](docs/functions/compare_regression_models.md) → Scores models against each other for one data set.

Processing pipeline overview From 4a6eedc430fa65ce7253d5011ed1710857c75414 Mon Sep 17 00:00:00 2001 From: JulienBoehm <180776296+JulienBoehm@users.noreply.github.com> Date: Thu, 30 Apr 2026 13:51:47 +0200 Subject: [PATCH 4/4] updated links in cran documentation --- src/R/compare_regression_models.R | 2 +- src/R/device_dual_pam.R | 2 +- src/R/device_dual_pam_single_channel_fluo.R | 2 +- src/R/device_dual_pam_single_channel_p700.R | 2 +- src/R/device_junior_pam.R | 2 +- src/R/device_pam_2500.R | 2 +- src/R/device_universal_data.R | 2 +- src/R/model_eilers_peeters.R | 4 ++-- src/R/model_platt.R | 4 ++-- src/R/model_vollenweider.R | 4 ++-- src/R/model_walsby.R | 4 ++-- src/R/plot.R | 4 ++-- src/R/write_model_result_csv.R | 2 +- src/man/combo_plot_control.Rd | 2 +- src/man/compare_regression_models_ETR_I.Rd | 2 +- src/man/eilers_peeters_generate_regression_ETR_I.Rd | 2 +- src/man/eilers_peeters_generate_regression_ETR_II.Rd | 2 +- src/man/platt_generate_regression_ETR_I.Rd | 2 +- src/man/platt_generate_regression_ETR_II.Rd | 2 +- src/man/plot_control.Rd | 2 +- src/man/read_dual_pam_data.Rd | 2 +- src/man/read_dual_pam_single_channel_fluo_data.Rd | 2 +- src/man/read_dual_pam_single_channel_p700_data.Rd | 2 +- src/man/read_junior_pam_data.Rd | 2 +- src/man/read_pam_2500_data.Rd | 2 +- src/man/read_universal_data.Rd | 2 +- src/man/vollenweider_generate_regression_ETR_I.Rd | 2 +- src/man/vollenweider_generate_regression_ETR_II.Rd | 2 +- src/man/walsby_generate_regression_ETR_I.Rd | 2 +- src/man/walsby_generate_regression_ETR_II.Rd | 2 +- src/man/write_model_result_csv.Rd | 2 +- 31 files changed, 36 insertions(+), 36 deletions(-) diff --git a/src/R/compare_regression_models.R b/src/R/compare_regression_models.R index 59832d2..e7689af 100644 --- a/src/R/compare_regression_models.R +++ b/src/R/compare_regression_models.R @@ -22,7 +22,7 @@ #' \item Walsby (1997) #' } #' Models are ranked based on the deviation between observed and predicted values. The results guide users in selecting the most appropriate model for their dataset. Start values for parameters cannot be adjusted within this function. -#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file#walsby_modified} +#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions} #' #' #' @references{ diff --git a/src/R/device_dual_pam.R b/src/R/device_dual_pam.R index 57d7677..fb8bc9e 100644 --- a/src/R/device_dual_pam.R +++ b/src/R/device_dual_pam.R @@ -12,7 +12,7 @@ #' Calculates ETR using: #' \deqn{\text{ETR} = \text{PAR} \cdot \text{ETR-Factor} \cdot \text{Fraction of Photosystem (I or II)} \cdot \text{Yield (I or II)}} #' -#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file#read_dual_pam_data} +#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions} #' #' @return A \code{data.table} containing: #' \itemize{ diff --git a/src/R/device_dual_pam_single_channel_fluo.R b/src/R/device_dual_pam_single_channel_fluo.R index 176c3e4..d3147aa 100644 --- a/src/R/device_dual_pam_single_channel_fluo.R +++ b/src/R/device_dual_pam_single_channel_fluo.R @@ -12,7 +12,7 @@ #' Calculates ETR using: #' \deqn{\text{ETR} = \text{PAR} \cdot \text{ETR-Factor} \cdot \text{Fraction of Photosystem (II)} \cdot \text{Yield (II)}} #' -#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file#read_dual_pam_data} +#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions} #' #' @return A \code{data.table} containing: #' \itemize{ diff --git a/src/R/device_dual_pam_single_channel_p700.R b/src/R/device_dual_pam_single_channel_p700.R index 0f6ff75..cdfeb85 100644 --- a/src/R/device_dual_pam_single_channel_p700.R +++ b/src/R/device_dual_pam_single_channel_p700.R @@ -12,7 +12,7 @@ #' Calculates ETR using: #' \deqn{\text{ETR} = \text{PAR} \cdot \text{ETR-Factor} \cdot \text{Fraction of Photosystem (I)} \cdot \text{Yield (I)}} #' -#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file#read_dual_pam_data} +#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions} #' #' @return A \code{data.table} containing: #' \itemize{ diff --git a/src/R/device_junior_pam.R b/src/R/device_junior_pam.R index 92e8a5b..5183670 100644 --- a/src/R/device_junior_pam.R +++ b/src/R/device_junior_pam.R @@ -12,7 +12,7 @@ #' Calculates ETR II using: #' \deqn{\text{ETR II} = \text{PAR} \cdot \text{ETR-Factor} \cdot \text{Fraction of Photosystem (II)} \cdot \text{Yield (II)}} #' -#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file} +#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions} #' #' @return A \code{data.table} containing: #' \itemize{ diff --git a/src/R/device_pam_2500.R b/src/R/device_pam_2500.R index 0389338..af4a7e2 100644 --- a/src/R/device_pam_2500.R +++ b/src/R/device_pam_2500.R @@ -12,7 +12,7 @@ #' Calculates ETR II using: #' \deqn{\text{ETR II} = \text{PAR} \cdot \text{ETR-Factor} \cdot \text{Fraction of Photosystem (II)} \cdot \text{Yield (II)}} #' -#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file} +#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions} #' #' @return A \code{data.table} containing: #' \itemize{ diff --git a/src/R/device_universal_data.R b/src/R/device_universal_data.R index ddc6941..21d3ea2 100644 --- a/src/R/device_universal_data.R +++ b/src/R/device_universal_data.R @@ -13,7 +13,7 @@ #' Calculates ETR using: #' \deqn{\text{ETR} = \text{PAR} \cdot \text{ETR-Factor} \cdot \text{Fraction of Photosystem (I or II)} \cdot \text{Yield (I or II)}} #' -#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file#read_universal_data} +#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions} #' #' @return A \code{data.table} containing: #' \itemize{ diff --git a/src/R/model_eilers_peeters.R b/src/R/model_eilers_peeters.R index db50ac0..e175898 100644 --- a/src/R/model_eilers_peeters.R +++ b/src/R/model_eilers_peeters.R @@ -20,7 +20,7 @@ eilers_peeters_default_start_value_c <- 7.012012 #' @param c_start_value Numeric. Starting value for \eqn{c}. Default: \code{c_start_values_eilers_peeters_default}. #' #' @details -#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file#eilers_peeters_generate_regression_etr_i-and-eilers_peeters_generate_regression_etr_ii}. +#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions}. #' #' @return A list containing: #' \itemize{ @@ -73,7 +73,7 @@ eilers_peeters_generate_regression_ETR_I <- function( #' @param c_start_value Numeric. Starting value for \eqn{c}. Default: \code{c_start_values_eilers_peeters_default}. #' #' @details -#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file#eilers_peeters_generate_regression_etr_i-and-eilers_peeters_generate_regression_etr_ii}. +#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions}. #' #' @return A list containing: #' \itemize{ diff --git a/src/R/model_platt.R b/src/R/model_platt.R index 9fab2ed..c0a5fe7 100644 --- a/src/R/model_platt.R +++ b/src/R/model_platt.R @@ -36,7 +36,7 @@ platt_default_start_value_ps <- 49.76112 #' } #' #' @details -#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file#platt_generate_regression_etr_i-and-platt_generate_regression_etr_ii} . +#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions} . #' #' @references{ #' Platt, T., Gallegos, C. L., & Harrison, W. G. (1980). \emph{Photoinhibition of photosynthesis in natural assemblages of marine phytoplankton.} @@ -91,7 +91,7 @@ platt_generate_regression_ETR_I <- function( #' } #' #' @details -#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file#platt_generate_regression_etr_i-and-platt_generate_regression_etr_ii}. +#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions}. #' #' @references{ #' Platt, T., Gallegos, C. L., & Harrison, W. G. (1980). \emph{Photoinhibition of photosynthesis in natural assemblages of marine phytoplankton.} diff --git a/src/R/model_vollenweider.R b/src/R/model_vollenweider.R index 485a3e8..6630a6e 100644 --- a/src/R/model_vollenweider.R +++ b/src/R/model_vollenweider.R @@ -25,7 +25,7 @@ vollenweider_default_start_value_n <- 100 #' @param n_start_value Numeric. Initial value for \eqn{n}. Default: \code{n_start_values_vollenweider_default}. #' #' @details -#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file#vollenweider_generate_regression_etr_i-and-vollenweider_generate_regression_etr_ii}. +#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions}. #' #' @return A list containing: #' \itemize{ @@ -83,7 +83,7 @@ vollenweider_generate_regression_ETR_I <- function( #' @param n_start_value Numeric. Initial value for \eqn{n}. Default: \code{n_start_values_vollenweider_default}. #' #' @details -#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file#vollenweider_generate_regression_etr_i-and-vollenweider_generate_regression_etr_ii}. +#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions}. #' #' @return A list containing: #' \itemize{ diff --git a/src/R/model_walsby.R b/src/R/model_walsby.R index b321458..99e44bc 100644 --- a/src/R/model_walsby.R +++ b/src/R/model_walsby.R @@ -21,7 +21,7 @@ walsby_default_start_value_beta <- -0.0008944076 #' @param beta_start_value Numeric. Initial value for \eqn{\beta}. Default: \code{beta_start_value_walsby_default}. #' #' @details -#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file#walsby_generate_regression_etr_i-and-walsby_generate_regression_etr_ii}. +#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions}. #' #' @return A list containing: #' \itemize{ @@ -77,7 +77,7 @@ walsby_generate_regression_ETR_I <- function( #' @param beta_start_value Numeric. Initial value for \eqn{\beta}. Default: \code{beta_start_value_walsby_default}. #' #' @details -#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file#walsby_generate_regression_etr_i-and-walsby_generate_regression_etr_ii}. +#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions}. #' #' @return A list containing: #' \itemize{ diff --git a/src/R/plot.R b/src/R/plot.R index a3a88e3..b2a86a2 100644 --- a/src/R/plot.R +++ b/src/R/plot.R @@ -9,7 +9,7 @@ #' @param color_list List. Colors for model lines. #' #' @details -#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file#combo_control_plot}. +#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions}. #' #' @return A plot with ETR data, regression results, and a summary table. #' @@ -320,7 +320,7 @@ plot_table <- function(model_result, entries_per_row) { #' @param color A color specification for the regression line in the plot. #' #' @details -#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file#plot_control} +#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions} #' #' @return A plot displaying the original ETR and Yield values and the regression data. A table below the plot shows the calculated data. #' diff --git a/src/R/write_model_result_csv.R b/src/R/write_model_result_csv.R index 9331646..f789d1a 100644 --- a/src/R/write_model_result_csv.R +++ b/src/R/write_model_result_csv.R @@ -15,7 +15,7 @@ #' \item \strong{model_result.csv:} Summarizes the parameter values derived from the model results (excluding regression data), such as \code{alpha} or \code{beta}. #' } #' The `name` parameter serves as a prefix for each file, ensuring clarity and organization in the output directory. -#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file#write_model_result_csv} +#' A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions} #' #' @return No return value, called for side effects #' diff --git a/src/man/combo_plot_control.Rd b/src/man/combo_plot_control.Rd index fba2468..2568c1d 100644 --- a/src/man/combo_plot_control.Rd +++ b/src/man/combo_plot_control.Rd @@ -24,7 +24,7 @@ A plot with ETR data, regression results, and a summary table. Generates a plot of ETR data with different regression model predictions and a summary table. } \details{ -A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file#combo_control_plot}. +A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions}. } \examples{ path <- file.path(system.file("extdata/dual_pam_data", package = "pam"), "20240925.csv") diff --git a/src/man/compare_regression_models_ETR_I.Rd b/src/man/compare_regression_models_ETR_I.Rd index 579d0b6..6d64107 100644 --- a/src/man/compare_regression_models_ETR_I.Rd +++ b/src/man/compare_regression_models_ETR_I.Rd @@ -33,7 +33,7 @@ This function compares the performance of the following models: \item Walsby (1997) } Models are ranked based on the deviation between observed and predicted values. The results guide users in selecting the most appropriate model for their dataset. Start values for parameters cannot be adjusted within this function. -A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file#walsby_modified} +A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions} } \examples{ path <- file.path(system.file("extdata/dual_pam_data", package = "pam")) diff --git a/src/man/eilers_peeters_generate_regression_ETR_I.Rd b/src/man/eilers_peeters_generate_regression_ETR_I.Rd index 3981037..000e9c7 100644 --- a/src/man/eilers_peeters_generate_regression_ETR_I.Rd +++ b/src/man/eilers_peeters_generate_regression_ETR_I.Rd @@ -39,7 +39,7 @@ A list containing: Fits a regression model for ETR I based on Eilers-Peeters (1988), considering photoinhibition. } \details{ -A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file#eilers_peeters_generate_regression_etr_i-and-eilers_peeters_generate_regression_etr_ii}. +A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions}. } \examples{ path <- file.path(system.file("extdata/dual_pam_data", package = "pam"), "20240925.csv") diff --git a/src/man/eilers_peeters_generate_regression_ETR_II.Rd b/src/man/eilers_peeters_generate_regression_ETR_II.Rd index 7ebaca4..2ae78e4 100644 --- a/src/man/eilers_peeters_generate_regression_ETR_II.Rd +++ b/src/man/eilers_peeters_generate_regression_ETR_II.Rd @@ -39,7 +39,7 @@ A list containing: Fits a regression model for ETR II based on Eilers-Peeters (1988), considering photoinhibition. } \details{ -A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file#eilers_peeters_generate_regression_etr_i-and-eilers_peeters_generate_regression_etr_ii}. +A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions}. } \examples{ path <- file.path(system.file("extdata/dual_pam_data", package = "pam"), "20240925.csv") diff --git a/src/man/platt_generate_regression_ETR_I.Rd b/src/man/platt_generate_regression_ETR_I.Rd index 8087ac7..78eacd3 100644 --- a/src/man/platt_generate_regression_ETR_I.Rd +++ b/src/man/platt_generate_regression_ETR_I.Rd @@ -41,7 +41,7 @@ A list containing: Fits the Platt (1980) regression model using original naming conventions. } \details{ -A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file#platt_generate_regression_etr_i-and-platt_generate_regression_etr_ii} . +A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions} . } \examples{ path <- file.path(system.file("extdata/dual_pam_data", package = "pam"), "20240925.csv") diff --git a/src/man/platt_generate_regression_ETR_II.Rd b/src/man/platt_generate_regression_ETR_II.Rd index 32951e4..e3741be 100644 --- a/src/man/platt_generate_regression_ETR_II.Rd +++ b/src/man/platt_generate_regression_ETR_II.Rd @@ -41,7 +41,7 @@ A list containing: Fits the Platt (1980) regression model using original naming conventions. } \details{ -A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file#platt_generate_regression_etr_i-and-platt_generate_regression_etr_ii}. +A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions}. } \examples{ path <- file.path(system.file("extdata/dual_pam_data", package = "pam"), "20240925.csv") diff --git a/src/man/plot_control.Rd b/src/man/plot_control.Rd index 6441fbe..e9bfa20 100644 --- a/src/man/plot_control.Rd +++ b/src/man/plot_control.Rd @@ -22,7 +22,7 @@ A plot displaying the original ETR and Yield values and the regression data. A t This function creates a control plot for the used model based on the provided data and model results. } \details{ -A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file#plot_control} +A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions} } \examples{ path <- file.path(system.file("extdata/dual_pam_data", package = "pam"), "20240925.csv") diff --git a/src/man/read_dual_pam_data.Rd b/src/man/read_dual_pam_data.Rd index 70a36ef..03a8161 100644 --- a/src/man/read_dual_pam_data.Rd +++ b/src/man/read_dual_pam_data.Rd @@ -40,7 +40,7 @@ Reads raw CSV files generated by DualPAM software, calculates electron transport Calculates ETR using: \deqn{\text{ETR} = \text{PAR} \cdot \text{ETR-Factor} \cdot \text{Fraction of Photosystem (I or II)} \cdot \text{Yield (I or II)}} -A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file#read_dual_pam_data} +A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions} } \examples{ path <- file.path(system.file("extdata/dual_pam_data", package = "pam"), "20240925.csv") diff --git a/src/man/read_dual_pam_single_channel_fluo_data.Rd b/src/man/read_dual_pam_single_channel_fluo_data.Rd index d9f6fe0..60835ab 100644 --- a/src/man/read_dual_pam_single_channel_fluo_data.Rd +++ b/src/man/read_dual_pam_single_channel_fluo_data.Rd @@ -40,7 +40,7 @@ Reads raw CSV files generated by DualPAM software, calculates electron transport Calculates ETR using: \deqn{\text{ETR} = \text{PAR} \cdot \text{ETR-Factor} \cdot \text{Fraction of Photosystem (II)} \cdot \text{Yield (II)}} -A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file#read_dual_pam_data} +A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions} } \examples{ path <- file.path( diff --git a/src/man/read_dual_pam_single_channel_p700_data.Rd b/src/man/read_dual_pam_single_channel_p700_data.Rd index be58956..bdd11cb 100644 --- a/src/man/read_dual_pam_single_channel_p700_data.Rd +++ b/src/man/read_dual_pam_single_channel_p700_data.Rd @@ -40,7 +40,7 @@ Reads raw CSV files generated by DualPAM software, calculates electron transport Calculates ETR using: \deqn{\text{ETR} = \text{PAR} \cdot \text{ETR-Factor} \cdot \text{Fraction of Photosystem (I)} \cdot \text{Yield (I)}} -A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file#read_dual_pam_data} +A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions} } \examples{ path <- file.path( diff --git a/src/man/read_junior_pam_data.Rd b/src/man/read_junior_pam_data.Rd index c4d1e3d..1036f01 100644 --- a/src/man/read_junior_pam_data.Rd +++ b/src/man/read_junior_pam_data.Rd @@ -40,7 +40,7 @@ Reads raw CSV files generated by Junior PAM software, calculates electron transp Calculates ETR II using: \deqn{\text{ETR II} = \text{PAR} \cdot \text{ETR-Factor} \cdot \text{Fraction of Photosystem (II)} \cdot \text{Yield (II)}} -A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file} +A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions} } \examples{ path <- file.path( diff --git a/src/man/read_pam_2500_data.Rd b/src/man/read_pam_2500_data.Rd index ce8e5b6..2267a8e 100644 --- a/src/man/read_pam_2500_data.Rd +++ b/src/man/read_pam_2500_data.Rd @@ -40,7 +40,7 @@ Reads raw CSV files generated by PAM 2500 software, calculates electron transpor Calculates ETR II using: \deqn{\text{ETR II} = \text{PAR} \cdot \text{ETR-Factor} \cdot \text{Fraction of Photosystem (II)} \cdot \text{Yield (II)}} -A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file} +A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions} } \examples{ path <- file.path(system.file("extdata/pam_2500_data", package = "pam"), "20260422_pam_2500.CSV") diff --git a/src/man/read_universal_data.Rd b/src/man/read_universal_data.Rd index f877222..ffed5cf 100644 --- a/src/man/read_universal_data.Rd +++ b/src/man/read_universal_data.Rd @@ -39,7 +39,7 @@ Reads a standardized CSV file containing PAR and yield data for photosystem I an Calculates ETR using: \deqn{\text{ETR} = \text{PAR} \cdot \text{ETR-Factor} \cdot \text{Fraction of Photosystem (I or II)} \cdot \text{Yield (I or II)}} -A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file#read_universal_data} +A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions} } \examples{ path <- file.path(system.file("extdata", package = "pam"), "universal_data", "universal_data.csv") diff --git a/src/man/vollenweider_generate_regression_ETR_I.Rd b/src/man/vollenweider_generate_regression_ETR_I.Rd index 224e1d5..1ca172e 100644 --- a/src/man/vollenweider_generate_regression_ETR_I.Rd +++ b/src/man/vollenweider_generate_regression_ETR_I.Rd @@ -44,7 +44,7 @@ A list containing: Fits the Vollenweider (1965) regression model using original naming conventions from the publication. } \details{ -A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file#vollenweider_generate_regression_etr_i-and-vollenweider_generate_regression_etr_ii}. +A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions}. } \examples{ path <- file.path(system.file("extdata/dual_pam_data", package = "pam"), "20240925.csv") diff --git a/src/man/vollenweider_generate_regression_ETR_II.Rd b/src/man/vollenweider_generate_regression_ETR_II.Rd index c1c0bde..3bef3fb 100644 --- a/src/man/vollenweider_generate_regression_ETR_II.Rd +++ b/src/man/vollenweider_generate_regression_ETR_II.Rd @@ -44,7 +44,7 @@ A list containing: Fits the Vollenweider (1965) regression model using original naming conventions from the publication. } \details{ -A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file#vollenweider_generate_regression_etr_i-and-vollenweider_generate_regression_etr_ii}. +A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions}. } \examples{ path <- file.path(system.file("extdata/dual_pam_data", package = "pam"), "20240925.csv") diff --git a/src/man/walsby_generate_regression_ETR_I.Rd b/src/man/walsby_generate_regression_ETR_I.Rd index 560e7af..f3ac9d1 100644 --- a/src/man/walsby_generate_regression_ETR_I.Rd +++ b/src/man/walsby_generate_regression_ETR_I.Rd @@ -37,7 +37,7 @@ Fits a modified Walsby (1997) regression model without the respiration term, usi Calculates \eqn{ETR_{max}} without accounting for photoinhibition. } \details{ -A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file#walsby_generate_regression_etr_i-and-walsby_generate_regression_etr_ii}. +A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions}. } \examples{ path <- file.path(system.file("extdata/dual_pam_data", package = "pam"), "20240925.csv") diff --git a/src/man/walsby_generate_regression_ETR_II.Rd b/src/man/walsby_generate_regression_ETR_II.Rd index 4549376..80e4afe 100644 --- a/src/man/walsby_generate_regression_ETR_II.Rd +++ b/src/man/walsby_generate_regression_ETR_II.Rd @@ -37,7 +37,7 @@ Fits a modified Walsby (1997) regression model without the respiration term, usi Calculates \eqn{ETR_{max}} without accounting for photoinhibition. } \details{ -A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file#walsby_generate_regression_etr_i-and-walsby_generate_regression_etr_ii}. +A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions}. } \examples{ path <- file.path(system.file("extdata/dual_pam_data", package = "pam"), "20240925.csv") diff --git a/src/man/write_model_result_csv.Rd b/src/man/write_model_result_csv.Rd index bc6a2d2..832580a 100644 --- a/src/man/write_model_result_csv.Rd +++ b/src/man/write_model_result_csv.Rd @@ -29,7 +29,7 @@ This function generates three CSV files: \item \strong{model_result.csv:} Summarizes the parameter values derived from the model results (excluding regression data), such as \code{alpha} or \code{beta}. } The `name` parameter serves as a prefix for each file, ensuring clarity and organization in the output directory. -A detailed documentation can be found under \url{https://github.com/biotoolbox/pam?tab=readme-ov-file#write_model_result_csv} +A detailed documentation can be found under \url{https://github.com/biotoolbox/pam/tree/docs#functions} } \examples{ path <- file.path(system.file("extdata/dual_pam_data", package = "pam"), "20240925.csv")