84 #include <cdc/simulation/Helix.h>
85 #include "CLHEP/Matrix/Matrix.h"
87 using namespace CLHEP;
106 Helix::ConstantAlpha = 222.376063;
108 const std::string Helix::invalidhelix(
"Invalid Helix");
109 HepVector Helix::ms_amin(5, 0), Helix::ms_amax(5, 0);
110 bool Helix::ms_check_range(
false);
111 bool Helix::ms_throw_exception(
false);
112 bool Helix::ms_print_debug(
false);
114 bool Helix::set_exception(
bool t)
116 return ms_throw_exception = t;
119 bool Helix::set_print(
bool t)
121 return ms_print_debug = t;
125 void Helix::set_limits(
const HepVector& a_min,
const HepVector& a_max)
127 if (a_min.num_row() != 5 || a_max.num_row() != 5)
return;
130 ms_check_range =
true;
136 const HepSymMatrix& Ea)
137 : m_matrixValid(true),
147 if (
m_a.num_row() == 5 &&
m_Ea.num_row() == 5) {
154 : m_matrixValid(false),
160 m_Ea(HepSymMatrix(5, 0))
163 if (
m_a.num_row() == 5) {
169 const Hep3Vector& momentum,
171 : m_matrixValid(false),
176 m_a(HepVector(5, 0)),
177 m_Ea(HepSymMatrix(5, 0))
185 m_a[2] = charge / perp;
188 m_a[2] = charge * (DBL_MAX);
274 double pt = fabs(
m_pt);
275 double px = - pt * sin(
m_ac[1] + phi);
276 double py = pt * cos(
m_ac[1] + phi);
277 double pz = pt *
m_ac[4];
279 return Hep3Vector(px, py, pz);
296 double pt = fabs(
m_pt);
297 double px = - pt * sin(
m_ac[1] + phi);
298 double py = pt * cos(
m_ac[1] + phi);
299 double pz = pt *
m_ac[4];
304 return Hep3Vector(px, py, pz);
322 double pt = fabs(
m_pt);
323 double px = - pt * sin(
m_ac[1] + phi);
324 double py = pt * cos(
m_ac[1] + phi);
325 double pz = pt *
m_ac[4];
326 double E = sqrt(pt * pt * (1. +
m_ac[4] *
m_ac[4]) + mass * mass);
328 return HepLorentzVector(px, py, pz, E);
347 double pt = fabs(
m_pt);
348 double px = - pt * sin(
m_ac[1] + phi);
349 double py = pt * cos(
m_ac[1] + phi);
350 double pz = pt *
m_ac[4];
351 double E = sqrt(pt * pt * (1. +
m_ac[4] *
m_ac[4]) + mass * mass);
356 return HepLorentzVector(px, py, pz, E);
363 HepSymMatrix& Emx)
const
377 double pt = fabs(
m_pt);
378 double px = - pt * sin(
m_ac[1] + phi);
379 double py = pt * cos(
m_ac[1] + phi);
380 double pz = pt *
m_ac[4];
381 double E = sqrt(pt * pt * (1. +
m_ac[4] *
m_ac[4]) + mass * mass);
390 return HepLorentzVector(px, py, pz, E);
398 #if defined(BELLE_DEBUG)
401 const double&
dr =
m_ac[0];
404 const double&
dz =
m_ac[3];
407 double rdr =
dr +
m_r;
409 double csf0 = cos(phi);
410 double snf0 = (1. - csf0) * (1. + csf0);
411 snf0 = sqrt((snf0 > 0.) ? snf0 : 0.);
412 if (phi > M_PI) snf0 = - snf0;
414 double xc =
m_pivot.x() + rdr * csf0;
415 double yc =
m_pivot.y() + rdr * snf0;
418 csf = (xc - newPivot.x()) /
m_r;
419 snf = (yc - newPivot.y()) /
m_r;
420 double anrm = sqrt(csf * csf + snf * snf);
424 phi = atan2(snf, csf);
436 if (phid > M_PI) phid = phid -
M_PI2;
437 double drp = (
m_pivot.x() +
dr * csf0 +
m_r * (csf0 - csf) - newPivot.x())
439 + (
m_pivot.y() +
dr * snf0 +
m_r * (snf0 - snf) - newPivot.y()) * snf;
458 #if defined(BELLE_DEBUG)
471 const HepSymMatrix& Ea)
485 if (
this == & i)
return *
this;
513 #if defined(BELLE_DEBUG)
533 if (
m_ac[2] != 0.0) {
534 if (
m_ac[2] == DBL_MAX ||
m_ac[2] == (-DBL_MAX)) {
552 #if defined(BELLE_DEBUG)
562 if (
m_ac[2] != 0.0) {
563 if (
m_ac[2] == DBL_MAX ||
m_ac[2] == (-DBL_MAX)) {
594 HepMatrix dApDA(5, 5, 0);
596 const double&
dr =
m_ac[0];
598 const double& cpa =
m_ac[2];
600 const double& tnl =
m_ac[4];
603 double phi0p = ap[1];
608 double rdr =
m_r +
dr;
610 if ((
m_r + drp) != 0.0) {
611 rdrpr = 1. / (
m_r + drp);
617 double csfd = cos(phi0p -
phi0);
618 double snfd = sin(phi0p -
phi0);
620 if (phid > M_PI) phid = phid -
M_PI2;
623 dApDA[0][1] = rdr * snfd;
625 dApDA[0][2] = (
m_r / cpa) * (1.0 - csfd);
627 dApDA[0][2] = (DBL_MAX);
630 dApDA[1][0] = - rdrpr * snfd;
631 dApDA[1][1] = rdr * rdrpr * csfd;
633 dApDA[1][2] = (
m_r / cpa) * rdrpr * snfd;
635 dApDA[1][2] = (DBL_MAX);
640 dApDA[3][0] =
m_r * rdrpr * tnl * snfd;
641 dApDA[3][1] =
m_r * tnl * (1.0 - rdr * rdrpr * csfd);
643 dApDA[3][2] = (
m_r / cpa) * tnl * (phid -
m_r * rdrpr * snfd);
645 dApDA[3][2] = (DBL_MAX);
648 dApDA[3][4] = -
m_r * phid;
665 HepMatrix dXDA(3, 5, 0);
667 const double&
dr =
m_ac[0];
669 const double& cpa =
m_ac[2];
671 const double& tnl =
m_ac[4];
673 double cosf0phi = cos(
phi0 + phi);
674 double sinf0phi = sin(
phi0 + phi);
679 dXDA[0][2] = - (
m_r / cpa) * (
m_cp - cosf0phi);
681 dXDA[0][2] = (DBL_MAX);
689 dXDA[1][2] = - (
m_r / cpa) * (
m_sp - sinf0phi);
691 dXDA[1][2] = (DBL_MAX);
699 dXDA[2][2] = (
m_r / cpa) * tnl * phi;
701 dXDA[2][2] = (DBL_MAX);
704 dXDA[2][4] = -
m_r * phi;
721 HepMatrix dMDA(3, 5, 0);
724 const double& cpa =
m_ac[2];
725 const double& tnl =
m_ac[4];
727 double cosf0phi = cos(
phi0 + phi);
728 double sinf0phi = sin(
phi0 + phi);
731 if (cpa != 0.)rho = 1. / cpa;
732 else rho = (DBL_MAX);
735 if (cpa < 0.)charge = -1.;
737 dMDA[0][1] = -fabs(rho) * cosf0phi;
738 dMDA[0][2] = charge * rho * rho * sinf0phi;
740 dMDA[1][1] = -fabs(rho) * sinf0phi;
741 dMDA[1][2] = -charge * rho * rho * cosf0phi;
743 dMDA[2][2] = -charge * rho * rho * tnl;
744 dMDA[2][4] = fabs(rho);
761 HepMatrix d4MDA(4, 5, 0);
764 double cpa =
m_ac[2];
765 double tnl =
m_ac[4];
767 double cosf0phi = cos(
phi0 + phi);
768 double sinf0phi = sin(
phi0 + phi);
771 if (cpa != 0.)rho = 1. / cpa;
772 else rho = (DBL_MAX);
775 if (cpa < 0.)charge = -1.;
777 double E = sqrt(rho * rho * (1. + tnl * tnl) + mass * mass);
779 d4MDA[0][1] = -fabs(rho) * cosf0phi;
780 d4MDA[0][2] = charge * rho * rho * sinf0phi;
782 d4MDA[1][1] = -fabs(rho) * sinf0phi;
783 d4MDA[1][2] = -charge * rho * rho * cosf0phi;
785 d4MDA[2][2] = -charge * rho * rho * tnl;
786 d4MDA[2][4] = fabs(rho);
788 if (cpa != 0.0 && E != 0.0) {
789 d4MDA[3][2] = (-1. - tnl * tnl) / (cpa * cpa * cpa * E);
790 d4MDA[3][4] = tnl / (cpa * cpa * E);
792 d4MDA[3][2] = (DBL_MAX);
793 d4MDA[3][4] = (DBL_MAX);
810 HepMatrix d4MXDA(7, 5, 0);
812 const double&
dr =
m_ac[0];
814 const double& cpa =
m_ac[2];
816 const double& tnl =
m_ac[4];
818 double cosf0phi = cos(
phi0 + phi);
819 double sinf0phi = sin(
phi0 + phi);
822 if (cpa != 0.)rho = 1. / cpa;
823 else rho = (DBL_MAX);
826 if (cpa < 0.)charge = -1.;
828 double E = sqrt(rho * rho * (1. + tnl * tnl) + mass * mass);
830 d4MXDA[0][1] = - fabs(rho) * cosf0phi;
831 d4MXDA[0][2] = charge * rho * rho * sinf0phi;
833 d4MXDA[1][1] = - fabs(rho) * sinf0phi;
834 d4MXDA[1][2] = - charge * rho * rho * cosf0phi;
836 d4MXDA[2][2] = - charge * rho * rho * tnl;
837 d4MXDA[2][4] = fabs(rho);
839 if (cpa != 0.0 && E != 0.0) {
840 d4MXDA[3][2] = (- 1. - tnl * tnl) / (cpa * cpa * cpa * E);
841 d4MXDA[3][4] = tnl / (cpa * cpa * E);
843 d4MXDA[3][2] = (DBL_MAX);
844 d4MXDA[3][4] = (DBL_MAX);
850 d4MXDA[4][2] = - (
m_r / cpa) * (
m_cp - cosf0phi);
852 d4MXDA[4][2] = (DBL_MAX);
858 d4MXDA[5][2] = - (
m_r / cpa) * (
m_sp - sinf0phi);
860 d4MXDA[6][2] = (
m_r / cpa) * tnl * phi;
862 d4MXDA[5][2] = (DBL_MAX);
864 d4MXDA[6][2] = (DBL_MAX);
868 d4MXDA[6][4] = -
m_r * phi;
884 const double dr =
m_a[0];
886 const double cpa =
m_a[2];
887 const double dz =
m_a[3];
888 const double tnl =
m_a[4];
890 std::cout <<
"Helix::dr = " <<
dr <<
" phi0 = " <<
phi0 <<
" cpa = " << cpa
891 <<
" dz = " <<
dz <<
" tnl = " << tnl << std::endl;
892 std::cout <<
" pivot = " <<
m_pivot << std::endl;
901 const double adr = fabs(
m_a[0]);
902 const double acpa = fabs(
m_a[2]);
911 if (
m_a[0] != 0.0 ||
m_a[1] != 0.0 ||
m_a[2] != 0.0 ||
912 m_a[3] != 0.0 ||
m_a[4] != 0.0) {