14#include "VertexFit/Helix.h"
15#include "VertexFit/BField.h"
35 , m_alpha( 333.564095 )
39 , m_matrixValid( true ) {
43 m_alpha = 10000. / 2.99792458 / m_bField;
50 , m_alpha( 333.564095 )
53 , m_Ea( HepSymMatrix( 5, 0 ) )
54 , m_matrixValid( false ) {
57 m_alpha = 10000. / 2.99792458 / m_bField;
64 , m_alpha( 333.564095 )
66 , m_a( HepVector( 5, 0 ) )
67 , m_Ea( HepSymMatrix( 5, 0 ) )
68 , m_matrixValid( false ) {
71 m_alpha = 10000. / 2.99792458 / m_bField;
79 m_a[2] = charge / perp;
103 double x = m_pivot.x() + m_ac[0] * m_cp + m_r * ( m_cp -
cos( m_ac[1] + phi ) );
104 double y = m_pivot.y() + m_ac[0] * m_sp + m_r * ( m_sp -
sin( m_ac[1] + phi ) );
105 double z = m_pivot.z() + m_ac[3] - m_r * m_ac[4] * phi;
119 p[0] = m_pivot.x() + m_ac[0] * m_cp + m_r * ( m_cp -
cos( m_ac[1] + phi ) );
120 p[1] = m_pivot.y() + m_ac[0] * m_sp + m_r * ( m_sp -
sin( m_ac[1] + phi ) );
121 p[2] = m_pivot.z() + m_ac[3] - m_r * m_ac[4] * phi;
127 double x = m_pivot.x() + m_ac[0] * m_cp + m_r * ( m_cp -
cos( m_ac[1] + phi ) );
128 double y = m_pivot.y() + m_ac[0] * m_sp + m_r * ( m_sp -
sin( m_ac[1] + phi ) );
129 double z = m_pivot.z() + m_ac[3] - m_r * m_ac[4] * phi;
140 if ( m_matrixValid ) Ex = m_Ea.similarity(
delXDelA( phi ) );
157 double pt = fabs( m_pt );
158 double px = -pt *
sin( m_ac[1] + phi );
159 double py = pt *
cos( m_ac[1] + phi );
160 double pz = pt * m_ac[4];
162 return Hep3Vector( px, py, pz );
176 double pt = fabs( m_pt );
177 double px = -pt *
sin( m_ac[1] + phi );
178 double py = pt *
cos( m_ac[1] + phi );
179 double pz = pt * m_ac[4];
181 if ( m_matrixValid ) Em = m_Ea.similarity(
delMDelA( phi ) );
184 return Hep3Vector( px, py, pz );
199 double pt = fabs( m_pt );
200 double px = -pt *
sin( m_ac[1] + phi );
201 double py = pt *
cos( m_ac[1] + phi );
202 double pz = pt * m_ac[4];
203 double E = sqrt( pt * pt * ( 1. + m_ac[4] * m_ac[4] ) +
mass *
mass );
205 return HepLorentzVector( px, py, pz, E );
220 double pt = fabs( m_pt );
221 double px = -pt *
sin( m_ac[1] + phi );
222 double py = pt *
cos( m_ac[1] + phi );
223 double pz = pt * m_ac[4];
224 double E = sqrt( pt * pt * ( 1. + m_ac[4] * m_ac[4] ) +
mass *
mass );
226 if ( m_matrixValid ) Em = m_Ea.similarity(
del4MDelA( phi,
mass ) );
229 return HepLorentzVector( px, py, pz, E );
233 HepSymMatrix& Emx )
const {
245 double pt = fabs( m_pt );
246 double px = -pt *
sin( m_ac[1] + phi );
247 double py = pt *
cos( m_ac[1] + phi );
248 double pz = pt * m_ac[4];
249 double E = sqrt( pt * pt * ( 1. + m_ac[4] * m_ac[4] ) +
mass *
mass );
251 x.setX( m_pivot.x() + m_ac[0] * m_cp + m_r * ( m_cp -
cos( m_ac[1] + phi ) ) );
252 x.setY( m_pivot.y() + m_ac[0] * m_sp + m_r * ( m_sp -
sin( m_ac[1] + phi ) ) );
253 x.setZ( m_pivot.z() + m_ac[3] - m_r * m_ac[4] * phi );
255 if ( m_matrixValid ) Emx = m_Ea.similarity(
del4MXDelA( phi,
mass ) );
258 return HepLorentzVector( px, py, pz, E );
262 const double&
dr = m_ac[0];
263 const double&
phi0 = m_ac[1];
264 const double&
kappa = m_ac[2];
265 const double&
dz = m_ac[3];
266 const double&
tanl = m_ac[4];
268 double rdr =
dr + m_r;
270 double csf0 =
cos( phi );
271 double snf0 = ( 1. - csf0 ) * ( 1. + csf0 );
272 snf0 = sqrt( ( snf0 > 0. ) ? snf0 : 0. );
273 if ( phi >
M_PI ) snf0 = -snf0;
275 double xc = m_pivot.x() + rdr * csf0;
276 double yc = m_pivot.y() + rdr * snf0;
280 csf = ( xc - newPivot.x() ) / m_r;
281 snf = ( yc - newPivot.y() ) / m_r;
282 double anrm = sqrt( csf * csf + snf * snf );
287 phi = atan2( snf, csf );
304 double drp = ( m_pivot.x() +
dr * csf0 + m_r * ( csf0 - csf ) - newPivot.x() ) * csf +
305 ( m_pivot.y() +
dr * snf0 + m_r * ( snf0 - snf ) - newPivot.y() ) * snf;
306 double dzp = m_pivot.z() +
dz - m_r *
tanl * phid - newPivot.z();
316 if ( m_matrixValid ) m_Ea = m_Ea.similarity(
delApDelA( ap ) );
330 m_matrixValid =
true;
335 if (
this == &i )
return *
this;
337 m_bField = i.m_bField;
342 m_matrixValid = i.m_matrixValid;
344 m_center = i.m_center;
358void VFHelix::updateCache(
void ) {
372 m_cp =
cos( m_ac[1] );
373 m_sp =
sin( m_ac[1] );
374 if ( m_ac[2] != 0.0 )
377 m_r = m_alpha / m_ac[2];
385 double x = m_pivot.x() + ( m_ac[0] + m_r ) * m_cp;
386 double y = m_pivot.y() + ( m_ac[0] + m_r ) * m_sp;
398 HepMatrix dApDA( 5, 5, 0 );
400 const double&
dr = m_ac[0];
401 const double&
phi0 = m_ac[1];
402 const double& cpa = m_ac[2];
403 const double&
dz = m_ac[3];
404 const double& tnl = m_ac[4];
407 double phi0p = ap[1];
412 double rdr = m_r +
dr;
414 if ( ( m_r + drp ) != 0.0 ) { rdrpr = 1. / ( m_r + drp ); }
418 double csfd =
cos( phi0p -
phi0 );
419 double snfd =
sin( phi0p -
phi0 );
424 dApDA[0][1] = rdr * snfd;
425 if ( cpa != 0.0 ) { dApDA[0][2] = ( m_r / cpa ) * ( 1.0 - csfd ); }
426 else { dApDA[0][2] = (
DBL_MAX ); }
428 dApDA[1][0] = -rdrpr * snfd;
429 dApDA[1][1] = rdr * rdrpr * csfd;
430 if ( cpa != 0.0 ) { dApDA[1][2] = ( m_r / cpa ) * rdrpr * snfd; }
431 else { dApDA[1][2] = (
DBL_MAX ); }
435 dApDA[3][0] = m_r * rdrpr * tnl * snfd;
436 dApDA[3][1] = m_r * tnl * ( 1.0 - rdr * rdrpr * csfd );
437 if ( cpa != 0.0 ) { dApDA[3][2] = ( m_r / cpa ) * tnl * ( phid - m_r * rdrpr * snfd ); }
438 else { dApDA[3][2] = (
DBL_MAX ); }
440 dApDA[3][4] = -m_r * phid;
454 HepMatrix dXDA( 3, 5, 0 );
456 const double&
dr = m_ac[0];
457 const double&
phi0 = m_ac[1];
458 const double& cpa = m_ac[2];
459 const double&
dz = m_ac[3];
460 const double& tnl = m_ac[4];
462 double cosf0phi =
cos(
phi0 + phi );
463 double sinf0phi =
sin(
phi0 + phi );
466 dXDA[0][1] = -
dr * m_sp + m_r * ( -m_sp + sinf0phi );
467 if ( cpa != 0.0 ) { dXDA[0][2] = -( m_r / cpa ) * ( m_cp - cosf0phi ); }
468 else { dXDA[0][2] = (
DBL_MAX ); }
473 dXDA[1][1] =
dr * m_cp + m_r * ( m_cp - cosf0phi );
474 if ( cpa != 0.0 ) { dXDA[1][2] = -( m_r / cpa ) * ( m_sp - sinf0phi ); }
475 else { dXDA[1][2] = (
DBL_MAX ); }
481 if ( cpa != 0.0 ) { dXDA[2][2] = ( m_r / cpa ) * tnl * phi; }
482 else { dXDA[2][2] = (
DBL_MAX ); }
484 dXDA[2][4] = -m_r * phi;
496 HepMatrix dMDA( 3, 5, 0 );
498 const double&
phi0 = m_ac[1];
499 const double& cpa = m_ac[2];
500 const double& tnl = m_ac[4];
502 double cosf0phi =
cos(
phi0 + phi );
503 double sinf0phi =
sin(
phi0 + phi );
506 if ( cpa != 0. ) rho = 1. / cpa;
510 if ( cpa < 0. ) charge = -1.;
512 dMDA[0][1] = -fabs( rho ) * cosf0phi;
513 dMDA[0][2] = charge * rho * rho * sinf0phi;
515 dMDA[1][1] = -fabs( rho ) * sinf0phi;
516 dMDA[1][2] = -charge * rho * rho * cosf0phi;
518 dMDA[2][2] = -charge * rho * rho * tnl;
519 dMDA[2][4] = fabs( rho );
531 HepMatrix d4MDA( 4, 5, 0 );
533 double phi0 = m_ac[1];
534 double cpa = m_ac[2];
535 double tnl = m_ac[4];
537 double cosf0phi =
cos(
phi0 + phi );
538 double sinf0phi =
sin(
phi0 + phi );
541 if ( cpa != 0. ) rho = 1. / cpa;
545 if ( cpa < 0. ) charge = -1.;
547 double E = sqrt( rho * rho * ( 1. + tnl * tnl ) +
mass *
mass );
549 d4MDA[0][1] = -fabs( rho ) * cosf0phi;
550 d4MDA[0][2] = charge * rho * rho * sinf0phi;
552 d4MDA[1][1] = -fabs( rho ) * sinf0phi;
553 d4MDA[1][2] = -charge * rho * rho * cosf0phi;
555 d4MDA[2][2] = -charge * rho * rho * tnl;
556 d4MDA[2][4] = fabs( rho );
558 if ( cpa != 0.0 && E != 0.0 )
560 d4MDA[3][2] = ( -1. - tnl * tnl ) / ( cpa * cpa * cpa * E );
561 d4MDA[3][4] = tnl / ( cpa * cpa * E );
578 HepMatrix d4MXDA( 7, 5, 0 );
580 const double&
dr = m_ac[0];
581 const double&
phi0 = m_ac[1];
582 const double& cpa = m_ac[2];
583 const double&
dz = m_ac[3];
584 const double& tnl = m_ac[4];
586 double cosf0phi =
cos(
phi0 + phi );
587 double sinf0phi =
sin(
phi0 + phi );
590 if ( cpa != 0. ) rho = 1. / cpa;
594 if ( cpa < 0. ) charge = -1.;
596 double E = sqrt( rho * rho * ( 1. + tnl * tnl ) +
mass *
mass );
598 d4MXDA[0][1] = -fabs( rho ) * cosf0phi;
599 d4MXDA[0][2] = charge * rho * rho * sinf0phi;
601 d4MXDA[1][1] = -fabs( rho ) * sinf0phi;
602 d4MXDA[1][2] = -charge * rho * rho * cosf0phi;
604 d4MXDA[2][2] = -charge * rho * rho * tnl;
605 d4MXDA[2][4] = fabs( rho );
607 if ( cpa != 0.0 && E != 0.0 )
609 d4MXDA[3][2] = ( -1. - tnl * tnl ) / ( cpa * cpa * cpa * E );
610 d4MXDA[3][4] = tnl / ( cpa * cpa * E );
619 d4MXDA[4][1] = -
dr * m_sp + m_r * ( -m_sp + sinf0phi );
620 if ( cpa != 0.0 ) { d4MXDA[4][2] = -( m_r / cpa ) * ( m_cp - cosf0phi ); }
621 else { d4MXDA[4][2] = (
DBL_MAX ); }
624 d4MXDA[5][1] =
dr * m_cp + m_r * ( m_cp - cosf0phi );
627 d4MXDA[5][2] = -( m_r / cpa ) * ( m_sp - sinf0phi );
629 d4MXDA[6][2] = ( m_r / cpa ) * tnl * phi;
639 d4MXDA[6][4] = -m_r * phi;
645 m_matrixValid =
false;
double sin(const BesAngle a)
double cos(const BesAngle a)
NTuple::Item< double > m_pt
HepGeom::Point3D< double > HepPoint3D
virtual ~VFHelix()
Destructor.
HepMatrix del4MDelA(double phi, double mass) const
const HepPoint3D & pivot(void) const
returns pivot position.
HepPoint3D x(double dPhi=0.) const
returns position after rotating angle dPhi in phi direction.
HepMatrix delApDelA(const HepVector &ap) const
double dr(void) const
returns an element of parameters.
HepMatrix delMDelA(double phi) const
HepMatrix del4MXDelA(double phi, double mass) const
Hep3Vector momentum(double dPhi=0.) const
returns momentum vector after rotating angle dPhi in phi direction.
HepMatrix delXDelA(double phi) const
void ignoreErrorMatrix(void)
void set(const HepPoint3D &pivot, const HepVector &a, const HepSymMatrix &Ea)
sets helix pivot position, parameters, and error matrix.
VFHelix & operator=(const VFHelix &)
Copy operator.
VFHelix(const HepPoint3D &pivot, const HepVector &a, const HepSymMatrix &Ea)
Constructor with pivot, helix parameter a, and its error matrix.
static const double ConstantAlpha
Constant alpha for uniform field.
const HepSymMatrix & Ea(void) const
returns error matrix.
const HepVector & a(void) const
returns helix parameters.
static VertexFitBField * instance()