OpenMS  3.0.0
MSSpectrum.h
Go to the documentation of this file.
1 // --------------------------------------------------------------------------
2 // OpenMS -- Open-Source Mass Spectrometry
3 // --------------------------------------------------------------------------
4 // Copyright The OpenMS Team -- Eberhard Karls University Tuebingen,
5 // ETH Zurich, and Freie Universitaet Berlin 2002-2022.
6 //
7 // This software is released under a three-clause BSD license:
8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above copyright
11 // notice, this list of conditions and the following disclaimer in the
12 // documentation and/or other materials provided with the distribution.
13 // * Neither the name of any author or any participating institution
14 // may be used to endorse or promote products derived from this software
15 // without specific prior written permission.
16 // For a full list of authors, refer to the file AUTHORS.
17 // --------------------------------------------------------------------------
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 // ARE DISCLAIMED. IN NO EVENT SHALL ANY OF THE AUTHORS OR THE CONTRIBUTING
22 // INSTITUTIONS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
25 // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
26 // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
27 // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
28 // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 //
30 // --------------------------------------------------------------------------
31 // $Maintainer: Timo Sachsenberg$
32 // $Authors: Marc Sturm $
33 // --------------------------------------------------------------------------
34 
35 #pragma once
36 
37 #include <OpenMS/KERNEL/Peak1D.h>
42 
43 #include <numeric>
44 
45 namespace OpenMS
46 {
47  enum class DriftTimeUnit;
66  class OPENMS_DLLAPI MSSpectrum final :
67  private std::vector<Peak1D>,
68  public RangeManagerContainer<RangeMZ, RangeIntensity>,
69  public SpectrumSettings
70  {
71 public:
72 
74  struct OPENMS_DLLAPI RTLess
75  {
76  bool operator()(const MSSpectrum& a, const MSSpectrum& b) const;
77  };
79  struct OPENMS_DLLAPI IMLess {
80  bool operator()(const MSSpectrum& a, const MSSpectrum& b) const;
81  };
82 
84  struct Chunk {
87  bool is_sorted;
88  Chunk(Size start, Size end, bool sorted) : start(start), end(end), is_sorted(sorted) {}
89  };
90 
91  struct Chunks {
92  public:
93  Chunks(const MSSpectrum& s) : spec_(s) {}
94  void add(bool is_sorted)
95  {
96  chunks_.emplace_back((chunks_.empty() ? 0 : chunks_.back().end), spec_.size(), is_sorted);
97  }
98  std::vector<Chunk>& getChunks()
99  {
100  return chunks_;
101  }
102  private:
103  std::vector<Chunk> chunks_;
105  };
106 
108 
109  typedef OpenMS::Peak1D PeakType;
114  typedef std::vector<PeakType> ContainerType;
120  typedef std::vector<FloatDataArray> FloatDataArrays;
123  typedef std::vector<StringDataArray> StringDataArrays;
126  typedef std::vector<IntegerDataArray> IntegerDataArrays;
128 
130 
131  typedef typename ContainerType::iterator Iterator;
134  typedef typename ContainerType::const_iterator ConstIterator;
136  typedef typename ContainerType::reverse_iterator ReverseIterator;
138  typedef typename ContainerType::const_reverse_iterator ConstReverseIterator;
140 
142 
143  using ContainerType::operator[];
144  using ContainerType::begin;
145  using ContainerType::rbegin;
146  using ContainerType::end;
147  using ContainerType::rend;
148  using ContainerType::cbegin;
149  using ContainerType::cend;
150  using ContainerType::resize;
151  using ContainerType::size;
152  using ContainerType::push_back;
153  using ContainerType::emplace_back;
154  using ContainerType::pop_back;
155  using ContainerType::empty;
156  using ContainerType::front;
157  using ContainerType::back;
158  using ContainerType::reserve;
159  using ContainerType::insert;
160  using ContainerType::erase;
161  using ContainerType::swap;
162 
163  using typename ContainerType::iterator;
164  using typename ContainerType::const_iterator;
165  using typename ContainerType::size_type;
166  using typename ContainerType::value_type;
167  using typename ContainerType::reference;
168  using typename ContainerType::const_reference;
169  using typename ContainerType::pointer;
170  using typename ContainerType::difference_type;
171 
173 
174 
176  MSSpectrum();
177 
179  MSSpectrum(const MSSpectrum& source);
180 
182  MSSpectrum(MSSpectrum&&) = default;
183 
185  ~MSSpectrum() = default;
186 
188  MSSpectrum& operator=(const MSSpectrum& source);
189 
191  MSSpectrum& operator=(MSSpectrum&&) & = default;
192 
194  MSSpectrum& operator=(const SpectrumSettings & source);
195 
197  bool operator==(const MSSpectrum& rhs) const;
198 
200  bool operator!=(const MSSpectrum& rhs) const
201  {
202  return !(operator==(rhs));
203  }
204 
205  // Docu in base class (RangeManager)
206  void updateRanges() override;
207 
211  double getRT() const;
212 
214  void setRT(double rt);
215 
224  double getDriftTime() const;
225 
229  void setDriftTime(double dt);
230 
234  DriftTimeUnit getDriftTimeUnit() const;
235 
237  String getDriftTimeUnitAsString() const;
238 
242  void setDriftTimeUnit(DriftTimeUnit dt);
243 
249  UInt getMSLevel() const;
250 
252  void setMSLevel(UInt ms_level);
253 
255  const String& getName() const;
256 
258  void setName(const String& name);
259 
261 
275  const FloatDataArrays& getFloatDataArrays() const;
277 
280  {
281  return float_data_arrays_;
282  }
283 
285  void setFloatDataArrays(const FloatDataArrays& fda);
286 
288  const StringDataArrays& getStringDataArrays() const;
289 
291  StringDataArrays& getStringDataArrays();
292 
294  void setStringDataArrays(const StringDataArrays& sda);
295 
297  const IntegerDataArrays& getIntegerDataArrays() const;
298 
300  IntegerDataArrays& getIntegerDataArrays();
301 
303  void setIntegerDataArrays(const IntegerDataArrays& ida);
305 
307 
308 
313  void sortByIntensity(bool reverse = false);
314 
320  void sortByPosition();
321 
326  void sortByPositionPresorted(const std::vector<Chunk>& chunks);
327 
329  bool isSorted() const;
330 
335  template<class Predicate>
336  bool isSorted(const Predicate& lambda) const
337  {
338  auto value_2_index_wrapper = [this, &lambda](const value_type& value1, const value_type& value2) {
339  // translate values into indices (this relies on no copies being made!)
340  const Size index1 = (&value1) - (&this->front());
341  const Size index2 = (&value2) - (&this->front());
342  // just make sure the pointers above are actually pointing to a Peak inside our container
343  assert(index1 < this->size());
344  assert(index2 < this->size());
345  return lambda(index1, index2);
346  };
347  return std::is_sorted(this->begin(), this->end(), value_2_index_wrapper);
348  }
349 
354  template<class Predicate>
355  void sort(const Predicate& lambda)
356  {
357  std::vector<Size> indices(this->size());
358  std::iota(indices.begin(), indices.end(), 0);
359  std::stable_sort(indices.begin(), indices.end(), lambda);
360  select(indices);
361  }
362 
364 
367 
377  Size findNearest(CoordinateType mz) const;
378 
390  Int findNearest(CoordinateType mz, CoordinateType tolerance) const;
391 
405  Int findNearest(CoordinateType mz, CoordinateType tolerance_left, CoordinateType tolerance_right) const;
406 
418  Int findHighestInWindow(CoordinateType mz, CoordinateType tolerance_left, CoordinateType tolerance_right) const;
419 
425  Iterator MZBegin(CoordinateType mz);
426 
432  Iterator MZBegin(Iterator begin, CoordinateType mz, Iterator end);
433 
439  Iterator MZEnd(CoordinateType mz);
440 
446  Iterator MZEnd(Iterator begin, CoordinateType mz, Iterator end);
447 
453  ConstIterator MZBegin(CoordinateType mz) const;
454 
460  ConstIterator MZBegin(ConstIterator begin, CoordinateType mz, ConstIterator end) const;
461 
467  ConstIterator MZEnd(CoordinateType mz) const;
468 
474  ConstIterator MZEnd(ConstIterator begin, CoordinateType mz, ConstIterator end) const;
475 
483  Iterator PosBegin(CoordinateType mz);
484 
492  Iterator PosBegin(Iterator begin, CoordinateType mz, Iterator end);
493 
501  ConstIterator PosBegin(CoordinateType mz) const;
502 
510  ConstIterator PosBegin(ConstIterator begin, CoordinateType mz, ConstIterator end) const;
511 
519  Iterator PosEnd(CoordinateType mz);
520 
528  Iterator PosEnd(Iterator begin, CoordinateType mz, Iterator end);
529 
537  ConstIterator PosEnd(CoordinateType mz) const;
538 
546  ConstIterator PosEnd(ConstIterator begin, CoordinateType mz, ConstIterator end) const;
547 
550  bool containsIMData() const;
551 
559  std::pair<Size, DriftTimeUnit> getIMData() const;
560 
562 
563 
575  void clear(bool clear_meta_data);
576 
577  /*
578  @brief Select a (subset of) spectrum and its data_arrays, only retaining the indices given in @p indices
579 
580  @param indices Vector of indices to keep
581  @return Reference to this MSSpectrum
582 
583  */
584  MSSpectrum& select(const std::vector<Size>& indices);
585 
586 
597  SpectrumSettings::SpectrumType getType(const bool query_data) const;
598  using SpectrumSettings::getType; // expose base class function
599 
602  ConstIterator getBasePeak() const;
603 
606  Iterator getBasePeak();
607 
609  PeakType::IntensityType calculateTIC() const;
610 
611 protected:
614 
616  double drift_time_;
617 
620 
623 
626 
629 
632 
635  };
636 
637  inline std::ostream& operator<<(std::ostream& os, const MSSpectrum& spec)
638  {
639  os << "-- MSSPECTRUM BEGIN --" << std::endl;
640 
641  // spectrum settings
642  os << static_cast<const SpectrumSettings&>(spec);
643 
644  // peaklist
645  for (MSSpectrum::ConstIterator it = spec.begin(); it != spec.end(); ++it)
646  {
647  os << *it << std::endl;
648  }
649 
650  os << "-- MSSPECTRUM END --" << std::endl;
651  return os;
652  }
653 
654 } // namespace OpenMS
void sort(const Predicate &lambda)
Definition: MSSpectrum.h:355
bool is_sorted
are the Peaks in [start, end) sorted yet?
Definition: MSSpectrum.h:87
PeakType::CoordinateType CoordinateType
Coordinate (m/z) type.
Definition: MSSpectrum.h:112
DriftTimeUnit
Drift time unit for ion mobility.
Definition: IMTypes.h:48
A more convenient string class.
Definition: String.h:58
IntegerDataArrays integer_data_arrays_
Integer data arrays.
Definition: MSSpectrum.h:634
std::vector< Chunk > & getChunks()
Definition: MSSpectrum.h:98
SpectrumType
Spectrum peak type.
Definition: SpectrumSettings.h:70
StringDataArrays string_data_arrays_
String data arrays.
Definition: MSSpectrum.h:631
Comparator for the retention time.
Definition: MSSpectrum.h:74
ContainerType::reverse_iterator ReverseIterator
Mutable reverse iterator.
Definition: MSSpectrum.h:136
unsigned int UInt
Unsigned integer type.
Definition: Types.h:94
Peak2D PeakType
Definition: MassTrace.h:47
ContainerType::const_iterator ConstIterator
Non-mutable iterator.
Definition: MSSpectrum.h:134
OpenMS::DataArrays::FloatDataArray FloatDataArray
Float data array vector type.
Definition: MSSpectrum.h:119
RangeManager< RangeMZ, RangeIntensity > RangeManagerType
Definition: MSSpectrum.h:117
Representation of 1D spectrum settings.
Definition: SpectrumSettings.h:63
bool operator==(const IDBoostGraph::ProteinGroup &lhs, const IDBoostGraph::ProteinGroup &rhs)
String name_
Name.
Definition: MSSpectrum.h:625
Main OpenMS namespace.
Definition: FeatureDeconvolution.h:47
const MSSpectrum & spec_
Definition: MSSpectrum.h:104
ContainerType::iterator Iterator
Mutable iterator.
Definition: MSSpectrum.h:132
std::vector< Chunk > chunks_
Definition: MSSpectrum.h:103
Chunks(const MSSpectrum &s)
Definition: MSSpectrum.h:93
std::vector< FloatDataArray > FloatDataArrays
Definition: MSSpectrum.h:120
Float data array class.
Definition: DataArrays.h:45
Integer data array class.
Definition: DataArrays.h:52
FloatDataArrays float_data_arrays_
Float data arrays.
Definition: MSSpectrum.h:628
The representation of a 1D spectrum.
Definition: MSSpectrum.h:66
SpectrumType getType() const
returns the spectrum type (centroided (PEAKS) or profile data (RAW))
Definition: MSSpectrum.h:91
bool operator!=(const MSSpectrum &rhs) const
Equality operator.
Definition: MSSpectrum.h:200
A 1-dimensional raw data point or peak.
Definition: Peak1D.h:53
std::ostream & operator<<(std::ostream &os, const AccurateMassSearchResult &amsr)
Used to remember what subsets in a spectrum are sorted already to allow faster sorting of the spectru...
Definition: MSSpectrum.h:84
std::vector< StringDataArray > StringDataArrays
Definition: MSSpectrum.h:123
bool isSorted(const Predicate &lambda) const
Definition: MSSpectrum.h:336
static String & reverse(String &this_s)
Definition: StringUtilsSimple.h:355
FloatDataArrays & getFloatDataArrays()
Returns a mutable reference to the float meta data arrays.
Definition: MSSpectrum.h:279
std::vector< PeakType > ContainerType
Spectrum base type.
Definition: MSSpectrum.h:114
RangeManagerContainer< RangeMZ, RangeIntensity > RangeManagerContainerType
RangeManager.
Definition: MSSpectrum.h:116
OpenMS::DataArrays::StringDataArray StringDataArray
String data array vector type.
Definition: MSSpectrum.h:122
Chunk(Size start, Size end, bool sorted)
Definition: MSSpectrum.h:88
std::vector< IntegerDataArray > IntegerDataArrays
Definition: MSSpectrum.h:126
DriftTimeUnit drift_time_unit_
Drift time unit.
Definition: MSSpectrum.h:619
void add(bool is_sorted)
Definition: MSSpectrum.h:94
double retention_time_
Retention time.
Definition: MSSpectrum.h:613
size_t Size
Size type e.g. used as variable which can hold result of size()
Definition: Types.h:127
UInt ms_level_
MS level.
Definition: MSSpectrum.h:622
OpenMS::DataArrays::IntegerDataArray IntegerDataArray
Integer data array vector type.
Definition: MSSpectrum.h:125
double drift_time_
Drift time.
Definition: MSSpectrum.h:616
String data array class.
Definition: DataArrays.h:59
Size start
inclusive
Definition: MSSpectrum.h:85
Handles the management of a multidimensional range, e.g. RangeMZ and RangeIntensity for spectra...
Definition: RangeManager.h:565
Definition: RangeManager.h:896
Comparator for the ion mobility.
Definition: MSSpectrum.h:79
int Int
Signed integer type.
Definition: Types.h:102
ContainerType::const_reverse_iterator ConstReverseIterator
Non-mutable reverse iterator.
Definition: MSSpectrum.h:138
Size end
not inclusive
Definition: MSSpectrum.h:86