23#include "CLHEP/Matrix/Matrix.h"
24#include "CLHEP/Matrix/Vector.h"
26#include "CLHEP/Geometry/Point3D.h"
27#ifndef ENABLE_BACKWARDS_COMPATIBILITY
32using CLHEP::Hep3Vector;
33using CLHEP::HepMatrix;
34using CLHEP::HepSymMatrix;
35using CLHEP::HepVector;
59 void circle(
double x1,
double y1,
double x2,
double y2,
double x3,
double y3 );
62 double kappa()
const {
return m_kappa; }
63 double radius()
const {
return 0.5 / std::fabs( m_kappa ); }
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;
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; }
113 void scale(
double s ) {
117 inline void rotate(
double c,
double s );
118 inline void move(
double x,
double y );
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;
145 static const double BELLE_ALPHA;
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;
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;
194 inline double Lpar::check()
const {
195 return m_alpha * m_alpha + m_beta * m_beta - 4 * m_kappa * m_gamma - 1;
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 );
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 );
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 );
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 ) );
229 inline double Lpar::arcfun(
double xh,
double yh )
const {
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 )
242 double arg2 = a1 * a1;
243 return cross * ( 1.0 + arg2 * ( 1. / 6. + arg2 * ( 3. / 40. ) ) ) * xinv;
247 double at2 = std::atan2( a1, a2 );
248 if ( at2 < 0 ) at2 += ( 2 *
M_PI );
253 inline int Lpar::sd(
double r,
double x,
double y,
double limit,
double&
s,
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;
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;
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;
HepGeom::Point3D< double > HepPoint3D
bool operator!=(const DataPtr< T > &lhs, const DataPtr< T > &rhs)
EvtVector3R cross(const EvtVector3R &p1, const EvtVector3R &p2)
bool operator==(const double &x, const ICache::ID64 &y)
double dr(double x, double y) const
friend std::ostream & operator<<(std::ostream &o, Lpar &)
double d(double x, double y) const
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
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
const Lpar & operator=(const Lpar &)
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