92#include "DedxCorrecSvc/Dedx_Helix.h"
93#include "CLHEP/Matrix/Matrix.h"
94#include "GaudiKernel/Bootstrap.h"
95#include "GaudiKernel/IDataProviderSvc.h"
96#include "GaudiKernel/IInterface.h"
97#include "GaudiKernel/IMessageSvc.h"
98#include "GaudiKernel/IPartPropSvc.h"
99#include "GaudiKernel/ISvcLocator.h"
100#include "GaudiKernel/Kernel.h"
101#include "GaudiKernel/MsgStream.h"
102#include "GaudiKernel/Service.h"
103#include "GaudiKernel/SmartDataPtr.h"
104#include "GaudiKernel/StatusCode.h"
109#include "GaudiKernel/SmartDataPtr.h"
120 const HepSymMatrix&
Ea )
125 , m_matrixValid( true )
128 StatusCode scmgn = Gaudi::svcLocator()->service(
"MagneticFieldSvc", m_pmgnIMF );
129 if ( scmgn != StatusCode::SUCCESS )
132 std::cout <<
"Unable to open Magnetic field service" << std::endl;
134 m_bField = 10000 * ( m_pmgnIMF->getReferField() );
135 m_alpha = 10000. / 2.99792458 / m_bField;
146 , m_matrixValid( false )
147 , m_Ea( HepSymMatrix( 5, 0 ) ) {
148 StatusCode scmgn = Gaudi::svcLocator()->service(
"MagneticFieldSvc", m_pmgnIMF );
149 if ( scmgn != StatusCode::SUCCESS )
152 std::cout <<
"Unable to open Magnetic field service" << std::endl;
154 m_bField = 10000 * ( m_pmgnIMF->getReferField() );
155 m_alpha = 10000. / 2.99792458 / m_bField;
166 , m_a( HepVector( 5, 0 ) )
167 , m_matrixValid( false )
168 , m_Ea( HepSymMatrix( 5, 0 ) ) {
169 StatusCode scmgn = Gaudi::svcLocator()->service(
"MagneticFieldSvc", m_pmgnIMF );
170 if ( scmgn != StatusCode::SUCCESS )
173 std::cout <<
"Unable to open Magnetic field service" << std::endl;
175 m_bField = 10000 * ( m_pmgnIMF->getReferField() );
176 m_alpha = 10000. / 2.99792458 / m_bField;
184 m_a[2] = charge / perp;
191 else { m_a[4] = -(
DBL_MAX ); }
214 double x = m_pivot.x() + m_ac[0] * m_cp + m_r * ( m_cp -
cos( m_ac[1] + phi ) );
215 double y = m_pivot.y() + m_ac[0] * m_sp + m_r * ( m_sp -
sin( m_ac[1] + phi ) );
216 double z = m_pivot.z() + m_ac[3] - m_r * m_ac[4] * phi;
230 p[0] = m_pivot.x() + m_ac[0] * m_cp + m_r * ( m_cp -
cos( m_ac[1] + phi ) );
231 p[1] = m_pivot.y() + m_ac[0] * m_sp + m_r * ( m_sp -
sin( m_ac[1] + phi ) );
232 p[2] = m_pivot.z() + m_ac[3] - m_r * m_ac[4] * phi;
238 double x = m_pivot.x() + m_ac[0] * m_cp + m_r * ( m_cp -
cos( m_ac[1] + phi ) );
239 double y = m_pivot.y() + m_ac[0] * m_sp + m_r * ( m_sp -
sin( m_ac[1] + phi ) );
240 double z = m_pivot.z() + m_ac[3] - m_r * m_ac[4] * phi;
251 if ( m_matrixValid ) Ex = m_Ea.similarity(
delXDelA( phi ) );
268 double pt = fabs( m_pt );
269 double px = -pt *
sin( m_ac[1] + phi );
270 double py = pt *
cos( m_ac[1] + phi );
271 double pz = pt * m_ac[4];
273 return Hep3Vector( px, py, pz );
287 double pt = fabs( m_pt );
288 double px = -pt *
sin( m_ac[1] + phi );
289 double py = pt *
cos( m_ac[1] + phi );
290 double pz = pt * m_ac[4];
292 if ( m_matrixValid ) Em = m_Ea.similarity(
delMDelA( phi ) );
295 return Hep3Vector( px, py, pz );
310 double pt = fabs( m_pt );
311 double px = -pt *
sin( m_ac[1] + phi );
312 double py = pt *
cos( m_ac[1] + phi );
313 double pz = pt * m_ac[4];
314 double E = sqrt( pt * pt * ( 1. + m_ac[4] * m_ac[4] ) +
mass *
mass );
316 return HepLorentzVector( px, py, pz, E );
331 double pt = fabs( m_pt );
332 double px = -pt *
sin( m_ac[1] + phi );
333 double py = pt *
cos( m_ac[1] + phi );
334 double pz = pt * m_ac[4];
335 double E = sqrt( pt * pt * ( 1. + m_ac[4] * m_ac[4] ) +
mass *
mass );
337 if ( m_matrixValid ) Em = m_Ea.similarity(
del4MDelA( phi,
mass ) );
340 return HepLorentzVector( px, py, pz, E );
344 HepSymMatrix& Emx )
const {
356 double pt = fabs( m_pt );
357 double px = -pt *
sin( m_ac[1] + phi );
358 double py = pt *
cos( m_ac[1] + phi );
359 double pz = pt * m_ac[4];
360 double E = sqrt( pt * pt * ( 1. + m_ac[4] * m_ac[4] ) +
mass *
mass );
362 x.setX( m_pivot.x() + m_ac[0] * m_cp + m_r * ( m_cp -
cos( m_ac[1] + phi ) ) );
363 x.setY( m_pivot.y() + m_ac[0] * m_sp + m_r * ( m_sp -
sin( m_ac[1] + phi ) ) );
364 x.setZ( m_pivot.z() + m_ac[3] - m_r * m_ac[4] * phi );
366 if ( m_matrixValid ) Emx = m_Ea.similarity(
del4MXDelA( phi,
mass ) );
369 return HepLorentzVector( px, py, pz, E );
373 const double&
dr = m_ac[0];
374 const double&
phi0 = m_ac[1];
375 const double&
kappa = m_ac[2];
376 const double&
dz = m_ac[3];
377 const double&
tanl = m_ac[4];
379 double rdr =
dr + m_r;
381 double csf0 =
cos( phi );
382 double snf0 = ( 1. - csf0 ) * ( 1. + csf0 );
383 snf0 = sqrt( ( snf0 > 0. ) ? snf0 : 0. );
384 if ( phi >
M_PI ) snf0 = -snf0;
386 double xc = m_pivot.x() + rdr * csf0;
387 double yc = m_pivot.y() + rdr * snf0;
391 csf = ( xc - newPivot.x() ) / m_r;
392 snf = ( yc - newPivot.y() ) / m_r;
393 double anrm = sqrt( csf * csf + snf * snf );
398 phi = atan2( snf, csf );
415 double drp = ( m_pivot.x() +
dr * csf0 + m_r * ( csf0 - csf ) - newPivot.x() ) * csf +
416 ( m_pivot.y() +
dr * snf0 + m_r * ( snf0 - snf ) - newPivot.y() ) * snf;
417 double dzp = m_pivot.z() +
dz - m_r *
tanl * phid - newPivot.z();
427 if ( m_matrixValid ) m_Ea = m_Ea.similarity(
delApDelA( ap ) );
441 m_matrixValid =
true;
446 if (
this == &i )
return *
this;
448 m_bField = i.m_bField;
453 m_matrixValid = i.m_matrixValid;
455 m_center = i.m_center;
469void Dedx_Helix::updateCache(
void ) {
483 m_cp =
cos( m_ac[1] );
484 m_sp =
sin( m_ac[1] );
485 if ( m_ac[2] != 0.0 )
488 m_r = m_alpha / m_ac[2];
496 double x = m_pivot.x() + ( m_ac[0] + m_r ) * m_cp;
497 double y = m_pivot.y() + ( m_ac[0] + m_r ) * m_sp;
509 HepMatrix dApDA( 5, 5, 0 );
511 const double&
dr = m_ac[0];
512 const double&
phi0 = m_ac[1];
513 const double& cpa = m_ac[2];
514 const double&
dz = m_ac[3];
515 const double& tnl = m_ac[4];
518 double phi0p = ap[1];
523 double rdr = m_r +
dr;
525 if ( ( m_r + drp ) != 0.0 ) { rdrpr = 1. / ( m_r + drp ); }
529 double csfd =
cos( phi0p -
phi0 );
530 double snfd =
sin( phi0p -
phi0 );
535 dApDA[0][1] = rdr * snfd;
536 if ( cpa != 0.0 ) { dApDA[0][2] = ( m_r / cpa ) * ( 1.0 - csfd ); }
537 else { dApDA[0][2] = (
DBL_MAX ); }
539 dApDA[1][0] = -rdrpr * snfd;
540 dApDA[1][1] = rdr * rdrpr * csfd;
541 if ( cpa != 0.0 ) { dApDA[1][2] = ( m_r / cpa ) * rdrpr * snfd; }
542 else { dApDA[1][2] = (
DBL_MAX ); }
546 dApDA[3][0] = m_r * rdrpr * tnl * snfd;
547 dApDA[3][1] = m_r * tnl * ( 1.0 - rdr * rdrpr * csfd );
548 if ( cpa != 0.0 ) { dApDA[3][2] = ( m_r / cpa ) * tnl * ( phid - m_r * rdrpr * snfd ); }
549 else { dApDA[3][2] = (
DBL_MAX ); }
551 dApDA[3][4] = -m_r * phid;
565 HepMatrix dXDA( 3, 5, 0 );
567 const double&
dr = m_ac[0];
568 const double&
phi0 = m_ac[1];
569 const double& cpa = m_ac[2];
570 const double&
dz = m_ac[3];
571 const double& tnl = m_ac[4];
573 double cosf0phi =
cos(
phi0 + phi );
574 double sinf0phi =
sin(
phi0 + phi );
577 dXDA[0][1] = -
dr * m_sp + m_r * ( -m_sp + sinf0phi );
578 if ( cpa != 0.0 ) { dXDA[0][2] = -( m_r / cpa ) * ( m_cp - cosf0phi ); }
579 else { dXDA[0][2] = (
DBL_MAX ); }
584 dXDA[1][1] =
dr * m_cp + m_r * ( m_cp - cosf0phi );
585 if ( cpa != 0.0 ) { dXDA[1][2] = -( m_r / cpa ) * ( m_sp - sinf0phi ); }
586 else { dXDA[1][2] = (
DBL_MAX ); }
592 if ( cpa != 0.0 ) { dXDA[2][2] = ( m_r / cpa ) * tnl * phi; }
593 else { dXDA[2][2] = (
DBL_MAX ); }
595 dXDA[2][4] = -m_r * phi;
607 HepMatrix dMDA( 3, 5, 0 );
609 const double&
phi0 = m_ac[1];
610 const double& cpa = m_ac[2];
611 const double& tnl = m_ac[4];
613 double cosf0phi =
cos(
phi0 + phi );
614 double sinf0phi =
sin(
phi0 + phi );
617 if ( cpa != 0. ) rho = 1. / cpa;
621 if ( cpa < 0. ) charge = -1.;
623 dMDA[0][1] = -fabs( rho ) * cosf0phi;
624 dMDA[0][2] = charge * rho * rho * sinf0phi;
626 dMDA[1][1] = -fabs( rho ) * sinf0phi;
627 dMDA[1][2] = -charge * rho * rho * cosf0phi;
629 dMDA[2][2] = -charge * rho * rho * tnl;
630 dMDA[2][4] = fabs( rho );
642 HepMatrix d4MDA( 4, 5, 0 );
644 double phi0 = m_ac[1];
645 double cpa = m_ac[2];
646 double tnl = m_ac[4];
648 double cosf0phi =
cos(
phi0 + phi );
649 double sinf0phi =
sin(
phi0 + phi );
652 if ( cpa != 0. ) rho = 1. / cpa;
656 if ( cpa < 0. ) charge = -1.;
658 double E = sqrt( rho * rho * ( 1. + tnl * tnl ) +
mass *
mass );
660 d4MDA[0][1] = -fabs( rho ) * cosf0phi;
661 d4MDA[0][2] = charge * rho * rho * sinf0phi;
663 d4MDA[1][1] = -fabs( rho ) * sinf0phi;
664 d4MDA[1][2] = -charge * rho * rho * cosf0phi;
666 d4MDA[2][2] = -charge * rho * rho * tnl;
667 d4MDA[2][4] = fabs( rho );
669 if ( cpa != 0.0 && E != 0.0 )
671 d4MDA[3][2] = ( -1. - tnl * tnl ) / ( cpa * cpa * cpa * E );
672 d4MDA[3][4] = tnl / ( cpa * cpa * E );
689 HepMatrix d4MXDA( 7, 5, 0 );
691 const double&
dr = m_ac[0];
692 const double&
phi0 = m_ac[1];
693 const double& cpa = m_ac[2];
694 const double&
dz = m_ac[3];
695 const double& tnl = m_ac[4];
697 double cosf0phi =
cos(
phi0 + phi );
698 double sinf0phi =
sin(
phi0 + phi );
701 if ( cpa != 0. ) rho = 1. / cpa;
705 if ( cpa < 0. ) charge = -1.;
707 double E = sqrt( rho * rho * ( 1. + tnl * tnl ) +
mass *
mass );
709 d4MXDA[0][1] = -fabs( rho ) * cosf0phi;
710 d4MXDA[0][2] = charge * rho * rho * sinf0phi;
712 d4MXDA[1][1] = -fabs( rho ) * sinf0phi;
713 d4MXDA[1][2] = -charge * rho * rho * cosf0phi;
715 d4MXDA[2][2] = -charge * rho * rho * tnl;
716 d4MXDA[2][4] = fabs( rho );
718 if ( cpa != 0.0 && E != 0.0 )
720 d4MXDA[3][2] = ( -1. - tnl * tnl ) / ( cpa * cpa * cpa * E );
721 d4MXDA[3][4] = tnl / ( cpa * cpa * E );
730 d4MXDA[4][1] = -
dr * m_sp + m_r * ( -m_sp + sinf0phi );
731 if ( cpa != 0.0 ) { d4MXDA[4][2] = -( m_r / cpa ) * ( m_cp - cosf0phi ); }
732 else { d4MXDA[4][2] = (
DBL_MAX ); }
735 d4MXDA[5][1] =
dr * m_cp + m_r * ( m_cp - cosf0phi );
738 d4MXDA[5][2] = -( m_r / cpa ) * ( m_sp - sinf0phi );
740 d4MXDA[6][2] = ( m_r / cpa ) * tnl * phi;
750 d4MXDA[6][4] = -m_r * phi;
756 m_matrixValid =
false;
double sin(const BesAngle a)
double cos(const BesAngle a)
NTuple::Item< double > m_pt
HepGeom::Point3D< double > HepPoint3D
HepMatrix del4MDelA(double phi, double mass) const
const HepVector & a(void) const
returns helix parameters.
HepPoint3D x(double dPhi=0.) const
returns position after rotating angle dPhi in phi direction.
static const double ConstantAlpha
Constant alpha for uniform field.
Dedx_Helix & operator=(const Dedx_Helix &)
Copy operator.
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
virtual ~Dedx_Helix()
Destructor.
HepMatrix delMDelA(double phi) const
const HepSymMatrix & Ea(void) const
returns error matrix.
Dedx_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.
double dr(void) const
returns an element of parameters.
void ignoreErrorMatrix(void)
HepMatrix delXDelA(double phi) const
Hep3Vector momentum(double dPhi=0.) const
returns momentum vector after rotating angle dPhi in phi direction.
HepMatrix delApDelA(const HepVector &ap) const