inst/unitTests/test_write.R
e501fc3e
 ## Testing to write stuff.
 
028e1f19
 test_copyWriteMSData <- function() {
     test_folder = tempdir()
d4bcbe13
 
     ## INPUT: mzXML
19dc1af2
     orig_file <- system.file("threonine", "threonine_i2_e35_pH_tree.mzXML",
7da97ca9
                              package = "msdata")
9a1512c8
 
     mzML_xsd <- XML::xmlTreeParse(system.file("extdata", "mzML1.1.0.xsd",
                                               package = "mzR"),
                                   isSchema = TRUE, useInternal = TRUE)
     mzML_xsd_idx <- XML::xmlTreeParse(system.file("extdata", "mzML1.1.2_idx.xsd",
                                                   package = "mzR"),
                                       isSchema = TRUE, useInternal = TRUE)
 
19dc1af2
     mzxml <- openMSfile(orig_file, backend = "pwiz")
e501fc3e
     pks <- peaks(mzxml)
     hdr <- header(mzxml)
d4bcbe13
     ii <- mzR::instrumentInfo(mzxml)
e501fc3e
     mzR::close(mzxml)
 
d4bcbe13
     ## OUTPUT: mzML
e501fc3e
     fnew <- paste0(test_folder, "test_copyWrite.mzML")
7da97ca9
     mzR::copyWriteMSData(file = fnew, original_file = orig_file,
                          header = hdr, object = pks, backend = "pwiz")
5afbbd4f
     ## Check content is same
e501fc3e
     mzml_new <- openMSfile(fnew, backend = "pwiz")
     pks_new <- peaks(mzml_new)
     hdr_new <- header(mzml_new)
d4bcbe13
     ii_new <- mzR::instrumentInfo(mzml_new)
e501fc3e
     mzR::close(mzml_new)
5afbbd4f
     checkEquals(pks_new, pks)
d4bcbe13
     checkEquals(hdr_new, hdr)
     checkEquals(ii, ii_new)
     
     ## OUTPUT: mzXML
     fnew <- paste0(test_folder, "test_copyWrite.mzXML")
7da97ca9
     mzR::copyWriteMSData(file = fnew, original_file = orig_file,
                          header = hdr, object = pks, backend = "pwiz",
                          outformat = "mzxml")
d4bcbe13
     ## Check content is same
     mzml_new <- openMSfile(fnew, backend = "pwiz")
     pks_new <- peaks(mzml_new)
     hdr_new <- header(mzml_new)
     ii_new <- mzR::instrumentInfo(mzml_new)
     mzR::close(mzml_new)
     checkEquals(pks_new, pks)
630000b7
     ## Don't compare IDs since they are different.
     checkEquals(hdr_new[, colnames(hdr_new) != "spectrumId"],
                 hdr[, colnames(hdr) != "spectrumId"])
d4bcbe13
     checkEquals(ii, ii_new)
5afbbd4f
 
     ## Save as mgf
     ## fnew <- paste0(test_folder, "test_copyWrite.mgf")
d4bcbe13
     ## mzR:::copyWriteMSData(filename = fnew, original_file = orig_file,
5afbbd4f
     ##                       header = hdr, data = pks, backend = "pwiz",
     ##                       outformat = "mgf")
     ## ## Check content is same
     ## mzml_new <- openMSfile(fnew, backend = "pwiz")
     ## pks_new <- peaks(mzml_new)
     ## hdr_new <- header(mzml_new)
     ## mzR::close(mzml_new)
     ## checkEquals(pks_new, pks)
     ## checkEquals(hdr_new, hdr)
     
e501fc3e
     ## Now, let's pick selected spectra instead.
     hdr_sub <- hdr[c(1, 3, 5), ]
     pks_sub <- pks[c(1, 3, 5)]
5afbbd4f
     fnew <- paste0(test_folder, "test_copyWrite.mzML")
     ## index is not OK after subsetting
7da97ca9
     checkException(mzR:::copyWriteMSData(file = fnew,
d4bcbe13
                                          original_file = orig_file,
7da97ca9
                                          header = hdr_sub, object = pks_sub,
5afbbd4f
                                          backend = "pwiz"))
     hdr_sub$seqNum <- seq_len(nrow(hdr_sub))
630000b7
     ## mzML
7da97ca9
     mzR::copyWriteMSData(file = fnew, original_file = orig_file,
                          header = hdr_sub, object = pks_sub, backend = "pwiz",
                          outformat = "mzml")
630000b7
     ## Check content is same
     mzml_new <- openMSfile(fnew, backend = "pwiz")
     pks_new <- peaks(mzml_new)
     hdr_new <- header(mzml_new)
     rownames(hdr_new) <- NULL
     rownames(hdr_sub) <- NULL
     checkEquals(pks_new, pks_sub)
     checkEquals(hdr_new, hdr_sub)
a4b3e08f
     checkEquals(peaks(mzml_new, 2), pks[[3]])
     mzR::close(mzml_new)
630000b7
     ## mzXML
7da97ca9
     mzR::copyWriteMSData(file = fnew, original_file = orig_file,
                          header = hdr_sub, object = pks_sub, backend = "pwiz",
                          outformat = "mzxml")
5afbbd4f
     ## Check content is same
     mzml_new <- openMSfile(fnew, backend = "pwiz")
     pks_new <- peaks(mzml_new)
     hdr_new <- header(mzml_new)
     mzR::close(mzml_new)
     rownames(hdr_new) <- NULL
     rownames(hdr_sub) <- NULL
630000b7
     ## acquisitionNum and precursorScanNum are expected to be different, same
     ## as spectrumId
     hdr_new$acquisitionNum <- as.integer(factor(hdr_new$acquisitionNum))
     hdr_sub$acquisitionNum <- as.integer(factor(hdr_sub$acquisitionNum))
     hdr_new$precursorScanNum <- as.integer(factor(hdr_new$precursorScanNum))
     hdr_sub$precursorScanNum <- as.integer(factor(hdr_sub$precursorScanNum))
     hdr_new$spectrumId <- as.integer(factor(hdr_new$spectrumId))
     hdr_sub$spectrumId <- as.integer(factor(hdr_sub$spectrumId))
5afbbd4f
     checkEquals(pks_new, pks_sub)
630000b7
     checkEquals(hdr_new, hdr_sub)
5afbbd4f
 
     ## Check errors
     ## wrong header.
     ## wrong spectra.
     ## wrong data processing.
7da97ca9
     checkException(mzR::copyWriteMSData(file = fnew,
                                         original_file = orig_file,
                                         header = pks, object = hdr,
                                         backend = "pwiz"))
     checkException(mzR::copyWriteMSData(file = fnew,
                                         original_file = orig_file,
                                         header = hdr, object = hdr,
                                         backend = "pwiz"))
     checkException(mzR::copyWriteMSData(file = fnew,
                                         original_file = "somefile",
                                         header = hdr, object = pks,
                                         backend = "pwiz"))
     checkException(mzR::copyWriteMSData(file = fnew,
                                         original_file = orig_file,
                                         header = hdr, object = pks,
                                         backend = "pwiz",
                                         software_processing = c("other")))
5afbbd4f
     
d4bcbe13
     ## INPUT: mzML
5afbbd4f
     orig_file <- system.file("proteomics",
                              "TMT_Erwinia_1uLSike_Top10HCD_isol2_45stepped_60min_01.mzML.gz",
                              package = "msdata")
d4bcbe13
     fl <- openMSfile(orig_file, backend = "pwiz")
     pks <- peaks(fl)
     hdr <- header(fl)
     ii <- mzR::instrumentInfo(fl)
     mzR::close(fl)
5afbbd4f
 
d4bcbe13
     ## OUTPUT: mzML
5afbbd4f
     fnew <- paste0(test_folder, "test_copyWrite.mzML")
7da97ca9
     mzR::copyWriteMSData(file = fnew, original_file = orig_file,
                          header = hdr, object = pks, backend = "pwiz")
5afbbd4f
     ## Check content is same
     mzml_new <- openMSfile(fnew, backend = "pwiz")
     pks_new <- peaks(mzml_new)
     hdr_new <- header(mzml_new)
d4bcbe13
     ii_new <- mzR::instrumentInfo(mzml_new)
5afbbd4f
     checkEquals(pks_new, pks)
     checkEquals(hdr_new, hdr)  ## polarity is OK here
d4bcbe13
     checkEquals(ii, ii_new)
a4b3e08f
 
     checkEquals(peaks(mzml_new, 12), pks[[12]])
     mzR::close(mzml_new)
d4bcbe13
     ## OUTPUT: mzXML
     fnew <- paste0(test_folder, "test_copyWrite.mzXML")
1ab173f6
     suppressWarnings(
         mzR::copyWriteMSData(file = fnew, original_file = orig_file,
                              header = hdr, object = pks, backend = "pwiz",
                              outformat = "mzxml")
     )
d4bcbe13
     ## Check content is same
     mzml_new <- openMSfile(fnew, backend = "pwiz")
     pks_new <- peaks(mzml_new)
     hdr_new <- header(mzml_new)
     ii_new <- mzR::instrumentInfo(mzml_new)
     mzR::close(mzml_new)
     checkEquals(pks_new, pks)
     ## acquisitionNum and precursorScanNum will be different, replace with
     ## factors - order and all has to be the same though.
630000b7
     hdr_mod <- hdr
     hdr_mod$acquisitionNum <- as.integer(factor(hdr$acquisitionNum))
     hdr_mod$precursorScanNum <- as.integer(factor(hdr$precursorScanNum))
d4bcbe13
     hdr_new$acquisitionNum <- as.integer(factor(hdr_new$acquisitionNum))
     hdr_new$precursorScanNum <- as.integer(factor(hdr_new$precursorScanNum))
630000b7
     rt_col <- colnames(hdr_mod) == "retentionTime"
     checkEquals(hdr_mod[, rt_col], hdr_new[, rt_col], tolerance = 0.01)
     cn <- colnames(hdr)[!(colnames(hdr) %in% c("injectionTime", "retentionTime",
2edb9032
                                                "filterString", "spectrumId",
52172a4d
                                                "isolationWindowTargetMZ",
                                                "scanWindowLowerLimit",
                                                "scanWindowUpperLimit"))]
630000b7
     checkEquals(hdr_mod[, cn], hdr_new[, cn])
d4bcbe13
     ## checkEquals(ii, ii_new)
 
630000b7
     ## Subset. These checks ensure that the scan - precursor scan are mapped
     ## correctly!
     idx <- c(`1003` = 1, `1006` = 4, `1019` = 17, `1021` = 19, `1024` = 22,
              `1026` = 24)
     ## 1: no precursor
     ## 2: 1 as precursor, 1003
     ## 3: no precursor
     ## 4: no precursor
     ## 5: 4 as precursor, 1021
     ## 6: 4 as precursor, 1021
     hdr_sub <- hdr[idx, ]
     pks_sub <- pks[idx]
     hdr_sub$seqNum <- 1:nrow(hdr_sub)
     fnew <- paste0(test_folder, "test_copyWrite.mzML")
7da97ca9
     mzR::copyWriteMSData(file = fnew, original_file = orig_file,
                          header = hdr_sub, object = pks_sub, backend = "pwiz",
                          outformat = "mzml")
630000b7
     ## Check content is same
     mzml_new <- openMSfile(fnew, backend = "pwiz")
     pks_new <- peaks(mzml_new)
     hdr_new <- header(mzml_new)
     ii_new <- mzR::instrumentInfo(mzml_new)
     mzR::close(mzml_new)
     checkEquals(pks_new, pks_sub)
     rownames(hdr_sub) <- NULL
     rownames(hdr_new) <- NULL
     checkEquals(hdr_new, hdr_sub)  ## polarity is OK here
     checkEquals(ii, ii_new)
 
     ## Subset with mzXML
     fnew <- paste0(test_folder, "test_copyWrite.mzXML")
1ab173f6
     suppressWarnings(
         mzR::copyWriteMSData(file = fnew, original_file = orig_file,
                              header = hdr_sub, object = pks_sub, backend = "pwiz",
                              outformat = "mzxml")
     )
630000b7
     ## Check content is same
     mzml_new <- openMSfile(fnew, backend = "pwiz")
     pks_new <- peaks(mzml_new)
     hdr_new <- header(mzml_new)
     ii_new <- mzR::instrumentInfo(mzml_new)
     mzR::close(mzml_new)
     checkEquals(pks_new, pks_sub)
     rownames(hdr_sub) <- NULL
     rownames(hdr_new) <- NULL
     hdr_sub$acquisitionNum <- as.integer(factor(hdr_sub$acquisitionNum))
     hdr_sub$precursorScanNum <- as.integer(factor(hdr_sub$precursorScanNum))
     hdr_new$acquisitionNum <- as.integer(factor(hdr_new$acquisitionNum))
     hdr_new$precursorScanNum <- as.integer(factor(hdr_new$precursorScanNum))
     rt_col <- colnames(hdr_sub) == "retentionTime"
     checkEquals(hdr_sub[, rt_col], hdr_new[, rt_col], tolerance = 0.01)
     cn <- colnames(hdr_sub)[!(colnames(hdr_sub) %in% c("injectionTime",
                                                        "retentionTime",
9fd7959c
                                                        "filterString",
2edb9032
                                                        "spectrumId",
52172a4d
                                                        "isolationWindowTargetMZ",
                                                        "scanWindowLowerLimit",
                                                        "scanWindowUpperLimit"))]
630000b7
     checkEquals(hdr_sub[, cn], hdr_new[, cn])    
     
d4bcbe13
     ## Other mzML:
     test_file <- system.file("microtofq", "MM14.mzML", package = "msdata")
     in_file <- openMSfile(test_file, backend = "pwiz")
     hdr <- header(in_file)
     pks <- peaks(in_file)
     ii <- mzR::instrumentInfo(in_file)
     mzR::close(in_file)
     
     ## mzML
     out_file <- paste0(test_folder, "test_copyWrite.mzML")
7da97ca9
     mzR::copyWriteMSData(file = out_file, original_file = test_file,
                          header = hdr, object = pks,
82debcef
                          software_processing = c("MSnbase", "2.3.8", "MS:-1"))
d4bcbe13
     in_file <- openMSfile(out_file, backend = "pwiz")
     hdr_2 <- header(in_file)
     pks_2 <- peaks(in_file)
     ii_2 <- mzR::instrumentInfo(in_file)
     mzR::close(in_file)
     checkEquals(hdr, hdr_2)
     checkEquals(pks, pks_2)
     checkEquals(ii, ii_2)
     
     ## mzXML output:
     out_file <- paste0(test_folder, "test_copyWrite.mzXML")
7da97ca9
     mzR::copyWriteMSData(file = out_file, original_file = test_file,
                          header = hdr, object = pks, outformat = "mzXML",
82debcef
                          software_processing = c("MSnbase", "2.3.8", "MS:-1"))
d4bcbe13
     in_file <- openMSfile(out_file, backend = "pwiz")
     hdr_2 <- header(in_file)
     pks_2 <- peaks(in_file)
     mzR::close(in_file)
52172a4d
     cn <- c("spectrumId", "scanWindowLowerLimit", "scanWindowUpperLimit")
     checkEquals(hdr[, !(colnames(hdr) %in% cn)],
                 hdr_2[, !(colnames(hdr_2) %in% cn)])
d4bcbe13
     checkEquals(pks, pks_2)
     checkEquals(ii, ii_2)
e501fc3e
 }
 
