BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
TrackUtil/src/Lpar.cxx
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// Implimentation:
9// <Notes on implimentation>
10//
11// Author: KATAYAMA Nobuhiko
12// Created: Fri Feb 6 10:21:49 JST 1998
13// $Id: Lpar.cxx,v 1.2 2008/06/30 08:46:52 max Exp $
14
15#include <iostream>
16
17// system include files
18#include <cmath>
19// user include files
20#include "TrackUtil/Lpar.h"
21
22//
23// constants, enums and typedefs
24//
25
26//
27// static data member definitions
28//
29
30// const double Lpar::BELLE_ALPHA(-333.564095);
31
32//
33// constructors and destructor
34//
35// Lpar::Lpar(double x1, double y1, double x2, double y2, double x3, double y3) {
36// circle(x1, y1, x2, y2, x3, y3);
37// }
38Lpar::Cpar::Cpar( const Lpar& l ) {
39 m_cu = l.kappa();
40 if ( l.alpha() != 0 && l.beta() != 0 ) m_fi = atan2( l.alpha(), -l.beta() );
41 else m_fi = 0;
42 if ( m_fi < 0 ) m_fi += 2 * M_PI;
43 m_da = 2 * l.gamma() / ( 1 + sqrt( 1 + 4 * l.kappa() * l.gamma() ) );
44 m_cfi = cos( m_fi );
45 m_sfi = sin( m_fi );
46}
47
48// Lpar::Lpar( const Lpar& )
49// {
50// }
51
53
54//
55// assignment operators
56//
57// const Lpar& Lpar::operator=( const Lpar& )
58// {
59// }
60
61//
62// comparison operators
63//
64// bool Lpar::operator==( const Lpar& ) const
65// {
66// }
67
68// bool Lpar::operator!=( const Lpar& ) const
69// {
70// }
71
72//
73// member functions
74//
75void Lpar::circle( double x1, double y1, double x2, double y2, double x3, double y3 ) {
76 double a;
77 double b;
78 double c;
79 double delta = ( x1 - x2 ) * ( y1 - y3 ) - ( y1 - y2 ) * ( x1 - x3 );
80 if ( delta == 0 )
81 {
82 //
83 // three points are on a line.
84 //
85 m_kappa = 0;
86 double r12sq = ( x1 - x2 ) * ( x1 - x2 ) + ( y1 - y2 ) * ( y1 - y2 );
87 if ( r12sq > 0 )
88 {
89 double r12 = sqrt( r12sq );
90 m_beta = -( x1 - x2 ) / r12;
91 m_alpha = ( y1 - y2 ) / r12;
92 m_gamma = -( m_alpha * x1 + m_beta * y1 );
93 }
94 else
95 {
96 double r13sq = ( x1 - x3 ) * ( x1 - x3 ) + ( y1 - y3 ) * ( y1 - y3 );
97 if ( r13sq > 0 )
98 {
99 double r13 = sqrt( r13sq );
100 m_beta = -( x1 - x3 ) / r13;
101 m_alpha = ( y1 - y3 ) / r13;
102 m_gamma = -( m_alpha * x3 + m_beta * y3 );
103 }
104 else
105 {
106 double r23sq = ( x2 - x3 ) * ( x2 - x3 ) + ( y2 - y3 ) * ( y2 - y3 );
107 if ( r23sq > 0 )
108 {
109 double r23 = sqrt( r23sq );
110 m_beta = -( x2 - x3 ) / r23;
111 m_alpha = ( y2 - y3 ) / r23;
112 m_gamma = -( m_alpha * x3 + m_beta * y3 );
113 }
114 else
115 {
116 m_alpha = 1;
117 m_beta = 0;
118 m_gamma = 0;
119 }
120 }
121 }
122 }
123 else
124 {
125 double r1sq = x1 * x1 + y1 * y1;
126 double r2sq = x2 * x2 + y2 * y2;
127 double r3sq = x3 * x3 + y3 * y3;
128 a = 0.5 * ( ( y1 - y3 ) * ( r1sq - r2sq ) - ( y1 - y2 ) * ( r1sq - r3sq ) ) / delta;
129 b = 0.5 * ( -( x1 - x3 ) * ( r1sq - r2sq ) + ( x1 - x2 ) * ( r1sq - r3sq ) ) / delta;
130 double csq = ( x1 - a ) * ( x1 - a ) + ( y1 - b ) * ( y1 - b );
131 c = sqrt( csq );
132 double csq2 = ( x2 - a ) * ( x2 - a ) + ( y2 - b ) * ( y2 - b );
133 double csq3 = ( x3 - a ) * ( x3 - a ) + ( y3 - b ) * ( y3 - b );
134 m_kappa = 1 / ( 2 * c );
135 m_alpha = -2 * a * m_kappa;
136 m_beta = -2 * b * m_kappa;
137 m_gamma = ( a * a + b * b - c * c ) * m_kappa;
138 }
139}
140
141HepMatrix Lpar::dldc() const
142#ifdef BELLE_OPTIMIZED_RETURN
143 return vret( 3, 4 );
144{
145#else
146{
147 HepMatrix vret( 3, 4 );
148#endif
149 Cpar cp( *this );
150 double xi = cp.xi();
151 double s = cp.sfi();
152 double c = cp.cfi();
153 vret( 1, 1 ) = 2 * cp.da() * s;
154 vret( 1, 2 ) = -2 * cp.da() * c;
155 vret( 1, 3 ) = cp.da() * cp.da();
156 vret( 1, 4 ) = 1;
157 vret( 2, 1 ) = xi * c;
158 vret( 2, 2 ) = xi * s;
159 vret( 2, 3 ) = 0;
160 vret( 2, 4 ) = 0;
161 vret( 3, 1 ) = 2 * cp.cu() * s;
162 vret( 3, 2 ) = -2 * cp.cu() * c;
163 vret( 3, 3 ) = xi;
164 vret( 3, 4 ) = 0;
165 return vret;
166}
167
168bool Lpar::xy( double r, double& x, double& y, int dir ) const {
169 double t_kr2g = kr2g( r );
170 double t_xi2 = xi2();
171 double ro = r * r * t_xi2 - t_kr2g * t_kr2g;
172 if ( ro < 0 ) return false;
173 double rs = sqrt( ro );
174 if ( dir == 0 )
175 {
176 x = ( -m_alpha * t_kr2g - m_beta * rs ) / t_xi2;
177 y = ( -m_beta * t_kr2g + m_alpha * rs ) / t_xi2;
178 }
179 else
180 {
181 x = ( -m_alpha * t_kr2g + m_beta * rs ) / t_xi2;
182 y = ( -m_beta * t_kr2g - m_alpha * rs ) / t_xi2;
183 }
184 return true;
185}
186
187double Lpar::x( double r ) const {
188 double t_x, t_y;
189 xy( r, t_x, t_y );
190 return t_x;
191}
192
193double Lpar::y( double r ) const {
194 double t_x, t_y;
195 xy( r, t_x, t_y );
196 return t_y;
197}
198
199double Lpar::phi( double r, int dir ) const {
200 double x, y;
201 if ( !xy( r, x, y, dir ) ) return -1;
202 double p = atan2( y, x );
203 if ( p < 0 ) p += ( 2 * M_PI );
204 return p;
205}
206
207void Lpar::xhyh( double x, double y, double& xh, double& yh ) const {
208 double ddm = dr( x, y );
209 if ( ddm == 0 )
210 {
211 xh = x;
212 yh = y;
213 return;
214 }
215 double kdp1 = 1 + 2 * kappa() * ddm;
216 xh = x - ddm * ( 2 * kappa() * x + alpha() ) / kdp1;
217 yh = y - ddm * ( 2 * kappa() * y + beta() ) / kdp1;
218}
219
220double Lpar::s( double x, double y ) const {
221 double xh, yh, xx, yy;
222 xhyh( x, y, xh, yh );
223 double fk = fabs( kappa() );
224 if ( fk == 0 ) return 0;
225 yy = 2 * fk * ( alpha() * yh - beta() * xh );
226 xx = 2 * kappa() * ( alpha() * xh + beta() * yh ) + xi2();
227 double sp = atan2( yy, xx );
228 if ( sp < 0 ) sp += ( 2 * M_PI );
229 return sp / 2 / fk;
230}
231
232double Lpar::s( double r, int dir ) const {
233 double d0 = da();
234 if ( fabs( r ) < fabs( d0 ) ) return -1;
235 double b = fabs( kappa() ) * sqrt( ( r * r - d0 * d0 ) / ( 1 + 2 * kappa() * d0 ) );
236 if ( fabs( b ) > 1 ) return -1;
237 if ( dir == 0 ) return asin( b ) / fabs( kappa() );
238 return ( M_PI - asin( b ) ) / fabs( kappa() );
239}
240
241HepVector Lpar::center() const
242#ifdef BELLE_OPTIMIZED_RETURN
243 return v( 3 );
244{
245#else
246{
247 HepVector v( 3 );
248#endif
249 v( 1 ) = xc();
250 v( 2 ) = yc();
251 v( 3 ) = 0;
252 return ( v );
253}
254
255int intersect( const Lpar& lp1, const Lpar& lp2, HepVector& v1, HepVector& v2 ) {
256 HepVector cen1( lp1.center() );
257 HepVector cen2( lp2.center() );
258 double dx = cen1( 1 ) - cen2( 1 );
259 double dy = cen1( 2 ) - cen2( 2 );
260 double dc = sqrt( dx * dx + dy * dy );
261 if ( dc < fabs( 0.5 / lp1.kappa() ) + fabs( 0.5 / lp2.kappa() ) )
262 {
263 double a1 = std::sqrt( lp1.alpha() ) + std::sqrt( lp1.beta() );
264 double a2 = std::sqrt( lp2.alpha() ) + std::sqrt( lp2.beta() );
265 double a3 = lp1.alpha() * lp2.alpha() + lp1.beta() * lp2.beta();
266 double det = lp1.alpha() * lp2.beta() - lp1.beta() * lp2.alpha();
267 if ( fabs( det ) > 1e-12 )
268 {
269 double c1 = a2 * std::sqrt( lp1.kappa() ) + a1 * std::sqrt( lp2.kappa() ) -
270 2.0 * a3 * lp1.kappa() * lp2.kappa();
271 if ( c1 != 0 )
272 {
273 double cinv = 1.0 / c1;
274 double c2 = std::sqrt( a3 ) - 0.5 * ( a1 + a2 ) -
275 2.0 * a3 * ( lp1.gamma() * lp2.kappa() + lp2.gamma() * lp1.kappa() );
276 double c3 = a2 * std::sqrt( lp1.gamma() ) + a1 * std::sqrt( lp2.gamma() ) -
277 2.0 * a3 * lp1.gamma() * lp2.gamma();
278 double root = std::sqrt( c2 ) - 4.0 * c1 * c3;
279 if ( root >= 0 )
280 {
281 root = sqrt( root );
282 double rad2[2];
283 rad2[0] = 0.5 * cinv * ( -c2 - root );
284 rad2[1] = 0.5 * cinv * ( -c2 + root );
285 double ab1 = -( lp2.beta() * lp1.gamma() - lp1.beta() * lp2.gamma() );
286 double ab2 = ( lp2.alpha() * lp1.gamma() - lp1.alpha() * lp2.gamma() );
287 double ac1 = -( lp2.beta() * lp1.kappa() - lp1.beta() * lp2.kappa() );
288 double ac2 = ( lp2.alpha() * lp1.kappa() - lp1.alpha() * lp2.kappa() );
289 double dinv = 1.0 / det;
290 v1( 1 ) = dinv * ( ab1 + ac1 * rad2[0] );
291 v1( 2 ) = dinv * ( ab2 + ac2 * rad2[0] );
292 v1( 3 ) = 0;
293 v2( 1 ) = dinv * ( ab1 + ac1 * rad2[1] );
294 v2( 2 ) = dinv * ( ab2 + ac2 * rad2[1] );
295 v2( 3 ) = 0;
296 double d1 = lp1.d( v1( 1 ), v1( 2 ) );
297 double d2 = lp2.d( v1( 1 ), v1( 2 ) );
298 double d3 = lp1.d( v2( 1 ), v2( 2 ) );
299 double d4 = lp2.d( v2( 1 ), v2( 2 ) );
300 double r = sqrt( rad2[0] );
301 Lpar::Cpar cp1( lp1 );
302 Lpar::Cpar cp2( lp2 );
303 for ( int j = 0; j < 2; j++ )
304 {
305 double s1, s2;
306 if ( j == 0 )
307 {
308 s1 = lp1.s( v1( 1 ), v1( 2 ) );
309 s2 = lp2.s( v1( 1 ), v1( 2 ) );
310 }
311 else
312 {
313 s1 = lp1.s( v2( 1 ), v2( 2 ) );
314 s2 = lp2.s( v2( 1 ), v2( 2 ) );
315 }
316 double phi1 = cp1.fi() + 2 * cp1.cu() * s1;
317 double phi2 = cp2.fi() + 2 * cp2.cu() * s2;
318 double f = ( 1 + 2 * cp1.cu() * cp1.da() ) * ( 1 + 2 * cp2.cu() * cp2.da() ) *
319 cos( cp1.fi() - cp2.fi() );
320 f -= 2 * ( lp1.gamma() * lp2.kappa() + lp2.gamma() * lp1.kappa() );
321 double cosphi12 = f;
322 }
323 return 2;
324 }
325 }
326 }
327 }
328 return 0;
329}
330
331//
332// const member functions
333//
334
335//
336// static member functions
337//
338
339std::ostream& operator<<( std::ostream& o, Lpar& s ) {
340 return o << " al=" << s.m_alpha << " be=" << s.m_beta << " ka=" << s.m_kappa
341 << " ga=" << s.m_gamma;
342}
std::string root
TFile f("ana_bhabha660a_dqa_mcPat_zy_old.root")
Double_t phi2
Double_t phi1
double alpha
int dc[18]
Definition EvtPycont.cc:63
XmlRpcServer s
**********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
Definition KarLud.h:35
#define M_PI
Definition TConstant.h:4
double dr(double x, double y) const
friend std::ostream & operator<<(std::ostream &o, Lpar &)
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
virtual ~Lpar()
double phi(double r, int dir=0) const
HepVector center() const