/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Mdc/DedxCorrecSvc/DedxCorrecSvc-00-02-52/src/Dedx_Helix.cxx

Go to the documentation of this file.
00001 //
00002 // $Id: Dedx_Helix.cxx,v 1.3 2011/02/23 00:36:21 maqm Exp $
00003 //
00004 // $Log: Dedx_Helix.cxx,v $
00005 // Revision 1.3  2011/02/23 00:36:21  maqm
00006 // slc5-x64-gcc43
00007 //
00008 // Revision 1.2  2011/02/17 11:09:39  maqm
00009 // x64-slc5-gcc43
00010 //
00011 // Revision 1.1  2008/06/30 01:43:15  xcao
00012 // change Helix into Dedx_Helix
00013 //
00014 // Revision 1.2  2008/04/18 03:36:05  max
00015 // *** empty log message ***
00016 //
00017 // Revision 1.1.1.1  2006/01/06 08:25:05  wangdy
00018 // first import of this package
00019 //
00020 // Revision 1.2  2005/04/20 13:56:14  wangdy
00021 // codes updated for Bes detector ,see recent changeLog
00022 //
00023 // Revision 1.1.1.1  2005/03/17 13:31:56  wangdy
00024 // first import this package
00025 //
00026 // Revision 1.19  2002/01/03 11:05:06  katayama
00027 // Point3D and other header files are cleaned
00028 //
00029 // Revision 1.18  2001/05/07 21:06:37  yiwasaki
00030 // <float.h> included for linux
00031 //
00032 // Revision 1.17  2001/04/25 02:55:39  yiwasaki
00033 // cache m_ac[5] added
00034 //
00035 // Revision 1.16  2001/04/18 12:09:19  katayama
00036 // optimized
00037 //
00038 // Revision 1.15  2000/01/26 10:22:53  yiwasaki
00039 // copy operator bug fix(reported by M.Yokoyama)
00040 //
00041 // Revision 1.14  1999/11/23 10:29:22  yiwasaki
00042 // static cosnt double Helix::ConstantAlpha added
00043 //
00044 // Revision 1.13  1999/06/15 01:49:41  yiwasaki
00045 // constructor bug fix
00046 //
00047 // Revision 1.12  1999/06/15 01:44:53  yiwasaki
00048 // minor change
00049 //
00050 // Revision 1.11  1999/06/06 07:34:27  yiwasaki
00051 // i/o functions to set/get mag. field added
00052 //
00053 // Revision 1.10  1999/05/11 23:26:59  yiwasaki
00054 // option to ignore error calculations added
00055 //
00056 // Revision 1.9  1998/11/06 08:51:19  katayama
00057 // protect 0div
00058 //
00059 // Revision 1.8  1998/07/08 04:35:50  jtanaka
00060 // add some members to the constructor by Iwasaki-san and Ozaki-san
00061 //
00062 // Revision 1.7  1998/06/18 10:27:20  katayama
00063 // Added several new functions from Tanaka san
00064 //
00065 // Revision 1.6  1998/02/24 01:07:59  yiwasaki
00066 // minor fix
00067 //
00068 // Revision 1.5  1998/02/24 00:31:52  yiwasaki
00069 // bug fix
00070 //
00071 // Revision 1.4  1998/02/20 02:22:23  yiwasaki
00072 // for new helix class
00073 //
00074 // Revision 1.3  1998/01/22 08:38:07  hitoshi
00075 // Fixed a bug in fid cal. (found at Osaka).
00076 //
00077 // Revision 1.2  1997/09/19 00:35:52  katayama
00078 // Added Id and Log
00079 //
00080 //
00081 //
00082 //   Class Helix 
00083 //
00084 //   Author      Date         comments
00085 //   Y.Ohnishi   03/01/1997   original version
00086 //   Y.Ohnishi   06/03/1997   updated
00087 //   Y.Iwasaki   17/02/1998   BFILED removed, func. name changed, func. added
00088 //   J.Tanaka    06/12/1998   add some utilities.
00089 //   Y.Iwasaki   07/07/1998   cache added to speed up
00090 //
00091 
00092 #include <math.h>
00093 #include <float.h>
00094 #include <iostream>
00095 #include "DedxCorrecSvc/Dedx_Helix.h"
00096 #include "CLHEP/Matrix/Matrix.h"
00097 #include "GaudiKernel/StatusCode.h"
00098 #include "GaudiKernel/IInterface.h"
00099 #include "GaudiKernel/Kernel.h"
00100 #include "GaudiKernel/Service.h"
00101 #include "GaudiKernel/Kernel.h"
00102 #include "GaudiKernel/ISvcLocator.h"
00103 #include "GaudiKernel/SvcFactory.h"
00104 #include "GaudiKernel/IDataProviderSvc.h"
00105 #include "GaudiKernel/Bootstrap.h"
00106 #include "GaudiKernel/MsgStream.h"
00107 #include "GaudiKernel/SmartDataPtr.h"
00108 #include "GaudiKernel/IMessageSvc.h"
00109 #include "GaudiKernel/IPartPropSvc.h"
00110 
00111 #include "GaudiKernel/SmartDataPtr.h"
00112 
00113 
00114 const double
00115 M_PI2 = 2. * M_PI;
00116 
00117 const double
00118 M_PI4 = 4. * M_PI;
00119 
00120 const double
00121 M_PI8 = 8. * M_PI;
00122 
00123 const double
00124 Dedx_Helix::ConstantAlpha = -333.564095;
00125 
00126 Dedx_Helix::Dedx_Helix(const HepPoint3D & pivot,
00127              const HepVector & a,
00128              const HepSymMatrix & Ea)
00129 : //m_bField(10.0),
00130   //m_alpha(333.564095),
00131   m_pivot(pivot),
00132   m_a(a),
00133   m_matrixValid(true),
00134   m_Ea(Ea) {
00135     //ISvcLocator * SvcLocator = Gaudi::SvcLocator(); 
00136     StatusCode scmgn = Gaudi::svcLocator()->service("MagneticFieldSvc",m_pmgnIMF); 
00137     if(scmgn!=StatusCode::SUCCESS) { 
00138      // log << MSG::ERROR << "Unable to open Magnetic field service"<<endreq; 
00139      std::cout<< "Unable to open Magnetic field service"<<std::endl;
00140     }
00141     m_bField = 10000*(m_pmgnIMF->getReferField());
00142     m_alpha = 10000. / 2.99792458 / m_bField;
00143     // m_alpha = 222.376063;
00144     updateCache();
00145 }
00146 
00147 Dedx_Helix::Dedx_Helix(const HepPoint3D & pivot,
00148              const HepVector & a)
00149 : //m_bField(10.0),
00150   //m_alpha(333.564095),
00151   m_pivot(pivot),
00152   m_a(a),
00153   m_matrixValid(false),
00154   m_Ea(HepSymMatrix(5,0)) {
00155     StatusCode scmgn = Gaudi::svcLocator()->service ("MagneticFieldSvc",m_pmgnIMF);
00156     if(scmgn!=StatusCode::SUCCESS) {
00157      // log << MSG::ERROR << "Unable to open Magnetic field service"<<endreq;
00158      std::cout<< "Unable to open Magnetic field service"<<std::endl;
00159     }
00160     m_bField = 10000*(m_pmgnIMF->getReferField());
00161     m_alpha = 10000. / 2.99792458 / m_bField;
00162     //cout<<"m_bField is = "<<m_bField<<"        m_alpha is = "<<m_alpha<<endl;
00163     // m_alpha = 222.376063;
00164     updateCache();
00165 }
00166 
00167 Dedx_Helix::Dedx_Helix(const HepPoint3D & position,
00168              const Hep3Vector & momentum,
00169              double charge)
00170 : //m_bField(10.0),
00171   //m_alpha(333.564095),
00172   m_pivot(position),
00173   m_a(HepVector(5,0)),
00174   m_matrixValid(false),
00175   m_Ea(HepSymMatrix(5,0)) {
00176     StatusCode scmgn = Gaudi::svcLocator()->service ("MagneticFieldSvc",m_pmgnIMF);
00177     if(scmgn!=StatusCode::SUCCESS) {
00178      // log << MSG::ERROR << "Unable to open Magnetic field service"<<endreq;
00179      std::cout<< "Unable to open Magnetic field service"<<std::endl;
00180     }
00181     m_bField = 10000*(m_pmgnIMF->getReferField());
00182     m_alpha = 10000. / 2.99792458 / m_bField;
00183     
00184     m_a[0] = 0.;
00185     m_a[1] = fmod(atan2(- momentum.x(), momentum.y())
00186                   + M_PI4, M_PI2);
00187     m_a[3] = 0.;
00188     double perp(momentum.perp());
00189     if (perp != 0.0) {
00190         m_a[2] = charge / perp;
00191         m_a[4] = momentum.z() / perp; 
00192     }
00193     else {
00194         m_a[2] = charge * (DBL_MAX);
00195         if (momentum.z() >= 0) {
00196             m_a[4] = (DBL_MAX);
00197         } else {
00198             m_a[4] = -(DBL_MAX);
00199         }
00200     }
00201     // m_alpha = 222.376063;
00202     updateCache();
00203 }
00204 
00205 Dedx_Helix::~Dedx_Helix() {
00206 }
00207 
00208 HepPoint3D
00209 Dedx_Helix::x(double phi) const {
00210     //
00211     // Calculate position (x,y,z) along helix.
00212     //   
00213     // x = x0 + dr * cos(phi0) + (alpha / kappa) * (cos(phi0) - cos(phi0+phi))
00214     // y = y0 + dr * sin(phi0) + (alpha / kappa) * (sin(phi0) - sin(phi0+phi))
00215     // z = z0 + dz             - (alpha / kappa) * tan(lambda) * phi
00216     //
00217    // m_ac[0] = m_ac[0] *(-1);
00218     // cout<<"m_bField is = "<<m_bField<<"        m_alpha is = "<<m_alpha<<endl;
00219   // cout<<"m_pivot is = "<<m_pivot<<"       m_ac is = ("<<m_ac[0]<<" , "<<m_ac[1]<<" , "<<m_ac[2]<<" , "<<m_ac[3]<<" , "<<m_ac[4]<<" )"<<endl;
00220   //cout<<"m_cp is = "<<m_cp<<"     "<<"   m_sp is =  "<<m_sp<<"      m_r is =  "<<m_r<<endl;  
00221     //cout<<" m_r + m_ac[0] = "<<m_ac[0] +m_r<<endl;
00222     double x = m_pivot.x() + m_ac[0] * m_cp + m_r * (m_cp - cos(m_ac[1] +phi));
00223     double y = m_pivot.y() + m_ac[0] * m_sp + m_r * (m_sp - sin(m_ac[1] +phi));
00224     double z = m_pivot.z() + m_ac[3] - m_r * m_ac[4] * phi;
00225 
00226     return HepPoint3D(x, y, z);
00227 }
00228 
00229 double *
00230 Dedx_Helix::x(double phi, double p[3]) const {
00231     //
00232     // Calculate position (x,y,z) along helix.
00233     //   
00234     // x = x0 + dr * cos(phi0) + (alpha / kappa) * (cos(phi0) - cos(phi0+phi))
00235     // y = y0 + dr * sin(phi0) + (alpha / kappa) * (sin(phi0) - sin(phi0+phi))
00236     // z = z0 + dz             - (alpha / kappa) * tan(lambda) * phi
00237     //
00238 
00239     p[0] = m_pivot.x() + m_ac[0] * m_cp + m_r * (m_cp - cos(m_ac[1] + phi));
00240     p[1] = m_pivot.y() + m_ac[0] * m_sp + m_r * (m_sp - sin(m_ac[1] + phi));
00241     p[2] = m_pivot.z() + m_ac[3] - m_r * m_ac[4] * phi;
00242 
00243     return p;
00244 }
00245 
00246 HepPoint3D
00247 Dedx_Helix::x(double phi, HepSymMatrix & Ex) const {
00248     double x = m_pivot.x() + m_ac[0] * m_cp + m_r * (m_cp - cos(m_ac[1] +phi));
00249     double y = m_pivot.y() + m_ac[0] * m_sp + m_r * (m_sp - sin(m_ac[1] +phi));
00250     double z = m_pivot.z() + m_ac[3] - m_r * m_ac[4] * phi;
00251 
00252     //
00253     //   Calculate position error matrix.
00254     //   Ex(phi) = (@x/@a)(Ea)(@x/@a)^T, phi is deflection angle to specify the
00255     //   point to be calcualted.
00256     //
00257     // HepMatrix dXDA(3, 5, 0);
00258     // dXDA = delXDelA(phi);
00259     // Ex.assign(dXDA * m_Ea * dXDA.T());
00260 
00261     if (m_matrixValid) Ex = m_Ea.similarity(delXDelA(phi));
00262     else               Ex = m_Ea;
00263 
00264     return HepPoint3D(x, y, z);
00265 }
00266 
00267 Hep3Vector
00268 Dedx_Helix::momentum(double phi) const {
00269     // 
00270     // Calculate momentum.
00271     //
00272     // Pt = | 1/kappa | (GeV/c)
00273     //
00274     // Px = -Pt * sin(phi0 + phi) 
00275     // Py =  Pt * cos(phi0 + phi)
00276     // Pz =  Pt * tan(lambda)
00277     //
00278 
00279     double pt = fabs(m_pt);
00280     double px = - pt * sin(m_ac[1] + phi);
00281     double py =   pt * cos(m_ac[1] + phi);
00282     double pz =   pt * m_ac[4];
00283 
00284     return Hep3Vector(px, py, pz);
00285 }
00286 
00287 Hep3Vector
00288 Dedx_Helix::momentum(double phi, HepSymMatrix & Em) const {
00289     // 
00290     // Calculate momentum.
00291     //
00292     // Pt = | 1/kappa | (GeV/c)
00293     //
00294     // Px = -Pt * sin(phi0 + phi) 
00295     // Py =  Pt * cos(phi0 + phi)
00296     // Pz =  Pt * tan(lambda)
00297     //
00298 
00299     double pt = fabs(m_pt);
00300     double px = - pt * sin(m_ac[1] + phi);
00301     double py =   pt * cos(m_ac[1] + phi);
00302     double pz =   pt * m_ac[4];
00303 
00304     if (m_matrixValid) Em = m_Ea.similarity(delMDelA(phi));
00305     else               Em = m_Ea;
00306 
00307     return Hep3Vector(px, py, pz);
00308 }
00309 
00310 HepLorentzVector 
00311 Dedx_Helix::momentum(double phi, double mass) const {
00312     // 
00313     // Calculate momentum.
00314     //
00315     // Pt = | 1/kappa | (GeV/c)
00316     //
00317     // Px = -Pt * sin(phi0 + phi) 
00318     // Py =  Pt * cos(phi0 + phi)
00319     // Pz =  Pt * tan(lambda)
00320     //
00321     // E  = sqrt( 1/kappa/kappa * (1+tan(lambda)*tan(lambda)) + mass*mass )
00322 
00323     double pt = fabs(m_pt);
00324     double px = - pt * sin(m_ac[1] + phi);
00325     double py =   pt * cos(m_ac[1] + phi);
00326     double pz =   pt * m_ac[4];
00327     double E  =   sqrt(pt*pt*(1.+m_ac[4]*m_ac[4])+mass*mass);
00328 
00329     return HepLorentzVector(px, py, pz, E);
00330 }
00331 
00332 
00333 HepLorentzVector 
00334 Dedx_Helix::momentum(double phi, double mass, HepSymMatrix & Em) const {
00335     // 
00336     // Calculate momentum.
00337     //
00338     // Pt = | 1/kappa | (GeV/c)
00339     //
00340     // Px = -Pt * sin(phi0 + phi) 
00341     // Py =  Pt * cos(phi0 + phi)
00342     // Pz =  Pt * tan(lambda)
00343     //
00344     // E  = sqrt( 1/kappa/kappa * (1+tan(lambda)*tan(lambda)) + mass*mass )
00345 
00346     double pt = fabs(m_pt);
00347     double px = - pt * sin(m_ac[1] + phi);
00348     double py =   pt * cos(m_ac[1] + phi);
00349     double pz =   pt * m_ac[4];
00350     double E  =   sqrt(pt*pt*(1.+m_ac[4]*m_ac[4])+mass*mass);
00351 
00352     if (m_matrixValid) Em = m_Ea.similarity(del4MDelA(phi,mass));
00353     else               Em = m_Ea;
00354 
00355     return HepLorentzVector(px, py, pz, E);
00356 }
00357 
00358 HepLorentzVector 
00359 Dedx_Helix::momentum(double phi,
00360                 double mass,
00361                 HepPoint3D & x,
00362                 HepSymMatrix & Emx) const {
00363   // 
00364   // Calculate momentum.
00365   //
00366   // Pt = | 1/kappa | (GeV/c)
00367   //
00368   // Px = -Pt * sin(phi0 + phi) 
00369   // Py =  Pt * cos(phi0 + phi)
00370   // Pz =  Pt * tan(lambda)
00371   //
00372   // E  = sqrt( 1/kappa/kappa * (1+tan(lambda)*tan(lambda)) + mass*mass )
00373   
00374   double pt = fabs(m_pt);
00375   double px = - pt * sin(m_ac[1] + phi);
00376   double py =   pt * cos(m_ac[1] + phi);
00377   double pz =   pt * m_ac[4];
00378   double E  = sqrt(pt * pt * (1. + m_ac[4] * m_ac[4]) + mass * mass);
00379 
00380   x.setX(m_pivot.x() + m_ac[0] * m_cp + m_r * (m_cp - cos(m_ac[1] + phi)));
00381   x.setY(m_pivot.y() + m_ac[0] * m_sp + m_r * (m_sp - sin(m_ac[1] + phi)));
00382   x.setZ(m_pivot.z() + m_ac[3] - m_r * m_ac[4] * phi);
00383 
00384   if (m_matrixValid) Emx = m_Ea.similarity(del4MXDelA(phi,mass));
00385   else               Emx = m_Ea;
00386   
00387   return HepLorentzVector(px, py, pz, E);
00388 }
00389 
00390 
00391 const HepPoint3D &
00392 Dedx_Helix::pivot(const HepPoint3D & newPivot) {
00393     const double & dr    = m_ac[0];
00394     const double & phi0  = m_ac[1];
00395     const double & kappa = m_ac[2];
00396     const double & dz    = m_ac[3];
00397     const double & tanl  = m_ac[4];
00398 
00399     double rdr = dr + m_r;
00400     double phi = fmod(phi0 + M_PI4, M_PI2);
00401     double csf0 = cos(phi);
00402     double snf0 = (1. - csf0) * (1. + csf0);
00403     snf0 = sqrt((snf0 > 0.) ? snf0 : 0.);
00404     if(phi > M_PI) snf0 = - snf0;
00405 
00406     double xc = m_pivot.x() + rdr * csf0;
00407     double yc = m_pivot.y() + rdr * snf0;
00408     double csf, snf;
00409     if(m_r != 0.0) {
00410       csf = (xc - newPivot.x()) / m_r;
00411       snf = (yc - newPivot.y()) / m_r;
00412       double anrm = sqrt(csf * csf + snf * snf);
00413       if(anrm != 0.0) {
00414         csf /= anrm;
00415         snf /= anrm;
00416         phi = atan2(snf, csf);
00417       } else {
00418         csf = 1.0;
00419         snf = 0.0;
00420         phi = 0.0;
00421       }
00422     } else {
00423       csf = 1.0;
00424       snf = 0.0;
00425       phi = 0.0;
00426     }
00427     double phid = fmod(phi - phi0 + M_PI8, M_PI2);
00428     if(phid > M_PI) phid = phid - M_PI2;
00429     double drp = (m_pivot.x() + dr * csf0 + m_r * (csf0 - csf) - newPivot.x())
00430         * csf
00431         + (m_pivot.y() + dr * snf0 + m_r * (snf0 - snf) - newPivot.y()) * snf;
00432     double dzp = m_pivot.z() + dz - m_r * tanl * phid - newPivot.z();
00433 
00434     HepVector ap(5);
00435     ap[0] = drp;
00436     ap[1] = fmod(phi + M_PI4, M_PI2);
00437     ap[2] = kappa;
00438     ap[3] = dzp;
00439     ap[4] = tanl;
00440 
00441     //    if (m_matrixValid) m_Ea.assign(delApDelA(ap) * m_Ea * delApDelA(ap).T());
00442     if (m_matrixValid) m_Ea = m_Ea.similarity(delApDelA(ap));
00443 
00444     m_a = ap;
00445     m_pivot = newPivot;
00446 
00447     //...Are these needed?...iw...
00448     updateCache();
00449     return m_pivot;
00450 }
00451 
00452 void
00453 Dedx_Helix::set(const HepPoint3D & pivot,
00454            const HepVector & a,
00455            const HepSymMatrix & Ea) {
00456     m_pivot = pivot;
00457     m_a = a;
00458     m_Ea = Ea;
00459     m_matrixValid = true;
00460     updateCache();
00461 }
00462 
00463 Dedx_Helix &
00464 Dedx_Helix::operator = (const Dedx_Helix & i) {
00465     if (this == & i) return * this;
00466 
00467     m_bField = i.m_bField;
00468     m_alpha = i.m_alpha;
00469     m_pivot = i.m_pivot;
00470     m_a = i.m_a;
00471     m_Ea = i.m_Ea;
00472     m_matrixValid = i.m_matrixValid;
00473 
00474     m_center = i.m_center;
00475     m_cp = i.m_cp;
00476     m_sp = i.m_sp;
00477     m_pt = i.m_pt;
00478     m_r  = i.m_r;
00479     m_ac[0] = i.m_ac[0];
00480     m_ac[1] = i.m_ac[1];
00481     m_ac[2] = i.m_ac[2];
00482     m_ac[3] = i.m_ac[3];
00483     m_ac[4] = i.m_ac[4];
00484 
00485     return * this;
00486 }
00487 
00488 void
00489 Dedx_Helix::updateCache(void) {
00490     //
00491     //   Calculate Helix center( xc, yc ).
00492     //   
00493     //   xc = x0 + (dr + (alpha / kappa)) * cos(phi0)  (cm)
00494     //   yc = y0 + (dr + (alpha / kappa)) * sin(phi0)  (cm)
00495     //
00496 
00497     m_ac[0] = m_a[0];
00498     m_ac[1] = m_a[1];
00499     m_ac[2] = m_a[2];
00500     m_ac[3] = m_a[3];
00501     m_ac[4] = m_a[4];
00502 
00503     m_cp = cos(m_ac[1]);
00504     m_sp = sin(m_ac[1]);
00505     if (m_ac[2] != 0.0) {
00506         m_pt = 1. / m_ac[2];
00507         m_r = m_alpha / m_ac[2];
00508     }
00509     else {
00510         m_pt = (DBL_MAX);
00511         m_r = (DBL_MAX);
00512     }
00513 
00514     double x = m_pivot.x() + (m_ac[0] + m_r) * m_cp;
00515     double y = m_pivot.y() + (m_ac[0] + m_r) * m_sp;
00516     m_center.setX(x);
00517     m_center.setY(y);
00518     m_center.setZ(0.);
00519 }
00520 
00521 HepMatrix
00522 Dedx_Helix::delApDelA(const HepVector & ap) const {
00523     //
00524     //   Calculate Jacobian (@ap/@a)
00525     //   Vector ap is new helix parameters and a is old helix parameters. 
00526     //
00527 
00528     HepMatrix dApDA(5,5,0);
00529 
00530     const double & dr    = m_ac[0];
00531     const double & phi0  = m_ac[1];
00532     const double & cpa   = m_ac[2];
00533     const double & dz    = m_ac[3];
00534     const double & tnl   = m_ac[4];
00535 
00536     double drp   = ap[0];
00537     double phi0p = ap[1];
00538     double cpap  = ap[2];
00539     double dzp   = ap[3];
00540     double tnlp  = ap[4];
00541 
00542     double rdr   = m_r + dr;
00543     double rdrpr;
00544     if ((m_r + drp) != 0.0) {
00545       rdrpr = 1. / (m_r + drp);
00546     } else {
00547       rdrpr = (DBL_MAX);
00548     }
00549     // double csfd  = cos(phi0)*cos(phi0p) + sin(phi0)*sin(phi0p); 
00550     // double snfd  = cos(phi0)*sin(phi0p) - sin(phi0)*cos(phi0p); 
00551     double csfd  = cos(phi0p - phi0);
00552     double snfd  = sin(phi0p - phi0);
00553     double phid  = fmod(phi0p - phi0 + M_PI8, M_PI2);
00554     if (phid > M_PI) phid = phid - M_PI2;
00555 
00556     dApDA[0][0]  =  csfd;
00557     dApDA[0][1]  =  rdr*snfd;
00558     if(cpa!=0.0) {
00559       dApDA[0][2]  =  (m_r/cpa)*( 1.0 - csfd );
00560     } else {
00561       dApDA[0][2]  = (DBL_MAX);
00562     }
00563 
00564     dApDA[1][0]  = - rdrpr*snfd;
00565     dApDA[1][1]  = rdr*rdrpr*csfd;
00566     if(cpa!=0.0) {
00567       dApDA[1][2]  = (m_r/cpa)*rdrpr*snfd;
00568     } else {
00569       dApDA[1][2]  = (DBL_MAX);
00570     }
00571     
00572     dApDA[2][2]  = 1.0;
00573 
00574     dApDA[3][0]  = m_r*rdrpr*tnl*snfd;
00575     dApDA[3][1]  = m_r*tnl*(1.0 - rdr*rdrpr*csfd);
00576     if(cpa!=0.0) {
00577       dApDA[3][2]  = (m_r/cpa)*tnl*(phid - m_r*rdrpr*snfd);
00578     } else {
00579       dApDA[3][2]  = (DBL_MAX);
00580     }
00581     dApDA[3][3]  = 1.0;
00582     dApDA[3][4]  = - m_r*phid;
00583 
00584     dApDA[4][4] = 1.0;
00585  
00586     return dApDA;
00587 }
00588 
00589 HepMatrix
00590 Dedx_Helix::delXDelA(double phi) const {
00591     //
00592     //   Calculate Jacobian (@x/@a)
00593     //   Vector a is helix parameters and phi is internal parameter
00594     //   which specifys the point to be calculated for Ex(phi).
00595     //
00596 
00597     HepMatrix dXDA(3,5,0);
00598 
00599     const double & dr      = m_ac[0];
00600     const double & phi0    = m_ac[1];
00601     const double & cpa     = m_ac[2];
00602     const double & dz      = m_ac[3];
00603     const double & tnl     = m_ac[4];
00604 
00605     double cosf0phi = cos(phi0 + phi);
00606     double sinf0phi = sin(phi0 + phi);
00607 
00608     dXDA[0][0]     = m_cp;
00609     dXDA[0][1]     = - dr * m_sp + m_r * (- m_sp + sinf0phi); 
00610     if(cpa!=0.0) {
00611       dXDA[0][2]     = - (m_r / cpa) * (m_cp - cosf0phi);
00612     } else {
00613       dXDA[0][2] = (DBL_MAX);
00614     }
00615     // dXDA[0][3]     = 0.0;
00616     // dXDA[0][4]     = 0.0;
00617  
00618     dXDA[1][0]     = m_sp;
00619     dXDA[1][1]     = dr * m_cp + m_r * (m_cp - cosf0phi);
00620     if(cpa!=0.0) {
00621       dXDA[1][2]     = - (m_r / cpa) * (m_sp - sinf0phi);
00622     } else {
00623       dXDA[1][2] = (DBL_MAX);
00624     }
00625     // dXDA[1][3]     = 0.0;
00626     // dXDA[1][4]     = 0.0;
00627 
00628     // dXDA[2][0]     = 0.0;
00629     // dXDA[2][1]     = 0.0;
00630     if(cpa!=0.0) {
00631       dXDA[2][2]     = (m_r / cpa) * tnl * phi;
00632     } else {
00633       dXDA[2][2] = (DBL_MAX);
00634     }
00635     dXDA[2][3]     = 1.0;
00636     dXDA[2][4]     = - m_r * phi;
00637 
00638     return dXDA;
00639 }
00640 
00641 
00642 
00643 HepMatrix
00644 Dedx_Helix::delMDelA(double phi) const {
00645     //
00646     //   Calculate Jacobian (@m/@a)
00647     //   Vector a is helix parameters and phi is internal parameter.
00648     //   Vector m is momentum.
00649     //
00650 
00651     HepMatrix dMDA(3,5,0);
00652 
00653     const double & phi0 = m_ac[1];
00654     const double & cpa  = m_ac[2];
00655     const double & tnl  = m_ac[4];
00656 
00657     double cosf0phi = cos(phi0+phi);
00658     double sinf0phi = sin(phi0+phi);
00659 
00660     double rho;
00661     if(cpa != 0.)rho = 1./cpa;
00662     else rho = (DBL_MAX);
00663 
00664     double charge = 1.;
00665     if(cpa < 0.)charge = -1.;
00666 
00667     dMDA[0][1] = -fabs(rho)*cosf0phi;
00668     dMDA[0][2] = charge*rho*rho*sinf0phi;
00669  
00670     dMDA[1][1] = -fabs(rho)*sinf0phi;
00671     dMDA[1][2] = -charge*rho*rho*cosf0phi;
00672 
00673     dMDA[2][2] = -charge*rho*rho*tnl;
00674     dMDA[2][4] = fabs(rho);
00675 
00676     return dMDA;
00677 }
00678 
00679 
00680 HepMatrix
00681 Dedx_Helix::del4MDelA(double phi, double mass) const {
00682     //
00683     //   Calculate Jacobian (@4m/@a)
00684     //   Vector a  is helix parameters and phi is internal parameter.
00685     //   Vector 4m is 4 momentum.
00686     //
00687 
00688     HepMatrix d4MDA(4,5,0);
00689 
00690     double phi0 = m_ac[1];
00691     double cpa  = m_ac[2];
00692     double tnl  = m_ac[4];
00693 
00694     double cosf0phi = cos(phi0+phi);
00695     double sinf0phi = sin(phi0+phi);
00696 
00697     double rho;
00698     if(cpa != 0.)rho = 1./cpa;
00699     else rho = (DBL_MAX);
00700 
00701     double charge = 1.;
00702     if(cpa < 0.)charge = -1.;
00703 
00704     double E = sqrt(rho*rho*(1.+tnl*tnl)+mass*mass);
00705 
00706     d4MDA[0][1] = -fabs(rho)*cosf0phi;
00707     d4MDA[0][2] = charge*rho*rho*sinf0phi;
00708  
00709     d4MDA[1][1] = -fabs(rho)*sinf0phi;
00710     d4MDA[1][2] = -charge*rho*rho*cosf0phi;
00711 
00712     d4MDA[2][2] = -charge*rho*rho*tnl;
00713     d4MDA[2][4] = fabs(rho);
00714 
00715     if (cpa != 0.0 && E != 0.0) {
00716       d4MDA[3][2] = (-1.-tnl*tnl)/(cpa*cpa*cpa*E);
00717       d4MDA[3][4] = tnl/(cpa*cpa*E);
00718     } else {
00719       d4MDA[3][2] = (DBL_MAX);
00720       d4MDA[3][4] = (DBL_MAX);
00721     }
00722     return d4MDA;
00723 }
00724 
00725 
00726 HepMatrix
00727 Dedx_Helix::del4MXDelA(double phi, double mass) const {
00728     //
00729     //   Calculate Jacobian (@4mx/@a)
00730     //   Vector a  is helix parameters and phi is internal parameter.
00731     //   Vector 4xm is 4 momentum and position.
00732     //
00733 
00734     HepMatrix d4MXDA(7,5,0);
00735 
00736     const double & dr      = m_ac[0];
00737     const double & phi0    = m_ac[1];
00738     const double & cpa     = m_ac[2];
00739     const double & dz      = m_ac[3];
00740     const double & tnl     = m_ac[4];
00741 
00742     double cosf0phi = cos(phi0+phi);
00743     double sinf0phi = sin(phi0+phi);
00744 
00745     double rho;
00746     if(cpa != 0.)rho = 1./cpa;
00747     else rho = (DBL_MAX);
00748 
00749     double charge = 1.;
00750     if(cpa < 0.)charge = -1.;
00751 
00752     double E = sqrt(rho * rho * (1. + tnl * tnl) + mass * mass);
00753 
00754     d4MXDA[0][1] = - fabs(rho) * cosf0phi;
00755     d4MXDA[0][2] = charge * rho * rho * sinf0phi;
00756  
00757     d4MXDA[1][1] = - fabs(rho) * sinf0phi;
00758     d4MXDA[1][2] = - charge * rho * rho * cosf0phi;
00759 
00760     d4MXDA[2][2] = - charge * rho * rho * tnl;
00761     d4MXDA[2][4] = fabs(rho);
00762 
00763     if (cpa != 0.0 && E != 0.0) {
00764       d4MXDA[3][2] = (- 1. - tnl * tnl) / (cpa * cpa * cpa * E);
00765       d4MXDA[3][4] = tnl / (cpa * cpa * E);
00766     } else {
00767       d4MXDA[3][2] = (DBL_MAX);
00768       d4MXDA[3][4] = (DBL_MAX);
00769     }
00770     
00771     d4MXDA[4][0] = m_cp;
00772     d4MXDA[4][1] = - dr * m_sp + m_r * (- m_sp + sinf0phi);
00773     if (cpa != 0.0) {
00774       d4MXDA[4][2] = - (m_r / cpa) * (m_cp - cosf0phi);
00775     } else {
00776       d4MXDA[4][2] = (DBL_MAX);
00777     }
00778      
00779     d4MXDA[5][0] = m_sp;
00780     d4MXDA[5][1] = dr * m_cp + m_r * (m_cp - cosf0phi);
00781     if (cpa != 0.0) {
00782       d4MXDA[5][2] = - (m_r / cpa) * (m_sp - sinf0phi);
00783 
00784       d4MXDA[6][2] = (m_r / cpa) * tnl * phi;
00785     } else {
00786       d4MXDA[5][2] = (DBL_MAX);
00787 
00788       d4MXDA[6][2] = (DBL_MAX);
00789     }
00790 
00791     d4MXDA[6][3] = 1.;
00792     d4MXDA[6][4] = - m_r * phi;
00793 
00794     return d4MXDA;
00795 }
00796 
00797 void
00798 Dedx_Helix::ignoreErrorMatrix(void) {
00799     m_matrixValid = false;
00800     m_Ea *= 0.;
00801 }

Generated on Tue Nov 29 23:12:46 2016 for BOSS_7.0.2 by  doxygen 1.4.7