OpenMS
ChromatogramTools.h
Go to the documentation of this file.
1 // Copyright (c) 2002-2023, The OpenMS Team -- 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 
11 #include <OpenMS/CONCEPT/Types.h>
16 
17 #include <map>
18 
19 namespace OpenMS
20 {
30  {
31 public:
33 
36  {}
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  }
83  if (it->getChromatogramType() == ChromatogramSettings::SELECTED_ION_MONITORING_CHROMATOGRAM)
84  {
85  spec.getInstrumentSettings().setScanMode(InstrumentSettings::SIM);
86  }
87 
88  // new spec contains one peak, with product m/z and intensity
89  typename ExperimentType::PeakType peak;
90  peak.setMZ(it->getMZ());
91  peak.setIntensity(pit->getIntensity());
92  spec.push_back(peak);
93  exp.addSpectrum(spec);
94  }
95  }
96 
97  exp.setChromatograms(std::vector<MSChromatogram >());
98  }
99 
112  template <typename ExperimentType>
113  void convertSpectraToChromatograms(ExperimentType & exp, bool remove_spectra = false, bool force_conversion = false)
114  {
116  std::map<double, std::map<double, std::vector<SpectrumType> > > chroms;
117  std::map<double, MSChromatogram > chroms_xic;
118  for (typename ExperimentType::ConstIterator it = exp.begin(); it != exp.end(); ++it)
119  {
120  // TODO other types
121  if (it->getInstrumentSettings().getScanMode() == InstrumentSettings::SRM || force_conversion)
122  {
123  // exactly one precursor and one product ion
124  if (it->getPrecursors().size() == 1 && it->size() == 1)
125  {
126  chroms[it->getPrecursors().begin()->getMZ()][it->begin()->getMZ()].push_back(*it);
127  }
128  // Exactly one precursor and more than one product ion.
129  // This is how some converters (e.g. ReAdW 4.0.2) store SRM data,
130  // collecting all information from one precursor in a single
131  // pseudo-spectrum
132  else if (it->getPrecursors().size() == 1 && it->size() > 0)
133  {
134  for (Size peak_idx = 0; peak_idx < it->size(); peak_idx++)
135  {
136  // copy spectrum and delete all data, but keep metadata, then add single peak
137  SpectrumType dummy = *it;
138  dummy.clear(false);
139  dummy.push_back((*it)[peak_idx]);
140  chroms[it->getPrecursors().begin()->getMZ()][(*it)[peak_idx].getMZ()].push_back(dummy);
141  }
142  }
143  // We have no precursor, so this may be a MS1 chromatogram scan (as encountered in GC-MS)
144  else if (force_conversion)
145  {
146  for (auto& p : *it)
147  {
148  double mz = p.getMZ();
149  ChromatogramPeak chr_p;
150  chr_p.setRT(it->getRT());
151  chr_p.setIntensity(p.getIntensity());
152  if (chroms_xic.find(mz) == chroms_xic.end())
153  {
154  // new chromatogram
155  chroms_xic[mz].getPrecursor().setMZ(mz);
156  // chroms_xic[mz].setProduct(prod); // probably no product
157  chroms_xic[mz].setInstrumentSettings(it->getInstrumentSettings());
158  chroms_xic[mz].getPrecursor().setMetaValue("description", String("XIC @ " + String(mz)));
159  chroms_xic[mz].setAcquisitionInfo(it->getAcquisitionInfo());
160  chroms_xic[mz].setSourceFile(it->getSourceFile());
161  }
162  chroms_xic[mz].push_back(chr_p);
163  }
164  }
165  else
166  {
167  OPENMS_LOG_WARN << "ChromatogramTools: need exactly one precursor (given " << it->getPrecursors().size() <<
168  ") 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;
169  }
170  }
171  else
172  {
173  // This does not makes sense to warn here, because it would also warn on simple mass spectra...
174  // TODO think what to to here
175  //OPENMS_LOG_WARN << "ChromatogramTools: cannot convert other chromatogram spectra types than 'Selected Reaction Monitoring', skipping conversion." << std::endl;
176  //
177  }
178  }
179 
180  // Add the XIC chromatograms
181  for (auto & chrom: chroms_xic) exp.addChromatogram(chrom.second);
182 
183  // Add the SRM chromatograms
184  typename std::map<double, std::map<double, std::vector<SpectrumType> > >::const_iterator it1 = chroms.begin();
185  for (; it1 != chroms.end(); ++it1)
186  {
187  typename std::map<double, std::vector<SpectrumType> >::const_iterator it2 = it1->second.begin();
188  for (; it2 != it1->second.end(); ++it2)
189  {
190  typename ExperimentType::ChromatogramType chrom;
191  chrom.setPrecursor(*it2->second.begin()->getPrecursors().begin());
192  Product prod;
193  prod.setMZ(it2->first);
194  chrom.setProduct(prod);
195  chrom.setInstrumentSettings(it2->second.begin()->getInstrumentSettings());
196  chrom.setAcquisitionInfo(it2->second.begin()->getAcquisitionInfo());
197  chrom.setSourceFile(it2->second.begin()->getSourceFile());
198 
199  typename std::vector<SpectrumType>::const_iterator it3 = it2->second.begin();
200  for (; it3 != it2->second.end(); ++it3)
201  {
203  p.setRT(it3->getRT());
204  p.setIntensity(it3->begin()->getIntensity());
205  chrom.push_back(p);
206  }
207 
208  chrom.setNativeID("chromatogram=" + it2->second.begin()->getNativeID()); // TODO native id?
210  exp.addChromatogram(chrom);
211  }
212  }
213 
214  if (remove_spectra)
215  {
216  exp.getSpectra().erase(remove_if(exp.begin(), exp.end(), HasScanMode<SpectrumType>(InstrumentSettings::SRM)), exp.end());
217  }
218  }
219 
221  };
222 } // namespace OpenMS
223 
#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:444
A 1-dimensional raw data point or peak for chromatograms.
Definition: ChromatogramPeak.h:28
void setRT(CoordinateType rt)
Mutable access to RT.
Definition: ChromatogramPeak.h:95
void setIntensity(IntensityType intensity)
Mutable access to the data point intensity (height)
Definition: ChromatogramPeak.h:86
void setPrecursor(const Precursor &precursor)
sets the precursors
@ SELECTED_REACTION_MONITORING_CHROMATOGRAM
Definition: ChromatogramSettings.h:48
@ SELECTED_ION_MONITORING_CHROMATOGRAM
Definition: ChromatogramSettings.h:47
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:113
ChromatogramTools(const ChromatogramTools &)
copy constructor
Definition: ChromatogramTools.h:39
Predicate that determines if a spectrum has a certain scan mode.
Definition: RangeUtils.h:178
@ SRM
Selected reaction monitoring scan Synonyms: 'Multiple reaction monitoring scan',...
Definition: InstrumentSettings.h:33
@ SIM
Selected ion monitoring scan Synonyms: 'Multiple ion monitoring scan', 'SIM scan',...
Definition: InstrumentSettings.h:32
The representation of a 1D spectrum.
Definition: MSSpectrum.h:44
void clear(bool clear_meta_data)
Clears all data and meta data.
void setMZ(CoordinateType coordinate)
Mutable access to the m/z coordinate (index 1)
Definition: Peak2D.h:178
void setRT(CoordinateType coordinate)
Mutable access to the RT coordinate (index 0)
Definition: Peak2D.h:190
Product meta information.
Definition: Product.h:24
void setMZ(double mz)
sets the target m/z
const std::vector< Precursor > & getPrecursors() const
returns a const reference to the precursors
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:101
MSChromatogram ChromatogramType
Definition: MzDataHandler.h:35
MSSpectrum SpectrumType
Definition: MzDataHandler.h:34
Main OpenMS namespace.
Definition: FeatureDeconvolution.h:22
Peak2D PeakType
Definition: MassTrace.h:21