Although originally developed for liquid chromatography-tandem mass spectrometry (LC-MS/MS) data, CluMSID can also be used with direct infusion-tandem mass spectrometry (DI-MS/MS) data.
Generally, the missing retention time dimension makes feature annotation in metabolomics harder but if only direct infusion data is at hand, CluMSID can help to get an overview of the chemodiversity of a sample measured by DI-MS/MS.
In this example, we will use a similar sample (1uL Pseudomonas aeruginosa PA14 cell extract) as in the General Tutorial, measured on the same machine, a Bruker maxisHD qTOF operated in ESI-(+) mode with auto-MS/MS but without chromatographic separation.
We load the file from the CluMSIDdata
package:
The extraction of spectra works the same way as with LC-MS/MS data:
Merging of redundant spectra is less straightforward when retention time is not available. Depending on the MS/MS method it can be next to impossible to decide whether two spectra with the same precursor m/z and similar fragmentation patterns derive from the same analyte or from two different but structurally similar ones.
In this example, we would like to merge spectra with identical
precursor ions only if they were recorded one right after another. We
can do so by setting rt_tolerance
to 1 second:
We see that we have hardly reduced the number of spectra in the list.
If we would decide to merge all spectra with identical precursor
m/z from the entire run, we could do so by setting
rt_tolerance
to the duration of the run, in this case
approx. 250 seconds:
The resulting number of spectra is drastically lower but the danger of merging spectra that do not actually derive from the same analyte is also very big.
In this very explorative example, we skip the integration of previous knowledge on feature identities and generate a distance matrix right away:
Starting from this distance matrix, we can use all the data
exploration functions that CluMSID
offers. In this example
workflow, we look at a cluster dendrogram:
It is directly obvious that we have some spectra that are nearly identical and thus most likely derive from the same analyte, e.g. the many spectra with a precursor m/z of 270.19. But we still see nice clustering of similar spectra with different precursor m/z, e.g. the huge gray cluster that contains a lot of different alkylquinolone type metabolites (see General Tutorial).
In conclusion, CluMSID is very useful to provide an overview of spectral similarities within DI-MS/MS runs but wherever annotation is in the focus, one should not do without the additional layer of information created by chromatographic separation.
sessionInfo()
#> R version 4.4.1 (2024-06-14)
#> Platform: x86_64-pc-linux-gnu
#> Running under: Ubuntu 24.04.1 LTS
#>
#> Matrix products: default
#> BLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3
#> LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.26.so; LAPACK version 3.12.0
#>
#> locale:
#> [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
#> [3] LC_TIME=en_US.UTF-8 LC_COLLATE=C
#> [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
#> [7] LC_PAPER=en_US.UTF-8 LC_NAME=C
#> [9] LC_ADDRESS=C LC_TELEPHONE=C
#> [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
#>
#> time zone: Etc/UTC
#> tzcode source: system (glibc)
#>
#> attached base packages:
#> [1] stats graphics grDevices utils datasets methods base
#>
#> other attached packages:
#> [1] CluMSIDdata_1.21.0 CluMSID_1.23.0 rmarkdown_2.28
#>
#> loaded via a namespace (and not attached):
#> [1] bitops_1.0-9 rlang_1.1.4
#> [3] magrittr_2.0.3 clue_0.3-65
#> [5] matrixStats_1.4.1 compiler_4.4.1
#> [7] vctrs_0.6.5 reshape2_1.4.4
#> [9] stringr_1.5.1 ProtGenerics_1.38.0
#> [11] pkgconfig_2.0.3 crayon_1.5.3
#> [13] fastmap_1.2.0 XVector_0.46.0
#> [15] caTools_1.18.3 utf8_1.2.4
#> [17] UCSC.utils_1.2.0 preprocessCore_1.68.0
#> [19] network_1.18.2 purrr_1.0.2
#> [21] xfun_0.48 MultiAssayExperiment_1.33.0
#> [23] zlibbioc_1.52.0 cachem_1.1.0
#> [25] GenomeInfoDb_1.43.0 jsonlite_1.8.9
#> [27] highr_0.11 DelayedArray_0.33.1
#> [29] BiocParallel_1.41.0 parallel_4.4.1
#> [31] cluster_2.1.6 R6_2.5.1
#> [33] bslib_0.8.0 stringi_1.8.4
#> [35] RColorBrewer_1.1-3 limma_3.63.0
#> [37] GGally_2.2.1 GenomicRanges_1.59.0
#> [39] jquerylib_0.1.4 iterators_1.0.14
#> [41] Rcpp_1.0.13 SummarizedExperiment_1.36.0
#> [43] knitr_1.48 IRanges_2.41.0
#> [45] Matrix_1.7-1 igraph_2.1.1
#> [47] tidyselect_1.2.1 abind_1.4-8
#> [49] yaml_2.3.10 gplots_3.2.0
#> [51] doParallel_1.0.17 codetools_0.2-20
#> [53] affy_1.85.0 lattice_0.22-6
#> [55] tibble_3.2.1 plyr_1.8.9
#> [57] Biobase_2.67.0 coda_0.19-4.1
#> [59] evaluate_1.0.1 ggstats_0.7.0
#> [61] pillar_1.9.0 affyio_1.77.0
#> [63] BiocManager_1.30.25 MatrixGenerics_1.19.0
#> [65] KernSmooth_2.23-24 foreach_1.5.2
#> [67] stats4_4.4.1 plotly_4.10.4
#> [69] MSnbase_2.33.0 MALDIquant_1.22.3
#> [71] ncdf4_1.23 generics_0.1.3
#> [73] dbscan_1.2-0 S4Vectors_0.44.0
#> [75] ggplot2_3.5.1 munsell_0.5.1
#> [77] scales_1.3.0 gtools_3.9.5
#> [79] glue_1.8.0 lazyeval_0.2.2
#> [81] maketools_1.3.1 tools_4.4.1
#> [83] data.table_1.16.2 mzID_1.45.0
#> [85] sys_3.4.3 QFeatures_1.16.0
#> [87] vsn_3.74.0 mzR_2.41.0
#> [89] XML_3.99-0.17 buildtools_1.0.0
#> [91] grid_4.4.1 impute_1.81.0
#> [93] ape_5.8 tidyr_1.3.1
#> [95] MsCoreUtils_1.19.0 colorspace_2.1-1
#> [97] nlme_3.1-166 GenomeInfoDbData_1.2.13
#> [99] PSMatch_1.10.0 cli_3.6.3
#> [101] fansi_1.0.6 viridisLite_0.4.2
#> [103] S4Arrays_1.6.0 dplyr_1.1.4
#> [105] AnnotationFilter_1.31.0 pcaMethods_1.99.0
#> [107] gtable_0.3.6 sass_0.4.9
#> [109] digest_0.6.37 BiocGenerics_0.53.0
#> [111] SparseArray_1.6.0 htmlwidgets_1.6.4
#> [113] sna_2.8 htmltools_0.5.8.1
#> [115] lifecycle_1.0.4 httr_1.4.7
#> [117] statmod_1.5.0 statnet.common_4.10.0
#> [119] MASS_7.3-61