00001 #ifndef TrackReco_TrackBase_h
00002 #define TrackReco_TrackBase_h
00003
00053 #include "DataFormats/Math/interface/Vector.h"
00054 #include "DataFormats/Math/interface/Error.h"
00055 #include "DataFormats/Math/interface/Vector3D.h"
00056 #include "DataFormats/Math/interface/Point3D.h"
00057 #include "DataFormats/Math/interface/Error.h"
00058 #include "DataFormats/TrackReco/interface/HitPattern.h"
00059
00060 namespace reco {
00061
00062 class TrackBase {
00063 public:
00065 enum { dimension = 5 };
00067 enum { covarianceSize = dimension * ( dimension + 1 ) / 2 };
00069 typedef math::Vector<dimension>::type ParameterVector;
00071 typedef math::Error<dimension>::type CovarianceMatrix;
00073 typedef math::XYZVector Vector;
00075 typedef math::XYZPoint Point;
00077 enum { i_qoverp = 0 , i_lambda, i_phi, i_dxy, i_dsz };
00079 typedef unsigned int index;
00081 enum TrackAlgorithm { undefAlgorithm=0, ctf=1, rs=2, cosmics=3, beamhalo=4,
00082 iter1=5, iter2=6, iter3=7, iter4=8, iter5=9, iter6=10, iter7=11, iter8=12, iter9=13,iter10=14,
00083 conversion=15, nuclInter=16,
00084 algoSize=17 };
00085 static const std::string algoNames[];
00086
00088 enum TrackQuality { undefQuality=-1, loose=0, tight=1, highPurity=2, confirmed=3, goodIterative=4, qualitySize=5};
00089 static const std::string qualityNames[];
00090
00092 TrackBase();
00094 TrackBase( double chi2, double ndof, const Point & referencePoint,
00095 const Vector & momentum, int charge, const CovarianceMatrix &,
00096 TrackAlgorithm=undefAlgorithm, TrackQuality quality=undefQuality);
00098 ~TrackBase();
00100 double chi2() const { return chi2_; }
00102 double ndof() const { return ndof_; }
00104 double normalizedChi2() const { return chi2_ / ndof_; }
00106 int charge() const { return charge_; }
00108 double qoverp() const { return charge() / p(); }
00110 double theta() const { return momentum_.theta(); }
00112 double lambda() const { return M_PI/2 - momentum_.theta(); }
00114 double dxy() const { return ( - vx() * py() + vy() * px() ) / pt(); }
00116 double d0() const { return - dxy(); }
00118 double dsz() const { return vz()*pt()/p() - (vx()*px()+vy()*py())/pt() * pz()/p(); }
00120 double dz() const { return vz() - (vx()*px()+vy()*py())/pt() * (pz()/pt()); }
00122 double p() const { return momentum_.R(); }
00124 double pt() const { return sqrt( momentum_.Perp2() ); }
00126 double px() const { return momentum_.x(); }
00128 double py() const { return momentum_.y(); }
00130 double pz() const { return momentum_.z(); }
00132 double phi() const { return momentum_.Phi(); }
00134 double eta() const { return momentum_.Eta(); }
00136 double vx() const { return vertex_.x(); }
00138 double vy() const { return vertex_.y(); }
00140 double vz() const { return vertex_.z(); }
00141
00143 const Vector & momentum() const { return momentum_; }
00144
00146 const Point & referencePoint() const { return vertex_; }
00147
00149 const Point & vertex() const { return vertex_; }
00150
00152 double dxy(const Point& myBeamSpot) const {
00153 return ( - (vx()-myBeamSpot.x()) * py() + (vy()-myBeamSpot.y()) * px() ) / pt();
00154 }
00156 double dsz(const Point& myBeamSpot) const {
00157 return (vz()-myBeamSpot.z())*pt()/p() - ((vx()-myBeamSpot.x())*px()+(vy()-myBeamSpot.y())*py())/pt() *pz()/p();
00158 }
00160 double dz(const Point& myBeamSpot) const {
00161 return (vz()-myBeamSpot.z()) - ((vx()-myBeamSpot.x())*px()+(vy()-myBeamSpot.y())*py())/pt() * pz()/pt();
00162 }
00163
00165 ParameterVector parameters() const {
00166 return ParameterVector(qoverp(),lambda(),phi(),dxy(),dsz());
00167 }
00169 CovarianceMatrix covariance() const { CovarianceMatrix m; fill( m ); return m; }
00170
00172 double parameter(int i) const { return parameters()[i]; }
00174 double covariance( int i, int j ) const { return covariance_[ covIndex( i, j ) ]; }
00176 double error( int i ) const { return sqrt( covariance_[ covIndex( i, i ) ] ); }
00177
00179 double qoverpError() const { return error( i_qoverp ); }
00181 double ptError() const {
00182 return (charge()!=0) ? sqrt(
00183 pt()*pt()*p()*p()/charge()/charge() * covariance(i_qoverp,i_qoverp)
00184 + 2*pt()*p()/charge()*pz() * covariance(i_qoverp,i_lambda)
00185 + pz()*pz() * covariance(i_lambda,i_lambda) ) : 1.e6;
00186 }
00188 double thetaError() const { return error( i_lambda ); }
00190 double lambdaError() const { return error( i_lambda ); }
00192 double etaError() const { return error( i_lambda ) * p()/pt(); }
00194 double phiError() const { return error( i_phi ); }
00196 double dxyError() const { return error( i_dxy ); }
00198 double d0Error() const { return error( i_dxy ); }
00200 double dszError() const { return error( i_dsz ); }
00202 double dzError() const { return error( i_dsz ) * p()/pt(); }
00203
00205 CovarianceMatrix & fill( CovarianceMatrix & v ) const;
00207 static index covIndex( index i, index j );
00208
00210 const HitPattern & hitPattern() const { return hitPattern_; }
00212 unsigned short numberOfValidHits() const { return hitPattern_.numberOfValidHits(); }
00214 unsigned short numberOfLostHits() const { return hitPattern_.numberOfLostHits(); }
00216 template<typename C>
00217 void setHitPattern( const C & c ) { hitPattern_.set( c.begin(), c.end() ); }
00218 template<typename I>
00219 void setHitPattern( const I & begin, const I & end ) { hitPattern_.set( begin, end ); }
00221 void setHitPattern( const TrackingRecHit & hit, size_t i ) { hitPattern_.set( hit, i ); }
00223
00225 void setAlgorithm(const TrackAlgorithm a, bool set=true) { if (set) algorithm_=a; else algorithm_=undefAlgorithm;}
00226 TrackAlgorithm algo() const ;
00227 std::string algoName() const;
00228 static std::string algoName(TrackAlgorithm);
00229 static TrackAlgorithm algoByName(const std::string &name);
00230
00232 bool quality(const TrackQuality ) const;
00233 void setQuality(const TrackQuality, bool set=true);
00234 static std::string qualityName(TrackQuality);
00235 static TrackQuality qualityByName(const std::string &name);
00236
00237
00238 int qualityMask() const { return quality_; }
00239 void setQualityMask(int qualMask) {quality_ = qualMask;}
00240 private:
00242 float chi2_;
00244 float ndof_;
00246 Point vertex_;
00248 Vector momentum_;
00250 char charge_;
00252 float covariance_[ covarianceSize ];
00254 HitPattern hitPattern_;
00256 uint8_t algorithm_;
00258 uint8_t quality_;
00259
00260 };
00261
00262 inline TrackBase::index TrackBase::covIndex( index i, index j ) {
00263 int a = ( i <= j ? i : j ), b = ( i <= j ? j : i );
00264 return b * ( b + 1 ) / 2 + a;
00265 }
00266
00267 inline TrackBase::TrackAlgorithm TrackBase::algo() const {
00268 return (TrackAlgorithm) algorithm_;
00269 }
00270
00271 inline std::string TrackBase::algoName() const{
00272
00273
00274
00275
00276 switch(algorithm_)
00277 {
00278 case undefAlgorithm: return "undefAlgorithm";
00279 case ctf: return "ctf";
00280 case rs: return "rs";
00281 case cosmics: return "cosmics";
00282 case beamhalo: return "beamhalo";
00283 case iter1: return "iter1";
00284 case iter2: return "iter2";
00285 case iter3: return "iter3";
00286 case iter4: return "iter4";
00287 case iter5: return "iter5";
00288 case iter6: return "iter6";
00289 case iter7: return "iter7";
00290 case iter8: return "iter8";
00291 case iter9: return "iter9";
00292 case iter10: return "iter10";
00293 case conversion: return "conversion";
00294 case nuclInter: return "nuclInter";
00295 }
00296 return "undefAlgorithm";
00297 }
00298
00299 inline bool TrackBase::quality( const TrackBase::TrackQuality q) const{
00300 switch(q){
00301 case undefQuality: return (quality_==0);
00302 case goodIterative:
00303 {
00304 return ( ((quality_ & (1<<TrackBase::confirmed))>>TrackBase::confirmed) ||
00305 ((quality_ & (1<<TrackBase::highPurity))>>TrackBase::highPurity));
00306 }
00307 default:
00308 {
00309 return (quality_ & (1<<q))>>q;
00310 }
00311 }
00312 return false;
00313 }
00314
00315 inline void TrackBase::setQuality( const TrackBase::TrackQuality q, bool set){
00316 switch(q){
00317 case undefQuality: quality_=0;
00318 default:
00319 {
00320 if (set)
00321 quality_= quality_ | (1<<q) ;
00322 else
00323 quality_= quality_ & (~(1<<q));
00324 }
00325 }
00326 }
00327
00328 inline std::string TrackBase::qualityName(TrackQuality q) {
00329 if(int(q) < int(qualitySize) && int(q)>=0) return qualityNames[int(q)];
00330 return "undefQuality";
00331 }
00332
00333 inline std::string TrackBase::algoName(TrackAlgorithm a){
00334 if(int(a) < int(algoSize) && int(a)>0) return algoNames[int(a)];
00335 return "undefAlgorithm";
00336 }
00337
00338
00339
00340 }
00341
00342 #endif