CMS 3D CMS Logo

TkStripMeasurementDet.h

Go to the documentation of this file.
00001 #ifndef TkStripMeasurementDet_H
00002 #define TkStripMeasurementDet_H
00003 
00004 #include "TrackingTools/MeasurementDet/interface/MeasurementDet.h"
00005 #include "RecoLocalTracker/ClusterParameterEstimator/interface/StripClusterParameterEstimator.h"
00006 #include "DataFormats/SiStripCluster/interface/SiStripClusterCollection.h"
00007 #include "Geometry/TrackerGeometryBuilder/interface/StripGeomDetUnit.h"
00008 #include "DataFormats/Common/interface/DetSetVector.h"
00009 #include "DataFormats/Common/interface/DetSetVectorNew.h"
00010 #include "DataFormats/SiStripCluster/interface/SiStripCluster.h"
00011 #include "DataFormats/Common/interface/Handle.h"
00012 #include "CondFormats/SiStripObjects/interface/SiStripNoises.h"
00013 #include "CondFormats/SiStripObjects/interface/SiStripBadStrip.h"
00014 #include "DataFormats/Common/interface/RefGetter.h"
00015 #include "DataFormats/TrackerRecHit2D/interface/SiStripRecHit2D.h"
00016 
00017 
00018 class TransientTrackingRecHit;
00019 
00020 class TkStripMeasurementDet : public MeasurementDet {
00021 public:
00022 
00023   //  typedef SiStripClusterCollection::Range                ClusterRange;
00024   //  typedef SiStripClusterCollection::ContainerIterator    ClusterIterator;
00025   typedef StripClusterParameterEstimator::LocalValues    LocalValues;
00026 
00027   typedef SiStripRecHit2D::ClusterRef SiStripClusterRef;
00028 
00029   typedef edm::LazyGetter<SiStripCluster>::value_ref  SiStripRegionalClusterRef;
00030 
00031   typedef edmNew::DetSet<SiStripCluster> detset;
00032   typedef detset::const_iterator new_const_iterator;
00033 
00034   typedef std::vector<SiStripCluster>::const_iterator const_iterator;
00035 
00036   virtual ~TkStripMeasurementDet(){}
00037 
00038   TkStripMeasurementDet( const GeomDet* gdet,
00039                          const StripClusterParameterEstimator* cpe,
00040                          bool regional);
00041 
00042   void update( const detset &detSet, 
00043                const edm::Handle<edmNew::DetSetVector<SiStripCluster> > h,
00044                unsigned int id ) { 
00045     detSet_ = detSet; 
00046     handle_ = h;
00047     id_ = id;
00048     empty = false;
00049     isRegional = false;
00050   }
00051 
00052   void update( std::vector<SiStripCluster>::const_iterator begin ,std::vector<SiStripCluster>::const_iterator end, 
00053                const edm::Handle<edm::LazyGetter<SiStripCluster> > h,
00054                unsigned int id ) { 
00055     beginCluster = begin;
00056     endCluster   = end;
00057     regionalHandle_ = h;
00058     id_ = id;
00059     empty = false;
00060     isRegional = true;
00061   }
00062   
00063   void setEmpty(){empty = true;}
00064   
00065   virtual RecHitContainer recHits( const TrajectoryStateOnSurface&) const;
00066 
00067   virtual std::vector<TrajectoryMeasurement> 
00068   fastMeasurements( const TrajectoryStateOnSurface& stateOnThisDet, 
00069                     const TrajectoryStateOnSurface& startingState, 
00070                     const Propagator&, 
00071                     const MeasurementEstimator&) const;
00072 
00073   const StripGeomDetUnit& specificGeomDet() const {return *theStripGDU;}
00074 
00075   TransientTrackingRecHit::RecHitPointer
00076   buildRecHit( const SiStripClusterRef&, const LocalTrajectoryParameters& ltp) const;
00077 
00078   TransientTrackingRecHit::RecHitPointer
00079   buildRecHit( const SiStripRegionalClusterRef&, const LocalTrajectoryParameters& ltp) const;
00080 
00081 
00082   bool  isEmpty() {return empty;}
00083   const detset& theSet() {return detSet_;}
00084   int  size() {return endCluster - beginCluster ; }
00085 
00087   void setActive(bool active) { active_ = active; if (!active) empty = true; }
00089   bool isActive() const { return active_; }
00090 
00092   bool hasAllGoodChannels() const { return !hasAny128StripBad_ && badStripBlocks_.empty(); }
00093 
00095   void set128StripStatus(bool good, int idx=-1);
00096 
00098   bool testStrips(float utraj, float uerr) const;
00099 
00100   struct BadStripBlock {
00101       short first;
00102       short last;
00103       BadStripBlock(const SiStripBadStrip::data &data) : first(data.firstStrip), last(data.firstStrip+data.range-1) { }
00104   };
00105   std::vector<BadStripBlock> &getBadStripBlocks() { return badStripBlocks_; }
00106 
00107   void setMaskBad128StripBlocks(bool maskThem) { maskBad128StripBlocks_ = maskThem; }
00108 
00109 private:
00110 
00111   const StripGeomDetUnit*               theStripGDU;
00112   const StripClusterParameterEstimator* theCPE;
00113   detset detSet_;
00114   edm::Handle<edmNew::DetSetVector<SiStripCluster> > handle_;
00115   unsigned int id_;
00116   bool empty;
00117 
00118   bool active_;
00119   bool bad128Strip_[6];
00120   bool hasAny128StripBad_, maskBad128StripBlocks_;
00121   std::vector<BadStripBlock> badStripBlocks_;  
00122   int totalStrips_;
00123 
00124   // --- regional unpacking
00125   bool isRegional;
00126   edm::Handle<edm::LazyGetter<SiStripCluster> > regionalHandle_;
00127   std::vector<SiStripCluster>::const_iterator beginCluster;
00128   std::vector<SiStripCluster>::const_iterator endCluster;
00129   // regional unpacking ---
00130 
00131   inline bool isMasked(const SiStripCluster &cluster) const {
00132       if ( bad128Strip_[cluster.firstStrip() >> 7] ) {
00133           if ( bad128Strip_[(cluster.firstStrip()+cluster.amplitudes().size())  >> 7] ||
00134                bad128Strip_[static_cast<int32_t>(cluster.barycenter()-0.499999) >> 7] ) {
00135               return true;
00136           }
00137       } else {
00138           if ( bad128Strip_[(cluster.firstStrip()+cluster.amplitudes().size())  >> 7] &&
00139                bad128Strip_[static_cast<int32_t>(cluster.barycenter()-0.499999) >> 7] ) {
00140               return true;
00141           }
00142       }
00143       return false;
00144   }
00145 };
00146 
00147 #endif

Generated on Tue Jun 9 17:45:28 2009 for CMSSW by  doxygen 1.5.4