## ----style, echo = FALSE, results = "asis", message = FALSE-------------------
BiocStyle::markdown()

## ----setup, include = FALSE---------------------------------------------------
knitr::opts_chunk$set(collapse = TRUE, comment = "#>")
library(BiocStyle)

## ----install, eval = FALSE----------------------------------------------------
# if (!requireNamespace("BiocManager", quietly = TRUE))
#     install.packages("BiocManager")
# BiocManager::install("MsBackendParquet")

## ----data-file, message = FALSE-----------------------------------------------
library(Spectra)
library(MsBackendParquet)
library(MsDataHub)

fl <- MsDataHub::PestMix1_DDA.mzML()

## ----name-file----------------------------------------------------------------
fl_named <- file.path(tempdir(), "PestMix1_DDA.mzML")
invisible(file.copy(fl, fl_named, overwrite = TRUE))

## ----mzml-to-parquet----------------------------------------------------------
path <- tempfile()
be <- mzMLToParquet(fl_named, path = path, verbose = FALSE)

sps <- Spectra(be)
sps

## ----run-dirs-----------------------------------------------------------------
list.files(file.path(path, "spectra"))

## ----set-backend--------------------------------------------------------------
sps_mem <- Spectra(fl_named, source = MsBackendMzR())
sps_pq <- setBackend(sps_mem, MsBackendParquet(), path = tempfile())
sps_pq

## ----spectra-variables--------------------------------------------------------
spectraVariables(sps)

## ----access-------------------------------------------------------------------
spectraData(sps, c("msLevel", "rtime", "precursorMz"))

head(peaksData(sps)[[1L]])

head(tic(sps))

## ----filter-basic-------------------------------------------------------------
filterMsLevel(sps, 2L)

filterRt(sps, c(200, 300))

## ----filter-chained-----------------------------------------------------------
sps |>
    filterRt(c(200, 300)) |>
    filterMsLevel(2L) |>
    length()

## ----filter-precursor---------------------------------------------------------
filterPrecursorMzRange(sps, c(278, 279))

ms2 <- filterPrecursorMzValues(sps, 278.093, ppm = 30)
ms2

range(rtime(ms2))

## ----filter-precursor-values--------------------------------------------------
filterPrecursorMzValues(sps, c(278.093, 124.086), tolerance = 0.01)

## ----peaks--------------------------------------------------------------------
lengths(ms2)

pk <- peaksData(ms2)[[which.max(lengths(ms2))]]
head(pk[order(-pk[, "intensity"]), ])

## ----contains-mz--------------------------------------------------------------
which(containsMz(ms2, mz = 164.054, tolerance = 0.01))

## ----create-ms-backend--------------------------------------------------------
path_part <- tempfile()
createMsBackendParquetDataset(path = path_part, x = fl,
                              partitioning = "msLevel",
                              compression = "zstd")

be_part <- backendInitialize(MsBackendParquet(), path = path_part)
length(be_part)

## ----partition-dirs-----------------------------------------------------------
list.files(list.files(file.path(path_part, "spectra"), full.names = TRUE))

## ----create-mzpeak-dataset----------------------------------------------------
archives <- system.file("extdata", c("QC01.mzpeak", "QC02.mzpeak"),
                        package = "MsBackendParquet")

qc_path <- tempfile()
createMzPeakDataset(archives[1L], path = qc_path, verbose = FALSE)

## ----add-mzpeak-archives------------------------------------------------------
addMzPeakArchives(qc_path, archives[2L], verbose = FALSE)

be_qc <- backendInitialize(MsBackendParquet(), path = qc_path)
sps_qc <- Spectra(be_qc)
sps_qc

table(basename(dataOrigin(sps_qc)))

## ----filter-data-origin-------------------------------------------------------
filterDataOrigin(sps_qc, grep("QC02", dataOrigin(sps_qc), value = TRUE)[1L])

## ----mzpeak-repr--------------------------------------------------------------
be_centroid <- backendInitialize(MsBackendParquet(), path = qc_path,
                                 representation = "centroid")
be_centroid

## ----filter-contains-mz-------------------------------------------------------
hits <- filterContainsMz(be_qc, c(201, 10101), ppm = 20)
length(hits)

basename(dataOrigin(hits))

## ----filter-contains-mz-spectra-----------------------------------------------
Spectra(hits)

## ----build-projection---------------------------------------------------------
buildProjection(qc_path, verbose = FALSE)

length(filterContainsMz(be_qc, 201, ppm = 20))

## ----drop-projection----------------------------------------------------------
dropProjection(qc_path, verbose = FALSE)

## ----run-data-----------------------------------------------------------------
runData(be_qc) <- data.frame(run_id = c("QC01", "QC02"),
                             subject = c("S1", "S2"),
                             timepoint = c(0L, 6L))
runVariables(be_qc)

## ----run-data-access----------------------------------------------------------
spectraData(be_qc, c("rtime", "subject", "timepoint"))

## ----filter-sample-data-------------------------------------------------------
Spectra(filterSampleData(be_qc, timepoint == 6))

## ----link-sample-data, message = FALSE----------------------------------------
library(MsExperiment)

samples <- S4Vectors::DataFrame(run_id = c("QC01", "QC02"),
                                subject = c("S1", "S2"),
                                timepoint = c(0L, 6L))
mse <- MsExperiment(sampleData = samples, spectra = Spectra(be_qc))
mse <- linkSampleData(mse, with = "sampleData.run_id = spectra.run_id")
mse

## The spectra of the second sample.
spectra(mse[2])

## ----options------------------------------------------------------------------
## Enable ("auto", the default) or disable ("off") the metadata cache.
options(MsBackendParquet.cacheMetadata = "auto")

## Columns held by default (the ones the optimised filters need).
options(MsBackendParquet.cacheColumns =
            c("msLevel", "rtime", "precursorMz", "dataOrigin"))

## Budget in cells (rows x columns); 5e7 is roughly 400 MB of doubles.
## Requests over budget quietly fall back to reading from disk.
options(MsBackendParquet.cacheMaxCells = 5e7)

## ----mzml-to-parquet-streaming------------------------------------------------
be_stream <- mzMLToParquet(fl, path = tempfile(),
                           engine = "mzr", batch_size = 1000L,
                           verbose = FALSE)
length(be_stream)

## ----save-load----------------------------------------------------------------
rds <- tempfile(fileext = ".rds")
saveRDS(be, rds)
be2 <- readRDS(rds)
identical(spectraNames(be), spectraNames(be2))

## ----si-----------------------------------------------------------------------
sessionInfo()

