BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
Reconstruction/TrackUtil/include/TrackUtil/zav.h
Go to the documentation of this file.
1#ifndef _ZAV_H
2#define _ZAV_H
3// #include "mscl.h"
4#include <iostream>
5
6#include "CLHEP/Matrix/Matrix.h"
7#include "CLHEP/Matrix/SymMatrix.h"
8using namespace CLHEP;
9// #include "zhit.h"
10
11class zav {
12public:
13 zav();
14 zav( int ) {} // dummy for one of the chain constructor
15 void set( const zav* );
16 double chisq() const { return _chisq; }
17 void add( double, double, double );
18 // void add(const zhit&);
19 double calculate();
20 double a() const { return _a; }
21 double b() const { return _b; }
22 double z( double s ) const { return _a * s + _b; }
23 double d( double s, double z ) const { return z - _a * s - _b; }
24 int nc() const { return _nc; }
25 void clear( void );
26 inline friend std::ostream& operator<<( std::ostream&, const zav& );
27 // HepSymMatrix cov() const;
28 // friend class chain;
29private:
30 double _a;
31 double _b;
32 double _w;
33 double _sav;
34 double _ssav;
35 double _zav;
36 double _szav;
37 double _zzav;
38 double _chisq;
39 double _sig_inv;
40 double _c11;
41 double _c21;
42 double _c22;
43 int _nc;
44};
45
46inline zav::zav() {
47 _a = _b = _w = _sav = _ssav = _zav = _szav = _zzav = 0;
48 _chisq = -1;
49 _c22 = _c21 = _c11 = _sig_inv = 0;
50 _nc = 0;
51}
52
53inline void zav::clear( void ) {
54 _w = _sav = _ssav = _zav = _szav = _zzav = 0;
55 _chisq = -1;
56 _c22 = _c21 = _c11 = _sig_inv = 0;
57 _nc = 0;
58}
59
60inline void zav::set( const zav* c ) {
61 if ( c )
62 {
63 _w = c->_w;
64 _sav = c->_sav;
65 _ssav = c->_ssav;
66 _zav = c->_zav;
67 _szav = c->_szav;
68 _zzav = c->_zzav;
69 _sig_inv = c->_sig_inv;
70 _c11 = c->_c11;
71 _c21 = c->_c21;
72 _c22 = c->_c22;
73 _nc = c->_nc;
74 }
75 else
76 {
77 _w = _sav = _ssav = _zav = _szav = _zzav = _sig_inv = _c11 = _c21 = _c22 = 0;
78 _nc = 0;
79 }
80 _a = _b = 0;
81 _chisq = -1;
82}
83
84inline void zav::add( double s, double z, double w ) {
85 _w += w;
86 double sw = s * w;
87 _sav += sw;
88 _ssav += sw * s;
89 double zw = z * w;
90 _zav += zw;
91 _szav += zw * s;
92 _zzav += zw * z;
93 _chisq = -1;
94 _nc++;
95}
96/*
97inline void zav::add(const zhit & h) {
98 double errsq = h._z.error();
99 if (errsq==0) return;
100 errsq *= errsq;
101 double w = 1/errsq;
102 _w += w;
103 double s = (double)h._s;
104 double sw = s * w;
105 _sav += sw;
106 _ssav += sw * s;
107 double z = (double)h._z;
108 double zw = z * w;
109 _zav += zw;
110 _szav += zw * s;
111 _zzav += zw * z;
112 _chisq = -1;
113 _nc++;
114}
115*/
116inline double zav::calculate() {
117 double sig = _ssav * _w - _sav * _sav;
118 if ( sig != 0 )
119 {
120 _sig_inv = 1 / sig;
121 _a = ( _szav * _w - _sav * _zav ) * _sig_inv;
122 _b = ( _ssav * _zav - _sav * _szav ) * _sig_inv;
123 _chisq = _zzav - 2 * _a * _szav - 2 * _b * _zav + _a * _a * _ssav + _b * _b * _w +
124 2 * _a * _b * _sav;
125 _c11 = _w * _sig_inv;
126 _c21 = -_sav * _sig_inv;
127 _c22 = _ssav * _sig_inv;
128 }
129 else
130 {
131 _sig_inv = 0;
132 _c11 = _c21 = _c22 = 0;
133 _chisq = -1;
134 }
135 if ( _nc == 2 ) { _chisq = 0; }
136 return _chisq;
137}
138
139inline std::ostream& operator<<( std::ostream& o, const zav& z ) {
140 o << " zav::w=" << z._w << " sav=" << z._sav << " zav=" << z._zav << " nc=" << z._nc
141 << " chisq=" << z._chisq << " a=" << z._a << " b=" << z._b << " c11=" << z._c11
142 << " c21=" << z._c21 << " c22=" << z._c22 << " sig_inv=" << z._sig_inv << std::endl;
143 return o;
144}
145
146/*inline HepSymMatrix zav::cov() const
147{
148#ifndef __GNUG__
149 HepSymMatrix vret(2);
150#endif
151// vret(1,1) = _ssav;
152// vret(2,1) = _sav;
153// vret(2,2) = _w;
154// int iret = invert(vret);
155// if (iret) cerr << "zav::cov(): cannot invert the matrix" << endl;
156 vret(1,1) = _ssav;
157 vret(2,1) = _sav;
158 vret(2,2) = _w;
159 return vret;
160}*/
161#endif /* ZAV */
double w
XmlRpcServer s
std::ostream & operator<<(std::ostream &o, const zav &z)
friend std::ostream & operator<<(std::ostream &, const zav &)
void clear(void)
double calculate()
void add(double, double, double)
double d(double s, double z) const
void set(const zav *)