R/checkcontrols.R

utils::globalVariables(c("type", "conc"))
checkcontrols <- function(last = 10, id = NULL, db = c("cytotox", "enzymes", "ecotox"),
                          celltype = "IPC-81", enzymetype = "AChE",
                          organism = "Vibrio fischeri",
                          endpoint = "%", qcc = c("R", "xbar"))
{
  db <- match.arg(db)

  con <- dbConnect(odbc(), "cytotox", database = db)

  if (db %in% c("cytotox","enzymes")) {
    if (is.null(id[1])) {
      platequery <- "SELECT plate FROM"
      if (db == "cytotox") {
        platequery <- paste0(platequery, " cytotox WHERE celltype like '",
                             celltype, "'")
      }
      if (db == "enzymes") {
        platequery <- paste0(platequery, " enzymes WHERE enzyme like '",
                             enzymetype, "'")
        }
        platequery <- paste(platequery, 
          "GROUP BY plate ORDER BY plate DESC LIMIT", last)
        plates <- dbGetQuery(con, platequery)$plate
    } else {
      plates <- id
    }
    controlquery <- paste("SELECT plate, type, location, response FROM controls",
      "WHERE plate IN (", paste(plates, collapse = ", "), ")")
    controldata <- dbGetQuery(con,controlquery)
  } else {
    if (is.null(id[1])) {
      lastquery = paste0("SELECT experiment, type FROM ecotox ",
        "WHERE organism LIKE '", organism, "'",
        "AND type LIKE '", endpoint, "' ",
        "GROUP BY experiment ORDER BY experiment DESC LIMIT ", last)
      res <- dbGetQuery(con, lastquery)
      if (nrow(res) == 0) {
        stop("No results for endpoint", endpoint)
      } else {
        if (nlevels(res$type) > 1) {
          stop("Found more than one endpoint type:\n",
               paste(levels(res$type), collapse = ", "), "\n",
               "Please specify an endpoint in your call to checkcontrols()")
        }
        experiments <- res$experiment
      }
    } else {
      experiments <- id
    }
    expquery <- paste0("SELECT ",
      "experimentator, experiment, substance, organism, type, conc, unit, raw_response, ",
      "performed, ok ",
      "FROM ecotox ",
      "WHERE experiment IN (", paste(experiments, collapse = ", "), ") ",
      "AND organism LIKE '", organism, "' ",
      "AND type LIKE '", endpoint, "'")
    expdata <- dbGetQuery(con, expquery)
    if (nlevels(expdata$type) > 1) {
      stop("Found more than one endpoint type:\n",
        paste(levels(expdata$type), collapse = ", "), "\n",
        "Please specify an endpoint in your call to checkcontrols()")
    }
    # Use the raw response for QA
    expdata$response <- expdata$raw_response
  }

  if (db %in% c("cytotox","enzymes")) {
      blinds <- subset(controldata, type == "blind")
      controls <- subset(controldata, type == "control")
      QA <- matrix(nrow = 2, ncol = 4,
          dimnames = list(c("Blind", "Control (conc = 0)"),
                          c("Number", "Mean", "Std. Dev.", "% Std. Dev")))

      QA[1, 1] <- length(blinds$response)
      QA[1, 2] <- signif(mean(blinds$response), 2)
      QA[1, 3] <- signif(sd(blinds$response), 2)
      QA[1, 4] <-signif(QA[1, 3] * 100 / QA[1, 2],2)
  } else {
      controls <- subset(expdata, conc == 0)
      QA <- matrix(nrow = 1, ncol = 4,
          dimnames = list(c("Control (conc = 0)"),
                          c("Number", "Mean", "Std. Dev.", "% Std. Dev")))
  }

  numberOfControls <- length(controls$response)
  QA["Control (conc = 0)", 1] <- numberOfControls
  if (numberOfControls > 0) {
      QA["Control (conc = 0)", 2] <- signif(mean(controls$response),2)
      QA["Control (conc = 0)", 3] <- signif(sd(controls$response),2)
      QA["Control (conc = 0)", 4] <- signif(QA["Control (conc = 0)", 3] * 100 /
                                            QA["Control (conc = 0)", 2],2)
  }

  # The report
  cat("\nDatabase", db, "\n")

  if (db == "ecotox") {
      cat("Organism", organism, "\n")
      cat("Endpoint", unique(expdata$type), "\n")
      cat("\nExperiments ", paste(experiments, collapse = ", "), "\n\n")
  } else {
      if (db == "cytotox") cat ("Cell type", celltype, "\n")
      if (db == "enzymes") cat ("Enzyme type", enzymetype, "\n")
      cat("\nPlates", paste(plates, collapse = ", "), "\n\n")
  }
  print(QA)

  if (!is.na(qcc[1])) {
      op <- par(ask=TRUE)
      on.exit(par(op))
      requireNamespace("reshape2")
      if (db == "ecotox") {
          controls$row <- rownames(controls)
          controls_molten <- melt(controls[c("experiment", "row", "response")],
                                  id = c("experiment", "row"))
          controls_wide <- acast(controls_molten, formula = experiment ~ row)

      } else {
          controls_molten <- melt(controls[c("plate", "location", "response")],
                                  id = c("plate", "location"))
          controls_wide <- acast(controls_molten, formula = plate ~ location)
      }
      if ("R" %in% qcc) {
          qcc(controls_wide, type = "R", nsigmas = 3,
              title = "Range chart",
              data.name = "Controls (conc = 0)")
      }
      if ("xbar" %in% qcc) {
          qcc(controls_wide, type = "xbar", nsigmas = 3,
              title = "Mean chart",
              data.name = "Controls (conc = 0)")
      }
  }

  invisible(controls)
}
# vim: ts=2 sw=2 expandtab:

Try the drfit package in your browser

Any scripts or data that you put into this service are public.

drfit documentation built on May 2, 2019, 2:31 p.m.