From ba10535273d9eaefc063a8fc675039e8ae2f8fc0 Mon Sep 17 00:00:00 2001 From: jorainer Date: Fri, 1 Dec 2023 10:45:15 +0100 Subject: [PATCH] fix: ensure MS level is of type integer in Chromatogram - Ensure MS levels are converted to integer when Chromatogram is extracted from a `MsExperiment` or `XcmsExperiment`. --- .github/workflows/check-bioc.yml | 2 +- DESCRIPTION | 2 +- R/XcmsExperiment.R | 6 +++--- R/functions-utils.R | 1 + inst/NEWS | 7 +++++++ tests/testthat/test_XcmsExperiment.R | 4 ++++ 6 files changed, 17 insertions(+), 5 deletions(-) diff --git a/.github/workflows/check-bioc.yml b/.github/workflows/check-bioc.yml index 4647d8d3f..004314817 100644 --- a/.github/workflows/check-bioc.yml +++ b/.github/workflows/check-bioc.yml @@ -52,7 +52,7 @@ jobs: fail-fast: false matrix: config: - - { os: ubuntu-latest, r: 'devel', bioc: 'devel', cont: "bioconductor/bioconductor_docker:devel", rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest" } + - { os: ubuntu-latest, r: '4.3', bioc: '3.18', cont: "bioconductor/bioconductor_docker:RELEASE_3_18", rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest" } - { os: macOS-latest, r: '4.3', bioc: '3.18'} - { os: windows-latest, r: '4.3', bioc: '3.18'} env: diff --git a/DESCRIPTION b/DESCRIPTION index 21d95ee82..49401c52b 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,5 +1,5 @@ Package: xcms -Version: 4.0.0 +Version: 4.0.1 Title: LC-MS and GC-MS Data Analysis Description: Framework for processing and visualization of chromatographically separated and single-spectra mass spectral data. Imports from AIA/ANDI NetCDF, diff --git a/R/XcmsExperiment.R b/R/XcmsExperiment.R index 9fdc90f7c..38440113a 100644 --- a/R/XcmsExperiment.R +++ b/R/XcmsExperiment.R @@ -839,7 +839,7 @@ setMethod( chunkSize = chunkSize, BPPARAM = BPPARAM) } ## Assign/define peak IDs. - pkd <- data.frame(ms_level = rep(msLevel, nrow(res)), + pkd <- data.frame(ms_level = rep(as.integer(msLevel), nrow(res)), is_filled = rep(FALSE, nrow(res))) ph <- XProcessHistory(param = param, type. = .PROCSTEP.PEAK.DETECTION, @@ -1535,7 +1535,7 @@ setMethod( stop("No chromatographic peaks present. ", "Please run 'findChromPeaks' first.") res <- .manual_feature_definitions(chromPeaks(object), peakIdx) - res$ms_level <- msLevel + res$ms_level <- as.integer(msLevel) if (hasFeatures(object)) { maxi <- max(as.integer( sub("FT", "", rownames(featureDefinitions(object))))) @@ -1821,7 +1821,7 @@ setMethod( nr <- nrow(res) maxi <- max(as.integer(sub("CP", "", rownames(chromPeaks(object))))) rownames(res) <- .featureIDs(nr, "CP", maxi + 1) - cpd <- data.frame(ms_level = rep(msLevel, nr), + cpd <- data.frame(ms_level = rep(as.integer(msLevel), nr), is_filled = rep(TRUE, nr)) rownames(cpd) <- rownames(res) object@chromPeaks <- rbind(object@chromPeaks, res) diff --git a/R/functions-utils.R b/R/functions-utils.R index 7868f0da2..09ccf9de0 100644 --- a/R/functions-utils.R +++ b/R/functions-utils.R @@ -816,6 +816,7 @@ groupOverlaps <- function(xmin, xmax) { pks_tmz = rep(1L, nrow(pks)), aggregationFun = "sum") { nr <- nrow(pks) + pks_msl <- as.integer(pks_msl) FUN <- switch(aggregationFun, "sum" = getFunction("sumi"), "max" = getFunction("maxi"), diff --git a/inst/NEWS b/inst/NEWS index 4cfbf372a..d8363976e 100644 --- a/inst/NEWS +++ b/inst/NEWS @@ -1,3 +1,10 @@ +Changes in version 4.0.1 +---------------------- + +- Ensure MS levels are always provided as integer to `Chromatogram` objects when + extracted from `XcmsExperiment` or `MsExperiment`. + + Changes in version 3.99.6 ---------------------- diff --git a/tests/testthat/test_XcmsExperiment.R b/tests/testthat/test_XcmsExperiment.R index c317d71be..af2ce41e8 100644 --- a/tests/testthat/test_XcmsExperiment.R +++ b/tests/testthat/test_XcmsExperiment.R @@ -69,6 +69,7 @@ test_that("findChromPeaks,MsExperiment et al works", { expect_true(is.data.frame(chromPeakData(xmse, return.type = "data.frame"))) expect_s4_class(chromPeakData(xmse), "DataFrame") expect_true(nrow(chromPeakData(xmse, 2:3)) == 0) + expect_true(is.integer(chromPeakData(res)$ms_level)) ## dropChromPeaks rres <- dropChromPeaks(res) @@ -84,13 +85,16 @@ test_that("findChromPeaks,MsExperiment et al works", { expect_equal(res@chromPeaks, res2@chromPeaks) expect_equal(res@chromPeakData, res2@chromPeakData) expect_true(length(res2@processHistory) == 2) + expect_true(is.integer(chromPeakData(res2)$ms_level)) res2 <- findChromPeaks(res, param = p, msLevel = 2L, add = FALSE) expect_equal(nrow(res2@chromPeaks), 0) expect_true(length(res2@processHistory) == 1) + expect_true(is.integer(chromPeakData(res2)$ms_level)) res2 <- findChromPeaks(mse, param = p, chunkSize = -1) expect_equal(res@chromPeaks, res2@chromPeaks) + expect_true(is.integer(chromPeakData(res2)$ms_level)) expect_true(hasChromPeaks(res)) expect_true(hasChromPeaks(res, msLevel = 1L))