BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
Reconstruction/KalFitAlg/include/KalFitAlg/lpav/Lpar.h
Go to the documentation of this file.
1// -*- C++ -*-
2//
3// Package: <package>
4// Module: Lpar
5//
6// Description: <one line class summary>
7//
8// Usage:
9// <usage>
10//
11// Author: KATAYAMA Nobuhiko
12// Created: Fri Feb 6 10:21:31 JST 1998
13//
14
15#pragma once
16
17// system include files
18#include <cmath>
19#include <iosfwd>
20#include <iostream>
21
22// user include files
23#include "CLHEP/Matrix/Matrix.h"
24#include "CLHEP/Matrix/Vector.h"
25// #ifndef CLHEP_POINT3D_H
26#include "CLHEP/Geometry/Point3D.h"
27#ifndef ENABLE_BACKWARDS_COMPATIBILITY
28typedef HepGeom::Point3D<double> HepPoint3D;
29#endif
30// #endif
31
32using CLHEP::Hep3Vector;
33using CLHEP::HepMatrix;
34using CLHEP::HepSymMatrix;
35using CLHEP::HepVector;
36
37using namespace CLHEP;
38
39// forward declarations
40
41namespace KalmanFit {
42
43 class Lpar {
44 // friend classes and functions
45
46 public:
47 // constants, enums and typedefs
48
49 // Constructors and destructor
51
52 virtual ~Lpar();
53
54 // assignment operator(s)
55 inline const Lpar& operator=( const Lpar& );
56
57 // member functions
58 inline void neg();
59 void circle( double x1, double y1, double x2, double y2, double x3, double y3 );
60
61 // const member functions
62 double kappa() const { return m_kappa; }
63 double radius() const { return 0.5 / std::fabs( m_kappa ); }
64 HepVector center() const;
65 double s( double x, double y ) const;
66 inline double d( double x, double y ) const;
67 inline double dr( double x, double y ) const;
68 double s( double r, int dir = 0 ) const;
69 double phi( double r, int dir = 0 ) const;
70 inline int sd( double r, double x, double y, double limit, double& s, double& d ) const;
71 inline HepVector Hpar( const HepPoint3D& pivot ) const;
72
73 // static member functions
74
75 // friend functions and classes
76 friend class Lpav;
77 friend std::ostream& operator<<( std::ostream& o, Lpar& );
78 friend int intersect( const Lpar&, const Lpar&, HepVector&, HepVector& );
79
80 protected:
81 // protected member functions
82
83 // protected const member functions
84
85 private:
86 // Private class cpar
87 class Cpar {
88 public:
89 Cpar( const Lpar& );
90 double xi() const { return 1 + 2 * m_cu * m_da; }
91 double sfi() const { return m_sfi; }
92 double cfi() const { return m_cfi; }
93 double da() const { return m_da; }
94 double cu() const { return m_cu; }
95 double fi() const { return m_fi; }
96
97 private:
98 double m_cu;
99 double m_fi;
100 double m_da;
101 double m_sfi;
102 double m_cfi;
103 };
104 friend class Lpar::Cpar;
105 // Constructors and destructor
106 inline Lpar( const Lpar& );
107
108 // comparison operators
109 bool operator==( const Lpar& ) const;
110 bool operator!=( const Lpar& ) const;
111
112 // private member functions
113 void scale( double s ) {
114 m_kappa /= s;
115 m_gamma *= s;
116 }
117 inline void rotate( double c, double s );
118 inline void move( double x, double y );
119
120 // private const member functions
121 double alpha() const { return m_alpha; }
122 double beta() const { return m_beta; }
123 double gamma() const { return m_gamma; }
124 inline double check() const;
125 HepMatrix dldc() const;
126 inline double d0( double x, double y ) const;
127 double kr2g( double r ) const { return m_kappa * r * r + m_gamma; }
128 double x( double r ) const;
129 double y( double r ) const;
130 void xhyh( double x, double y, double& xh, double& yh ) const;
131 double xi2() const { return 1 + 4 * m_kappa * m_gamma; }
132 bool xy( double, double&, double&, int dir = 0 ) const;
133 inline double r_max() const;
134 double xc() const { return -m_alpha / 2 / m_kappa; }
135 double yc() const { return -m_beta / 2 / m_kappa; }
136 double da() const { return 2 * gamma() / ( std::sqrt( xi2() ) + 1 ); }
137 inline double arcfun( double xh, double yh ) const;
138
139 // data members
140 double m_alpha;
141 double m_beta;
142 double m_gamma;
143 double m_kappa;
144
145 static const double BELLE_ALPHA;
146
147 // static data members
148 };
149
150 // inline function definitions
151
152 // inline Lpar::Lpar(double a, double b, double k, double g) {
153 // m_alpha = a; m_beta = b; m_kappa = k; m_gamma = g;
154 // }
155
156 inline Lpar::Lpar() {
157 m_alpha = 0;
158 m_beta = 1;
159 m_gamma = 0;
160 m_kappa = 0;
161 }
162
163 inline Lpar::Lpar( const Lpar& l ) {
164 m_alpha = l.m_alpha;
165 m_beta = l.m_beta;
166 m_gamma = l.m_gamma;
167 m_kappa = l.m_kappa;
168 }
169
170 inline const Lpar& Lpar::operator=( const Lpar& l ) {
171 if ( this != &l )
172 {
173 m_alpha = l.m_alpha;
174 m_beta = l.m_beta;
175 m_gamma = l.m_gamma;
176 m_kappa = l.m_kappa;
177 }
178 return *this;
179 }
180
181 inline void Lpar::rotate( double c, double s ) {
182 double aLpar = c * m_alpha + s * m_beta;
183 double betar = -s * m_alpha + c * m_beta;
184 m_alpha = aLpar;
185 m_beta = betar;
186 }
187
188 inline void Lpar::move( double x, double y ) {
189 m_gamma += m_kappa * ( x * x + y * y ) + m_alpha * x + m_beta * y;
190 m_alpha += 2 * m_kappa * x;
191 m_beta += 2 * m_kappa * y;
192 }
193
194 inline double Lpar::check() const {
195 return m_alpha * m_alpha + m_beta * m_beta - 4 * m_kappa * m_gamma - 1;
196 }
197
198 inline void Lpar::neg() {
199 m_alpha = -m_alpha;
200 m_beta = -m_beta;
201 m_gamma = -m_gamma;
202 m_kappa = -m_kappa;
203 }
204
205 inline double Lpar::d0( double x, double y ) const {
206 return m_alpha * x + m_beta * y + m_gamma + m_kappa * ( x * x + y * y );
207 }
208
209 inline double Lpar::d( double x, double y ) const {
210 double dd = d0( x, y );
211 const double approx_limit = 0.2;
212 if ( std::fabs( m_kappa * dd ) > approx_limit ) return -1;
213 return dd * ( 1 - m_kappa * dd );
214 }
215
216 inline double Lpar::dr( double x, double y ) const {
217 double dx = xc() - x;
218 double dy = yc() - y;
219 double r = 0.5 / std::fabs( m_kappa );
220 return std::fabs( std::sqrt( dx * dx + dy * dy ) - r );
221 }
222
223 inline double Lpar::r_max() const {
224 if ( m_kappa == 0 ) return 100000000.0;
225 if ( m_gamma == 0 ) return 1 / std::fabs( m_kappa );
226 return std::fabs( 2 * m_gamma / ( std::sqrt( 1 + 4 * m_gamma * m_kappa ) - 1 ) );
227 }
228
229 inline double Lpar::arcfun( double xh, double yh ) const {
230 //
231 // Duet way of calculating Sperp.
232 //
233 double r2kap = 2.0 * m_kappa;
234 double xi = std::sqrt( xi2() );
235 double xinv = 1.0 / xi;
236 double ar2kap = std::fabs( r2kap );
237 double cross = m_alpha * yh - m_beta * xh;
238 double a1 = ar2kap * cross * xinv;
239 double a2 = r2kap * ( m_alpha * xh + m_beta * yh ) * xinv + xi;
240 if ( a1 >= 0 && a2 > 0 && a1 < 0.3 )
241 {
242 double arg2 = a1 * a1;
243 return cross * ( 1.0 + arg2 * ( 1. / 6. + arg2 * ( 3. / 40. ) ) ) * xinv;
244 }
245 else
246 {
247 double at2 = std::atan2( a1, a2 );
248 if ( at2 < 0 ) at2 += ( 2 * M_PI );
249 return at2 / ar2kap;
250 }
251 }
252
253 inline int Lpar::sd( double r, double x, double y, double limit, double& s,
254 double& d ) const {
255 if ( ( x * yc() - y * xc() ) * m_kappa < 0 ) return 0;
256 double dd = d0( x, y );
257 d = dd * ( 1 - m_kappa * dd );
258 double d_cross_limit = d * limit;
259 if ( d_cross_limit < 0 || d_cross_limit > limit * limit ) return 0;
260
261 double rc = std::sqrt( m_alpha * m_alpha + m_beta * m_beta ) / ( 2 * m_kappa );
262 double rho = 1. / ( -2 * m_kappa );
263 double cosPhi = ( rc * rc + rho * rho - r * r ) / ( -2 * rc * rho );
264 double phi = std::acos( cosPhi );
265 s = std::fabs( rho ) * phi;
266 d *= r / ( std::fabs( rc ) * std::sin( phi ) );
267 if ( abs( d ) > abs( limit ) ) return 0;
268 d_cross_limit = d * limit;
269 if ( d_cross_limit > limit * limit ) return 0;
270 return 1;
271 }
272
273 inline HepVector Lpar::Hpar( const HepPoint3D& pivot ) const {
274 HepVector a( 5 );
275 double dd = d0( pivot.x(), pivot.y() );
276 a( 1 ) = dd * ( m_kappa * dd - 1 );
277 a( 2 ) = ( m_kappa > 0 ) ? std::atan2( yc() - pivot.y(), xc() - pivot.x() ) + M_PI
278 : std::atan2( pivot.y() - yc(), pivot.x() - xc() ) - M_PI;
279 a( 3 ) = -2.0 * BELLE_ALPHA * m_kappa;
280 a( 4 ) = 0;
281 a( 5 ) = 0;
282 return a;
283 }
284} // namespace KalFitAlg
HepGeom::Point3D< double > HepPoint3D
Double_t x[10]
bool operator!=(const DataPtr< T > &lhs, const DataPtr< T > &rhs)
double alpha
EvtVector3R cross(const EvtVector3R &p1, const EvtVector3R &p2)
XmlRpcServer s
#define M_PI
Definition TConstant.h:4
bool operator==(const double &x, const ICache::ID64 &y)
Definition cache.h:397
friend std::ostream & operator<<(std::ostream &o, Lpar &)
virtual ~Lpar()
const Lpar & operator=(const Lpar &)
double s(double x, double y) const
double dr(double x, double y) const
friend int intersect(const Lpar &, const Lpar &, HepVector &, HepVector &)
void circle(double x1, double y1, double x2, double y2, double x3, double y3)
HepVector Hpar(const HepPoint3D &pivot) const
double d(double x, double y) const
int sd(double r, double x, double y, double limit, double &s, double &d) const
double phi(double r, int dir=0) const
double s(double x, double y) const
HepVector center() const
int sd(double r, double x, double y, double limit, double &s, double &d) const
double s(double r, int dir=0) const
double phi(double r, int dir=0) const