From b4564972f032181162f78afaa72559a3a7833041 Mon Sep 17 00:00:00 2001 From: Guitton Yann Date: Thu, 20 Mar 2025 12:15:33 +0100 Subject: [PATCH 01/29] Update small text editing tutorial.md --- .../metabolomics/tutorials/gcms/tutorial.md | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/topics/metabolomics/tutorials/gcms/tutorial.md b/topics/metabolomics/tutorials/gcms/tutorial.md index a3c92ff4ef8acb..0b62e996eda2d4 100644 --- a/topics/metabolomics/tutorials/gcms/tutorial.md +++ b/topics/metabolomics/tutorials/gcms/tutorial.md @@ -4,27 +4,30 @@ draft: true title: 'Mass spectrometry : GC-MS analysis with metaMS package' level: Introductory -zenodo_link : 'https://zenodo.org/record/3244991' +zenodo_link : 'https://zenodo.org/record/3631074' questions : - - What are the main steps of GC-MS datas processing for metabolomic analysis ? - - How te be able to annotate the maximum of unknowns using Galaxy ? + - What are the main steps of untargeted GC-MS data processing for metabolomic analysis? + - How to conduct metabolomic GC-MS data analysis from preprocessing to annotation using Galaxy? objectives : - To be sure you have already comprehend the diversity of MS pre-processing analysis. - To learn the principal functions of metaMS package through Galaxy. - - To evaluate the potential of this new GC-MS workflow for GC-MS metabolomic analysis. + - To evaluate the potential of a workflow approach and available Galaxy tools when dealing with GC-MS metabolomic analysis. time_estimation : 2H key_points : - - Have a good file containing all your peaks during the first stopover - - Find all your unknowns in your datas - - Find your stanards if you have some + - To process untargeted GC-MS metabolomic data preprocessing, you need a large variety of steps and tools. + - Although main steps are standard, various ways to combine and to set parameters for tools exist, depending on your data. + - Resources are available in Galaxy, but do not forget that you need appropriate knowledge to perform a relevant analysis. requirements : - type: "internal" topic_name: metabolomics - tutorials: - - lcms contributors : - jsaintvanne - + - yguitton + - melpetera + - workflow4metabolomics + editing: [] + funding: + - elixir-europe --- From 46e7846d1d081c75f9dabc5c40ec9a20bacce9c1 Mon Sep 17 00:00:00 2001 From: Guitton Yann Date: Thu, 20 Mar 2025 15:08:45 +0100 Subject: [PATCH 02/29] Update tutorial.bib with generic citations on metabolomics remove LCMS ones --- .../metabolomics/tutorials/gcms/tutorial.bib | 95 ++++++------------- 1 file changed, 29 insertions(+), 66 deletions(-) diff --git a/topics/metabolomics/tutorials/gcms/tutorial.bib b/topics/metabolomics/tutorials/gcms/tutorial.bib index 43c3e6ebf1b6c7..d1540d26c1fd72 100644 --- a/topics/metabolomics/tutorials/gcms/tutorial.bib +++ b/topics/metabolomics/tutorials/gcms/tutorial.bib @@ -24,48 +24,39 @@ @article{Wehrens2014 journal = {Journal of Chromatography B} } -@article{Stein1994, - doi = {10.1016/1044-0305(94)87009-8}, - url = {https://doi.org/10.1016/1044-0305(94)87009-8}, - year = {1994}, - month = aug, - publisher = {Journal of the American Society for Mass Spectrometry}, - volume = {5}, - number = {9}, - pages = {859-866}, - author = {Stephen E. Stein and Donald R. Scott}, - title = {Optimization and testing of mass spectral library search algorithms for compound identification}, - journal = {Journal of the American Society for Mass Spectrometry} +@article{Stanstrup2019, +author = {Stanstrup, Jan and Broeckling, Corey and Helmus, Rick and Hoffmann, Nils and Math{\'{e}}, Ewy and Naake, Thomas and Nicolotti, Luca and Peters, Kristian and Rainer, Johannes and Salek, Reza and Schulze, Tobias and Schymanski, Emma and Stravs, Michael and Th{\'{e}}venot, Etienne and Treutler, Hendrik and Weber, Ralf and Willighagen, Egon and Witting, Michael and Neumann, Steffen}, +doi = {10.3390/metabo9100200}, +issn = {2218-1989}, +journal = {Metabolites}, +keywords = {Bioconductor,CRAN,Compound identification,Data integration,Feature selection,Lipidomics,Mass spectrometry,Metabolite networks,Metabolomics,NMR spectroscopy,R,Signal processing,Statistical data analysis}, +month = {sep}, +number = {10}, +pages = {200}, +title = {{The metaRbolomics Toolbox in Bioconductor and beyond}}, +url = {https://www.mdpi.com/2218-1989/9/10/200}, +volume = {9}, +year = {2019} } -@article{Stein1999, - doi = {10.1016/S1044-0305(99)00047-1}, - url = {https://doi.org/10.1016/S1044-0305(99)00047-1}, - year = {1999}, - month = aug, - publisher = {Journal of the American Society for Mass Spectrometry}, - volume = {10}, - pages = {770-781}, - author = {Stephen E. Stein}, - title = {An integrated method for spectrum extraction and compound identification from gas chromatography/mass spectrometry data}, - journal = {Journal of the American Society for Mass Spectrometry} +@article{Misra2021, +author = {Misra, Biswapriya B.}, +doi = {10.1007/s11306-021-01796-1}, +isbn = {0123456789}, +issn = {1573-3882}, +journal = {Metabolomics}, +keywords = {Annotation,Database,In silico,Metabolite,Metabolomics,Program,Recourse,Software,Tool}, +month = {may}, +number = {5}, +pages = {49}, +pmid = {33977389}, +publisher = {Springer US}, +title = {{New software tools, databases, and resources in metabolomics: updates from 2020}}, +url = {https://doi.org/10.1007/s11306-021-01796-1 https://link.springer.com/10.1007/s11306-021-01796-1}, +volume = {17}, +year = {2021} } -@article{Thvenot2015, - doi = {10.1021/acs.jproteome.5b00354}, - url = {https://doi.org/10.1021/acs.jproteome.5b00354}, - year = {2015}, - month = jul, - publisher = {American Chemical Society ({ACS})}, - volume = {14}, - number = {8}, - pages = {3322--3335}, - author = {Etienne A. Th{\'{e}}venot and Aur{\'{e}}lie Roux and Ying Xu and Eric Ezan and Christophe Junot}, - title = {Analysis of the Human Adult Urinary Metabolome Variations with Age, Body Mass Index, and Gender by Implementing a Comprehensive Workflow for Univariate and {OPLS} Statistical Analyses}, - journal = {Journal of Proteome Research} -} - - @article{Giacomoni2014, doi = {10.1093/bioinformatics/btu813}, url = {https://doi.org/10.1093/bioinformatics/btu813}, @@ -80,7 +71,6 @@ @article{Giacomoni2014 journal = {Bioinformatics} } - @article{Guitton2017, doi = {10.1016/j.biocel.2017.07.002}, url = {https://doi.org/10.1016/j.biocel.2017.07.002}, @@ -117,21 +107,6 @@ @misc{CAMERA year = {2017} } -@article{Tautenhahn2008, - author="Tautenhahn, Ralf and B{\"o}ttcher, Christoph and Neumann, Steffen", - title="Highly sensitive feature detection for high resolution LC/MS", - journal="BMC Bioinformatics", - year="2008", - month="Nov", - day="28", - volume="9", - number="1", - pages="504", - abstract="Liquid chromatography coupled to mass spectrometry (LC/MS) is an important analytical technology for e.g. metabolomics experiments. Determining the boundaries, centres and intensities of the two-dimensional signals in the LC/MS raw data is called feature detection. For the subsequent analysis of complex samples such as plant extracts, which may contain hundreds of compounds, corresponding to thousands of features -- a reliable feature detection is mandatory.",issn="1471-2105", - doi="10.1186/1471-2105-9-504", - url="https://doi.org/10.1186/1471-2105-9-504" -} - @article{Kopka2005, doi = {10.1093/bioinformatics/bti236}, url = {http://gmd.mpimp-golm.mpg.de/}, @@ -143,15 +118,3 @@ @article{Kopka2005 title = {GMD@CSB.DB: the Golm Metabolome Database}, journal = {Bioinformatics} } - -@article{Horai2010, -author = {Horai Hisayuki and Arita Masanori and Kanaya Shigehiko and Nihei Yoshito and Ikeda Tasuku and Suwa Kazuhiro and Ojima Yuya and Tanaka Kenichi and Tanaka Satoshi and Aoshima Ken and Oda Yoshiya and Kakazu Yuji and Kusano Miyako and Tohge Takayuki and Matsuda Fumio and Sawada Yuji and Hirai Masami Yokota and Nakanishi Hiroki and Ikeda Kazutaka and Akimoto Naoshige and Maoka Takashi and Takahashi Hiroki and Ara Takeshi and Sakurai Nozomu and Suzuki Hideyuki and Shibata Daisuke and Neumann Steffen and Iida Takashi and Tanaka Ken and Funatsu Kimito and Matsuura Fumito and Soga Tomoyoshi and Taguchi Ryo and Saito Kazuki and Nishioka Takaaki}, -title = {MassBank: a public repository for sharing mass spectral data for life sciences}, -journal = {Journal of Mass Spectrometry}, -volume = {45}, -pages = {703-714}, -doi = {10.1002/jms.1777}, -url = {https://massbank.eu/MassBank/Search}, -year = {2010} -} - From 34d38747c49863a1518983484c1634cf0ab24c93 Mon Sep 17 00:00:00 2001 From: Guitton Yann Date: Thu, 20 Mar 2025 16:06:24 +0100 Subject: [PATCH 03/29] Update tutorial.md add section from GCMS --- .../metabolomics/tutorials/gcms/tutorial.md | 118 ++++++++++++++++-- 1 file changed, 107 insertions(+), 11 deletions(-) diff --git a/topics/metabolomics/tutorials/gcms/tutorial.md b/topics/metabolomics/tutorials/gcms/tutorial.md index 0b62e996eda2d4..5985b5a7ca416d 100644 --- a/topics/metabolomics/tutorials/gcms/tutorial.md +++ b/topics/metabolomics/tutorials/gcms/tutorial.md @@ -6,11 +6,11 @@ title: 'Mass spectrometry : GC-MS analysis with metaMS package' level: Introductory zenodo_link : 'https://zenodo.org/record/3631074' questions : - - What are the main steps of untargeted GC-MS data processing for metabolomic analysis? + - What are the main steps for gas chromatography-mass spectrometry (GC-MS) data processing for untargeted metabolomic analysis? - How to conduct metabolomic GC-MS data analysis from preprocessing to annotation using Galaxy? objectives : - To be sure you have already comprehend the diversity of MS pre-processing analysis. - - To learn the principal functions of metaMS package through Galaxy. + - To learn the principal functions of metaMS package for GC-MS data processing through Galaxy. - To evaluate the potential of a workflow approach and available Galaxy tools when dealing with GC-MS metabolomic analysis. time_estimation : 2H key_points : @@ -28,13 +28,38 @@ contributors : editing: [] funding: - elixir-europe + --- -A lot of packages are available for the analysis of GC-MS or LC-MS data. Typically, hardware vendors provide software that is optimized for the instrument and allow a direct interaction of the lab scientist with the data. Some other open-source alternatives such as **XCMS** are also able to be integrated easily in web interfaces, allowing large numbers of files to be processed simultaneously. Because of the generality of packages like **XCMS**, several other packages have been developed to use the functionality of **XCMS** for optimal performance in a particular context. Package **metaMS** does so for the field of untargeted metabolomics, focuses on the GC-MS analysis during this tutorial. One of the goals **metaMS** was to set up a simple system with few user-settable parameters, capable of handling the vast majority of untargeted metabolomics experiments. +You may already know that there are different types of *-omic* sciences; out of these, metabolomics is most closely related to phenotypes. +Metabolomics involves the study of different types of matrices, such as blood, urine, tissues, in various organisms including plants. It focuses on studying the very small molecules +which are called *metabolites*, to better understand matters linked to the metabolism. However, studying metabolites is not a piece of cake +since it requires several critical steps which still have some major bottlenecks. Metabolomics is still quite a young science, and has many +kinds of specific challenges. -During this tutorial, we will learn how to process easily a test dataset from raw files to the annotation using W4M Galaxy. Datas are from {% cite Dittami2012 %} and have been used as test dataset for the development of the Galaxy wrappers. +One of the three main technologies used to perform metabolomic analysis is **Gas-Chromatography Mass Spectrometry** (GC-MS). Data analysis +for this technology requires a large variety of steps, ranging from extracting information from the raw data, to statistical analysis +and annotation. To be able to **perform a complete GC-MS analysis** in a single environment, the [Wokflow4Metabolomics](http://workflow4metabolomics.org/) +team provides Galaxy tools dedicated to metabolomics. This tutorial explains the main steps involved in untargeted **GC-MS** data processing +for metabolomic analysis, and shows how to conduct metabolomic data analysis from preprocessing to annotation using Galaxy. +Many packages are available for the analysis of GC-MS or LC-MS data - for more details see the reviews by {% cite Stanstrup2019 %} and {% cite Misra2021 %}. In this tutorial, we focus on open-source solutions integrated within the Galaxy framework, namely **XCMS**, **metaMS**. In this tutorial, we will learn how to (1) extract features from the raw data using **XCMS** ({% cite Smith2006 %}), (2) deconvolute the detected features into spectra with **metaMS** ({% cite Wehrens2014 %}) + +To illustrate this approach, we will use data from {% cite Dittami2012 %}. Due to time constraints in processing the original dataset, a limited subset of samples was utilized to illustrate the workflow. This subset (see details bellow) demonstrates the key steps of metabolomic analysis, from pre-processing to annotation. Although the results derived from this reduced sample size may not be scientifically robust, they provide insight into essential methodological foundations of GC-MS data-processing workflow. + +> Algae samples +> +> The objectives of this study was to investigates the adaptation mechanisms of the brown algae Ectocarpus to low-salinity environments. The research focused on examining physiological tolerance and metabolic changes in freshwater and marine strains of Ectocarpus. Using transcriptomic and metabolic analyses, the authors identified significant, reversible changes occurring in the freshwater strain when exposed to seawater. Both strains exhibited similarities in gene expression under identical conditions; however, substantial differences were observed in metabolite profiles. +> The study utilized a freshwater strain of Ectocarpus and a marine strain for comparative analysis. The algae were cultured in media with varying salinities, prepared by diluting natural seawater or adding NaCl. The algae were acclimated to these conditions before extraction. +> The 6 samples used in this training were analysed by GC-MS (low resolution instrument). A marine strains raised in sea water media (2 replicats) and a Fresh Water strains raised either in 5 or 100% sea water media (2 replicats each) +> +{: .details} + +To process the GC-MS data, we use several tools. **XCMS** ({% cite Smith2006 %}) is a general package for untargeted metabolomics profiling. It can be used for any type of mass spectrometry acquisition (centroid and profile) or resolution (from low to high resolution), including FT-MS data coupled with a different kind of chromatography (liquid or gas). Because of the generality of packages like **XCMS**, several other packages have been developed to use the functionality of **XCMS** for optimal performance in a particular context. Package **metaMS** ({% cite Wehrens2014 %}) does so for the field of GC-MS untargeted metabolomics. One of the goals **metaMS** was to set up a simple system with few user-settable parameters, capable of handling untargeted metabolomics experiments. +In this tutorial we use **XCMS** to detect chromatographic peaks within our samples. Once we have detected them, they need to be deconvoluted into spectra representing chemical compounds. For that, we use **metaMS**. To normalise the retention time of deconvoluted spectra in our sample, we compute the retention index using Alkane references and **metaMS**. Finally, we identify detected spectra by aligning them with a database of known compounds. This can be achieved using **metaMS**, resulting in a table of identified compounds. + +In Galaxy other GC-MS data processing workflows are available and may be of interest for more advanced Galaxy users [Add link] > > @@ -46,18 +71,89 @@ During this tutorial, we will learn how to process easily a test dataset from ra {: .agenda} -# First steps of pre-processing using a standard XCMS workflow (mandatory) +# Data preparation and prepocessing -The first step of the workflow is the pre-processing of the raw data with **XCMS** ({% cite Smith2006 %}). -{: .text-justify} +Before we can start with the actual analysis pipeline, we first need to download and prepare our dataset. Many of the preprocessing steps can be run in parallel on individual samples. Therefore, we recommend using the Dataset collections in Galaxy. This can be achieved by using the dataset collection option from the beginning of your analysis when uploading your data into Galaxy. -**XCMS** {% icon tool %} is a free and open-source software dedicated to pre-processing any type of mass spectrometry acquisition files from low to high resolution, including FT-MS data coupled with different kind of chromatography (liquid or gas). This software is used worldwide by a huge community of specialists in metabolomics. -{: .text-justify} +## Import the data into Galaxy + +> Upload data +> +> 1. Create a new history for this tutorial +> +> {% snippet faqs/galaxy/histories_create_new.md %} +> +> 2. Import the files from [Zenodo]({{ page.zenodo_link }}) into a collection: +> +> ``` +> https://zenodo.org/record/7890956/files/8_qc_no_dil_milliq.raw +> https://zenodo.org/record/7890956/files/21_qc_no_dil_milliq.raw +> https://zenodo.org/record/7890956/files/29_qc_no_dil_milliq.raw +> ``` +> +> {% snippet faqs/galaxy/datasets_import_via_link.md collection=true format="mzml" collection_name="input" renaming=false %} +> +> 3. Make sure your data is in a **collection**. You can always manually create the collection from separate files: +> +> {% snippet faqs/galaxy/collections_build_list.md %} +> +> In the further steps, this dataset collection will be referred to as `input` (and we recommend naming this collection like that to avoid confusion). +> +> 4. Import the following extra files from [Zenodo]({{ page.zenodo_link }}): +> +> ``` +> https://zenodo.org/record/7890956/files/reference_alkanes.csv +> https://zenodo.org/record/7890956/files/reference_spectral_library.msp +> https://zenodo.org/record/7890956/files/sample_metadata.tsv +> ``` +> +> {% snippet faqs/galaxy/datasets_import_via_link.md %} +> +> {% snippet faqs/galaxy/datasets_import_from_data_library.md %} +> +> Please pay attention to the format of all uploaded files, and make sure they were correctly imported. +> +> {% snippet faqs/galaxy/datatypes_understanding_datatypes.md %} +> +> > The extra files +> > +> > The three additional files contain the **reference alkanes**, the **reference spectral library**, and the **sample metadata**. Those files are auxiliary inputs used in the data processing and contain either extra information about the samples or serve as reference data for indexing and identification. +> > +> > The **list of alkanes** (`.tsv` or `.csv`) with retention times and carbon number or retention index is used to compute the retention index of the deconvoluted peaks. The alkanes should be measured in the same batch as the input sample collection. +> > +> > The **reference spectral library** (`.msp`) is used for the identification of spectra. It contains the recorded and annotated mass spectra of chemical standards, ideally from a similar instrument. The unknown spectra which can be detected in the sample can then be confirmed via comparison with this library. The specific library is an in-house library of metabolite standards extracted with **metaMS** . +> > +> > The **sample metadata** (`.csv` or `.tsv`) is a table containing information about our samples. In particular, the tabular file contains for each sample its associated sample name, class (SW, FWS, etc.). It is possible to add more columns to include additional details about the samples (e.g : batch number, injection order...). +> {: .comment} +> +{: .hands_on} + +As a result of this step, we should have in our history a green Dataset collection with all 6 samples `.mzData` files as well as three separate files with reference alkanes, reference spectral library, and sample metadata. + +## Create the XCMS object + +The first part of data processing is using the **XCMS** tool to detect peaks in the MS signal. For that, we first need to take the `.mzML` files and create a format usable by the **XCMS** tool. {% tool [MSnbase readMSData](toolshed.g2.bx.psu.edu/repos/lecorguille/msnbase_readmsdata/msnbase_readmsdata/2.16.1+galaxy0) %} ({% cite gatto2012msnbase %}. {% cite gatto2020msnbase %}) takes as input our files and prepares `RData` files for the first **XCMS** step. + +> Create the XCMS object +> +> 1. {% tool [MSnbase readMSData](toolshed.g2.bx.psu.edu/repos/lecorguille/msnbase_readmsdata/msnbase_readmsdata/2.16.1+galaxy0) %} with the following parameters: +> - {% icon param-collection %} *"File(s) from your history containing your chromatograms"*: `input.mzML` (output of **msconvert** {% icon tool %}) +> +> {% snippet faqs/galaxy/tools_select_collection.md %} +> +> > Output - `input.raw.RData` +> > +> > Collection of `rdata.msnbase.raw` files. `Rdata` file that is necessary in the next step of the workflow. These serve for an internal R representation of **XCMS** objects needed in the further steps. +> {: .comment} +{: .hands_on} +> > +> > +# First steps of pre-processing using a standard XCMS workflow (mandatory) -This software is based on different algorithms that have been published, and is provided and maintained using R software. +The first step of the workflow is the pre-processing of the raw GC-MS data with **XCMS** ({% cite Smith2006 %}). {: .text-justify} -**MSnbase readMSData** {% icon tool %} function, prior to **XCMS**, is able to read files with open format as `mzXML`, `mzML`, `mzData` and `netCDF`, which are independent of the constructors' formats. The **XCMS** package itself is composed of R functions able to extract, filter, align and fill gap, with the possibility to annotate isotopes, adducts and fragments (using the R package CAMERA, {% cite CAMERA %}). This set of functions gives modularity, and thus is particularly well adapted to define workflows, one of the key points of Galaxy. +**MSnbase readMSData** {% icon tool %} function, prior to **XCMS**, is able to read files with open format as `mzXML`, `mzML`, `mzData` and `netCDF`, which are independent of the constructors' formats. Working with open MS data format allows users to us tools developped outside of the MS This set of functions gives modularity, and thus is particularly well adapted to define workflows, one of the key points of Galaxy. {: .text-justify} First step of this tutorial is to download the data test. As describe in the introduction, we will use datas from {% cite Dittami2012 %}. We will only process on a subset of their data. From f9dd60ab1efd117d1e5df1dbe0892cf6260335dd Mon Sep 17 00:00:00 2001 From: Guitton Yann Date: Thu, 20 Mar 2025 16:10:12 +0100 Subject: [PATCH 04/29] Update tutorial.md remove space --- topics/metabolomics/tutorials/gcms/tutorial.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/topics/metabolomics/tutorials/gcms/tutorial.md b/topics/metabolomics/tutorials/gcms/tutorial.md index 5985b5a7ca416d..809b473047e5be 100644 --- a/topics/metabolomics/tutorials/gcms/tutorial.md +++ b/topics/metabolomics/tutorials/gcms/tutorial.md @@ -4,23 +4,23 @@ draft: true title: 'Mass spectrometry : GC-MS analysis with metaMS package' level: Introductory -zenodo_link : 'https://zenodo.org/record/3631074' -questions : +zenodo_link: 'https://zenodo.org/record/3631074' +questions: - What are the main steps for gas chromatography-mass spectrometry (GC-MS) data processing for untargeted metabolomic analysis? - How to conduct metabolomic GC-MS data analysis from preprocessing to annotation using Galaxy? -objectives : +objectives: - To be sure you have already comprehend the diversity of MS pre-processing analysis. - To learn the principal functions of metaMS package for GC-MS data processing through Galaxy. - To evaluate the potential of a workflow approach and available Galaxy tools when dealing with GC-MS metabolomic analysis. -time_estimation : 2H -key_points : +time_estimation: 2H +key_points: - To process untargeted GC-MS metabolomic data preprocessing, you need a large variety of steps and tools. - Although main steps are standard, various ways to combine and to set parameters for tools exist, depending on your data. - Resources are available in Galaxy, but do not forget that you need appropriate knowledge to perform a relevant analysis. -requirements : +requirements: - type: "internal" topic_name: metabolomics -contributors : +contributors: - jsaintvanne - yguitton - melpetera From 43c7d2e990c4f759453a9ebba40fb93ad7103b21 Mon Sep 17 00:00:00 2001 From: Guitton Yann Date: Thu, 20 Mar 2025 16:10:39 +0100 Subject: [PATCH 05/29] Update tutorial.md --- topics/metabolomics/tutorials/gcms/tutorial.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/topics/metabolomics/tutorials/gcms/tutorial.md b/topics/metabolomics/tutorials/gcms/tutorial.md index 809b473047e5be..757d058e591082 100644 --- a/topics/metabolomics/tutorials/gcms/tutorial.md +++ b/topics/metabolomics/tutorials/gcms/tutorial.md @@ -25,8 +25,7 @@ contributors: - yguitton - melpetera - workflow4metabolomics - editing: [] - funding: + funding: - elixir-europe --- From 00e64e38fcc4e82208c2eb66817ac6f6278fcad2 Mon Sep 17 00:00:00 2001 From: Guitton Yann Date: Thu, 20 Mar 2025 16:14:44 +0100 Subject: [PATCH 06/29] Update tutorial.md --- .../metabolomics/tutorials/gcms/tutorial.md | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/topics/metabolomics/tutorials/gcms/tutorial.md b/topics/metabolomics/tutorials/gcms/tutorial.md index 757d058e591082..3a367b68027447 100644 --- a/topics/metabolomics/tutorials/gcms/tutorial.md +++ b/topics/metabolomics/tutorials/gcms/tutorial.md @@ -6,27 +6,27 @@ title: 'Mass spectrometry : GC-MS analysis with metaMS package' level: Introductory zenodo_link: 'https://zenodo.org/record/3631074' questions: - - What are the main steps for gas chromatography-mass spectrometry (GC-MS) data processing for untargeted metabolomic analysis? - - How to conduct metabolomic GC-MS data analysis from preprocessing to annotation using Galaxy? +- What are the main steps for gas chromatography-mass spectrometry (GC-MS) data processing for untargeted metabolomic analysis? +- How to conduct metabolomic GC-MS data analysis from preprocessing to annotation using Galaxy? objectives: - - To be sure you have already comprehend the diversity of MS pre-processing analysis. - - To learn the principal functions of metaMS package for GC-MS data processing through Galaxy. - - To evaluate the potential of a workflow approach and available Galaxy tools when dealing with GC-MS metabolomic analysis. +- To be sure you have already comprehend the diversity of MS pre-processing analysis. +- To learn the principal functions of metaMS package for GC-MS data processing through Galaxy. +- To evaluate the potential of a workflow approach and available Galaxy tools when dealing with GC-MS metabolomic analysis. time_estimation: 2H key_points: - - To process untargeted GC-MS metabolomic data preprocessing, you need a large variety of steps and tools. - - Although main steps are standard, various ways to combine and to set parameters for tools exist, depending on your data. - - Resources are available in Galaxy, but do not forget that you need appropriate knowledge to perform a relevant analysis. +- To process untargeted GC-MS metabolomic data preprocessing, you need a large variety of steps and tools. +- Although main steps are standard, various ways to combine and to set parameters for tools exist, depending on your data. +- Resources are available in Galaxy, but do not forget that you need appropriate knowledge to perform a relevant analysis. requirements: - - type: "internal" - topic_name: metabolomics +- type: "internal" + topic_name: metabolomics contributors: - jsaintvanne - yguitton - melpetera - workflow4metabolomics - funding: - - elixir-europe +funding: +- elixir-europe --- From 110d042334a5c10610d6481dd1ddb36e90f7ef24 Mon Sep 17 00:00:00 2001 From: Guitton Yann Date: Thu, 20 Mar 2025 17:31:24 +0100 Subject: [PATCH 07/29] Update tutorial.md --- .../metabolomics/tutorials/gcms/tutorial.md | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/topics/metabolomics/tutorials/gcms/tutorial.md b/topics/metabolomics/tutorials/gcms/tutorial.md index 3a367b68027447..2ac55cbbfce495 100644 --- a/topics/metabolomics/tutorials/gcms/tutorial.md +++ b/topics/metabolomics/tutorials/gcms/tutorial.md @@ -30,7 +30,6 @@ funding: --- - You may already know that there are different types of *-omic* sciences; out of these, metabolomics is most closely related to phenotypes. Metabolomics involves the study of different types of matrices, such as blood, urine, tissues, in various organisms including plants. It focuses on studying the very small molecules which are called *metabolites*, to better understand matters linked to the metabolism. However, studying metabolites is not a piece of cake @@ -39,26 +38,29 @@ kinds of specific challenges. One of the three main technologies used to perform metabolomic analysis is **Gas-Chromatography Mass Spectrometry** (GC-MS). Data analysis for this technology requires a large variety of steps, ranging from extracting information from the raw data, to statistical analysis -and annotation. To be able to **perform a complete GC-MS analysis** in a single environment, the [Wokflow4Metabolomics](http://workflow4metabolomics.org/) -team provides Galaxy tools dedicated to metabolomics. This tutorial explains the main steps involved in untargeted **GC-MS** data processing -for metabolomic analysis, and shows how to conduct metabolomic data analysis from preprocessing to annotation using Galaxy. +and annotation. Many packages in R/Python are available for the analysis of GC-MS or LC-MS data - for more details see the reviews by {% cite Stanstrup2019 %} and {% cite Misra2021 %}. -Many packages are available for the analysis of GC-MS or LC-MS data - for more details see the reviews by {% cite Stanstrup2019 %} and {% cite Misra2021 %}. In this tutorial, we focus on open-source solutions integrated within the Galaxy framework, namely **XCMS**, **metaMS**. In this tutorial, we will learn how to (1) extract features from the raw data using **XCMS** ({% cite Smith2006 %}), (2) deconvolute the detected features into spectra with **metaMS** ({% cite Wehrens2014 %}) +This tutorial explains the main steps involved in untargeted **GC-MS** data processing, to do so we focus on some open-source solutions integrated within the Galaxy framework, namely **XCMS**, **metaMS**. The selected tools and functionnalities only covers a small portion of available tools but allow to **perform a complete GC-MS analysis** in a single environment. +In this tutorial, we will learn how to (1) extract features from the raw data using **XCMS** ({% cite Smith2006 %}), (2) deconvolute the detected features into spectra with **metaMS** ({% cite Wehrens2014 %}). To illustrate this approach, we will use data from {% cite Dittami2012 %}. Due to time constraints in processing the original dataset, a limited subset of samples was utilized to illustrate the workflow. This subset (see details bellow) demonstrates the key steps of metabolomic analysis, from pre-processing to annotation. Although the results derived from this reduced sample size may not be scientifically robust, they provide insight into essential methodological foundations of GC-MS data-processing workflow. > Algae samples > > The objectives of this study was to investigates the adaptation mechanisms of the brown algae Ectocarpus to low-salinity environments. The research focused on examining physiological tolerance and metabolic changes in freshwater and marine strains of Ectocarpus. Using transcriptomic and metabolic analyses, the authors identified significant, reversible changes occurring in the freshwater strain when exposed to seawater. Both strains exhibited similarities in gene expression under identical conditions; however, substantial differences were observed in metabolite profiles. -> The study utilized a freshwater strain of Ectocarpus and a marine strain for comparative analysis. The algae were cultured in media with varying salinities, prepared by diluting natural seawater or adding NaCl. The algae were acclimated to these conditions before extraction. -> The 6 samples used in this training were analysed by GC-MS (low resolution instrument). A marine strains raised in sea water media (2 replicats) and a Fresh Water strains raised either in 5 or 100% sea water media (2 replicats each) +> +> The study utilized a **freshwater strain** of Ectocarpus and a **marine strain** for comparative analysis. The algae were cultured in media with varying salinities, prepared by diluting natural seawater or adding NaCl. The algae were acclimated to these conditions before extraction. +> +> The 6 samples used in this training were analysed by GC-MS (low resolution instrument). A marine strains raised in sea water media (2 replicats) and a Fresh Water strains raised either in 5 or 100% sea water media (2 replicats each). [Link](https://zenodo.org/record/3631074/) > {: .details} -To process the GC-MS data, we use several tools. **XCMS** ({% cite Smith2006 %}) is a general package for untargeted metabolomics profiling. It can be used for any type of mass spectrometry acquisition (centroid and profile) or resolution (from low to high resolution), including FT-MS data coupled with a different kind of chromatography (liquid or gas). Because of the generality of packages like **XCMS**, several other packages have been developed to use the functionality of **XCMS** for optimal performance in a particular context. Package **metaMS** ({% cite Wehrens2014 %}) does so for the field of GC-MS untargeted metabolomics. One of the goals **metaMS** was to set up a simple system with few user-settable parameters, capable of handling untargeted metabolomics experiments. -In this tutorial we use **XCMS** to detect chromatographic peaks within our samples. Once we have detected them, they need to be deconvoluted into spectra representing chemical compounds. For that, we use **metaMS**. To normalise the retention time of deconvoluted spectra in our sample, we compute the retention index using Alkane references and **metaMS**. Finally, we identify detected spectra by aligning them with a database of known compounds. This can be achieved using **metaMS**, resulting in a table of identified compounds. +To process the GC-MS data, we use several tools. **XCMS** ({% cite Smith2006 %}) is a general R package for untargeted metabolomics profiling. It can be used for any type of mass spectrometry acquisition (centroid and profile) or resolution (from low to high resolution), including FT-MS data coupled with a different kind of chromatography (liquid or gas). Because of the generality of packages like **XCMS**, several other packages have been developed to use the functionality of **XCMS** for optimal performance in a particular context. The R package **metaMS** ({% cite Wehrens2014 %}) does so for the field of GC-MS untargeted metabolomics. One of the goals **metaMS** was to set up a simple system with few user-settable parameters, capable of handling untargeted metabolomics experiments. +In this tutorial we use **XCMS** to detect chromatographic peaks within our samples. Once we have detected them, they need to be deconvoluted into mass spectra representing chemical compounds. For that, we use **metaMS** functions. To normalise the retention time of deconvoluted spectra in our sample, we compute the retention index using Alkane references and a dedicated function of **metaMS**. Finally, we identify detected spectra by aligning them with a database of known compounds. This can be achieved using in-house build database in the common .msp format (used in the NIST MS search program for example), resulting in a table of identified compounds. -In Galaxy other GC-MS data processing workflows are available and may be of interest for more advanced Galaxy users [Add link] +> +> - In Galaxy other GC-MS data processing workflows are available and may be of interest for more advanced Galaxy users [Add link] +{: .comment} > > @@ -85,12 +87,15 @@ Before we can start with the actual analysis pipeline, we first need to download > 2. Import the files from [Zenodo]({{ page.zenodo_link }}) into a collection: > > ``` -> https://zenodo.org/record/7890956/files/8_qc_no_dil_milliq.raw -> https://zenodo.org/record/7890956/files/21_qc_no_dil_milliq.raw -> https://zenodo.org/record/7890956/files/29_qc_no_dil_milliq.raw +> https://zenodo.org/record/3631074/files/alg11.mzData +> https://zenodo.org/record/3631074/files/alg2.mzData +> https://zenodo.org/record/3631074/files/alg3.mzData +> https://zenodo.org/record/3631074/files/alg7.mzData +> https://zenodo.org/record/3631074/files/alg8.mzData +> https://zenodo.org/record/3631074/files/alg9.mzData > ``` > -> {% snippet faqs/galaxy/datasets_import_via_link.md collection=true format="mzml" collection_name="input" renaming=false %} +> {% snippet faqs/galaxy/datasets_import_via_link.md collection=true format="mzdata" collection_name="input" renaming=false %} > > 3. Make sure your data is in a **collection**. You can always manually create the collection from separate files: > @@ -101,26 +106,21 @@ Before we can start with the actual analysis pipeline, we first need to download > 4. Import the following extra files from [Zenodo]({{ page.zenodo_link }}): > > ``` -> https://zenodo.org/record/7890956/files/reference_alkanes.csv -> https://zenodo.org/record/7890956/files/reference_spectral_library.msp -> https://zenodo.org/record/7890956/files/sample_metadata.tsv +> https://zenodo.org/record/3631074/files/reference_alkanes.csv +> https://zenodo.org/record/3631074/files/W4M0004_database_small.msp +> https://zenodo.org/record/3631074/files/sampleMetadata.tsv > ``` > > {% snippet faqs/galaxy/datasets_import_via_link.md %} > -> {% snippet faqs/galaxy/datasets_import_from_data_library.md %} -> -> Please pay attention to the format of all uploaded files, and make sure they were correctly imported. -> -> {% snippet faqs/galaxy/datatypes_understanding_datatypes.md %} > > > The extra files > > -> > The three additional files contain the **reference alkanes**, the **reference spectral library**, and the **sample metadata**. Those files are auxiliary inputs used in the data processing and contain either extra information about the samples or serve as reference data for indexing and identification. +> > The three additional files contain the **reference alkanes**, the **W4M0004_database_small**, and the **sampleMetadata**. Those files are auxiliary inputs used in the data processing and contain either extra information about the samples or serve as reference data for indexing and identification. > > > > The **list of alkanes** (`.tsv` or `.csv`) with retention times and carbon number or retention index is used to compute the retention index of the deconvoluted peaks. The alkanes should be measured in the same batch as the input sample collection. > > -> > The **reference spectral library** (`.msp`) is used for the identification of spectra. It contains the recorded and annotated mass spectra of chemical standards, ideally from a similar instrument. The unknown spectra which can be detected in the sample can then be confirmed via comparison with this library. The specific library is an in-house library of metabolite standards extracted with **metaMS** . +> > The **W4M0004_database_small** (`.msp`) is a reference database used for the identification of spectra. It contains the recorded and annotated mass spectra of chemical standards, ideally from a similar instrument. The unknown spectra which can be detected in the sample can then be confirmed via comparison with this library. The specific library is an in-house library of metabolite standards extracted with **metaMS** . > > > > The **sample metadata** (`.csv` or `.tsv`) is a table containing information about our samples. In particular, the tabular file contains for each sample its associated sample name, class (SW, FWS, etc.). It is possible to add more columns to include additional details about the samples (e.g : batch number, injection order...). > {: .comment} From 5010e1cb0d5b714d7b4f4ece23b0e857f39d5b36 Mon Sep 17 00:00:00 2001 From: Guitton Yann Date: Fri, 21 Mar 2025 12:03:27 +0100 Subject: [PATCH 08/29] Update tutorial.md with the 2 options div --- .../metabolomics/tutorials/gcms/tutorial.md | 334 +++++++++--------- 1 file changed, 161 insertions(+), 173 deletions(-) diff --git a/topics/metabolomics/tutorials/gcms/tutorial.md b/topics/metabolomics/tutorials/gcms/tutorial.md index 2ac55cbbfce495..2fbb5f4aab8a68 100644 --- a/topics/metabolomics/tutorials/gcms/tutorial.md +++ b/topics/metabolomics/tutorials/gcms/tutorial.md @@ -51,7 +51,7 @@ To illustrate this approach, we will use data from {% cite Dittami2012 %}. Due t > > The study utilized a **freshwater strain** of Ectocarpus and a **marine strain** for comparative analysis. The algae were cultured in media with varying salinities, prepared by diluting natural seawater or adding NaCl. The algae were acclimated to these conditions before extraction. > -> The 6 samples used in this training were analysed by GC-MS (low resolution instrument). A marine strains raised in sea water media (2 replicats) and a Fresh Water strains raised either in 5 or 100% sea water media (2 replicats each). [Link](https://zenodo.org/record/3631074/) +> The 6 samples used in this training were analysed by GC-MS (low resolution instrument). A marine strains raised in sea water media (2 replicats) and a freshwater strains raised either in 5 or 100% sea water media (2 replicats each). [Link](https://zenodo.org/record/3631074/) > {: .details} @@ -131,12 +131,16 @@ As a result of this step, we should have in our history a green Dataset collecti ## Create the XCMS object -The first part of data processing is using the **XCMS** tool to detect peaks in the MS signal. For that, we first need to take the `.mzML` files and create a format usable by the **XCMS** tool. {% tool [MSnbase readMSData](toolshed.g2.bx.psu.edu/repos/lecorguille/msnbase_readmsdata/msnbase_readmsdata/2.16.1+galaxy0) %} ({% cite gatto2012msnbase %}. {% cite gatto2020msnbase %}) takes as input our files and prepares `RData` files for the first **XCMS** step. +The first part of data processing is using the **XCMS** tool to detect peaks in the MS signal. For that, we first need to take the `.mzData` files and create a format usable by the **XCMS** tool. {% tool [MSnbase readMSData](toolshed.g2.bx.psu.edu/repos/lecorguille/msnbase_readmsdata/msnbase_readmsdata/2.16.1+galaxy0) %} ({% cite gatto2012msnbase %}. {% cite gatto2020msnbase %}) takes as input our files and prepares `RData` files for the first **XCMS** step. + +> +> **MSnbase readMSData** {% icon tool %} function, prior to **XCMS**, is able to read files with open format as `mzXML`, `mzML`, `mzData` and `netCDF`, which are independent of the constructors' formats. Working with open MS data format allows users to us tools developped outside of the MS This set of functions gives modularity, and thus is particularly well adapted to define workflows, one of the key points of Galaxy. +{: .comment} > Create the XCMS object > > 1. {% tool [MSnbase readMSData](toolshed.g2.bx.psu.edu/repos/lecorguille/msnbase_readmsdata/msnbase_readmsdata/2.16.1+galaxy0) %} with the following parameters: -> - {% icon param-collection %} *"File(s) from your history containing your chromatograms"*: `input.mzML` (output of **msconvert** {% icon tool %}) +> - {% icon param-collection %} *"File(s) from your history containing your chromatograms"*: `input` > > {% snippet faqs/galaxy/tools_select_collection.md %} > @@ -147,81 +151,52 @@ The first part of data processing is using the **XCMS** tool to detect peaks in {: .hands_on} > > > > -# First steps of pre-processing using a standard XCMS workflow (mandatory) -The first step of the workflow is the pre-processing of the raw GC-MS data with **XCMS** ({% cite Smith2006 %}). -{: .text-justify} +# Peak detection using XCMS -**MSnbase readMSData** {% icon tool %} function, prior to **XCMS**, is able to read files with open format as `mzXML`, `mzML`, `mzData` and `netCDF`, which are independent of the constructors' formats. Working with open MS data format allows users to us tools developped outside of the MS This set of functions gives modularity, and thus is particularly well adapted to define workflows, one of the key points of Galaxy. -{: .text-justify} +The first step in the workflow is to detect the peaks in our data using **XCMS**. This part, however, is covered by a [separate tutorial]({{ site.baseurl }}/topics/metabolomics/tutorials/lcms-preprocessing/tutorial.html). Although the tutorial is dedicated to LC-MS data, it can also be followed for our GC-MS data. Therefore, in this section, we do not explain this part of the workflow in detail but rather refer the reader to the dedicated tutorial. Please also pay attention to the parameter values for individual Galaxy tools, as these can differ from the referred tutorial and are adjusted to our dataset. -First step of this tutorial is to download the data test. As describe in the introduction, we will use datas from {% cite Dittami2012 %}. We will only process on a subset of their data. -So, you can **import your files directly in Galaxy from Zenodo (see hands-on below)** or download files into your computer using the following link then upload them on Galaxy: -{: .text-justify} +> Skip this step +> +> Since this step is already covered in a [separate tutorial]({{ site.baseurl }}/topics/metabolomics/tutorials/lcms-preprocessing/tutorial.html), it is possible to skip it. Instead, you can continue with [Peak deconvolution]({{ site.baseurl }}/topics/metabolomics/tutorials/gcms/tutorial.html#peak-deconvolution-metams) step using a preprocessed **XCMS** object file prepared for you. +> +> > Upload data +> > +> > 1. Create a new history for this tutorial +> > +> > {% snippet faqs/galaxy/histories_create_new.md %} +> > +> > 2. Import the following files from [Zenodo]({{ page.zenodo_link }}): +> > +> > ``` +> > https://zenodo.org/record/3631074/files/xcms_outputs +> > ``` +> > +> > {% snippet faqs/galaxy/datasets_import_via_link.md %} +> > +> > The format of uploaded file containing **XCMS** object should be `rdata.xcms.fillpeaks`. +> > +> > {% snippet faqs/galaxy/datatypes_understanding_datatypes.md %} +> > +> {: .hands_on} +> +{: .details} -[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.3631074.svg)](https://doi.org/10.5281/zenodo.3631074) +## Peak picking +The first step is to extract peaks from each of your data files independently. For this purpose, we use the _MatchedFilter_ chromatographic peak detection algorithm implemented in {% tool [xcms findChromPeaks (xcmsSet)](toolshed.g2.bx.psu.edu/repos/lecorguille/xcms_xcmsset/abims_xcms_xcmsSet/3.12.0+galaxy0) %}. -Then, to be able to pre-process our GC-MS data, we need to **start with the peakpicking of MS data**. + One Galaxy Training material already explains how to act with MS data. We encourage you to **follow this link and complete the corresponding tutorial**: [Mass spectrometry: LC-MS preprocessing with XCMS]({% link topics/metabolomics/tutorials/lcms-preprocessing/tutorial.md %}). For GC-MS analysis you **don't really need to follow all of this previous tutorial** but for a better understanding of your data, it is recommanded to try it with their test dataset. Concerning the current GC-MS tutorial, you **just have to compute the following steps and specific parameters** described in the hands-on part below (please follow parameters values to have the same results during the training). {: .text-justify} -## 1 - Import the data into Galaxy -> Data upload -> -> 1. Create a new history for this tutorial -> -> {% snippet faqs/galaxy/histories_create_new.md %} +> Peakpicking of GC-MS data with XCMS > -> 2. Import the following 6 `mzData` files into a collection named `mzData` -> - Option 1: from a shared data library (ask your instructor) -> - Option 2: from Zenodo using the URLs given below -> -> ``` -> https://zenodo.org/record/3631074/files/alg11.mzData -> https://zenodo.org/record/3631074/files/alg2.mzData -> https://zenodo.org/record/3631074/files/alg3.mzData -> https://zenodo.org/record/3631074/files/alg7.mzData -> https://zenodo.org/record/3631074/files/alg8.mzData -> https://zenodo.org/record/3631074/files/alg9.mzData -> ``` -> -> {% snippet faqs/galaxy/datasets_import_via_link.md collection=true format="mzml" collection_name="mzData" renaming=false %} -> -> {% snippet faqs/galaxy/datasets_import_from_data_library.md astype="as a Collection" %} -> -> 3. Make sure your data is in a **collection**. Make sure it is named `mzData` -> - If you forgot to select the collection option during import, you can create the collection now: -> -> {% snippet faqs/galaxy/collections_build_list.md %} -> -> 4. Import the following 2 files from Zenodo or from a shared data library (ask your instructor). -> Beware: these files must not be in a collection. -> -> ``` -> https://zenodo.org/record/3631074/files/sampleMetadata.tsv -> https://zenodo.org/record/3631074/files/W4M0004_database_small.msp -> ``` -> -> {% snippet faqs/galaxy/datasets_import_via_link.md %} -> -> {% snippet faqs/galaxy/datasets_import_from_data_library.md %} -> -> -{: .hands_on} - -## 2 - First steps using XCMS - -> First steps using a standard XCMS workflow -> -> 1. {% tool [MSnbase readMSData](toolshed.g2.bx.psu.edu/repos/lecorguille/msnbase_readmsdata/msnbase_readmsdata/2.16.1+galaxy0) %} with the following parameters: -> - {% icon param-collection %} *"File(s) from your history containing your chromatograms"*: `mzData` (Input dataset collection) -> -> 2. {% tool [xcms findChromPeaks (xcmsSet)](toolshed.g2.bx.psu.edu/repos/lecorguille/xcms_xcmsset/abims_xcms_xcmsSet/3.12.0+galaxy0) %} with the following parameters: -> - {% icon param-file %} *"RData file"*: `mzData.raw.RData` (output of the **MSnbase readMSData** {% icon tool %} job) +> 1. {% tool [xcms findChromPeaks (xcmsSet)](toolshed.g2.bx.psu.edu/repos/lecorguille/xcms_xcmsset/abims_xcms_xcmsSet/3.12.0+galaxy0) %} with the following parameters: +> - {% icon param-file %} *"RData file"*: `input.raw.RData` (output of the **MSnbase readMSData** {% icon tool %} job) > - *"Extraction method for peaks detection"*: `MatchedFilter - peak detection in chromatographic space` > - *"Full width at half maximum of matched filtration gaussian model peak"*: `5` > - *"Step size to use for profile generation"*: `0.5` @@ -236,8 +211,8 @@ Concerning the current GC-MS tutorial, you **just have to compute the following > > With GC-MS data in profile mode, we need to use the *MatchedFilter* algorithm instead of the *Centwave* one used in the LC-MS tutorial. > {: .comment} > -> 3. {% tool [xcms findChromPeaks Merger](toolshed.g2.bx.psu.edu/repos/lecorguille/xcms_merge/xcms_merge/3.12.0+galaxy0) %} with the following parameters: -> - {% icon param-file %} *"RData file"*: `mzData.raw.xset.RData` (output of the **xcms findChromPeaks (xcmsSet)** {% icon tool %} job) +> 2. {% tool [xcms findChromPeaks Merger](toolshed.g2.bx.psu.edu/repos/lecorguille/xcms_merge/xcms_merge/3.12.0+galaxy0) %} with the following parameters: +> - {% icon param-file %} *"RData file"*: `input.raw.xset.RData` (output of the **xcms findChromPeaks (xcmsSet)** {% icon tool %} job) > - {% icon param-file %} *"Sample metadata file "*: `sampleMetadata.tsv` (One of the uploaded files from Zenodo) > > > @@ -250,122 +225,28 @@ Concerning the current GC-MS tutorial, you **just have to compute the following > > > > | sample_name | class | > > |:-----------:|:-------:| -> > | file1 | man | +> > | file1 | marine strain | > > |-------------+---------| -> > | file2 | woman | +> > | file2 | pool | > > |-------------+---------| -> > | file3 | man | +> > | file3 | freshwater strain | > > > {: .comment} > {: .hands_on} -The output from **xcms findChromPeaks Merger** {% icon tool %} is a *.RData* file that is mandatory to proceed with the end of the extraction process. +The output from **xcms findChromPeaks Merger** {% icon tool %} is a *.RData* file that is mandatory to follow the next steps of the process. There are two available options: -- carrying on using the standard XCMS workflow similarly to the one used in the LC-MS tutorial -- using the metaMS strategy specifically designed for GC-MS data -The two options are illustrated in this tutorial. - -# Carrying on using the standard XCMS workflow (option 1) - -This option follows the standard LC-MS workflow to obtain in the end a dataMatrix file and its corresponding variableMetadata file. - -> Example of end of extraction when using the standard XCMS workflow -> -> 1. {% tool [xcms groupChromPeaks (group)](toolshed.g2.bx.psu.edu/repos/lecorguille/xcms_group/abims_xcms_group/3.12.0+galaxy0) %} with the following parameters: -> - {% icon param-file %} *"RData file"*: `xset.merged.RData` (output of the **xcms findChromPeaks Merger** {% icon tool %} job) -> - *"Method to use for grouping"*: `PeakDensity - peak grouping based on time dimension peak densities` -> - *"Bandwidth"*: `10.0` -> - *"Width of overlapping m/z slices"*: `0.05` -> -> 2. {% tool [xcms fillChromPeaks (fillPeaks)](toolshed.g2.bx.psu.edu/repos/lecorguille/xcms_fillpeaks/abims_xcms_fillPeaks/3.12.0+galaxy0) %} with the following parameters: -> - {% icon param-file %} *"RData file"*: `xset.merged.groupChromPeaks.RData` (output of the **xcms groupChromPeaks (group)** {% icon tool %} job) -> - In *"Peak List"*: -> - *"Convert retention time (seconds) into minutes"*: `Yes` -> - *"Number of decimal places for retention time values reported in ions' identifiers."*: `2` -> - *"Reported intensity values"*: `maxo` -> -> -{: .hands_on} - -The outputs of this strategy are similar to the ones discribed in the LC-MS tutotial mentioned previously. - -> Important : Be careful of the file format -> -> During each step of pre-processing, your dataset has its format changed and can have also its name changed. -> To be able to continue to MSMS processing, you need to have a RData object wich is **merged and grouped** (from **xcms findChromPeaks Merger** {% icon tool %} and **xcms groupChromPeaks (group)** {% icon tool %}) at least. -> It means that you should have a file named `xset.merged.groupChromPeaks.RData` (and maybe with some step more in it). -{: .comment} - - -# Stopover : Verify your data after the XCMS pre-processing - -When you have processed **all or only needed** steps described before, you can continue with the MS/MS processing part with **msPurity** package. -Don't forget to always check your files format! For the next step you need to have this file `xset.merged.groupChromPeaks.*.RData` where * is the name of **optionnal** steps you could do during the pre-processing. -For our example, your file should be named `xset.merged.groupchromPeaks.RData`. -{: .text-justify} +- using the metaMS strategy specifically designed for GC-MS data deconvolution and annotation +- using a full XCMS process for GC-MS data processing +The two options are illustrated in this tutorial. -> -> -> The pre-processing part of this analysis can be **quite time-consuming**, and already corresponds to quite a few number of steps, depending of your analysis. We highly recommend, at this step of the MS/MS workflow, to split your analysis by beginning a new Galaxy history with **only the files you need** (final xset Rdata file and your data collection of mzML). This will help you in limiting selecting the wrong dataset in further analysis, and bring a little **tidiness** for future review of your MS/MS analysis process. You should also be able to make a better peakpicking in the future in the same history and it will not be polluated by MS/MS part of your process. -> {: .text-justify} -> -> > Copy dataset to a new history -> > -> > 1. Click on the {% icon galaxy-gear %} icon (**History options**) on the top of the history panel -> > 2. Click on **Copy Dataset** -> > 3. Select the desired files -> > 4. Give a relevant name to the "New history" -> > 5. Click on the new history name in the green box that have just appear to switch to this history -> {: .tip} -> -> To begin a new history with the files from your current history, you can **use the functionality ‘copy dataset’** and copy it into a new history (the option is hidden behind the notched wheel at the top right of the history). -> {: .text-justify} -> -> You may have notice that the XCMS tools generate **output names that contain the different XCMS steps you used**, allowing easy traceability while browsing your history. Hence, we highly recommend you to rename it **with something short**, e.g. "xset", "XCMSSetObject", or anything not too long that you may find convenient. -> {: .text-justify} -> {% snippet faqs/galaxy/datasets_rename.md %} -> -{: .comment} - -Before the next step with msPurity package on MS/MS datas, here are some questions to be able to verify if your file is ready and if you have the same results as us. Please check these questions : -{: .text-justify} - -> before MS/MS steps -> -> **1** - What are the steps of XCMS you made before your final file ? -> > -> > -> > Here are the different steps made for our example : -> > - **(Not with XCMS)** import your datas into Galaxy instance -> > - **MSNbase readMSData** {% icon tool %} to read our MS datas -> > - XCMS peakpicking with **xcms findChromPeaks (xcmsSet)** {% icon tool %} tool -> > - (Not with XCMS but necessary) merge my datas into one file with **xcms findChromPeaks Merger** {% icon tool %} tool -> > - XCMS grouping with **xcms groupChromPeaks (group)** {% icon tool %} tool -> > - **(Not done)** XCMS retention time correction, then grouping again with xcms adjustRtime (retcor) {% icon tool %} tool -> > - XCMS integration of missing peaks with **xcms fillChromPeaks (fillPeaks)** {% icon tool %} tool -> > -> {: .solution} ->
-> **2** - Concerning what we said before and the previous answer, what is the complete name of your final RData file ? -> > -> > -> > During each step of XCMS pre-processing, the name of the file which is processing is completed by the name of the step you were doing. So, finally your file should be name `xset.merged.groupChromPeaks.fillChromPeaks.RData`. That because (as seen in previous answer) you ran a grouping and the integration after merged datas. -> > {: .text-justify} -> > -> {: .solution} ->
-> **3** - What is the size (in MB) of your final RData file ? -> > -> > -> > To be able to see the size of a file in your history, you just have to select it. It will deploy informations about it and you can see the size of yours. For our example, the size of the final file is **1.4 MB**. -> > {: .text-justify} -> > -> {: .solution} -{: .question} +{% include _includes/cyoa-choices.html option1="Deconvolution and annotation using metaMS" option2="Process GC-MS data with XCMS function" default="Deconvolution and annotation using metaMS" + text="Choose below if you just want to follow the pipeline using **metaMS** or **XCMS** for GC-MS deconvolution and annotation" disambiguation="single_vs_multiple" %} +
-# Processing with metaMS part (option 2) +# Processing with metaMS part (option 1) **metaMS** is a R package for MS-based metabolomics data. It can do basic peak picking and grouping using functions from **XCMS** and **CAMERA** packages. The main output of **metaMS** is a table of feature intensities in all samples which can be analyzed with multivariate methods immediately. The package also offers the possibility to create in-house databases of mass spectra (including retention information) of pure chemical compounds. These databases can then be used for annotation purposes. The most important functions of this package are *runGC* and *runLC* (and each one to create databases *createSTDdbGC* and *createSTDdbLC*). {: .text-justify} @@ -488,8 +369,115 @@ Concerning EICs, it is possible to choose for which compound you want to draw an > {: .hands_on} +# Conclusion +{% icon trophy %} Well done, you’ve processed GC-MS data! You might want to consult your results with the [key history](https://usegalaxy.eu/u/hechth/h/end-to-end-ei-mass-spectra-prediction-workflow-using-qcxms-1) or use [the workflow](https://usegalaxy.eu/u/hechth/h/end-to-end-ei-mass-spectra-prediction-workflow-using-qcxms-1) associated with this tutorial. + +
+ +
+ +# Carrying on using the standard XCMS workflow (option 2) + +This option follows the standard LC-MS workflow to obtain in the end a dataMatrix file and its corresponding variableMetadata file. + +> Example of end of extraction when using the standard XCMS workflow +> +> 1. {% tool [xcms groupChromPeaks (group)](toolshed.g2.bx.psu.edu/repos/lecorguille/xcms_group/abims_xcms_group/3.12.0+galaxy0) %} with the following parameters: +> - {% icon param-file %} *"RData file"*: `xset.merged.RData` (output of the **xcms findChromPeaks Merger** {% icon tool %} job) +> - *"Method to use for grouping"*: `PeakDensity - peak grouping based on time dimension peak densities` +> - *"Bandwidth"*: `10.0` +> - *"Width of overlapping m/z slices"*: `0.05` +> +> 2. {% tool [xcms fillChromPeaks (fillPeaks)](toolshed.g2.bx.psu.edu/repos/lecorguille/xcms_fillpeaks/abims_xcms_fillPeaks/3.12.0+galaxy0) %} with the following parameters: +> - {% icon param-file %} *"RData file"*: `xset.merged.groupChromPeaks.RData` (output of the **xcms groupChromPeaks (group)** {% icon tool %} job) +> - In *"Peak List"*: +> - *"Convert retention time (seconds) into minutes"*: `Yes` +> - *"Number of decimal places for retention time values reported in ions' identifiers."*: `2` +> - *"Reported intensity values"*: `maxo` +> +> +{: .hands_on} + +The outputs of this strategy are similar to the ones discribed in the LC-MS tutotial mentioned previously. + +> Important : Be careful of the file format +> +> During each step of pre-processing, your dataset has its format changed and can have also its name changed. +> To be able to continue to MSMS processing, you need to have a RData object wich is **merged and grouped** (from **xcms findChromPeaks Merger** {% icon tool %} and **xcms groupChromPeaks (group)** {% icon tool %}) at least. +> It means that you should have a file named `xset.merged.groupChromPeaks.RData` (and maybe with some step more in it). +{: .comment} + + +# Stopover : Verify your data after the XCMS pre-processing + +When you have processed **all or only needed** steps described before, you can continue with the MS/MS processing part with **msPurity** package. +Don't forget to always check your files format! For the next step you need to have this file `xset.merged.groupChromPeaks.*.RData` where * is the name of **optionnal** steps you could do during the pre-processing. +For our example, your file should be named `xset.merged.groupchromPeaks.RData`. +{: .text-justify} + +> +> +> The pre-processing part of this analysis can be **quite time-consuming**, and already corresponds to quite a few number of steps, depending of your analysis. We highly recommend, at this step of the MS/MS workflow, to split your analysis by beginning a new Galaxy history with **only the files you need** (final xset Rdata file and your data collection of mzML). This will help you in limiting selecting the wrong dataset in further analysis, and bring a little **tidiness** for future review of your MS/MS analysis process. You should also be able to make a better peakpicking in the future in the same history and it will not be polluated by MS/MS part of your process. +> {: .text-justify} +> +> > Copy dataset to a new history +> > +> > 1. Click on the {% icon galaxy-gear %} icon (**History options**) on the top of the history panel +> > 2. Click on **Copy Dataset** +> > 3. Select the desired files +> > 4. Give a relevant name to the "New history" +> > 5. Click on the new history name in the green box that have just appear to switch to this history +> {: .tip} +> +> To begin a new history with the files from your current history, you can **use the functionality ‘copy dataset’** and copy it into a new history (the option is hidden behind the notched wheel at the top right of the history). +> {: .text-justify} +> +> You may have notice that the XCMS tools generate **output names that contain the different XCMS steps you used**, allowing easy traceability while browsing your history. Hence, we highly recommend you to rename it **with something short**, e.g. "xset", "XCMSSetObject", or anything not too long that you may find convenient. +> {: .text-justify} +> {% snippet faqs/galaxy/datasets_rename.md %} +> +{: .comment} + +Before the next step with msPurity package on MS/MS datas, here are some questions to be able to verify if your file is ready and if you have the same results as us. Please check these questions : +{: .text-justify} + +> before MS/MS steps +> +> **1** - What are the steps of XCMS you made before your final file ? +> > +> > +> > Here are the different steps made for our example : +> > - **(Not with XCMS)** import your datas into Galaxy instance +> > - **MSNbase readMSData** {% icon tool %} to read our MS datas +> > - XCMS peakpicking with **xcms findChromPeaks (xcmsSet)** {% icon tool %} tool +> > - (Not with XCMS but necessary) merge my datas into one file with **xcms findChromPeaks Merger** {% icon tool %} tool +> > - XCMS grouping with **xcms groupChromPeaks (group)** {% icon tool %} tool +> > - **(Not done)** XCMS retention time correction, then grouping again with xcms adjustRtime (retcor) {% icon tool %} tool +> > - XCMS integration of missing peaks with **xcms fillChromPeaks (fillPeaks)** {% icon tool %} tool +> > +> {: .solution} +>
+> **2** - Concerning what we said before and the previous answer, what is the complete name of your final RData file ? +> > +> > +> > During each step of XCMS pre-processing, the name of the file which is processing is completed by the name of the step you were doing. So, finally your file should be name `xset.merged.groupChromPeaks.fillChromPeaks.RData`. That because (as seen in previous answer) you ran a grouping and the integration after merged datas. +> > {: .text-justify} +> > +> {: .solution} +>
+> **3** - What is the size (in MB) of your final RData file ? +> > +> > +> > To be able to see the size of a file in your history, you just have to select it. It will deploy informations about it and you can see the size of yours. For our example, the size of the final file is **1.4 MB**. +> > {: .text-justify} +> > +> {: .solution} +{: .question} # Conclusion - +{% icon trophy %} Well done, you’ve processed GC-MS data! You might want to consult your results with the [key history](https://usegalaxy.eu/u/hechth/h/end-to-end-ei-mass-spectra-prediction-workflow-using-qcxms-1) or use [the workflow](https://usegalaxy.eu/u/hechth/h/end-to-end-ei-mass-spectra-prediction-workflow-using-qcxms-1) associated with this tutorial. + +
+ From 0fc82c403df8485cbf0c4b290c93fe1bc9a54673 Mon Sep 17 00:00:00 2001 From: Guitton Yann Date: Fri, 21 Mar 2025 14:49:18 +0100 Subject: [PATCH 09/29] Update tutorial.md with div update --- .../metabolomics/tutorials/gcms/tutorial.md | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/topics/metabolomics/tutorials/gcms/tutorial.md b/topics/metabolomics/tutorials/gcms/tutorial.md index 2fbb5f4aab8a68..d1424b61676345 100644 --- a/topics/metabolomics/tutorials/gcms/tutorial.md +++ b/topics/metabolomics/tutorials/gcms/tutorial.md @@ -134,7 +134,7 @@ As a result of this step, we should have in our history a green Dataset collecti The first part of data processing is using the **XCMS** tool to detect peaks in the MS signal. For that, we first need to take the `.mzData` files and create a format usable by the **XCMS** tool. {% tool [MSnbase readMSData](toolshed.g2.bx.psu.edu/repos/lecorguille/msnbase_readmsdata/msnbase_readmsdata/2.16.1+galaxy0) %} ({% cite gatto2012msnbase %}. {% cite gatto2020msnbase %}) takes as input our files and prepares `RData` files for the first **XCMS** step. > -> **MSnbase readMSData** {% icon tool %} function, prior to **XCMS**, is able to read files with open format as `mzXML`, `mzML`, `mzData` and `netCDF`, which are independent of the constructors' formats. Working with open MS data format allows users to us tools developped outside of the MS This set of functions gives modularity, and thus is particularly well adapted to define workflows, one of the key points of Galaxy. +> **MSnbase readMSData** {% icon tool %} function, prior to **XCMS**, is able to read files with open format as `mzXML`, `mzML`, `mzData` and `netCDF`, which are independent of the constructors' formats. Working with open MS data file format allows users to us tools developped outside of the MS instrument provider. This set of packages/functions gives modularity, and thus is particularly well adapted to define workflows, one of the key points of Galaxy. {: .comment} > Create the XCMS object @@ -154,11 +154,11 @@ The first part of data processing is using the **XCMS** tool to detect peaks in # Peak detection using XCMS -The first step in the workflow is to detect the peaks in our data using **XCMS**. This part, however, is covered by a [separate tutorial]({{ site.baseurl }}/topics/metabolomics/tutorials/lcms-preprocessing/tutorial.html). Although the tutorial is dedicated to LC-MS data, it can also be followed for our GC-MS data. Therefore, in this section, we do not explain this part of the workflow in detail but rather refer the reader to the dedicated tutorial. Please also pay attention to the parameter values for individual Galaxy tools, as these can differ from the referred tutorial and are adjusted to our dataset. +The first step in the workflow is to detect the peaks in our data using **XCMS** functions. This part, however, is covered by a [separate tutorial]({{ site.baseurl }}/topics/metabolomics/tutorials/lcms-preprocessing/tutorial.html). Although the tutorial is dedicated to LC-MS data, it can also be followed for our GC-MS data. Therefore, in this section, we do not explain this part of the workflow in detail but rather refer the reader to the dedicated tutorial. Please also pay attention to the parameter values for individual Galaxy tools, as these can differ from the referred tutorial and are adjusted to our dataset. > Skip this step > -> Since this step is already covered in a [separate tutorial]({{ site.baseurl }}/topics/metabolomics/tutorials/lcms-preprocessing/tutorial.html), it is possible to skip it. Instead, you can continue with [Peak deconvolution]({{ site.baseurl }}/topics/metabolomics/tutorials/gcms/tutorial.html#peak-deconvolution-metams) step using a preprocessed **XCMS** object file prepared for you. +> Since this step is already covered in a [separate tutorial]({{ site.baseurl }}/topics/metabolomics/tutorials/lcms-preprocessing/tutorial.html), it is possible to skip it. Instead, you can continue with [Peak deconvolution]({{ site.baseurl }}/topics/metabolomics/tutorials/gcms/tutorial.html#processing-with-metams-option-1) step using a preprocessed **XCMS** object file prepared for you. > > > Upload data > > @@ -241,23 +241,21 @@ There are two available options: - using a full XCMS process for GC-MS data processing The two options are illustrated in this tutorial. -{% include _includes/cyoa-choices.html option1="Deconvolution and annotation using metaMS" option2="Process GC-MS data with XCMS function" default="Deconvolution and annotation using metaMS" - text="Choose below if you just want to follow the pipeline using **metaMS** or **XCMS** for GC-MS deconvolution and annotation" disambiguation="single_vs_multiple" %} +{% include _includes/cyoa-choices.html option1="Deconvolution and annotation using metaMS" option2="Process GC-MS data with XCMS function" default="Deconvolution and annotation using metaMS" text="Choose below if you just want to follow the pipeline using **metaMS** or **XCMS** for GC-MS deconvolution and annotation" disambiguation="single_vs_multiple" %} -
+
-# Processing with metaMS part (option 1) +# Processing with metaMS (option 1) -**metaMS** is a R package for MS-based metabolomics data. It can do basic peak picking and grouping using functions from **XCMS** and **CAMERA** packages. The main output of **metaMS** is a table of feature intensities in all samples which can be analyzed with multivariate methods immediately. The package also offers the possibility to create in-house databases of mass spectra (including retention information) of pure chemical compounds. These databases can then be used for annotation purposes. The most important functions of this package are *runGC* and *runLC* (and each one to create databases *createSTDdbGC* and *createSTDdbLC*). +**metaMS** is an R package for MS-based metabolomics data, it was made to easy peak picking and deconvolution steps using functions from **XCMS** and **CAMERA** packages. The 2 mains outputs of **metaMS** are : a table of feature intensities in all samples which can be analyzed with multivariate methods immediately and an .msp. The package also offers the possibility to create in-house databases of mass spectra (including retention information) of pure chemical compounds. These databases can then be used for annotation purposes. The most important functions of this package are *runGC* and *runLC* (and each one to create databases *createSTDdbGC* and *createSTDdbLC*). {: .text-justify} During this tutorial we are interested in GC-MS analysis, so we will use the *runGC* function of **metaMS** and described it in details to be able to understand this function. The standard workflow of **metaMS** for GC-MS data is the following : ![Workflow metaMS](../../images/tuto_gcms_workflow_metaMS.png "Workflow of metaMS for GC datas") -The *runGC* function is implemented in **metaMS.runGC {% icon tool %} tool** in W4M Galaxy. It takes a vector of file names, corresponding to the samples, and a settings list as mandatory arguments. In addition, some extra arguments can be provided. In particular, a database of standards, as discussed later in the tutorial, can be provided for annotation purposes. This tool regroups all these steps that are described in the following parts to be able to understand all its functionalities and particularities. We will run the tool after we understand each of its steps because it is important to know what are the best parameters for our data and why each parameter is done. +The *runGC* function is implemented in **metaMS.runGC {% icon tool %} tool** in Galaxy. It takes as inputs a .RData file after XCMS and optionnaly an alkane reference file for RI calculation and a spectra database in .msp for annotation purposes. {: .text-justify} - ## Peak picking The peak picking is performed by the usual **XCMS** functions. A function has been written in **metaMS** to allow the individual parameters to be passed to the function as a settings list. The result is that the whole of the **XCMS** functionality is available, simply by changing the values of some settings, or by adding fields. @@ -374,7 +372,7 @@ Concerning EICs, it is possible to choose for which compound you want to draw an
-
+
# Carrying on using the standard XCMS workflow (option 2) From 3aca0ee4e0361146e99542cb0e2b37ab8e291565 Mon Sep 17 00:00:00 2001 From: Guitton Yann Date: Fri, 21 Mar 2025 14:51:38 +0100 Subject: [PATCH 10/29] Update tutorial.bib --- .../metabolomics/tutorials/gcms/tutorial.bib | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/topics/metabolomics/tutorials/gcms/tutorial.bib b/topics/metabolomics/tutorials/gcms/tutorial.bib index d1540d26c1fd72..9fc81aa214d2ca 100644 --- a/topics/metabolomics/tutorials/gcms/tutorial.bib +++ b/topics/metabolomics/tutorials/gcms/tutorial.bib @@ -118,3 +118,54 @@ @article{Kopka2005 title = {GMD@CSB.DB: the Golm Metabolome Database}, journal = {Bioinformatics} } + +@article{gatto2012msnbase, + title={MSnbase-an R/Bioconductor package for isobaric tagged mass spectrometry data visualization, processing and quantitation}, + author={Gatto, Laurent and Lilley, Kathryn S}, + journal={Bioinformatics}, + volume={28}, + number={2}, + pages={288--289}, + year={2012}, + publisher={Oxford University Press}, + doi={10.1093/bioinformatics/btr645} +} + +@article{gatto2020msnbase, + title={MSnbase, efficient and elegant R-based processing and visualization of raw mass spectrometry data}, + author={Gatto, Laurent and Gibb, Sebastian and Rainer, Johannes}, + journal={Journal of Proteome Research}, + volume={20}, + number={1}, + pages={1063--1069}, + year={2020}, + publisher={ACS Publications}, + doi={10.1021/acs.jproteome.0c00313} +} + +@article{Stein1994, + doi = {10.1016/1044-0305(94)87009-8}, + url = {https://doi.org/10.1016/1044-0305(94)87009-8}, + year = {1994}, + month = aug, + publisher = {Journal of the American Society for Mass Spectrometry}, + volume = {5}, + number = {9}, + pages = {859-866}, + author = {Stephen E. Stein and Donald R. Scott}, + title = {Optimization and testing of mass spectral library search algorithms for compound identification}, + journal = {Journal of the American Society for Mass Spectrometry} +} + +@article{Stein1999, + doi = {10.1016/S1044-0305(99)00047-1}, + url = {https://doi.org/10.1016/S1044-0305(99)00047-1}, + year = {1999}, + month = aug, + publisher = {Journal of the American Society for Mass Spectrometry}, + volume = {10}, + pages = {770-781}, + author = {Stephen E. Stein}, + title = {An integrated method for spectrum extraction and compound identification from gas chromatography/mass spectrometry data}, + journal = {Journal of the American Society for Mass Spectrometry} +} From 3ef6dd622e56199a9e5983bcdd7430d1a9b53e90 Mon Sep 17 00:00:00 2001 From: Guitton Yann Date: Fri, 21 Mar 2025 16:24:03 +0100 Subject: [PATCH 11/29] [WIP] rewriting the 2 sections in tutorial.md not finished --- .../metabolomics/tutorials/gcms/tutorial.md | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/topics/metabolomics/tutorials/gcms/tutorial.md b/topics/metabolomics/tutorials/gcms/tutorial.md index d1424b61676345..61eb5d59a5ca72 100644 --- a/topics/metabolomics/tutorials/gcms/tutorial.md +++ b/topics/metabolomics/tutorials/gcms/tutorial.md @@ -247,35 +247,41 @@ The two options are illustrated in this tutorial. # Processing with metaMS (option 1) -**metaMS** is an R package for MS-based metabolomics data, it was made to easy peak picking and deconvolution steps using functions from **XCMS** and **CAMERA** packages. The 2 mains outputs of **metaMS** are : a table of feature intensities in all samples which can be analyzed with multivariate methods immediately and an .msp. The package also offers the possibility to create in-house databases of mass spectra (including retention information) of pure chemical compounds. These databases can then be used for annotation purposes. The most important functions of this package are *runGC* and *runLC* (and each one to create databases *createSTDdbGC* and *createSTDdbLC*). +**metaMS** is an R package for MS-based metabolomics data, it was made to eas peak picking and deconvolution steps using functions from **XCMS** and **CAMERA** packages. In it's Galaxy implementaion, the 2 mains outputs of **metaMS** are : a table of feature intensities in all samples which can be analyzed with multivariate methods immediately and an `.msp`. + +> +> +> *-Note: Not all **metaMS** R packages functions have been made available in Galaxy.-* +When run in R the **metaMS** package offers a lot of possibilities among which functions to create in-house databases of mass spectra (including retention time or indices information) of pure chemical compounds. These databases can then be used for annotation purposes. The most important functions of this package are *runGC* and *runLC* (and each one to create databases *createSTDdbGC* and *createSTDdbLC*). +> +> {: .comment} + {: .text-justify} -During this tutorial we are interested in GC-MS analysis, so we will use the *runGC* function of **metaMS** and described it in details to be able to understand this function. The standard workflow of **metaMS** for GC-MS data is the following : +During this tutorial we are interested in GC-MS analysis, so we will use the *runGC* function of **metaMS** and described it in details to be able to understand all capacities of that function. +The standard workflow of **metaMS** for GC-MS data is the following : ![Workflow metaMS](../../images/tuto_gcms_workflow_metaMS.png "Workflow of metaMS for GC datas") -The *runGC* function is implemented in **metaMS.runGC {% icon tool %} tool** in Galaxy. It takes as inputs a .RData file after XCMS and optionnaly an alkane reference file for RI calculation and a spectra database in .msp for annotation purposes. +The *runGC* function is implemented in **metaMS.runGC {% icon tool %} tool** in Galaxy. It takes as inputs a .RData file after XCMS and optionnaly for annotation purposes an alkane reference file for RI calculation and/or a spectra database in `.msp`. {: .text-justify} ## Peak picking -The peak picking is performed by the usual **XCMS** functions. A function has been written in **metaMS** to allow the individual parameters to be passed to the function as a settings list. The result is that the whole of the **XCMS** functionality is available, simply by changing the values of some settings, or by adding fields. - {: .text-justify} -Whereas the package is not up-to-date since the new version of **XCMS** (3.x). This new version brought a lot of new objects and transformed the peak picking process. To have the last version of this process, **metaMS** authorized **to start its function directly with the file containing all peak picking results**. -{: .text-justify} -Due to this update, **we have already processed the peak picking during the first part** of this tutorial. So we can continue it with the file outputted from the peak picking part. This also allow us to make a good peak picking without the following step include in **metaMS** functions. So it takes less time of processing and we can verify our peaks with this cut between peak picking and the following steps of GC-MS analysis. +The peak picking is performed by the usual **XCMS** functions and the output file in `.RData` is used for deconvolution and annotation steps. + {: .text-justify} ## Definition of pseudo-spectra -Rather than a feature-based analysis with individual peaks, as is the case with **XCMS**, **metaMS** performs a pseudospectrum-based analysis. So, the basic entity is a set of m/z values showing a chromatographic peak at the same retention time. +The biggest difference between **XCMS** only or **XCMS + metaMS** GC-MS data processing is that rather than a feature-based analysis with individual peaks, as is the case with **XCMS**, **metaMS** performs a pseudospectrum-based analysis. So, the basic entity is a set of m/z values showing a chromatographic peak at the same retention time. The idea behind that is that Electron Ionization (EI), which is the most widely used ionization mode in GC-MS analysis, generates a lot more ions for the same molecule than Electrospray Ionisation used in LC-MS. **metaMS** runGC is able to group all ions belonging to a molecule into one single information that will be used for statistical analysis. For each compound found by **metaMS** a list of gouped m/z and their intensity is exported as pseudospectrum and this will be used for annotation purpose. {: .text-justify} ![Pseudospectrum example](../../images/tuto_gcms_pseudospectrum_example.png "Pseudospectrum example from `msp` file") -This choice is motivated by several considerations. First of all, **in GC the amount of overlap is much less than in LC** : peaks are much narrower. This means that even a one- or two-second difference in retention time can be enough to separate the corresponding mass spectra. Secondly, fragmentation patterns for many compounds are **available in extensive libraries like the [NIST library](http://www.nist.gov/srd/nist1a.cfm "NIST library")**. In addition, the spectra are somewhat easier to interpret since adducts, such as found in LC, are not present. The main advantage of pseudo-spectra, however, is that their use allows the results to be interpreted directly as relative concentrations of chemical compounds : **a fingerprint in terms of chemical composition is obtained**, rather than a fingerprint in terms of hard-to-interpret features. The pseudo-spectra are obtained by simply clustering on retention time, using the *runCAMERA* function, which for GC data calls *groupFWHM*. All the usual parameters for the *groupFWHM* function are included in W4M Galaxy **metaMS.runGC {% icon tool %} tool**. The most important parameter is *perfwhm*, which determines the maximal retention time difference of features in one pseudospectrum. +This choice is motivated by several considerations. First of all, **in GC the amount of overlap is much less than in LC** : peaks are much narrower. This means that even a one- or two-second difference in retention time can be enough to separate the corresponding mass spectra. Secondly, EI MS spectra for many compounds are **available in extensive libraries like the [NIST library](http://www.nist.gov/srd/nist1a.cfm "NIST library")** or other online ones like [Golm Metabolome library](http://gmd.mpimp-golm.mpg.de/) {: .text-justify} -The final step is to convert the **CAMERA** objects into easily handled lists, which are basically the R equivalent of the often-used `msp` format from the AMDIS software ({% cite Stein1999 %}). The `msp` file is a nested list, with one entry for each sample, and each sample represented by a number of fields. The pseudo-spectra are three-column matrices, containing m/z, intensity and retention time information, respectively. They can be draw with the *plotPseudoSpectrum* function of **metaMS** package easily (Figure 2). +The `.msp` format created by **metaMS** is the same as the one used the AMDIS software ({% cite Stein1999 %}) generally available on GC-MS instrument. The `.msp` file is a nested list, with one entry for each compound pseudo-spectra. The pseudo-spectra are three-column matrices, containing m/z, intensity and retention time information, respectively. They can be draw with the *plotPseudoSpectrum* function of **metaMS** package easily (Figure 2). {: .text-justify} From 9aa8e7ce92d1744df64660706cc4b9125b78e31a Mon Sep 17 00:00:00 2001 From: Guitton Yann Date: Mon, 28 Jul 2025 12:39:51 +0200 Subject: [PATCH 12/29] typo correction in table --- topics/metabolomics/tutorials/gcms/tutorial.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/topics/metabolomics/tutorials/gcms/tutorial.md b/topics/metabolomics/tutorials/gcms/tutorial.md index 61eb5d59a5ca72..81dd2eba7ab8a3 100644 --- a/topics/metabolomics/tutorials/gcms/tutorial.md +++ b/topics/metabolomics/tutorials/gcms/tutorial.md @@ -226,9 +226,7 @@ Concerning the current GC-MS tutorial, you **just have to compute the following > > | sample_name | class | > > |:-----------:|:-------:| > > | file1 | marine strain | -> > |-------------+---------| > > | file2 | pool | -> > |-------------+---------| > > | file3 | freshwater strain | > > > {: .comment} From 61905c511378de166f4c5b4ce47671d1bcc7fd8f Mon Sep 17 00:00:00 2001 From: Guitton Yann Date: Mon, 28 Jul 2025 18:30:58 +0200 Subject: [PATCH 13/29] New zenodo link with updated files --- .../metabolomics/tutorials/gcms/tutorial.md | 151 ++++++++++-------- 1 file changed, 87 insertions(+), 64 deletions(-) diff --git a/topics/metabolomics/tutorials/gcms/tutorial.md b/topics/metabolomics/tutorials/gcms/tutorial.md index 81dd2eba7ab8a3..354fc94f88db46 100644 --- a/topics/metabolomics/tutorials/gcms/tutorial.md +++ b/topics/metabolomics/tutorials/gcms/tutorial.md @@ -4,14 +4,14 @@ draft: true title: 'Mass spectrometry : GC-MS analysis with metaMS package' level: Introductory -zenodo_link: 'https://zenodo.org/record/3631074' +zenodo_link: 'https://zenodo.org/records/16538501' questions: - What are the main steps for gas chromatography-mass spectrometry (GC-MS) data processing for untargeted metabolomic analysis? - How to conduct metabolomic GC-MS data analysis from preprocessing to annotation using Galaxy? objectives: - To be sure you have already comprehend the diversity of MS pre-processing analysis. - To learn the principal functions of metaMS package for GC-MS data processing through Galaxy. -- To evaluate the potential of a workflow approach and available Galaxy tools when dealing with GC-MS metabolomic analysis. +- To evaluate the potential of two workflow approaches and available Galaxy tools when dealing with GC-MS metabolomic analysis. time_estimation: 2H key_points: - To process untargeted GC-MS metabolomic data preprocessing, you need a large variety of steps and tools. @@ -20,10 +20,15 @@ key_points: requirements: - type: "internal" topic_name: metabolomics -contributors: + tutorials: + - gcms-preprocessing +contributions: + autorship: - jsaintvanne - yguitton + editing: - melpetera + testing: - workflow4metabolomics funding: - elixir-europe @@ -40,26 +45,42 @@ One of the three main technologies used to perform metabolomic analysis is **Gas for this technology requires a large variety of steps, ranging from extracting information from the raw data, to statistical analysis and annotation. Many packages in R/Python are available for the analysis of GC-MS or LC-MS data - for more details see the reviews by {% cite Stanstrup2019 %} and {% cite Misra2021 %}. -This tutorial explains the main steps involved in untargeted **GC-MS** data processing, to do so we focus on some open-source solutions integrated within the Galaxy framework, namely **XCMS**, **metaMS**. The selected tools and functionnalities only covers a small portion of available tools but allow to **perform a complete GC-MS analysis** in a single environment. +This tutorial explains the main steps involved in untargeted **GC-MS** data processing, to do so we focus on some open-source solutions integrated within the Galaxy framework, namely **XCMS** and **metaMS**. The selected tools and functionalities only covers a small portion of available tools but allow to **perform a complete GC-MS analysis** in a single environment. In this tutorial, we will learn how to (1) extract features from the raw data using **XCMS** ({% cite Smith2006 %}), (2) deconvolute the detected features into spectra with **metaMS** ({% cite Wehrens2014 %}). -To illustrate this approach, we will use data from {% cite Dittami2012 %}. Due to time constraints in processing the original dataset, a limited subset of samples was utilized to illustrate the workflow. This subset (see details bellow) demonstrates the key steps of metabolomic analysis, from pre-processing to annotation. Although the results derived from this reduced sample size may not be scientifically robust, they provide insight into essential methodological foundations of GC-MS data-processing workflow. +To illustrate this approach, we will use data from {% cite Dittami2012 %}. Due to time constraints in processing the original dataset, a limited subset of samples was utilized to illustrate the workflow. This subset (see details below) demonstrates the key steps of metabolomics analysis, from pre-processing to annotation. Although the results derived from this reduced sample size may not be scientifically robust, they provide insight into essential methodological foundations of GC-MS data-processing workflow. > Algae samples > -> The objectives of this study was to investigates the adaptation mechanisms of the brown algae Ectocarpus to low-salinity environments. The research focused on examining physiological tolerance and metabolic changes in freshwater and marine strains of Ectocarpus. Using transcriptomic and metabolic analyses, the authors identified significant, reversible changes occurring in the freshwater strain when exposed to seawater. Both strains exhibited similarities in gene expression under identical conditions; however, substantial differences were observed in metabolite profiles. +> The objective of this study was to investigate the adaptation mechanisms of the brown algae *Ectocarpus* to low-salinity environments. The research focused on examining physiological tolerance and metabolic changes in freshwater and marine strains of *Ectocarpus*. Using transcriptomic (gene expression profiling) and metabolic analyses, the authors identified significant, reversible changes occurring in the freshwater strain when exposed to seawater. Both strains exhibited similarities in gene expression under identical conditions; however, substantial differences were observed in metabolite profiles. > > The study utilized a **freshwater strain** of Ectocarpus and a **marine strain** for comparative analysis. The algae were cultured in media with varying salinities, prepared by diluting natural seawater or adding NaCl. The algae were acclimated to these conditions before extraction. > -> The 6 samples used in this training were analysed by GC-MS (low resolution instrument). A marine strains raised in sea water media (2 replicats) and a freshwater strains raised either in 5 or 100% sea water media (2 replicats each). [Link](https://zenodo.org/record/3631074/) +> The six samples used in this training were analyzed by GC-MS (low resolution instrument). A marine strain raised in sea water media (2 replicates) and freshwater strains raised in either 5% or 100% sea water media (2 replicates each). [Dataset available on Zenodo](https://zenodo.org/records/16538501/) > {: .details} -To process the GC-MS data, we use several tools. **XCMS** ({% cite Smith2006 %}) is a general R package for untargeted metabolomics profiling. It can be used for any type of mass spectrometry acquisition (centroid and profile) or resolution (from low to high resolution), including FT-MS data coupled with a different kind of chromatography (liquid or gas). Because of the generality of packages like **XCMS**, several other packages have been developed to use the functionality of **XCMS** for optimal performance in a particular context. The R package **metaMS** ({% cite Wehrens2014 %}) does so for the field of GC-MS untargeted metabolomics. One of the goals **metaMS** was to set up a simple system with few user-settable parameters, capable of handling untargeted metabolomics experiments. -In this tutorial we use **XCMS** to detect chromatographic peaks within our samples. Once we have detected them, they need to be deconvoluted into mass spectra representing chemical compounds. For that, we use **metaMS** functions. To normalise the retention time of deconvoluted spectra in our sample, we compute the retention index using Alkane references and a dedicated function of **metaMS**. Finally, we identify detected spectra by aligning them with a database of known compounds. This can be achieved using in-house build database in the common .msp format (used in the NIST MS search program for example), resulting in a table of identified compounds. +To process the GC-MS data, we can use several tools. **XCMS** ({% cite Smith2006 %}) is a general R package for untargeted metabolomics profiling. It can be used for any type of mass spectrometry acquisition (centroid and profile) or resolution (from low to high resolution), including FT-MS data coupled with a different kind of chromatography (liquid or gas). Because of the generality of packages like **XCMS**, several other packages have been developed to use the functionality of **XCMS** for optimal performance in a particular context. The R package **metaMS** ({% cite Wehrens2014 %}) does so for the field of GC-MS untargeted metabolomics. One of the goals of **metaMS** was to set up a simple system with few user-settable parameters, capable of handling untargeted metabolomics experiments. +In this tutorial we use **XCMS** to detect chromatographic peaks within our samples. Once we have detected them, they need to be deconvoluted into mass spectra representing chemical compounds. For that, we use **metaMS** functions. To normalize the retention time of deconvoluted spectra in our sample, we compute the retention index using Alkane references and a dedicated function of **metaMS**. Finally, we identify detected spectra by aligning them with a database of known compounds. This can be achieved using an in-house built database in the common MSP format (`.msp`) (used in the NIST MS search program for example), resulting in a table of identified compounds. + +MSP files +> MSP (Mass Spectrum Peak) file is a text file structured according to the NIST MSSearch spectra format. MSP is one of the generally accepted formats for mass spectral libraries (or collections of unidentified spectra, so called spectral archives), and it is compatible with lots of spectra processing programs (MS-DIAL, NIST MS Search, AMDIS, matchms, etc.). It can contain one or more mass spectra, which are split by an empty line. The individual spectra essentially consist of two sections: metadata (such as name, spectrum type, ion mode, retention time, and the number of m/z peaks) and peaks, consisting of m/z and intensity tuples. +> +> **Example of an MSP file entry:** +> ``` +> Name: Biomarker1 +> Retention_time: 5.23 +> Num Peaks: 3 +> 43 100 +> 57 80 +> 71 60 +> ``` +> +> For more details, you can view an [example MSP file here](https://zenodo.org/records/16538501/files/W4M0004_database_small.msp). +{: .details} > -> - In Galaxy other GC-MS data processing workflows are available and may be of interest for more advanced Galaxy users [Add link] +> In Galaxy other GC-MS data processing workflows are available and may be of interest for more advanced Galaxy users [Link](https://training.galaxyproject.org/training-material/topics/metabolomics/)] {: .comment} > @@ -87,15 +108,15 @@ Before we can start with the actual analysis pipeline, we first need to download > 2. Import the files from [Zenodo]({{ page.zenodo_link }}) into a collection: > > ``` -> https://zenodo.org/record/3631074/files/alg11.mzData -> https://zenodo.org/record/3631074/files/alg2.mzData -> https://zenodo.org/record/3631074/files/alg3.mzData -> https://zenodo.org/record/3631074/files/alg7.mzData -> https://zenodo.org/record/3631074/files/alg8.mzData -> https://zenodo.org/record/3631074/files/alg9.mzData +> https://zenodo.org/records/16538501/files/alg11.mzML +> https://zenodo.org/records/16538501/files/alg2.mzML +> https://zenodo.org/records/16538501/files/alg3.mzML +> https://zenodo.org/records/16538501/files/alg7.mzML +> https://zenodo.org/records/16538501/files/alg8.mzML +> https://zenodo.org/records/16538501/files/alg9.mzML > ``` > -> {% snippet faqs/galaxy/datasets_import_via_link.md collection=true format="mzdata" collection_name="input" renaming=false %} +> {% snippet faqs/galaxy/datasets_import_via_link.md collection=true format="mzml" collection_name="input" renaming=false %} > > 3. Make sure your data is in a **collection**. You can always manually create the collection from separate files: > @@ -106,9 +127,9 @@ Before we can start with the actual analysis pipeline, we first need to download > 4. Import the following extra files from [Zenodo]({{ page.zenodo_link }}): > > ``` -> https://zenodo.org/record/3631074/files/reference_alkanes.csv -> https://zenodo.org/record/3631074/files/W4M0004_database_small.msp -> https://zenodo.org/record/3631074/files/sampleMetadata.tsv +> https://zenodo.org/record/16538501/files/reference_alkanes.csv +> https://zenodo.org/record/16538501/files/W4M0004_database_small.msp +> https://zenodo.org/record/16538501/files/sampleMetadata.tsv > ``` > > {% snippet faqs/galaxy/datasets_import_via_link.md %} @@ -116,9 +137,9 @@ Before we can start with the actual analysis pipeline, we first need to download > > > The extra files > > -> > The three additional files contain the **reference alkanes**, the **W4M0004_database_small**, and the **sampleMetadata**. Those files are auxiliary inputs used in the data processing and contain either extra information about the samples or serve as reference data for indexing and identification. +> > The three additional files contain the **reference_alkanes**, the **W4M0004_database_small**, and the **sampleMetadata**. Those files are auxiliary inputs used in the data processing and contain either extra information about the samples or serve as reference data for indexing and identification. > > -> > The **list of alkanes** (`.tsv` or `.csv`) with retention times and carbon number or retention index is used to compute the retention index of the deconvoluted peaks. The alkanes should be measured in the same batch as the input sample collection. +> > The **reference_alkanes** (`.tsv` or `.csv`) with retention times and carbon number or retention index is used to compute the retention index of the deconvoluted peaks. The alkanes should be measured in the same batch as the input sample collection. > > > > The **W4M0004_database_small** (`.msp`) is a reference database used for the identification of spectra. It contains the recorded and annotated mass spectra of chemical standards, ideally from a similar instrument. The unknown spectra which can be detected in the sample can then be confirmed via comparison with this library. The specific library is an in-house library of metabolite standards extracted with **metaMS** . > > @@ -127,14 +148,14 @@ Before we can start with the actual analysis pipeline, we first need to download > {: .hands_on} -As a result of this step, we should have in our history a green Dataset collection with all 6 samples `.mzData` files as well as three separate files with reference alkanes, reference spectral library, and sample metadata. +As a result of this step, we should have in our history a green Dataset collection with all 6 samples `.mzML` files as well as three separate files with reference alkanes, reference spectral library, and sample metadata. ## Create the XCMS object -The first part of data processing is using the **XCMS** tool to detect peaks in the MS signal. For that, we first need to take the `.mzData` files and create a format usable by the **XCMS** tool. {% tool [MSnbase readMSData](toolshed.g2.bx.psu.edu/repos/lecorguille/msnbase_readmsdata/msnbase_readmsdata/2.16.1+galaxy0) %} ({% cite gatto2012msnbase %}. {% cite gatto2020msnbase %}) takes as input our files and prepares `RData` files for the first **XCMS** step. +The first part of data processing is using the **XCMS** tool to detect peaks in the MS signal. For that, we first need to take the `.mzML` files and create a format usable by the **XCMS** tool. {% tool [MSnbase readMSData](toolshed.g2.bx.psu.edu/repos/lecorguille/msnbase_readmsdata/msnbase_readmsdata/2.16.1+galaxy0) %} ({% cite gatto2012msnbase %}. {% cite gatto2020msnbase %}) takes as input our files and prepares `RData` files for the first **XCMS** step. > -> **MSnbase readMSData** {% icon tool %} function, prior to **XCMS**, is able to read files with open format as `mzXML`, `mzML`, `mzData` and `netCDF`, which are independent of the constructors' formats. Working with open MS data file format allows users to us tools developped outside of the MS instrument provider. This set of packages/functions gives modularity, and thus is particularly well adapted to define workflows, one of the key points of Galaxy. +> **MSnbase readMSData** {% icon tool %} function, prior to **XCMS**, is able to read files with open format as `mzXML`, `mzML`, `mzData` and `netCDF`, which are independent of the constructors' formats. Working with open MS data file format allows users to us tools developed outside of the MS instrument provider. This set of packages/functions gives modularity, and thus is particularly well adapted to define workflows, one of the key points of Galaxy. {: .comment} > Create the XCMS object @@ -154,7 +175,7 @@ The first part of data processing is using the **XCMS** tool to detect peaks in # Peak detection using XCMS -The first step in the workflow is to detect the peaks in our data using **XCMS** functions. This part, however, is covered by a [separate tutorial]({{ site.baseurl }}/topics/metabolomics/tutorials/lcms-preprocessing/tutorial.html). Although the tutorial is dedicated to LC-MS data, it can also be followed for our GC-MS data. Therefore, in this section, we do not explain this part of the workflow in detail but rather refer the reader to the dedicated tutorial. Please also pay attention to the parameter values for individual Galaxy tools, as these can differ from the referred tutorial and are adjusted to our dataset. +The first step in the workflow is to detect the peaks in our data using **XCMS** functions. This part, however, is covered by a [separate tutorial]({{ site.baseurl }}/topics/metabolomics/tutorials/lcms-preprocessing/tutorial.html). Although the tutorial is dedicated to LC-MS data, it can also be followed for our GC-MS data. Therefore, in this section, we do not explain this part of the workflow in detail but rather refer the reader to the dedicated tutorial. Please also pay attention to the parameter values for individual Galaxy tools, as these can differ from the referred tutorial and are adjusted to our GC-MS dataset. > Skip this step > @@ -169,7 +190,7 @@ The first step in the workflow is to detect the peaks in our data using **XCMS** > > 2. Import the following files from [Zenodo]({{ page.zenodo_link }}): > > > > ``` -> > https://zenodo.org/record/3631074/files/xcms_outputs +> > https://zenodo.org/record/16538501/files/xcms_outputs > > ``` > > > > {% snippet faqs/galaxy/datasets_import_via_link.md %} @@ -188,15 +209,15 @@ The first step is to extract peaks from each of your data files independently. F One Galaxy Training material already explains how to act with MS data. We encourage you to **follow this link and complete the corresponding tutorial**: [Mass spectrometry: LC-MS preprocessing with XCMS]({% link topics/metabolomics/tutorials/lcms-preprocessing/tutorial.md %}). -For GC-MS analysis you **don't really need to follow all of this previous tutorial** but for a better understanding of your data, it is recommanded to try it with their test dataset. -Concerning the current GC-MS tutorial, you **just have to compute the following steps and specific parameters** described in the hands-on part below (please follow parameters values to have the same results during the training). +For GC-MS analysis you **don't really need to follow all of this previous tutorial** but for a better understanding of your data, it is recommended to try it with their test dataset. +Concerning the current GC-MS tutorial, you **just have to compute the following steps and specific parameters** described in the hands-on part below (please follow the parameter values below to obtain the same results during the training). {: .text-justify} -> Peakpicking of GC-MS data with XCMS +> Peak picking of GC-MS data with XCMS > > 1. {% tool [xcms findChromPeaks (xcmsSet)](toolshed.g2.bx.psu.edu/repos/lecorguille/xcms_xcmsset/abims_xcms_xcmsSet/3.12.0+galaxy0) %} with the following parameters: -> - {% icon param-file %} *"RData file"*: `input.raw.RData` (output of the **MSnbase readMSData** {% icon tool %} job) +> - {% icon param-file %} *"RData file"*: `input.raw.RData` (the output file from the **MSnbase readMSData** {% icon tool %} step) > - *"Extraction method for peaks detection"*: `MatchedFilter - peak detection in chromatographic space` > - *"Full width at half maximum of matched filtration gaussian model peak"*: `5` > - *"Step size to use for profile generation"*: `0.5` @@ -208,7 +229,8 @@ Concerning the current GC-MS tutorial, you **just have to compute the following > > > > > -> > With GC-MS data in profile mode, we need to use the *MatchedFilter* algorithm instead of the *Centwave* one used in the LC-MS tutorial. +> > For GC-MS data in profile mode, use the *MatchedFilter* algorithm instead of the *CentWave* algorithm used in the LC-MS tutorial. +> > For low-resolution GC-MS data, a larger m/z difference (0.5 Da) can be used to separate overlapping peaks. If you have high-resolution data (from GC-ToF or GC-Orbitrap), you can use a smaller m/z difference (0.01 Da). > {: .comment} > > 2. {% tool [xcms findChromPeaks Merger](toolshed.g2.bx.psu.edu/repos/lecorguille/xcms_merge/xcms_merge/3.12.0+galaxy0) %} with the following parameters: @@ -220,7 +242,7 @@ Concerning the current GC-MS tutorial, you **just have to compute the following > > To merge your data, you need to **input a sampleMetadata file** containing filenames and their metadata informations like their class for example. > > If you don't add a sampleMetadata file, the **xcms findChromPeaks Merger** {% icon tool %} tool will **group all your files together**. > > You can also **create your sampleMetadata file** with W4M Galaxy tool **xcms get a sampleMetadata file** {% icon tool %} with the following parameters: *"RData file"* outputed from **MSnbase readMSData** {% icon tool %}. -> > Here is an example of the minimum expectations about a sampleMetadata file (**important**: don't write the format of the file, just their names): +> > Here is an example of the minimum expectations about a sampleMetadata file (**important**: remove file extension from the sample names, file1.mzML should be file1): > > > > > > | sample_name | class | @@ -233,37 +255,38 @@ Concerning the current GC-MS tutorial, you **just have to compute the following > {: .hands_on} -The output from **xcms findChromPeaks Merger** {% icon tool %} is a *.RData* file that is mandatory to follow the next steps of the process. +The output from **xcms findChromPeaks Merger** {% icon tool %} is an *.RData* file required for the next steps of the process. There are two available options: - using the metaMS strategy specifically designed for GC-MS data deconvolution and annotation - using a full XCMS process for GC-MS data processing The two options are illustrated in this tutorial. -{% include _includes/cyoa-choices.html option1="Deconvolution and annotation using metaMS" option2="Process GC-MS data with XCMS function" default="Deconvolution and annotation using metaMS" text="Choose below if you just want to follow the pipeline using **metaMS** or **XCMS** for GC-MS deconvolution and annotation" disambiguation="single_vs_multiple" %} +{% include _includes/cyoa-choices.html option1="Deconvolution and annotation using metaMS" option2="Process GC-MS data with XCMS function" default="Deconvolution and annotation using metaMS" text="Choose below if you just want to follow the pipeline using **metaMS** or **XCMS** for GC-MS deconvolution and annotation" disambiguation="gcms_metams_vs_xcms" %}
# Processing with metaMS (option 1) -**metaMS** is an R package for MS-based metabolomics data, it was made to eas peak picking and deconvolution steps using functions from **XCMS** and **CAMERA** packages. In it's Galaxy implementaion, the 2 mains outputs of **metaMS** are : a table of feature intensities in all samples which can be analyzed with multivariate methods immediately and an `.msp`. +**metaMS** is an R package for MS-based metabolomics data. It was made to ease peak picking and deconvolution steps using functions from **XCMS** and **CAMERA** packages. In its Galaxy implementation, the two main outputs of **metaMS** are: (1) a table of feature intensities in all samples, which can be analyzed with multivariate methods immediately, and (2) an MSP (`.msp`) file containing GC-MS spectra in a common spectral database format. +**Pro-tips:** You can {% icon dataset-save %} download the MSP file and open it in your spectra processing software for further investigation! > > -> *-Note: Not all **metaMS** R packages functions have been made available in Galaxy.-* -When run in R the **metaMS** package offers a lot of possibilities among which functions to create in-house databases of mass spectra (including retention time or indices information) of pure chemical compounds. These databases can then be used for annotation purposes. The most important functions of this package are *runGC* and *runLC* (and each one to create databases *createSTDdbGC* and *createSTDdbLC*). +> **Note:** Not all **metaMS** R package functions have been made available in Galaxy. +When run in R, the **metaMS** package offers a lot of possibilities. For more information on the full set of metaMS functions, visit the [metaMS Bioconductor page](https://www.bioconductor.org/packages/release/bioc/html/metaMS.html). > > {: .comment} {: .text-justify} -During this tutorial we are interested in GC-MS analysis, so we will use the *runGC* function of **metaMS** and described it in details to be able to understand all capacities of that function. -The standard workflow of **metaMS** for GC-MS data is the following : +During this tutorial we are interested in GC-MS analysis, so we will use the *runGC* function of **metaMS** and describe it in detail to understand all the capabilities of that function. +The standard workflow of **metaMS** for GC-MS data is the following: -![Workflow metaMS](../../images/tuto_gcms_workflow_metaMS.png "Workflow of metaMS for GC datas") +![Workflow diagram of metaMS for GC-MS data analysis](../../images/tuto_gcms_workflow_metaMS.png "Workflow of metaMS for GC datas") -The *runGC* function is implemented in **metaMS.runGC {% icon tool %} tool** in Galaxy. It takes as inputs a .RData file after XCMS and optionnaly for annotation purposes an alkane reference file for RI calculation and/or a spectra database in `.msp`. +The *runGC* function is implemented in **metaMS.runGC {% icon tool %} tool** in Galaxy. It takes as inputs a .RData file after XCMS and optionally for annotation purposes an alkane reference file for RI calculation and/or a spectral database in `.msp`. {: .text-justify} -## Peak picking +## Peak picking with metaMS The peak picking is performed by the usual **XCMS** functions and the output file in `.RData` is used for deconvolution and annotation steps. @@ -271,7 +294,7 @@ The peak picking is performed by the usual **XCMS** functions and the output fil ## Definition of pseudo-spectra -The biggest difference between **XCMS** only or **XCMS + metaMS** GC-MS data processing is that rather than a feature-based analysis with individual peaks, as is the case with **XCMS**, **metaMS** performs a pseudospectrum-based analysis. So, the basic entity is a set of m/z values showing a chromatographic peak at the same retention time. The idea behind that is that Electron Ionization (EI), which is the most widely used ionization mode in GC-MS analysis, generates a lot more ions for the same molecule than Electrospray Ionisation used in LC-MS. **metaMS** runGC is able to group all ions belonging to a molecule into one single information that will be used for statistical analysis. For each compound found by **metaMS** a list of gouped m/z and their intensity is exported as pseudospectrum and this will be used for annotation purpose. +The biggest difference between **XCMS** only or **XCMS + metaMS** GC-MS data processing is that rather than a feature-based analysis with individual peaks, as is the case with **XCMS**, **metaMS** performs a pseudospectrum-based analysis. So, the basic entity is a set of m/z values showing a chromatographic peak at the same retention time. The idea behind that is that Electron Ionization (EI), which is the most widely used ionization mode in GC-MS analysis, generates a lot more ions for the same molecule than Electrospray Ionisation used in LC-MS. **metaMS** runGC is able to group all ions belonging to a molecule into one single information that will be used for statistical analysis. For each compound found by **metaMS** a list of gouped m/z and their intensity is exported as pseudospectrum and this will be used for annotation purpose. For that the MSP file format is used, which is a common format for mass spectra databases. The pseudospectra are created by grouping all m/z values of a chromatographic peak at the same retention time into one single entry, and then exporting this information in the `.msp` format. {: .text-justify} ![Pseudospectrum example](../../images/tuto_gcms_pseudospectrum_example.png "Pseudospectrum example from `msp` file") @@ -279,7 +302,7 @@ The biggest difference between **XCMS** only or **XCMS + metaMS** GC-MS data pro This choice is motivated by several considerations. First of all, **in GC the amount of overlap is much less than in LC** : peaks are much narrower. This means that even a one- or two-second difference in retention time can be enough to separate the corresponding mass spectra. Secondly, EI MS spectra for many compounds are **available in extensive libraries like the [NIST library](http://www.nist.gov/srd/nist1a.cfm "NIST library")** or other online ones like [Golm Metabolome library](http://gmd.mpimp-golm.mpg.de/) {: .text-justify} -The `.msp` format created by **metaMS** is the same as the one used the AMDIS software ({% cite Stein1999 %}) generally available on GC-MS instrument. The `.msp` file is a nested list, with one entry for each compound pseudo-spectra. The pseudo-spectra are three-column matrices, containing m/z, intensity and retention time information, respectively. They can be draw with the *plotPseudoSpectrum* function of **metaMS** package easily (Figure 2). +The `.msp` format exported by **metaMS** is the same as the one used the AMDIS software ({% cite Stein1999 %}) generally available on GC-MS instrument. The `.msp` file is a nested list, with one entry for each compound pseudo-spectra. The pseudo-spectra are two-column matrices, containing m/z, intensity information, respectively. In R they can be draw with the *plotPseudoSpectrum* function of **metaMS** package easily (Figure 2). {: .text-justify} @@ -296,9 +319,9 @@ This *matchSamples2DB* function returns a table where all patterns that have a m ## Unknowns research -The most important aspect of untargeted metabolomics is the definition of unknowns, patterns that occur repeatedly in several samples, but for which no annotation has been found. In **metaMS** these unknowns are found by comparing all patterns within a certain retention time (or retention index) difference on their spectral characteristics. The same match function is used, but the threshold may be different from the threshold used to match with the database of standards. Likewise, the maximum retention time(index)difference may be different, too. +An important aspect of untargeted metabolomics is the definition of unknowns—features that occur repeatedly in a minimum number or fraction of samples (as defined by the `min.class.fract` and `min.class.size` parameters in the metaMS settings), but for which no annotation has been found. In **metaMS**, these unknown features are found by comparing all patterns (i.e., pseudo-spectra which are groups of features) within a certain retention time (or retention index) difference on their spectral characteristics. -In defining unknowns we have so far used settings that are more strict than when compared to a database : since all samples are typically measured in one single run, expected retention time differences are rather small. In addition, one would expect reproducible spectra for a single compound. A true unknown, or at least an interesting one, is also present in a significant fraction of the samples. All these parameters are gathered in thebetweenSampleselement of the settingsobject .Since the matching is done using scaled patterns, we need to create a scaled version of the experimental pseudo-spectra first. +In defining unknowns we have so far used settings that are more strict than when compared to a database : since all samples are typically measured in one single run, expected retention time differences are rather small. In addition, one would expect reproducible spectra for a single compound. A true unknown, or at least an interesting one, is also present in a significant fraction of the samples. All these parameters are gathered in the betweenSamples element of the settingsobject .Since the matching is done using scaled patterns, we need to create a scaled version of the experimental pseudo-spectra first. {: .text-justify} For large numbers of samples, this process can take quite some time (it scales quadratically), especiallyif the allowed difference in retention time is large. The result now is a list of two elements : the first is the annotation table that we also saw after the comparison with the database, and the second is a list of pseudo-spectra corresponding to unknowns. In the annotation table, negative indices correspond to the pseudo-spectra in this list. @@ -320,13 +343,13 @@ In addition, one is ignoring the information in the other peaks of the pseudospe In both cases, the result is a list containing a set of patterns corresponding with the compounds that have been found, either annotated or unknown, the relative intensities of these patterns in the individual annotations, and possibly the xcmsSetobject for further inspection. In practice, the *runGC* function is all that users need to use. {: .text-justify} -That file can be used for database search online (as Golm ({% cite Kopka2005 %}) and MassBank ({% cite Horai2010 %})) or locally (NIST MSSEARCH) for NIST search a tutorial is available here. +That file can be used for database search online (as Golm ({% cite Kopka2005 %}) and MassBank ({% cite Horai2010 %})) or locally (NIST MSSEARCH) for NIST search a tutorial is available here [Add link](). {: .text-justify} > metaMS.runGC > > We now know each step of this *runGC* function. So, please open the **metaMS.runGC {% icon tool %} too** to run it. You should enter the following parameters for our tutorial : -> - **Rdata from xcms and merged** : here you have to select your file from **XCMS** where you made the peak picking, grouping and all the pre-processing. It should be named `xset.merged.groupdChromPeaks.RData`. +> - **Rdata from xcms and merged** : here you have to select your file from **XCMS** where you made the peak picking and file merging. It should be named `xset.merged.RData`. > - **Settings** : you can keep it at *user_default* but to see all possible parameters please set it at `use_defnied`. > - **RT range option** : it ables to select a region of retention time. If you select to *show* it, you have to enter the window in minutes, separate by a coma (for example 5,20 to have results between 5 minutes and 20 minutes). For our tutorial, we `keep it to hide`. > - **RT_Diff** : it is the allowed retention time difference in minutes between the same compound/unknown in different sample. For our tutorial, `keep it at 0.05` to have low differences between unknowns' retention times. @@ -335,11 +358,11 @@ That file can be used for database search online (as Golm ({% cite Kopka2005 %}) > - **min.class.fract** : it corresponds to the minimal fraction of samples in which a pseudospectrum is present before it is regarded as an unknown. For the tutorial, please `keep it to 0.5`. > - **min.class.size** : it corresponds to the minimum number of samples in which a pseudospectrum should be present before it is regarded as an unknown. For our tutorial, please `set it to 2` because we have classes with only 2 samples. > - **Use Personnal DataBase option** : you can compare your datas to a personnal database. If you want to do it start to choose `show` in this parameter. Then you will be able to select your file. If not, keep it to `hide` and you will only have unknowns as results. -> - **DB file** : this parameter will appear if you choose to show it. You just have to `select your database in your file` to add this here. Be careful, this database has to respect some rules (please look at *?????????????????? part*). +> - **DB file** : this parameter will appear if you choose to show it. You just have to `select your database in your file` to add this here. Be careful, this database has to respect some rules (for example use `W4M0004_database_small.msp`). > - **Use RI option** : choose if you want to use the RI for standards. -> - **RI file** : enter here `your RI file` which have to contains two columns : retention time and retention indices. +> - **RI file** : enter here `your RI file` which have to contains two columns : retention time and retention indices. Be careful, this file has to respect some rules (please look at *?????????????????? part*). > - **Use RI as filter** : just to know if you want to use RI parameter as a filter. -> - **RIshift** : if you want to use RI as filter, please precise here the RI shift. For our tutorial `keep the previous parameter to FALSE`. +> - **RIshift** : if you want to use RI as a filter, please specify the RI shift here. Any spectra matching your unknowns but being out of the specified range will be discarded. For our tutorial, keep the previous parameter set to FALSE. > > {: .hands_on} @@ -380,15 +403,15 @@ Concerning EICs, it is possible to choose for which compound you want to draw an # Carrying on using the standard XCMS workflow (option 2) -This option follows the standard LC-MS workflow to obtain in the end a dataMatrix file and its corresponding variableMetadata file. +This option follows the standard XCMS workflow to obtain in the end a dataMatrix file and its corresponding variableMetadata file. The main difference with the [option 1](#processing-with-metams-option-1) is that the dataMatrix file will contain individual peaks rather than pseudo-spectra, and the variableMetadata file will contain information about each peak, such as its retention time, m/z, and intensity. No `.msp` file will be generated in this case, as the peaks are not grouped into pseudo-spectra. -> Example of end of extraction when using the standard XCMS workflow +> Example untargeted GC-MS data processing with the standard XCMS workflow > > 1. {% tool [xcms groupChromPeaks (group)](toolshed.g2.bx.psu.edu/repos/lecorguille/xcms_group/abims_xcms_group/3.12.0+galaxy0) %} with the following parameters: > - {% icon param-file %} *"RData file"*: `xset.merged.RData` (output of the **xcms findChromPeaks Merger** {% icon tool %} job) > - *"Method to use for grouping"*: `PeakDensity - peak grouping based on time dimension peak densities` -> - *"Bandwidth"*: `10.0` -> - *"Width of overlapping m/z slices"*: `0.05` +> - *"Bandwidth"*: `5.0` +> - *"Width of overlapping m/z slices"*: `0.5` > > 2. {% tool [xcms fillChromPeaks (fillPeaks)](toolshed.g2.bx.psu.edu/repos/lecorguille/xcms_fillpeaks/abims_xcms_fillPeaks/3.12.0+galaxy0) %} with the following parameters: > - {% icon param-file %} *"RData file"*: `xset.merged.groupChromPeaks.RData` (output of the **xcms groupChromPeaks (group)** {% icon tool %} job) @@ -400,26 +423,26 @@ This option follows the standard LC-MS workflow to obtain in the end a dataMatri > {: .hands_on} -The outputs of this strategy are similar to the ones discribed in the LC-MS tutotial mentioned previously. +The outputs of this strategy are similar to the ones described in the LC-MS tutotial mentioned previously. > Important : Be careful of the file format > > During each step of pre-processing, your dataset has its format changed and can have also its name changed. -> To be able to continue to MSMS processing, you need to have a RData object wich is **merged and grouped** (from **xcms findChromPeaks Merger** {% icon tool %} and **xcms groupChromPeaks (group)** {% icon tool %}) at least. +> To be able to continue to GC-MS processing, you need to have a RData object which is **merged and grouped** (from **xcms findChromPeaks Merger** {% icon tool %} and **xcms groupChromPeaks (group)** {% icon tool %}) at least. > It means that you should have a file named `xset.merged.groupChromPeaks.RData` (and maybe with some step more in it). {: .comment} # Stopover : Verify your data after the XCMS pre-processing -When you have processed **all or only needed** steps described before, you can continue with the MS/MS processing part with **msPurity** package. +When you have processed **all or only needed** steps described before, you can continue the GC-MS processing with statistics or annotation tools. Don't forget to always check your files format! For the next step you need to have this file `xset.merged.groupChromPeaks.*.RData` where * is the name of **optionnal** steps you could do during the pre-processing. For our example, your file should be named `xset.merged.groupchromPeaks.RData`. {: .text-justify} > > -> The pre-processing part of this analysis can be **quite time-consuming**, and already corresponds to quite a few number of steps, depending of your analysis. We highly recommend, at this step of the MS/MS workflow, to split your analysis by beginning a new Galaxy history with **only the files you need** (final xset Rdata file and your data collection of mzML). This will help you in limiting selecting the wrong dataset in further analysis, and bring a little **tidiness** for future review of your MS/MS analysis process. You should also be able to make a better peakpicking in the future in the same history and it will not be polluated by MS/MS part of your process. +> The pre-processing part of this analysis can be **quite time-consuming**, and already corresponds to quite a few number of steps, depending of your analysis. We highly recommend, at this step of the GC-MS workflow, to split your analysis by beginning a new Galaxy history with **only the files you need** (final `.tsv` matrices - sampleMetadata, variableMetadata, dataMatrix and the `.msp` spectral database). This will help you in limiting selecting the wrong dataset in further analysis, and bring a little **tidiness** for future review of your analysis process. You should also be able to make a better peak picking in the future in the same history and it will not be polluated by statistical analysis part of your process. > {: .text-justify} > > > Copy dataset to a new history @@ -440,10 +463,10 @@ For our example, your file should be named `xset.merged.groupchromPeaks.RData`. > {: .comment} -Before the next step with msPurity package on MS/MS datas, here are some questions to be able to verify if your file is ready and if you have the same results as us. Please check these questions : +Before going to the next step of your GC-MS data processing, here are some questions to be able to verify if your files are ready and if you have the same results as us. Please check these questions : {: .text-justify} -> before MS/MS steps +> before going to further GC-MS processing steps > > **1** - What are the steps of XCMS you made before your final file ? > > @@ -451,7 +474,7 @@ Before the next step with msPurity package on MS/MS datas, here are some questio > > Here are the different steps made for our example : > > - **(Not with XCMS)** import your datas into Galaxy instance > > - **MSNbase readMSData** {% icon tool %} to read our MS datas -> > - XCMS peakpicking with **xcms findChromPeaks (xcmsSet)** {% icon tool %} tool +> > - XCMS peak picking with **xcms findChromPeaks (xcmsSet)** {% icon tool %} tool > > - (Not with XCMS but necessary) merge my datas into one file with **xcms findChromPeaks Merger** {% icon tool %} tool > > - XCMS grouping with **xcms groupChromPeaks (group)** {% icon tool %} tool > > - **(Not done)** XCMS retention time correction, then grouping again with xcms adjustRtime (retcor) {% icon tool %} tool @@ -477,7 +500,7 @@ Before the next step with msPurity package on MS/MS datas, here are some questio {: .question} # Conclusion -{% icon trophy %} Well done, you’ve processed GC-MS data! You might want to consult your results with the [key history](https://usegalaxy.eu/u/hechth/h/end-to-end-ei-mass-spectra-prediction-workflow-using-qcxms-1) or use [the workflow](https://usegalaxy.eu/u/hechth/h/end-to-end-ei-mass-spectra-prediction-workflow-using-qcxms-1) associated with this tutorial. +{% icon trophy %} Well done, you’ve processed GC-MS data! You might want to explore other [Galaxy trainings](https://training.galaxyproject.org/training-material/topics/metabolomics/)
From 5ca6d0237e341b96007d3852a2d473f6dae88552 Mon Sep 17 00:00:00 2001 From: Guitton Yann Date: Mon, 28 Jul 2025 18:38:35 +0200 Subject: [PATCH 14/29] correction zenodo link --- topics/metabolomics/tutorials/gcms/tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/topics/metabolomics/tutorials/gcms/tutorial.md b/topics/metabolomics/tutorials/gcms/tutorial.md index 354fc94f88db46..635c09dee287f8 100644 --- a/topics/metabolomics/tutorials/gcms/tutorial.md +++ b/topics/metabolomics/tutorials/gcms/tutorial.md @@ -190,7 +190,7 @@ The first step in the workflow is to detect the peaks in our data using **XCMS** > > 2. Import the following files from [Zenodo]({{ page.zenodo_link }}): > > > > ``` -> > https://zenodo.org/record/16538501/files/xcms_outputs +> > https://zenodo.org/records/16538501/files/xset.merged.RData > > ``` > > > > {% snippet faqs/galaxy/datasets_import_via_link.md %} From c6b8a4ff462b70a6ccc1f11535050623464645b8 Mon Sep 17 00:00:00 2001 From: Guitton Yann Date: Wed, 30 Jul 2025 17:27:07 +0200 Subject: [PATCH 15/29] [WIP] codebase use for corrections --- .../metabolomics/tutorials/gcms/tutorial.bib | 13 ++ .../metabolomics/tutorials/gcms/tutorial.md | 196 +++++++++--------- 2 files changed, 111 insertions(+), 98 deletions(-) diff --git a/topics/metabolomics/tutorials/gcms/tutorial.bib b/topics/metabolomics/tutorials/gcms/tutorial.bib index 9fc81aa214d2ca..b9b2216002303d 100644 --- a/topics/metabolomics/tutorials/gcms/tutorial.bib +++ b/topics/metabolomics/tutorials/gcms/tutorial.bib @@ -169,3 +169,16 @@ @article{Stein1999 title = {An integrated method for spectrum extraction and compound identification from gas chromatography/mass spectrometry data}, journal = {Journal of the American Society for Mass Spectrometry} } + +@article{Horai2010, + doi = {10.1002/jms.1777}, + url = {https://doi.org/10.1002/jms.1777}, + year = {2010}, + month = jul, + publisher = {Journal of mass spectrometry}, + volume = {45}, + pages = {703-714}, + author = {Horai, Hisayuki}, + title = {MassBank: a public repository for sharing mass spectral data for life sciences}, + journal = {Journal of mass spectrometry} +} \ No newline at end of file diff --git a/topics/metabolomics/tutorials/gcms/tutorial.md b/topics/metabolomics/tutorials/gcms/tutorial.md index 635c09dee287f8..e84d8c17cfc850 100644 --- a/topics/metabolomics/tutorials/gcms/tutorial.md +++ b/topics/metabolomics/tutorials/gcms/tutorial.md @@ -27,28 +27,26 @@ contributions: - jsaintvanne - yguitton editing: + - yguitton - melpetera + - jsaintvanne testing: - workflow4metabolomics funding: -- elixir-europe + - elixir-europe --- -You may already know that there are different types of *-omic* sciences; out of these, metabolomics is most closely related to phenotypes. -Metabolomics involves the study of different types of matrices, such as blood, urine, tissues, in various organisms including plants. It focuses on studying the very small molecules -which are called *metabolites*, to better understand matters linked to the metabolism. However, studying metabolites is not a piece of cake -since it requires several critical steps which still have some major bottlenecks. Metabolomics is still quite a young science, and has many -kinds of specific challenges. - -One of the three main technologies used to perform metabolomic analysis is **Gas-Chromatography Mass Spectrometry** (GC-MS). Data analysis -for this technology requires a large variety of steps, ranging from extracting information from the raw data, to statistical analysis -and annotation. Many packages in R/Python are available for the analysis of GC-MS or LC-MS data - for more details see the reviews by {% cite Stanstrup2019 %} and {% cite Misra2021 %}. +You may already know that there are different types of *-omic* sciences; out of these, metabolomics is most closely related to phenotypes. Metabolomics involves the study of different types of matrices, such as blood, urine, tissues, in various organisms including plants. It focuses on studying the very small molecules which are called *metabolites*, to better understand matters linked to the metabolism. However, studying metabolites is not a piece of cake since it requires several critical steps which still have some major bottlenecks. Metabolomics is still quite a young science, and has many kinds of specific challenges. +{: .text-justify} +One of the three main technologies used to perform metabolomic analysis is **Gas-Chromatography Mass Spectrometry** (GC-MS). Data analysis for this technology requires a large variety of steps, ranging from extracting information from the raw data, to statistical analysis and annotation. Many packages in R/Python are available for the analysis of GC-MS or LC-MS data - for more details see the reviews by {% cite Stanstrup2019 %} and {% cite Misra2021 %}. +{: .text-justify} This tutorial explains the main steps involved in untargeted **GC-MS** data processing, to do so we focus on some open-source solutions integrated within the Galaxy framework, namely **XCMS** and **metaMS**. The selected tools and functionalities only covers a small portion of available tools but allow to **perform a complete GC-MS analysis** in a single environment. -In this tutorial, we will learn how to (1) extract features from the raw data using **XCMS** ({% cite Smith2006 %}), (2) deconvolute the detected features into spectra with **metaMS** ({% cite Wehrens2014 %}). - +In this tutorial, we will learn how to (1) extract features from the raw data using **XCMS** ({% cite Smith2006 %}), (2) deconvolute the detected features into spectra with **metaMS** ({% cite Wehrens2014 %}) and (3) annotate unknow spectra using spectral database comparison tools. +{: .text-justify} To illustrate this approach, we will use data from {% cite Dittami2012 %}. Due to time constraints in processing the original dataset, a limited subset of samples was utilized to illustrate the workflow. This subset (see details below) demonstrates the key steps of metabolomics analysis, from pre-processing to annotation. Although the results derived from this reduced sample size may not be scientifically robust, they provide insight into essential methodological foundations of GC-MS data-processing workflow. +{: .text-justify} > Algae samples > @@ -56,31 +54,17 @@ To illustrate this approach, we will use data from {% cite Dittami2012 %}. Due t > > The study utilized a **freshwater strain** of Ectocarpus and a **marine strain** for comparative analysis. The algae were cultured in media with varying salinities, prepared by diluting natural seawater or adding NaCl. The algae were acclimated to these conditions before extraction. > -> The six samples used in this training were analyzed by GC-MS (low resolution instrument). A marine strain raised in sea water media (2 replicates) and freshwater strains raised in either 5% or 100% sea water media (2 replicates each). [Dataset available on Zenodo](https://zenodo.org/records/16538501/) +> The six samples used in this training were analyzed by GC-MS (low resolution instrument). A marine strain raised in sea water media (2 replicates) and freshwater strains raised in either 5% or 100% sea water media (2 replicates each). [Dataset available on Zenodo](https://zenodo.org/records/16538501) > {: .details} -To process the GC-MS data, we can use several tools. **XCMS** ({% cite Smith2006 %}) is a general R package for untargeted metabolomics profiling. It can be used for any type of mass spectrometry acquisition (centroid and profile) or resolution (from low to high resolution), including FT-MS data coupled with a different kind of chromatography (liquid or gas). Because of the generality of packages like **XCMS**, several other packages have been developed to use the functionality of **XCMS** for optimal performance in a particular context. The R package **metaMS** ({% cite Wehrens2014 %}) does so for the field of GC-MS untargeted metabolomics. One of the goals of **metaMS** was to set up a simple system with few user-settable parameters, capable of handling untargeted metabolomics experiments. -In this tutorial we use **XCMS** to detect chromatographic peaks within our samples. Once we have detected them, they need to be deconvoluted into mass spectra representing chemical compounds. For that, we use **metaMS** functions. To normalize the retention time of deconvoluted spectra in our sample, we compute the retention index using Alkane references and a dedicated function of **metaMS**. Finally, we identify detected spectra by aligning them with a database of known compounds. This can be achieved using an in-house built database in the common MSP format (`.msp`) (used in the NIST MS search program for example), resulting in a table of identified compounds. - -MSP files -> MSP (Mass Spectrum Peak) file is a text file structured according to the NIST MSSearch spectra format. MSP is one of the generally accepted formats for mass spectral libraries (or collections of unidentified spectra, so called spectral archives), and it is compatible with lots of spectra processing programs (MS-DIAL, NIST MS Search, AMDIS, matchms, etc.). It can contain one or more mass spectra, which are split by an empty line. The individual spectra essentially consist of two sections: metadata (such as name, spectrum type, ion mode, retention time, and the number of m/z peaks) and peaks, consisting of m/z and intensity tuples. -> -> **Example of an MSP file entry:** -> ``` -> Name: Biomarker1 -> Retention_time: 5.23 -> Num Peaks: 3 -> 43 100 -> 57 80 -> 71 60 -> ``` -> -> For more details, you can view an [example MSP file here](https://zenodo.org/records/16538501/files/W4M0004_database_small.msp). -{: .details} +To process the GC-MS data, we can use several tools. One of these is **XCMS** ({% cite Smith2006 %}) it's a general R package for untargeted metabolomics profiling. It can be used for any type of mass spectrometry acquisition (centroid and profile) or resolution (from low to high resolution), including FT-MS data coupled with a different kind of chromatography (liquid or gas). Because of the generality of packages like **XCMS**, several other packages have been developed to use the functionality of **XCMS** for optimal performance in a particular context. The R package **metaMS** ({% cite Wehrens2014 %}) does so for the field of GC-MS untargeted metabolomics. One of the goals of **metaMS** was to set up a simple system with few user-settable parameters, capable of handling untargeted metabolomics experiments. +In this tutorial we use **XCMS** to detect chromatographic peaks within our samples. Once we have detected them, they need to be deconvoluted into mass spectra representing chemical compounds. For that, we use **metaMS** functions. To normalize the retention time of deconvoluted spectra in our sample, we compute the retention index using Alkane references and a dedicated function of **metaMS**. Finally, we identify detected spectra by aligning them with a database of known compounds. This can be achieved using an in-house built database in the common MSP format (`.msp`) (used in the NIST MS search program for example), resulting in a table of annotated compounds. +{: .text-justify} > > In Galaxy other GC-MS data processing workflows are available and may be of interest for more advanced Galaxy users [Link](https://training.galaxyproject.org/training-material/topics/metabolomics/)] + {: .comment} > @@ -96,6 +80,7 @@ In this tutorial we use **XCMS** to detect chromatographic peaks within our samp # Data preparation and prepocessing Before we can start with the actual analysis pipeline, we first need to download and prepare our dataset. Many of the preprocessing steps can be run in parallel on individual samples. Therefore, we recommend using the Dataset collections in Galaxy. This can be achieved by using the dataset collection option from the beginning of your analysis when uploading your data into Galaxy. +{: .text-justify} ## Import the data into Galaxy @@ -148,14 +133,16 @@ Before we can start with the actual analysis pipeline, we first need to download > {: .hands_on} -As a result of this step, we should have in our history a green Dataset collection with all 6 samples `.mzML` files as well as three separate files with reference alkanes, reference spectral library, and sample metadata. +As a result of this step, you should have in our history a green Dataset collection with all 6 samples `.mzML` files as well as three separate files with reference alkanes, reference spectral library, and sample metadata. ## Create the XCMS object The first part of data processing is using the **XCMS** tool to detect peaks in the MS signal. For that, we first need to take the `.mzML` files and create a format usable by the **XCMS** tool. {% tool [MSnbase readMSData](toolshed.g2.bx.psu.edu/repos/lecorguille/msnbase_readmsdata/msnbase_readmsdata/2.16.1+galaxy0) %} ({% cite gatto2012msnbase %}. {% cite gatto2020msnbase %}) takes as input our files and prepares `RData` files for the first **XCMS** step. +{: .text-justify} > -> **MSnbase readMSData** {% icon tool %} function, prior to **XCMS**, is able to read files with open format as `mzXML`, `mzML`, `mzData` and `netCDF`, which are independent of the constructors' formats. Working with open MS data file format allows users to us tools developed outside of the MS instrument provider. This set of packages/functions gives modularity, and thus is particularly well adapted to define workflows, one of the key points of Galaxy. +> **MSnbase readMSData** {% icon tool %} function, prior to **XCMS**, is able to read files with open format as `mzXML`, `mzML`, `mzData` and `netCDF`, which are independent of the manufacturers' proprietary formats. Working with open MS data file format allows users to us tools developed outside of the MS instrument provider. This set of packages/functions gives modularity, and thus is particularly well adapted to define workflows, one of the key points of Galaxy. +{: .text-justify} {: .comment} > Create the XCMS object @@ -165,21 +152,22 @@ The first part of data processing is using the **XCMS** tool to detect peaks in > > {% snippet faqs/galaxy/tools_select_collection.md %} > -> > Output - `input.raw.RData` -> > -> > Collection of `rdata.msnbase.raw` files. `Rdata` file that is necessary in the next step of the workflow. These serve for an internal R representation of **XCMS** objects needed in the further steps. -> {: .comment} +> The output should be `input.raw.RData` +> +> This dataset is a collection of `rdata.msnbase.raw` files. That `Rdata` file is necessary in the next step of the workflow. It contains an internal R representation of **XCMS** objects. +> {: .hands_on} -> > -> > + +As a result of this step, you should have in our history a new green dataset called `input.raw.RData` that will serve as input for next processing step: **peak picking**. # Peak detection using XCMS The first step in the workflow is to detect the peaks in our data using **XCMS** functions. This part, however, is covered by a [separate tutorial]({{ site.baseurl }}/topics/metabolomics/tutorials/lcms-preprocessing/tutorial.html). Although the tutorial is dedicated to LC-MS data, it can also be followed for our GC-MS data. Therefore, in this section, we do not explain this part of the workflow in detail but rather refer the reader to the dedicated tutorial. Please also pay attention to the parameter values for individual Galaxy tools, as these can differ from the referred tutorial and are adjusted to our GC-MS dataset. +{: .text-justify} -> Skip this step +> Skip peak detection step > -> Since this step is already covered in a [separate tutorial]({{ site.baseurl }}/topics/metabolomics/tutorials/lcms-preprocessing/tutorial.html), it is possible to skip it. Instead, you can continue with [Peak deconvolution]({{ site.baseurl }}/topics/metabolomics/tutorials/gcms/tutorial.html#processing-with-metams-option-1) step using a preprocessed **XCMS** object file prepared for you. +> Since this step is already covered in a [separate tutorial]({{ site.baseurl }}/topics/metabolomics/tutorials/lcms-preprocessing/tutorial.html), it is possible to skip it. Instead, you can go directly to [Peak deconvolution]({{ site.baseurl }}/topics/metabolomics/tutorials/gcms/tutorial.html#processing-with-metams-option-1) step using a preprocessed **XCMS** object file prepared for you. > > > Upload data > > @@ -195,7 +183,7 @@ The first step in the workflow is to detect the peaks in our data using **XCMS** > > > > {% snippet faqs/galaxy/datasets_import_via_link.md %} > > -> > The format of uploaded file containing **XCMS** object should be `rdata.xcms.fillpeaks`. +> > The format of uploaded file containing **XCMS** object should be `rdata.xcms.fillpeaks` or `rdata`. > > > > {% snippet faqs/galaxy/datatypes_understanding_datatypes.md %} > > @@ -207,8 +195,7 @@ The first step in the workflow is to detect the peaks in our data using **XCMS** The first step is to extract peaks from each of your data files independently. For this purpose, we use the _MatchedFilter_ chromatographic peak detection algorithm implemented in {% tool [xcms findChromPeaks (xcmsSet)](toolshed.g2.bx.psu.edu/repos/lecorguille/xcms_xcmsset/abims_xcms_xcmsSet/3.12.0+galaxy0) %}. - -One Galaxy Training material already explains how to act with MS data. We encourage you to **follow this link and complete the corresponding tutorial**: [Mass spectrometry: LC-MS preprocessing with XCMS]({% link topics/metabolomics/tutorials/lcms-preprocessing/tutorial.md %}). + One Galaxy Training material already explains how to act with MS data. We encourage you to **follow this link and complete the corresponding tutorial**: [Mass spectrometry: LC-MS preprocessing with XCMS]({% link topics/metabolomics/tutorials/lcms-preprocessing/tutorial.md %}). For GC-MS analysis you **don't really need to follow all of this previous tutorial** but for a better understanding of your data, it is recommended to try it with their test dataset. Concerning the current GC-MS tutorial, you **just have to compute the following steps and specific parameters** described in the hands-on part below (please follow the parameter values below to obtain the same results during the training). {: .text-justify} @@ -241,7 +228,7 @@ Concerning the current GC-MS tutorial, you **just have to compute the following > > > > To merge your data, you need to **input a sampleMetadata file** containing filenames and their metadata informations like their class for example. > > If you don't add a sampleMetadata file, the **xcms findChromPeaks Merger** {% icon tool %} tool will **group all your files together**. -> > You can also **create your sampleMetadata file** with W4M Galaxy tool **xcms get a sampleMetadata file** {% icon tool %} with the following parameters: *"RData file"* outputed from **MSnbase readMSData** {% icon tool %}. +> > You can also **create your sampleMetadata file** with W4M Galaxy tool {% tool [xcms get a sampleMetadata file](toolshed.g2.bx.psu.edu/repos/lecorguille/xcms_export_samplemetadata/xcms_export_samplemetadata/3.12.0+galaxy3) %} with the following parameters: {% icon param-file %} *"RData file"*: `input.raw.RData` output from **MSnbase readMSData** {% icon tool %}. > > Here is an example of the minimum expectations about a sampleMetadata file (**important**: remove file extension from the sample names, file1.mzML should be file1): > > > > @@ -268,33 +255,66 @@ The two options are illustrated in this tutorial. # Processing with metaMS (option 1) **metaMS** is an R package for MS-based metabolomics data. It was made to ease peak picking and deconvolution steps using functions from **XCMS** and **CAMERA** packages. In its Galaxy implementation, the two main outputs of **metaMS** are: (1) a table of feature intensities in all samples, which can be analyzed with multivariate methods immediately, and (2) an MSP (`.msp`) file containing GC-MS spectra in a common spectral database format. -**Pro-tips:** You can {% icon dataset-save %} download the MSP file and open it in your spectra processing software for further investigation! -> +> Tips > -> **Note:** Not all **metaMS** R package functions have been made available in Galaxy. +> >**Pro-tips:** You can {% icon dataset-save %} download the MSP file and open it in your favorite spectra processing software or online database for further investigation! +> > +> >**Note:** Not all **metaMS** R package functions have been made available in Galaxy. When run in R, the **metaMS** package offers a lot of possibilities. For more information on the full set of metaMS functions, visit the [metaMS Bioconductor page](https://www.bioconductor.org/packages/release/bioc/html/metaMS.html). -> -> {: .comment} +{: .comment} -{: .text-justify} -During this tutorial we are interested in GC-MS analysis, so we will use the *runGC* function of **metaMS** and describe it in detail to understand all the capabilities of that function. +During this part of the tutorial we are interested in GC-MS analysis with **metaMS**, so we will use the *runGC* function of **metaMS** and describe it in detail to understand all the capabilities of that function. The standard workflow of **metaMS** for GC-MS data is the following: ![Workflow diagram of metaMS for GC-MS data analysis](../../images/tuto_gcms_workflow_metaMS.png "Workflow of metaMS for GC datas") -The *runGC* function is implemented in **metaMS.runGC {% icon tool %} tool** in Galaxy. It takes as inputs a .RData file after XCMS and optionally for annotation purposes an alkane reference file for RI calculation and/or a spectral database in `.msp`. +The *runGC* function is implemented in **metaMS.runGC {% icon tool %}** tool in Galaxy. It takes as inputs an .RData file after XCMS and optionally for annotation purposes an alkane reference file (in `.csv` format) for RI calculation and/or a spectral database in `.msp` format. {: .text-justify} ## Peak picking with metaMS -The peak picking is performed by the usual **XCMS** functions and the output file in `.RData` is used for deconvolution and annotation steps. - +The peak picking is performed by the usual **XCMS** functions and the output file in `.RData` is used for deconvolution and annotation steps with _runGC_ function. {: .text-justify} +> metaMS.runGC +> +> 1.{% tool [metaMS.runGC](toolshed.g2.bx.psu.edu/repos/yguitton/metams_rungc/metams_runGC/3.0.0+metaMS1.24.0-galaxy0) %} with the following parameters: +> - {% icon param-file %} *"Rdata from xcms and merged"*: `xset.merged.RData` (output of the **xcms findChromPeaks Merger** {% icon tool %} step) +> - *"Settings"* : `user_defined` +> - *"RT range option"* : `hide` (If set to *show* you can limit the range of RT processed, for example remove solvant delays) +> - *"RT_Diff"* : `0.05` (Max time deviation in minute to cluster unknown pseudo-spectra between samples) +> - *"Min_Features* : `5` (Minimal number of features required to have a valid pseudo-spectrum, compound with less ions will be discarded) +> - *"similarity_threshold"* : `0.7` (Minimum cosine similarity between pseudo-spectra to be considers as equal) +> - *"min.class.fract"* : `0.5` (Minimal fraction of samples in which a pseudo-spectrum should be present to be kept) +> - *"min.class.size"* : `2` (Minimum number of samples in which a pseudo-spectrum should be find) +> - *"Use Personnal DataBase option"* : `show` ( this activate the *"DB file"* selector) +> - {% icon param-file %} *"DB file"* : `W4M0004_database_small.msp` (The file download from Zenodo, if not available set the *"Use Personnal DataBase option"* to *hide*) +> - *"Use RI option* : `show` (choose *hide* if you want to skip RI calculation) +> - {% icon param-file %} *"RI file"* : `reference_alkanes.csv` (Format should be strictly respected) +> - *"Use RI as filter"* :`FALSE` (If set to TRUE only unknown spectra with close RI as those in database will be kept) +> - *"RIshift"* : *"not used"* +> +> > +> > +> > For faster processing keep annotation modules *off* by setting *"Use Personnal DataBase option"* : `hide` and *"Use RI option* : `hide` +> {: .comment} +> +{: .hands_on} + + Definitions +> > Pseudo-spectra +> >The biggest difference between **XCMS** only or **XCMS + metaMS** GC-MS data processing is that rather than a feature-based analysis with individual peaks, as is the case with **XCMS**, **metaMS** performs a pseudospectrum-based analysis. So, the basic entity is a set of m/z values showing a chromatographic peak at the same retention time. The idea behind that is that Electron Ionization (EI), which is the most widely used ionization mode in GC-MS analysis, generates a lot more ions for the same molecule than Electrospray Ionisation used in LC-MS. The function _runGC_ from **metaMS** is able to group all ions belonging to a molecule into one single cluster that will be used for statistical analysis. For each compound found by **metaMS** a list of gouped m/z and their intensity is exported as pseudospectrum and this will be used for annotation purpose. For that the MSP file format is used, which is a common format for mass spectra databases. The pseudospectra are created by grouping all m/z values of a chromatographic peak at the same retention time into one single entry, and then exporting this information in the `.msp` format. +> +> > ![Pseudospectrum example](../../images/tuto_gcms_pseudospectrum_example.png "Pseudospectrum example from `msp` file") +> +> > This choice is motivated by several considerations. First of all, **in GC the amount of overlap is much less than in LC** : peaks are much narrower. This means that even a one- or two-second difference in retention time can be enough to separate the corresponding mass spectra. Secondly, EI MS spectra for many compounds are **available in extensive libraries like the [NIST library](http://www.nist.gov/srd/nist1a.cfm "NIST library")** or other online ones like [Golm Metabolome library](http://gmd.mpimp-golm.mpg.de/) +> +> {: .details} +{: .details} ## Definition of pseudo-spectra -The biggest difference between **XCMS** only or **XCMS + metaMS** GC-MS data processing is that rather than a feature-based analysis with individual peaks, as is the case with **XCMS**, **metaMS** performs a pseudospectrum-based analysis. So, the basic entity is a set of m/z values showing a chromatographic peak at the same retention time. The idea behind that is that Electron Ionization (EI), which is the most widely used ionization mode in GC-MS analysis, generates a lot more ions for the same molecule than Electrospray Ionisation used in LC-MS. **metaMS** runGC is able to group all ions belonging to a molecule into one single information that will be used for statistical analysis. For each compound found by **metaMS** a list of gouped m/z and their intensity is exported as pseudospectrum and this will be used for annotation purpose. For that the MSP file format is used, which is a common format for mass spectra databases. The pseudospectra are created by grouping all m/z values of a chromatographic peak at the same retention time into one single entry, and then exporting this information in the `.msp` format. +The biggest difference between **XCMS** only or **XCMS + metaMS** GC-MS data processing is that rather than a feature-based analysis with individual peaks, as is the case with **XCMS**, **metaMS** performs a pseudospectrum-based analysis. So, the basic entity is a set of m/z values showing a chromatographic peak at the same retention time. The idea behind that is that Electron Ionization (EI), which is the most widely used ionization mode in GC-MS analysis, generates a lot more ions for the same molecule than Electrospray Ionisation used in LC-MS. The function _runGC_ from **metaMS** is able to group all ions belonging to a molecule into one single cluster that will be used for statistical analysis. For each compound found by **metaMS** a list of gouped m/z and their intensity is exported as pseudospectrum and this will be used for annotation purpose. For that the MSP file format is used, which is a common format for mass spectra databases. The pseudospectra are created by grouping all m/z values of a chromatographic peak at the same retention time into one single entry, and then exporting this information in the `.msp` format. {: .text-justify} ![Pseudospectrum example](../../images/tuto_gcms_pseudospectrum_example.png "Pseudospectrum example from `msp` file") @@ -302,13 +322,28 @@ The biggest difference between **XCMS** only or **XCMS + metaMS** GC-MS data pro This choice is motivated by several considerations. First of all, **in GC the amount of overlap is much less than in LC** : peaks are much narrower. This means that even a one- or two-second difference in retention time can be enough to separate the corresponding mass spectra. Secondly, EI MS spectra for many compounds are **available in extensive libraries like the [NIST library](http://www.nist.gov/srd/nist1a.cfm "NIST library")** or other online ones like [Golm Metabolome library](http://gmd.mpimp-golm.mpg.de/) {: .text-justify} -The `.msp` format exported by **metaMS** is the same as the one used the AMDIS software ({% cite Stein1999 %}) generally available on GC-MS instrument. The `.msp` file is a nested list, with one entry for each compound pseudo-spectra. The pseudo-spectra are two-column matrices, containing m/z, intensity information, respectively. In R they can be draw with the *plotPseudoSpectrum* function of **metaMS** package easily (Figure 2). +The `.msp` format exported by **metaMS** is the same as the one used the AMDIS software ({% cite Stein1999 %}) generally available on GC-MS instrument. The `.msp` file is a nested list, with one entry for each compound pseudo-spectra. The pseudo-spectra are two-column matrices, containing m/z, intensity information, respectively. In R they can be drawn with the *plotPseudoSpectrum* function of **metaMS** package easily (Figure 2). {: .text-justify} +>MSP files +> MSP (Mass Spectrum Peak) file is a text file structured according to the NIST MSSearch spectra format. MSP is one of the generally accepted formats for mass spectral libraries (or collections of unidentified spectra, so called spectral archives), and it is compatible with lots of spectra processing programs (MS-DIAL, NIST MS Search, AMDIS, matchms, etc.). It can contain one or more mass spectra, which are split by an empty line. The individual spectra essentially consist of two sections: metadata (such as name, spectrum type, ion mode, retention time, and the number of m/z peaks) and peaks, consisting of m/z and intensity tuples. +> +> **Example of an MSP file entry:** +> ``` +> Name: Biomarker1 +> Retention_time: 5.23 +> Num Peaks: 3 +> 43 100 +> 57 80 +> 71 60 +> ``` +> +> For more details, you can view an [example MSP file here](https://zenodo.org/records/16538501/files/W4M0004_database_small.msp). +{: .details} ## Annotation -Once we have identified our pseudo-spectra, we can start the annotation process. This is done by **comparing every pseudospectrum to a database of spectra**. As a similarity measure, we use the weighted dot product as it is fast, simple, and gives good results ({% cite Stein1994 %}). The first step in the comparison is based on retention, since a comparison of either retention time or retention index is much faster than a spectral comparison. The corresponding function is *matchSamples2DB*. Since the weighted dot product uses scaled mass spectra, the scaling of the database is done once, and then used in all comparisons. +Once **metaMS** have created the pseudo-spectra for each unknown compound, we can start the annotation process. This is done by **comparing every pseudospectrum to a database of spectra**. As a similarity measure, the weighted dot product is used as it is fast, simple, and gives good results ({% cite Stein1994 %}). The first step in the comparison is based on retention, since a comparison of either retention time or retention index is much faster than a spectral comparison. The corresponding R function is *matchSamples2DB*. Since the weighted dot product uses scaled mass spectra, the scaling of the database is done once, and then used in all comparisons. {: .text-justify} ![Match spectra](../../images/tuto_gcms_match_spec.png "Best match between an experimental pseudospectrum (red) and a database entry (blue)") @@ -343,29 +378,9 @@ In addition, one is ignoring the information in the other peaks of the pseudospe In both cases, the result is a list containing a set of patterns corresponding with the compounds that have been found, either annotated or unknown, the relative intensities of these patterns in the individual annotations, and possibly the xcmsSetobject for further inspection. In practice, the *runGC* function is all that users need to use. {: .text-justify} -That file can be used for database search online (as Golm ({% cite Kopka2005 %}) and MassBank ({% cite Horai2010 %})) or locally (NIST MSSEARCH) for NIST search a tutorial is available here [Add link](). +That file can be used for database search online (as Golm ({% cite Kopka2005 %}) and MassBank ({% cite Horai2010 %})) or locally (NIST MSSEARCH) for NIST search a tutorial is available [here](https://workflow4metabolomics.org/sites/default/files/fichiers/documents/w4m_HowToUseNIST_V01.pdf). {: .text-justify} -> metaMS.runGC -> -> We now know each step of this *runGC* function. So, please open the **metaMS.runGC {% icon tool %} too** to run it. You should enter the following parameters for our tutorial : -> - **Rdata from xcms and merged** : here you have to select your file from **XCMS** where you made the peak picking and file merging. It should be named `xset.merged.RData`. -> - **Settings** : you can keep it at *user_default* but to see all possible parameters please set it at `use_defnied`. -> - **RT range option** : it ables to select a region of retention time. If you select to *show* it, you have to enter the window in minutes, separate by a coma (for example 5,20 to have results between 5 minutes and 20 minutes). For our tutorial, we `keep it to hide`. -> - **RT_Diff** : it is the allowed retention time difference in minutes between the same compound/unknown in different sample. For our tutorial, `keep it at 0.05` to have low differences between unknowns' retention times. -> - **Min_Features** : this parameter is used during the comparison with database or unknowns. It corresponds to the minimal number of features required to have a valid pseudospectrum. For our tutorial, please `keep it to 5` to have really good compounds. -> - **similarity_threshold** : this parameter is also used for comparison. It is the minimum similarity allowed between peaks mass spectra to be considers as equal. For our tutorial, please `keep it to 0.7`. -> - **min.class.fract** : it corresponds to the minimal fraction of samples in which a pseudospectrum is present before it is regarded as an unknown. For the tutorial, please `keep it to 0.5`. -> - **min.class.size** : it corresponds to the minimum number of samples in which a pseudospectrum should be present before it is regarded as an unknown. For our tutorial, please `set it to 2` because we have classes with only 2 samples. -> - **Use Personnal DataBase option** : you can compare your datas to a personnal database. If you want to do it start to choose `show` in this parameter. Then you will be able to select your file. If not, keep it to `hide` and you will only have unknowns as results. -> - **DB file** : this parameter will appear if you choose to show it. You just have to `select your database in your file` to add this here. Be careful, this database has to respect some rules (for example use `W4M0004_database_small.msp`). -> - **Use RI option** : choose if you want to use the RI for standards. -> - **RI file** : enter here `your RI file` which have to contains two columns : retention time and retention indices. Be careful, this file has to respect some rules (please look at *?????????????????? part*). -> - **Use RI as filter** : just to know if you want to use RI parameter as a filter. -> - **RIshift** : if you want to use RI as a filter, please specify the RI shift here. Any spectra matching your unknowns but being out of the specified range will be discarded. For our tutorial, keep the previous parameter set to FALSE. -> -> -{: .hands_on} # Take a look at your results after metaMS processing @@ -383,17 +398,6 @@ Concerning EICs, it is possible to choose for which compound you want to draw an ![TIC](../../images/tuto_gcms_eic.png "Example of EIC of the 'Unknown 1' in sample 'alg2'") -> metaMS.plot -> -> This tool is very easy to run. It is an obligation to process **metaMS.runGC {% icon tool %}** before this one. After that, you just have to choose if you want or not to draw your TIC, BPC or EIC : -> - **Rdata from new_metaMS_runGC** : the file you obtained with the **metaMS.runGC {% icon tool %}** tool. It should be named `runGC.RData`. -> - **Do you want to process for TIC(s) ?** : if you select "yes" you will obtain the `pdf` file containing each TIC from each class against each others. -> - **Do you want to process for BPC(s) ?** : if you select "yes" you will obtain the `pdf` file containing each BPC from each class against each others. -> - **Do you want to process for EIC(s) ?** : if you select "yes" you will have to choose which compound(s) and unknown(s) you want to obtain its EIC. -> - **EIC_Unknown** : here please choose which compound(s) or unknown(s) you want to obtain according to the `peaktable.tsv` file. For out tutorial it can be interesting to have a look at **all** the EICs. So put the `value to 0`. -> -{: .hands_on} - # Conclusion {% icon trophy %} Well done, you’ve processed GC-MS data! You might want to consult your results with the [key history](https://usegalaxy.eu/u/hechth/h/end-to-end-ei-mass-spectra-prediction-workflow-using-qcxms-1) or use [the workflow](https://usegalaxy.eu/u/hechth/h/end-to-end-ei-mass-spectra-prediction-workflow-using-qcxms-1) associated with this tutorial. @@ -403,7 +407,7 @@ Concerning EICs, it is possible to choose for which compound you want to draw an # Carrying on using the standard XCMS workflow (option 2) -This option follows the standard XCMS workflow to obtain in the end a dataMatrix file and its corresponding variableMetadata file. The main difference with the [option 1](#processing-with-metams-option-1) is that the dataMatrix file will contain individual peaks rather than pseudo-spectra, and the variableMetadata file will contain information about each peak, such as its retention time, m/z, and intensity. No `.msp` file will be generated in this case, as the peaks are not grouped into pseudo-spectra. +This option follows the standard **XCMS** workflow to obtain in the end a *dataMatrix* file and its corresponding *variableMetadata* file. The main difference with the [option 1](#processing-with-metams-option-1) is that the *dataMatrix* file will contain individual peaks rather than pseudo-spectra, and the *variableMetadata* file will contain information about each peak, such as its retention time, m/z, and intensity. **No** `.msp` file will be generated in this case, as the peaks are not grouped into pseudo-spectra so the annotation proces will be different. > Example untargeted GC-MS data processing with the standard XCMS workflow > @@ -436,13 +440,12 @@ The outputs of this strategy are similar to the ones described in the LC-MS tuto # Stopover : Verify your data after the XCMS pre-processing When you have processed **all or only needed** steps described before, you can continue the GC-MS processing with statistics or annotation tools. -Don't forget to always check your files format! For the next step you need to have this file `xset.merged.groupChromPeaks.*.RData` where * is the name of **optionnal** steps you could do during the pre-processing. -For our example, your file should be named `xset.merged.groupchromPeaks.RData`. +Don't forget to always check your files format! {: .text-justify} > > -> The pre-processing part of this analysis can be **quite time-consuming**, and already corresponds to quite a few number of steps, depending of your analysis. We highly recommend, at this step of the GC-MS workflow, to split your analysis by beginning a new Galaxy history with **only the files you need** (final `.tsv` matrices - sampleMetadata, variableMetadata, dataMatrix and the `.msp` spectral database). This will help you in limiting selecting the wrong dataset in further analysis, and bring a little **tidiness** for future review of your analysis process. You should also be able to make a better peak picking in the future in the same history and it will not be polluated by statistical analysis part of your process. +> The pre-processing part of this analysis can be **quite time-consuming**, and already corresponds to quite a few number of steps, depending of your analysis. We highly recommend, at this step of the GC-MS workflow, to split your analysis by beginning a new Galaxy history with **only the files you need** (final `.tsv` matrices - sampleMetadata, variableMetadata, dataMatrix and the `.msp` spectral database). This will help you in limiting selecting the wrong dataset in further analysis, and bring a little **tidiness** for future review of your analysis process. You should also be able to make a better peak picking in the future in the same history and it will not be polluted by statistical analysis part of your process. > {: .text-justify} > > > Copy dataset to a new history @@ -502,7 +505,4 @@ Before going to the next step of your GC-MS data processing, here are some quest # Conclusion {% icon trophy %} Well done, you’ve processed GC-MS data! You might want to explore other [Galaxy trainings](https://training.galaxyproject.org/training-material/topics/metabolomics/) -
- - - +
\ No newline at end of file From 39f395ac1bf9b309d916435431a8de29c6ce4ca3 Mon Sep 17 00:00:00 2001 From: Guitton Yann Date: Thu, 31 Jul 2025 15:57:59 +0200 Subject: [PATCH 16/29] Add gcms gtn workflow file --- .../images/tuto_gcms_workflow_2options.png | Bin 0 -> 146292 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 topics/metabolomics/images/tuto_gcms_workflow_2options.png diff --git a/topics/metabolomics/images/tuto_gcms_workflow_2options.png b/topics/metabolomics/images/tuto_gcms_workflow_2options.png new file mode 100644 index 0000000000000000000000000000000000000000..929caf85f7b8cd5b4f0f30b4fd3f520b324b3c97 GIT binary patch literal 146292 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

HBp`8@i1SEq<`}(5 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

&ujsl(@|0M-?%CJBI9qax}?J#e_sP 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 X|IEtLe;kDU{8IPj#Xj8CfBJs`lEGJH literal 0 HcmV?d00001 From a4053c0f280d72a0c7bff49ac6435f80921b582f Mon Sep 17 00:00:00 2001 From: Guitton Yann Date: Thu, 31 Jul 2025 16:02:39 +0200 Subject: [PATCH 17/29] Update tutorial.md re-edit horai2010 --- .../metabolomics/tutorials/gcms/tutorial.bib | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/topics/metabolomics/tutorials/gcms/tutorial.bib b/topics/metabolomics/tutorials/gcms/tutorial.bib index b9b2216002303d..4e908fb28e7e83 100644 --- a/topics/metabolomics/tutorials/gcms/tutorial.bib +++ b/topics/metabolomics/tutorials/gcms/tutorial.bib @@ -171,14 +171,16 @@ @article{Stein1999 } @article{Horai2010, - doi = {10.1002/jms.1777}, - url = {https://doi.org/10.1002/jms.1777}, - year = {2010}, - month = jul, - publisher = {Journal of mass spectrometry}, + author = {Horai, Hisayuki and Arita, Masanori and Kanaya, Shigehiko and Nihei, Yoshito and Ikeda, Tasuku and Suwa, Kazuhiro and Ojima, Yuya and Tanaka, Kenichi and Tanaka, Satoshi and Aoshima, Ken and Oda, Yoshiya and Kakazu, Yuji and Kusano, Miyako and Tohge, Takayuki and Matsuda, Fumio and Sawada, Yuji and Hirai, Masami Yokota and Nakanishi, Hiroki and Ikeda, Kazutaka and Akimoto, Naoshige and Maoka, Takashi and Takahashi, Hiroki and Ara, Takeshi and Sakurai, Nozomu and Suzuki, Hideyuki and Shibata, Daisuke and Neumann, Steffen and Iida, Takashi and Tanaka, Ken and Funatsu, Kimito and Matsuura, Fumito and Soga, Tomoyoshi and Taguchi, Ryo and Saito, Kazuki and Nishioka, Takaaki}, + title = {MassBank: a public repository for sharing mass spectral data for life sciences}, + journal = {Journal of Mass Spectrometry}, volume = {45}, + number = {7}, pages = {703-714}, - author = {Horai, Hisayuki}, - title = {MassBank: a public repository for sharing mass spectral data for life sciences}, - journal = {Journal of mass spectrometry} -} \ No newline at end of file + keywords = {MassBank, public database, distributed database, metabolite, spectral similarity}, + doi = {https://doi.org/10.1002/jms.1777}, + url = {https://analyticalsciencejournals.onlinelibrary.wiley.com/doi/abs/10.1002/jms.1777}, + eprint = {https://analyticalsciencejournals.onlinelibrary.wiley.com/doi/pdf/10.1002/jms.1777}, + abstract = {Abstract MassBank is the first public repository of mass spectra of small chemical compounds for life sciences (<3000 Da). The database contains 605 electron-ionization mass spectrometry(EI-MS), 137 fast atom bombardment MS and 9276 electrospray ionization (ESI)-MSn data of 2337 authentic compounds of metabolites, 11 545 EI-MS and 834 other-MS data of 10 286 volatile natural and synthetic compounds, and 3045 ESI-MS2 data of 679 synthetic drugs contributed by 16 research groups (January 2010). ESI-MS2 data were analyzed under nonstandardized, independent experimental conditions. MassBank is a distributed database. Each research group provides data from its own MassBank data servers distributed on the Internet. MassBank users can access either all of the MassBank data or a subset of the data by specifying one or more experimental conditions. In a spectral search to retrieve mass spectra similar to a query mass spectrum, the similarity score is calculated by a weighted cosine correlation in which weighting exponents on peak intensity and the mass-to-charge ratio are optimized to the ESI-MS2 data. MassBank also provides a merged spectrum for each compound prepared by merging the analyzed ESI-MS2 data on an identical compound under different collision-induced dissociation conditions. Data merging has significantly improved the precision of the identification of a chemical compound by 21–23\% at a similarity score of 0.6. Thus, MassBank is useful for the identification of chemical compounds and the publication of experimental data. Copyright © 2010 John Wiley \& Sons, Ltd.}, + year = {2010} +} From 19218d7da425ef8cec27d88dee28798edc492bd1 Mon Sep 17 00:00:00 2001 From: Guitton Yann Date: Thu, 31 Jul 2025 16:03:37 +0200 Subject: [PATCH 18/29] Update tutorial.md full backup from 30072025 --- .../metabolomics/tutorials/gcms/tutorial.md | 192 ++++++++---------- 1 file changed, 88 insertions(+), 104 deletions(-) diff --git a/topics/metabolomics/tutorials/gcms/tutorial.md b/topics/metabolomics/tutorials/gcms/tutorial.md index e84d8c17cfc850..16c4b72c4dee99 100644 --- a/topics/metabolomics/tutorials/gcms/tutorial.md +++ b/topics/metabolomics/tutorials/gcms/tutorial.md @@ -62,9 +62,8 @@ To process the GC-MS data, we can use several tools. One of these is **XCMS** ( In this tutorial we use **XCMS** to detect chromatographic peaks within our samples. Once we have detected them, they need to be deconvoluted into mass spectra representing chemical compounds. For that, we use **metaMS** functions. To normalize the retention time of deconvoluted spectra in our sample, we compute the retention index using Alkane references and a dedicated function of **metaMS**. Finally, we identify detected spectra by aligning them with a database of known compounds. This can be achieved using an in-house built database in the common MSP format (`.msp`) (used in the NIST MS search program for example), resulting in a table of annotated compounds. {: .text-justify} -> -> In Galaxy other GC-MS data processing workflows are available and may be of interest for more advanced Galaxy users [Link](https://training.galaxyproject.org/training-material/topics/metabolomics/)] - + +In Galaxy other GC-MS data processing workflows are available and may be of interest for more advanced Galaxy users [Link](https://training.galaxyproject.org/training-material/topics/metabolomics/) {: .comment} > @@ -133,7 +132,7 @@ Before we can start with the actual analysis pipeline, we first need to download > {: .hands_on} -As a result of this step, you should have in our history a green Dataset collection with all 6 samples `.mzML` files as well as three separate files with reference alkanes, reference spectral library, and sample metadata. +As a result of this step, you should have in our history a green Dataset collection {% icon param-collection %} with all 6 samples `.mzML` files as well as three separate files with reference alkanes, reference spectral library, and sample metadata. ## Create the XCMS object @@ -191,9 +190,8 @@ The first step in the workflow is to detect the peaks in our data using **XCMS** > {: .details} -## Peak picking -The first step is to extract peaks from each of your data files independently. For this purpose, we use the _MatchedFilter_ chromatographic peak detection algorithm implemented in {% tool [xcms findChromPeaks (xcmsSet)](toolshed.g2.bx.psu.edu/repos/lecorguille/xcms_xcmsset/abims_xcms_xcmsSet/3.12.0+galaxy0) %}. +The first step (*called peak picking*) is to extract peaks from each of your data files independently. For this purpose, we use the _MatchedFilter_ chromatographic peak detection algorithm implemented in {% tool [xcms findChromPeaks (xcmsSet)](toolshed.g2.bx.psu.edu/repos/lecorguille/xcms_xcmsset/abims_xcms_xcmsSet/3.12.0+galaxy0) %}. One Galaxy Training material already explains how to act with MS data. We encourage you to **follow this link and complete the corresponding tutorial**: [Mass spectrometry: LC-MS preprocessing with XCMS]({% link topics/metabolomics/tutorials/lcms-preprocessing/tutorial.md %}). For GC-MS analysis you **don't really need to follow all of this previous tutorial** but for a better understanding of your data, it is recommended to try it with their test dataset. @@ -204,7 +202,7 @@ Concerning the current GC-MS tutorial, you **just have to compute the following > Peak picking of GC-MS data with XCMS > > 1. {% tool [xcms findChromPeaks (xcmsSet)](toolshed.g2.bx.psu.edu/repos/lecorguille/xcms_xcmsset/abims_xcms_xcmsSet/3.12.0+galaxy0) %} with the following parameters: -> - {% icon param-file %} *"RData file"*: `input.raw.RData` (the output file from the **MSnbase readMSData** {% icon tool %} step) +> - {% icon param-collection %} *"RData file"*: `input.raw.RData` (the output collection of files from the **MSnbase readMSData** {% icon tool %} step) > - *"Extraction method for peaks detection"*: `MatchedFilter - peak detection in chromatographic space` > - *"Full width at half maximum of matched filtration gaussian model peak"*: `5` > - *"Step size to use for profile generation"*: `0.5` @@ -221,14 +219,14 @@ Concerning the current GC-MS tutorial, you **just have to compute the following > {: .comment} > > 2. {% tool [xcms findChromPeaks Merger](toolshed.g2.bx.psu.edu/repos/lecorguille/xcms_merge/xcms_merge/3.12.0+galaxy0) %} with the following parameters: -> - {% icon param-file %} *"RData file"*: `input.raw.xset.RData` (output of the **xcms findChromPeaks (xcmsSet)** {% icon tool %} job) +> - {% icon param-collection %} *"RData file"*: `input.raw.xset.RData` (output collection of files from the **xcms findChromPeaks (xcmsSet)** {% icon tool %} job) > - {% icon param-file %} *"Sample metadata file "*: `sampleMetadata.tsv` (One of the uploaded files from Zenodo) > > > > > > > To merge your data, you need to **input a sampleMetadata file** containing filenames and their metadata informations like their class for example. > > If you don't add a sampleMetadata file, the **xcms findChromPeaks Merger** {% icon tool %} tool will **group all your files together**. -> > You can also **create your sampleMetadata file** with W4M Galaxy tool {% tool [xcms get a sampleMetadata file](toolshed.g2.bx.psu.edu/repos/lecorguille/xcms_export_samplemetadata/xcms_export_samplemetadata/3.12.0+galaxy3) %} with the following parameters: {% icon param-file %} *"RData file"*: `input.raw.RData` output from **MSnbase readMSData** {% icon tool %}. +> > You can also **create your sampleMetadata file** with W4M Galaxy tool {% tool [xcms get a sampleMetadata file](toolshed.g2.bx.psu.edu/repos/lecorguille/xcms_export_samplemetadata/xcms_export_samplemetadata/3.12.0+galaxy3) %} with the following parameters: {% icon param-collection %} *"RData file"*: `input.raw.RData` output from **MSnbase readMSData** {% icon tool %}. > > Here is an example of the minimum expectations about a sampleMetadata file (**important**: remove file extension from the sample names, file1.mzML should be file1): > > > > @@ -246,6 +244,7 @@ The output from **xcms findChromPeaks Merger** {% icon tool %} is an *.RData* fi There are two available options: - using the metaMS strategy specifically designed for GC-MS data deconvolution and annotation - using a full XCMS process for GC-MS data processing + The two options are illustrated in this tutorial. {% include _includes/cyoa-choices.html option1="Deconvolution and annotation using metaMS" option2="Process GC-MS data with XCMS function" default="Deconvolution and annotation using metaMS" text="Choose below if you just want to follow the pipeline using **metaMS** or **XCMS** for GC-MS deconvolution and annotation" disambiguation="gcms_metams_vs_xcms" %} @@ -254,27 +253,26 @@ The two options are illustrated in this tutorial. # Processing with metaMS (option 1) -**metaMS** is an R package for MS-based metabolomics data. It was made to ease peak picking and deconvolution steps using functions from **XCMS** and **CAMERA** packages. In its Galaxy implementation, the two main outputs of **metaMS** are: (1) a table of feature intensities in all samples, which can be analyzed with multivariate methods immediately, and (2) an MSP (`.msp`) file containing GC-MS spectra in a common spectral database format. +**metaMS** is an R package for MS-based metabolomics data. It was made to ease GC-MS data deconvolution and alignement steps using functions from **XCMS** and **CAMERA** packages. In its Galaxy implementation, the two main outputs of **metaMS** are: (1) a table of feature intensities in all samples, which can be analyzed with multivariate methods immediately, and (2) an MSP (`.msp`) file containing GC-MS spectra in a common spectral database format. +The biggest difference between **XCMS** only workflow (option 2) or **XCMS + metaMS** GC-MS data processing (option 1) is that rather than a feature-based analysis with individual peaks, as in the option 2 case, **metaMS** performs a pseudospectrum-based analysis and use it to align compound between samples. One other advantage is that **metaMS** allows creation of MSP (`.msp`) spectra export files ready for annotation. -> Tips +> > -> >**Pro-tips:** You can {% icon dataset-save %} download the MSP file and open it in your favorite spectra processing software or online database for further investigation! -> > -> >**Note:** Not all **metaMS** R package functions have been made available in Galaxy. +> >Not all **metaMS** R package functions have been made available in Galaxy. When run in R, the **metaMS** package offers a lot of possibilities. For more information on the full set of metaMS functions, visit the [metaMS Bioconductor page](https://www.bioconductor.org/packages/release/bioc/html/metaMS.html). {: .comment} During this part of the tutorial we are interested in GC-MS analysis with **metaMS**, so we will use the *runGC* function of **metaMS** and describe it in detail to understand all the capabilities of that function. The standard workflow of **metaMS** for GC-MS data is the following: -![Workflow diagram of metaMS for GC-MS data analysis](../../images/tuto_gcms_workflow_metaMS.png "Workflow of metaMS for GC datas") +![Workflow diagram of metaMS for GC-MS data analysis](../../images/tuto_gcms_workflow_2options.png "Workflow of metaMS for GC datas") -The *runGC* function is implemented in **metaMS.runGC {% icon tool %}** tool in Galaxy. It takes as inputs an .RData file after XCMS and optionally for annotation purposes an alkane reference file (in `.csv` format) for RI calculation and/or a spectral database in `.msp` format. +The *runGC* function is implemented in **metaMS.runGC {% icon tool %}** tool in Galaxy. It takes as inputs an {% icon param-collection %} *.RData* file after **XCMS** peak picking and optionally for annotation purposes an alkane reference file (in `.csv` format) for RI calculation and/or a spectral database in `.msp` format. {: .text-justify} -## Peak picking with metaMS +## Deconvolution and Alignement with metaMS -The peak picking is performed by the usual **XCMS** functions and the output file in `.RData` is used for deconvolution and annotation steps with _runGC_ function. +The peak picking is performed by the usual **XCMS** functions and the output file in `.RData` is used for deconvolution and Alignment steps with _runGC_ function. {: .text-justify} > metaMS.runGC @@ -300,55 +298,45 @@ The peak picking is performed by the usual **XCMS** functions and the output fil > > For faster processing keep annotation modules *off* by setting *"Use Personnal DataBase option"* : `hide` and *"Use RI option* : `hide` > {: .comment} > +> > Export MSP file to external databases +> > >You can {% icon dataset-save %} download the MSP file and open it in your favorite spectra processing software or online database for further investigation! +> {: .tip} {: .hands_on} - Definitions +> Definitions > > Pseudo-spectra -> >The biggest difference between **XCMS** only or **XCMS + metaMS** GC-MS data processing is that rather than a feature-based analysis with individual peaks, as is the case with **XCMS**, **metaMS** performs a pseudospectrum-based analysis. So, the basic entity is a set of m/z values showing a chromatographic peak at the same retention time. The idea behind that is that Electron Ionization (EI), which is the most widely used ionization mode in GC-MS analysis, generates a lot more ions for the same molecule than Electrospray Ionisation used in LC-MS. The function _runGC_ from **metaMS** is able to group all ions belonging to a molecule into one single cluster that will be used for statistical analysis. For each compound found by **metaMS** a list of gouped m/z and their intensity is exported as pseudospectrum and this will be used for annotation purpose. For that the MSP file format is used, which is a common format for mass spectra databases. The pseudospectra are created by grouping all m/z values of a chromatographic peak at the same retention time into one single entry, and then exporting this information in the `.msp` format. -> -> > ![Pseudospectrum example](../../images/tuto_gcms_pseudospectrum_example.png "Pseudospectrum example from `msp` file") -> -> > This choice is motivated by several considerations. First of all, **in GC the amount of overlap is much less than in LC** : peaks are much narrower. This means that even a one- or two-second difference in retention time can be enough to separate the corresponding mass spectra. Secondly, EI MS spectra for many compounds are **available in extensive libraries like the [NIST library](http://www.nist.gov/srd/nist1a.cfm "NIST library")** or other online ones like [Golm Metabolome library](http://gmd.mpimp-golm.mpg.de/) +> > The biggest difference between **XCMS** only or **XCMS + metaMS** GC-MS data processing is that rather than a feature-based analysis with individual peaks, as is the case with **XCMS**, **metaMS** performs a pseudospectrum-based analysis. So, the basic entity is a set of m/z values showing a chromatographic peak at the same retention time. The idea behind that is that Electron Ionization (EI), which is the most widely used ionization mode in GC-MS analysis, generates a lot more ions for the same molecule than Electrospray Ionisation used in LC-MS. The function _runGC_ from **metaMS** is able to group all ions belonging to a molecule into one single cluster that will be used for statistical analysis. For each compound found by **metaMS** a list of gouped m/z and their intensity is exported as pseudospectrum and this will be used for annotation purpose. For that the MSP file format is used, which is a common format for mass spectra databases. The pseudospectra are created by grouping all m/z values of a chromatographic peak at the same retention time into one single entry, and then exporting this information in the `.msp` format. +> > +> > ![TIC](../../images/tuto_gcms_eic.png "Example of cluster of ions EIC's (left) and the associated pseudospectra (right)") +> > +> > This choice is motivated by several considerations. First of all, **in GC the amount of overlap is much less than in LC** : peaks are much narrower. This means that even a one- or two-second difference in retention time can be enough to separate the corresponding mass spectra. Secondly, EI MS spectra for many compounds are **available in extensive libraries like the [NIST library](http://www.nist.gov/srd/nist1a.cfm "NIST library")** or other online ones like [Golm Metabolome library](http://gmd.mpimp-golm.mpg.de/) +> {: .details} > +> > MSP files +> > MSP (Mass Spectrum Peak) file is a text file structured according to the NIST MSSearch spectra format. MSP is one of the generally accepted formats for mass spectral libraries (or collections of unidentified spectra, so called spectral archives), and it is compatible with lots of spectra processing programs (MS-DIAL, NIST MS Search, AMDIS, matchms, etc.). It can contain one or more mass spectra, which are split by an empty line. The individual spectra essentially consist of two sections: metadata (such as name, spectrum type, ion mode, retention time, and the number of m/z peaks) and peaks, consisting of m/z and intensity tuples. +> > +> > **Example of an MSP file entry:** +> > ``` +> > Name: Biomarker1 +> > Retention_time: 5.23 +> > Num Peaks: 3 +> > 43 100 +> > 57 80 +> > 71 60 +> > ``` +> > +> > For more details, you can view an [example MSP file here](https://zenodo.org/records/16538501/files/W4M0004_database_small.msp). > {: .details} {: .details} -## Definition of pseudo-spectra -The biggest difference between **XCMS** only or **XCMS + metaMS** GC-MS data processing is that rather than a feature-based analysis with individual peaks, as is the case with **XCMS**, **metaMS** performs a pseudospectrum-based analysis. So, the basic entity is a set of m/z values showing a chromatographic peak at the same retention time. The idea behind that is that Electron Ionization (EI), which is the most widely used ionization mode in GC-MS analysis, generates a lot more ions for the same molecule than Electrospray Ionisation used in LC-MS. The function _runGC_ from **metaMS** is able to group all ions belonging to a molecule into one single cluster that will be used for statistical analysis. For each compound found by **metaMS** a list of gouped m/z and their intensity is exported as pseudospectrum and this will be used for annotation purpose. For that the MSP file format is used, which is a common format for mass spectra databases. The pseudospectra are created by grouping all m/z values of a chromatographic peak at the same retention time into one single entry, and then exporting this information in the `.msp` format. -{: .text-justify} +## Alignement -![Pseudospectrum example](../../images/tuto_gcms_pseudospectrum_example.png "Pseudospectrum example from `msp` file") - -This choice is motivated by several considerations. First of all, **in GC the amount of overlap is much less than in LC** : peaks are much narrower. This means that even a one- or two-second difference in retention time can be enough to separate the corresponding mass spectra. Secondly, EI MS spectra for many compounds are **available in extensive libraries like the [NIST library](http://www.nist.gov/srd/nist1a.cfm "NIST library")** or other online ones like [Golm Metabolome library](http://gmd.mpimp-golm.mpg.de/) -{: .text-justify} - -The `.msp` format exported by **metaMS** is the same as the one used the AMDIS software ({% cite Stein1999 %}) generally available on GC-MS instrument. The `.msp` file is a nested list, with one entry for each compound pseudo-spectra. The pseudo-spectra are two-column matrices, containing m/z, intensity information, respectively. In R they can be drawn with the *plotPseudoSpectrum* function of **metaMS** package easily (Figure 2). -{: .text-justify} - ->MSP files -> MSP (Mass Spectrum Peak) file is a text file structured according to the NIST MSSearch spectra format. MSP is one of the generally accepted formats for mass spectral libraries (or collections of unidentified spectra, so called spectral archives), and it is compatible with lots of spectra processing programs (MS-DIAL, NIST MS Search, AMDIS, matchms, etc.). It can contain one or more mass spectra, which are split by an empty line. The individual spectra essentially consist of two sections: metadata (such as name, spectrum type, ion mode, retention time, and the number of m/z peaks) and peaks, consisting of m/z and intensity tuples. -> -> **Example of an MSP file entry:** -> ``` -> Name: Biomarker1 -> Retention_time: 5.23 -> Num Peaks: 3 -> 43 100 -> 57 80 -> 71 60 -> ``` -> -> For more details, you can view an [example MSP file here](https://zenodo.org/records/16538501/files/W4M0004_database_small.msp). -{: .details} - -## Annotation - -Once **metaMS** have created the pseudo-spectra for each unknown compound, we can start the annotation process. This is done by **comparing every pseudospectrum to a database of spectra**. As a similarity measure, the weighted dot product is used as it is fast, simple, and gives good results ({% cite Stein1994 %}). The first step in the comparison is based on retention, since a comparison of either retention time or retention index is much faster than a spectral comparison. The corresponding R function is *matchSamples2DB*. Since the weighted dot product uses scaled mass spectra, the scaling of the database is done once, and then used in all comparisons. +Once **metaMS** have created the pseudo-spectra for each unknown compound in each files, we can start the annotation process. This is done by **comparing every pseudospectrum ** to each others in order to group/align similar MS spectra between samples. As a similarity measure, the weighted dot product is used as it is fast, simple, and gives good results ({% cite Stein1994 %}). The first step in the comparison is based on retention, since a comparison of either retention time or retention index is much faster than a spectral comparison. Since the weighted dot product uses scaled mass spectra, the scaling of the database is done once, and then used in all comparisons. If a pseudo-spectra Y from sample A is similar to pseudo-spectra X in sample B and they have close retention (time or index) then thay are aligned. This process will create the *dataMatrix* and *variableMetadata* outputs. {: .text-justify} ![Match spectra](../../images/tuto_gcms_match_spec.png "Best match between an experimental pseudospectrum (red) and a database entry (blue)") -This *matchSamples2DB* function returns a table where all patterns that have a match with a DB entry are shown in the first column, and the DB entry itself in the second column. If for a particular experimental pattern more than one match is found, the alternatives (with a lower match factor) are shown in the last column. To see the match for a particular pattern, one can use the function *matchExpSpec*, returning matchfactors (numbers between 0 and 1, where the latter means a perfect match) for all entries in the database (if the plotIt argument is TRUE, the best match is shown – see Figure 2). Samples may contain compounds that are not of any interest, such as plasticizers, internal standards, column material etc.... These can be filtered out before doing an annotation : **metaMS** allows certain categories of database entries (defined in slot *matchIrrelevants* of the settings object) to be removed before further annotation. If the spectra of these compounds are very specific (and they often are), the retention criterion may be bypassed by setting the maximal retention time difference to very high values, which leads to the removal of such spectra wherever they occur in the chromatogram. +If an MSP database have been added to the *runGC* function inputs then the function returns a table where all patterns that have a match with a DB entry are shown with their name, the other pseudo-spectra will be named UnknownX in the first column of the *variableMetadata* and *dataMatrix*. {: .text-justify} @@ -359,7 +347,7 @@ An important aspect of untargeted metabolomics is the definition of unknowns—f In defining unknowns we have so far used settings that are more strict than when compared to a database : since all samples are typically measured in one single run, expected retention time differences are rather small. In addition, one would expect reproducible spectra for a single compound. A true unknown, or at least an interesting one, is also present in a significant fraction of the samples. All these parameters are gathered in the betweenSamples element of the settingsobject .Since the matching is done using scaled patterns, we need to create a scaled version of the experimental pseudo-spectra first. {: .text-justify} -For large numbers of samples, this process can take quite some time (it scales quadratically), especiallyif the allowed difference in retention time is large. The result now is a list of two elements : the first is the annotation table that we also saw after the comparison with the database, and the second is a list of pseudo-spectra corresponding to unknowns. In the annotation table, negative indices correspond to the pseudo-spectra in this list. +For large numbers of samples, this process can take quite some time (it scales quadratically), especially if the allowed difference in retention time is large. The result now is a list of two elements : the first is the annotation table that we also saw after the comparison with the database, and the second is a list of pseudo-spectra corresponding to unknowns. {: .text-justify} @@ -381,8 +369,6 @@ In both cases, the result is a list containing a set of patterns corresponding w That file can be used for database search online (as Golm ({% cite Kopka2005 %}) and MassBank ({% cite Horai2010 %})) or locally (NIST MSSEARCH) for NIST search a tutorial is available [here](https://workflow4metabolomics.org/sites/default/files/fichiers/documents/w4m_HowToUseNIST_V01.pdf). {: .text-justify} - - # Take a look at your results after metaMS processing We choose to separate our first W4M Galaxy tool into 2 parts: the processing of GC-MS data (**metaMS.runGC {% icon tool %}**) and the plotting results of these data (**metaMS.plot {% icon tool %}**). So we now have the first part describes just before and the second part we will describe just after. This part allows users to see the TIC (Total Ion Chromatogram), BPC (Base Peak Chromatogram), and also all EICs (Extracted Ion Chromatogram) you want, from our previous result outputted from **metaMS.runGC {% icon tool %} tool**. @@ -398,16 +384,13 @@ Concerning EICs, it is possible to choose for which compound you want to draw an ![TIC](../../images/tuto_gcms_eic.png "Example of EIC of the 'Unknown 1' in sample 'alg2'") -# Conclusion -{% icon trophy %} Well done, you’ve processed GC-MS data! You might want to consult your results with the [key history](https://usegalaxy.eu/u/hechth/h/end-to-end-ei-mass-spectra-prediction-workflow-using-qcxms-1) or use [the workflow](https://usegalaxy.eu/u/hechth/h/end-to-end-ei-mass-spectra-prediction-workflow-using-qcxms-1) associated with this tutorial. -

-
+
-# Carrying on using the standard XCMS workflow (option 2) +# Process GC-MS data with a full XCMS workflow (option 2) -This option follows the standard **XCMS** workflow to obtain in the end a *dataMatrix* file and its corresponding *variableMetadata* file. The main difference with the [option 1](#processing-with-metams-option-1) is that the *dataMatrix* file will contain individual peaks rather than pseudo-spectra, and the *variableMetadata* file will contain information about each peak, such as its retention time, m/z, and intensity. **No** `.msp` file will be generated in this case, as the peaks are not grouped into pseudo-spectra so the annotation proces will be different. +This option follows the standard **XCMS** workflow with GC-MS data at start to obtain in the end a *dataMatrix* file and its corresponding *variableMetadata* file. The main difference with the [option 1](#processing-with-metams-option-1) is that the *dataMatrix* file will contain individual peaks rather than pseudo-spectra, and the *variableMetadata* file will contain information about each peak, such as its retention time, m/z, and intensity. **No** `.msp` file will be generated in this case, as the peaks are not grouped into pseudo-spectra so the annotation proces will be different. > Example untargeted GC-MS data processing with the standard XCMS workflow > @@ -424,47 +407,13 @@ This option follows the standard **XCMS** workflow to obtain in the end a *dataM > - *"Number of decimal places for retention time values reported in ions' identifiers."*: `2` > - *"Reported intensity values"*: `maxo` > -> +> > +> > After **XCMS** extraction of MSP formated spectra can be done with **RAMclustR**{% icon tool %} tool (See this [GTN]({% link topics/metabolomics/tutorials/gc_ms_with_xcms/tutorial.md %})). +> {: .comment} {: .hands_on} The outputs of this strategy are similar to the ones described in the LC-MS tutotial mentioned previously. -> Important : Be careful of the file format -> -> During each step of pre-processing, your dataset has its format changed and can have also its name changed. -> To be able to continue to GC-MS processing, you need to have a RData object which is **merged and grouped** (from **xcms findChromPeaks Merger** {% icon tool %} and **xcms groupChromPeaks (group)** {% icon tool %}) at least. -> It means that you should have a file named `xset.merged.groupChromPeaks.RData` (and maybe with some step more in it). -{: .comment} - - -# Stopover : Verify your data after the XCMS pre-processing - -When you have processed **all or only needed** steps described before, you can continue the GC-MS processing with statistics or annotation tools. -Don't forget to always check your files format! -{: .text-justify} - -> -> -> The pre-processing part of this analysis can be **quite time-consuming**, and already corresponds to quite a few number of steps, depending of your analysis. We highly recommend, at this step of the GC-MS workflow, to split your analysis by beginning a new Galaxy history with **only the files you need** (final `.tsv` matrices - sampleMetadata, variableMetadata, dataMatrix and the `.msp` spectral database). This will help you in limiting selecting the wrong dataset in further analysis, and bring a little **tidiness** for future review of your analysis process. You should also be able to make a better peak picking in the future in the same history and it will not be polluted by statistical analysis part of your process. -> {: .text-justify} -> -> > Copy dataset to a new history -> > -> > 1. Click on the {% icon galaxy-gear %} icon (**History options**) on the top of the history panel -> > 2. Click on **Copy Dataset** -> > 3. Select the desired files -> > 4. Give a relevant name to the "New history" -> > 5. Click on the new history name in the green box that have just appear to switch to this history -> {: .tip} -> -> To begin a new history with the files from your current history, you can **use the functionality ‘copy dataset’** and copy it into a new history (the option is hidden behind the notched wheel at the top right of the history). -> {: .text-justify} -> -> You may have notice that the XCMS tools generate **output names that contain the different XCMS steps you used**, allowing easy traceability while browsing your history. Hence, we highly recommend you to rename it **with something short**, e.g. "xset", "XCMSSetObject", or anything not too long that you may find convenient. -> {: .text-justify} -> {% snippet faqs/galaxy/datasets_rename.md %} -> -{: .comment} Before going to the next step of your GC-MS data processing, here are some questions to be able to verify if your files are ready and if you have the same results as us. Please check these questions : {: .text-justify} @@ -502,7 +451,42 @@ Before going to the next step of your GC-MS data processing, here are some quest > {: .solution} {: .question} -# Conclusion -{% icon trophy %} Well done, you’ve processed GC-MS data! You might want to explore other [Galaxy trainings](https://training.galaxyproject.org/training-material/topics/metabolomics/) +
+ -
\ No newline at end of file +# Verify your data after the pre-processing and clean datasets + +When you have processed **all or only needed** steps described before, you can continue the processing of your data with statistics or annotation tools. +Don't forget to always check your files format! +{: .text-justify} + +The pre-processing part of this analysis can be **quite time-consuming**, and already corresponds to quite a few number of steps, depending of your analysis. We highly recommend, at this step of the GC-MS workflow, to split your analysis by beginning a new Galaxy history with **only the files you need** for further steps (final `.tsv` matrices - sampleMetadata, variableMetadata, dataMatrix and the `.msp` spectral database). This will help you in limiting the chance to select the wrong dataset in further analysis, and bring a little **tidiness** for future review of your analysis process. You should also be able to make adjust peak picking parameters in the future in the same history and it will not be polluted by statistical analysis part of your process. +{: .text-justify} +> +> > Copy dataset to a new history +> > +> > 1. Click on the {% icon galaxy-gear %} icon (**History options**) on the top of the history panel +> > 2. Click on **Copy Dataset** +> > 3. Select the desired files +> > 4. Give a relevant name to the "New history" +> > 5. Click on the new history name in the green box that have just appear to switch to this history +> {: .tip} + +> To begin a new history with the files from your current history, you can **use the functionality ‘copy dataset’** and copy it into a new history (the option is hidden behind the notched wheel at the top right of the history). +> {: .text-justify} +> +> You may have notice that the XCMS tools generate **output names that contain the different XCMS steps you used**, allowing easy traceability while browsing your history. Hence, we highly recommend you to rename it **with something short**, e.g. "xset", "XCMSSetObject", or anything not too long that you may find convenient. + +> {% snippet faqs/galaxy/datasets_rename.md %} + +> Important : Be careful of the file format +> +> During each step of pre-processing, your dataset has its format changed and can have also its name changed. +> To be able to continue to GC-MS processing, you need to have a RData object which is **merged and grouped** (from **xcms findChromPeaks Merger** {% icon tool %} and **xcms groupChromPeaks (group)** {% icon tool %}) at least. +> It means that you should have a file named `xset.merged.groupChromPeaks.RData` (and maybe with some step more in it). +{: .comment} + +# Conclusion +{% icon trophy %} Well done, you’ve processed GC-MS data with [metaMS (option 1)](#processing-with-metams-option-1) or [all with XCMS (option 2)](#process-gc-ms-data-with-a-full-xcms-workflow-option-2) ! You might want to explore other [Galaxy trainings](https://training.galaxyproject.org/training-material/topics/metabolomics/) +
+You might want to consult your results with the [key history](https://usegalaxy.fr/u/yguitton/h/gcms) or use [the workflow](https://usegalaxy.fr/u/yguitton/h/gcms) associated with this tutorial. From 54ae6fdaf71a7f1473dbe4e5f5d484317b6f1a3e Mon Sep 17 00:00:00 2001 From: Guitton Yann Date: Thu, 31 Jul 2025 21:50:29 +0200 Subject: [PATCH 19/29] Update tutorial.md --- .../metabolomics/tutorials/gcms/tutorial.md | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/topics/metabolomics/tutorials/gcms/tutorial.md b/topics/metabolomics/tutorials/gcms/tutorial.md index 16c4b72c4dee99..236bbe68978949 100644 --- a/topics/metabolomics/tutorials/gcms/tutorial.md +++ b/topics/metabolomics/tutorials/gcms/tutorial.md @@ -141,7 +141,7 @@ The first part of data processing is using the **XCMS** tool to detect peaks in > > **MSnbase readMSData** {% icon tool %} function, prior to **XCMS**, is able to read files with open format as `mzXML`, `mzML`, `mzData` and `netCDF`, which are independent of the manufacturers' proprietary formats. Working with open MS data file format allows users to us tools developed outside of the MS instrument provider. This set of packages/functions gives modularity, and thus is particularly well adapted to define workflows, one of the key points of Galaxy. -{: .text-justify} +> {: .text-justify} {: .comment} > Create the XCMS object @@ -257,8 +257,7 @@ The two options are illustrated in this tutorial. The biggest difference between **XCMS** only workflow (option 2) or **XCMS + metaMS** GC-MS data processing (option 1) is that rather than a feature-based analysis with individual peaks, as in the option 2 case, **metaMS** performs a pseudospectrum-based analysis and use it to align compound between samples. One other advantage is that **metaMS** allows creation of MSP (`.msp`) spectra export files ready for annotation. > -> -> >Not all **metaMS** R package functions have been made available in Galaxy. +> > Not all **metaMS** R package functions have been made available in Galaxy. When run in R, the **metaMS** package offers a lot of possibilities. For more information on the full set of metaMS functions, visit the [metaMS Bioconductor page](https://www.bioconductor.org/packages/release/bioc/html/metaMS.html). {: .comment} @@ -297,7 +296,7 @@ The peak picking is performed by the usual **XCMS** functions and the output fil > > > > For faster processing keep annotation modules *off* by setting *"Use Personnal DataBase option"* : `hide` and *"Use RI option* : `hide` > {: .comment} -> + > > Export MSP file to external databases > > >You can {% icon dataset-save %} download the MSP file and open it in your favorite spectra processing software or online database for further investigation! > {: .tip} @@ -454,15 +453,17 @@ Before going to the next step of your GC-MS data processing, here are some quest -# Verify your data after the pre-processing and clean datasets - -When you have processed **all or only needed** steps described before, you can continue the processing of your data with statistics or annotation tools. +># Verify your data after the pre-processing and clean datasets +> +>When you have processed **all or only needed** steps described before, you can continue the processing of your data with statistics or annotation tools. Don't forget to always check your files format! +> {: .text-justify} -The pre-processing part of this analysis can be **quite time-consuming**, and already corresponds to quite a few number of steps, depending of your analysis. We highly recommend, at this step of the GC-MS workflow, to split your analysis by beginning a new Galaxy history with **only the files you need** for further steps (final `.tsv` matrices - sampleMetadata, variableMetadata, dataMatrix and the `.msp` spectral database). This will help you in limiting the chance to select the wrong dataset in further analysis, and bring a little **tidiness** for future review of your analysis process. You should also be able to make adjust peak picking parameters in the future in the same history and it will not be polluted by statistical analysis part of your process. +>The pre-processing part of this analysis can be **quite time-consuming**, and already corresponds to quite a few number of steps, depending of your analysis. We highly recommend, at this step of the GC-MS workflow, to split your analysis by beginning a new Galaxy history with **only the files you need** for further steps (final `.tsv` matrices - sampleMetadata, variableMetadata, dataMatrix and the `.msp` spectral database). This will help you in limiting the chance to select the wrong dataset in further analysis, and bring a little **tidiness** for future review of your analysis process. You should also be able to make adjust peak picking parameters in the future in the same history and it will not be polluted by statistical analysis part of your process. +> {: .text-justify} -> + > > Copy dataset to a new history > > > > 1. Click on the {% icon galaxy-gear %} icon (**History options**) on the top of the history panel @@ -470,20 +471,23 @@ The pre-processing part of this analysis can be **quite time-consuming**, and al > > 3. Select the desired files > > 4. Give a relevant name to the "New history" > > 5. Click on the new history name in the green box that have just appear to switch to this history +> > > {: .tip} > To begin a new history with the files from your current history, you can **use the functionality ‘copy dataset’** and copy it into a new history (the option is hidden behind the notched wheel at the top right of the history). -> {: .text-justify} > -> You may have notice that the XCMS tools generate **output names that contain the different XCMS steps you used**, allowing easy traceability while browsing your history. Hence, we highly recommend you to rename it **with something short**, e.g. "xset", "XCMSSetObject", or anything not too long that you may find convenient. +> {: .text-justify} +> You may have notice that the XCMS tools generate **output names that contain the different XCMS steps you used**, allowing easy traceability while browsing your history. Hence, we highly recommend you to rename it **with something short**, e.g. "xset", "XCMSSetObject", or anything not too long that you may find convenient. +> > {% snippet faqs/galaxy/datasets_rename.md %} - +> > Important : Be careful of the file format > > During each step of pre-processing, your dataset has its format changed and can have also its name changed. > To be able to continue to GC-MS processing, you need to have a RData object which is **merged and grouped** (from **xcms findChromPeaks Merger** {% icon tool %} and **xcms groupChromPeaks (group)** {% icon tool %}) at least. > It means that you should have a file named `xset.merged.groupChromPeaks.RData` (and maybe with some step more in it). +> {: .comment} # Conclusion From 07e2dd0ee51c8b26c446a33631f7dd963188affd Mon Sep 17 00:00:00 2001 From: Guitton Yann Date: Thu, 31 Jul 2025 21:55:48 +0200 Subject: [PATCH 20/29] Update tutorial.md --- topics/metabolomics/tutorials/gcms/tutorial.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/topics/metabolomics/tutorials/gcms/tutorial.md b/topics/metabolomics/tutorials/gcms/tutorial.md index 236bbe68978949..e43f73b174f0da 100644 --- a/topics/metabolomics/tutorials/gcms/tutorial.md +++ b/topics/metabolomics/tutorials/gcms/tutorial.md @@ -365,7 +365,7 @@ In addition, one is ignoring the information in the other peaks of the pseudospe In both cases, the result is a list containing a set of patterns corresponding with the compounds that have been found, either annotated or unknown, the relative intensities of these patterns in the individual annotations, and possibly the xcmsSetobject for further inspection. In practice, the *runGC* function is all that users need to use. {: .text-justify} -That file can be used for database search online (as Golm ({% cite Kopka2005 %}) and MassBank ({% cite Horai2010 %})) or locally (NIST MSSEARCH) for NIST search a tutorial is available [here](https://workflow4metabolomics.org/sites/default/files/fichiers/documents/w4m_HowToUseNIST_V01.pdf). +That file can be used for database search online (as Golm ({% cite Kopka2005 %}) and MassBank ({% cite Horai2010 %})) or locally (NIST MSSEARCH) for NIST search a [PDF tutorial is available](https://workflow4metabolomics.org/sites/default/files/fichiers/documents/w4m_HowToUseNIST_V01.pdf). {: .text-justify} # Take a look at your results after metaMS processing @@ -407,7 +407,7 @@ This option follows the standard **XCMS** workflow with GC-MS data at start to o > - *"Reported intensity values"*: `maxo` > > > -> > After **XCMS** extraction of MSP formated spectra can be done with **RAMclustR**{% icon tool %} tool (See this [GTN]({% link topics/metabolomics/tutorials/gc_ms_with_xcms/tutorial.md %})). +> > After **XCMS** extraction of MSP formated spectra can be done with **RAMclustR**{% icon tool %} tool (See this [GTN on GC-MS data processing]({% link topics/metabolomics/tutorials/gc_ms_with_xcms/tutorial.md %})). > {: .comment} {: .hands_on} @@ -491,6 +491,6 @@ Don't forget to always check your files format! {: .comment} # Conclusion -{% icon trophy %} Well done, you’ve processed GC-MS data with [metaMS (option 1)](#processing-with-metams-option-1) or [all with XCMS (option 2)](#process-gc-ms-data-with-a-full-xcms-workflow-option-2) ! You might want to explore other [Galaxy trainings](https://training.galaxyproject.org/training-material/topics/metabolomics/) +{% icon trophy %} Well done, you’ve processed GC-MS data with [metaMS (option 1)](#processing-with-metams-option-1) or [all with XCMS (option 2)](#process-gc-ms-data-with-a-full-xcms-workflow-option-2) ! You might want to explore other [Galaxy trainings for Metabolomics]({% link topics/metabolomics/ %})
You might want to consult your results with the [key history](https://usegalaxy.fr/u/yguitton/h/gcms) or use [the workflow](https://usegalaxy.fr/u/yguitton/h/gcms) associated with this tutorial. From 7d44f300780b641dac14c8846c77c6fe5e358fbf Mon Sep 17 00:00:00 2001 From: Guitton Yann Date: Thu, 31 Jul 2025 22:31:27 +0200 Subject: [PATCH 21/29] Update tutorial.bib --- topics/metabolomics/tutorials/gcms/tutorial.bib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/topics/metabolomics/tutorials/gcms/tutorial.bib b/topics/metabolomics/tutorials/gcms/tutorial.bib index e67ad2d9bb1f79..c706b881fd1a1b 100644 --- a/topics/metabolomics/tutorials/gcms/tutorial.bib +++ b/topics/metabolomics/tutorials/gcms/tutorial.bib @@ -166,7 +166,7 @@ @article{Horai2010 number = {7}, pages = {703-714}, keywords = {MassBank, public database, distributed database, metabolite, spectral similarity}, - doi = {https://doi.org/10.1002/jms.1777}, + doi = {10.1002/jms.1777}, url = {https://analyticalsciencejournals.onlinelibrary.wiley.com/doi/abs/10.1002/jms.1777}, eprint = {https://analyticalsciencejournals.onlinelibrary.wiley.com/doi/pdf/10.1002/jms.1777}, abstract = {Abstract MassBank is the first public repository of mass spectra of small chemical compounds for life sciences (<3000 Da). The database contains 605 electron-ionization mass spectrometry(EI-MS), 137 fast atom bombardment MS and 9276 electrospray ionization (ESI)-MSn data of 2337 authentic compounds of metabolites, 11 545 EI-MS and 834 other-MS data of 10 286 volatile natural and synthetic compounds, and 3045 ESI-MS2 data of 679 synthetic drugs contributed by 16 research groups (January 2010). ESI-MS2 data were analyzed under nonstandardized, independent experimental conditions. MassBank is a distributed database. Each research group provides data from its own MassBank data servers distributed on the Internet. MassBank users can access either all of the MassBank data or a subset of the data by specifying one or more experimental conditions. In a spectral search to retrieve mass spectra similar to a query mass spectrum, the similarity score is calculated by a weighted cosine correlation in which weighting exponents on peak intensity and the mass-to-charge ratio are optimized to the ESI-MS2 data. MassBank also provides a merged spectrum for each compound prepared by merging the analyzed ESI-MS2 data on an identical compound under different collision-induced dissociation conditions. Data merging has significantly improved the precision of the identification of a chemical compound by 21–23\% at a similarity score of 0.6. Thus, MassBank is useful for the identification of chemical compounds and the publication of experimental data. Copyright © 2010 John Wiley \& Sons, Ltd.}, From ad882079c1c1f7802f84f86ce429a1ce8d8b7e55 Mon Sep 17 00:00:00 2001 From: Guitton Yann Date: Thu, 31 Jul 2025 22:41:48 +0200 Subject: [PATCH 22/29] Update tutorial.md --- topics/metabolomics/tutorials/gcms/tutorial.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/topics/metabolomics/tutorials/gcms/tutorial.md b/topics/metabolomics/tutorials/gcms/tutorial.md index e43f73b174f0da..52b69ef36692b8 100644 --- a/topics/metabolomics/tutorials/gcms/tutorial.md +++ b/topics/metabolomics/tutorials/gcms/tutorial.md @@ -63,7 +63,7 @@ In this tutorial we use **XCMS** to detect chromatographic peaks within our samp {: .text-justify} -In Galaxy other GC-MS data processing workflows are available and may be of interest for more advanced Galaxy users [Link](https://training.galaxyproject.org/training-material/topics/metabolomics/) +In Galaxy other GC-MS data processing workflows are available and may be of interest for more advanced Galaxy users [Link to Metabolomics GTN]({% link /topics/metabolomics/ %}) {: .comment} > @@ -300,6 +300,7 @@ The peak picking is performed by the usual **XCMS** functions and the output fil > > Export MSP file to external databases > > >You can {% icon dataset-save %} download the MSP file and open it in your favorite spectra processing software or online database for further investigation! > {: .tip} +> {: .hands_on} > Definitions @@ -324,7 +325,7 @@ The peak picking is performed by the usual **XCMS** functions and the output fil > > 71 60 > > ``` > > -> > For more details, you can view an [example MSP file here](https://zenodo.org/records/16538501/files/W4M0004_database_small.msp). +> > For more details, you can view an [example MSP file](https://zenodo.org/records/16538501/files/W4M0004_database_small.msp). > {: .details} {: .details} @@ -385,7 +386,7 @@ Concerning EICs, it is possible to choose for which compound you want to draw an -
+
# Process GC-MS data with a full XCMS workflow (option 2) @@ -476,7 +477,7 @@ Don't forget to always check your files format! > To begin a new history with the files from your current history, you can **use the functionality ‘copy dataset’** and copy it into a new history (the option is hidden behind the notched wheel at the top right of the history). > -> {: .text-justify} +{: .text-justify} > You may have notice that the XCMS tools generate **output names that contain the different XCMS steps you used**, allowing easy traceability while browsing your history. Hence, we highly recommend you to rename it **with something short**, e.g. "xset", "XCMSSetObject", or anything not too long that you may find convenient. > From ee1cf0be7f7ed9abf753e2afefa052fb457bcb4b Mon Sep 17 00:00:00 2001 From: Guitton Yann Date: Thu, 31 Jul 2025 22:50:57 +0200 Subject: [PATCH 23/29] Update tutorial.md --- topics/metabolomics/tutorials/gcms/tutorial.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/topics/metabolomics/tutorials/gcms/tutorial.md b/topics/metabolomics/tutorials/gcms/tutorial.md index 52b69ef36692b8..e535b2ba7a9c22 100644 --- a/topics/metabolomics/tutorials/gcms/tutorial.md +++ b/topics/metabolomics/tutorials/gcms/tutorial.md @@ -1,6 +1,6 @@ --- layout: tutorial_hands_on -draft: true +draft: false title: 'Mass spectrometry : GC-MS analysis with metaMS package' level: Introductory @@ -21,7 +21,7 @@ requirements: - type: "internal" topic_name: metabolomics tutorials: - - gcms-preprocessing + - gcms contributions: autorship: - jsaintvanne @@ -495,3 +495,4 @@ Don't forget to always check your files format! {% icon trophy %} Well done, you’ve processed GC-MS data with [metaMS (option 1)](#processing-with-metams-option-1) or [all with XCMS (option 2)](#process-gc-ms-data-with-a-full-xcms-workflow-option-2) ! You might want to explore other [Galaxy trainings for Metabolomics]({% link topics/metabolomics/ %})
You might want to consult your results with the [key history](https://usegalaxy.fr/u/yguitton/h/gcms) or use [the workflow](https://usegalaxy.fr/u/yguitton/h/gcms) associated with this tutorial. + From d395ef400db81108fcbf312d1ffdfee19ef75338 Mon Sep 17 00:00:00 2001 From: Guitton Yann Date: Fri, 1 Aug 2025 10:36:41 +0200 Subject: [PATCH 24/29] Update tutorial.md --- topics/metabolomics/tutorials/gcms/tutorial.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/topics/metabolomics/tutorials/gcms/tutorial.md b/topics/metabolomics/tutorials/gcms/tutorial.md index e535b2ba7a9c22..bb7a93255750c6 100644 --- a/topics/metabolomics/tutorials/gcms/tutorial.md +++ b/topics/metabolomics/tutorials/gcms/tutorial.md @@ -23,7 +23,7 @@ requirements: tutorials: - gcms contributions: - autorship: + authorship: - jsaintvanne - yguitton editing: @@ -33,7 +33,8 @@ contributions: testing: - workflow4metabolomics funding: - - elixir-europe + - metabohub + - rfmf --- @@ -495,4 +496,5 @@ Don't forget to always check your files format! {% icon trophy %} Well done, you’ve processed GC-MS data with [metaMS (option 1)](#processing-with-metams-option-1) or [all with XCMS (option 2)](#process-gc-ms-data-with-a-full-xcms-workflow-option-2) ! You might want to explore other [Galaxy trainings for Metabolomics]({% link topics/metabolomics/ %})
You might want to consult your results with the [key history](https://usegalaxy.fr/u/yguitton/h/gcms) or use [the workflow](https://usegalaxy.fr/u/yguitton/h/gcms) associated with this tutorial. - + + From 18a1f43ed5b2928b84a1c99db83eafef484c1130 Mon Sep 17 00:00:00 2001 From: Guitton Yann Date: Fri, 1 Aug 2025 10:53:19 +0200 Subject: [PATCH 25/29] Update GRANTS.yaml add RFMF et MetaboHUB --- GRANTS.yaml | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/GRANTS.yaml b/GRANTS.yaml index f732e3f68f6a51..f12061b5eb8be0 100644 --- a/GRANTS.yaml +++ b/GRANTS.yaml @@ -192,6 +192,13 @@ h2020-defend: This work has received funding from the DEFEND project (www.defend2020.eu) with funding from the European Union's Horizon 2020 research and innovation programme under grant agreement No 773701. url: https://www.defend2020.eu +metabohub: + name: MetaboHUB + github: false + joined: 2025-07 + url: https://www.metabohub.fr/ + avatar: "/training-material/shared/images/metabohub.fr" + nfdi4bioimage: name: NFDI4Bioimage short_name: "NFDI4Bioimage" @@ -254,7 +261,15 @@ oscars: url: https://oscars-project.eu/ github: false avatar: "/training-material/shared/images/logos/OSCARS-logo-EUflag.png" - + +rfmf: + name: Réseau Francophone de Metabolomique et Fluxomique + short_name: RFMF + github: false + joined: 2025-07 + url: https://www.rfmf.fr/ + avatar: "/training-material/shared/images/rfmf.fr" + skills4eosc: name: Skills for European Open Science Cloud short_name: "Skills4SEOSC" From 45e6a8815ad5b4d7466249e6bce928e0e3a3ba8c Mon Sep 17 00:00:00 2001 From: Guitton Yann Date: Fri, 1 Aug 2025 10:55:31 +0200 Subject: [PATCH 26/29] add logos for fnders RFMF and MetaboHUB --- shared/images/metabohub.png | Bin 0 -> 12709 bytes shared/images/rfmf.png | Bin 0 -> 86271 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 shared/images/metabohub.png create mode 100644 shared/images/rfmf.png diff --git a/shared/images/metabohub.png b/shared/images/metabohub.png new file mode 100644 index 0000000000000000000000000000000000000000..646d23f9345dc453c043e9e3bb22629e8d6cbef1 GIT binary patch literal 12709 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%0A}V^LZXp{%nV+dSjPj7njb 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
_qnz^XwsoJ~TzrEM@u92V8 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 z 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 literal 0 HcmV?d00001 From d33987051e9295503e05134d1d0ceee434d16122 Mon Sep 17 00:00:00 2001 From: Guitton Yann Date: Fri, 1 Aug 2025 15:14:46 +0000 Subject: [PATCH 27/29] Update remove justify-text --- .../metabolomics/tutorials/gcms/tutorial.md | 58 +++++++++---------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/topics/metabolomics/tutorials/gcms/tutorial.md b/topics/metabolomics/tutorials/gcms/tutorial.md index bb7a93255750c6..8c8c316f855a03 100644 --- a/topics/metabolomics/tutorials/gcms/tutorial.md +++ b/topics/metabolomics/tutorials/gcms/tutorial.md @@ -39,15 +39,15 @@ funding: --- You may already know that there are different types of *-omic* sciences; out of these, metabolomics is most closely related to phenotypes. Metabolomics involves the study of different types of matrices, such as blood, urine, tissues, in various organisms including plants. It focuses on studying the very small molecules which are called *metabolites*, to better understand matters linked to the metabolism. However, studying metabolites is not a piece of cake since it requires several critical steps which still have some major bottlenecks. Metabolomics is still quite a young science, and has many kinds of specific challenges. -{: .text-justify} + One of the three main technologies used to perform metabolomic analysis is **Gas-Chromatography Mass Spectrometry** (GC-MS). Data analysis for this technology requires a large variety of steps, ranging from extracting information from the raw data, to statistical analysis and annotation. Many packages in R/Python are available for the analysis of GC-MS or LC-MS data - for more details see the reviews by {% cite Stanstrup2019 %} and {% cite Misra2021 %}. -{: .text-justify} + This tutorial explains the main steps involved in untargeted **GC-MS** data processing, to do so we focus on some open-source solutions integrated within the Galaxy framework, namely **XCMS** and **metaMS**. The selected tools and functionalities only covers a small portion of available tools but allow to **perform a complete GC-MS analysis** in a single environment. In this tutorial, we will learn how to (1) extract features from the raw data using **XCMS** ({% cite Smith2006 %}), (2) deconvolute the detected features into spectra with **metaMS** ({% cite Wehrens2014 %}) and (3) annotate unknow spectra using spectral database comparison tools. -{: .text-justify} + To illustrate this approach, we will use data from {% cite Dittami2012 %}. Due to time constraints in processing the original dataset, a limited subset of samples was utilized to illustrate the workflow. This subset (see details below) demonstrates the key steps of metabolomics analysis, from pre-processing to annotation. Although the results derived from this reduced sample size may not be scientifically robust, they provide insight into essential methodological foundations of GC-MS data-processing workflow. -{: .text-justify} + > Algae samples > @@ -61,7 +61,7 @@ To illustrate this approach, we will use data from {% cite Dittami2012 %}. Due t To process the GC-MS data, we can use several tools. One of these is **XCMS** ({% cite Smith2006 %}) it's a general R package for untargeted metabolomics profiling. It can be used for any type of mass spectrometry acquisition (centroid and profile) or resolution (from low to high resolution), including FT-MS data coupled with a different kind of chromatography (liquid or gas). Because of the generality of packages like **XCMS**, several other packages have been developed to use the functionality of **XCMS** for optimal performance in a particular context. The R package **metaMS** ({% cite Wehrens2014 %}) does so for the field of GC-MS untargeted metabolomics. One of the goals of **metaMS** was to set up a simple system with few user-settable parameters, capable of handling untargeted metabolomics experiments. In this tutorial we use **XCMS** to detect chromatographic peaks within our samples. Once we have detected them, they need to be deconvoluted into mass spectra representing chemical compounds. For that, we use **metaMS** functions. To normalize the retention time of deconvoluted spectra in our sample, we compute the retention index using Alkane references and a dedicated function of **metaMS**. Finally, we identify detected spectra by aligning them with a database of known compounds. This can be achieved using an in-house built database in the common MSP format (`.msp`) (used in the NIST MS search program for example), resulting in a table of annotated compounds. -{: .text-justify} + In Galaxy other GC-MS data processing workflows are available and may be of interest for more advanced Galaxy users [Link to Metabolomics GTN]({% link /topics/metabolomics/ %}) @@ -80,7 +80,7 @@ In Galaxy other GC-MS data processing workflows are available and may be of inte # Data preparation and prepocessing Before we can start with the actual analysis pipeline, we first need to download and prepare our dataset. Many of the preprocessing steps can be run in parallel on individual samples. Therefore, we recommend using the Dataset collections in Galaxy. This can be achieved by using the dataset collection option from the beginning of your analysis when uploading your data into Galaxy. -{: .text-justify} + ## Import the data into Galaxy @@ -138,11 +138,11 @@ As a result of this step, you should have in our history a green Dataset collect ## Create the XCMS object The first part of data processing is using the **XCMS** tool to detect peaks in the MS signal. For that, we first need to take the `.mzML` files and create a format usable by the **XCMS** tool. {% tool [MSnbase readMSData](toolshed.g2.bx.psu.edu/repos/lecorguille/msnbase_readmsdata/msnbase_readmsdata/2.16.1+galaxy0) %} ({% cite gatto2012msnbase %}. {% cite gatto2020msnbase %}) takes as input our files and prepares `RData` files for the first **XCMS** step. -{: .text-justify} + > > **MSnbase readMSData** {% icon tool %} function, prior to **XCMS**, is able to read files with open format as `mzXML`, `mzML`, `mzData` and `netCDF`, which are independent of the manufacturers' proprietary formats. Working with open MS data file format allows users to us tools developed outside of the MS instrument provider. This set of packages/functions gives modularity, and thus is particularly well adapted to define workflows, one of the key points of Galaxy. -> {: .text-justify} +> {: .comment} > Create the XCMS object @@ -163,7 +163,7 @@ As a result of this step, you should have in our history a new green dataset cal # Peak detection using XCMS The first step in the workflow is to detect the peaks in our data using **XCMS** functions. This part, however, is covered by a [separate tutorial]({{ site.baseurl }}/topics/metabolomics/tutorials/lcms-preprocessing/tutorial.html). Although the tutorial is dedicated to LC-MS data, it can also be followed for our GC-MS data. Therefore, in this section, we do not explain this part of the workflow in detail but rather refer the reader to the dedicated tutorial. Please also pay attention to the parameter values for individual Galaxy tools, as these can differ from the referred tutorial and are adjusted to our GC-MS dataset. -{: .text-justify} + > Skip peak detection step > @@ -197,7 +197,7 @@ The first step (*called peak picking*) is to extract peaks from each of your dat One Galaxy Training material already explains how to act with MS data. We encourage you to **follow this link and complete the corresponding tutorial**: [Mass spectrometry: LC-MS preprocessing with XCMS]({% link topics/metabolomics/tutorials/lcms-preprocessing/tutorial.md %}). For GC-MS analysis you **don't really need to follow all of this previous tutorial** but for a better understanding of your data, it is recommended to try it with their test dataset. Concerning the current GC-MS tutorial, you **just have to compute the following steps and specific parameters** described in the hands-on part below (please follow the parameter values below to obtain the same results during the training). -{: .text-justify} + > Peak picking of GC-MS data with XCMS @@ -268,12 +268,12 @@ The standard workflow of **metaMS** for GC-MS data is the following: ![Workflow diagram of metaMS for GC-MS data analysis](../../images/tuto_gcms_workflow_2options.png "Workflow of metaMS for GC datas") The *runGC* function is implemented in **metaMS.runGC {% icon tool %}** tool in Galaxy. It takes as inputs an {% icon param-collection %} *.RData* file after **XCMS** peak picking and optionally for annotation purposes an alkane reference file (in `.csv` format) for RI calculation and/or a spectral database in `.msp` format. -{: .text-justify} + ## Deconvolution and Alignement with metaMS The peak picking is performed by the usual **XCMS** functions and the output file in `.RData` is used for deconvolution and Alignment steps with _runGC_ function. -{: .text-justify} + > metaMS.runGC > @@ -333,12 +333,12 @@ The peak picking is performed by the usual **XCMS** functions and the output fil ## Alignement Once **metaMS** have created the pseudo-spectra for each unknown compound in each files, we can start the annotation process. This is done by **comparing every pseudospectrum ** to each others in order to group/align similar MS spectra between samples. As a similarity measure, the weighted dot product is used as it is fast, simple, and gives good results ({% cite Stein1994 %}). The first step in the comparison is based on retention, since a comparison of either retention time or retention index is much faster than a spectral comparison. Since the weighted dot product uses scaled mass spectra, the scaling of the database is done once, and then used in all comparisons. If a pseudo-spectra Y from sample A is similar to pseudo-spectra X in sample B and they have close retention (time or index) then thay are aligned. This process will create the *dataMatrix* and *variableMetadata* outputs. -{: .text-justify} + ![Match spectra](../../images/tuto_gcms_match_spec.png "Best match between an experimental pseudospectrum (red) and a database entry (blue)") If an MSP database have been added to the *runGC* function inputs then the function returns a table where all patterns that have a match with a DB entry are shown with their name, the other pseudo-spectra will be named UnknownX in the first column of the *variableMetadata* and *dataMatrix*. -{: .text-justify} + ## Unknowns research @@ -346,42 +346,42 @@ If an MSP database have been added to the *runGC* function inputs then the funct An important aspect of untargeted metabolomics is the definition of unknowns—features that occur repeatedly in a minimum number or fraction of samples (as defined by the `min.class.fract` and `min.class.size` parameters in the metaMS settings), but for which no annotation has been found. In **metaMS**, these unknown features are found by comparing all patterns (i.e., pseudo-spectra which are groups of features) within a certain retention time (or retention index) difference on their spectral characteristics. In defining unknowns we have so far used settings that are more strict than when compared to a database : since all samples are typically measured in one single run, expected retention time differences are rather small. In addition, one would expect reproducible spectra for a single compound. A true unknown, or at least an interesting one, is also present in a significant fraction of the samples. All these parameters are gathered in the betweenSamples element of the settingsobject .Since the matching is done using scaled patterns, we need to create a scaled version of the experimental pseudo-spectra first. -{: .text-justify} + For large numbers of samples, this process can take quite some time (it scales quadratically), especially if the allowed difference in retention time is large. The result now is a list of two elements : the first is the annotation table that we also saw after the comparison with the database, and the second is a list of pseudo-spectra corresponding to unknowns. -{: .text-justify} + ## Outputs and results At this stage, all elements are complete : we have the list of pseudo-spectra with an annotation, either as a chemical standard from the database, or an unknown occurring in a sizeable fraction of the injections. The only things left to do is to calculate relative intensities for the pseudo-spectra, and to put the results in an easy-to-use table. This table consists of two parts. The first part is the information on the “features”, which here are the pseudo-spectra. The second part of the table contains the intensities of these features in the individual injections. -{: .text-justify} + ![Match spectra](../../images/tuto_gcms_finale_table.png "Final table with unknowns and compounds found during **metaMS** processus") The first five lines are the standards, and the next ones are the unknowns that are identified by the pipeline. In the manual interpretation of this kind of data, the intensities of one or two “highly specific” features are often used to achieve relative quantitation. In an automatic pipeline, this is a risky strategy: not only can the intensity of a peak vary quite dramatically (relative standard deviations of up to 30% are assumed acceptable in GC-MS, e.g. when SPME is applied), but these errors are all the more pronounced in high-intensity peaks (hence the common use of a relative standard deviation). In addition, one is ignoring the information in the other peaks of the pseudospectrum. In **metaMS**, pseudospectrum intensity is expressed as a multiple of the corresponding reference pattern (either a database pattern or an unknown), where the intensity ratio is determined using robust regression to avoid one deviating feature to influence the results too much ({% cite Wehrens2014 %}). First, we define an object containing all relevant pseudo-spectra, and next the intensities are generated. -{: .text-justify} + In both cases, the result is a list containing a set of patterns corresponding with the compounds that have been found, either annotated or unknown, the relative intensities of these patterns in the individual annotations, and possibly the xcmsSetobject for further inspection. In practice, the *runGC* function is all that users need to use. -{: .text-justify} + That file can be used for database search online (as Golm ({% cite Kopka2005 %}) and MassBank ({% cite Horai2010 %})) or locally (NIST MSSEARCH) for NIST search a [PDF tutorial is available](https://workflow4metabolomics.org/sites/default/files/fichiers/documents/w4m_HowToUseNIST_V01.pdf). -{: .text-justify} + # Take a look at your results after metaMS processing We choose to separate our first W4M Galaxy tool into 2 parts: the processing of GC-MS data (**metaMS.runGC {% icon tool %}**) and the plotting results of these data (**metaMS.plot {% icon tool %}**). So we now have the first part describes just before and the second part we will describe just after. This part allows users to see the TIC (Total Ion Chromatogram), BPC (Base Peak Chromatogram), and also all EICs (Extracted Ion Chromatogram) you want, from our previous result outputted from **metaMS.runGC {% icon tool %} tool**. -{: .text-justify} + If you separated your samples into different classes, this tool can constructs TICs and BPCs one class against one class, in a `pdf` file (Figure 5) : -{: .text-justify} + ![TIC](../../images/tuto_gcms_tic.png "TIC comparing 2 classes") Concerning EICs, it is possible to choose for which compound you want to draw an EIC when you run the W4M Galaxy tool. According to your choice, you will obtain EICs for one compound in each sample you enter in the previous **metaMS** part. -{: .text-justify} + ![TIC](../../images/tuto_gcms_eic.png "Example of EIC of the 'Unknown 1' in sample 'alg2'") @@ -417,7 +417,7 @@ The outputs of this strategy are similar to the ones described in the LC-MS tuto Before going to the next step of your GC-MS data processing, here are some questions to be able to verify if your files are ready and if you have the same results as us. Please check these questions : -{: .text-justify} + > before going to further GC-MS processing steps > @@ -439,7 +439,7 @@ Before going to the next step of your GC-MS data processing, here are some quest > > > > > > During each step of XCMS pre-processing, the name of the file which is processing is completed by the name of the step you were doing. So, finally your file should be name `xset.merged.groupChromPeaks.fillChromPeaks.RData`. That because (as seen in previous answer) you ran a grouping and the integration after merged datas. -> > {: .text-justify} +> > > > > {: .solution} >
@@ -447,7 +447,7 @@ Before going to the next step of your GC-MS data processing, here are some quest > > > > > > To be able to see the size of a file in your history, you just have to select it. It will deploy informations about it and you can see the size of yours. For our example, the size of the final file is **1.4 MB**. -> > {: .text-justify} +> > > > > {: .solution} {: .question} @@ -460,11 +460,11 @@ Before going to the next step of your GC-MS data processing, here are some quest >When you have processed **all or only needed** steps described before, you can continue the processing of your data with statistics or annotation tools. Don't forget to always check your files format! > -{: .text-justify} + >The pre-processing part of this analysis can be **quite time-consuming**, and already corresponds to quite a few number of steps, depending of your analysis. We highly recommend, at this step of the GC-MS workflow, to split your analysis by beginning a new Galaxy history with **only the files you need** for further steps (final `.tsv` matrices - sampleMetadata, variableMetadata, dataMatrix and the `.msp` spectral database). This will help you in limiting the chance to select the wrong dataset in further analysis, and bring a little **tidiness** for future review of your analysis process. You should also be able to make adjust peak picking parameters in the future in the same history and it will not be polluted by statistical analysis part of your process. > -{: .text-justify} + > > Copy dataset to a new history > > @@ -478,7 +478,7 @@ Don't forget to always check your files format! > To begin a new history with the files from your current history, you can **use the functionality ‘copy dataset’** and copy it into a new history (the option is hidden behind the notched wheel at the top right of the history). > -{: .text-justify} + > You may have notice that the XCMS tools generate **output names that contain the different XCMS steps you used**, allowing easy traceability while browsing your history. Hence, we highly recommend you to rename it **with something short**, e.g. "xset", "XCMSSetObject", or anything not too long that you may find convenient. > From e84fb8c4291e091e0376c5fc866f1d24b50925d6 Mon Sep 17 00:00:00 2001 From: Guitton Yann Date: Fri, 1 Aug 2025 16:02:49 +0000 Subject: [PATCH 28/29] Update --- .../metabolomics/tutorials/gcms/tutorial.md | 40 +++++-------------- 1 file changed, 11 insertions(+), 29 deletions(-) diff --git a/topics/metabolomics/tutorials/gcms/tutorial.md b/topics/metabolomics/tutorials/gcms/tutorial.md index 8c8c316f855a03..3c57fbb4680a7a 100644 --- a/topics/metabolomics/tutorials/gcms/tutorial.md +++ b/topics/metabolomics/tutorials/gcms/tutorial.md @@ -63,8 +63,8 @@ To process the GC-MS data, we can use several tools. One of these is **XCMS** ( In this tutorial we use **XCMS** to detect chromatographic peaks within our samples. Once we have detected them, they need to be deconvoluted into mass spectra representing chemical compounds. For that, we use **metaMS** functions. To normalize the retention time of deconvoluted spectra in our sample, we compute the retention index using Alkane references and a dedicated function of **metaMS**. Finally, we identify detected spectra by aligning them with a database of known compounds. This can be achieved using an in-house built database in the common MSP format (`.msp`) (used in the NIST MS search program for example), resulting in a table of annotated compounds. - -In Galaxy other GC-MS data processing workflows are available and may be of interest for more advanced Galaxy users [Link to Metabolomics GTN]({% link /topics/metabolomics/ %}) +> +> In Galaxy other GC-MS data processing workflows are available and may be of interest for more advanced Galaxy users [Link to Metabolomics GTN]({% link /topics/metabolomics/ %}) {: .comment} > @@ -274,8 +274,7 @@ The *runGC* function is implemented in **metaMS.runGC {% icon tool %}** tool in The peak picking is performed by the usual **XCMS** functions and the output file in `.RData` is used for deconvolution and Alignment steps with _runGC_ function. - -> metaMS.runGC +> metaMS.runGC > > 1.{% tool [metaMS.runGC](toolshed.g2.bx.psu.edu/repos/yguitton/metams_rungc/metams_runGC/3.0.0+metaMS1.24.0-galaxy0) %} with the following parameters: > - {% icon param-file %} *"Rdata from xcms and merged"*: `xset.merged.RData` (output of the **xcms findChromPeaks Merger** {% icon tool %} step) @@ -297,7 +296,7 @@ The peak picking is performed by the usual **XCMS** functions and the output fil > > > > For faster processing keep annotation modules *off* by setting *"Use Personnal DataBase option"* : `hide` and *"Use RI option* : `hide` > {: .comment} - +> > > Export MSP file to external databases > > >You can {% icon dataset-save %} download the MSP file and open it in your favorite spectra processing software or online database for further investigation! > {: .tip} @@ -332,7 +331,7 @@ The peak picking is performed by the usual **XCMS** functions and the output fil ## Alignement -Once **metaMS** have created the pseudo-spectra for each unknown compound in each files, we can start the annotation process. This is done by **comparing every pseudospectrum ** to each others in order to group/align similar MS spectra between samples. As a similarity measure, the weighted dot product is used as it is fast, simple, and gives good results ({% cite Stein1994 %}). The first step in the comparison is based on retention, since a comparison of either retention time or retention index is much faster than a spectral comparison. Since the weighted dot product uses scaled mass spectra, the scaling of the database is done once, and then used in all comparisons. If a pseudo-spectra Y from sample A is similar to pseudo-spectra X in sample B and they have close retention (time or index) then thay are aligned. This process will create the *dataMatrix* and *variableMetadata* outputs. +Once **metaMS** have created the pseudo-spectra for each unknown compound in each files, we can start the annotationalignement process. This is done by **comparing every pseudospectrum ** to each others in order to group/align similar MS spectra between samples. As a similarity measure, the weighted dot product is used as it is fast, simple, and gives good results ({% cite Stein1994 %}). The first step in the comparison is based on retention, since a comparison of either retention time or retention index is much faster than a spectral comparison. Since the weighted dot product uses scaled mass spectra, the scaling of the database is done once, and then used in all comparisons. If a pseudo-spectra Y from sample A is similar to pseudo-spectra X in sample B and they have close retention (time or index). This process will create the *dataMatrix* and *variableMetadata* outputs were aligned pseudo-spectra for different samples will belongs to the same ligne in the final *variableMetadata* and will be concidered as Unknown compound X. ![Match spectra](../../images/tuto_gcms_match_spec.png "Best match between an experimental pseudospectrum (red) and a database entry (blue)") @@ -345,13 +344,12 @@ If an MSP database have been added to the *runGC* function inputs then the funct An important aspect of untargeted metabolomics is the definition of unknowns—features that occur repeatedly in a minimum number or fraction of samples (as defined by the `min.class.fract` and `min.class.size` parameters in the metaMS settings), but for which no annotation has been found. In **metaMS**, these unknown features are found by comparing all patterns (i.e., pseudo-spectra which are groups of features) within a certain retention time (or retention index) difference on their spectral characteristics. -In defining unknowns we have so far used settings that are more strict than when compared to a database : since all samples are typically measured in one single run, expected retention time differences are rather small. In addition, one would expect reproducible spectra for a single compound. A true unknown, or at least an interesting one, is also present in a significant fraction of the samples. All these parameters are gathered in the betweenSamples element of the settingsobject .Since the matching is done using scaled patterns, we need to create a scaled version of the experimental pseudo-spectra first. +One strenght of **metaMS** is its ability to use pseudo-spectre (1) for alignement of unknows between samples and (2) to compare unknown experimental pseudo-spectra to previously created in-house spectra databse (in MSP format). By doing so **metaMS** *runGC* function can serve as an annotation tool. You just have to set - *"Use Personnal DataBase option"* : `show` and add you in-house database file as input. +The *runGC* process will always create an MSP file as output (either with only unknown spectra or with a mix of annotatetd ones and unknowns). That MSP file can be used for database search online (as Golm ({% cite Kopka2005 %}) and MassBank ({% cite Horai2010 %})) or locally (NIST MSSEARCH) for NIST search a [PDF tutorial is available](https://workflow4metabolomics.org/sites/default/files/fichiers/documents/w4m_HowToUseNIST_V01.pdf). For large numbers of samples, this process can take quite some time (it scales quadratically), especially if the allowed difference in retention time is large. The result now is a list of two elements : the first is the annotation table that we also saw after the comparison with the database, and the second is a list of pseudo-spectra corresponding to unknowns. - - ## Outputs and results At this stage, all elements are complete : we have the list of pseudo-spectra with an annotation, either as a chemical standard from the database, or an unknown occurring in a sizeable fraction of the injections. The only things left to do is to calculate relative intensities for the pseudo-spectra, and to put the results in an easy-to-use table. This table consists of two parts. The first part is the information on the “features”, which here are the pseudo-spectra. The second part of the table contains the intensities of these features in the individual injections. @@ -363,28 +361,16 @@ The first five lines are the standards, and the next ones are the unknowns that In addition, one is ignoring the information in the other peaks of the pseudospectrum. In **metaMS**, pseudospectrum intensity is expressed as a multiple of the corresponding reference pattern (either a database pattern or an unknown), where the intensity ratio is determined using robust regression to avoid one deviating feature to influence the results too much ({% cite Wehrens2014 %}). First, we define an object containing all relevant pseudo-spectra, and next the intensities are generated. - In both cases, the result is a list containing a set of patterns corresponding with the compounds that have been found, either annotated or unknown, the relative intensities of these patterns in the individual annotations, and possibly the xcmsSetobject for further inspection. In practice, the *runGC* function is all that users need to use. - -That file can be used for database search online (as Golm ({% cite Kopka2005 %}) and MassBank ({% cite Horai2010 %})) or locally (NIST MSSEARCH) for NIST search a [PDF tutorial is available](https://workflow4metabolomics.org/sites/default/files/fichiers/documents/w4m_HowToUseNIST_V01.pdf). - - # Take a look at your results after metaMS processing -We choose to separate our first W4M Galaxy tool into 2 parts: the processing of GC-MS data (**metaMS.runGC {% icon tool %}**) and the plotting results of these data (**metaMS.plot {% icon tool %}**). So we now have the first part describes just before and the second part we will describe just after. This part allows users to see the TIC (Total Ion Chromatogram), BPC (Base Peak Chromatogram), and also all EICs (Extracted Ion Chromatogram) you want, from our previous result outputted from **metaMS.runGC {% icon tool %} tool**. - + The [xcm plot chromatogram]{% tool toolshed.g2.bx.psu.edu/repos/lecorguille/xcms_plot_chromatogram/xcms_plot_chromatogram/3.12.0+galaxy3 %} part allows users to see the TIC (Total Ion Chromatogram), BPC (Base Peak Chromatogram). If you separated your samples into different classes, this tool can constructs TICs and BPCs one class against one class, in a `pdf` file (Figure 5) : - ![TIC](../../images/tuto_gcms_tic.png "TIC comparing 2 classes") -Concerning EICs, it is possible to choose for which compound you want to draw an EIC when you run the W4M Galaxy tool. According to your choice, you will obtain EICs for one compound in each sample you enter in the previous **metaMS** part. - - -![TIC](../../images/tuto_gcms_eic.png "Example of EIC of the 'Unknown 1' in sample 'alg2'") -
@@ -460,12 +446,9 @@ Before going to the next step of your GC-MS data processing, here are some quest >When you have processed **all or only needed** steps described before, you can continue the processing of your data with statistics or annotation tools. Don't forget to always check your files format! > - - >The pre-processing part of this analysis can be **quite time-consuming**, and already corresponds to quite a few number of steps, depending of your analysis. We highly recommend, at this step of the GC-MS workflow, to split your analysis by beginning a new Galaxy history with **only the files you need** for further steps (final `.tsv` matrices - sampleMetadata, variableMetadata, dataMatrix and the `.msp` spectral database). This will help you in limiting the chance to select the wrong dataset in further analysis, and bring a little **tidiness** for future review of your analysis process. You should also be able to make adjust peak picking parameters in the future in the same history and it will not be polluted by statistical analysis part of your process. > - - +> > > Copy dataset to a new history > > > > 1. Click on the {% icon galaxy-gear %} icon (**History options**) on the top of the history panel @@ -475,11 +458,10 @@ Don't forget to always check your files format! > > 5. Click on the new history name in the green box that have just appear to switch to this history > > > {: .tip} - +> > To begin a new history with the files from your current history, you can **use the functionality ‘copy dataset’** and copy it into a new history (the option is hidden behind the notched wheel at the top right of the history). > - - +> > You may have notice that the XCMS tools generate **output names that contain the different XCMS steps you used**, allowing easy traceability while browsing your history. Hence, we highly recommend you to rename it **with something short**, e.g. "xset", "XCMSSetObject", or anything not too long that you may find convenient. > > {% snippet faqs/galaxy/datasets_rename.md %} From 19b530cb461bc50329cc96949914d016f8f27386 Mon Sep 17 00:00:00 2001 From: Guitton Yann Date: Fri, 1 Aug 2025 16:16:25 +0000 Subject: [PATCH 29/29] updated good to go --- topics/metabolomics/tutorials/gcms/tutorial.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/topics/metabolomics/tutorials/gcms/tutorial.md b/topics/metabolomics/tutorials/gcms/tutorial.md index 3c57fbb4680a7a..b91fea4d33c5e0 100644 --- a/topics/metabolomics/tutorials/gcms/tutorial.md +++ b/topics/metabolomics/tutorials/gcms/tutorial.md @@ -466,13 +466,9 @@ Don't forget to always check your files format! > > {% snippet faqs/galaxy/datasets_rename.md %} > -> Important : Be careful of the file format -> -> During each step of pre-processing, your dataset has its format changed and can have also its name changed. -> To be able to continue to GC-MS processing, you need to have a RData object which is **merged and grouped** (from **xcms findChromPeaks Merger** {% icon tool %} and **xcms groupChromPeaks (group)** {% icon tool %}) at least. -> It means that you should have a file named `xset.merged.groupChromPeaks.RData` (and maybe with some step more in it). -> -{: .comment} +> > Important : Be careful of the file format +> > During each step of pre-processing, your dataset has its format changed and can have also its name changed. To be able to continue to GC-MS processing, you need to have a RData object which is **merged and grouped** (from **xcms findChromPeaks Merger** {% icon tool %} and **xcms groupChromPeaks (group)** {% icon tool %}) at least. It means that you should have a file named `xset.merged.groupChromPeaks.RData` (and maybe with some step more in it). +> {: .comment} # Conclusion {% icon trophy %} Well done, you’ve processed GC-MS data with [metaMS (option 1)](#processing-with-metams-option-1) or [all with XCMS (option 2)](#process-gc-ms-data-with-a-full-xcms-workflow-option-2) ! You might want to explore other [Galaxy trainings for Metabolomics]({% link topics/metabolomics/ %})