1
// -*- mode: C++; tab-width: 2; -*-
4
// --------------------------------------------------------------------------
5
// OpenMS Mass Spectrometry Framework
6
// --------------------------------------------------------------------------
7
// Copyright (C) 2003-2011 -- Oliver Kohlbacher, Knut Reinert
9
// This library is free software; you can redistribute it and/or
10
// modify it under the terms of the GNU Lesser General Public
11
// License as published by the Free Software Foundation; either
12
// version 2.1 of the License, or (at your option) any later version.
14
// This library is distributed in the hope that it will be useful,
15
// but WITHOUT ANY WARRANTY; without even the implied warranty of
16
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17
// Lesser General Public License for more details.
19
// You should have received a copy of the GNU Lesser General Public
20
// License along with this library; if not, write to the Free Software
21
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
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-2013.
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.
23
30
// --------------------------------------------------------------------------
24
31
// $Maintainer: Andreas Bertsch $
39
46
@brief Estimates if the data of a spectrum is raw data or peak data
43
class OPENMS_DLLAPI PeakTypeEstimator
50
class OPENMS_DLLAPI PeakTypeEstimator
47
@brief Estimates the peak type of the peaks in the iterator range based on the variance of inter-peak distances
49
@note if there are fewer than 5 peaks in the iterator range SpectrumSettings::UNKOWN is returned
51
template <typename PeakConstIterator>
52
SpectrumSettings::SpectrumType estimateType(const PeakConstIterator& begin, const PeakConstIterator& end) const
54
const Size MAX_SAMPLED_DISTANCES = 1000;
55
const DoubleReal DISTANCE_VARIANCE_THRESHOLD = 0.5;
57
// abort if there are less than 5 peak in the iterator range
60
return SpectrumSettings::UNKNOWN;
65
std::vector<DoubleReal> distances;
67
PeakConstIterator peak(begin);
69
for(;peak->getIntensity() <= 0 && peak != end-2; ++peak) // 1st positive intensity
73
DoubleReal scnd_last_mz(peak->getMZ());
75
for(++peak;peak->getIntensity() <= 0 && peak != end-1; ++peak) // 2nd positive intensity
79
DoubleReal last_mz(peak->getMZ());
81
DoubleReal last_dist(last_mz - scnd_last_mz);
83
for(++peak; peak != end && count < MAX_SAMPLED_DISTANCES; ++peak) // max positive intensity
85
if(peak->getIntensity() > 0)
87
DoubleReal mz(peak->getMZ());
88
DoubleReal dist(mz - last_mz);
89
distances.push_back(std::min(last_dist, dist)); // min distances
91
scnd_last_mz = last_mz;
97
if (count < 4) // at least 4 distances for non-zero(!) intensity peaks
99
return SpectrumSettings::UNKNOWN;
102
DoubleReal mean( std::accumulate(distances.begin(), distances.end(), 0) / count); // sum/size
104
// calculate variance
105
DoubleReal variance(0);
106
for (std::vector<DoubleReal>::iterator value = distances.begin(); value != distances.end(); ++value)
108
DoubleReal delta = (*value - mean);
109
variance += delta * delta;
114
DoubleReal standard_deviation(std::sqrt(variance));
116
if (standard_deviation < DISTANCE_VARIANCE_THRESHOLD)
118
return SpectrumSettings::RAWDATA;
122
return SpectrumSettings::PEAKS;
54
@brief Estimates the peak type of the peaks in the iterator range based on the variance of inter-peak distances
56
@note if there are fewer than 5 peaks in the iterator range SpectrumSettings::UNKOWN is returned
58
template <typename PeakConstIterator>
59
SpectrumSettings::SpectrumType estimateType(const PeakConstIterator & begin, const PeakConstIterator & end) const
61
const Size MAX_SAMPLED_DISTANCES = 1000;
62
const DoubleReal DISTANCE_VARIANCE_THRESHOLD = 0.5;
64
// abort if there are less than 5 peak in the iterator range
67
return SpectrumSettings::UNKNOWN;
72
std::vector<DoubleReal> distances;
74
PeakConstIterator peak(begin);
76
for (; peak->getIntensity() <= 0 && peak != end - 2; ++peak) // 1st positive intensity
80
DoubleReal scnd_last_mz(peak->getMZ());
82
for (++peak; peak->getIntensity() <= 0 && peak != end - 1; ++peak) // 2nd positive intensity
86
DoubleReal last_mz(peak->getMZ());
88
DoubleReal last_dist(last_mz - scnd_last_mz);
90
for (++peak; peak != end && count < MAX_SAMPLED_DISTANCES; ++peak) // max positive intensity
92
if (peak->getIntensity() > 0)
94
DoubleReal mz(peak->getMZ());
95
DoubleReal dist(mz - last_mz);
96
distances.push_back(std::min(last_dist, dist)); // min distances
98
scnd_last_mz = last_mz;
104
if (count < 4) // at least 4 distances for non-zero(!) intensity peaks
106
return SpectrumSettings::UNKNOWN;
109
DoubleReal mean(std::accumulate(distances.begin(), distances.end(), 0) / count); // sum/size
111
// calculate variance
112
DoubleReal variance(0);
113
for (std::vector<DoubleReal>::iterator value = distances.begin(); value != distances.end(); ++value)
115
DoubleReal delta = (*value - mean);
116
variance += delta * delta;
118
variance /= count - 1;
121
DoubleReal standard_deviation(std::sqrt(variance));
123
if (standard_deviation < DISTANCE_VARIANCE_THRESHOLD)
125
return SpectrumSettings::RAWDATA;
129
return SpectrumSettings::PEAKS;
128
135
} // namespace OpenMS