ProteoWizard
UnimodTest.cpp
Go to the documentation of this file.
1//
2// $Id$
3//
4//
5// Original author: Matt Chambers <matt.chambers .@. vanderbilt.edu>
6//
7// Copyright 2011 Vanderbilt University - Nashville, TN 37232
8//
9// Licensed under the Apache License, Version 2.0 (the "License");
10// you may not use this file except in compliance with the License.
11// You may obtain a copy of the License at
12//
13// http://www.apache.org/licenses/LICENSE-2.0
14//
15// Unless required by applicable law or agreed to in writing, software
16// distributed under the License is distributed on an "AS IS" BASIS,
17// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18// See the License for the specific language governing permissions and
19// limitations under the License.
20//
21
22
25#include "Unimod.hpp"
26#include <cstring>
27
28
29using namespace pwiz::util;
30using namespace pwiz::cv;
31using namespace pwiz::chemistry;
32using namespace pwiz::data::unimod;
33using namespace boost::logic;
34
35
36ostream* os_ = 0;
37
38
39void test()
40{
41 if (os_) *os_ << "test()\n";
42
43 unit_assert_operator_equal(Site::Any, site('x'));
44 unit_assert_operator_equal(Site::Any, site('X'));
45 unit_assert_operator_equal(Site::NTerminus, site('n'));
46 unit_assert_operator_equal(Site::CTerminus, site('c'));
47 unit_assert_operator_equal(Site::Alanine, site('A'));
48 unit_assert_operator_equal(Site::Tyrosine, site('Y'));
49 unit_assert_operator_equal((Site::Asparagine | Site::AsparticAcid), site('B'));
50 unit_assert_operator_equal((Site::Glutamine | Site::GlutamicAcid), site('Z'));
51 unit_assert_throws_what(site('1'), invalid_argument, "[unimod::site] invalid symbol \"1\"");
52 unit_assert_throws_what(site('z'), invalid_argument, "[unimod::site] invalid symbol \"z\"");
53
54
55 unit_assert_operator_equal(Position::Anywhere, position());
58 unit_assert_throws_what(position(MS_matrix_assisted_laser_desorption_ionization), invalid_argument, "[unimod::position] invalid cvid \"MALDI\" (1000075)");
59
60
61 if (os_) *os_ << "Unimod entries: " << modifications().size() << endl;
62 unit_assert(modifications().size() > 500);
63
64
65 const Modification& acetyl = modification("Acetyl");
68 unit_assert_operator_equal("Acetyl", acetyl.name);
69 unit_assert(acetyl.approved);
70 unit_assert_operator_equal("C2H2O1", acetyl.deltaComposition.formula());
71 unit_assert_operator_equal(9, acetyl.specificities.size());
72
73 unit_assert_operator_equal(Site::Lysine, acetyl.specificities[0].site);
74 unit_assert_operator_equal(Position::Anywhere, acetyl.specificities[0].position);
75 unit_assert_operator_equal(false, acetyl.specificities[0].hidden);
76 unit_assert_operator_equal(Classification::Multiple, acetyl.specificities[0].classification);
77
78 unit_assert_operator_equal(Site::NTerminus, acetyl.specificities[1].site);
79 unit_assert_operator_equal(Position::AnyNTerminus, acetyl.specificities[1].position);
80 unit_assert_operator_equal(false, acetyl.specificities[1].hidden);
81 unit_assert_operator_equal(Classification::Multiple, acetyl.specificities[1].classification);
82
83 unit_assert_operator_equal(Site::Cysteine, acetyl.specificities[2].site);
84 unit_assert_operator_equal(Position::Anywhere, acetyl.specificities[2].position);
85 unit_assert_operator_equal(true, acetyl.specificities[2].hidden);
86 unit_assert_operator_equal(Classification::PostTranslational, acetyl.specificities[2].classification);
87
88 unit_assert_operator_equal(Site::NTerminus, acetyl.specificities[4].site);
89 unit_assert_operator_equal(Position::ProteinNTerminus, acetyl.specificities[4].position);
90 unit_assert_operator_equal(false, acetyl.specificities[4].hidden);
91 unit_assert_operator_equal(Classification::PostTranslational, acetyl.specificities[4].classification);
92
93 unit_assert_operator_equal(UNIMOD_Acetyl, modifications(acetyl.deltaMonoisotopicMass(), 0)[0].cvid);
94 unit_assert_operator_equal(UNIMOD_Acetyl, modifications(acetyl.deltaAverageMass(), 0, false)[0].cvid);
95
96 // test a position-only filter
97 unit_assert_operator_equal(1, modifications(acetyl.deltaMonoisotopicMass(), 0.0001,
98 indeterminate, indeterminate,
99 Site::Any, Position::AnyNTerminus).size());
100 unit_assert_operator_equal(UNIMOD_Acetyl, modifications(acetyl.deltaMonoisotopicMass(), 0.5,
101 indeterminate, indeterminate,
102 Site::Any, Position::AnyNTerminus)[0].cvid);
103
104
105 const Modification& hse = modification("Met->Hse");
107 unit_assert_operator_equal("Met->Hse", hse.name);
108 unit_assert(hse.approved);
109 unit_assert_operator_equal("C-1H-2O1S-1", hse.deltaComposition.formula());
110 unit_assert_operator_equal(Site::Methionine, hse.specificities[0].site);
111 unit_assert_operator_equal(Position::AnyCTerminus, hse.specificities[0].position);
112 unit_assert_operator_equal(false, hse.specificities[0].hidden);
113 unit_assert_operator_equal(Classification::ChemicalDerivative, hse.specificities[0].classification);
114
115
116 const Modification& oxidation = modification(UNIMOD_Oxidation);
117
118 // 3 mods have the same mass as oxidation
119 unit_assert_operator_equal(3, modifications(oxidation.deltaMonoisotopicMass(), 0, true, indeterminate).size());
120 unit_assert_operator_equal(3, modifications(oxidation.deltaAverageMass(), 0, false, indeterminate).size());
121
122 // only one of those mods happen on Methionine
123 unit_assert_operator_equal(1, modifications(oxidation.deltaMonoisotopicMass(), 0, true, indeterminate, Site::Methionine).size());
124 unit_assert_operator_equal(1, modifications(oxidation.deltaAverageMass(), 0, false, indeterminate, Site::Methionine).size());
125
126 // oxidation also happens on Proline (test multi-bit Site mask)
127 unit_assert_operator_equal(1, modifications(oxidation.deltaAverageMass(), 0, false, indeterminate, Site::Methionine | Site::Proline).size());
128
129 // add Alanine as a site and it could be a substitution
130 unit_assert_operator_equal(2, modifications(oxidation.deltaAverageMass(), 0, false, indeterminate, Site::Methionine | Site::Alanine).size());
131
132
133 // 19 mods are 28 +/- 1
134 unit_assert_operator_equal(19, modifications(28, 1, true, indeterminate).size());
135
136 // only two of those mods happen post-translationally on protein N-termini
137 unit_assert_operator_equal(2, modifications(28, 1, true, indeterminate, Site::Any,
138 Position::ProteinNTerminus,
139 Classification::PostTranslational).size());
140
141
142 const Modification& phospho = modification(UNIMOD_Phospho);
143
144 // phospho on S and T are grouped (property names are duplicated)
145 unit_assert_operator_equal(UNIMOD_Phospho, modifications(phospho.deltaMonoisotopicMass(), 0, true, true, Site::Serine)[0].cvid);
146 unit_assert_operator_equal(UNIMOD_Phospho, modifications(phospho.deltaMonoisotopicMass(), 0, true, true, Site::Threonine)[0].cvid);
147 unit_assert_operator_equal(UNIMOD_Phospho, modifications(phospho.deltaMonoisotopicMass(), 0, true, true, Site::Tyrosine)[0].cvid);
148
149 // test multi-bit Site mask
150 unit_assert_operator_equal(UNIMOD_Phospho, modifications(phospho.deltaMonoisotopicMass(), 0, true, true, Site::Serine | Site::Tyrosine)[0].cvid);
151
152 // there are no unapproved mods at phospho's mass
153 unit_assert_operator_equal(0, modifications(phospho.deltaMonoisotopicMass(), 0, true, false).size());
154
155 // phospho and sulfo are only distinguishable with PPM mass accuracy
156 double mass_2000Da_1ppm = 2000 - (2000 - MZTolerance(1, MZTolerance::PPM));
157 unit_assert_operator_equal(2, modifications(phospho.deltaMonoisotopicMass(), 0.5, true, true, Site::Serine).size());
158 unit_assert_operator_equal(1, modifications(phospho.deltaMonoisotopicMass(), mass_2000Da_1ppm, true, true, Site::Serine).size());
159
160 // test indeterminate and average mass
161 unit_assert_operator_equal(2, modifications(phospho.deltaMonoisotopicMass(), 0.1, indeterminate, true, Site::Serine).size());
162 unit_assert_operator_equal(2, modifications(phospho.deltaAverageMass(), 0.1, indeterminate, true, Site::Serine).size());
163 unit_assert_operator_equal(2, modifications(phospho.deltaAverageMass(), 0.1, false, true, Site::Serine).size());
164
165 // test negative mass
167 mass_2000Da_1ppm,
168 true, true,
169 Site::Glutamine,
170 Position::AnyNTerminus)[0].cvid);
171
172
173 // at 14.5 +/- 0.5 there are 3 approved mods and 6 unapproved
174 unit_assert_operator_equal(3, modifications(14.5, 0.5, true, true).size());
175 unit_assert_operator_equal(9, modifications(14.5, 0.5, true, false).size());
176
177 // all 9 unapproved mods are hidden
178 unit_assert_operator_equal(0, modifications(14.5, 0.5, true, false, Site::Any,
179 Position::Anywhere, Classification::Any, false).size());
180
181 // test ambiguous residue; this mod could be a Q->P substitution
182 unit_assert_operator_equal(1, modifications(-31, 0.01, true, indeterminate, site('Z')).size());
183}
184
185
186int main(int argc, char* argv[])
187{
188 TEST_PROLOG(argc, argv)
189
190 try
191 {
192 if (argc>1 && !strcmp(argv[1],"-v")) os_ = &cout;
193 test();
194 }
195 catch (exception& e)
196 {
197 TEST_FAILED(e.what())
198 }
199 catch (...)
200 {
201 TEST_FAILED("Caught unknown exception.")
202 }
203
205}
206
int main(int argc, char *argv[])
ostream * os_
void test()
represents a post-translational modification (PTM) modification formula or masses must be provided at...
const chemistry::Formula & formula() const
returns the difference formula; throws runtime_error if hasFormula() = false
UNIMOD_Phospho
Phospho: Phosphorylation.
Definition cv.hpp:9417
UNIMOD_Oxidation
Oxidation: Oxidation or Hydroxylation.
Definition cv.hpp:9450
MS_matrix_assisted_laser_desorption_ionization
matrix-assisted laser desorption ionization: The formation of gas-phase ions from molecules that are ...
Definition cv.hpp:519
UNIMOD_Gln__pyro_Glu
Gln->pyro-Glu: Pyro-glu from Q.
Definition cv.hpp:9435
UNIMOD_Acetyl
Acetyl: Acetylation.
Definition cv.hpp:9372
MS_modification_specificity_peptide_N_term
modification specificity peptide N-term: As parameter for search engine: apply the modification only ...
Definition cv.hpp:4002
MS_modification_specificity_peptide_C_term
modification specificity peptide C-term: As parameter for search engine: apply the modification only ...
Definition cv.hpp:4005
UNIMOD_Met__Hse
Met->Hse: Homoserine.
Definition cv.hpp:9399
PWIZ_API_DECL Site site(char symbol)
returns the Site given a one-letter residue code, or: 'x' for Site::Any, 'n' for Site::NTerminus,...
PWIZ_API_DECL const std::vector< Modification > & modifications()
the entire list of Unimod modifications
PWIZ_API_DECL Position position(CVID cvid=CVID_Unknown)
returns a Position corresponding to one of the following CVIDs: CVID_Unknown: Position::Anywhere MS_m...
PWIZ_API_DECL const Modification & modification(CVID cvid)
find a modification by CVID
struct for expressing m/z tolerance in either amu or ppm
#define unit_assert(x)
Definition unit.hpp:85
#define TEST_EPILOG
Definition unit.hpp:183
#define TEST_FAILED(x)
Definition unit.hpp:177
#define unit_assert_operator_equal(expected, actual)
Definition unit.hpp:92
#define unit_assert_throws_what(x, exception, whatStr)
Definition unit.hpp:119
#define TEST_PROLOG(argc, argv)
Definition unit.hpp:175