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 00010 00011 class SiStripBadStrip { 00012 00013 public: 00014 00015 struct data{ 00016 unsigned short firstStrip; 00017 unsigned short range; 00018 unsigned short flag; 00019 }; 00020 00021 struct DetRegistry{ 00022 uint32_t detid; 00023 uint32_t ibegin; 00024 uint32_t iend; 00025 }; 00026 00027 class StrictWeakOrdering{ 00028 public: 00029 bool operator() (const DetRegistry& p,const uint32_t& i) const {return p.detid < i;} 00030 }; 00031 00032 00033 typedef std::vector<unsigned int> Container; 00034 typedef std::vector<unsigned int>::const_iterator ContainerIterator; 00035 typedef std::pair<ContainerIterator, ContainerIterator> Range; 00036 typedef std::vector<DetRegistry> Registry; 00037 typedef Registry::const_iterator RegistryIterator; 00038 typedef Container InputVector; 00039 00040 SiStripBadStrip(){}; 00041 SiStripBadStrip(const SiStripBadStrip& orig){ 00042 v_badstrips=orig.v_badstrips; 00043 indexes=orig.indexes; 00044 } 00045 virtual ~SiStripBadStrip(){}; 00046 00047 bool put(const uint32_t& detID,const InputVector& vect){return put(detID,Range(vect.begin(),vect.end()));} 00048 bool put(const uint32_t& detID,Range input); 00049 const Range getRange(const uint32_t& detID) const; 00050 void getDetIds(std::vector<uint32_t>& DetIds_) const; 00051 00052 00053 ContainerIterator getDataVectorBegin() const {return v_badstrips.begin();} 00054 ContainerIterator getDataVectorEnd() const {return v_badstrips.end();} 00055 RegistryIterator getRegistryVectorBegin() const {return indexes.begin();} 00056 RegistryIterator getRegistryVectorEnd() const{return indexes.end();} 00057 00058 00059 inline data decode (const unsigned int& value) const { 00060 data a; 00061 a.firstStrip = ((value>>sistrip::FirstBadStripShift_)&sistrip::FirstBadStripMask_); 00062 a.range = ((value>>sistrip::RangeBadStripShift_)&sistrip::RangeBadStripMask_); 00063 a.flag = ((value>>sistrip::FlagBadStripShift_)&sistrip::FlagBadStripMask_); 00064 return a; 00065 } 00066 00067 inline unsigned int encode (const unsigned short& first, const unsigned short& NconsecutiveBadStrips, const unsigned short& flag=0) { 00068 return ((first & sistrip::FirstBadStripMask_)<<sistrip::FirstBadStripShift_) | ((NconsecutiveBadStrips & sistrip::RangeBadStripMask_)<<sistrip::RangeBadStripShift_) | ((flag & sistrip::FlagBadStripMask_)<<sistrip::FlagBadStripShift_); 00069 } 00070 00071 protected: 00072 Container v_badstrips; 00073 Registry indexes; 00074 }; 00075 00076 #endif