ProteoWizard
DataFetcherContainerTest.cpp
Go to the documentation of this file.
1 //
2 // $Id: DataFetcherContainerTest.cpp 2051 2010-06-15 18:39:13Z chambm $
3 //
4 //
5 // Original author: Kate Hoff <katherine.hoff@proteowizard.org>
6 //
7 // Copyright 2009 Center for Applied Molecular Medicine
8 // University of Southern California, Los Angeles, CA
9 //
10 // Licensed under the Apache License, Version 2.0 (the "License");
11 // you may not use this file except in compliance with the License.
12 // You may obtain a copy of the License at
13 //
14 // http://www.apache.org/licenses/LICENSE-2.0
15 //
16 // Unless required by applicable law or agreed to in writing, software
17 // distributed under the License is distributed on an "AS IS" BASIS,
18 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19 // See the License for the specific language governing permissions and
20 // limitations under the License.
21 //
22 
23 ///
24 /// DataFetcherContainerTest.cpp
25 ///
26 
27 #include "DataFetcherContainer.hpp"
30 #include "boost/shared_ptr.hpp"
31 
32 using namespace pwiz::cv;
33 using namespace pwiz::util;
34 using namespace pwiz::minimxml;
35 using namespace pwiz::data::peakdata;
36 using namespace eharmony;
37 using boost::shared_ptr;
38 
39 typedef boost::shared_ptr<DataFetcherContainer> DfcPtr;
40 
41 namespace{
42 
43 ostream* os_ = 0;
44 const double epsilon = 0.000001;
45 
46 SpectrumQuery makeSpectrumQuery(double precursorNeutralMass, double rt, int charge, string sequence, double score = 0.9, int startScan = 0, int endScan = 0)
47 {
48  SpectrumQuery spectrumQuery;
49  spectrumQuery.startScan = startScan;
50  spectrumQuery.endScan = endScan;
51  spectrumQuery.precursorNeutralMass = precursorNeutralMass;
52  spectrumQuery.assumedCharge = charge;
53  spectrumQuery.retentionTimeSec = rt;
54 
55  SearchResult searchResult;
56 
57  SearchHit searchHit;
58  searchHit.peptide = sequence;
59 
60  AnalysisResult analysisResult;
61  analysisResult.analysis = "peptideprophet";
62 
63  PeptideProphetResult xresult;
64  xresult.probability = score;
65  xresult.allNttProb.push_back(0);
66  xresult.allNttProb.push_back(0);
67  xresult.allNttProb.push_back(score);
68 
69  analysisResult.peptideProphetResult = xresult;
70 
71  searchHit.analysisResult = analysisResult;
72  searchResult.searchHit = searchHit;
73 
74  spectrumQuery.searchResult = searchResult;
75 
76  return spectrumQuery;
77 
78 }
79 
80 FeaturePtr makeFeature(double mz, double retentionTime)
81 {
82  FeaturePtr feature(new Feature());
83  feature->mz = mz;
84  feature->retentionTime = retentionTime;
85  feature->charge = 1;
86 
87  return feature;
88 }
89 
91 {
92  SpectrumQuery a = makeSpectrumQuery(2, 2, 1, "KRH", 5, 6, 7);
93  SpectrumQuery b = makeSpectrumQuery(2, 4, 1, "RAG", 7, 8, 9);
94 
95  vector<SpectrumQuery> sq;
96  sq.push_back(a);
97  sq.push_back(b);
98 
101  PidfPtr pidf(new PeptideID_dataFetcher(mspa));
102 
103  return pidf;
104 
105 }
106 
107 PidfPtr makeBigPeptideID_dataFetcher()
108 {
109  // make enough spectrum queries that we can test getAnchors()
110  SpectrumQuery a = makeSpectrumQuery(3, 2, 3, "KRH", 5, 6, 7);
111  SpectrumQuery b = makeSpectrumQuery(3, 4, 3, "RAG", 7, 8, 9);
112  SpectrumQuery c = makeSpectrumQuery(1, 2, 3, "DW", 4, 5, 6);
113  SpectrumQuery d = makeSpectrumQuery(9, 8, 3, "JK", 7, 6, 5);
114 
115  vector<SpectrumQuery> sq;
116  sq.push_back(a);
117  sq.push_back(b);
118  sq.push_back(c);
119  sq.push_back(d);
120 
123  PidfPtr pidf(new PeptideID_dataFetcher(mspa));
124 
125  return pidf;
126 
127 }
128 
129 PidfPtr makeBigBadPeptideID_dataFetcher()
130 {
131  // for testing to ensure that anchors that do not fit the tolerance aren't included
132  SpectrumQuery a = makeSpectrumQuery(3, 2, 3, "KRH", 5, 6, 7);
133  SpectrumQuery b = makeSpectrumQuery(3, 4, 3, "RAG", 7, 8, 9);
134  SpectrumQuery c = makeSpectrumQuery(1, 105, 3, "DW", 4, 5, 6);
135  SpectrumQuery d = makeSpectrumQuery(9, 8, 3, "JK", 7, 6, 5);
136 
137  vector<SpectrumQuery> sq;
138  sq.push_back(a);
139  sq.push_back(b);
140  sq.push_back(c);
141  sq.push_back(d);
142 
145  PidfPtr pidf(new PeptideID_dataFetcher(mspa));
146 
147  return pidf;
148 
149 }
150 
151 FdfPtr makeFeature_dataFetcher()
152 {
153  FeaturePtr ab = makeFeature(3.00727, 3.5);
154  ab->id = "99";
155 
156  vector<FeaturePtr> f;
157  f.push_back(ab);
158 
159  FdfPtr fdf(new Feature_dataFetcher(f));
160 
161  return fdf;
162 
163 }
164 
165 DfcPtr makeDataFetcherContainer()
166 {
168  FdfPtr fdf = makeFeature_dataFetcher();
169 
170  DfcPtr dfc(new DataFetcherContainer(pidf, pidf, fdf, fdf));
171  dfc->adjustRT();
172 
173  return dfc;
174 
175 }
176 
177 // Dummy PeptideID_dataFetchers and Feature_dataFetchers for testing warpRT() method
178 
179 PidfPtr makeWarpTestPidfA()
180 {
181  vector<boost::shared_ptr<SpectrumQuery> > sqs;
182 
183  sqs.push_back(boost::shared_ptr<SpectrumQuery>(new SpectrumQuery(makeSpectrumQuery(1, 1, 1, "F"))));
184  sqs.push_back(boost::shared_ptr<SpectrumQuery>(new SpectrumQuery(makeSpectrumQuery(1,1.5, 1, "C"))));
185  sqs.push_back(boost::shared_ptr<SpectrumQuery>(new SpectrumQuery(makeSpectrumQuery(1,2, 1, "A"))));
186 
187  PidfPtr pidf(new PeptideID_dataFetcher(sqs));
188 
189  return pidf;
190 
191 }
192 
193 PidfPtr makeWarpTestPidfB()
194 {
195  vector<boost::shared_ptr<SpectrumQuery> > sqs;
196 
197  sqs.push_back(boost::shared_ptr<SpectrumQuery>(new SpectrumQuery(makeSpectrumQuery(1, 0.5, 1, "F"))));
198  sqs.push_back(boost::shared_ptr<SpectrumQuery>(new SpectrumQuery(makeSpectrumQuery(1,2, 1, "C"))));
199  sqs.push_back(boost::shared_ptr<SpectrumQuery>(new SpectrumQuery(makeSpectrumQuery(1,3, 1, "A"))));
200 
201  PidfPtr pidf(new PeptideID_dataFetcher(sqs));
202 
203  return pidf;
204 
205 }
206 
207 FdfPtr makeWarpTestFdfA()
208 {
209 
210  vector<FeaturePtr> features;
211 
212  features.push_back(makeFeature(2.00727, 1.001));
213  features.push_back(makeFeature(2.00727, 1.499));
214  features.push_back(makeFeature(2.00727, 2.001));
215 
216  FdfPtr fdf(new Feature_dataFetcher(features));
217 
218  return fdf;
219 }
220 
221 FdfPtr makeWarpTestFdfB()
222 {
223  vector<FeaturePtr> features;
224 
225  features.push_back(makeFeature(2.00727, 0.499));
226  features.push_back(makeFeature(2.00727, 1.999));
227  features.push_back(makeFeature(2.00727, 3.003));
228 
229  FdfPtr fdf(new Feature_dataFetcher(features));
230 
231  return fdf;
232 }
233 
234 } // anonymous namespace
235 
237 {
238  DfcPtr dfc = makeDataFetcherContainer();
239 
240  FeaturePtr ab = makeFeature(3.00727, 3.5);
241  ab->id = "99";
242  ab->charge = 1;
243  FeatureSequenced fs_ab;
244  fs_ab.feature = ab;
245  fs_ab.ms1_5="";
246  fs_ab.ms2="RAG";
247 
248  SpectrumQuery a = makeSpectrumQuery(2, 2, 1, "KRH", 5, 6, 7);
249  SpectrumQuery b = makeSpectrumQuery(2, 4, 1, "RAG", 7, 8, 9);
250 
251  vector<boost::shared_ptr<FeatureSequenced> > f_prime = dfc->_fdf_a->getBin().getAllContents();
252 
253  if (os_)
254  {
255  ostringstream oss;
256  XMLWriter writer(oss);
257  vector<boost::shared_ptr<FeatureSequenced> >::iterator it = f_prime.begin();
258  for(; it != f_prime.end(); ++it)
259  {
260  (*it)->feature->write(writer);
261  oss << (*it)->ms1_5 << endl;
262  oss << (*it)->ms2 << endl;
263 
264  }
265 
266  fs_ab.feature->write(writer);
267  oss << fs_ab.ms1_5 << endl;
268  oss << fs_ab.ms2 << endl;
269  *os_ << oss.str() << endl;
270 
271  }
272 
273  // did the feature sequence get assigned as expected?
274  unit_assert(find_if(f_prime.begin(), f_prime.end(), IsObject<FeatureSequenced>(fs_ab)) != f_prime.end());
275 
276  // did the peptide retention time get assigned as expected?
277  b.retentionTimeSec = 3.5;
278 
279  vector<boost::shared_ptr<SpectrumQuery> > sq_prime = dfc->_pidf_a->getBin().getAllContents();
280 
281  if (os_)
282  {
283  ostringstream oss;
284  XMLWriter writer(oss);
285  vector<boost::shared_ptr<SpectrumQuery> >::iterator it = sq_prime.begin();
286  for(; it != sq_prime.end(); ++it)
287  {
288  (*it)->write(writer);
289 
290  }
291 
292  *os_ << oss.str() << endl;
293 
294  }
295 
296  unit_assert(find_if(sq_prime.begin(), sq_prime.end(), IsObject<SpectrumQuery>(b)) != sq_prime.end());
297 
298  // we also expect a's retention time to be set to that of feature ab, since it is the only option and therefore the best
299  a.retentionTimeSec = 3.5;
300  unit_assert(find_if(sq_prime.begin(), sq_prime.end(), IsObject<SpectrumQuery>(a)) != sq_prime.end());
301 
302  // were the appropriate flags set?
303  unit_assert(dfc->_pidf_a->getRtAdjustedFlag());
304  unit_assert(dfc->_fdf_a->getMS2LabeledFlag());
305 
306 }
307 
309 {
310  PidfPtr pidf_a(makeBigPeptideID_dataFetcher());
311  PidfPtr pidf_b(makeBigBadPeptideID_dataFetcher());
312 
313  DataFetcherContainer dfc(pidf_a, pidf_b, FdfPtr(new Feature_dataFetcher()), FdfPtr(new Feature_dataFetcher()));
314  dfc.warpRT(Default, 2); // get every 2nd anchor, using default tolerance of 100 seconds
315 
316  vector<pair<double, double> > trueAnchors;
317  trueAnchors.push_back(make_pair(2,2));
318 
319  unit_assert(trueAnchors == dfc.anchors());
320 
321  trueAnchors.clear();
322 
323  dfc.warpRT(Default,2, 110); // get every 2nd anchor, using higher tolerance of 110 seconds
324  trueAnchors.push_back(make_pair(2, 105));
325  trueAnchors.push_back(make_pair(2, 2));
326 
327  unit_assert(trueAnchors == dfc.anchors());
328 
329 }
330 
331 // helper functions
332 namespace{
333 
334 vector<double> getRTs(PidfPtr pidf)
335 {
336  vector<double> result;
337  vector<boost::shared_ptr<SpectrumQuery> > sqs = pidf->getAllContents();
338  vector<boost::shared_ptr<SpectrumQuery> >::iterator it = sqs.begin();
339  for(; it != sqs.end(); ++it) result.push_back((*it)->retentionTimeSec);
340 
341  return result;
342 
343 }
344 
345 vector<double> getRTs(FdfPtr fdf)
346 {
347  vector<double> result;
348  vector<FeatureSequencedPtr> fss = fdf->getAllContents();
349  vector<FeatureSequencedPtr>::iterator it = fss.begin();
350  for(; it != fss.end(); ++it) result.push_back((*it)->feature->retentionTime);
351 
352  return result;
353 
354 }
355 
356 } // anonymous namespace
357 
359 {
360  DataFetcherContainer dfc(makeWarpTestPidfA(), makeWarpTestPidfB(), makeWarpTestFdfA(), makeWarpTestFdfB());
361  dfc.adjustRT();
362  dfc.warpRT(Linear, 2);
363 
364  vector<double> pidf_a_rts = getRTs(dfc._pidf_a);
365  vector<double> pidf_b_rts = getRTs(dfc._pidf_b);
366  vector<double> fdf_a_rts = getRTs(dfc._fdf_a);
367  vector<double> fdf_b_rts = getRTs(dfc._fdf_b);
368 
369  vector<double> a_truth;
370  a_truth.push_back(0.49899999999999);
371  a_truth.push_back(1.74599200000000);
372  a_truth.push_back(3.00300000000000);
373 
374  vector<double> b_truth;
375  b_truth.push_back(-0.7580079999999);
376  b_truth.push_back(2.99799200000000);
377  b_truth.push_back(5.51200800000000);
378 
379  vector<double>::iterator par = pidf_a_rts.begin();
380  vector<double>::iterator far = fdf_a_rts.begin();
381  vector<double>::iterator at = a_truth.begin();
382 
383  for(; at != a_truth.end(); ++at, ++far, ++par)
384  {
385  // unit_assert_equal(*par, *at, epsilon);
386  //unit_assert_equal(*far, *at, epsilon);
387 
388  }
389 
390  vector<double>::iterator pbr = pidf_b_rts.begin();
391  vector<double>::iterator fbr = fdf_b_rts.begin();
392  vector<double>::iterator bt = b_truth.begin();
393 
394  for(; bt != b_truth.end(); ++bt, ++fbr, ++pbr)
395  {
396  unit_assert_equal(*pbr, *bt, epsilon);
397  unit_assert_equal(*fbr, *bt, epsilon);
398 
399  }
400 
401 }
402 
403 int main(int argc, char* argv[])
404 {
405 
406  try
407  {
408  if (argc>1 && !strcmp(argv[1],"-v")) os_ = &cout;
409  if (os_) *os_ << "DataFetcherContainerTest ... \n";
410  testAdjustRT();
411  testGetAnchors();
412  testWarpRT();
413 
414  return 0;
415  }
416  catch (exception& e)
417  {
418  cerr << e.what() << endl;
419  }
420  catch (...)
421  {
422  cerr << "Caught unknown exception.\n";
423  }
424 
425  return 1;
426 }
427 
428 
429 
430