CMS 3D CMS Logo

TrackBase.h

Go to the documentation of this file.
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     // I'd like to do:
00273     // return TrackBase::algoName(algorithm_);
00274     // but I cannot define a const static function. Why???
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)//regular OR if setting value to true
00321           quality_= quality_ | (1<<q) ;
00322         else // doing "half-XOR" if unsetting value
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

Generated on Tue Jun 9 17:31:47 2009 for CMSSW by  doxygen 1.5.4