R/methods-tsLib.R

Defines functions .addLibID .setLibrary

# tsLib
setGeneric("refLib", function(obj, ...) standardGeneric("refLib"))
setMethod("refLib", "tsLib", function(obj, ri, w = 1, sel = TRUE) {
	if(missing(ri))
		ri <- obj@medRI

	if(sel)	{
		rp <- sapply(obj@selMass,length)
		m  <- unlist(obj@selMass)
	} else {
		rp <- sapply(obj@topMass,length)
		m  <- unlist(obj@topMass)
	}
	win <- rep(obj@RIdev[,w], rp)
	ri2 <- rep(ri, rp)
	out <- cbind(ri2 - win, m, ri2 + win)
	colnames(out) <- c("minRI", "mz", "maxRI")
	rownames(out) <- libId(obj, sel)
	out
})

setGeneric("libId", function(obj, ...) standardGeneric("libId"))
setMethod("libId", "tsLib", function(obj, sel = TRUE) {
	if(sel)
		rep(1:length(obj@RI), sapply(obj@selMass, length))
	else
		rep(1:length(obj@RI), sapply(obj@topMass, length))
})

setGeneric("medRI", function(obj) standardGeneric("medRI"))
setMethod("medRI", "tsLib", function(obj) obj@medRI)
setGeneric("medRI<-", function(obj, value) standardGeneric("medRI<-"))
setReplaceMethod("medRI", "tsLib", function(obj, value) { obj@medRI <- value
 obj <- .setLibrary(obj)
 validObject(obj)
 obj })

setMethod("length", "tsLib", function(x) length(x@medRI))

setGeneric("selMass", function(obj) standardGeneric("selMass"))
setMethod("selMass", "tsLib", function(obj) obj@selMass)
setGeneric("selMass<-", function(obj, value) standardGeneric("selMass<-"))
setReplaceMethod("selMass", "tsLib", function(obj, value) { obj@selMass <- value
 obj <- .setLibrary(obj)
 validObject(obj)
 obj })


setGeneric("topMass", function(obj) standardGeneric("topMass"))
setMethod("topMass", "tsLib", function(obj) obj@topMass)
setGeneric("topMass<-", function(obj, value) standardGeneric("topMass<-"))
setReplaceMethod("topMass", "tsLib", function(obj, value) { obj@topMass <- value
 obj <- .setLibrary(obj)
 validObject(obj)
 obj })

setGeneric("quantMass", function(obj) standardGeneric("quantMass"))
setMethod("quantMass", "tsLib", function(obj) obj@quantMass)
setGeneric("quantMass<-", function(obj, value) standardGeneric("quantMass<-"))
setReplaceMethod("quantMass", "tsLib", function(obj, value) { obj@quantMass <- as.numeric(value)
 obj <- .setLibrary(obj)
 validObject(obj)
 obj })


setGeneric("spectra", function(obj) standardGeneric("spectra"))
setMethod("spectra", "tsLib", function(obj) obj@spectra)
setGeneric("spectra<-", function(obj, value) standardGeneric("spectra<-"))
setReplaceMethod("spectra", "tsLib", function(obj, value) { obj@spectra <- value
 obj <- .setLibrary(obj)
 validObject(obj)
 obj })

setGeneric("libName", function(obj) standardGeneric("libName"))
setMethod("libName", "tsLib", function(obj) obj@Name)
setGeneric("libName<-", function(obj, value) standardGeneric("libName<-"))
setReplaceMethod("libName", "tsLib", function(obj, value) { obj@Name <- value
 obj <- .setLibrary(obj)
 validObject(obj)
 obj })

setGeneric("libRI", function(obj) standardGeneric("libRI"))
setMethod("libRI", "tsLib", function(obj) obj@RI)
setGeneric("libRI<-", function(obj, value) standardGeneric("libRI<-"))
setReplaceMethod("libRI", "tsLib", function(obj, value) { obj@RI <- value
 obj <- .setLibrary(obj)
 validObject(obj)
 obj })