a4b3e08f
 test_writeMSData <- function() {    
9a1512c8
     mzML_xsd <- XML::xmlTreeParse(system.file("extdata", "mzML1.1.0.xsd",
                                               package = "mzR"),
                                   isSchema = TRUE, useInternal = TRUE)
     mzML_xsd_idx <- XML::xmlTreeParse(system.file("extdata", "mzML1.1.2_idx.xsd",
                                                   package = "mzR"),
                                       isSchema = TRUE, useInternal = TRUE)
     mzXML_xsd_idx <- XML::xmlTreeParse(system.file("extdata",
                                                    "mzXML_idx_3.2.xsd.xml",
                                                    package = "mzR"),
                                        isSchema = TRUE, useInternal = TRUE)
 
028e1f19
     test_folder = tempdir()
d4bcbe13
     ## Input: mzXML
e501fc3e
     test_file <- system.file("threonine", "threonine_i2_e35_pH_tree.mzXML",
                              package = "msdata")
     in_file <- openMSfile(test_file, backend = "pwiz")
     hdr <- header(in_file)
     pks <- peaks(in_file)
     mzR::close(in_file)
 
d4bcbe13
     ## mzML
9a1512c8
     out_file <- paste0(test_folder, "/test_write.mzML")
7da97ca9
     writeMSData(file = out_file, header = hdr, object = pks)
e501fc3e
     in_file <- openMSfile(out_file, backend = "pwiz")
     hdr_2 <- header(in_file)
     pks_2 <- peaks(in_file)
5afbbd4f
     checkEquals(hdr, hdr_2)
e501fc3e
     checkEquals(pks, pks_2)
a4b3e08f
     checkEquals(peaks(in_file, 13), pks[[13]])
     mzR::close(in_file)
9a1512c8
     ## validate mzML:
     doc <- XML::xmlInternalTreeParse(out_file)
     res <- XML::xmlSchemaValidate(mzML_xsd_idx, doc)
     checkEquals(res$status, 0)
     
e501fc3e
     ## Test subsetting.
     hdr_sub <- hdr[c(1, 3, 5), ]
     hdr_sub$seqNum <- 1:nrow(hdr_sub)
     pks_sub <- pks[c(1, 3, 5)]
7da97ca9
     writeMSData(pks_sub, out_file, header = hdr_sub)
e501fc3e
     in_file <- openMSfile(out_file)
     hdr_sub_2 <- header(in_file)
     pks_sub_2 <- peaks(in_file)
630000b7
     checkEquals(pks_sub, pks_sub_2)
a4b3e08f
     checkEquals(peaks(in_file, 3), pks[[5]])
     mzR::close(in_file)
630000b7
     ## mzXML does not support spectrumId, thus acquisitionNum, precursorScanNum
     ## and spectrumId will be different, but their order and mapping has to be
     ## the same.
     hdr_sub$acquisitionNum <- as.integer(factor(hdr_sub$acquisitionNum))
     hdr_sub_2$acquisitionNum <- as.integer(factor(hdr_sub_2$acquisitionNum))
     hdr_sub$precursorScanNum <- as.integer(factor(hdr_sub$precursorScanNum))
     hdr_sub_2$precursorScanNum <- as.integer(factor(hdr_sub_2$precursorScanNum))
     hdr_sub$spectrumId <- as.integer(factor(hdr_sub$spectrumId))
     hdr_sub_2$spectrumId <- as.integer(factor(hdr_sub_2$spectrumId))
     rownames(hdr_sub) <- NULL
     checkEquals(hdr_sub, hdr_sub_2)
9a1512c8
     ## validate mzML:
     doc <- XML::xmlInternalTreeParse(out_file)
     res <- XML::xmlSchemaValidate(mzML_xsd_idx, doc)
     checkEquals(res$status, 0)
e501fc3e
     
5afbbd4f
     ## mzXML output:
9a1512c8
     out_file <- paste0(test_folder, "/test_write.mzXML")
7da97ca9
     writeMSData(file = out_file, header = hdr, object = pks,
                 outformat = "mzXML")
d4bcbe13
     in_file <- openMSfile(out_file, backend = "pwiz")
     hdr_2 <- header(in_file)
     pks_2 <- peaks(in_file)
     mzR::close(in_file)
     checkEquals(pks, pks_2)
630000b7
     checkEquals(hdr[, colnames(hdr) != "spectrumId"],
                 hdr_2[, colnames(hdr_2) != "spectrumId"])
     hdr_sub <- hdr[c(1, 3, 5), ]
     hdr_sub$seqNum <- 1:nrow(hdr_sub)
     pks_sub <- pks[c(1, 3, 5)]
7da97ca9
     writeMSData(file = out_file, header = hdr_sub, object = pks_sub,
                 outformat = "mzXML")
630000b7
     in_file <- openMSfile(out_file)
     hdr_sub_2 <- header(in_file)
     pks_sub_2 <- peaks(in_file)
     mzR::close(in_file)
     checkEquals(pks_sub, pks_sub_2)
     ## mzXML does not support spectrumId, thus acquisitionNum, precursorScanNum
     ## and spectrumId will be different, but their order and mapping has to be
     ## the same.
     hdr_sub$acquisitionNum <- as.integer(factor(hdr_sub$acquisitionNum))
     hdr_sub_2$acquisitionNum <- as.integer(factor(hdr_sub_2$acquisitionNum))
     hdr_sub$precursorScanNum <- as.integer(factor(hdr_sub$precursorScanNum))
     hdr_sub_2$precursorScanNum <- as.integer(factor(hdr_sub_2$precursorScanNum))
     hdr_sub$spectrumId <- as.integer(factor(hdr_sub$spectrumId))
     hdr_sub_2$spectrumId <- as.integer(factor(hdr_sub_2$spectrumId))
     rownames(hdr_sub) <- NULL
     checkEquals(hdr_sub, hdr_sub_2)
     
d4bcbe13
     ## mgf output:
     ## out_file <- paste0(test_folder, "test_write.mgf")
5afbbd4f
     ## mzR:::writeMSData(filename = out_file, header = hdr, data = pks,
d4bcbe13
     ##                   outformat = "mgf")
5afbbd4f
     ## in_file <- openMSfile(out_file, backend = "pwiz")
     ## hdr_2 <- header(in_file)
     ## pks_2 <- peaks(in_file)
     ## mzR::close(in_file)
     ## checkEquals(hdr, hdr_2)
     ## checkEquals(pks, pks_2)
d4bcbe13
 
     ## Input: mzML
     test_file <- system.file("proteomics",
                              "TMT_Erwinia_1uLSike_Top10HCD_isol2_45stepped_60min_01.mzML.gz",
                              package = "msdata")
     in_file <- openMSfile(test_file, backend = "pwiz")
     hdr <- header(in_file)
     pks <- peaks(in_file)
     mzR::close(in_file)
     
     ## mzML
9a1512c8
     out_file <- paste0(test_folder, "/test_write.mzML")
7da97ca9
     writeMSData(pks, file = out_file, header = hdr)
d4bcbe13
     in_file <- openMSfile(out_file, backend = "pwiz")
     hdr_2 <- header(in_file)
     pks_2 <- peaks(in_file)
     mzR::close(in_file)
     checkEquals(pks, pks_2)
630000b7
     ## Don't understand exactly why, but here we do have different
     ## acquisitionNum and precursorScanNum while having the same spectrumID.
     hdr_mod <- hdr
     hdr_mod$acquisitionNum <- as.integer(factor(hdr_mod$acquisitionNum))
     hdr_mod$precursorScanNum <- as.integer(factor(hdr_mod$precursorScanNum))
     hdr_2$acquisitionNum <- as.integer(factor(hdr_2$acquisitionNum))
     hdr_2$precursorScanNum <- as.integer(factor(hdr_2$precursorScanNum))
     checkEquals(hdr_mod, hdr_2)
9a1512c8
     ## validate mzML:
     doc <- XML::xmlInternalTreeParse(out_file)
     res <- XML::xmlSchemaValidate(mzML_xsd_idx, doc)
     checkEquals(res$status, 0)
d4bcbe13
 
     ## mzXML output:
9a1512c8
     out_file <- paste0(test_folder, "/test_write.mzXML")
a4b3e08f
     suppressWarnings(
         writeMSData(file = out_file, header = hdr, object = pks,
                     outformat = "mzXML")
     )
d4bcbe13
     in_file <- openMSfile(out_file, backend = "pwiz")
     hdr_2 <- header(in_file)
     pks_2 <- peaks(in_file)
     mzR::close(in_file)
     rt_col <- which(colnames(hdr) == "retentionTime")
     checkEquals(hdr[, rt_col], hdr_2[, rt_col], tolerance = 0.01)
     checkEquals(pks, pks_2)
630000b7
     hdr_mod <- hdr
     hdr_mod$acquisitionNum <- as.integer(factor(hdr_mod$acquisitionNum))
     hdr_mod$precursorScanNum <- as.integer(factor(hdr_mod$precursorScanNum))
     hdr_2$acquisitionNum <- as.integer(factor(hdr_2$acquisitionNum))
     hdr_2$precursorScanNum <- as.integer(factor(hdr_2$precursorScanNum))
     cn <- colnames(hdr_mod)[!(colnames(hdr_mod) %in% c("retentionTime",
                                                        "injectionTime",
9fd7959c
                                                        "filterString",
2edb9032
                                                        "spectrumId",
52172a4d
                                                        "isolationWindowTargetMZ",
                                                        "scanWindowLowerLimit",
                                                        "scanWindowUpperLimit"))]
630000b7
     checkEquals(hdr_mod[, cn], hdr_2[, cn])
     
     ## Subset. These checks ensure that the scan - precursor scan are mapped
     ## correctly!
     idx <- c(`1003` = 1, `1006` = 4, `1019` = 17, `1021` = 19, `1024` = 22,
              `1026` = 24)
     ## 1: no precursor
     ## 2: 1 as precursor, 1003
     ## 3: no precursor
     ## 4: no precursor
     ## 5: 4 as precursor, 1021
     ## 6: 4 as precursor, 1021
     hdr_sub <- hdr[idx, ]
     rownames(hdr_sub) <- NULL
     hdr_sub$seqNum <- 1:nrow(hdr_sub)
     pks_sub <- pks[idx]
     fnew <- paste0(test_folder, "test_copyWrite.mzML")
7da97ca9
     writeMSData(file = fnew,
                 header = hdr_sub, object = pks_sub, backend = "pwiz",
                 outformat = "mzml")
630000b7
     ## Check content is same
     mzml_new <- openMSfile(fnew, backend = "pwiz")
     pks_new <- peaks(mzml_new)
     hdr_new <- header(mzml_new)
     ii_new <- mzR::instrumentInfo(mzml_new)
     mzR::close(mzml_new)
     checkEquals(pks_new, pks_sub)
     ## I don't quite understand that, but the acquisitionNum and the
     ## precursorScanNum are different while the spectrumId is the same.
     ## Still, check that the precursorScanNum is what we expect:
2c7479f5
     checkEquals(hdr_new$precursorScanNum, c(NA, 1, NA, NA, 4, 4))
630000b7
     hdr_new$acquisitionNum <- as.integer(factor(hdr_new$acquisitionNum))
     hdr_new$precursorScanNum <- as.integer(factor(hdr_new$precursorScanNum))
     hdr_sub$acquisitionNum <- as.integer(factor(hdr_sub$acquisitionNum))
     hdr_sub$precursorScanNum <- as.integer(factor(hdr_sub$precursorScanNum))
     checkEquals(hdr_new, hdr_sub)  ## polarity is OK here
d4bcbe13
 
630000b7
     ## Subset with mzXML
     hdr_sub <- hdr[idx, ]
     rownames(hdr_sub) <- NULL
     hdr_sub$seqNum <- 1:nrow(hdr_sub)
     pks_sub <- pks[idx]
     fnew <- paste0(test_folder, "test_copyWrite.mzXML")
a4b3e08f
     suppressWarnings(
         writeMSData(file = fnew, header = hdr_sub, object = pks_sub,
                     backend = "pwiz", outformat = "mzxml")
     )
630000b7
     ## Check content is same
     mzml_new <- openMSfile(fnew, backend = "pwiz")
     pks_new <- peaks(mzml_new)
     hdr_new <- header(mzml_new)
     ii_new <- mzR::instrumentInfo(mzml_new)
     mzR::close(mzml_new)
     checkEquals(pks_new, pks_sub)
2c7479f5
     checkEquals(hdr_new$precursorScanNum, c(NA, 1, NA, NA, 4, 4))
630000b7
     rownames(hdr_sub) <- NULL
     rownames(hdr_new) <- NULL
     hdr_sub$acquisitionNum <- as.integer(factor(hdr_sub$acquisitionNum))
     hdr_sub$precursorScanNum <- as.integer(factor(hdr_sub$precursorScanNum))
     hdr_new$acquisitionNum <- as.integer(factor(hdr_new$acquisitionNum))
     hdr_new$precursorScanNum <- as.integer(factor(hdr_new$precursorScanNum))
     rt_col <- colnames(hdr_sub) == "retentionTime"
     checkEquals(hdr_sub[, rt_col], hdr_new[, rt_col], tolerance = 0.01)
     cn <- colnames(hdr_sub)[!(colnames(hdr_sub) %in% c("injectionTime",
                                                        "retentionTime",
9fd7959c
                                                        "filterString",
2edb9032
                                                        "spectrumId",
52172a4d
                                                        "isolationWindowTargetMZ",
                                                        "scanWindowLowerLimit",
                                                        "scanWindowUpperLimit"))]
630000b7
     checkEquals(hdr_sub[, cn], hdr_new[, cn])
     
d4bcbe13
     ## Other mzML:
     test_file <- system.file("microtofq", "MM14.mzML", package = "msdata")
     in_file <- openMSfile(test_file, backend = "pwiz")
     hdr <- header(in_file)
     pks <- peaks(in_file)
     mzR::close(in_file)
     
     ## mzML
9a1512c8
     out_file <- paste0(test_folder, "/test_write.mzML")
7da97ca9
     writeMSData(file = out_file, header = hdr, object = pks)
d4bcbe13
     in_file <- openMSfile(out_file, backend = "pwiz")
     hdr_2 <- header(in_file)
     pks_2 <- peaks(in_file)
     mzR::close(in_file)
     checkEquals(hdr, hdr_2)
     checkEquals(pks, pks_2)
9a1512c8
     ## validate mzML:
     doc <- XML::xmlInternalTreeParse(out_file)
     res <- XML::xmlSchemaValidate(mzML_xsd_idx, doc)
     checkEquals(res$status, 0)
d4bcbe13
 
     ## mzXML output:
     out_file <- paste0(test_folder, "test_write.mzXML")
7da97ca9
     writeMSData(file = out_file, header = hdr, object = pks,
                 outformat = "mzXML")
d4bcbe13
     in_file <- openMSfile(out_file, backend = "pwiz")
     hdr_2 <- header(in_file)
     pks_2 <- peaks(in_file)
     mzR::close(in_file)
     checkEquals(pks, pks_2)
52172a4d
     cn <- c("spectrumId", "scanWindowLowerLimit", "scanWindowUpperLimit")
     checkEquals(hdr[, !(colnames(hdr_2) %in% cn)],
e3f79ff5
                 hdr_2[, !(colnames(hdr_2) %in% cn)])    
e501fc3e
 }