OpenMS
MSSpectrum.h
Go to the documentation of this file.
1 // Copyright (c) 2002-present, 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: Marc Sturm $
7 // --------------------------------------------------------------------------
8 
9 #pragma once
10 
11 #include <OpenMS/KERNEL/Peak1D.h>
16 
17 #include <numeric>
18 
19 namespace OpenMS
20 {
21  enum class DriftTimeUnit;
40  class OPENMS_DLLAPI MSSpectrum final :
41  private std::vector<Peak1D>,
42  public RangeManagerContainer<RangeMZ, RangeIntensity, RangeMobility>,
43  public SpectrumSettings
44  {
45 public:
46 
48  struct OPENMS_DLLAPI RTLess
49  {
50  bool operator()(const MSSpectrum& a, const MSSpectrum& b) const;
51  };
53  struct OPENMS_DLLAPI IMLess {
54  bool operator()(const MSSpectrum& a, const MSSpectrum& b) const;
55  };
56 
58  struct Chunk {
61  bool is_sorted;
62  Chunk(Size p_start, Size p_end, bool p_sorted) : start(p_start), end(p_end), is_sorted(p_sorted)
63  {
64  }
65  };
66 
67  struct Chunks {
68  public:
69  Chunks(const MSSpectrum& s) : spec_(s) {}
70  void add(bool is_sorted)
71  {
72  chunks_.emplace_back((chunks_.empty() ? 0 : chunks_.back().end), spec_.size(), is_sorted);
73  }
74  std::vector<Chunk>& getChunks()
75  {
76  return chunks_;
77  }
78  private:
79  std::vector<Chunk> chunks_;
80  const MSSpectrum& spec_;
81  };
82 
84 
85  typedef OpenMS::Peak1D PeakType;
90  typedef std::vector<PeakType> ContainerType;
96  typedef std::vector<FloatDataArray> FloatDataArrays;
99  typedef std::vector<StringDataArray> StringDataArrays;
102  typedef std::vector<IntegerDataArray> IntegerDataArrays;
104 
106 
107  typedef typename ContainerType::iterator Iterator;
110  typedef typename ContainerType::const_iterator ConstIterator;
112  typedef typename ContainerType::reverse_iterator ReverseIterator;
114  typedef typename ContainerType::const_reverse_iterator ConstReverseIterator;
116 
118 
119  using ContainerType::operator[];
120  using ContainerType::begin;
121  using ContainerType::rbegin;
122  using ContainerType::end;
123  using ContainerType::rend;
124  using ContainerType::cbegin;
125  using ContainerType::cend;
126  using ContainerType::resize;
127  using ContainerType::size;
128  using ContainerType::push_back;
129  using ContainerType::emplace_back;
130  using ContainerType::pop_back;
131  using ContainerType::empty;
132  using ContainerType::front;
133  using ContainerType::back;
134  using ContainerType::reserve;
135  using ContainerType::insert;
136  using ContainerType::erase;
137  using ContainerType::swap;
138  using ContainerType::data;
139  using ContainerType::shrink_to_fit;
140 
141  using typename ContainerType::iterator;
142  using typename ContainerType::const_iterator;
143  using typename ContainerType::size_type;
144  using typename ContainerType::value_type;
145  using typename ContainerType::reference;
146  using typename ContainerType::const_reference;
147  using typename ContainerType::pointer;
148  using typename ContainerType::difference_type;
149 
151 
152 
155 
157  MSSpectrum(const std::initializer_list<Peak1D>& init);
158 
160  MSSpectrum(const MSSpectrum& source);
161 
163  MSSpectrum(MSSpectrum&&) = default;
164 
166  ~MSSpectrum() = default;
167 
169  MSSpectrum& operator=(const MSSpectrum& source);
170 
172  MSSpectrum& operator=(MSSpectrum&&) & = default;
173 
176 
178  bool operator==(const MSSpectrum& rhs) const;
179 
181  bool operator!=(const MSSpectrum& rhs) const
182  {
183  return !(operator==(rhs));
184  }
185 
186  // Docu in base class (RangeManager)
187  void updateRanges() override;
188 
192  double getRT() const;
193 
195  void setRT(double rt);
196 
205  double getDriftTime() const;
206 
210  void setDriftTime(double dt);
211 
216 
219 
224 
230  UInt getMSLevel() const;
231 
233  void setMSLevel(UInt ms_level);
234 
236  const String& getName() const;
237 
239  void setName(const String& name);
240 
242 
258 
261  {
262  return float_data_arrays_;
263  }
264 
267 
270 
273 
276 
279 
282 
286 
288 
289 
294  void sortByIntensity(bool reverse = false);
295 
302 
311 
316  void sortByPositionPresorted(const std::vector<Chunk>& chunks);
317 
319  bool isSorted() const;
320 
325  bool isSortedByIM() const;
326 
331  template<class Predicate>
332  bool isSorted(const Predicate& lambda) const
333  {
334  auto value_2_index_wrapper = [this, &lambda](const value_type& value1, const value_type& value2) {
335  // translate values into indices (this relies on no copies being made!)
336  const Size index1 = (&value1) - (&this->front());
337  const Size index2 = (&value2) - (&this->front());
338  // just make sure the pointers above are actually pointing to a Peak inside our container
339  assert(index1 < this->size());
340  assert(index2 < this->size());
341  return lambda(index1, index2);
342  };
343  return std::is_sorted(this->begin(), this->end(), value_2_index_wrapper);
344  }
345 
350  template<class Predicate>
351  void sort(const Predicate& lambda)
352  {
353  std::vector<Size> indices(this->size());
354  std::iota(indices.begin(), indices.end(), 0);
355  std::stable_sort(indices.begin(), indices.end(), lambda);
356  select(indices);
357  }
358 
360 
363 
374 
387 
401  Int findNearest(CoordinateType mz, CoordinateType tolerance_left, CoordinateType tolerance_right) const;
402 
414  Int findHighestInWindow(CoordinateType mz, CoordinateType tolerance_left, CoordinateType tolerance_right) const;
415 
422 
429 
436 
443 
450 
457 
464 
471 
480 
489 
498 
507 
516 
525 
534 
543 
546  bool containsIMData() const;
547 
556  std::pair<Size, DriftTimeUnit> getIMData() const;
557 
558 
564  std::pair<DriftTimeUnit, std::vector<float>> maybeGetIMData() const;
565 
567 
568 
580  void clear(bool clear_meta_data);
581 
582  /*
583  @brief Select a (subset of) spectrum and its data_arrays, only retaining the indices given in @p indices
584 
585  @param indices Vector of indices to keep
586  @return Reference to this MSSpectrum
587 
588  */
589  MSSpectrum& select(const std::vector<Size>& indices);
590 
591 
602  SpectrumSettings::SpectrumType getType(const bool query_data) const;
603  using SpectrumSettings::getType; // expose base class function
604 
608 
612 
615 
616 protected:
618  double retention_time_ = -1;
619 
621  double drift_time_ = -1;
622 
624  DriftTimeUnit drift_time_unit_ = DriftTimeUnit::NONE;
625 
627  UInt ms_level_ = 1;
628 
631 
634 
637 
640  };
641 
642  inline std::ostream& operator<<(std::ostream& os, const MSSpectrum& spec)
643  {
644  os << "-- MSSPECTRUM BEGIN --" << std::endl;
645 
646  // spectrum settings
647  os << static_cast<const SpectrumSettings&>(spec);
648 
649  // peaklist
650  for (MSSpectrum::ConstIterator it = spec.begin(); it != spec.end(); ++it)
651  {
652  os << *it << std::endl;
653  }
654 
655  os << "-- MSSPECTRUM END --" << std::endl;
656  return os;
657  }
658 
659 } // namespace OpenMS
Float data array class.
Definition: DataArrays.h:22
Integer data array class.
Definition: DataArrays.h:30
String data array class.
Definition: DataArrays.h:38
The representation of a 1D spectrum.
Definition: MSSpectrum.h:44
void setIntegerDataArrays(const IntegerDataArrays &ida)
Sets the integer meta data arrays.
ConstIterator MZBegin(CoordinateType mz) const
Binary search for peak range begin.
Iterator getBasePeak()
FloatDataArrays & getFloatDataArrays()
Returns a mutable reference to the float meta data arrays.
Definition: MSSpectrum.h:260
Iterator MZBegin(Iterator begin, CoordinateType mz, Iterator end)
Binary search for peak range begin.
double getRT() const
PeakType::CoordinateType CoordinateType
Coordinate (m/z) type.
Definition: MSSpectrum.h:88
Iterator PosEnd(Iterator begin, CoordinateType mz, Iterator end)
Binary search for peak range end (returns the past-the-end iterator)
void setMSLevel(UInt ms_level)
Sets the MS level.
Int findNearest(CoordinateType mz, CoordinateType tolerance) const
Binary search for the peak nearest to a specific m/z given a +/- tolerance windows in Th.
ConstIterator PosBegin(CoordinateType mz) const
Binary search for peak range begin.
MSSpectrum()
Constructor.
std::vector< StringDataArray > StringDataArrays
Definition: MSSpectrum.h:99
OpenMS::DataArrays::FloatDataArray FloatDataArray
Float data array vector type.
Definition: MSSpectrum.h:95
bool operator!=(const MSSpectrum &rhs) const
Equality operator.
Definition: MSSpectrum.h:181
bool isSortedByIM() const
Iterator PosBegin(Iterator begin, CoordinateType mz, Iterator end)
Binary search for peak range begin.
SpectrumSettings::SpectrumType getType(const bool query_data) const
Determine if spectrum is profile or centroided using up to three layers of information.
String name_
Name.
Definition: MSSpectrum.h:630
ContainerType::const_iterator ConstIterator
Non-mutable iterator.
Definition: MSSpectrum.h:110
MSSpectrum(const MSSpectrum &source)
Copy constructor.
String getDriftTimeUnitAsString() const
returns the ion mobility drift time unit as string
bool containsIMData() const
StringDataArrays & getStringDataArrays()
Returns a mutable reference to the string meta data arrays.
ContainerType::reverse_iterator ReverseIterator
Mutable reverse iterator.
Definition: MSSpectrum.h:112
ConstIterator PosBegin(ConstIterator begin, CoordinateType mz, ConstIterator end) const
Binary search for peak range begin.
MSSpectrum & operator=(const SpectrumSettings &source)
Assignment operator.
void setDriftTimeUnit(DriftTimeUnit dt)
Sets the ion mobility drift time unit.
std::vector< PeakType > ContainerType
Spectrum base type.
Definition: MSSpectrum.h:90
ContainerType::const_reverse_iterator ConstReverseIterator
Non-mutable reverse iterator.
Definition: MSSpectrum.h:114
bool isSorted() const
Checks if all peaks are sorted with respect to ascending m/z.
std::pair< DriftTimeUnit, std::vector< float > > maybeGetIMData() const
Get the spectrum's ion mobility data (if exists) and its associated unit as a pair of {unit,...
ConstIterator MZBegin(ConstIterator begin, CoordinateType mz, ConstIterator end) const
Binary search for peak range begin.
MSSpectrum & select(const std::vector< Size > &indices)
Iterator MZEnd(Iterator begin, CoordinateType mz, Iterator end)
Binary search for peak range end (returns the past-the-end iterator)
void setName(const String &name)
Sets the name.
Iterator MZBegin(CoordinateType mz)
Binary search for peak range begin.
ConstIterator PosEnd(ConstIterator begin, CoordinateType mz, ConstIterator end) const
Binary search for peak range end (returns the past-the-end iterator)
void sortByPosition()
Lexicographically sorts the peaks by their position.
ConstIterator MZEnd(ConstIterator begin, CoordinateType mz, ConstIterator end) const
Binary search for peak range end (returns the past-the-end iterator)
StringDataArrays string_data_arrays_
String data arrays.
Definition: MSSpectrum.h:636
ConstIterator MZEnd(CoordinateType mz) const
Binary search for peak range end (returns the past-the-end iterator)
void sortByIntensity(bool reverse=false)
Lexicographically sorts the peaks by their intensity.
void sortByPositionPresorted(const std::vector< Chunk > &chunks)
Sort the spectrum, but uses the fact, that certain chunks are presorted.
DriftTimeUnit getDriftTimeUnit() const
Returns the ion mobility drift time unit.
const IntegerDataArrays & getIntegerDataArrays() const
Returns a const reference to the integer meta data arrays.
MSSpectrum(MSSpectrum &&)=default
Move constructor.
IntegerDataArrays integer_data_arrays_
Integer data arrays.
Definition: MSSpectrum.h:639
void sort(const Predicate &lambda)
Definition: MSSpectrum.h:351
OpenMS::DataArrays::StringDataArray StringDataArray
String data array vector type.
Definition: MSSpectrum.h:98
~MSSpectrum()=default
Destructor.
std::pair< Size, DriftTimeUnit > getIMData() const
Get the Ion mobility data array's index and its associated unit.
bool operator==(const MSSpectrum &rhs) const
Equality operator.
PeakType::IntensityType calculateTIC() const
compute the total ion count (sum of all peak intensities)
UInt getMSLevel() const
Returns the MS level.
MSSpectrum(const std::initializer_list< Peak1D > &init)
Constructor from a list of Peak1D, e.g. MSSpectrum spec{ {mz1, int1}, {mz2, int2},...
RangeManagerContainer< RangeMZ, RangeIntensity, RangeMobility > RangeManagerContainerType
RangeManager.
Definition: MSSpectrum.h:92
const String & getName() const
Returns the name.
Iterator PosEnd(CoordinateType mz)
Binary search for peak range end (returns the past-the-end iterator)
bool isSorted(const Predicate &lambda) const
Definition: MSSpectrum.h:332
FloatDataArrays float_data_arrays_
Float data arrays.
Definition: MSSpectrum.h:633
ConstIterator getBasePeak() const
Iterator PosBegin(CoordinateType mz)
Binary search for peak range begin.
Size findNearest(CoordinateType mz) const
Binary search for the peak nearest to a specific m/z.
const FloatDataArrays & getFloatDataArrays() const
Returns a const reference to the float meta data arrays.
void setStringDataArrays(const StringDataArrays &sda)
Sets the string meta data arrays.
void sortByIonMobility()
Sorts the m/z peaks by their ion mobility value (and the accociated IM data arrays accordingly).
Int findHighestInWindow(CoordinateType mz, CoordinateType tolerance_left, CoordinateType tolerance_right) const
Search for the peak with highest intensity among the peaks near to a specific m/z given two +/- toler...
Iterator MZEnd(CoordinateType mz)
Binary search for peak range end (returns the past-the-end iterator)
const StringDataArrays & getStringDataArrays() const
Returns a const reference to the string meta data arrays.
MSSpectrum & operator=(const MSSpectrum &source)
Assignment operator.
double getDriftTime() const
Returns the ion mobility drift time (IMTypes::DRIFTTIME_NOT_SET means it is not set)
std::vector< FloatDataArray > FloatDataArrays
Definition: MSSpectrum.h:96
void updateRanges() override
OpenMS::DataArrays::IntegerDataArray IntegerDataArray
Integer data array vector type.
Definition: MSSpectrum.h:101
MSSpectrum & operator=(MSSpectrum &&) &=default
Move assignment operator.
void clear(bool clear_meta_data)
Clears all data and meta data.
void setDriftTime(double dt)
Sets the ion mobility drift time.
std::vector< IntegerDataArray > IntegerDataArrays
Definition: MSSpectrum.h:102
IntegerDataArrays & getIntegerDataArrays()
Returns a mutable reference to the integer meta data arrays.
RangeManager< RangeMZ, RangeIntensity, RangeMobility > RangeManagerType
Definition: MSSpectrum.h:93
void setRT(double rt)
Sets the absolute retention time (in seconds)
void setFloatDataArrays(const FloatDataArrays &fda)
Sets the float meta data arrays.
Int findNearest(CoordinateType mz, CoordinateType tolerance_left, CoordinateType tolerance_right) const
Search for the peak nearest to a specific m/z given two +/- tolerance windows in Th.
ConstIterator PosEnd(CoordinateType mz) const
Binary search for peak range end (returns the past-the-end iterator)
A 1-dimensional raw data point or peak.
Definition: Peak1D.h:28
double CoordinateType
Coordinate type.
Definition: Peak1D.h:40
float IntensityType
Intensity type.
Definition: Peak1D.h:36
Definition: RangeManager.h:871
Handles the management of a multidimensional range, e.g. RangeMZ and RangeIntensity for spectra.
Definition: RangeManager.h:550
Representation of 1D spectrum settings.
Definition: SpectrumSettings.h:39
SpectrumType getType() const
returns the spectrum type (centroided (PEAKS) or profile data (RAW))
SpectrumType
Spectrum peak type.
Definition: SpectrumSettings.h:45
A more convenient string class.
Definition: String.h:34
int Int
Signed integer type.
Definition: Types.h:72
unsigned int UInt
Unsigned integer type.
Definition: Types.h:64
size_t Size
Size type e.g. used as variable which can hold result of size()
Definition: Types.h:97
bool operator==(const IDBoostGraph::ProteinGroup &lhs, const IDBoostGraph::ProteinGroup &rhs)
static String & reverse(String &this_s)
Definition: StringUtilsSimple.h:330
Main OpenMS namespace.
Definition: openswathalgo/include/OpenMS/OPENSWATHALGO/DATAACCESS/ISpectrumAccess.h:19
Peak2D PeakType
Definition: MassTrace.h:21
std::ostream & operator<<(std::ostream &os, const AccurateMassSearchResult &amsr)
DriftTimeUnit
Drift time unit for ion mobility.
Definition: IMTypes.h:23
Used to remember what subsets in a spectrum are sorted already to allow faster sorting of the spectru...
Definition: MSSpectrum.h:58
Size end
not inclusive
Definition: MSSpectrum.h:60
bool is_sorted
are the Peaks in [start, end) sorted yet?
Definition: MSSpectrum.h:61
Size start
inclusive
Definition: MSSpectrum.h:59
Chunk(Size p_start, Size p_end, bool p_sorted)
Definition: MSSpectrum.h:62
Definition: MSSpectrum.h:67
std::vector< Chunk > chunks_
Definition: MSSpectrum.h:79
const MSSpectrum & spec_
Definition: MSSpectrum.h:80
std::vector< Chunk > & getChunks()
Definition: MSSpectrum.h:74
void add(bool is_sorted)
Definition: MSSpectrum.h:70
Chunks(const MSSpectrum &s)
Definition: MSSpectrum.h:69
Comparator for the ion mobility.
Definition: MSSpectrum.h:53
bool operator()(const MSSpectrum &a, const MSSpectrum &b) const
Comparator for the retention time.
Definition: MSSpectrum.h:49
bool operator()(const MSSpectrum &a, const MSSpectrum &b) const