R/features-xcms3.R

Defines functions importFeaturesXCMS3 findFeaturesXCMS3

Documented in findFeaturesXCMS3 importFeaturesXCMS3

#' @include features.R
NULL

#' @rdname features-class
#' @export
featuresXCMS3 <- setClass("featuresXCMS3", slots = list(xdata = "ANY"), contains = "features")

setMethod("initialize", "featuresXCMS3",
          function(.Object, ...) callNextMethod(.Object, algorithm = "xcms3", ...))

#' @rdname features-class
#' @export
setMethod("delete", "featuresXCMS3", function(obj, i = NULL, j = NULL, ...)
{
    old <- obj
    obj <- callNextMethod()
    
    # simple ana subset
    if (is.null(j) && !setequal(analyses(old), analyses(obj)))
        obj@xdata <- xcms::filterFile(obj@xdata, which(analyses(old) %in% analyses(obj)))
    else if (!is.null(j)) # sync features
        obj@xdata <- xcms::filterChromPeaks(obj@xdata, getKeptXCMSPeakInds(old, obj))
    return(obj)
})

#' Find features using XCMS (new interface)
#'
#' Uses the new \code{xcms3} interface from the \pkg{xcms} package to find features.
#'
#' @templateVar algo XCMS3
#' @templateVar do automatically find features
#' @templateVar generic findFeatures
#' @templateVar algoParam xcms3
#' @template algo_generator
#'
#' @details The file format of analyses must be \code{mzML} or \code{mzXML}.
#'
#' @template centroid_note_mandatory
#'
#' @inheritParams findFeatures
#'
#' @param param The method parameters used by XCMS peak finding, see
#'   \code{\link[xcms:findChromPeaks]{xcms::findChromPeaks}}
#' @param \dots Further parameters passed to \code{\link[xcms:findChromPeaks]{xcms::findChromPeaks}}.
#'
#' @references \addCitations{xcms}{1} \cr\cr \addCitations{xcms}{2} \cr\cr \addCitations{xcms}{3}
#'
#' @inherit findFeatures return
#'
#' @export
findFeaturesXCMS3 <- function(analysisInfo, param = xcms::CentWaveParam(), ..., verbose = TRUE)
{
    ac <- checkmate::makeAssertCollection()
    analysisInfo <- assertAndPrepareAnaInfo(analysisInfo, c("mzXML", "mzML"), verifyCentroided = TRUE, add = ac)
    assertS4(param, add = ac)
    checkmate::assertFlag(verbose, add = ac)
    checkmate::reportAssertions(ac)

    files <- sapply(seq_len(nrow(analysisInfo)),
                    function(i) getMzMLOrMzXMLAnalysisPath(analysisInfo$analysis[i], analysisInfo$path[i]),
                    USE.NAMES = FALSE)

    hash <- makeHash(analysisInfo, do.call(makeFileHash, as.list(files)), param)
    cachef <- loadCacheData("featuresXCMS3", hash)
    if (!is.null(cachef))
        return(cachef)

    if (verbose)
        printf("Finding features with XCMS for %d analyses ...\n", nrow(analysisInfo))

    if (verbose)
        printf("Loading raw data...\n")
    rawData <- readMSDataForXCMS3(analysisInfo)

    if (verbose)
        xdata <- xcms::findChromPeaks(rawData, param = param, ...)
    else
        suppressMessages(xdata <- xcms::findChromPeaks(rawData, param = param, ...))

    ret <- importFeaturesXCMS3(xdata, analysisInfo)

    saveCacheData("featuresXCMS3", ret, hash)

    if (verbose)
    {
        printf("Done!\n")
        printFeatStats(ret@features)
    }

    return(ret)
}

#' Imports features from XCMS (new interface)
#'
#' Imports feature data generated from an existing \code{\link{XCMSnExp}} object generated by the \pkg{xcms} package.
#'
#' @templateVar algo XCMS3
#' @templateVar generic importFeatures
#' @templateVar algoParam xcms3
#' @template algo_importer
#'
#' @inheritParams importFeatures
#'
#' @param xdata An \code{\link{XCMSnExp}} object.
#' 
#' @inherit findFeaturesXCMS3 references
#' @inherit importFeatures return
#'
#' @export
importFeaturesXCMS3 <- function(xdata, analysisInfo)
{
    ac <- checkmate::makeAssertCollection()
    checkmate::assertClass(xdata, "XCMSnExp", add = ac)
    analysisInfo <- assertAndPrepareAnaInfo(analysisInfo, c("mzXML", "mzML"), verifyCentroided = TRUE, add = ac)
    checkmate::reportAssertions(ac)

    feat <- importXCMSPeaks(xcms::chromPeaks(xdata), analysisInfo)

    return(featuresXCMS3(xdata = xdata, features = feat, analysisInfo = analysisInfo))
}
rickhelmus/patRoon documentation built on April 25, 2024, 8:15 a.m.