OpenMS
Loading...
Searching...
No Matches
ChromatogramTools.h
Go to the documentation of this file.
1// Copyright (c) 2002-present, OpenMS Inc. -- EKU Tuebingen, ETH Zurich, and FU Berlin
2// SPDX-License-Identifier: BSD-3-Clause
3//
4// --------------------------------------------------------------------------
5// $Maintainer: Timo Sachsenberg $
6// $Authors: Andreas Bertsch $
7// --------------------------------------------------------------------------
8
9#pragma once
10
16
17#include <map>
18
19namespace OpenMS
20{
30 {
31public:
33
34
37
40 {}
41
44 {}
45
47
49
50
59 template <typename ExperimentType>
60 void convertChromatogramsToSpectra(ExperimentType & exp)
61 {
62 for (std::vector<MSChromatogram >::const_iterator it = exp.getChromatograms().begin(); it != exp.getChromatograms().end(); ++it)
63 {
64 // for each peak add a new spectrum
65 for (typename ExperimentType::ChromatogramType::const_iterator pit = it->begin(); pit != it->end(); ++pit)
66 {
67 typename ExperimentType::SpectrumType spec;
68
69 // add precursor and product peaks to spectrum settings
70 spec.getPrecursors().push_back(it->getPrecursor());
71 spec.getProducts().push_back(it->getProduct());
72 spec.setRT(pit->getRT());
73 spec.setMSLevel(2);
74 spec.setInstrumentSettings(it->getInstrumentSettings());
75 spec.setAcquisitionInfo(it->getAcquisitionInfo());
76 spec.setSourceFile(it->getSourceFile());
77
78 // TODO implement others
80 {
81 spec.getInstrumentSettings().setScanMode(InstrumentSettings::SRM);
82 }
84 {
85 spec.getInstrumentSettings().setScanMode(InstrumentSettings::SIM);
86 }
87
88 // new spec contains one peak, with product m/z and intensity
89 spec.emplace_back(it->getMZ(), pit->getIntensity());
90 exp.addSpectrum(spec);
91 }
92 }
93
94 exp.setChromatograms(std::vector<MSChromatogram >());
95 }
96
109 template <typename ExperimentType>
110 void convertSpectraToChromatograms(ExperimentType & exp, bool remove_spectra = false, bool force_conversion = false)
111 {
112 typedef typename ExperimentType::SpectrumType SpectrumType;
113 std::map<double, std::map<double, std::vector<SpectrumType> > > chroms;
114 std::map<double, MSChromatogram > chroms_xic;
115 for (typename ExperimentType::ConstIterator it = exp.begin(); it != exp.end(); ++it)
116 {
117 // TODO other types
118 if (it->getInstrumentSettings().getScanMode() == InstrumentSettings::SRM || force_conversion)
119 {
120 // exactly one precursor and one product ion
121 if (it->getPrecursors().size() == 1 && it->size() == 1)
122 {
123 chroms[it->getPrecursors().begin()->getMZ()][it->begin()->getMZ()].push_back(*it);
124 }
125 // Exactly one precursor and more than one product ion.
126 // This is how some converters (e.g. ReAdW 4.0.2) store SRM data,
127 // collecting all information from one precursor in a single
128 // pseudo-spectrum
129 else if (it->getPrecursors().size() == 1 && it->size() > 0)
130 {
131 for (Size peak_idx = 0; peak_idx < it->size(); peak_idx++)
132 {
133 // copy spectrum and delete all data, but keep metadata, then add single peak
134 SpectrumType dummy = *it;
135 dummy.clear(false);
136 dummy.push_back((*it)[peak_idx]);
137 chroms[it->getPrecursors().begin()->getMZ()][(*it)[peak_idx].getMZ()].push_back(dummy);
138 }
139 }
140 // We have no precursor, so this may be a MS1 chromatogram scan (as encountered in GC-MS)
141 else if (force_conversion)
142 {
143 for (auto& p : *it)
144 {
145 double mz = p.getMZ();
146 ChromatogramPeak chr_p;
147 chr_p.setRT(it->getRT());
148 chr_p.setIntensity(p.getIntensity());
149 if (chroms_xic.find(mz) == chroms_xic.end())
150 {
151 // new chromatogram
152 chroms_xic[mz].getPrecursor().setMZ(mz);
153 // chroms_xic[mz].setProduct(prod); // probably no product
154 chroms_xic[mz].setInstrumentSettings(it->getInstrumentSettings());
155 chroms_xic[mz].getPrecursor().setMetaValue("description", String("XIC @ " + String(mz)));
156 chroms_xic[mz].setAcquisitionInfo(it->getAcquisitionInfo());
157 chroms_xic[mz].setSourceFile(it->getSourceFile());
158 }
159 chroms_xic[mz].push_back(chr_p);
160 }
161 }
162 else
163 {
164 OPENMS_LOG_WARN << "ChromatogramTools: need exactly one precursor (given " << it->getPrecursors().size() <<
165 ") and one or more product ions (" << it->size() << "), skipping conversion of this spectrum to chromatogram. If this is a MS1 chromatogram, please force conversion (e.g. with -convert_to_chromatograms)." << std::endl;
166 }
167 }
168 else
169 {
170 // This does not makes sense to warn here, because it would also warn on simple mass spectra...
171 // TODO think what to to here
172 //OPENMS_LOG_WARN << "ChromatogramTools: cannot convert other chromatogram spectra types than 'Selected Reaction Monitoring', skipping conversion." << std::endl;
173 //
174 }
175 }
176
177 // Add the XIC chromatograms
178 for (auto & chrom: chroms_xic) exp.addChromatogram(chrom.second);
179
180 // Add the SRM chromatograms
181 typename std::map<double, std::map<double, std::vector<SpectrumType> > >::const_iterator it1 = chroms.begin();
182 for (; it1 != chroms.end(); ++it1)
183 {
184 typename std::map<double, std::vector<SpectrumType> >::const_iterator it2 = it1->second.begin();
185 for (; it2 != it1->second.end(); ++it2)
186 {
187 typename ExperimentType::ChromatogramType chrom;
188 chrom.setPrecursor(*it2->second.begin()->getPrecursors().begin());
189 Product prod;
190 prod.setMZ(it2->first);
191 chrom.setProduct(prod);
192 chrom.setInstrumentSettings(it2->second.begin()->getInstrumentSettings());
193 chrom.setAcquisitionInfo(it2->second.begin()->getAcquisitionInfo());
194 chrom.setSourceFile(it2->second.begin()->getSourceFile());
195
196 typename std::vector<SpectrumType>::const_iterator it3 = it2->second.begin();
197 for (; it3 != it2->second.end(); ++it3)
198 {
199 typename ExperimentType::ChromatogramType::PeakType p;
200 p.setRT(it3->getRT());
201 p.setIntensity(it3->begin()->getIntensity());
202 chrom.push_back(p);
203 }
204
205 chrom.setNativeID("chromatogram=" + it2->second.begin()->getNativeID()); // TODO native id?
207 exp.addChromatogram(chrom);
208 }
209 }
210
211 if (remove_spectra)
212 {
213 exp.getSpectra().erase(remove_if(exp.begin(), exp.end(), HasScanMode<SpectrumType>(InstrumentSettings::SRM)), exp.end());
214 }
215 }
216
218 };
219} // namespace OpenMS
220
#define OPENMS_LOG_WARN
Macro if a warning, a piece of information which should be read by the user, should be logged.
Definition LogStream.h:447
A 1-dimensional raw data point or peak for chromatograms.
Definition ChromatogramPeak.h:29
void setRT(CoordinateType rt)
Mutable access to RT.
Definition ChromatogramPeak.h:93
void setIntensity(IntensityType intensity)
Mutable access to the data point intensity (height)
Definition ChromatogramPeak.h:84
@ SELECTED_REACTION_MONITORING_CHROMATOGRAM
Definition ChromatogramSettings.h:50
@ SELECTED_ION_MONITORING_CHROMATOGRAM
Definition ChromatogramSettings.h:49
Conversion class to convert chromatograms.
Definition ChromatogramTools.h:30
void convertChromatogramsToSpectra(ExperimentType &exp)
converts the chromatogram to a list of spectra with instrument settings
Definition ChromatogramTools.h:60
ChromatogramTools()
default constructor
Definition ChromatogramTools.h:35
virtual ~ChromatogramTools()
destructor
Definition ChromatogramTools.h:43
void convertSpectraToChromatograms(ExperimentType &exp, bool remove_spectra=false, bool force_conversion=false)
converts e.g. SRM spectra to chromatograms
Definition ChromatogramTools.h:110
ChromatogramTools(const ChromatogramTools &)
copy constructor
Definition ChromatogramTools.h:39
Predicate that determines if a spectrum has a certain scan mode.
Definition RangeUtils.h:179
@ SRM
Selected reaction monitoring scan Synonyms: 'Multiple reaction monitoring scan',...
Definition InstrumentSettings.h:34
@ SIM
Selected ion monitoring scan Synonyms: 'Multiple ion monitoring scan', 'SIM scan',...
Definition InstrumentSettings.h:33
The representation of a 1D spectrum.
Definition MSSpectrum.h:44
void clear(bool clear_meta_data)
Clears all data and meta data.
Product meta information.
Definition Product.h:26
void setMZ(double mz)
sets the target m/z
A more convenient string class.
Definition String.h:34
size_t Size
Size type e.g. used as variable which can hold result of size()
Definition Types.h:97
MSSpectrum SpectrumType
Definition MzDataHandler.h:34
Main OpenMS namespace.
Definition openswathalgo/include/OpenMS/OPENSWATHALGO/DATAACCESS/ISpectrumAccess.h:19