setGeneric("libData", function(obj) standardGeneric("libData"))
setMethod("libData", "tsLib", function(obj) obj@libData)
setGeneric("libData<-", function(obj, value) standardGeneric("libData<-"))
setReplaceMethod("libData", "tsLib", function(obj, value) {
	obj@libData <- value
	obj <- .setLibrary(obj)
	validObject(obj)
	obj
})


setGeneric("RIdev", function(obj) standardGeneric("RIdev"))
setMethod("RIdev", "tsLib", function(obj) obj@RIdev)
setGeneric("RIdev<-", function(obj, value) standardGeneric("RIdev<-"))
setReplaceMethod("RIdev", "tsLib", function(obj, value) {
 obj@RIdev <- value
 obj <- .setLibrary(obj)
 validObject(obj)
 obj
})

setMethod("show", "tsLib", function(object) {
	cat("An object of class 'tsLib':\n")
	cat(" Number of objects:  ", length(object), "\n")
	cat("\nImported Library Info:\n")
	print(head(libData(object), 5))
	if(length(object) > 5) cat("    ", length(object) - 5,"lines more...\n")
})

setMethod("[", "tsLib", function(x, i, j, ..., drop) {
    x@Name <- x@Name[i];
    x@RI <- x@RI[i];
    x@medRI <- x@medRI[i];
    x@RIdev <- x@RIdev[i,,drop=FALSE]
    x@selMass <- x@selMass[i]
    x@topMass <- x@topMass[i]
    x@libData <- x@libData[i, j, drop=FALSE]
    x@spectra <- x@spectra[i]
    x@quantMass <- x@quantMass[i]
    .setLibrary(x)
})

setValidity("tsLib", function(object) {
	n <- length(object@Name)
	if(length(object@RI) != n)
		paste("Unequal number of Names and RI: ", n,", ", length(object@RI), sep = "")
	else if(length(object@medRI) != n)
		paste("Unequal number of Names and medRI: ", n,", ", length(object@medRI), sep = "")
	else if(nrow(object@RIdev) != n)
		paste("Unequal number of Names and RIdev: ", n,", ", nrow(object@RIdev), sep = "")
	else if(ncol(object@RIdev) != 3)
		paste("Number of columns of RIdev is not 3: ", ncol(object@RIdev), sep = "")
	else if(length(object@selMass) != n)
		paste("Unequal number of Names and selMass: ", n,", ", length(object@selMass), sep = "")
	else if(length(object@topMass) != n)
		paste("Unequal number of Names and topMass: ", n,", ", length(object@topMass), sep = "")
	else if(length(object@quantMass) != n)
		paste("Unequal number of Names and quantMass: ", n,", ", length(object@quantMass), sep = "")
	else if(length(object@spectra) != n)
		paste("Unequal number of Names and spectra: ", n,", ", length(object@spectra), sep = "")
	else if(nrow(object@libData) != n)
		paste("Unequal number of Names and libData: ", n,", ", nrow(object@libData), sep = "")
	else TRUE
})

setMethod("$", "tsLib", function(x, name) {
    eval(substitute(libData(x)$NAME_ARG, list(NAME_ARG=name)))
})

