# Copyright (C) 2015 Johannes Ranke # Contact: jranke@uni-bremen.de # This file is part of the R package pfm # This program is free software: you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free Software # Foundation, either version 3 of the License, or (at your option) any later # version. # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more # details. # You should have received a copy of the GNU General Public License along with # this program. If not, see #' R6 class for holding a chemical entity #' #' An R6 class for holding information about a chemical entity #' #' @docType class #' @importFrom R6 R6Class #' @export #' @format An \code{\link{R6Class}} generator object. #' @field acronym Acronym for local use #' @field smiles SMILES code #' @field mw Molecular weight #' @field main_source Main source of information #' @field transformations #' @field sorption_endpoints #' @examples #' atrazine <- pfm_chent("atrazine", smiles = "Clc1nc(nc(n1)NC(C)C)NCC", mw = 215.68) #' print(atrazine) #' @keywords data pfm_chent <- R6Class("pfm_chent", public <- list( acronym = NULL, smiles = NULL, mw = NULL, main_source = NULL, initialize = function(acronym, smiles = NULL, mw = NULL, main_source = NULL) { self$acronym <- acronym self$smiles <- smiles self$mw <- mw self$main_source <- main_source }, p0 = data.frame(p0 = numeric(0), T = numeric(0), comment = character(0), source = character(0), pages = character(0), stringsAsFactors = FALSE), add_p0 = function(p0, T = 25, comment = "", source, pages = NA) { i <- nrow(self$p0) + 1 self$p0[i, c("p0", "T")] <- c(p0, T) self$p0[i, c("comment", "pages")] <- c(comment, pages) if (!missing(source)) self$p0[i, "source"] <- source }, cwsat = data.frame(cwsat = numeric(0), T = numeric(0), pH = numeric(0), comment = character(0), source = character(0), pages = character(0), stringsAsFactors = FALSE), add_cwsat = function(cwsat, T = NA, pH = NA, comment = "", source, pages = NA) { i <- nrow(self$cwsat) + 1 self$cwsat[i, c("cwsat", "T", "pH")] <- c(cwsat, T, pH) self$cwsat[i, c("comment", "pages")] <- c(comment, pages) if (!missing(source)) self$cwsat[i, "source"] <- source }, TPs = list(), add_TP = function(x, smiles = NULL, mw = NULL, main_source = NULL) { if (inherits(x, "pfm_chent")) { chent_name <- deparse(substitute(x)) chent <- x } else { chent_name <- make.names(x) chent <- pfm_chent$new(x, smiles, mw, main_source) } self$TPs[[chent_name]] <- chent }, transformations = data.frame(study_type = character(0), acronym = character(0), max_occurrence = numeric(0), source = character(0), pages = character(0), stringsAsFactors = FALSE), add_transformations = function(study_type, TPs, max_occurrence, comment = "", source, pages = NA) { TP_names = make.names(TPs) TP_is_chent = sapply(self$TPs[TP_names], function(x) inherits(x, "pfm_chent")) if (!all(TP_is_chent)) { stop(paste("Please add all TPs using pfm_chent$add_TP()", print(TP_is_chent))) } chents <- self$TPs[TP_names] if (missing(source)) source <- self$main_source if (is.numeric(pages)) pages <- paste(pages, collapse = ", ") transformations <- data.frame(study_type = study_type, acronym = sapply(chents, function(x) x$acronym), max_occurrence = max_occurrence, comment = comment, source = source, pages = pages, row.names = NULL, stringsAsFactors = FALSE) self$transformations <- rbind(self$transformations, transformations) }, soil_degradation_endpoints = data.frame(destination = character(0), DT50 = numeric(0), comment = character(0), pages = character(0), stringsAsFactors = FALSE), add_soil_degradation_endpoints = function(destination, DT50 = NA, comment = "", pages = NA) { i <- nrow(self$soil_degradation_endpoints) + 1 self$soil_degradation_endpoints[i, c("destination", "comment", "pages")] <- c(destination, comment, pages) self$soil_degradation_endpoints[i, "DT50"] <- DT50 }, ws_degradation_endpoints = data.frame(destination = character(0), DT50 = numeric(0), comment = character(0), tier = character(0), pages = character(0), stringsAsFactors = FALSE), add_ws_degradation_endpoints = function(destination, DT50 = NA, tier = NA, comment = "", pages = NA) { i <- nrow(self$ws_degradation_endpoints) + 1 self$ws_degradation_endpoints[i, c("destination", "tier", "comment", "pages")] <- c(destination, tier, comment, pages) self$ws_degradation_endpoints[i, "DT50"] <- DT50 }, water_degradation_endpoints = data.frame(destination = character(0), DT50 = numeric(0), tier = character(0), comment = character(0), pages = character(0), stringsAsFactors = FALSE), add_water_degradation_endpoints = function(destination, DT50 = NA, tier = NA, comment = "", pages = NA) { i <- nrow(self$water_degradation_endpoints) + 1 self$water_degradation_endpoints[i, c("destination", "tier", "comment", "pages")] <- c(destination, tier, comment, pages) self$water_degradation_endpoints[i, "DT50"] <- DT50 }, sediment_degradation_endpoints = data.frame(destination = character(0), DT50 = numeric(0), tier = character(0), comment = character(0), pages = character(0), stringsAsFactors = FALSE), add_sediment_degradation_endpoints = function(destination, DT50 = NA, tier = NA, comment = "", pages = NA) { i <- nrow(self$sediment_degradation_endpoints) + 1 self$sediment_degradation_endpoints[i, c("destination", "tier", "comment", "pages")] <- c(destination, tier, comment, pages) self$sediment_degradation_endpoints[i, "DT50"] <- DT50 }, sorption_endpoints = data.frame(Kfoc = numeric(0), f1.n = numeric(0), type = character(0), comment = character(0), pages = character(0), stringsAsFactors = FALSE), add_sorption_endpoints = function(Kfoc, f1.n = 1, type = "arithmetic mean", comment = "", pages = NA) { i <- nrow(self$sorption_endpoints) + 1 self$sorption_endpoints[i, c("Kfoc", "f1.n")] <- c(Kfoc, f1.n) self$sorption_endpoints[i, c("type", "comment", "pages")] <- c(type, comment, pages) }, print = function(TPs = TRUE) { cat(" with acronym", self$acronym, "\n") if (!is.null(self$smiles)) cat ("SMILES:", self$smiles, "\n") if (!is.null(self$mw)) cat ("Molecular weight:", round(self$mw, 1), "\n") if (!is.null(self$main_source)) cat ("Main source of information:", self$main_source, "\n") if (TPs) { if (length(self$TPs) > 0) { cat("\nTransformation products:\n") print(self$TPs) } if (nrow(self$transformations) > 0) { cat("\nTransformations:\n") print(self$transformations[order(self$transformations$study_type), ], row.names = FALSE) } } } ) ) #' R6 class for holding active ingredients #' #' An R6 class for holding information about active ingredients #' #' @docType class #' @importFrom R6 R6Class #' @importFrom pfm pfm_chent #' @export #' @format An \code{\link{R6Class}} generator object. #' @field iso ISO common name #' @examples #' atrazine <- pfm_ai("atrazine", smiles = "Clc1nc(nc(n1)NC(C)C)NCC", mw = 215.68) #' print(atrazine) #' @keywords data pfm_ai <- R6Class("pfm_ai", inherit = pfm_chent, public <- list( iso = NULL, initialize = function(iso, acronym = iso, smiles = NULL, mw = NULL, main_source = NULL) { super$initialize(acronym = acronym, smiles = smiles, mw = mw, main_source = main_source) self$iso <- iso }, ff = data.frame(from = character(0), to = character(0), ff = numeric(0), comment = character(0), pages = character(0), stringsAsFactors = FALSE), add_ff = function(from = "parent", to, ff = 1, comment = "", pages = NA) { i <- nrow(self$ff) + 1 if (from != "parent") { if (!exists(from, self$TPs)) stop(from, " was not found in TPs") } if (!exists(to, self$TPs)) stop(to, " was not found in TPs") self$ff[i, ] <- c(from, to, ff, comment, pages) }, print = function() { if (is.null(self$iso)) cat(" with acronym", self$acronym, "\n") else cat(" with ISO common name", self$iso, "\n") super$print() } ) ) #' R6 class for holding a product with at least one active ingredient #' #' An R6 class for holding information about a product with at least one active ingredient #' #' @docType class #' @importFrom R6 R6Class #' @export #' @format An \code{\link{R6Class}} generator object. #' @field name The name of the product #' @field ais A list of active ingredients #' @field concentrations The concentration of the ais #' @field concentration_units Defaults to g/L #' @keywords data pfm_product <- R6Class("pfm_product", public <- list( name = NULL, ais = list(), concentrations = NULL, concentration_units = NULL, density = NULL, density_units = "g/L", initialize = function(name, ..., concentrations, concentration_units = "g/L", density = 1000, density_units = "g/L") { self$name <- name self$ais <- list(...) self$concentrations <- concentrations self$density <- density self$density_units <- density_units names(self$concentrations) <- names(self$ais) self$concentration_units <- concentration_units }, print = function() { cat(" named", self$name, "\n") } ) )