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"
41const double Helix::ConstantAlpha = 333.564095;
44 const HepSymMatrix&
Ea )
49 , m_matrixValid( true )
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; }
67 , m_matrixValid( false )
68 , m_Ea( HepSymMatrix( 5, 0 ) ) {
69 StatusCode scmgn = Gaudi::svcLocator()->service(
"MagneticFieldSvc",
m_pmgnIMF );
70 if ( scmgn != StatusCode::SUCCESS )
73 std::cout <<
"Unable to open Magnetic field service" << std::endl;
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 )
94 std::cout <<
"Unable to open Magnetic field service" << std::endl;
105 m_a[2] = charge / perp;
112 else { m_a[4] = -(
DBL_MAX ); }
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;
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;
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;
166 if ( m_matrixValid ) Ex = m_Ea.similarity(
delXDelA( phi ) );
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];
188 return Hep3Vector( px, py, pz );
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];
207 if ( m_matrixValid ) Em = m_Ea.similarity(
delMDelA( phi ) );
210 return Hep3Vector( px, py, pz );
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 );
231 return HepLorentzVector( px, py, pz, E );
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 );
252 if ( m_matrixValid ) Em = m_Ea.similarity(
del4MDelA( phi,
mass ) );
255 return HepLorentzVector( px, py, pz, E );
259 HepSymMatrix& Emx )
const {
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 );
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 );
281 if ( m_matrixValid ) Emx = m_Ea.similarity(
del4MXDelA( phi,
mass ) );
284 return HepLorentzVector( px, py, pz, E );
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];
294 double rdr =
dr + m_r;
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;
301 double xc = m_pivot.x() + rdr * csf0;
302 double yc = m_pivot.y() + rdr * snf0;
306 csf = ( xc - newPivot.x() ) / m_r;
307 snf = ( yc - newPivot.y() ) / m_r;
308 double anrm = sqrt( csf * csf + snf * snf );
313 phi = atan2( snf, csf );
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();
342 if ( m_matrixValid ) m_Ea = m_Ea.similarity(
delApDelA( ap ) );
356 m_matrixValid =
true;
361 if (
this == &i )
return *
this;
368 m_matrixValid = i.m_matrixValid;
370 m_center = i.m_center;
384void Helix::updateCache(
void ) {
398 m_cp =
cos( m_ac[1] );
399 m_sp =
sin( m_ac[1] );
400 if ( m_ac[2] != 0.0 )
403 m_r = m_alpha / m_ac[2];
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;
424 HepMatrix dApDA( 5, 5, 0 );
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];
433 double phi0p = ap[1];
438 double rdr = m_r +
dr;
440 if ( ( m_r + drp ) != 0.0 ) { rdrpr = 1. / ( m_r + drp ); }
444 double csfd =
cos( phi0p -
phi0 );
445 double snfd =
sin( phi0p -
phi0 );
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 ); }
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 ); }
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 ); }
466 dApDA[3][4] = -m_r * phid;
480 HepMatrix dXDA( 3, 5, 0 );
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];
488 double cosf0phi =
cos(
phi0 + phi );
489 double sinf0phi =
sin(
phi0 + phi );
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 ); }
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 ); }
507 if ( cpa != 0.0 ) { dXDA[2][2] = ( m_r / cpa ) * tnl * phi; }
508 else { dXDA[2][2] = (
DBL_MAX ); }
510 dXDA[2][4] = -m_r * phi;
522 HepMatrix dMDA( 3, 5, 0 );
524 const double&
phi0 = m_ac[1];
525 const double& cpa = m_ac[2];
526 const double& tnl = m_ac[4];
528 double cosf0phi =
cos(
phi0 + phi );
529 double sinf0phi =
sin(
phi0 + phi );
532 if ( cpa != 0. ) rho = 1. / cpa;
536 if ( cpa < 0. ) charge = -1.;
538 dMDA[0][1] = -fabs( rho ) * cosf0phi;
539 dMDA[0][2] = charge * rho * rho * sinf0phi;
541 dMDA[1][1] = -fabs( rho ) * sinf0phi;
542 dMDA[1][2] = -charge * rho * rho * cosf0phi;
544 dMDA[2][2] = -charge * rho * rho * tnl;
545 dMDA[2][4] = fabs( rho );
557 HepMatrix d4MDA( 4, 5, 0 );
559 double phi0 = m_ac[1];
560 double cpa = m_ac[2];
561 double tnl = m_ac[4];
563 double cosf0phi =
cos(
phi0 + phi );
564 double sinf0phi =
sin(
phi0 + phi );
567 if ( cpa != 0. ) rho = 1. / cpa;
571 if ( cpa < 0. ) charge = -1.;
573 double E = sqrt( rho * rho * ( 1. + tnl * tnl ) +
mass *
mass );
575 d4MDA[0][1] = -fabs( rho ) * cosf0phi;
576 d4MDA[0][2] = charge * rho * rho * sinf0phi;
578 d4MDA[1][1] = -fabs( rho ) * sinf0phi;
579 d4MDA[1][2] = -charge * rho * rho * cosf0phi;
581 d4MDA[2][2] = -charge * rho * rho * tnl;
582 d4MDA[2][4] = fabs( rho );
584 if ( cpa != 0.0 && E != 0.0 )
586 d4MDA[3][2] = ( -1. - tnl * tnl ) / ( cpa * cpa * cpa * E );
587 d4MDA[3][4] = tnl / ( cpa * cpa * E );
604 HepMatrix d4MXDA( 7, 5, 0 );
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];
612 double cosf0phi =
cos(
phi0 + phi );
613 double sinf0phi =
sin(
phi0 + phi );
616 if ( cpa != 0. ) rho = 1. / cpa;
620 if ( cpa < 0. ) charge = -1.;
622 double E = sqrt( rho * rho * ( 1. + tnl * tnl ) +
mass *
mass );
624 d4MXDA[0][1] = -fabs( rho ) * cosf0phi;
625 d4MXDA[0][2] = charge * rho * rho * sinf0phi;
627 d4MXDA[1][1] = -fabs( rho ) * sinf0phi;
628 d4MXDA[1][2] = -charge * rho * rho * cosf0phi;
630 d4MXDA[2][2] = -charge * rho * rho * tnl;
631 d4MXDA[2][4] = fabs( rho );
633 if ( cpa != 0.0 && E != 0.0 )
635 d4MXDA[3][2] = ( -1. - tnl * tnl ) / ( cpa * cpa * cpa * E );
636 d4MXDA[3][4] = tnl / ( cpa * cpa * E );
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 ); }
650 d4MXDA[5][1] =
dr * m_cp + m_r * ( m_cp - cosf0phi );
653 d4MXDA[5][2] = -( m_r / cpa ) * ( m_sp - sinf0phi );
655 d4MXDA[6][2] = ( m_r / cpa ) * tnl * phi;
665 d4MXDA[6][4] = -m_r * phi;
671 m_matrixValid =
false;
HepGeom::Point3D< double > HepPoint3D
double sin(const BesAngle a)
double cos(const BesAngle a)
NTuple::Item< double > m_pt
HepGeom::Point3D< double > HepPoint3D
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.
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
IBesMagFieldSvc * m_pmgnIMF
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.