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

« back to all changes in this revision

Viewing changes to include/OpenMS/FILTERING/TRANSFORMERS/IsotopeMarker.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 $
40
47
{
41
48
 
42
49
  /**
43
 
          @brief IsotopeMarker marks peak pairs which could represent an ion and its isotope
44
 
 
45
 
                @todo implement a real isotope marking here with isotopedistributions and fitting (Andreas)
46
 
 
47
 
                @htmlinclude OpenMS_IsotopeMarker.parameters
48
 
 
49
 
                @ingroup PeakMarker
 
50
      @brief IsotopeMarker marks peak pairs which could represent an ion and its isotope
 
51
 
 
52
        @todo implement a real isotope marking here with isotopedistributions and fitting (Andreas)
 
53
 
 
54
        @htmlinclude OpenMS_IsotopeMarker.parameters
 
55
 
 
56
        @ingroup PeakMarker
50
57
  */
51
 
  class OPENMS_DLLAPI IsotopeMarker
52
 
    : public PeakMarker
 
58
  class OPENMS_DLLAPI IsotopeMarker :
 
59
    public PeakMarker
53
60
  {
54
 
  public:
 
61
public:
55
62
 
56
 
                // @name Constructors and Destructors
57
 
                // @{
 
63
    // @name Constructors and Destructors
 
64
    // @{
58
65
    /// default constructor
59
66
    IsotopeMarker();
60
67
 
61
68
    /// copy constructor
62
 
    IsotopeMarker(const IsotopeMarker& source);
 
69
    IsotopeMarker(const IsotopeMarker & source);
63
70
 
64
71
    /// destructor
65
72
    virtual ~IsotopeMarker();
66
 
                // @}
 
73
    // @}
67
74
 
68
 
                // @name Operators
69
 
                // @{
 
75
    // @name Operators
 
76
    // @{
70
77
    /// assignment operator
71
 
    IsotopeMarker& operator=(const IsotopeMarker& source);
72
 
                // @}
73
 
 
74
 
                // @name Accessors
75
 
                // @{
76
 
                ///
77
 
    static PeakMarker* create() { return new IsotopeMarker();}
78
 
 
79
 
                ///
80
 
                template <typename SpectrumType> void apply(std::map<double, bool>& marked, SpectrumType& spectrum)
81
 
                {
82
 
                        double mzvariation = (double)param_.getValue("mz_variation");
83
 
        double invariation = (double)param_.getValue("in_variation");
84
 
        Size marks = param_.getValue("marks");
85
 
                        
86
 
        spectrum.sortByPosition();
87
 
                        
88
 
                        std::map<double, Size> isotopemarks ; // possible isotopes
89
 
                        
90
 
        for (Size i = 0; i < spectrum.size(); ++i)
91
 
        {
92
 
        double mz = spectrum[i].getPosition()[0];
93
 
        double intensity = spectrum[i].getIntensity();
94
 
        Size j = i+1;
95
 
 
96
 
        //std::vector<std::pair<double, double> > isotopes = SpectrumGenerator::instance()->isotopepeaks(mz, intensity);
97
 
                                IsotopeDistribution id;
98
 
                                id.estimateFromPeptideWeight(mz);
99
 
 
100
 
        while (j < spectrum.size() && spectrum[j].getPosition()[0] <= mz + 3 + mzvariation)
101
 
        {
102
 
                double curmz = spectrum[j].getPosition()[0];
103
 
                double curIntensity = spectrum[j].getIntensity();
104
 
                UInt iso = (UInt)(curmz - mz + 0.499999);
105
 
                if (iso > 0 && curmz - mz - iso > mzvariation)
106
 
                {
107
 
                ++j;
108
 
                continue;
109
 
                }
110
 
                if (std::fabs(id.begin()->second * intensity - curIntensity) < invariation * id.begin()->second * intensity)
111
 
                {
112
 
                isotopemarks[mz]++;
113
 
                  isotopemarks[curmz]++;
114
 
                }
115
 
                ++j;
116
 
        }
117
 
        }
118
 
                        
119
 
        for (std::map<double, Size>::const_iterator cmit = isotopemarks.begin(); cmit != isotopemarks.end(); ++cmit)
120
 
        {
121
 
        if (cmit->second >= marks)
122
 
        {
123
 
                marked.insert(std::make_pair<double, bool>(cmit->first, true));
124
 
        }
125
 
        }
126
 
        return;
127
 
                }
128
 
 
129
 
                ///
130
 
                static const String getProductName()
131
 
                {
132
 
                        return "IsotopeMarker";
133
 
                }
134
 
                // @}
135
 
                
 
78
    IsotopeMarker & operator=(const IsotopeMarker & source);
 
79
    // @}
 
80
 
 
81
    // @name Accessors
 
82
    // @{
 
83
    ///
 
84
    static PeakMarker * create() { return new IsotopeMarker(); }
 
85
 
 
86
    ///
 
87
    template <typename SpectrumType>
 
88
    void apply(std::map<double, bool> & marked, SpectrumType & spectrum)
 
89
    {
 
90
      double mzvariation = (double)param_.getValue("mz_variation");
 
91
      double invariation = (double)param_.getValue("in_variation");
 
92
      Size marks = param_.getValue("marks");
 
93
 
 
94
      spectrum.sortByPosition();
 
95
 
 
96
      std::map<double, Size> isotopemarks;        // possible isotopes
 
97
 
 
98
      for (Size i = 0; i < spectrum.size(); ++i)
 
99
      {
 
100
        double mz = spectrum[i].getPosition()[0];
 
101
        double intensity = spectrum[i].getIntensity();
 
102
        Size j = i + 1;
 
103
 
 
104
        //std::vector<std::pair<double, double> > isotopes = SpectrumGenerator::instance()->isotopepeaks(mz, intensity);
 
105
        IsotopeDistribution id;
 
106
        id.estimateFromPeptideWeight(mz);
 
107
 
 
108
        while (j < spectrum.size() && spectrum[j].getPosition()[0] <= mz + 3 + mzvariation)
 
109
        {
 
110
          double curmz = spectrum[j].getPosition()[0];
 
111
          double curIntensity = spectrum[j].getIntensity();
 
112
          UInt iso = (UInt)(curmz - mz + 0.499999);
 
113
          if (iso > 0 && curmz - mz - iso > mzvariation)
 
114
          {
 
115
            ++j;
 
116
            continue;
 
117
          }
 
118
          if (std::fabs(id.begin()->second * intensity - curIntensity) < invariation * id.begin()->second * intensity)
 
119
          {
 
120
            isotopemarks[mz]++;
 
121
            isotopemarks[curmz]++;
 
122
          }
 
123
          ++j;
 
124
        }
 
125
      }
 
126
 
 
127
      for (std::map<double, Size>::const_iterator cmit = isotopemarks.begin(); cmit != isotopemarks.end(); ++cmit)
 
128
      {
 
129
        if (cmit->second >= marks)
 
130
        {
 
131
          marked.insert(std::pair<double, bool>(cmit->first, true));
 
132
        }
 
133
      }
 
134
      return;
 
135
    }
 
136
 
 
137
    ///
 
138
    static const String getProductName()
 
139
    {
 
140
      return "IsotopeMarker";
 
141
    }
 
142
 
 
143
    // @}
 
144
 
136
145
  };
137
146
 
138
147
}