Go to the documentation of this file.00001 #ifndef SiStripThreshold_h
00002 #define SiStripThreshold_h
00003
00004 #include<vector>
00005 #include<map>
00006 #include<iostream>
00007 #include<boost/cstdint.hpp>
00008 #include "DataFormats/SiStripCommon/interface/ConstantsForCondObjects.h"
00009 #include <sstream>
00010
00038 class SiStripThreshold {
00039
00040 public:
00041
00042 struct Data{
00043
00044 inline void encode (const uint16_t& strip, const float& lTh,const float& hTh) {
00045 FirstStrip_and_Hth =
00046 ((strip & sistrip::FirstThStripMask_)<<sistrip::FirstThStripShift_) |
00047 ((uint32_t)(hTh*5.0+0.5) & sistrip::HighThStripMask_);
00048
00049 lowTh=((uint32_t)(lTh*5.0+0.5) & sistrip::LowThStripMask_);
00050 clusTh=0;
00051 }
00052
00053
00054 inline void encode (const uint16_t& strip, const float& lTh,const float& hTh, const float& cTh) {
00055 encode (strip,lTh,hTh);
00056 clusTh=(uint8_t)(cTh*10+.5);
00057 }
00058
00059 inline uint16_t getFirstStrip() const {return (FirstStrip_and_Hth>>sistrip::FirstThStripShift_);}
00060 inline float getHth() const {return (FirstStrip_and_Hth& sistrip::HighThStripMask_)/5.0;}
00061 inline float getLth()const {return (lowTh& sistrip::LowThStripMask_)/5.0;}
00062 inline float getClusth()const {return clusTh/10.0;}
00063
00064 bool operator == (const Data& d) const { return (getHth() == d.getHth()) && (lowTh == d.lowTh) && (clusTh == d.clusTh); }
00065 bool operator < (const Data& d) const { return (FirstStrip_and_Hth < d.FirstStrip_and_Hth); }
00066
00067 void print(std::stringstream& ss) const{ ss << "firstStrip: " << getFirstStrip() << " \t"
00068 << "lTh: " << " " << getLth() << " \t"
00069 << "hTh: " << " " << getHth() << " \t"
00070 << "cTh: " << " " << getClusth() << " \t";}
00071
00072 uint16_t FirstStrip_and_Hth;
00073 uint8_t lowTh;
00074 uint8_t clusTh;
00075 };
00076
00077 struct DetRegistry{
00078 uint32_t detid;
00079 uint32_t ibegin;
00080 uint32_t iend;
00081 };
00082
00083
00084 class StrictWeakOrdering{
00085 public:
00086 bool operator() (const DetRegistry& p,const uint32_t& i) const {return p.detid < i;}
00087 };
00088
00089 class dataStrictWeakOrdering{
00090 public:
00091 bool operator() (const uint16_t& i, const Data& p) const {return i<p.FirstStrip_and_Hth ;}
00092 };
00093
00094
00095 typedef std::vector<Data> Container;
00096 typedef Container::const_iterator ContainerIterator;
00097 typedef std::pair<ContainerIterator, ContainerIterator> Range;
00098 typedef std::vector<DetRegistry> Registry;
00099 typedef Registry::const_iterator RegistryIterator;
00100 typedef Container InputVector;
00101
00102 SiStripThreshold(){};
00103 SiStripThreshold(const SiStripThreshold& orig){
00104 v_threshold=orig.v_threshold;
00105 indexes=orig.indexes;
00106 }
00107 virtual ~SiStripThreshold(){};
00108
00109 bool put(const uint32_t& detID,InputVector vect);
00110 const Range getRange(const uint32_t& detID) const;
00111 void getDetIds(std::vector<uint32_t>& DetIds_) const;
00112
00113
00114 ContainerIterator getDataVectorBegin() const {return v_threshold.begin();}
00115 ContainerIterator getDataVectorEnd() const {return v_threshold.end();}
00116 RegistryIterator getRegistryVectorBegin() const {return indexes.begin();}
00117 RegistryIterator getRegistryVectorEnd() const{return indexes.end();}
00118
00119 void setData(const uint16_t& strip, const float& lTh,const float& hTh, Container& vthr);
00120 void setData(const uint16_t& strip, const float& lTh,const float& hTh, const float& cTh, Container& vthr);
00121 SiStripThreshold::Data getData (const uint16_t& strip, const Range& range) const;
00122
00123 void allThresholds(std::vector<float> &lowThs, std::vector<float> &highThs, const Range& range) const;
00124
00126 void printSummary(std::stringstream& ss) const;
00128 void printDebug(std::stringstream& ss) const;
00129
00130 private:
00131
00132 Container::iterator compact(Container& input);
00133 void addToStat(float value, uint16_t& range, float& sum, float& sum2, float& min, float& max) const;
00134
00135 private:
00136 Container v_threshold;
00137 Registry indexes;
00138 };
00139
00140 #endif