15#include "CLHEP/Matrix/Matrix.h"
16#include "GaudiKernel/Bootstrap.h"
17#include "GaudiKernel/IDataProviderSvc.h"
18#include "GaudiKernel/IInterface.h"
19#include "GaudiKernel/IMessageSvc.h"
20#include "GaudiKernel/ISvcLocator.h"
21#include "GaudiKernel/Kernel.h"
22#include "GaudiKernel/MsgStream.h"
23#include "GaudiKernel/Service.h"
24#include "GaudiKernel/SmartDataPtr.h"
25#include "GaudiKernel/StatusCode.h"
26#include "KalFitAlg/helix/Helix.h"
45 const HepSymMatrix&
Ea )
50 , m_matrixValid( true )
52 StatusCode scmgn = Gaudi::svcLocator()->service(
"MagneticFieldSvc", m_pmgnIMF );
53 if ( scmgn != StatusCode::SUCCESS )
54 { std::cout <<
"Unable to open Magnetic field service" << std::endl; }
55 m_bField = 10000 * ( m_pmgnIMF->getReferField() );
56 m_alpha = 10000. / 2.99792458 / m_bField;
68 , m_matrixValid( false )
69 , m_Ea( HepSymMatrix( 5, 0 ) ) {
70 StatusCode scmgn = Gaudi::svcLocator()->service(
"MagneticFieldSvc", m_pmgnIMF );
71 if ( scmgn != StatusCode::SUCCESS )
74 std::cout <<
"Unable to open Magnetic field service" << std::endl;
76 m_bField = 10000 * ( m_pmgnIMF->getReferField() );
77 m_alpha = 10000. / 2.99792458 / m_bField;
88 , m_a( HepVector( 5, 0 ) )
89 , m_matrixValid( false )
90 , m_Ea( HepSymMatrix( 5, 0 ) ) {
91 StatusCode scmgn = Gaudi::svcLocator()->service(
"MagneticFieldSvc", m_pmgnIMF );
92 if ( scmgn != StatusCode::SUCCESS )
95 std::cout <<
"Unable to open Magnetic field service" << std::endl;
97 m_bField = 10000 * ( m_pmgnIMF->getReferField() );
98 m_alpha = 10000. / 2.99792458 / m_bField;
106 m_a[2] = charge / perp;
113 else { m_a[4] = -(
DBL_MAX ); }
130 double x = m_pivot.x() + m_ac[0] * m_cp + m_r * ( m_cp -
cos( m_ac[1] + phi ) );
131 double y = m_pivot.y() + m_ac[0] * m_sp + m_r * ( m_sp -
sin( m_ac[1] + phi ) );
132 double z = m_pivot.z() + m_ac[3] - m_r * m_ac[4] * phi;
137 double*
Helix::x(
double phi,
double p[3] )
const {
146 p[0] = m_pivot.x() + m_ac[0] * m_cp + m_r * ( m_cp -
cos( m_ac[1] + phi ) );
147 p[1] = m_pivot.y() + m_ac[0] * m_sp + m_r * ( m_sp -
sin( m_ac[1] + phi ) );
148 p[2] = m_pivot.z() + m_ac[3] - m_r * m_ac[4] * phi;
154 double x = m_pivot.x() + m_ac[0] * m_cp + m_r * ( m_cp -
cos( m_ac[1] + phi ) );
155 double y = m_pivot.y() + m_ac[0] * m_sp + m_r * ( m_sp -
sin( m_ac[1] + phi ) );
156 double z = m_pivot.z() + m_ac[3] - m_r * m_ac[4] * phi;
167 if ( m_matrixValid ) Ex = m_Ea.similarity(
delXDelA( phi ) );
184 double pt = fabs( m_pt );
185 double px = -pt *
sin( m_ac[1] + phi );
186 double py = pt *
cos( m_ac[1] + phi );
187 double pz = pt * m_ac[4];
189 return Hep3Vector( px, py, pz );
203 double pt = fabs( m_pt );
204 double px = -pt *
sin( m_ac[1] + phi );
205 double py = pt *
cos( m_ac[1] + phi );
206 double pz = pt * m_ac[4];
208 if ( m_matrixValid ) Em = m_Ea.similarity(
delMDelA( phi ) );
211 return Hep3Vector( px, py, pz );
226 double pt = fabs( m_pt );
227 double px = -pt *
sin( m_ac[1] + phi );
228 double py = pt *
cos( m_ac[1] + phi );
229 double pz = pt * m_ac[4];
230 double E = sqrt( pt * pt * ( 1. + m_ac[4] * m_ac[4] ) +
mass *
mass );
232 return HepLorentzVector( px, py, pz, E );
247 double pt = fabs( m_pt );
248 double px = -pt *
sin( m_ac[1] + phi );
249 double py = pt *
cos( m_ac[1] + phi );
250 double pz = pt * m_ac[4];
251 double E = sqrt( pt * pt * ( 1. + m_ac[4] * m_ac[4] ) +
mass *
mass );
253 if ( m_matrixValid ) Em = m_Ea.similarity(
del4MDelA( phi,
mass ) );
256 return HepLorentzVector( px, py, pz, E );
260 HepSymMatrix& Emx )
const {
272 double pt = fabs( m_pt );
273 double px = -pt *
sin( m_ac[1] + phi );
274 double py = pt *
cos( m_ac[1] + phi );
275 double pz = pt * m_ac[4];
276 double E = sqrt( pt * pt * ( 1. + m_ac[4] * m_ac[4] ) +
mass *
mass );
278 x.setX( m_pivot.x() + m_ac[0] * m_cp + m_r * ( m_cp -
cos( m_ac[1] + phi ) ) );
279 x.setY( m_pivot.y() + m_ac[0] * m_sp + m_r * ( m_sp -
sin( m_ac[1] + phi ) ) );
280 x.setZ( m_pivot.z() + m_ac[3] - m_r * m_ac[4] * phi );
282 if ( m_matrixValid ) Emx = m_Ea.similarity(
del4MXDelA( phi,
mass ) );
285 return HepLorentzVector( px, py, pz, E );
293 const double&
dr = m_ac[0];
294 const double&
phi0 = m_ac[1];
295 const double&
kappa = m_ac[2];
296 const double&
dz = m_ac[3];
297 const double&
tanl = m_ac[4];
299 double rdr =
dr + m_r;
301 double csf0 =
cos( phi );
302 double snf0 = ( 1. - csf0 ) * ( 1. + csf0 );
303 snf0 = sqrt( ( snf0 > 0. ) ? snf0 : 0. );
304 if ( phi >
M_PI ) snf0 = -snf0;
306 double xc = m_pivot.x() + rdr * csf0;
307 double yc = m_pivot.y() + rdr * snf0;
311 csf = ( xc - newPivot.x() ) / m_r;
312 snf = ( yc - newPivot.y() ) / m_r;
313 double anrm = sqrt( csf * csf + snf * snf );
318 phi = atan2( snf, csf );
335 double drp = ( m_pivot.x() +
dr * csf0 + m_r * ( csf0 - csf ) - newPivot.x() ) * csf +
336 ( m_pivot.y() +
dr * snf0 + m_r * ( snf0 - snf ) - newPivot.y() ) * snf;
337 double dzp = m_pivot.z() +
dz - m_r *
tanl * phid - newPivot.z();
347 if ( m_matrixValid ) m_Ea = m_Ea.similarity(
delApDelA( ap ) );
361 m_matrixValid =
true;
366 if (
this == &i )
return *
this;
368 m_bField = i.m_bField;
373 m_matrixValid = i.m_matrixValid;
375 m_center = i.m_center;
389 void Helix::updateCache(
void ) {
405 m_cp =
cos( m_ac[1] );
406 m_sp =
sin( m_ac[1] );
407 if ( m_ac[2] != 0.0 )
410 m_r = m_alpha / m_ac[2];
418 double x = m_pivot.x() + ( m_ac[0] + m_r ) * m_cp;
419 double y = m_pivot.y() + ( m_ac[0] + m_r ) * m_sp;
431 HepMatrix dApDA( 5, 5, 0 );
433 const double&
dr = m_ac[0];
434 const double&
phi0 = m_ac[1];
435 const double& cpa = m_ac[2];
436 const double&
dz = m_ac[3];
437 const double& tnl = m_ac[4];
440 double phi0p = ap[1];
445 double rdr = m_r +
dr;
447 if ( ( m_r + drp ) != 0.0 ) { rdrpr = 1. / ( m_r + drp ); }
451 double csfd =
cos( phi0p -
phi0 );
452 double snfd =
sin( phi0p -
phi0 );
457 dApDA[0][1] = rdr * snfd;
458 if ( cpa != 0.0 ) { dApDA[0][2] = ( m_r / cpa ) * ( 1.0 - csfd ); }
459 else { dApDA[0][2] = (
DBL_MAX ); }
461 dApDA[1][0] = -rdrpr * snfd;
462 dApDA[1][1] = rdr * rdrpr * csfd;
463 if ( cpa != 0.0 ) { dApDA[1][2] = ( m_r / cpa ) * rdrpr * snfd; }
464 else { dApDA[1][2] = (
DBL_MAX ); }
468 dApDA[3][0] = m_r * rdrpr * tnl * snfd;
469 dApDA[3][1] = m_r * tnl * ( 1.0 - rdr * rdrpr * csfd );
470 if ( cpa != 0.0 ) { dApDA[3][2] = ( m_r / cpa ) * tnl * ( phid - m_r * rdrpr * snfd ); }
471 else { dApDA[3][2] = (
DBL_MAX ); }
473 dApDA[3][4] = -m_r * phid;
487 HepMatrix dXDA( 3, 5, 0 );
489 const double&
dr = m_ac[0];
490 const double&
phi0 = m_ac[1];
491 const double& cpa = m_ac[2];
492 const double&
dz = m_ac[3];
493 const double& tnl = m_ac[4];
495 double cosf0phi =
cos(
phi0 + phi );
496 double sinf0phi =
sin(
phi0 + phi );
499 dXDA[0][1] = -
dr * m_sp + m_r * ( -m_sp + sinf0phi );
500 if ( cpa != 0.0 ) { dXDA[0][2] = -( m_r / cpa ) * ( m_cp - cosf0phi ); }
501 else { dXDA[0][2] = (
DBL_MAX ); }
506 dXDA[1][1] =
dr * m_cp + m_r * ( m_cp - cosf0phi );
507 if ( cpa != 0.0 ) { dXDA[1][2] = -( m_r / cpa ) * ( m_sp - sinf0phi ); }
508 else { dXDA[1][2] = (
DBL_MAX ); }
514 if ( cpa != 0.0 ) { dXDA[2][2] = ( m_r / cpa ) * tnl * phi; }
515 else { dXDA[2][2] = (
DBL_MAX ); }
517 dXDA[2][4] = -m_r * phi;
529 HepMatrix dMDA( 3, 5, 0 );
531 const double&
phi0 = m_ac[1];
532 const double& cpa = m_ac[2];
533 const double& tnl = m_ac[4];
535 double cosf0phi =
cos(
phi0 + phi );
536 double sinf0phi =
sin(
phi0 + phi );
539 if ( cpa != 0. ) rho = 1. / cpa;
543 if ( cpa < 0. ) charge = -1.;
545 dMDA[0][1] = -fabs( rho ) * cosf0phi;
546 dMDA[0][2] = charge * rho * rho * sinf0phi;
548 dMDA[1][1] = -fabs( rho ) * sinf0phi;
549 dMDA[1][2] = -charge * rho * rho * cosf0phi;
551 dMDA[2][2] = -charge * rho * rho * tnl;
552 dMDA[2][4] = fabs( rho );
564 HepMatrix d4MDA( 4, 5, 0 );
566 double phi0 = m_ac[1];
567 double cpa = m_ac[2];
568 double tnl = m_ac[4];
570 double cosf0phi =
cos(
phi0 + phi );
571 double sinf0phi =
sin(
phi0 + phi );
574 if ( cpa != 0. ) rho = 1. / cpa;
578 if ( cpa < 0. ) charge = -1.;
580 double E = sqrt( rho * rho * ( 1. + tnl * tnl ) +
mass *
mass );
582 d4MDA[0][1] = -fabs( rho ) * cosf0phi;
583 d4MDA[0][2] = charge * rho * rho * sinf0phi;
585 d4MDA[1][1] = -fabs( rho ) * sinf0phi;
586 d4MDA[1][2] = -charge * rho * rho * cosf0phi;
588 d4MDA[2][2] = -charge * rho * rho * tnl;
589 d4MDA[2][4] = fabs( rho );
591 if ( cpa != 0.0 && E != 0.0 )
593 d4MDA[3][2] = ( -1. - tnl * tnl ) / ( cpa * cpa * cpa * E );
594 d4MDA[3][4] = tnl / ( cpa * cpa * E );
611 HepMatrix d4MXDA( 7, 5, 0 );
613 const double&
dr = m_ac[0];
614 const double&
phi0 = m_ac[1];
615 const double& cpa = m_ac[2];
616 const double&
dz = m_ac[3];
617 const double& tnl = m_ac[4];
619 double cosf0phi =
cos(
phi0 + phi );
620 double sinf0phi =
sin(
phi0 + phi );
623 if ( cpa != 0. ) rho = 1. / cpa;
627 if ( cpa < 0. ) charge = -1.;
629 double E = sqrt( rho * rho * ( 1. + tnl * tnl ) +
mass *
mass );
631 d4MXDA[0][1] = -fabs( rho ) * cosf0phi;
632 d4MXDA[0][2] = charge * rho * rho * sinf0phi;
634 d4MXDA[1][1] = -fabs( rho ) * sinf0phi;
635 d4MXDA[1][2] = -charge * rho * rho * cosf0phi;
637 d4MXDA[2][2] = -charge * rho * rho * tnl;
638 d4MXDA[2][4] = fabs( rho );
640 if ( cpa != 0.0 && E != 0.0 )
642 d4MXDA[3][2] = ( -1. - tnl * tnl ) / ( cpa * cpa * cpa * E );
643 d4MXDA[3][4] = tnl / ( cpa * cpa * E );
652 d4MXDA[4][1] = -
dr * m_sp + m_r * ( -m_sp + sinf0phi );
653 if ( cpa != 0.0 ) { d4MXDA[4][2] = -( m_r / cpa ) * ( m_cp - cosf0phi ); }
654 else { d4MXDA[4][2] = (
DBL_MAX ); }
657 d4MXDA[5][1] =
dr * m_cp + m_r * ( m_cp - cosf0phi );
660 d4MXDA[5][2] = -( m_r / cpa ) * ( m_sp - sinf0phi );
662 d4MXDA[6][2] = ( m_r / cpa ) * tnl * phi;
672 d4MXDA[6][4] = -m_r * phi;
678 m_matrixValid =
false;
HepGeom::Point3D< double > HepPoint3D
double sin(const BesAngle a)
double cos(const BesAngle a)
NTuple::Item< double > m_pt
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.
void ignoreErrorMatrix(void)
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.
static const double ConstantAlpha
Constant alpha for uniform field.
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.