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