setMethod("initialize",
          "tsLib",
          function(.Object, Name, RI, selMass, medRI=RI, RIdev=NULL,
                            topMass=NULL, quantMass=NULL, spectra=vector("list", length(Name)),
                            libData=NULL)
          {
            # require at least 1 Name, 1 RI and 1 selMass
            if (length(Name) != length(RI) | length(Name) != length(selMass))
                stop("'Name', 'RI', and 'selMass' must have the same length")

            if(is.null(RIdev)) {
                RIdev <- matrix(rep(RI, 3), ncol=3)
                RIdev <- sweep(matrix(rep(RI, 3), ncol=3), 2, c(5,2,1)/1000, FUN="*")
            } else if(!is.numeric(RIdev)) {
                stop("'RIdev' must be a numeric 3-column matrix")
            } else if(!is.matrix(RIdev)) {
                if(length(RIdev) == 3) {
                    RIdev <- matrix(RIdev, nrow=length(Name), ncol=3, byrow=TRUE)
                } else if(length(RIdev) == 3 * length(Name)) {
                    RIdev <- matrix(RIdev, nrow=length(Name), ncol=3)
                }
            }

            if(is.numeric(selMass)) {
                selMass <- as.list(selMass)
            }

            if(!is.numeric(sapply(selMass, getElement, 1))) {
                stop("'selMass' must be a list of numeric vectors")
            }

            if(is.null(topMass))
                topMass <- selMass
            if(is.null(quantMass))
                quantMass <- sapply(selMass, getElement, 1)
            if(is.null(libData))
                libData <- data.frame(Name = Name, RI = RI)

            if(is.null(spectra))
                spectra <- vector("list", length(Name))

            .Object@Name     <- Name
            .Object@RI       <- RI
            .Object@medRI    <- medRI
            .Object@RIdev    <- RIdev
            .Object@selMass  <- selMass
            .Object@topMass  <- topMass
            .Object@quantMass <- quantMass
            .Object@spectra  <- spectra
            .Object@libData  <- libData
            .Object <- .setLibrary(.Object)
            .Object
          })

.setLibrary <- function(lib)
{
    # remove NAs and take unique
    uniqrm <- function(x) {
        y <- x[ !is.na(x) ]
        unique(y)
    }

    ma <- function(...) mapply(..., SIMPLIFY=FALSE)
    uf <- function(...) uniqrm(c(...))

    id <- lib@libData$libID

    if(is.null(id)) {
        lib@libData <- .addLibID(lib@libData)
        id <- lib@libData$libID
    }

    # remove names in data.frame libData
    dat <- lapply(as.list( lib@libData ), function(x) { unname(x) })
    dat <- data.frame(dat, stringsAsFactors=FALSE)

    lib@selMass <- ma(uf, lib@quantMass, lib@selMass)
    lib@topMass <- ma(uf, lib@quantMass, lib@selMass, lib@topMass)
    lib@quantMass <- sapply(lib@topMass, getElement, 1)

    rownames(lib@RIdev) <- rownames(dat) <- id
    colnames(lib@RIdev) <- sprintf("Win_%d", 1:3)
    names(lib@Name) <- names(lib@RI) <- names(lib@medRI) <- names(lib@selMass) <- id
    names(lib@topMass) <- names(lib@quantMass) <- names(lib@spectra) <- id

    # remove extra columns from dat
    k <- setdiff(colnames(dat), c("Win_1", "Win_2", "Win_3", "SEL_MASS", "TOP_MASS", "SPECTRUM", "QUANT_MASS"))
    dat <- dat[, k,drop=FALSE]

    lib@libData <- dat
    stopifnot( validObject(lib) )
    lib
}

.addLibID <- function(lib) {
    k <- which(tolower(colnames(lib)) == "libid")
    if(length(k) == 0) {
        lib <- data.frame(libID=paste("GC", 1:nrow(lib), sep="."), lib, stringsAsFactors=FALSE)
    } else if(length(k) == 1) {
        if(colnames(lib)[k] != 'libID') {
            warning(sprintf("Changing '%s' to 'libID'", colnames(lib)[k]))
            colnames(lib)[k] <- 'libID'
        }
    }
    else {
        stop(sprintf("\nMultiple colnames match 'libID'. Expecting exactly one match. Please rename/remove the extra columns"))
    }
    id <- make.names(lib$libID, TRUE)
    if(any(id != lib$libID))
        warning("Some identifiers where renamed in order to make them unique")
    lib$libID <- id
    return(lib)
}

# vim: set ts=4 sw=4 et:

Try the TargetSearch package in your browser

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

TargetSearch documentation built on March 12, 2021, 2 a.m.