13#define Helix Ext_Helix
19#include "TrackUtil/Helix.h"
21#include "CLHEP/Matrix/Matrix.h"
22#include "GaudiKernel/Bootstrap.h"
23#include "GaudiKernel/IDataProviderSvc.h"
24#include "GaudiKernel/IInterface.h"
25#include "GaudiKernel/IMessageSvc.h"
26#include "GaudiKernel/ISvcLocator.h"
27#include "GaudiKernel/Kernel.h"
28#include "GaudiKernel/MsgStream.h"
29#include "GaudiKernel/Service.h"
30#include "GaudiKernel/SmartDataPtr.h"
31#include "GaudiKernel/StatusCode.h"
49 const HepSymMatrix&
Ea )
54 , m_matrixValid( true )
56 StatusCode scmgn = Gaudi::svcLocator()->service(
"MagneticFieldSvc", m_pmgnIMF );
57 if ( scmgn != StatusCode::SUCCESS )
58 { std::cout <<
"Unable to open Magnetic field service" << std::endl; }
59 m_bField = 10000 * ( m_pmgnIMF->getReferField() );
60 m_alpha = 10000. / 2.99792458 / m_bField;
72 , m_matrixValid( false )
73 , m_Ea( HepSymMatrix( 5, 0 ) ) {
74 StatusCode scmgn = Gaudi::svcLocator()->service(
"MagneticFieldSvc", m_pmgnIMF );
75 if ( scmgn != StatusCode::SUCCESS )
78 std::cout <<
"Unable to open Magnetic field service" << std::endl;
80 m_bField = 10000 * ( m_pmgnIMF->getReferField() );
81 m_alpha = 10000. / 2.99792458 / m_bField;
92 , m_a( HepVector( 5, 0 ) )
93 , m_matrixValid( false )
94 , m_Ea( HepSymMatrix( 5, 0 ) ) {
95 StatusCode scmgn = Gaudi::svcLocator()->service(
"MagneticFieldSvc", m_pmgnIMF );
96 if ( scmgn != StatusCode::SUCCESS )
99 std::cout <<
"Unable to open Magnetic field service" << std::endl;
101 m_bField = 10000 * ( m_pmgnIMF->getReferField() );
102 m_alpha = 10000. / 2.99792458 / m_bField;
110 m_a[2] = charge / perp;
117 else { m_a[4] = -(
DBL_MAX ); }
134 double x = m_pivot.x() + m_ac[0] * m_cp + m_r * ( m_cp -
cos( m_ac[1] + phi ) );
135 double y = m_pivot.y() + m_ac[0] * m_sp + m_r * ( m_sp -
sin( m_ac[1] + phi ) );
136 double z = m_pivot.z() + m_ac[3] - m_r * m_ac[4] * phi;
150 p[0] = m_pivot.x() + m_ac[0] * m_cp + m_r * ( m_cp -
cos( m_ac[1] + phi ) );
151 p[1] = m_pivot.y() + m_ac[0] * m_sp + m_r * ( m_sp -
sin( m_ac[1] + phi ) );
152 p[2] = m_pivot.z() + m_ac[3] - m_r * m_ac[4] * phi;
158 double x = m_pivot.x() + m_ac[0] * m_cp + m_r * ( m_cp -
cos( m_ac[1] + phi ) );
159 double y = m_pivot.y() + m_ac[0] * m_sp + m_r * ( m_sp -
sin( m_ac[1] + phi ) );
160 double z = m_pivot.z() + m_ac[3] - m_r * m_ac[4] * phi;
171 if ( m_matrixValid ) Ex = m_Ea.similarity(
delXDelA( phi ) );
188 double pt = fabs( m_pt );
189 double px = -pt *
sin( m_ac[1] + phi );
190 double py = pt *
cos( m_ac[1] + phi );
191 double pz = pt * m_ac[4];
193 return Hep3Vector( px, py, pz );
207 double pt = fabs( m_pt );
208 double px = -pt *
sin( m_ac[1] + phi );
209 double py = pt *
cos( m_ac[1] + phi );
210 double pz = pt * m_ac[4];
212 if ( m_matrixValid ) Em = m_Ea.similarity(
delMDelA( phi ) );
215 return Hep3Vector( px, py, pz );
230 double pt = fabs( m_pt );
231 double px = -pt *
sin( m_ac[1] + phi );
232 double py = pt *
cos( m_ac[1] + phi );
233 double pz = pt * m_ac[4];
234 double E = sqrt( pt * pt * ( 1. + m_ac[4] * m_ac[4] ) +
mass *
mass );
236 return HepLorentzVector( px, py, pz, E );
251 double pt = fabs( m_pt );
252 double px = -pt *
sin( m_ac[1] + phi );
253 double py = pt *
cos( m_ac[1] + phi );
254 double pz = pt * m_ac[4];
255 double E = sqrt( pt * pt * ( 1. + m_ac[4] * m_ac[4] ) +
mass *
mass );
257 if ( m_matrixValid ) Em = m_Ea.similarity(
del4MDelA( phi,
mass ) );
260 return HepLorentzVector( px, py, pz, E );
264 HepSymMatrix& Emx )
const {
276 double pt = fabs( m_pt );
277 double px = -pt *
sin( m_ac[1] + phi );
278 double py = pt *
cos( m_ac[1] + phi );
279 double pz = pt * m_ac[4];
280 double E = sqrt( pt * pt * ( 1. + m_ac[4] * m_ac[4] ) +
mass *
mass );
282 x.setX( m_pivot.x() + m_ac[0] * m_cp + m_r * ( m_cp -
cos( m_ac[1] + phi ) ) );
283 x.setY( m_pivot.y() + m_ac[0] * m_sp + m_r * ( m_sp -
sin( m_ac[1] + phi ) ) );
284 x.setZ( m_pivot.z() + m_ac[3] - m_r * m_ac[4] * phi );
286 if ( m_matrixValid ) Emx = m_Ea.similarity(
del4MXDelA( phi,
mass ) );
289 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;
389void Ext_Helix::updateCache(
void ) {
403 m_cp =
cos( m_ac[1] );
404 m_sp =
sin( m_ac[1] );
405 if ( m_ac[2] != 0.0 )
408 m_r = m_alpha / m_ac[2];
416 double x = m_pivot.x() + ( m_ac[0] + m_r ) * m_cp;
417 double y = m_pivot.y() + ( m_ac[0] + m_r ) * m_sp;
429 HepMatrix dApDA( 5, 5, 0 );
431 const double&
dr = m_ac[0];
432 const double&
phi0 = m_ac[1];
433 const double& cpa = m_ac[2];
434 const double&
dz = m_ac[3];
435 const double& tnl = m_ac[4];
438 double phi0p = ap[1];
443 double rdr = m_r +
dr;
445 if ( ( m_r + drp ) != 0.0 ) { rdrpr = 1. / ( m_r + drp ); }
449 double csfd =
cos( phi0p -
phi0 );
450 double snfd =
sin( phi0p -
phi0 );
455 dApDA[0][1] = rdr * snfd;
456 if ( cpa != 0.0 ) { dApDA[0][2] = ( m_r / cpa ) * ( 1.0 - csfd ); }
457 else { dApDA[0][2] = (
DBL_MAX ); }
459 dApDA[1][0] = -rdrpr * snfd;
460 dApDA[1][1] = rdr * rdrpr * csfd;
461 if ( cpa != 0.0 ) { dApDA[1][2] = ( m_r / cpa ) * rdrpr * snfd; }
462 else { dApDA[1][2] = (
DBL_MAX ); }
466 dApDA[3][0] = m_r * rdrpr * tnl * snfd;
467 dApDA[3][1] = m_r * tnl * ( 1.0 - rdr * rdrpr * csfd );
468 if ( cpa != 0.0 ) { dApDA[3][2] = ( m_r / cpa ) * tnl * ( phid - m_r * rdrpr * snfd ); }
469 else { dApDA[3][2] = (
DBL_MAX ); }
471 dApDA[3][4] = -m_r * phid;
485 HepMatrix dXDA( 3, 5, 0 );
487 const double&
dr = m_ac[0];
488 const double&
phi0 = m_ac[1];
489 const double& cpa = m_ac[2];
490 const double&
dz = m_ac[3];
491 const double& tnl = m_ac[4];
493 double cosf0phi =
cos(
phi0 + phi );
494 double sinf0phi =
sin(
phi0 + phi );
497 dXDA[0][1] = -
dr * m_sp + m_r * ( -m_sp + sinf0phi );
498 if ( cpa != 0.0 ) { dXDA[0][2] = -( m_r / cpa ) * ( m_cp - cosf0phi ); }
499 else { dXDA[0][2] = (
DBL_MAX ); }
504 dXDA[1][1] =
dr * m_cp + m_r * ( m_cp - cosf0phi );
505 if ( cpa != 0.0 ) { dXDA[1][2] = -( m_r / cpa ) * ( m_sp - sinf0phi ); }
506 else { dXDA[1][2] = (
DBL_MAX ); }
512 if ( cpa != 0.0 ) { dXDA[2][2] = ( m_r / cpa ) * tnl * phi; }
513 else { dXDA[2][2] = (
DBL_MAX ); }
515 dXDA[2][4] = -m_r * phi;
527 HepMatrix dMDA( 3, 5, 0 );
529 const double&
phi0 = m_ac[1];
530 const double& cpa = m_ac[2];
531 const double& tnl = m_ac[4];
533 double cosf0phi =
cos(
phi0 + phi );
534 double sinf0phi =
sin(
phi0 + phi );
537 if ( cpa != 0. ) rho = 1. / cpa;
541 if ( cpa < 0. ) charge = -1.;
543 dMDA[0][1] = -fabs( rho ) * cosf0phi;
544 dMDA[0][2] = charge * rho * rho * sinf0phi;
546 dMDA[1][1] = -fabs( rho ) * sinf0phi;
547 dMDA[1][2] = -charge * rho * rho * cosf0phi;
549 dMDA[2][2] = -charge * rho * rho * tnl;
550 dMDA[2][4] = fabs( rho );
562 HepMatrix d4MDA( 4, 5, 0 );
564 double phi0 = m_ac[1];
565 double cpa = m_ac[2];
566 double tnl = m_ac[4];
568 double cosf0phi =
cos(
phi0 + phi );
569 double sinf0phi =
sin(
phi0 + phi );
572 if ( cpa != 0. ) rho = 1. / cpa;
576 if ( cpa < 0. ) charge = -1.;
578 double E = sqrt( rho * rho * ( 1. + tnl * tnl ) +
mass *
mass );
580 d4MDA[0][1] = -fabs( rho ) * cosf0phi;
581 d4MDA[0][2] = charge * rho * rho * sinf0phi;
583 d4MDA[1][1] = -fabs( rho ) * sinf0phi;
584 d4MDA[1][2] = -charge * rho * rho * cosf0phi;
586 d4MDA[2][2] = -charge * rho * rho * tnl;
587 d4MDA[2][4] = fabs( rho );
589 if ( cpa != 0.0 && E != 0.0 )
591 d4MDA[3][2] = ( -1. - tnl * tnl ) / ( cpa * cpa * cpa * E );
592 d4MDA[3][4] = tnl / ( cpa * cpa * E );
609 HepMatrix d4MXDA( 7, 5, 0 );
611 const double&
dr = m_ac[0];
612 const double&
phi0 = m_ac[1];
613 const double& cpa = m_ac[2];
614 const double&
dz = m_ac[3];
615 const double& tnl = m_ac[4];
617 double cosf0phi =
cos(
phi0 + phi );
618 double sinf0phi =
sin(
phi0 + phi );
621 if ( cpa != 0. ) rho = 1. / cpa;
625 if ( cpa < 0. ) charge = -1.;
627 double E = sqrt( rho * rho * ( 1. + tnl * tnl ) +
mass *
mass );
629 d4MXDA[0][1] = -fabs( rho ) * cosf0phi;
630 d4MXDA[0][2] = charge * rho * rho * sinf0phi;
632 d4MXDA[1][1] = -fabs( rho ) * sinf0phi;
633 d4MXDA[1][2] = -charge * rho * rho * cosf0phi;
635 d4MXDA[2][2] = -charge * rho * rho * tnl;
636 d4MXDA[2][4] = fabs( rho );
638 if ( cpa != 0.0 && E != 0.0 )
640 d4MXDA[3][2] = ( -1. - tnl * tnl ) / ( cpa * cpa * cpa * E );
641 d4MXDA[3][4] = tnl / ( cpa * cpa * E );
650 d4MXDA[4][1] = -
dr * m_sp + m_r * ( -m_sp + sinf0phi );
651 if ( cpa != 0.0 ) { d4MXDA[4][2] = -( m_r / cpa ) * ( m_cp - cosf0phi ); }
652 else { d4MXDA[4][2] = (
DBL_MAX ); }
655 d4MXDA[5][1] =
dr * m_cp + m_r * ( m_cp - cosf0phi );
658 d4MXDA[5][2] = -( m_r / cpa ) * ( m_sp - sinf0phi );
660 d4MXDA[6][2] = ( m_r / cpa ) * tnl * phi;
670 d4MXDA[6][4] = -m_r * phi;
676 m_matrixValid =
false;
double sin(const BesAngle a)
double cos(const BesAngle a)
NTuple::Item< double > m_pt
HepGeom::Point3D< double > HepPoint3D
void ignoreErrorMatrix(void)
HepMatrix del4MDelA(double phi, double mass) 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.
HepMatrix del4MXDelA(double phi, double mass) const
const HepSymMatrix & Ea(void) const
returns error matrix.
HepPoint3D x(double dPhi=0.) const
returns position after rotating angle dPhi in phi direction.
virtual ~Ext_Helix()
Destructor.
double dr(void) const
returns an element of parameters.
const HepPoint3D & pivot(void) const
returns pivot position.
HepMatrix delXDelA(double phi) const
Hep3Vector momentum(double dPhi=0.) const
returns momentum vector after rotating angle dPhi in phi direction.
Ext_Helix & operator=(const Ext_Helix &)
Copy operator.
const HepVector & a(void) const
returns helix parameters.
HepMatrix delApDelA(const HepVector &ap) const
Ext_Helix(const HepPoint3D &pivot, const HepVector &a, const HepSymMatrix &Ea)
Constructor with pivot, helix parameter a, and its error matrix.