16 #include "trg/cdc/Helix.h"
17 #include "CLHEP/Matrix/Matrix.h"
64 if (a_min.num_row() != 5 || a_max.num_row() != 5)
return;
72 const CLHEP::HepVector& a,
73 const CLHEP::HepSymMatrix& Ea)
74 : m_matrixValid(true),
84 if (
m_a.num_row() == 5 &&
m_Ea.num_row() == 5) {
90 const CLHEP::HepVector& a)
91 : m_matrixValid(false),
97 m_Ea(CLHEP::HepSymMatrix(5, 0))
100 if (
m_a.num_row() == 5) {
106 const CLHEP::Hep3Vector& momentum,
108 : m_matrixValid(false),
113 m_a(CLHEP::HepVector(5, 0)),
114 m_Ea(CLHEP::HepSymMatrix(5, 0))
122 m_a[2] = charge / perp;
125 m_a[2] = charge * (DBL_MAX);
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 return CLHEP::Hep3Vector(px, py, pz);
228 double pt = fabs(
m_pt);
229 double px = - pt * sin(
m_ac[1] + phi);
230 double py = pt * cos(
m_ac[1] + phi);
231 double pz = pt *
m_ac[4];
236 return CLHEP::Hep3Vector(px, py, pz);
239 CLHEP::HepLorentzVector
253 double pt = fabs(
m_pt);
254 double px = - pt * sin(
m_ac[1] + phi);
255 double py = pt * cos(
m_ac[1] + phi);
256 double pz = pt *
m_ac[4];
257 double E = sqrt(pt * pt * (1. +
m_ac[4] *
m_ac[4]) + mass * mass);
259 return CLHEP::HepLorentzVector(px, py, pz, E);
263 CLHEP::HepLorentzVector
277 double pt = fabs(
m_pt);
278 double px = - pt * sin(
m_ac[1] + phi);
279 double py = pt * cos(
m_ac[1] + phi);
280 double pz = pt *
m_ac[4];
281 double E = sqrt(pt * pt * (1. +
m_ac[4] *
m_ac[4]) + mass * mass);
286 return CLHEP::HepLorentzVector(px, py, pz, E);
289 CLHEP::HepLorentzVector
293 CLHEP::HepSymMatrix& Emx)
const
307 double pt = fabs(
m_pt);
308 double px = - pt * sin(
m_ac[1] + phi);
309 double py = pt * cos(
m_ac[1] + phi);
310 double pz = pt *
m_ac[4];
311 double E = sqrt(pt * pt * (1. +
m_ac[4] *
m_ac[4]) + mass * mass);
320 return CLHEP::HepLorentzVector(px, py, pz, E);
327 #if defined(BELLE_DEBUG)
330 const double&
dr =
m_ac[0];
333 const double&
dz =
m_ac[3];
336 double rdr =
dr +
m_r;
338 double csf0 = cos(phi);
339 double snf0 = (1. - csf0) * (1. + csf0);
340 snf0 = sqrt((snf0 > 0.) ? snf0 : 0.);
341 if (phi > M_PI) snf0 = - snf0;
343 double xc =
m_pivot.x() + rdr * csf0;
344 double yc =
m_pivot.y() + rdr * snf0;
347 csf = (xc - newPivot.x()) /
m_r;
348 snf = (yc - newPivot.y()) /
m_r;
349 double anrm = sqrt(csf * csf + snf * snf);
353 phi = atan2(snf, csf);
365 if (phid > M_PI) phid = phid -
M_PI2;
366 double drp = (
m_pivot.x() +
dr * csf0 +
m_r * (csf0 - csf) - newPivot.x())
368 + (
m_pivot.y() +
dr * snf0 +
m_r * (snf0 - snf) - newPivot.y()) * snf;
371 CLHEP::HepVector ap(5);
387 #if defined(BELLE_DEBUG)
398 const CLHEP::HepVector& a,
399 const CLHEP::HepSymMatrix& Ea)
412 if (
this == & i)
return *
this;
439 #if defined(BELLE_DEBUG)
457 if (
m_ac[2] != 0.0) {
458 if (
m_ac[2] == DBL_MAX ||
m_ac[2] == (-DBL_MAX)) {
476 #if defined(BELLE_DEBUG)
486 if (
m_ac[2] != 0.0) {
487 if (
m_ac[2] == DBL_MAX ||
m_ac[2] == (-DBL_MAX)) {
517 CLHEP::HepMatrix dApDA(5, 5, 0);
519 const double&
dr =
m_ac[0];
521 const double& cpa =
m_ac[2];
523 const double& tnl =
m_ac[4];
526 double phi0p = ap[1];
531 double rdr =
m_r +
dr;
533 if ((
m_r + drp) != 0.0) {
534 rdrpr = 1. / (
m_r + drp);
540 double csfd = cos(phi0p -
phi0);
541 double snfd = sin(phi0p -
phi0);
543 if (phid > M_PI) phid = phid -
M_PI2;
546 dApDA[0][1] = rdr * snfd;
548 dApDA[0][2] = (
m_r / cpa) * (1.0 - csfd);
550 dApDA[0][2] = (DBL_MAX);
553 dApDA[1][0] = - rdrpr * snfd;
554 dApDA[1][1] = rdr * rdrpr * csfd;
556 dApDA[1][2] = (
m_r / cpa) * rdrpr * snfd;
558 dApDA[1][2] = (DBL_MAX);
563 dApDA[3][0] =
m_r * rdrpr * tnl * snfd;
564 dApDA[3][1] =
m_r * tnl * (1.0 - rdr * rdrpr * csfd);
566 dApDA[3][2] = (
m_r / cpa) * tnl * (phid -
m_r * rdrpr * snfd);
568 dApDA[3][2] = (DBL_MAX);
571 dApDA[3][4] = -
m_r * phid;
587 CLHEP::HepMatrix dXDA(3, 5, 0);
589 const double&
dr =
m_ac[0];
591 const double& cpa =
m_ac[2];
593 const double& tnl =
m_ac[4];
595 double cosf0phi = cos(
phi0 + phi);
596 double sinf0phi = sin(
phi0 + phi);
601 dXDA[0][2] = - (
m_r / cpa) * (
m_cp - cosf0phi);
603 dXDA[0][2] = (DBL_MAX);
611 dXDA[1][2] = - (
m_r / cpa) * (
m_sp - sinf0phi);
613 dXDA[1][2] = (DBL_MAX);
621 dXDA[2][2] = (
m_r / cpa) * tnl * phi;
623 dXDA[2][2] = (DBL_MAX);
626 dXDA[2][4] = -
m_r * phi;
642 CLHEP::HepMatrix dMDA(3, 5, 0);
645 const double& cpa =
m_ac[2];
646 const double& tnl =
m_ac[4];
648 double cosf0phi = cos(
phi0 + phi);
649 double sinf0phi = sin(
phi0 + phi);
652 if (cpa != 0.)rho = 1. / cpa;
653 else rho = (DBL_MAX);
656 if (cpa < 0.)charge = -1.;
658 dMDA[0][1] = -fabs(rho) * cosf0phi;
659 dMDA[0][2] = charge * rho * rho * sinf0phi;
661 dMDA[1][1] = -fabs(rho) * sinf0phi;
662 dMDA[1][2] = -charge * rho * rho * cosf0phi;
664 dMDA[2][2] = -charge * rho * rho * tnl;
665 dMDA[2][4] = fabs(rho);
681 CLHEP::HepMatrix d4MDA(4, 5, 0);
684 double cpa =
m_ac[2];
685 double tnl =
m_ac[4];
687 double cosf0phi = cos(
phi0 + phi);
688 double sinf0phi = sin(
phi0 + phi);
691 if (cpa != 0.)rho = 1. / cpa;
692 else rho = (DBL_MAX);
695 if (cpa < 0.)charge = -1.;
697 double E = sqrt(rho * rho * (1. + tnl * tnl) + mass * mass);
699 d4MDA[0][1] = -fabs(rho) * cosf0phi;
700 d4MDA[0][2] = charge * rho * rho * sinf0phi;
702 d4MDA[1][1] = -fabs(rho) * sinf0phi;
703 d4MDA[1][2] = -charge * rho * rho * cosf0phi;
705 d4MDA[2][2] = -charge * rho * rho * tnl;
706 d4MDA[2][4] = fabs(rho);
708 if (cpa != 0.0 && E != 0.0) {
709 d4MDA[3][2] = (-1. - tnl * tnl) / (cpa * cpa * cpa * E);
710 d4MDA[3][4] = tnl / (cpa * cpa * E);
712 d4MDA[3][2] = (DBL_MAX);
713 d4MDA[3][4] = (DBL_MAX);
729 CLHEP::HepMatrix d4MXDA(7, 5, 0);
731 const double&
dr =
m_ac[0];
733 const double& cpa =
m_ac[2];
735 const double& tnl =
m_ac[4];
737 double cosf0phi = cos(
phi0 + phi);
738 double sinf0phi = sin(
phi0 + phi);
741 if (cpa != 0.)rho = 1. / cpa;
742 else rho = (DBL_MAX);
745 if (cpa < 0.)charge = -1.;
747 double E = sqrt(rho * rho * (1. + tnl * tnl) + mass * mass);
749 d4MXDA[0][1] = - fabs(rho) * cosf0phi;
750 d4MXDA[0][2] = charge * rho * rho * sinf0phi;
752 d4MXDA[1][1] = - fabs(rho) * sinf0phi;
753 d4MXDA[1][2] = - charge * rho * rho * cosf0phi;
755 d4MXDA[2][2] = - charge * rho * rho * tnl;
756 d4MXDA[2][4] = fabs(rho);
758 if (cpa != 0.0 && E != 0.0) {
759 d4MXDA[3][2] = (- 1. - tnl * tnl) / (cpa * cpa * cpa * E);
760 d4MXDA[3][4] = tnl / (cpa * cpa * E);
762 d4MXDA[3][2] = (DBL_MAX);
763 d4MXDA[3][4] = (DBL_MAX);
769 d4MXDA[4][2] = - (
m_r / cpa) * (
m_cp - cosf0phi);
771 d4MXDA[4][2] = (DBL_MAX);
777 d4MXDA[5][2] = - (
m_r / cpa) * (
m_sp - sinf0phi);
779 d4MXDA[6][2] = (
m_r / cpa) * tnl * phi;
781 d4MXDA[5][2] = (DBL_MAX);
783 d4MXDA[6][2] = (DBL_MAX);
787 d4MXDA[6][4] = -
m_r * phi;
803 const double dr =
m_a[0];
805 const double cpa =
m_a[2];
806 const double dz =
m_a[3];
807 const double tnl =
m_a[4];
809 std::cout <<
"TRGCDCHelix::dr = " <<
dr <<
" phi0 = " <<
phi0 <<
" cpa = " << cpa
810 <<
" dz = " <<
dz <<
" tnl = " << tnl << std::endl;
811 std::cout <<
" pivot = " <<
m_pivot << std::endl;
820 const double adr = fabs(
m_a[0]);
822 const double acpa = fabs(
m_a[2]);
831 if (
m_a[0] != 0.0 ||
m_a[1] != 0.0 ||
m_a[2] != 0.0 ||
832 m_a[3] != 0.0 ||
m_a[4] != 0.0)
833 std::cout <<
"something wrong" << std::endl;