Line data Source code
1 : /*******************************************************************************
2 : * Project: BaBar detector at the SLAC PEP-II B-factory
3 : * Package: EvtGenBase
4 : * File: $Id: EvtValError.hh,v 1.2 2009-03-16 16:34:38 robbep Exp $
5 : * Author: Alexei Dvoretskii, dvoretsk@slac.stanford.edu, 2001-2002
6 : *
7 : * Copyright (C) 2002 Caltech
8 : *******************************************************************************/
9 :
10 : // Value and its associated error. E.g. this could be interval size and
11 : // the error associated with numerical integration.
12 :
13 : #ifndef EVT_VAL_ERROR_HH
14 : #define EVT_VAL_ERROR_HH
15 :
16 : #include <iostream>
17 : #include <assert.h>
18 : #include <math.h>
19 :
20 : class EvtValError {
21 :
22 : public:
23 :
24 : EvtValError();
25 : EvtValError(double val);
26 : EvtValError(double val, double err);
27 : EvtValError(const EvtValError& other);
28 : ~EvtValError();
29 :
30 0 : inline int valueKnown() const { return _valKnown; }
31 0 : inline double value() const { assert(_valKnown); return _val; }
32 : inline int errorKnown() const { return _errKnown; }
33 : inline double error() const { assert(_errKnown); return _err; }
34 :
35 : double prec() const;
36 : void operator=(const EvtValError& other);
37 : void operator*=(const EvtValError& other);
38 : void operator/=(const EvtValError& other);
39 : void operator+=(const EvtValError& other);
40 : void operator*=(double c);
41 :
42 : void print(std::ostream&) const;
43 :
44 : private:
45 :
46 : int _valKnown;
47 : double _val;
48 : int _errKnown;
49 : double _err;
50 :
51 : };
52 :
53 :
54 : EvtValError operator*(const EvtValError& x1, const EvtValError& x2);
55 : EvtValError operator/(const EvtValError& x1, const EvtValError& x2);
56 : EvtValError operator+(const EvtValError& x1, const EvtValError& x2);
57 : EvtValError operator*(const EvtValError& x,double c);
58 : EvtValError operator*(double c,const EvtValError& x);
59 :
60 : std::ostream& operator<<(std::ostream&, const EvtValError&);
61 :
62 : // Perform an accept/reject fraction count
63 :
64 : template <class InputIterator, class Predicate>
65 : EvtValError accept_reject(InputIterator it, InputIterator end, Predicate pred)
66 : {
67 : int itsTried = 0;
68 : int itsPassed = 0;
69 : while(it != end) {
70 :
71 : itsTried++;
72 : if(pred(*it++)) itsPassed++;
73 : }
74 :
75 : return EvtValError(((double) itsPassed)/((double) itsTried),sqrt(itsPassed)/((double) itsTried));
76 : }
77 :
78 : #endif
|