diff --git a/R/GCAT/DESCRIPTION b/R/GCAT/DESCRIPTION index 6dde5fc..98a85d9 100755 --- a/R/GCAT/DESCRIPTION +++ b/R/GCAT/DESCRIPTION @@ -8,7 +8,7 @@ Description: Imports high-throughput growth curve data from microtiter GCAT estimates important growth characteristics (specific growth rate, maximum growth capacity, and lag time) for each well in a read. -Version: 6.0.1 +Version: 6.0.2 Depends: pheatmap, gplots, methods Maintainer: Yury Bukhman License: LGPL-3 diff --git a/R/GCAT/R/GCAT.main.R b/R/GCAT/R/GCAT.main.R index ed460ab..7096a2e 100644 --- a/R/GCAT/R/GCAT.main.R +++ b/R/GCAT/R/GCAT.main.R @@ -107,7 +107,8 @@ global.version.number = packageDescription(pkg="GCAT")$Version #' @param overview.jpgs Should GCAT enable an overview image? #' @param return.fit Whether should a fit well object is returned or not. #' @param lagRange The heatmap specific range for lag time. -#' @param totalRange The heatmap specific range for the achieved growth. +#' @param totalRange The heatmap specific range for the achieved growth on log scale. +#' @param totalODRange The heatmap specific range for the achieved growth on linear (OD) scale. #' @param specRange The heatmap specific range for spec growth rate. #' #' @return Depending on return.fit setting, an array of fitted well objects or a list of output files @@ -117,7 +118,7 @@ gcat.analysis.main = function(file.list, single.plate, layout.file = NULL, out.dir = getwd(), graphic.dir = paste(out.dir, "/pics", sep = ""), add.constant = 0, blank.value, start.index, growth.cutoff = 0.05, use.linear.param = F, use.loess = F, smooth.param=0.1, - lagRange = NA, totalRange = NA, specRange = NA, + lagRange = NA, totalRange = NA, totalODRange = NA, specRange = NA, points.to.remove = 0, remove.jumps = F, time.input = NA, plate.nrow = 8, plate.ncol = 12, input.skip.lines = 0, multi.column.headers = c("Plate.ID", "Well", "OD", "Time"), single.column.headers = c("","A1"), @@ -184,7 +185,7 @@ gcat.analysis.main = function(file.list, single.plate, layout.file = NULL, source.file.list = source.file.list, upload.timestamp = upload.timestamp, growth.cutoff = growth.cutoff, add.constant = add.constant, blank.value = blank.value, start.index = start.index, points.to.remove = points.to.remove, remove.jumps = remove.jumps, - lagRange = lagRange, specRange = specRange, totalRange = totalRange, + lagRange = lagRange, specRange = specRange, totalRange = totalRange, totalODRange = totalODRange, out.dir = out.dir, graphic.dir = graphic.dir, overview.jpgs=overview.jpgs, use.linear.param=use.linear.param, use.loess=use.loess, plate.ncol = plate.ncol, plate.nrow = plate.nrow, silent = silent, main.envir = main.envir), silent = T) @@ -480,6 +481,7 @@ gcat.fit.main = function(file.name, input.data = NULL, load.type = "csv", layout #' @param plate.ncol The number of columns for a plate #' @param lagRange The heatmap specific range for lag time. #' @param totalRange The heatmap specific range for the achieved growth. +#' @param totalODRange The heatmap specific range for the achieved growth on linear (OD) scale. #' @param specRange The heatmap specific range for spec growth rate. #' @param main.envir starting environment of gcat.analysis.main(), captured as a list, printed out for debugging #' @@ -487,7 +489,7 @@ gcat.fit.main = function(file.name, input.data = NULL, load.type = "csv", layout gcat.output.main = function(fitted.well.array, out.prefix = "", source.file.list, upload.timestamp = NULL, add.constant, blank.value, start.index, growth.cutoff, points.to.remove, remove.jumps, out.dir = getwd(), graphic.dir = paste(out.dir,"/pics",sep = ""), overview.jpgs = T, - use.linear.param=F, use.loess=F, lagRange = NA, totalRange = NA, specRange = NA, + use.linear.param=F, use.loess=F, lagRange = NA, totalRange = NA, totalODRange = NA, specRange = NA, plate.nrow = 8, plate.ncol = 12, unlog = F, silent = T, main.envir){ # Prepare timestamp for addition to output file names. @@ -558,7 +560,7 @@ gcat.output.main = function(fitted.well.array, out.prefix = "", source.file.list graphic.files = try(pdf.by.plate(fitted.well.array, out.prefix=out.prefix, upload.timestamp = upload.timestamp, unlog=unlog,constant.added=add.constant,overview.jpgs=overview.jpgs, lagRange = lagRange, specRange = specRange, totalRange = totalRange, - plate.ncol = plate.ncol, plate.nrow = plate.nrow),silent=silent) + totalODRange = totalODRange, plate.ncol = plate.ncol, plate.nrow = plate.nrow),silent=silent) if (class(graphic.files) == "try-error") stop("Error in : ", graphic.files) diff --git a/R/GCAT/R/plot.fit.R b/R/GCAT/R/plot.fit.R index e695fd2..e962f32 100644 --- a/R/GCAT/R/plot.fit.R +++ b/R/GCAT/R/plot.fit.R @@ -298,12 +298,13 @@ plot_residuals = function(input.well, xlim = NULL, lowess = T, ...){ #' #' @param fitted.well.array matrix containing well array object data #' @param attribute the data type we should use to create a heatmap -#' @param unlog transform values to linear scale #' @param MinMax The specific range for the heatmap. +#' @param constant.added the numeric constant that was added to each curve before the log transform: +#' same as \code{add.constant} in \link{gcat.analysis.main} #' #' @return path of heatmap pdf file #' -create.heatmap = function(fitted.well.array, attribute, MinMax = NA, unlog=NULL){ +create.heatmap = function(fitted.well.array, attribute, MinMax = NA, constant.added){ # debug #browser() @@ -312,13 +313,14 @@ create.heatmap = function(fitted.well.array, attribute, MinMax = NA, unlog=NULL) if(class(fitted.well.array) == "matrix"){ #We may want to sub() out periods from plate.ID if it causes problems plate.ID = unique(unlist(aapply(fitted.well.array,plate.name)))[1] - if(is.null(unlog)) { - spec.growth = unlist(aapply(fitted.well.array, attribute)) - } - # currently only total growth needs to be unlogged if unlog == T - else { + if (attr.name == "achieved.growth.OD") { + # Need to pass constant.added to the attribute computation function + spec.growth = unlist(aapply(fitted.well.array, attribute, constant.added = constant.added)) + } else { + # The attribute computation function does not have a constant.added argument spec.growth = unlist(aapply(fitted.well.array, attribute)) } + num.dig = 3 #how many digits should be put on pdf? max = round(max(spec.growth, na.rm=T), digits=num.dig) min = round(min(spec.growth, na.rm=T), digits=num.dig) @@ -614,7 +616,7 @@ well.fit.legend = function(xlim, ylim, scale = 1, constant.added){ # Generate pdf files pdf.by.plate = function(fitted.data, out.prefix = "", upload.timestamp = NULL, out.dir = getwd(), unlog = F, constant.added, silent = T, overview.jpgs = T, plate.ncol = 12, plate.nrow = 8, - lagRange = NA, specRange = NA, totalRange = NA, ...){ + lagRange = NA, specRange = NA, totalRange = NA, totalODRange = NA, ...){ # Prepare timestamp for addition to output file names. filename.timestamp = strftime(upload.timestamp, format="_%Y-%m-%d_%H.%M.%S") @@ -645,17 +647,20 @@ pdf.by.plate = function(fitted.data, out.prefix = "", upload.timestamp = NULL, if(num.wells > 1){ #Heatmap block########################################################## #alongside the jpgs file create 3 heatmaps for each plate. NWD - spec.heat.file = create.heatmap(fitted.data[,,i], max.spec.growth.rate, MinMax = specRange) + spec.heat.file = create.heatmap(fitted.data[,,i], max.spec.growth.rate, MinMax = specRange, constant.added) if(spec.heat.file == "Error") stop("Error in for specific growth") - lag.heat.file = create.heatmap(fitted.data[,,i], lag.time, MinMax = lagRange) + lag.heat.file = create.heatmap(fitted.data[,,i], lag.time, MinMax = lagRange, constant.added) if(lag.heat.file == "Error") stop("Error in for lag time") - total.heat.file = create.heatmap(fitted.data[,,i], achieved.growth, MinMax = totalRange) + total.heat.file = create.heatmap(fitted.data[,,i], achieved.growth, MinMax = totalRange, constant.added) if(total.heat.file == "Error") stop("Error in for total growth") + total.OD.heat.file = create.heatmap(fitted.data[,,i], achieved.growth.OD, MinMax = totalODRange, constant.added) + if(total.OD.heat.file == "Error") + stop("Error in for total growth") # Add name of file if successfully written to file list output. Including heatmap files NWD - file.list.out = c(file.list.out, spec.heat.file, lag.heat.file, total.heat.file) + file.list.out = c(file.list.out, spec.heat.file, lag.heat.file, total.heat.file, total.OD.heat.file) ######################################################################## } jpg.name = paste(out.dir, "/", plate.ID, "_overview", ".jpg", sep="") diff --git a/R/GCAT/inst/extdata/heatmap_tests/test_heatmap_limits.R b/R/GCAT/inst/extdata/heatmap_tests/test_heatmap_limits.R index 3654b2d..1f5dd68 100644 --- a/R/GCAT/inst/extdata/heatmap_tests/test_heatmap_limits.R +++ b/R/GCAT/inst/extdata/heatmap_tests/test_heatmap_limits.R @@ -3,18 +3,30 @@ # This script generates heat maps with pre-set limits. Manually check output directory to see if they make sense. INPUT.DIR = system.file("extdata/YPDAFEXglucoseTests_2-25-10",package="GCAT") -OUTPUT.DIR = paste(system.file("extdata/heatmap_tests",package="GCAT"),"temp",sep="/") +OUTPUT.DIR.1 = paste(system.file("extdata/heatmap_tests",package="GCAT"),"temp1",sep="/") +OUTPUT.DIR.2 = paste(system.file("extdata/heatmap_tests",package="GCAT"),"temp2",sep="/") INPUT.FILE = "YPDAFEXglucoseTests_2-25-10.csv" # Run GCAT library(GCAT) setwd(INPUT.DIR) time.input=1/3600 -out = gcat.analysis.main(file.list = INPUT.FILE, single.plate = T, layout.file = NULL, - out.dir = OUTPUT.DIR, graphic.dir = OUTPUT.DIR, +# - do not specify parameter ranges +out1 = gcat.analysis.main(file.list = INPUT.FILE, single.plate = T, layout.file = NULL, + out.dir = OUTPUT.DIR.1, graphic.dir = OUTPUT.DIR.1, + add.constant = 1, blank.value = NULL, start.index = 2, growth.cutoff = 0.05, + use.linear.param=F, use.loess=F, smooth.param=0.1, + points.to.remove = integer(), remove.jumps = F, time.input=time.input, + silent = F, verbose = T, return.fit = T, overview.jpgs = T) + +# - do specify parameter ranges +out2 = gcat.analysis.main(file.list = INPUT.FILE, single.plate = T, layout.file = NULL, + out.dir = OUTPUT.DIR.2, graphic.dir = OUTPUT.DIR.2, add.constant = 1, blank.value = NULL, start.index = 2, growth.cutoff = 0.05, use.linear.param=F, use.loess=F, smooth.param=0.1, points.to.remove = integer(), remove.jumps = F, time.input=time.input, silent = F, verbose = T, return.fit = T, overview.jpgs = T, - lagRange = c(0,3), totalRange = c(0.2,0.82), specRange = c(0.04,0.13)) + lagRange = c(0,3), totalRange = c(0.2,0.82), totalODRange = c(0.06,1), specRange = c(0.04,0.13)) +# Verify that specifying parameter ranges did not affect any computations except for how the heat maps are drawn +all.equal(out1,out2) \ No newline at end of file diff --git a/R/GCAT/man/create.heatmap.Rd b/R/GCAT/man/create.heatmap.Rd index b57e4ac..97785ec 100644 --- a/R/GCAT/man/create.heatmap.Rd +++ b/R/GCAT/man/create.heatmap.Rd @@ -4,7 +4,7 @@ \alias{create.heatmap} \title{Create a heat map of a plate} \usage{ -create.heatmap(fitted.well.array, attribute, MinMax = NA, unlog = NULL) +create.heatmap(fitted.well.array, attribute, MinMax = NA, constant.added) } \arguments{ \item{fitted.well.array}{matrix containing well array object data} @@ -13,7 +13,8 @@ create.heatmap(fitted.well.array, attribute, MinMax = NA, unlog = NULL) \item{MinMax}{The specific range for the heatmap.} -\item{unlog}{transform values to linear scale} +\item{constant.added}{the numeric constant that was added to each curve before the log transform: +same as \code{add.constant} in \link{gcat.analysis.main}} } \value{ path of heatmap pdf file diff --git a/R/GCAT/man/gcat.analysis.main.Rd b/R/GCAT/man/gcat.analysis.main.Rd index 8f18040..80699c5 100644 --- a/R/GCAT/man/gcat.analysis.main.Rd +++ b/R/GCAT/man/gcat.analysis.main.Rd @@ -8,12 +8,13 @@ gcat.analysis.main(file.list, single.plate, layout.file = NULL, out.dir = getwd(), graphic.dir = paste(out.dir, "/pics", sep = ""), add.constant = 0, blank.value, start.index, growth.cutoff = 0.05, use.linear.param = F, use.loess = F, smooth.param = 0.1, - lagRange = NA, totalRange = NA, specRange = NA, points.to.remove = 0, - remove.jumps = F, time.input = NA, plate.nrow = 8, plate.ncol = 12, - input.skip.lines = 0, multi.column.headers = c("Plate.ID", "Well", "OD", - "Time"), single.column.headers = c("", "A1"), - layout.sheet.headers = c("Strain", "Media Definition"), silent = T, - verbose = F, return.fit = F, overview.jpgs = T) + lagRange = NA, totalRange = NA, totalODRange = NA, specRange = NA, + points.to.remove = 0, remove.jumps = F, time.input = NA, + plate.nrow = 8, plate.ncol = 12, input.skip.lines = 0, + multi.column.headers = c("Plate.ID", "Well", "OD", "Time"), + single.column.headers = c("", "A1"), layout.sheet.headers = c("Strain", + "Media Definition"), silent = T, verbose = F, return.fit = F, + overview.jpgs = T) } \arguments{ \item{file.list}{A list of full paths to .csv files. all files must be in the same format (see )} @@ -42,7 +43,9 @@ gcat.analysis.main(file.list, single.plate, layout.file = NULL, \item{lagRange}{The heatmap specific range for lag time.} -\item{totalRange}{The heatmap specific range for the achieved growth.} +\item{totalRange}{The heatmap specific range for the achieved growth on log scale.} + +\item{totalODRange}{The heatmap specific range for the achieved growth on linear (OD) scale.} \item{specRange}{The heatmap specific range for spec growth rate.} diff --git a/R/GCAT/man/gcat.output.main.Rd b/R/GCAT/man/gcat.output.main.Rd index 29554cf..96863d3 100644 --- a/R/GCAT/man/gcat.output.main.Rd +++ b/R/GCAT/man/gcat.output.main.Rd @@ -9,8 +9,8 @@ gcat.output.main(fitted.well.array, out.prefix = "", source.file.list, growth.cutoff, points.to.remove, remove.jumps, out.dir = getwd(), graphic.dir = paste(out.dir, "/pics", sep = ""), overview.jpgs = T, use.linear.param = F, use.loess = F, lagRange = NA, totalRange = NA, - specRange = NA, plate.nrow = 8, plate.ncol = 12, unlog = F, - silent = T, main.envir) + totalODRange = NA, specRange = NA, plate.nrow = 8, plate.ncol = 12, + unlog = F, silent = T, main.envir) } \arguments{ \item{fitted.well.array}{A list of fitted well objects.} @@ -50,6 +50,8 @@ This is for backwards compatibility with the old web server.} \item{totalRange}{The heatmap specific range for the achieved growth.} +\item{totalODRange}{The heatmap specific range for the achieved growth on linear (OD) scale.} + \item{specRange}{The heatmap specific range for spec growth rate.} \item{plate.nrow}{The number of rows for a plate.} diff --git a/Rails/app/models/assay.rb b/Rails/app/models/assay.rb index f2dc6f7..eb66899 100644 --- a/Rails/app/models/assay.rb +++ b/Rails/app/models/assay.rb @@ -34,7 +34,7 @@ class Assay extend ActiveModel::Naming attr_accessor :input_file, :blank_value, :blank_value_input, :start_index, :remove_points, :remove_jumps, :plate_type, :plate_dimensions_row, :plate_dimensions_column, :timestamp_format, :growth_threshold, :layout_file,:filename,:content_type, :model, :loess_input, :console_out, :specg_min, - :specg_max, :totg_min, :totg_max, :lagT_min, :lagT_max,:transformation, :transformation_input + :specg_max, :totg_min, :totg_max, :totg_OD_min, :totg_OD_max, :lagT_min, :lagT_max,:transformation, :transformation_input # (1) Validation of input data file @@ -169,6 +169,10 @@ class Assay self.totg_min = Float(self.totg_min) self.totg_max = Float(self.totg_max) end + if (self.totg_OD_min != '' && self.totg_OD_max != '') + self.totg_OD_min = Float(self.totg_OD_min) + self.totg_OD_max = Float(self.totg_OD_max) + end if (self.lagT_min != '' && self.lagT_max != '') self.lagT_max = Float(self.lagT_max) self.lagT_min = Float(self.lagT_min) @@ -351,6 +355,13 @@ class Assay else R.eval 'totalRange <- NA' end + if (self.totg_OD_min != '' && self.totg_OD_max != '') + R.assign 'totODMin', self.totg_OD_min + R.assign 'totODMax', self.totg_OD_max + R.eval "totalODRange <- c(totODMin, totODMax)" + else + R.eval 'totalODRange <- NA' + end if (self.lagT_min != '' && self.lagT_max != '') R.assign 'lagT_min', self.lagT_min R.assign 'lagT_max', self.lagT_max @@ -361,8 +372,9 @@ class Assay # This block evaluates the files (csv or xlsx, single.plate or multiple.plate) R.eval ('R_file_return_value <- gcat.analysis.main(file, single.plate, layout.file, out.dir=out.dir, graphic.dir = out.dir, add.constant, blank.value, - start.index, growth.cutoff, use.linear.param=use.linear.param, use.loess=use.loess, smooth.param=smooth.param, lagRange = lagRange, - totalRange = totalRange, specRange = specRange, points.to.remove = points.to.remove, remove.jumps, time.input, plate.nrow = 8, + start.index, growth.cutoff, use.linear.param=use.linear.param, use.loess=use.loess, smooth.param=smooth.param, + lagRange = lagRange, totalRange = totalRange, totalODRange = totalODRange, specRange = specRange, + points.to.remove = points.to.remove, remove.jumps, time.input, plate.nrow = 8, plate.ncol = 12, input.skip.lines = 0, multi.column.headers = c("Plate.ID", "Well", "OD", "Time"), single.column.headers = c("","A1"), layout.sheet.headers = c("Strain", "Media Definition"), silent = T, verbose = F, return.fit = F, overview.jpgs = T)') diff --git a/Rails/app/views/assays/_form.html.erb b/Rails/app/views/assays/_form.html.erb index cd50b1e..480467a 100644 --- a/Rails/app/views/assays/_form.html.erb +++ b/Rails/app/views/assays/_form.html.erb @@ -128,15 +128,21 @@
  • -

    Heatmap options

    +

    Heatmap options

    - <%= f.label "Enter the range for the total growth." %>
    + <%= f.label "Enter the range for the achieved growth on log scale." %>
    <%= f.text_field(:totg_min, :type => 'number', :min => '0', :size => '2') %> <%= f.label "-" %> <%= f.text_field(:totg_max, :type => 'number', :min => '1', :size => '2') %>
    - <%= f.label "Enter the range for the specific growth." %>
    + <%= f.label "Enter the range for the achieved growth on linear scale." %>
    + <%= f.text_field(:totg_OD_min, :type => 'number', :min => '0', :size => '2') %> + <%= f.label "-" %> + <%= f.text_field(:totg_OD_max, :type => 'number', :min => '1', :size => '2') %> +
    +
    + <%= f.label "Enter the range for the max specific growth rate." %>
    <%= f.text_field(:specg_min, :type => 'number', :min => '0', :size => '2') %> <%= f.label "-" %> <%= f.text_field(:specg_max, :type => 'number', :min => '1', :size => '2') %>