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