19#include "KalFitAlg/lpav/Lpar.h"
20using CLHEP::Hep3Vector;
21using CLHEP::HepMatrix;
22using CLHEP::HepSymMatrix;
23using CLHEP::HepVector;
32 const double Lpar::BELLE_ALPHA( 333.564095 );
39 Lpar::Cpar::Cpar(
const Lpar& l ) {
41 if ( l.alpha() != 0 && l.beta() != 0 ) m_fi = atan2( l.alpha(), -l.beta() );
43 if ( m_fi < 0 ) m_fi += 2 *
M_PI;
44 m_da = 2 * l.gamma() / ( 1 + sqrt( 1 + 4 * l.
kappa() * l.gamma() ) );
76 void Lpar::circle(
double x1,
double y1,
double x2,
double y2,
double x3,
double y3 ) {
80 double delta = ( x1 - x2 ) * ( y1 - y3 ) - ( y1 - y2 ) * ( x1 - x3 );
87 double r12sq = ( x1 - x2 ) * ( x1 - x2 ) + ( y1 - y2 ) * ( y1 - y2 );
90 double r12 = sqrt( r12sq );
91 m_beta = -( x1 - x2 ) / r12;
92 m_alpha = ( y1 - y2 ) / r12;
93 m_gamma = -( m_alpha * x1 + m_beta * y1 );
97 double r13sq = ( x1 - x3 ) * ( x1 - x3 ) + ( y1 - y3 ) * ( y1 - y3 );
100 double r13 = sqrt( r13sq );
101 m_beta = -( x1 - x3 ) / r13;
102 m_alpha = ( y1 - y3 ) / r13;
103 m_gamma = -( m_alpha * x3 + m_beta * y3 );
107 double r23sq = ( x2 - x3 ) * ( x2 - x3 ) + ( y2 - y3 ) * ( y2 - y3 );
110 double r23 = sqrt( r23sq );
111 m_beta = -( x2 - x3 ) / r23;
112 m_alpha = ( y2 - y3 ) / r23;
113 m_gamma = -( m_alpha * x3 + m_beta * y3 );
126 double r1sq = x1 * x1 + y1 * y1;
127 double r2sq = x2 * x2 + y2 * y2;
128 double r3sq = x3 * x3 + y3 * y3;
129 a = 0.5 * ( ( y1 - y3 ) * ( r1sq - r2sq ) - ( y1 - y2 ) * ( r1sq - r3sq ) ) / delta;
130 b = 0.5 * ( -( x1 - x3 ) * ( r1sq - r2sq ) + ( x1 - x2 ) * ( r1sq - r3sq ) ) / delta;
131 double csq = ( x1 - a ) * ( x1 - a ) + ( y1 - b ) * ( y1 - b );
133 double csq2 = ( x2 - a ) * ( x2 - a ) + ( y2 - b ) * ( y2 - b );
134 double csq3 = ( x3 - a ) * ( x3 - a ) + ( y3 - b ) * ( y3 - b );
135 m_kappa = 1 / ( 2 * c );
136 m_alpha = -2 * a * m_kappa;
137 m_beta = -2 * b * m_kappa;
138 m_gamma = ( a * a + b * b - c * c ) * m_kappa;
142 HepMatrix Lpar::dldc() const
143#ifdef BELLE_OPTIMIZED_RETURN
148 HepMatrix vret( 3, 4 );
154 vret( 1, 1 ) = 2 * cp.da() *
s;
155 vret( 1, 2 ) = -2 * cp.da() * c;
156 vret( 1, 3 ) = cp.da() * cp.da();
158 vret( 2, 1 ) = xi * c;
159 vret( 2, 2 ) = xi *
s;
162 vret( 3, 1 ) = 2 * cp.cu() *
s;
163 vret( 3, 2 ) = -2 * cp.cu() * c;
169 bool Lpar::xy(
double r,
double& x,
double& y,
int dir )
const {
170 double t_kr2g = kr2g( r );
171 double t_xi2 = xi2();
172 double ro = r * r * t_xi2 - t_kr2g * t_kr2g;
173 if ( ro < 0 )
return false;
174 double rs = sqrt( ro );
177 x = ( -m_alpha * t_kr2g - m_beta * rs ) / t_xi2;
178 y = ( -m_beta * t_kr2g + m_alpha * rs ) / t_xi2;
182 x = ( -m_alpha * t_kr2g + m_beta * rs ) / t_xi2;
183 y = ( -m_beta * t_kr2g - m_alpha * rs ) / t_xi2;
188 double Lpar::x(
double r )
const {
194 double Lpar::y(
double r )
const {
202 if ( !xy( r, x, y, dir ) )
return -1;
203 double p = atan2( y, x );
204 if ( p < 0 ) p += ( 2 *
M_PI );
208 void Lpar::xhyh(
double x,
double y,
double& xh,
double& yh )
const {
209 double ddm =
dr( x, y );
216 double kdp1 = 1 + 2 *
kappa() * ddm;
217 xh = x - ddm * ( 2 *
kappa() * x +
alpha() ) / kdp1;
218 yh = y - ddm * ( 2 *
kappa() * y + beta() ) / kdp1;
222 double xh, yh, xx, yy;
223 xhyh( x, y, xh, yh );
224 double fk = fabs(
kappa() );
225 if ( fk == 0 )
return 0;
226 yy = 2 * fk * (
alpha() * yh - beta() * xh );
227 xx = 2 *
kappa() * (
alpha() * xh + beta() * yh ) + xi2();
228 double sp = atan2( yy, xx );
229 if ( sp < 0 ) sp += ( 2 *
M_PI );
235 if ( fabs( r ) < fabs( d0 ) )
return -1;
236 double b = fabs(
kappa() ) * sqrt( ( r * r - d0 * d0 ) / ( 1 + 2 *
kappa() * d0 ) );
237 if ( fabs( b ) > 1 )
return -1;
238 if ( dir == 0 )
return asin( b ) / fabs(
kappa() );
239 return (
M_PI - asin( b ) ) / fabs(
kappa() );
243#ifdef BELLE_OPTIMIZED_RETURN
257 HepVector cen1( lp1.
center() );
258 HepVector cen2( lp2.
center() );
259 double dx = cen1( 1 ) - cen2( 1 );
260 double dy = cen1( 2 ) - cen2( 2 );
261 double dc = sqrt( dx * dx + dy * dy );
262 if (
dc < fabs( 0.5 / lp1.
kappa() ) + fabs( 0.5 / lp2.
kappa() ) )
264 double a1 = std::sqrt( lp1.alpha() ) + std::sqrt( lp1.beta() );
265 double a2 = std::sqrt( lp2.alpha() ) + std::sqrt( lp2.beta() );
266 double a3 = lp1.alpha() * lp2.alpha() + lp1.beta() * lp2.beta();
267 double det = lp1.alpha() * lp2.beta() - lp1.beta() * lp2.alpha();
268 if ( fabs( det ) > 1e-12 )
270 double c1 = a2 * std::sqrt( lp1.
kappa() ) + a1 * std::sqrt( lp2.
kappa() ) -
274 double cinv = 1.0 / c1;
275 double c2 = std::sqrt( a3 ) - 0.5 * ( a1 + a2 ) -
276 2.0 * a3 * ( lp1.gamma() * lp2.
kappa() + lp2.gamma() * lp1.
kappa() );
277 double c3 = a2 * std::sqrt( lp1.gamma() ) + a1 * std::sqrt( lp2.gamma() ) -
278 2.0 * a3 * lp1.gamma() * lp2.gamma();
279 double root = std::sqrt( c2 ) - 4.0 * c1 * c3;
284 rad2[0] = 0.5 * cinv * ( -c2 -
root );
285 rad2[1] = 0.5 * cinv * ( -c2 +
root );
286 double ab1 = -( lp2.beta() * lp1.gamma() - lp1.beta() * lp2.gamma() );
287 double ab2 = ( lp2.alpha() * lp1.gamma() - lp1.alpha() * lp2.gamma() );
288 double ac1 = -( lp2.beta() * lp1.
kappa() - lp1.beta() * lp2.
kappa() );
289 double ac2 = ( lp2.alpha() * lp1.
kappa() - lp1.alpha() * lp2.
kappa() );
290 double dinv = 1.0 / det;
291 v1( 1 ) = dinv * ( ab1 + ac1 * rad2[0] );
292 v1( 2 ) = dinv * ( ab2 + ac2 * rad2[0] );
294 v2( 1 ) = dinv * ( ab1 + ac1 * rad2[1] );
295 v2( 2 ) = dinv * ( ab2 + ac2 * rad2[1] );
297 double d1 = lp1.
d( v1( 1 ), v1( 2 ) );
298 double d2 = lp2.
d( v1( 1 ), v1( 2 ) );
299 double d3 = lp1.
d( v2( 1 ), v2( 2 ) );
300 double d4 = lp2.
d( v2( 1 ), v2( 2 ) );
301 double r = sqrt( rad2[0] );
302 Lpar::Cpar cp1( lp1 );
303 Lpar::Cpar cp2( lp2 );
304 for (
int j = 0; j < 2; j++ )
309 s1 = lp1.
s( v1( 1 ), v1( 2 ) );
310 s2 = lp2.
s( v1( 1 ), v1( 2 ) );
314 s1 = lp1.
s( v2( 1 ), v2( 2 ) );
315 s2 = lp2.
s( v2( 1 ), v2( 2 ) );
317 double phi1 = cp1.fi() + 2 * cp1.cu() * s1;
318 double phi2 = cp2.fi() + 2 * cp2.cu() * s2;
319 double f = ( 1 + 2 * cp1.cu() * cp1.da() ) * ( 1 + 2 * cp2.cu() * cp2.da() ) *
320 cos( cp1.fi() - cp2.fi() );
321 f -= 2 * ( lp1.gamma() * lp2.
kappa() + lp2.gamma() * lp1.
kappa() );
341 return o <<
" al=" <<
s.m_alpha <<
" be=" <<
s.m_beta <<
" ka=" <<
s.m_kappa
342 <<
" ga=" <<
s.m_gamma;
TFile f("ana_bhabha660a_dqa_mcPat_zy_old.root")
double sin(const BesAngle a)
double cos(const BesAngle a)
**********Class see also m_nmax DOUBLE PRECISION m_amel DOUBLE PRECISION m_x2 DOUBLE PRECISION m_alfinv DOUBLE PRECISION m_Xenph INTEGER m_KeyWtm INTEGER m_idyfs DOUBLE PRECISION m_zini DOUBLE PRECISION m_q2 DOUBLE PRECISION m_Wt_KF DOUBLE PRECISION m_WtCut INTEGER m_KFfin *COMMON c_KarLud $ !Input CMS energy[GeV] $ !CMS energy after beam spread beam strahlung[GeV] $ !Beam energy spread[GeV] $ !z boost due to beam spread $ !electron beam mass *ff pair spectrum $ !minimum v
double dr(double x, double y) const
friend std::ostream & operator<<(std::ostream &o, Lpar &)
double d(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)
double s(double x, double y) const
double phi(double r, int dir=0) const