R/plotEICDetectedPeakwidth.R

Defines functions plotEICDetectedPeakwidth

Documented in plotEICDetectedPeakwidth

#' Plot samples raw data and detected feature for a single ROI
#'
#' plot a ROI across multiple samples (x axis is RT, y axis is intensity) with the matching detected peak rt and peakwidth under it. If curveFit is provided, the fitted curve for each compound is added. RT and peakwidth are plotted in the order spectra are passed, with the first spectra on top.
#'
#' @param ROIDataPointSampleList (list) list of \code{data.frame} of raw data points for each sample (retention time "rt", mass "mz" and intensity "int" (as column) of each raw data points (as row)).
#' @param cpdID (str) Compound ID
#' @param cpdName (str) Compound Name
#' @param rt (float) vector of detected peak apex retention time (in sec)
#' @param rtMin (float) vector of detected peak minimum retention time (in sec)
#' @param rtMax (float) vector ofdetected peak maximum retention time (in sec)
#' @param mzMin (float) ROI minimum m/z (matching EIC)
#' @param mzMax (float) ROI maximum m/z (matching EIC)
#' @param ratio (float) value between 0 and 1 defining the vertical percentage taken by the EICs subplot
#' @param sampling (int) Number of points to employ when plotting fittedCurve
#' @param curveFitSampleList (list) NULL or a list of \code{peakPantheR_curveFit} (or NA) for each sample
#' @param sampleColour (str) NULL or vector colour for each sample (same length as \code{EICs}, \code{rt}, \code{rtMin}, \code{rtMax})
#' @param verbose (bool) if TRUE message when NA scans are removed
#' 
#' @return Grob (ggplot object)
plotEICDetectedPeakwidth  <- function(ROIDataPointSampleList, cpdID, cpdName, rt, rtMin, rtMax, mzMin, mzMax, ratio=0.85, sampling=250, curveFitSampleList=NULL, sampleColour=NULL, verbose=TRUE) {
  
  ## Check input
  # check length of input across subplots, (others are checked inside plotEICFit and plotPeakwidth)
  nbSpl   <- length(ROIDataPointSampleList)
  if (nbSpl!=length(rt)) {
    stop('"ROIDataPointSampleList", "rt", "rtMin" and "rtMax" must be the same length')
  }
  
  # ratio must be between 0 and 1
  if ((ratio < 0) | (ratio > 1)) {
    if (verbose) {message("Error: ratio must be between 0 and 1, replaced by default value")}
    ratio <- 0.85
  }
  

  ## Init
  title   <- paste('CpdID: ', cpdID, ' - ', cpdName, ' ', round(mzMin, 4), '-', round(mzMax, 4))
  
  ## Plot raw spectra and curve fit
  p_spec        <- plotEICFit(ROIDataPointSampleList=ROIDataPointSampleList,
                              curveFitSampleList=curveFitSampleList,
                              rtMin=rtMin, rtMax=rtMax, sampling=sampling,
                              sampleColour=sampleColour, verbose=verbose)
  p_spec        <- p_spec + ggplot2::ggtitle(title) + ggplot2::theme(axis.title.x=ggplot2::element_blank(), axis.text.x=ggplot2::element_blank(), plot.title=ggplot2::element_text(size=ggplot2::rel(1)))
 
  ## Plot peakwidth
  p_peakwidth   <- plotPeakwidth(apexValue=rt, widthMin=rtMin, widthMax=rtMax,
                                 varName='Retention Time (sec)', acquTime=NULL,
                                 sampleColour=sampleColour, rotateAxis=TRUE, verbose=FALSE)
  
  ## Set common x lim (due to the rotation, x on p_peakwidth is originally y and accessed as such)
  minX          <- min(ggplot2::layer_scales(p_spec)$x$range$range[1], ggplot2::layer_scales(p_peakwidth)$y$range$range[1])
  maxX          <- max(ggplot2::layer_scales(p_spec)$x$range$range[2], ggplot2::layer_scales(p_peakwidth)$y$range$range[2])
  p_spec        <- p_spec + ggplot2::xlim(minX, maxX)
  p_peakwidth   <- p_peakwidth + ggplot2::ylim(minX, maxX)
  # convert to gtables
  p_spec        <- ggplot2::ggplot_gtable(ggplot2::ggplot_build(p_spec))
  p_peakwidth   <- ggplot2::ggplot_gtable(ggplot2::ggplot_build(p_peakwidth))
  #  find the widths of each of the plots, calculate the maximum and then apply it to each of them individually. This effectively applies a uniform layout to each of the plots.
  maxWidth                <- grid::unit.pmax(p_spec$widths[2:3], p_peakwidth$widths[2:3])
  p_spec$widths[2:3]      <- maxWidth
  p_peakwidth$widths[2:3] <- maxWidth
  
  # Group plots with y axis ratio
  topSize     <- ratio * 10
  bottomSize  <- (1-ratio) * 10
  p           <- gridExtra::grid.arrange(p_spec, p_peakwidth, heights=c(topSize, bottomSize))
  
  return(p)
}

Try the peakPantheR package in your browser

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

peakPantheR documentation built on May 1, 2019, 10:53 p.m.