CMS 3D CMS Logo

CMSSW_4_4_3_patch1/src/RecoTracker/MeasurementDet/plugins/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 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00018 
00019 class TransientTrackingRecHit;
00020 
00021 class TkStripMeasurementDet : public MeasurementDet {
00022 public:
00023 
00024   typedef StripClusterParameterEstimator::LocalValues    LocalValues;
00025   typedef StripClusterParameterEstimator::VLocalValues    VLocalValues;
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     regionalHandle_ = h;
00056     beginClusterI_ = begin - regionalHandle_->begin_record();
00057     endClusterI_ = end - regionalHandle_->begin_record();
00058     id_ = id;
00059     empty = false;
00060     activeThisEvent_ = true;
00061     isRegional = true;
00062   }
00063   
00065   bool isActive() const { return activeThisEvent_ && activeThisPeriod_; }
00066                  
00067   //TO BE IMPLEMENTED
00068   bool hasBadComponents( const TrajectoryStateOnSurface &tsos ) const {return false;}
00069 
00070 
00071   void setEmpty(){empty = true; activeThisEvent_ = true; }
00072   
00073   virtual RecHitContainer recHits( const TrajectoryStateOnSurface&) const;
00074   void simpleRecHits( const TrajectoryStateOnSurface& ts, std::vector<SiStripRecHit2D> &result) const ;
00075 
00076   virtual std::vector<TrajectoryMeasurement> 
00077   fastMeasurements( const TrajectoryStateOnSurface& stateOnThisDet, 
00078                     const TrajectoryStateOnSurface& startingState, 
00079                     const Propagator&, 
00080                     const MeasurementEstimator&) const;
00081 
00082   const StripGeomDetUnit& specificGeomDet() const {return *theStripGDU;}
00083 
00084   TransientTrackingRecHit::RecHitPointer
00085   buildRecHit( const SiStripClusterRef&, const TrajectoryStateOnSurface& ltp) const;
00086 
00087   TransientTrackingRecHit::RecHitPointer
00088   buildRecHit( const SiStripRegionalClusterRef&, const TrajectoryStateOnSurface& ltp) const;
00089 
00090     
00091   TkStripMeasurementDet::RecHitContainer 
00092   buildRecHits( const SiStripClusterRef&, const TrajectoryStateOnSurface& ltp) const;
00093   
00094   TkStripMeasurementDet::RecHitContainer 
00095   buildRecHits( const SiStripRegionalClusterRef&, const TrajectoryStateOnSurface& ltp) const;
00096 
00097 
00098   bool  isEmpty() {return empty;}
00099 
00100   unsigned int rawId() const { return id_; }
00101 
00102 
00103   const detset& theSet() {return detSet_;}
00104   int  size() const {return endClusterI_ - beginClusterI_ ; }
00105 
00108   void setActive(bool active) { activeThisPeriod_ = active; activeThisEvent_ = true; if (!active) empty = true; }
00111   void setActiveThisEvent(bool active) { activeThisEvent_ = active;  if (!active) empty = true; }
00112 
00114   bool hasAllGoodChannels() const { return !hasAny128StripBad_ && badStripBlocks_.empty(); }
00115 
00117   void set128StripStatus(bool good, int idx=-1);
00118 
00119   struct BadStripCuts {
00120      BadStripCuts() : maxBad(9999), maxConsecutiveBad(9999) {}
00121      BadStripCuts(const edm::ParameterSet &pset) :
00122         maxBad(pset.getParameter<uint32_t>("maxBad")),
00123         maxConsecutiveBad(pset.getParameter<uint32_t>("maxConsecutiveBad")) {}
00124      uint16_t maxBad, maxConsecutiveBad;
00125   };
00126 
00128   bool testStrips(float utraj, float uerr) const;
00129 
00130   void setBadStripCuts(BadStripCuts cuts) { badStripCuts_ = cuts; }
00131 
00132   struct BadStripBlock {
00133       short first;
00134       short last;
00135       BadStripBlock(const SiStripBadStrip::data &data) : first(data.firstStrip), last(data.firstStrip+data.range-1) { }
00136   };
00137   std::vector<BadStripBlock> &getBadStripBlocks() { return badStripBlocks_; }
00138 
00139   void setMaskBad128StripBlocks(bool maskThem) { maskBad128StripBlocks_ = maskThem; }
00140 
00141 private:
00142 
00143   bool isRegional;
00144 
00145   bool empty;
00146 
00147   bool activeThisEvent_,activeThisPeriod_;
00148 
00149   unsigned int id_;
00150 
00151   detset detSet_;
00152   edm::Handle<edmNew::DetSetVector<SiStripCluster> > handle_;
00153 
00154 
00155   const StripGeomDetUnit*               theStripGDU;
00156   const StripClusterParameterEstimator* theCPE;
00157 
00158 
00159 
00160   bool bad128Strip_[6];
00161   bool hasAny128StripBad_, maskBad128StripBlocks_;
00162 
00163   std::vector<BadStripBlock> badStripBlocks_;  
00164   int totalStrips_;
00165   BadStripCuts badStripCuts_;
00166  
00167 
00168   // --- regional unpacking
00169   edm::Handle<edm::LazyGetter<SiStripCluster> > regionalHandle_;
00170   unsigned int beginClusterI_;
00171   unsigned int endClusterI_;
00172 
00173   inline bool isMasked(const SiStripCluster &cluster) const {
00174       if ( bad128Strip_[cluster.firstStrip() >> 7] ) {
00175           if ( bad128Strip_[(cluster.firstStrip()+cluster.amplitudes().size())  >> 7] ||
00176                bad128Strip_[static_cast<int32_t>(cluster.barycenter()-0.499999) >> 7] ) {
00177               return true;
00178           }
00179       } else {
00180           if ( bad128Strip_[(cluster.firstStrip()+cluster.amplitudes().size())  >> 7] &&
00181                bad128Strip_[static_cast<int32_t>(cluster.barycenter()-0.499999) >> 7] ) {
00182               return true;
00183           }
00184       }
00185       return false;
00186   }
00187   
00188   template<class ClusterRefT>
00189     void buildSimpleRecHit( const ClusterRefT& cluster,
00190                             const TrajectoryStateOnSurface& ltp,
00191                             std::vector<SiStripRecHit2D>& res) const;
00192   
00193   
00194   std::set<SiStripClusterRef> skipClusters_;
00195   std::set<SiStripRegionalClusterRef> skipRegClusters_;
00196   
00197  public:
00198   inline bool accept(SiStripClusterRef & r) const {
00199     return (skipClusters_.find(r) == skipClusters_.end());
00200   }
00201   inline bool accept(SiStripRegionalClusterRef &r) const{
00202     return (skipRegClusters_.find(r) == skipRegClusters_.end());
00203   }
00204 
00205   void unset(){
00206     skipClusters_.clear();
00207     skipRegClusters_.clear();
00208   }
00209   template <typename IT>
00210     void setClusterToSkip(IT begin, IT end){
00211     skipClusters_.clear();
00212     skipClusters_.insert(begin,end);
00213   }
00214   template <typename IT>
00215     void setRegionalClustersToSkip(IT begin, IT end){
00216     skipRegClusters_.clear();
00217     skipRegClusters_.insert(begin,end);
00218   }
00219   
00220 };
00221 
00222 #endif