~ubuntu-branches/ubuntu/wily/openms/wily

« back to all changes in this revision

Viewing changes to include/OpenMS/FORMAT/PeakTypeEstimator.h

  • Committer: Package Import Robot
  • Author(s): Filippo Rusconi
  • Date: 2013-12-20 11:30:16 UTC
  • mfrom: (5.1.2 sid)
  • Revision ID: package-import@ubuntu.com-20131220113016-wre5g9bteeheq6he
Tags: 1.11.1-3
* remove version number from libbost development package names;
* ensure that AUTHORS is correctly shipped in all packages.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
// -*- mode: C++; tab-width: 2; -*-
2
 
// vi: set ts=2:
3
 
//
4
 
// --------------------------------------------------------------------------
5
 
//                   OpenMS Mass Spectrometry Framework
6
 
// --------------------------------------------------------------------------
7
 
//  Copyright (C) 2003-2011 -- Oliver Kohlbacher, Knut Reinert
8
 
//
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.
13
 
//
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.
18
 
//
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.
 
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.
22
29
//
23
30
// --------------------------------------------------------------------------
24
31
// $Maintainer: Andreas Bertsch $
37
44
{
38
45
/**
39
46
  @brief Estimates if the data of a spectrum is raw data or peak data
40
 
  
 
47
 
41
48
   @ingroup Format
42
49
 */
43
 
class OPENMS_DLLAPI PeakTypeEstimator
44
 
{
 
50
  class OPENMS_DLLAPI PeakTypeEstimator
 
51
  {
45
52
public:
46
 
  /**
47
 
      @brief Estimates the peak type of the peaks in the iterator range based on the variance of inter-peak distances
48
 
 
49
 
      @note if there are fewer than 5 peaks in the iterator range SpectrumSettings::UNKOWN is returned
50
 
     */
51
 
  template <typename PeakConstIterator>
52
 
  SpectrumSettings::SpectrumType estimateType(const PeakConstIterator& begin, const PeakConstIterator& end) const
53
 
  {
54
 
    const Size MAX_SAMPLED_DISTANCES = 1000;
55
 
    const DoubleReal DISTANCE_VARIANCE_THRESHOLD = 0.5;
56
 
 
57
 
    // abort if there are less than 5 peak in the iterator range
58
 
    if (end - begin < 5)
59
 
    {
60
 
      return SpectrumSettings::UNKNOWN;
61
 
    }
62
 
 
63
 
    DoubleReal count(0);
64
 
 
65
 
    std::vector<DoubleReal> distances;
66
 
 
67
 
    PeakConstIterator peak(begin);
68
 
 
69
 
    for(;peak->getIntensity() <= 0 && peak != end-2; ++peak)        // 1st positive intensity
70
 
    {
71
 
    }
72
 
 
73
 
    DoubleReal scnd_last_mz(peak->getMZ());
74
 
 
75
 
    for(++peak;peak->getIntensity() <= 0 && peak != end-1; ++peak)  // 2nd positive intensity
76
 
    {
77
 
    }
78
 
 
79
 
    DoubleReal last_mz(peak->getMZ());
80
 
 
81
 
    DoubleReal last_dist(last_mz - scnd_last_mz);
82
 
 
83
 
    for(++peak; peak != end && count < MAX_SAMPLED_DISTANCES; ++peak)  // max  positive intensity
84
 
    {
85
 
      if(peak->getIntensity() > 0)
86
 
      {
87
 
        DoubleReal mz(peak->getMZ());
88
 
        DoubleReal dist(mz - last_mz);
89
 
        distances.push_back(std::min(last_dist, dist));  // min distances
90
 
        ++count;
91
 
        scnd_last_mz = last_mz;
92
 
        last_mz = mz;
93
 
        last_dist = dist;
94
 
      }
95
 
    }
96
 
 
97
 
    if (count < 4) // at least 4 distances for non-zero(!) intensity peaks
98
 
    {
99
 
      return SpectrumSettings::UNKNOWN;
100
 
    }
101
 
 
102
 
    DoubleReal mean( std::accumulate(distances.begin(), distances.end(), 0) / count); // sum/size
103
 
 
104
 
    // calculate variance
105
 
    DoubleReal variance(0);
106
 
    for (std::vector<DoubleReal>::iterator value = distances.begin(); value != distances.end(); ++value)
107
 
    {
108
 
      DoubleReal delta = (*value - mean);
109
 
      variance += delta * delta;
110
 
    }
111
 
    variance /= count-1;
112
 
 
113
 
    // calculate stdev
114
 
    DoubleReal standard_deviation(std::sqrt(variance));
115
 
 
116
 
    if (standard_deviation < DISTANCE_VARIANCE_THRESHOLD)
117
 
    {
118
 
      return SpectrumSettings::RAWDATA;
119
 
    }
120
 
    else
121
 
    {
122
 
      return SpectrumSettings::PEAKS;
123
 
    }
124
 
  }
125
 
 
126
 
};
 
53
    /**
 
54
        @brief Estimates the peak type of the peaks in the iterator range based on the variance of inter-peak distances
 
55
 
 
56
        @note if there are fewer than 5 peaks in the iterator range SpectrumSettings::UNKOWN is returned
 
57
       */
 
58
    template <typename PeakConstIterator>
 
59
    SpectrumSettings::SpectrumType estimateType(const PeakConstIterator & begin, const PeakConstIterator & end) const
 
60
    {
 
61
      const Size MAX_SAMPLED_DISTANCES = 1000;
 
62
      const DoubleReal DISTANCE_VARIANCE_THRESHOLD = 0.5;
 
63
 
 
64
      // abort if there are less than 5 peak in the iterator range
 
65
      if (end - begin < 5)
 
66
      {
 
67
        return SpectrumSettings::UNKNOWN;
 
68
      }
 
69
 
 
70
      DoubleReal count(0);
 
71
 
 
72
      std::vector<DoubleReal> distances;
 
73
 
 
74
      PeakConstIterator peak(begin);
 
75
 
 
76
      for (; peak->getIntensity() <= 0 && peak != end - 2; ++peak)  // 1st positive intensity
 
77
      {
 
78
      }
 
79
 
 
80
      DoubleReal scnd_last_mz(peak->getMZ());
 
81
 
 
82
      for (++peak; peak->getIntensity() <= 0 && peak != end - 1; ++peak) // 2nd positive intensity
 
83
      {
 
84
      }
 
85
 
 
86
      DoubleReal last_mz(peak->getMZ());
 
87
 
 
88
      DoubleReal last_dist(last_mz - scnd_last_mz);
 
89
 
 
90
      for (++peak; peak != end && count < MAX_SAMPLED_DISTANCES; ++peak) // max  positive intensity
 
91
      {
 
92
        if (peak->getIntensity() > 0)
 
93
        {
 
94
          DoubleReal mz(peak->getMZ());
 
95
          DoubleReal dist(mz - last_mz);
 
96
          distances.push_back(std::min(last_dist, dist)); // min distances
 
97
          ++count;
 
98
          scnd_last_mz = last_mz;
 
99
          last_mz = mz;
 
100
          last_dist = dist;
 
101
        }
 
102
      }
 
103
 
 
104
      if (count < 4) // at least 4 distances for non-zero(!) intensity peaks
 
105
      {
 
106
        return SpectrumSettings::UNKNOWN;
 
107
      }
 
108
 
 
109
      DoubleReal mean(std::accumulate(distances.begin(), distances.end(), 0) / count); // sum/size
 
110
 
 
111
      // calculate variance
 
112
      DoubleReal variance(0);
 
113
      for (std::vector<DoubleReal>::iterator value = distances.begin(); value != distances.end(); ++value)
 
114
      {
 
115
        DoubleReal delta = (*value - mean);
 
116
        variance += delta * delta;
 
117
      }
 
118
      variance /= count - 1;
 
119
 
 
120
      // calculate stdev
 
121
      DoubleReal standard_deviation(std::sqrt(variance));
 
122
 
 
123
      if (standard_deviation < DISTANCE_VARIANCE_THRESHOLD)
 
124
      {
 
125
        return SpectrumSettings::RAWDATA;
 
126
      }
 
127
      else
 
128
      {
 
129
        return SpectrumSettings::PEAKS;
 
130
      }
 
131
    }
 
132
 
 
133
  };
127
134
 
128
135
} // namespace OpenMS
129
136