BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
Reconstruction/TrackUtil/src/Helix.cxx
Go to the documentation of this file.
1//
2// $Id: Helix.cxx,v 1.4 2011/05/12 10:25:28 wangll Exp $
3//
4// Class Helix
5//
6// Author Date comments
7// Y.Ohnishi 03/01/1997 original version
8// Y.Ohnishi 06/03/1997 updated
9// Y.Iwasaki 17/02/1998 BFILED removed, func. name changed, func. added
10// J.Tanaka 06/12/1998 add some utilities.
11// Y.Iwasaki 07/07/1998 cache added to speed up
12//
13#include "TrackUtil/Helix.h"
14#include "CLHEP/Matrix/Matrix.h"
15#include "GaudiKernel/Bootstrap.h"
16#include "GaudiKernel/IDataProviderSvc.h"
17#include "GaudiKernel/IInterface.h"
18#include "GaudiKernel/IMessageSvc.h"
19#include "GaudiKernel/ISvcLocator.h"
20#include "GaudiKernel/Kernel.h"
21#include "GaudiKernel/MsgStream.h"
22#include "GaudiKernel/Service.h"
23#include "GaudiKernel/SmartDataPtr.h"
24#include "GaudiKernel/StatusCode.h"
25#include <float.h>
26#include <iostream>
27#include <math.h>
28
29// const double
30// Helix::m_BFIELD = 10.0; // KG
31// const double
32// Helix::m_ALPHA = 222.376063; // = 10000. / 2.99792458 / BFIELD
33// now Helix::m_ALPHA = 333.564095;
34
35const double M_PI2 = 2. * M_PI;
36
37const double M_PI4 = 4. * M_PI;
38
39const double M_PI8 = 8. * M_PI;
40
41const double Helix::ConstantAlpha = 333.564095;
42
43Helix::Helix( const HepPoint3D& pivot, const HepVector& a,
44 const HepSymMatrix& Ea )
45 : // m_bField(-10.0),
46 // m_alpha(-333.564095),
47 m_pivot( pivot )
48 , m_a( a )
49 , m_matrixValid( true )
50 , m_Ea( Ea ) {
51 StatusCode scmgn = Gaudi::svcLocator()->service( "MagneticFieldSvc", m_pmgnIMF );
52 if ( scmgn != StatusCode::SUCCESS )
53 { std::cout << "Unable to open Magnetic field service" << std::endl; }
54 m_bField = -10000 * ( m_pmgnIMF->getReferField() );
55 m_alpha = 10000. / 2.99792458 / m_bField;
56 // m_alpha = 10000. / 2.99792458 / m_bField;
57 // m_alpha = 333.564095;
58 updateCache();
59}
60
62 const HepVector& a )
63 : // m_bField(-10.0),
64 // m_alpha(-333.564095),
65 m_pivot( pivot )
66 , m_a( a )
67 , m_matrixValid( false )
68 , m_Ea( HepSymMatrix( 5, 0 ) ) {
69 StatusCode scmgn = Gaudi::svcLocator()->service( "MagneticFieldSvc", m_pmgnIMF );
70 if ( scmgn != StatusCode::SUCCESS )
71 {
72 // log << MSG::ERROR << "Unable to open Magnetic field service"<<endmsg;
73 std::cout << "Unable to open Magnetic field service" << std::endl;
74 }
75 m_bField = -10000 * ( m_pmgnIMF->getReferField() );
76 m_alpha = 10000. / 2.99792458 / m_bField;
77 // m_alpha = 333.564095;
78 // cout<<"MdcFastTrakAlg:: bField,alpha: "<<m_bField<<" , "<<m_alpha<<endl;
79 updateCache();
80}
81
82Helix::Helix( const HepPoint3D& position, const Hep3Vector& momentum,
83 double charge )
84 : // m_bField(-10.0),
85 // m_alpha(-333.564095),
86 m_pivot( position )
87 , m_a( HepVector( 5, 0 ) )
88 , m_matrixValid( false )
89 , m_Ea( HepSymMatrix( 5, 0 ) ) {
90 StatusCode scmgn = Gaudi::svcLocator()->service( "MagneticFieldSvc", m_pmgnIMF );
91 if ( scmgn != StatusCode::SUCCESS )
92 {
93 // log << MSG::ERROR << "Unable to open Magnetic field service"<<endmsg;
94 std::cout << "Unable to open Magnetic field service" << std::endl;
95 }
96 m_bField = -10000 * ( m_pmgnIMF->getReferField() );
97 m_alpha = 10000. / 2.99792458 / m_bField;
98
99 m_a[0] = 0.;
100 m_a[1] = fmod( atan2( -momentum.x(), momentum.y() ) + M_PI4, M_PI2 );
101 m_a[3] = 0.;
102 double perp( momentum.perp() );
103 if ( perp != 0.0 )
104 {
105 m_a[2] = charge / perp;
106 m_a[4] = momentum.z() / perp;
107 }
108 else
109 {
110 m_a[2] = charge * ( DBL_MAX );
111 if ( momentum.z() >= 0 ) { m_a[4] = ( DBL_MAX ); }
112 else { m_a[4] = -( DBL_MAX ); }
113 }
114 // m_alpha = 333.564095;
115 updateCache();
116}
117
119
120HepPoint3D Helix::x( double phi ) const {
121 //
122 // Calculate position (x,y,z) along helix.
123 //
124 // x = x0 + dr * cos(phi0) + (alpha / kappa) * (cos(phi0) - cos(phi0+phi))
125 // y = y0 + dr * sin(phi0) + (alpha / kappa) * (sin(phi0) - sin(phi0+phi))
126 // z = z0 + dz - (alpha / kappa) * tan(lambda) * phi
127 //
128
129 double x = m_pivot.x() + m_ac[0] * m_cp + m_r * ( m_cp - cos( m_ac[1] + phi ) );
130 double y = m_pivot.y() + m_ac[0] * m_sp + m_r * ( m_sp - sin( m_ac[1] + phi ) );
131 double z = m_pivot.z() + m_ac[3] - m_r * m_ac[4] * phi;
132
133 return HepPoint3D( x, y, z );
134}
135
136double* Helix::x( double phi, double p[3] ) const {
137 //
138 // Calculate position (x,y,z) along helix.
139 //
140 // x = x0 + dr * cos(phi0) + (alpha / kappa) * (cos(phi0) - cos(phi0+phi))
141 // y = y0 + dr * sin(phi0) + (alpha / kappa) * (sin(phi0) - sin(phi0+phi))
142 // z = z0 + dz - (alpha / kappa) * tan(lambda) * phi
143 //
144
145 p[0] = m_pivot.x() + m_ac[0] * m_cp + m_r * ( m_cp - cos( m_ac[1] + phi ) );
146 p[1] = m_pivot.y() + m_ac[0] * m_sp + m_r * ( m_sp - sin( m_ac[1] + phi ) );
147 p[2] = m_pivot.z() + m_ac[3] - m_r * m_ac[4] * phi;
148
149 return p;
150}
151
152HepPoint3D Helix::x( double phi, HepSymMatrix& Ex ) const {
153 double x = m_pivot.x() + m_ac[0] * m_cp + m_r * ( m_cp - cos( m_ac[1] + phi ) );
154 double y = m_pivot.y() + m_ac[0] * m_sp + m_r * ( m_sp - sin( m_ac[1] + phi ) );
155 double z = m_pivot.z() + m_ac[3] - m_r * m_ac[4] * phi;
156
157 //
158 // Calculate position error matrix.
159 // Ex(phi) = (@x/@a)(Ea)(@x/@a)^T, phi is deflection angle to specify the
160 // point to be calcualted.
161 //
162 // HepMatrix dXDA(3, 5, 0);
163 // dXDA = delXDelA(phi);
164 // Ex.assign(dXDA * m_Ea * dXDA.T());
165
166 if ( m_matrixValid ) Ex = m_Ea.similarity( delXDelA( phi ) );
167 else Ex = m_Ea;
168
169 return HepPoint3D( x, y, z );
170}
171
172Hep3Vector Helix::momentum( double phi ) const {
173 //
174 // Calculate momentum.
175 //
176 // Pt = | 1/kappa | (GeV/c)
177 //
178 // Px = -Pt * sin(phi0 + phi)
179 // Py = Pt * cos(phi0 + phi)
180 // Pz = Pt * tan(lambda)
181 //
182
183 double pt = fabs( m_pt );
184 double px = -pt * sin( m_ac[1] + phi );
185 double py = pt * cos( m_ac[1] + phi );
186 double pz = pt * m_ac[4];
187
188 return Hep3Vector( px, py, pz );
189}
190
191Hep3Vector Helix::momentum( double phi, HepSymMatrix& Em ) const {
192 //
193 // Calculate momentum.
194 //
195 // Pt = | 1/kappa | (GeV/c)
196 //
197 // Px = -Pt * sin(phi0 + phi)
198 // Py = Pt * cos(phi0 + phi)
199 // Pz = Pt * tan(lambda)
200 //
201
202 double pt = fabs( m_pt );
203 double px = -pt * sin( m_ac[1] + phi );
204 double py = pt * cos( m_ac[1] + phi );
205 double pz = pt * m_ac[4];
206
207 if ( m_matrixValid ) Em = m_Ea.similarity( delMDelA( phi ) );
208 else Em = m_Ea;
209
210 return Hep3Vector( px, py, pz );
211}
212
213HepLorentzVector Helix::momentum( double phi, double mass ) const {
214 //
215 // Calculate momentum.
216 //
217 // Pt = | 1/kappa | (GeV/c)
218 //
219 // Px = -Pt * sin(phi0 + phi)
220 // Py = Pt * cos(phi0 + phi)
221 // Pz = Pt * tan(lambda)
222 //
223 // E = sqrt( 1/kappa/kappa * (1+tan(lambda)*tan(lambda)) + mass*mass )
224
225 double pt = fabs( m_pt );
226 double px = -pt * sin( m_ac[1] + phi );
227 double py = pt * cos( m_ac[1] + phi );
228 double pz = pt * m_ac[4];
229 double E = sqrt( pt * pt * ( 1. + m_ac[4] * m_ac[4] ) + mass * mass );
230
231 return HepLorentzVector( px, py, pz, E );
232}
233
234HepLorentzVector Helix::momentum( double phi, double mass, HepSymMatrix& Em ) const {
235 //
236 // Calculate momentum.
237 //
238 // Pt = | 1/kappa | (GeV/c)
239 //
240 // Px = -Pt * sin(phi0 + phi)
241 // Py = Pt * cos(phi0 + phi)
242 // Pz = Pt * tan(lambda)
243 //
244 // E = sqrt( 1/kappa/kappa * (1+tan(lambda)*tan(lambda)) + mass*mass )
245
246 double pt = fabs( m_pt );
247 double px = -pt * sin( m_ac[1] + phi );
248 double py = pt * cos( m_ac[1] + phi );
249 double pz = pt * m_ac[4];
250 double E = sqrt( pt * pt * ( 1. + m_ac[4] * m_ac[4] ) + mass * mass );
251
252 if ( m_matrixValid ) Em = m_Ea.similarity( del4MDelA( phi, mass ) );
253 else Em = m_Ea;
254
255 return HepLorentzVector( px, py, pz, E );
256}
257
258HepLorentzVector Helix::momentum( double phi, double mass, HepPoint3D& x,
259 HepSymMatrix& Emx ) const {
260 //
261 // Calculate momentum.
262 //
263 // Pt = | 1/kappa | (GeV/c)
264 //
265 // Px = -Pt * sin(phi0 + phi)
266 // Py = Pt * cos(phi0 + phi)
267 // Pz = Pt * tan(lambda)
268 //
269 // E = sqrt( 1/kappa/kappa * (1+tan(lambda)*tan(lambda)) + mass*mass )
270
271 double pt = fabs( m_pt );
272 double px = -pt * sin( m_ac[1] + phi );
273 double py = pt * cos( m_ac[1] + phi );
274 double pz = pt * m_ac[4];
275 double E = sqrt( pt * pt * ( 1. + m_ac[4] * m_ac[4] ) + mass * mass );
276
277 x.setX( m_pivot.x() + m_ac[0] * m_cp + m_r * ( m_cp - cos( m_ac[1] + phi ) ) );
278 x.setY( m_pivot.y() + m_ac[0] * m_sp + m_r * ( m_sp - sin( m_ac[1] + phi ) ) );
279 x.setZ( m_pivot.z() + m_ac[3] - m_r * m_ac[4] * phi );
280
281 if ( m_matrixValid ) Emx = m_Ea.similarity( del4MXDelA( phi, mass ) );
282 else Emx = m_Ea;
283
284 return HepLorentzVector( px, py, pz, E );
285}
286
287const HepPoint3D& Helix::pivot( const HepPoint3D& newPivot ) {
288 const double& dr = m_ac[0];
289 const double& phi0 = m_ac[1];
290 const double& kappa = m_ac[2];
291 const double& dz = m_ac[3];
292 const double& tanl = m_ac[4];
293
294 double rdr = dr + m_r;
295 double phi = fmod( phi0 + M_PI4, M_PI2 );
296 double csf0 = cos( phi );
297 double snf0 = ( 1. - csf0 ) * ( 1. + csf0 );
298 snf0 = sqrt( ( snf0 > 0. ) ? snf0 : 0. );
299 if ( phi > M_PI ) snf0 = -snf0;
300
301 double xc = m_pivot.x() + rdr * csf0;
302 double yc = m_pivot.y() + rdr * snf0;
303 double csf, snf;
304 if ( m_r != 0.0 )
305 {
306 csf = ( xc - newPivot.x() ) / m_r;
307 snf = ( yc - newPivot.y() ) / m_r;
308 double anrm = sqrt( csf * csf + snf * snf );
309 if ( anrm != 0.0 )
310 {
311 csf /= anrm;
312 snf /= anrm;
313 phi = atan2( snf, csf );
314 }
315 else
316 {
317 csf = 1.0;
318 snf = 0.0;
319 phi = 0.0;
320 }
321 }
322 else
323 {
324 csf = 1.0;
325 snf = 0.0;
326 phi = 0.0;
327 }
328 double phid = fmod( phi - phi0 + M_PI8, M_PI2 );
329 if ( phid > M_PI ) phid = phid - M_PI2;
330 double drp = ( m_pivot.x() + dr * csf0 + m_r * ( csf0 - csf ) - newPivot.x() ) * csf +
331 ( m_pivot.y() + dr * snf0 + m_r * ( snf0 - snf ) - newPivot.y() ) * snf;
332 double dzp = m_pivot.z() + dz - m_r * tanl * phid - newPivot.z();
333
334 HepVector ap( 5 );
335 ap[0] = drp;
336 ap[1] = fmod( phi + M_PI4, M_PI2 );
337 ap[2] = kappa;
338 ap[3] = dzp;
339 ap[4] = tanl;
340
341 // if (m_matrixValid) m_Ea.assign(delApDelA(ap) * m_Ea * delApDelA(ap).T());
342 if ( m_matrixValid ) m_Ea = m_Ea.similarity( delApDelA( ap ) );
343
344 m_a = ap;
345 m_pivot = newPivot;
346
347 //...Are these needed?...iw...
348 updateCache();
349 return m_pivot;
350}
351
352void Helix::set( const HepPoint3D& pivot, const HepVector& a, const HepSymMatrix& Ea ) {
353 m_pivot = pivot;
354 m_a = a;
355 m_Ea = Ea;
356 m_matrixValid = true;
357 updateCache();
358}
359
361 if ( this == &i ) return *this;
362
363 m_bField = i.m_bField;
364 m_alpha = i.m_alpha;
365 m_pivot = i.m_pivot;
366 m_a = i.m_a;
367 m_Ea = i.m_Ea;
368 m_matrixValid = i.m_matrixValid;
369
370 m_center = i.m_center;
371 m_cp = i.m_cp;
372 m_sp = i.m_sp;
373 m_pt = i.m_pt;
374 m_r = i.m_r;
375 m_ac[0] = i.m_ac[0];
376 m_ac[1] = i.m_ac[1];
377 m_ac[2] = i.m_ac[2];
378 m_ac[3] = i.m_ac[3];
379 m_ac[4] = i.m_ac[4];
380
381 return *this;
382}
383
384void Helix::updateCache( void ) {
385 //
386 // Calculate Helix center( xc, yc ).
387 //
388 // xc = x0 + (dr + (alpha / kappa)) * cos(phi0) (cm)
389 // yc = y0 + (dr + (alpha / kappa)) * sin(phi0) (cm)
390 //
391
392 m_ac[0] = m_a[0];
393 m_ac[1] = m_a[1];
394 m_ac[2] = m_a[2];
395 m_ac[3] = m_a[3];
396 m_ac[4] = m_a[4];
397
398 m_cp = cos( m_ac[1] );
399 m_sp = sin( m_ac[1] );
400 if ( m_ac[2] != 0.0 )
401 {
402 m_pt = 1. / m_ac[2];
403 m_r = m_alpha / m_ac[2];
404 }
405 else
406 {
407 m_pt = ( DBL_MAX );
408 m_r = ( DBL_MAX );
409 }
410
411 double x = m_pivot.x() + ( m_ac[0] + m_r ) * m_cp;
412 double y = m_pivot.y() + ( m_ac[0] + m_r ) * m_sp;
413 m_center.setX( x );
414 m_center.setY( y );
415 m_center.setZ( 0. );
416}
417
418HepMatrix Helix::delApDelA( const HepVector& ap ) const {
419 //
420 // Calculate Jacobian (@ap/@a)
421 // Vector ap is new helix parameters and a is old helix parameters.
422 //
423
424 HepMatrix dApDA( 5, 5, 0 );
425
426 const double& dr = m_ac[0];
427 const double& phi0 = m_ac[1];
428 const double& cpa = m_ac[2];
429 const double& dz = m_ac[3];
430 const double& tnl = m_ac[4];
431
432 double drp = ap[0];
433 double phi0p = ap[1];
434 double cpap = ap[2];
435 double dzp = ap[3];
436 double tnlp = ap[4];
437
438 double rdr = m_r + dr;
439 double rdrpr;
440 if ( ( m_r + drp ) != 0.0 ) { rdrpr = 1. / ( m_r + drp ); }
441 else { rdrpr = ( DBL_MAX ); }
442 // double csfd = cos(phi0)*cos(phi0p) + sin(phi0)*sin(phi0p);
443 // double snfd = cos(phi0)*sin(phi0p) - sin(phi0)*cos(phi0p);
444 double csfd = cos( phi0p - phi0 );
445 double snfd = sin( phi0p - phi0 );
446 double phid = fmod( phi0p - phi0 + M_PI8, M_PI2 );
447 if ( phid > M_PI ) phid = phid - M_PI2;
448
449 dApDA[0][0] = csfd;
450 dApDA[0][1] = rdr * snfd;
451 if ( cpa != 0.0 ) { dApDA[0][2] = ( m_r / cpa ) * ( 1.0 - csfd ); }
452 else { dApDA[0][2] = ( DBL_MAX ); }
453
454 dApDA[1][0] = -rdrpr * snfd;
455 dApDA[1][1] = rdr * rdrpr * csfd;
456 if ( cpa != 0.0 ) { dApDA[1][2] = ( m_r / cpa ) * rdrpr * snfd; }
457 else { dApDA[1][2] = ( DBL_MAX ); }
458
459 dApDA[2][2] = 1.0;
460
461 dApDA[3][0] = m_r * rdrpr * tnl * snfd;
462 dApDA[3][1] = m_r * tnl * ( 1.0 - rdr * rdrpr * csfd );
463 if ( cpa != 0.0 ) { dApDA[3][2] = ( m_r / cpa ) * tnl * ( phid - m_r * rdrpr * snfd ); }
464 else { dApDA[3][2] = ( DBL_MAX ); }
465 dApDA[3][3] = 1.0;
466 dApDA[3][4] = -m_r * phid;
467
468 dApDA[4][4] = 1.0;
469
470 return dApDA;
471}
472
473HepMatrix Helix::delXDelA( double phi ) const {
474 //
475 // Calculate Jacobian (@x/@a)
476 // Vector a is helix parameters and phi is internal parameter
477 // which specifys the point to be calculated for Ex(phi).
478 //
479
480 HepMatrix dXDA( 3, 5, 0 );
481
482 const double& dr = m_ac[0];
483 const double& phi0 = m_ac[1];
484 const double& cpa = m_ac[2];
485 const double& dz = m_ac[3];
486 const double& tnl = m_ac[4];
487
488 double cosf0phi = cos( phi0 + phi );
489 double sinf0phi = sin( phi0 + phi );
490
491 dXDA[0][0] = m_cp;
492 dXDA[0][1] = -dr * m_sp + m_r * ( -m_sp + sinf0phi );
493 if ( cpa != 0.0 ) { dXDA[0][2] = -( m_r / cpa ) * ( m_cp - cosf0phi ); }
494 else { dXDA[0][2] = ( DBL_MAX ); }
495 // dXDA[0][3] = 0.0;
496 // dXDA[0][4] = 0.0;
497
498 dXDA[1][0] = m_sp;
499 dXDA[1][1] = dr * m_cp + m_r * ( m_cp - cosf0phi );
500 if ( cpa != 0.0 ) { dXDA[1][2] = -( m_r / cpa ) * ( m_sp - sinf0phi ); }
501 else { dXDA[1][2] = ( DBL_MAX ); }
502 // dXDA[1][3] = 0.0;
503 // dXDA[1][4] = 0.0;
504
505 // dXDA[2][0] = 0.0;
506 // dXDA[2][1] = 0.0;
507 if ( cpa != 0.0 ) { dXDA[2][2] = ( m_r / cpa ) * tnl * phi; }
508 else { dXDA[2][2] = ( DBL_MAX ); }
509 dXDA[2][3] = 1.0;
510 dXDA[2][4] = -m_r * phi;
511
512 return dXDA;
513}
514
515HepMatrix Helix::delMDelA( double phi ) const {
516 //
517 // Calculate Jacobian (@m/@a)
518 // Vector a is helix parameters and phi is internal parameter.
519 // Vector m is momentum.
520 //
521
522 HepMatrix dMDA( 3, 5, 0 );
523
524 const double& phi0 = m_ac[1];
525 const double& cpa = m_ac[2];
526 const double& tnl = m_ac[4];
527
528 double cosf0phi = cos( phi0 + phi );
529 double sinf0phi = sin( phi0 + phi );
530
531 double rho;
532 if ( cpa != 0. ) rho = 1. / cpa;
533 else rho = ( DBL_MAX );
534
535 double charge = 1.;
536 if ( cpa < 0. ) charge = -1.;
537
538 dMDA[0][1] = -fabs( rho ) * cosf0phi;
539 dMDA[0][2] = charge * rho * rho * sinf0phi;
540
541 dMDA[1][1] = -fabs( rho ) * sinf0phi;
542 dMDA[1][2] = -charge * rho * rho * cosf0phi;
543
544 dMDA[2][2] = -charge * rho * rho * tnl;
545 dMDA[2][4] = fabs( rho );
546
547 return dMDA;
548}
549
550HepMatrix Helix::del4MDelA( double phi, double mass ) const {
551 //
552 // Calculate Jacobian (@4m/@a)
553 // Vector a is helix parameters and phi is internal parameter.
554 // Vector 4m is 4 momentum.
555 //
556
557 HepMatrix d4MDA( 4, 5, 0 );
558
559 double phi0 = m_ac[1];
560 double cpa = m_ac[2];
561 double tnl = m_ac[4];
562
563 double cosf0phi = cos( phi0 + phi );
564 double sinf0phi = sin( phi0 + phi );
565
566 double rho;
567 if ( cpa != 0. ) rho = 1. / cpa;
568 else rho = ( DBL_MAX );
569
570 double charge = 1.;
571 if ( cpa < 0. ) charge = -1.;
572
573 double E = sqrt( rho * rho * ( 1. + tnl * tnl ) + mass * mass );
574
575 d4MDA[0][1] = -fabs( rho ) * cosf0phi;
576 d4MDA[0][2] = charge * rho * rho * sinf0phi;
577
578 d4MDA[1][1] = -fabs( rho ) * sinf0phi;
579 d4MDA[1][2] = -charge * rho * rho * cosf0phi;
580
581 d4MDA[2][2] = -charge * rho * rho * tnl;
582 d4MDA[2][4] = fabs( rho );
583
584 if ( cpa != 0.0 && E != 0.0 )
585 {
586 d4MDA[3][2] = ( -1. - tnl * tnl ) / ( cpa * cpa * cpa * E );
587 d4MDA[3][4] = tnl / ( cpa * cpa * E );
588 }
589 else
590 {
591 d4MDA[3][2] = ( DBL_MAX );
592 d4MDA[3][4] = ( DBL_MAX );
593 }
594 return d4MDA;
595}
596
597HepMatrix Helix::del4MXDelA( double phi, double mass ) const {
598 //
599 // Calculate Jacobian (@4mx/@a)
600 // Vector a is helix parameters and phi is internal parameter.
601 // Vector 4xm is 4 momentum and position.
602 //
603
604 HepMatrix d4MXDA( 7, 5, 0 );
605
606 const double& dr = m_ac[0];
607 const double& phi0 = m_ac[1];
608 const double& cpa = m_ac[2];
609 const double& dz = m_ac[3];
610 const double& tnl = m_ac[4];
611
612 double cosf0phi = cos( phi0 + phi );
613 double sinf0phi = sin( phi0 + phi );
614
615 double rho;
616 if ( cpa != 0. ) rho = 1. / cpa;
617 else rho = ( DBL_MAX );
618
619 double charge = 1.;
620 if ( cpa < 0. ) charge = -1.;
621
622 double E = sqrt( rho * rho * ( 1. + tnl * tnl ) + mass * mass );
623
624 d4MXDA[0][1] = -fabs( rho ) * cosf0phi;
625 d4MXDA[0][2] = charge * rho * rho * sinf0phi;
626
627 d4MXDA[1][1] = -fabs( rho ) * sinf0phi;
628 d4MXDA[1][2] = -charge * rho * rho * cosf0phi;
629
630 d4MXDA[2][2] = -charge * rho * rho * tnl;
631 d4MXDA[2][4] = fabs( rho );
632
633 if ( cpa != 0.0 && E != 0.0 )
634 {
635 d4MXDA[3][2] = ( -1. - tnl * tnl ) / ( cpa * cpa * cpa * E );
636 d4MXDA[3][4] = tnl / ( cpa * cpa * E );
637 }
638 else
639 {
640 d4MXDA[3][2] = ( DBL_MAX );
641 d4MXDA[3][4] = ( DBL_MAX );
642 }
643
644 d4MXDA[4][0] = m_cp;
645 d4MXDA[4][1] = -dr * m_sp + m_r * ( -m_sp + sinf0phi );
646 if ( cpa != 0.0 ) { d4MXDA[4][2] = -( m_r / cpa ) * ( m_cp - cosf0phi ); }
647 else { d4MXDA[4][2] = ( DBL_MAX ); }
648
649 d4MXDA[5][0] = m_sp;
650 d4MXDA[5][1] = dr * m_cp + m_r * ( m_cp - cosf0phi );
651 if ( cpa != 0.0 )
652 {
653 d4MXDA[5][2] = -( m_r / cpa ) * ( m_sp - sinf0phi );
654
655 d4MXDA[6][2] = ( m_r / cpa ) * tnl * phi;
656 }
657 else
658 {
659 d4MXDA[5][2] = ( DBL_MAX );
660
661 d4MXDA[6][2] = ( DBL_MAX );
662 }
663
664 d4MXDA[6][3] = 1.;
665 d4MXDA[6][4] = -m_r * phi;
666
667 return d4MXDA;
668}
669
671 m_matrixValid = false;
672 m_Ea *= 0.;
673}
const double M_PI8
const double M_PI2
const double M_PI4
double mass
HepGeom::Point3D< double > HepPoint3D
Double_t x[10]
NTuple::Item< double > m_pt
HepGeom::Point3D< double > HepPoint3D
#define M_PI
Definition TConstant.h:4
HepMatrix delApDelA(const HepVector &ap) const
HepMatrix delMDelA(double phi) const
void set(const HepPoint3D &pivot, const HepVector &a, const HepSymMatrix &Ea)
sets helix pivot position, parameters, and error matrix.
Helix & operator=(const Helix &)
Copy operator.
HepMatrix del4MXDelA(double phi, double mass) const
Hep3Vector momentum(double dPhi=0.) const
returns momentum vector after rotating angle dPhi in phi direction.
const HepSymMatrix & Ea(void) const
returns error matrix.
HepPoint3D x(double dPhi=0.) const
returns position after rotating angle dPhi in phi direction.
HepMatrix del4MDelA(double phi, double mass) const
HepMatrix delXDelA(double phi) const
double dr(void) const
returns an element of parameters.
virtual ~Helix()
Destructor.
const HepVector & a(void) const
returns helix parameters.
Helix(const HepPoint3D &pivot, const HepVector &a, const HepSymMatrix &Ea)
Constructor with pivot, helix parameter a, and its error matrix.
const HepPoint3D & pivot(void) const
returns pivot position.