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
00024
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
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
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