TrackTrajectory.cxx

Go to the documentation of this file.
00001 
00002 //==============================================
00003 // TrackTrajectory class implementation
00004 //==============================================
00005 
00006 #include "AtlfastEvent/TrackTrajectory.h"
00007 #include <iostream>
00008 #include <cmath>
00009 #include "GaudiKernel/MsgStream.h"
00010 #include <iomanip>
00011 
00012 namespace Atlfast {
00013   using std::abs;  
00014   using std::setw;
00015   using std::setprecision;
00016   using std::setiosflags;
00017   using std::ios;
00018 
00019 std::ostream& operator << ( std::ostream& s, const TrackTrajectory& traj ) 
00020 {
00021   TrackParameters param = traj.parameters();
00022 
00023     s << "TrackTrajectory"<<std::endl; 
00024 
00025     s<<setiosflags(ios::fixed);
00026     s<<setprecision(7);
00027     s<<setw(20);
00028 
00029   s   <<setw(20)<< param.pT()
00030       << "        pT"<<std::endl;
00031   s    <<setw(20)<< param.eta()
00032       << "        eta"<<std::endl;
00033 
00034   s << "----------------------------" << std::endl;
00035  
00036   s    <<setw(20)<< param.impactParameter()
00037       << "        d0"<<std::endl; 
00038   s    <<setw(20)<< param.zPerigee()
00039       << "        z0" << std::endl;  
00040   s   <<setw(20)<< param.phi().val()
00041       << "       phi" <<std::endl;
00042   s    <<setw(20)<<param.cotTheta()
00043       << " cot Theta" << std::endl;
00044   s    <<setw(20)<< param.invPtCharge()
00045       << "  1/(q.PT)" <<std::endl;
00046   s << "----------------------------" << std::endl;
00047   s    <<setw(20)<< traj.radius()
00048       << "    radius" <<std::endl;
00049   s    <<setw(20)<< traj.curvature()
00050       << " curvature" <<std::endl<<std::endl;
00051 
00052   return s;
00053 }
00054 
00055 MsgStream& operator << ( MsgStream& s, const TrackTrajectory& traj ) 
00056 {
00057   TrackParameters param = traj.parameters();
00058   
00059   s << "TrackTrajectory"<<endreq; 
00060 
00061     s<<setiosflags(ios::fixed);
00062     s<<setprecision(7);
00063     s<<setw(20);
00064 
00065   s   <<setw(20)<< param.pT()
00066       << "        pT"<<endreq;
00067   s    <<setw(20)<< param.eta()
00068       << "        eta"<<endreq;
00069 
00070   s << "----------------------------" << endreq;
00071  
00072   s    <<setw(20)<< param.impactParameter()
00073       << "        d0"<<endreq; 
00074   s    <<setw(20)<< param.zPerigee()
00075       << "        z0" << endreq;  
00076   s   <<setw(20)<< param.phi().val()
00077       << "       phi" <<endreq;
00078   s    <<setw(20)<<param.cotTheta()
00079       << " cot Theta" << endreq;
00080   s    <<setw(20)<< param.invPtCharge()
00081       << "  1/(q.PT)" <<endreq;
00082   s << "----------------------------" << endreq;
00083   s    <<setw(20)<< traj.radius()
00084       << "    radius" <<endreq;
00085   s    <<setw(20)<< traj.curvature()
00086       << " curvature" <<endreq<<endreq;
00087 
00088   return s;
00089 }
00090 
00091   // Explicit Constructor 
00092     TrackTrajectory::TrackTrajectory(TrackParameters p,
00093                                      ::HepPoint3D startPoint,
00094                                      double curvature
00095                                      ): 
00096     m_parameters(p), m_startPoint(startPoint), m_curvature(curvature)
00097   {  }
00098   
00099   // Copy Constructor
00100   TrackTrajectory::TrackTrajectory( const TrackTrajectory& other ) 
00101   {
00102     (*this) = other;
00103   }
00104   // Assignment 
00105   TrackTrajectory& TrackTrajectory::operator=( const TrackTrajectory& other ) {
00106     m_parameters      = other.m_parameters ;
00107     m_startPoint      = other.m_startPoint;
00108     m_curvature       = other.m_curvature;
00109     return *this ;
00110   } 
00111   
00112   // Destructor
00113   TrackTrajectory::~TrackTrajectory() {}   
00114 
00115   // Constructor from a momentum, vertex and charge
00116   TrackTrajectory::TrackTrajectory(  
00117                                    const Hep3Vector& momentum, 
00118                                    const Hep3Vector& vertex,
00119                                    double charge,
00120                                    double bField 
00121                                    )  
00122   {
00123     double pt = momentum.perp();
00124     double q  = charge;
00125     q /= abs(q); //  q = |1|
00126     
00127     // Calculate helix radius of curvature and centre
00128 
00129     // Working in GeV and cm 
00130     //double radius = pt/(2*0.00149898*bField);
00131 
00132     // Working in MeV and mm 
00133     double radius = pt/(2*0.149898*bField);
00134     double x0  = vertex.x() + q*radius*sin(momentum.phi());
00135     double y0  = vertex.y() - q*radius*cos(momentum.phi());
00136     Hep3Vector hCentre(x0,y0);
00137     
00138     // calculate parameters     
00139     // Tidier version of Fortran code zvhepa.F - Tarta
00140     
00141     double impactParameter = -q*(hCentre.perp() - radius);
00142     double theta = momentum.theta();
00143     double cotTheta = 1/tan(theta);
00144     double eta = momentum.pseudoRapidity();
00145     double zPerigee;
00146     double phi;
00147     
00148     //  Calculate Phi
00149     
00150     if (abs(vertex.x()) < 1e-4 && abs(vertex.y()) < 1e-4)
00151       {phi = momentum.phi();} else 
00152         {if ( (vertex.phi() - hCentre.phi()) > 0 )
00153           { phi =  hCentre.phi() + M_PI/2; } else   
00154             { phi = hCentre.phi() - M_PI/2;} }
00155     
00156     double x1 =  sin(phi)*q*hCentre.perp()/(radius*radius);
00157     double y1 = -cos(phi)*q*hCentre.perp()/(radius*radius);
00158     if (x1*x0 < 0 || y1*y0 < 0) {phi += M_PI;}
00159     if (phi < 0) {phi += 2.*M_PI;} else 
00160       { if(phi > 2.*M_PI) {phi -= 2.*M_PI;} }
00161     
00162     // z of perigee
00163     
00164     double dot = vertex.x()*momentum.x() + vertex.y()*momentum.y();
00165     double dotsign = dot/abs(dot) ;
00166     double dV = (vertex.perp()*vertex.perp()) - 
00167       (impactParameter*impactParameter);
00168     double denom = hCentre.perp()/radius;
00169     
00170     // NAN protection
00171     if (dV < 0) {dV = 0;}    
00172     if (abs(dotsign)!=1) dotsign=0;
00173     
00174     zPerigee = vertex.z() - (2*q*radius)*dotsign*cotTheta*
00175       asin((sqrt(dV/(denom)))*q/(2*radius) );
00176     
00177     // set parameters
00178     m_parameters = TrackParameters
00179       (eta, phi, pt, impactParameter, zPerigee, cotTheta, q/pt );
00180     m_startPoint = HepPoint3D(vertex);
00181     m_curvature = radius;  
00182   }
00183 
00184   // simple query services
00185   TrackParameters TrackTrajectory::parameters() const {
00186     return m_parameters;
00187   }
00188   HepPoint3D TrackTrajectory::startPoint() const
00189   { return m_startPoint ; }
00190   double TrackTrajectory::radius() const
00191   { return m_startPoint.perp() ; }
00192   
00193   double TrackTrajectory::curvature () const
00194   { return m_curvature ; }
00195   
00196   int    TrackTrajectory::signOfCharge() const              
00197   { return int( abs(m_parameters.invPtCharge() )/m_parameters.invPtCharge() ) ;  }
00198   
00199 }  // End namespace
00200 
00201 
00202 
00203 
00204 

Generated on Fri Sep 21 13:00:10 2007 for AtlfastEvent by  doxygen 1.5.1