ProteoWizard
UnimodTest.cpp
Go to the documentation of this file.
1 //
2 // $Id: UnimodTest.cpp 4129 2012-11-20 00:05:37Z chambm $
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 
29 using namespace pwiz::util;
30 using namespace pwiz::cv;
31 using namespace pwiz::chemistry;
32 using namespace pwiz::data::unimod;
33 using namespace boost::logic;
34 
35 
36 ostream* os_ = 0;
37 
38 
39 void test()
40 {
41  if (os_) *os_ << "test()\n";
42 
45  unit_assert_operator_equal(Site::NTerminus, site('n'));
46  unit_assert_operator_equal(Site::CTerminus, site('c'));
51  unit_assert_throws_what(site('1'), invalid_argument, "[unimod::site] invalid symbol");
52  unit_assert_throws_what(site('z'), invalid_argument, "[unimod::site] invalid symbol");
53 
54 
55  unit_assert_operator_equal(Position::Anywhere, position());
58  unit_assert_throws_what(position(MS_ion_trap), invalid_argument, "[unimod::position] invalid cvid");
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(8, 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  // 18 mods are 28 +/- 1 (but 1 of them is an isotope label not yet supported)
134  unit_assert_operator_equal(17, 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,
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,
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 
186 int 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