Line data Source code
1 : #include "EvtGenBase/EvtPatches.hh"
2 : /*******************************************************************************
3 : * Project: BaBar detector at the SLAC PEP-II B-factory
4 : * Package: EvtGenBase
5 : * File: $Id: EvtValError.cpp,v 1.3 2009-03-16 15:39:28 robbep Exp $
6 : * Author: Alexei Dvoretskii, dvoretsk@slac.stanford.edu, 2001-2002
7 : *
8 : * Copyright (C) 2002 Caltech
9 : *******************************************************************************/
10 :
11 : #include <assert.h>
12 : #include <math.h>
13 : #include <iostream>
14 : #include "EvtGenBase/EvtValError.hh"
15 : using std::endl;
16 : using std::ostream;
17 :
18 : EvtValError::EvtValError()
19 0 : : _valKnown(0), _val(0.), _errKnown(0), _err(0.)
20 0 : {}
21 :
22 : EvtValError::EvtValError(double val)
23 0 : : _valKnown(1), _val(val), _errKnown(0), _err(0.)
24 0 : {}
25 :
26 : EvtValError::EvtValError(double val, double err)
27 0 : : _valKnown(1), _val(val), _errKnown(1), _err(err)
28 0 : {}
29 :
30 : EvtValError::EvtValError(const EvtValError& other)
31 0 : : _valKnown(other._valKnown), _val(other._val),
32 0 : _errKnown(other._errKnown), _err(other._err)
33 0 : {}
34 :
35 : EvtValError::~EvtValError()
36 0 : {}
37 :
38 : double EvtValError::prec() const
39 : {
40 0 : assert(_valKnown && _errKnown);
41 0 : return ( _val != 0) ? _err/_val : 0;
42 : }
43 :
44 : void EvtValError::operator=(const EvtValError& other)
45 : {
46 0 : _valKnown = other._valKnown;
47 0 : _val = other._val;
48 0 : _errKnown = other._errKnown;
49 0 : _err = other._err;
50 0 : }
51 :
52 : void EvtValError::operator*=(const EvtValError& other)
53 : {
54 0 : assert(_valKnown && other._valKnown);
55 :
56 : // Relative errors add in quadrature
57 0 : if(_errKnown && other._errKnown)
58 0 : _err = _val * other._val * sqrt(prec()*prec() + other.prec() * other.prec());
59 0 : else _errKnown = 0;
60 :
61 : // Modify the value
62 0 : _val *= other._val;
63 0 : }
64 :
65 : void EvtValError::operator/=(const EvtValError& other)
66 : {
67 0 : assert(_valKnown && other._valKnown && other._val != 0.);
68 :
69 : // Relative errors add in quadrature
70 0 : if(_errKnown && other._errKnown)
71 0 : _err = _val/other._val * sqrt(prec()*prec() + other.prec() * other.prec());
72 0 : else _errKnown = 0;
73 :
74 : // Modify the value
75 0 : _val /= other._val;
76 0 : }
77 :
78 :
79 : void EvtValError::print(ostream& os) const
80 : {
81 0 : if(_valKnown) os << _val;
82 0 : else os << "Undef";
83 0 : os << " +/- ";
84 0 : if(_errKnown) os << _err;
85 0 : else os << "Undef";
86 0 : os << endl;
87 0 : }
88 :
89 :
90 : void EvtValError::operator+=(const EvtValError& other)
91 : {
92 0 : assert(_valKnown); assert(other._valKnown);
93 0 : _val += other._val;
94 :
95 : // add errors in quadrature
96 :
97 0 : if(_errKnown && other._errKnown) {
98 :
99 0 : _err = sqrt(_err*_err + other._err*other._err);
100 0 : }
101 : else {
102 :
103 0 : _errKnown = 0;
104 : }
105 0 : }
106 :
107 : void EvtValError::operator*=(double c) {
108 :
109 0 : assert(_valKnown);
110 0 : _val *= c;
111 0 : if(_errKnown) _err*=c;
112 0 : }
113 :
114 :
115 : EvtValError operator*(const EvtValError& x1, const EvtValError& x2)
116 : {
117 0 : EvtValError ret(x1);
118 0 : ret *= x2;
119 : return ret;
120 0 : }
121 :
122 : EvtValError operator/(const EvtValError& x1, const EvtValError& x2)
123 : {
124 0 : EvtValError ret(x1);
125 0 : ret /= x2;
126 : return ret;
127 0 : }
128 :
129 :
130 : EvtValError operator+(const EvtValError& x1, const EvtValError& x2)
131 : {
132 0 : EvtValError ret(x1);
133 0 : ret += x2;
134 : return ret;
135 0 : }
136 :
137 :
138 : EvtValError operator*(const EvtValError& x,double c)
139 : {
140 0 : EvtValError ret(x);
141 0 : ret*=c;
142 : return ret;
143 0 : }
144 :
145 :
146 : EvtValError operator*(double c,const EvtValError& x)
147 : {
148 0 : EvtValError ret(x);
149 0 : ret*=c;
150 : return ret;
151 0 : }
152 :
153 :
154 : ostream& operator<<(ostream& os, const EvtValError& other)
155 : {
156 0 : other.print(os);
157 0 : return os;
158 : }
159 :
160 :
|