00001
00002
00003
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
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
00100 TrackTrajectory::TrackTrajectory( const TrackTrajectory& other )
00101 {
00102 (*this) = other;
00103 }
00104
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
00113 TrackTrajectory::~TrackTrajectory() {}
00114
00115
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);
00126
00127
00128
00129
00130
00131
00132
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
00139
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
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
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
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
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
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 }
00200
00201
00202
00203
00204