OpenMS  2.7.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-2021.
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>
44 
45 namespace OpenMS
46 {
47  class Peak1D;
48  enum class DriftTimeUnit;
67  class OPENMS_DLLAPI MSSpectrum :
68  private std::vector<Peak1D>,
69  public RangeManager<1>,
70  public SpectrumSettings
71  {
72 public:
73 
75  struct OPENMS_DLLAPI RTLess
76  {
77  bool operator()(const MSSpectrum& a, const MSSpectrum& b) const;
78  };
79 
81  struct Chunk {
84  bool is_sorted;
85  Chunk(Size start, Size end, bool sorted) : start(start), end(end), is_sorted(sorted) {}
86  };
87 
88  struct Chunks {
89  public:
90  Chunks(const MSSpectrum& s) : spec_(s) {}
91  void add(bool is_sorted)
92  {
93  chunks_.emplace_back((chunks_.empty() ? 0 : chunks_.back().end), spec_.size(), is_sorted);
94  }
95  std::vector<Chunk>& getChunks()
96  {
97  return chunks_;
98  }
99  private:
100  std::vector<Chunk> chunks_;
102  };
103 
105 
106  typedef OpenMS::Peak1D PeakType;
111  typedef std::vector<PeakType> ContainerType;
114  typedef std::vector<FloatDataArray> FloatDataArrays;
117  typedef std::vector<StringDataArray> StringDataArrays;
120  typedef std::vector<IntegerDataArray> IntegerDataArrays;
122 
124 
125  typedef typename ContainerType::iterator Iterator;
128  typedef typename ContainerType::const_iterator ConstIterator;
130  typedef typename ContainerType::reverse_iterator ReverseIterator;
132  typedef typename ContainerType::const_reverse_iterator ConstReverseIterator;
134 
136 
137  using ContainerType::operator[];
138  using ContainerType::begin;
139  using ContainerType::rbegin;
140  using ContainerType::end;
141  using ContainerType::rend;
142  using ContainerType::resize;
143  using ContainerType::size;
144  using ContainerType::push_back;
145  using ContainerType::emplace_back;
146  using ContainerType::pop_back;
147  using ContainerType::empty;
148  using ContainerType::front;
149  using ContainerType::back;
150  using ContainerType::reserve;
151  using ContainerType::insert;
152  using ContainerType::erase;
153  using ContainerType::swap;
154 
155  using typename ContainerType::iterator;
156  using typename ContainerType::const_iterator;
157  using typename ContainerType::size_type;
158  using typename ContainerType::value_type;
159  using typename ContainerType::reference;
160  using typename ContainerType::const_reference;
161  using typename ContainerType::pointer;
162  using typename ContainerType::difference_type;
163 
165 
166 
169 
171  MSSpectrum(const MSSpectrum& source);
172 
174  MSSpectrum(MSSpectrum&&) = default;
175 
177  ~MSSpectrum() override
178  {}
179 
181  MSSpectrum& operator=(const MSSpectrum& source);
182 
184  MSSpectrum& operator=(MSSpectrum&&) & = default;
185 
188 
190  bool operator==(const MSSpectrum& rhs) const;
191 
193  bool operator!=(const MSSpectrum& rhs) const
194  {
195  return !(operator==(rhs));
196  }
197 
198  // Docu in base class (RangeManager)
199  void updateRanges() override;
200 
204  double getRT() const;
205 
207  void setRT(double rt);
208 
217  double getDriftTime() const;
218 
222  void setDriftTime(double dt);
223 
228 
231 
236 
242  UInt getMSLevel() const;
243 
245  void setMSLevel(UInt ms_level);
246 
248  const String& getName() const;
249 
251  void setName(const String& name);
252 
254 
270 
273  {
274  return float_data_arrays_;
275  }
276 
279 
282 
285 
288 
291 
294 
298 
300 
301 
306  void sortByIntensity(bool reverse = false);
307 
314 
319  void sortByPositionPresorted(const std::vector<Chunk>& chunks);
320 
322  bool isSorted() const;
323 
328  template<class Predicate>
329  bool isSorted(const Predicate& lambda) const
330  {
331  auto value_2_index_wrapper = [this, &lambda](const value_type& value1, const value_type& value2) {
332  // translate values into indices (this relies on no copies being made!)
333  const Size index1 = (&value1) - (&this->front());
334  const Size index2 = (&value2) - (&this->front());
335  // just make sure the pointers above are actually pointing to a Peak inside our container
336  assert(index1 < this->size());
337  assert(index2 < this->size());
338  return lambda(index1, index2);
339  };
340  return std::is_sorted(this->begin(), this->end(), value_2_index_wrapper);
341  }
342 
347  template<class Predicate>
348  void sort(const Predicate& lambda)
349  {
350  std::vector<Size> indices(this->size());
351  std::iota(indices.begin(), indices.end(), 0);
352  std::stable_sort(indices.begin(), indices.end(), lambda);
353  select(indices);
354  }
355 
357 
360 
371 
384 
398  Int findNearest(CoordinateType mz, CoordinateType tolerance_left, CoordinateType tolerance_right) const;
399 
411  Int findHighestInWindow(CoordinateType mz, CoordinateType tolerance_left, CoordinateType tolerance_right) const;
412 
419 
426 
433 
440 
447 
454 
461 
468 
477 
486 
495 
504 
513 
522 
531 
540 
543  bool containsIMData() const;
544 
552  std::pair<Size, DriftTimeUnit> getIMData() const;
553 
555 
556 
562  void clear(bool clear_meta_data);
563 
564  /*
565  @brief Select a (subset of) spectrum and its data_arrays, only retaining the indices given in @p indices
566 
567  @param indices Vector of indices to keep
568  @return Reference to this MSSpectrum
569 
570  */
571  MSSpectrum& select(const std::vector<Size>& indices);
572 
573 
584  SpectrumSettings::SpectrumType getType(const bool query_data) const;
585  using SpectrumSettings::getType; // expose base class function
586 
590 
594 
597 
598 protected:
601 
603  double drift_time_;
604 
607 
610 
613 
616 
619 
622  };
623 
624  inline std::ostream& operator<<(std::ostream& os, const MSSpectrum& spec)
625  {
626  os << "-- MSSPECTRUM BEGIN --" << std::endl;
627 
628  // spectrum settings
629  os << static_cast<const SpectrumSettings&>(spec);
630 
631  // peaklist
632  for (MSSpectrum::ConstIterator it = spec.begin(); it != spec.end(); ++it)
633  {
634  os << *it << std::endl;
635  }
636 
637  os << "-- MSSPECTRUM END --" << std::endl;
638  return os;
639  }
640 
641 } // namespace OpenMS
Float data array class.
Definition: DataArrays.h:48
Integer data array class.
Definition: DataArrays.h:55
String data array class.
Definition: DataArrays.h:62
The representation of a 1D spectrum.
Definition: MSSpectrum.h:71
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:272
UInt ms_level_
MS level.
Definition: MSSpectrum.h:609
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:109
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:117
OpenMS::DataArrays::FloatDataArray FloatDataArray
Float data array vector type.
Definition: MSSpectrum.h:113
bool operator!=(const MSSpectrum &rhs) const
Equality operator.
Definition: MSSpectrum.h:193
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:612
ContainerType::const_iterator ConstIterator
Non-mutable iterator.
Definition: MSSpectrum.h:128
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:130
ConstIterator PosBegin(ConstIterator begin, CoordinateType mz, ConstIterator end) const
Binary search for peak range begin.
double drift_time_
Drift time.
Definition: MSSpectrum.h:603
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:111
ContainerType::const_reverse_iterator ConstReverseIterator
Non-mutable reverse iterator.
Definition: MSSpectrum.h:132
bool isSorted() const
Checks if all peaks are sorted with respect to ascending m/z.
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:618
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:621
void sort(const Predicate &lambda)
Definition: MSSpectrum.h:348
OpenMS::DataArrays::StringDataArray StringDataArray
String data array vector type.
Definition: MSSpectrum.h:116
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.
double retention_time_
Retention time.
Definition: MSSpectrum.h:600
PeakType::IntensityType calculateTIC() const
compute the total ion count (sum of all peak intensities)
UInt getMSLevel() const
Returns the MS level.
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:329
FloatDataArrays float_data_arrays_
Float data arrays.
Definition: MSSpectrum.h:615
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.
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 (MSSpectrum::DRIFTTIME_NOT_SET means it is not set)
std::vector< FloatDataArray > FloatDataArrays
Definition: MSSpectrum.h:114
void updateRanges() override
Updates minimum and maximum position/intensity.
OpenMS::DataArrays::IntegerDataArray IntegerDataArray
Integer data array vector type.
Definition: MSSpectrum.h:119
DriftTimeUnit drift_time_unit_
Drift time unit.
Definition: MSSpectrum.h:606
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:120
IntegerDataArrays & getIntegerDataArrays()
Returns a mutable reference to the integer meta data arrays.
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)
~MSSpectrum() override
Destructor.
Definition: MSSpectrum.h:177
A 1-dimensional raw data point or peak.
Definition: Peak1D.h:54
float IntensityType
Intensity type.
Definition: Peak1D.h:62
double CoordinateType
Coordinate type.
Definition: Peak1D.h:66
Handles the management of a position and intensity range.
Definition: RangeManager.h:48
Representation of 1D spectrum settings.
Definition: SpectrumSettings.h:65
SpectrumType getType() const
returns the spectrum type (centroided (PEAKS) or profile data (RAW))
SpectrumType
Spectrum peak type.
Definition: SpectrumSettings.h:71
A more convenient string class.
Definition: String.h:61
int Int
Signed integer type.
Definition: Types.h:102
unsigned int UInt
Unsigned integer type.
Definition: Types.h:94
size_t Size
Size type e.g. used as variable which can hold result of size()
Definition: Types.h:127
bool operator==(const IDBoostGraph::ProteinGroup &lhs, const IDBoostGraph::ProteinGroup &rhs)
Main OpenMS namespace.
Definition: FeatureDeconvolution.h:47
Peak2D PeakType
Definition: MassTrace.h:47
std::ostream & operator<<(std::ostream &os, const AccurateMassSearchResult &amsr)
DriftTimeUnit
Drift time unit for ion mobility.
Definition: IMTypes.h:46
Used to remember what subsets in a spectrum are sorted already to allow faster sorting of the spectru...
Definition: MSSpectrum.h:81
Chunk(Size start, Size end, bool sorted)
Definition: MSSpectrum.h:85
Size end
not inclusive
Definition: MSSpectrum.h:83
bool is_sorted
are the Peaks in [start, end) sorted yet?
Definition: MSSpectrum.h:84
Size start
inclusive
Definition: MSSpectrum.h:82
Definition: MSSpectrum.h:88
std::vector< Chunk > chunks_
Definition: MSSpectrum.h:100
const MSSpectrum & spec_
Definition: MSSpectrum.h:101
std::vector< Chunk > & getChunks()
Definition: MSSpectrum.h:95
void add(bool is_sorted)
Definition: MSSpectrum.h:91
Chunks(const MSSpectrum &s)
Definition: MSSpectrum.h:90
Comparator for the retention time.
Definition: MSSpectrum.h:76
bool operator()(const MSSpectrum &a, const MSSpectrum &b) const