00001 #ifndef TrackReco_TrackResiduals_h 00002 #define TrackReco_TrackResiduals_h 00003 00010 #include <iostream> 00011 #include "DataFormats/TrackingRecHit/interface/TrackingRecHitFwd.h" 00012 #include "DataFormats/TrackReco/interface/TrackResiduals.h" 00013 00014 class Trajectory; 00015 00016 namespace reco { 00017 class HitPattern; 00018 class TrackResiduals { 00019 friend class Trajectory; 00020 public: 00021 enum ResidualType { X_Y_RESIDUALS, X_Y_PULLS }; 00022 00023 protected: 00025 enum { numResiduals = 0x40 }; 00026 00027 public: 00028 TrackResiduals (); 00029 TrackResiduals (enum ResidualType); 00030 00031 public: 00032 void setResidualXY (int idx, double residualX, double residualY); 00033 void setPullXY (int idx, double pullX, double pullY); 00034 void setResidualType (enum ResidualType); 00035 void print (std::ostream &stream = std::cout) const; 00036 void print (const HitPattern &, std::ostream &stream = std::cout) const; 00037 /* Example usage: 00038 * 00039 * HitPattern p; 00040 * TrackResiduals r; 00041 * int numHits = p.numberOfValidHits() + 00042 * p.numberOfLostHits() + 00043 * p.numberOfValidMuonHits() + 00044 * p.numberOfLostMuonHits() + 00045 * p.numberOfValidTrackerHits() + 00046 * p.numberOfLostTrackerHits() + 00047 * p.numberOfValidPixelHits() + 00048 * p.numberOfLostPixelHits(); 00049 * for (int i = 0; i < numHits; ++i) { 00050 * printf("hit %d: pattern 0x%x, residual (local x) %f\n", i 00051 * p.getHitPattern(i), r.residualX(p, i)); 00052 * } 00053 */ 00056 double residualX (int i, const HitPattern &) const; 00057 double residualY (int i, const HitPattern &) const; 00060 double residualX (int i) const; 00061 double residualY (int i) const; 00062 00063 protected: 00064 static double unpack_pull (unsigned char); 00065 static unsigned char pack_pull (double); 00066 static double unpack_residual (unsigned char); 00067 static unsigned char pack_residual (double); 00068 00069 private: 00071 unsigned char residuals_[numResiduals]; 00072 char residualType; 00073 }; 00074 } 00075 00076 #endif