00001 #ifndef SiStripBadStrip_h 00002 #define SiStripBadStrip_h 00003 00004 #include<vector> 00005 #include<map> 00006 #include<iostream> 00007 #include<boost/cstdint.hpp> 00008 #include "DataFormats/SiStripCommon/interface/ConstantsForCondObjects.h" 00009 00027 class SiStripBadStrip { 00028 00029 public: 00030 00031 struct data{ 00032 unsigned short firstStrip; 00033 unsigned short range; 00034 unsigned short flag; 00035 }; 00036 00037 struct DetRegistry{ 00038 uint32_t detid; 00039 uint32_t ibegin; 00040 uint32_t iend; 00041 }; 00042 00043 class StrictWeakOrdering{ 00044 public: 00045 bool operator() (const DetRegistry& p,const uint32_t& i) const {return p.detid < i;} 00046 }; 00047 00048 typedef std::vector<unsigned int> Container; 00049 typedef std::vector<unsigned int>::const_iterator ContainerIterator; 00050 typedef std::pair<ContainerIterator, ContainerIterator> Range; 00051 typedef std::vector<DetRegistry> Registry; 00052 typedef Registry::const_iterator RegistryIterator; 00053 typedef Container InputVector; 00054 00055 SiStripBadStrip(){}; 00056 SiStripBadStrip(const SiStripBadStrip& orig){ 00057 v_badstrips=orig.v_badstrips; 00058 indexes=orig.indexes; 00059 } 00060 virtual ~SiStripBadStrip(){}; 00061 00062 bool put(const uint32_t& detID,const InputVector& vect){return put(detID,Range(vect.begin(),vect.end()));} 00063 bool put(const uint32_t& detID,Range input); 00064 const Range getRange(const uint32_t& detID) const; 00065 void getDetIds(std::vector<uint32_t>& DetIds_) const; 00066 void printSummary(std::stringstream & ss) const; 00067 void printDebug(std::stringstream & ss) const; 00068 00069 ContainerIterator getDataVectorBegin() const {return v_badstrips.begin();} 00070 ContainerIterator getDataVectorEnd() const {return v_badstrips.end();} 00071 RegistryIterator getRegistryVectorBegin() const {return indexes.begin();} 00072 RegistryIterator getRegistryVectorEnd() const{return indexes.end();} 00073 00074 00075 inline data decode (const unsigned int& value) const { 00076 data a; 00077 a.firstStrip = ((value>>sistrip::FirstBadStripShift_)&sistrip::FirstBadStripMask_); 00078 a.range = ((value>>sistrip::RangeBadStripShift_)&sistrip::RangeBadStripMask_); 00079 a.flag = ((value>>sistrip::FlagBadStripShift_)&sistrip::FlagBadStripMask_); 00080 return a; 00081 } 00082 00083 inline unsigned int encode (const unsigned short& first, const unsigned short& NconsecutiveBadStrips, const unsigned short& flag=0) { 00084 return ((first & sistrip::FirstBadStripMask_)<<sistrip::FirstBadStripShift_) | ((NconsecutiveBadStrips & sistrip::RangeBadStripMask_)<<sistrip::RangeBadStripShift_) | ((flag & sistrip::FlagBadStripMask_)<<sistrip::FlagBadStripShift_); 00085 } 00086 00087 protected: 00088 Container v_badstrips; 00089 Registry indexes; 00090 }; 00091 00092 #endif