CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
EcalRecHit.h
Go to the documentation of this file.
1 #ifndef DATAFORMATS_ECALRECHIT_H
2 #define DATAFORMATS_ECALRECHIT_H 1
3 
6 
7 #include <vector>
8 #include <cmath>
9 
15 class EcalRecHit {
16 public:
17  typedef DetId key_type;
18 
19  // recHit flags
20  enum Flags {
21  kGood=0, // channel ok, the energy and time measurement are reliable
22  kPoorReco, // the energy is available from the UncalibRecHit, but approximate (bad shape, large chi2)
23  kOutOfTime, // the energy is available from the UncalibRecHit (sync reco), but the event is out of time
24  kFaultyHardware, // The energy is available from the UncalibRecHit, channel is faulty at some hardware level (e.g. noisy)
25  kNoisy, // the channel is very noisy
26  kPoorCalib, // the energy is available from the UncalibRecHit, but the calibration of the channel is poor
27  kSaturated, // saturated channel (recovery not tried)
28  kLeadingEdgeRecovered, // saturated channel: energy estimated from the leading edge before saturation
29  kNeighboursRecovered, // saturated/isolated dead: energy estimated from neighbours
30  kTowerRecovered, // channel in TT with no data link, info retrieved from Trigger Primitive
31  kDead, // channel is dead and any recovery fails
32  kKilled, // MC only flag: the channel is killed in the real detector
33  kTPSaturated, // the channel is in a region with saturated TP
34  kL1SpikeFlag, // the channel is in a region with TP with sFGVB = 0
35  kWeird, // the signal is believed to originate from an anomalous deposit (spike)
36  kDiWeird, // the signal is anomalous, and neighbors another anomalous signal
37  kHasSwitchToGain6, // at least one data frame is in G6
38  kHasSwitchToGain1, // at least one data frame is in G1
39  //
40  kUnknown // to ease the interface with functions returning flags.
41  };
42 
43  // ES recHit flags
44  enum ESFlags {
61  };
62 
63  EcalRecHit(): energy_(0), time_(0), flagBits_(0) {}
64  // by default a recHit is greated with no flag
65  explicit EcalRecHit(const DetId& id, float energy, float time, uint32_t extra = 0, uint32_t flagBits = 0):
66  id_(id), energy_(energy), time_(time), flagBits_(flagBits), extra_(extra) {}
67 
68  float energy() const { return energy_; }
69  void setEnergy(float energy) { energy_=energy; }
70  float time() const { return time_; }
71  const DetId& detid() const { return id_; }
72 
74  // For the moment not returning a specific id for subdetector
75  // @TODO why this method?! should use detid()
76  DetId id() const { return DetId(detid());}
77 
78  bool isRecovered() const {
82  }
83 
84  bool isTimeValid() const { return (this->timeError() > 0); }
85 
86  bool isTimeErrorValid() const {
87  if(!isTimeValid())
88  return false;
89 
90  if(timeError() >= 10000)
91  return false;
92 
93  return true;
94  }
95 
96  static inline uint32_t getMasked(uint32_t value, uint32_t offset, uint32_t width) {
97  return (value >> offset) & ((1 << width) - 1);
98  }
99 
100  static inline uint32_t setMasked(uint32_t value, uint32_t x, uint32_t offset, uint32_t width) {
101  const uint32_t mask = ((1 << width) - 1) << offset;
102  value &= ~mask;
103  value |= (x & ((1U << width) - 1)) << offset;
104  return value;
105  }
106 
107  static inline int getPower10(float e) {
108  static constexpr float p10[] = {1.e-2f,1.e-1f,1.f,1.e1f,1.e2f,1.e3f,1.e4f,1.e5f,1.e6f};
109  int b = e<p10[4] ? 0 : 5;
110  for (;b<9;++b) if (e<p10[b]) break;
111  return b;
112  }
113 
114 
115  /* the new bit structure
116  * 0..6 - chi2 in time events (chi2()), offset=0, width=7
117  * 8..20 - energy uncertainty, offset=8, width=13
118  * 24..31 - timeError(), offset=24, width=8
119  */
120  float chi2() const {
121  uint32_t rawChi2 = getMasked(extra_, 0, 7);
122  return (float)rawChi2 / (float)((1<<7)-1) * 64.;
123  }
124 
125  void setChi2(float chi2) {
126  // bound the max value of the chi2
127  if (chi2 > 64) chi2 = 64;
128 
129  // use 7 bits
130  uint32_t rawChi2 = lround(chi2 / 64. * ((1<<7)-1));
131  extra_ = setMasked(extra_, rawChi2, 0, 7);
132  }
133 
134  float energyError() const {
135  uint32_t rawEnergy = getMasked(extra_, 8, 13);
136  uint16_t exponent = rawEnergy >> 10;
137  uint16_t significand = ~(0xE<<9) & rawEnergy;
138  return (float) significand*pow(10,exponent-5);
139  }
140 
141  // set the energy uncertainty
142  // (only energy >= 0 will be stored)
143  void setEnergyError(float energy) {
144  uint32_t rawEnergy = 0;
145  if (energy > 0.001) {
146  uint16_t exponent = getPower10(energy);
147  static constexpr float ip10[] = {1.e5f,1.e4f,1.e3f,1.e2f,1.e1f,1.e0f,1.e-1f,1.e-2f,1.e-3f,1.e-4};
148  uint16_t significand = lround(energy*ip10[exponent]);
149  // use 13 bits (3 exponent, 10 significand)
150  rawEnergy = exponent << 10 | significand;
151  /* here for doc and regression test
152  uint16_t exponent_old = lround(floor(log10(energy))) + 3;
153  uint16_t significand_old = lround(energy/pow(10, exponent - 5));
154  std::cout << energy << ' ' << exponent << ' ' << significand
155  << ' ' << exponent_old << ' ' << significand_old << std::endl;
156  assert(exponent==exponent_old);
157  assert(significand==significand_old);
158  */
159  }
160 
161  extra_ = setMasked(extra_, rawEnergy, 8, 13);
162  }
163 
164  float timeError() const {
165  uint32_t timeErrorBits = getMasked(extra_, 24, 8);
166  // all bits off --> time reco bailed out (return negative value)
167  if( (0xFF & timeErrorBits) == 0x00 )
168  return -1;
169  // all bits on --> time error over 5 ns (return large value)
170  if( (0xFF & timeErrorBits) == 0xFF )
171  return 10000;
172 
173  float LSB = 1.26008;
174  uint8_t exponent = timeErrorBits>>5;
175  uint8_t significand = timeErrorBits & ~(0x7<<5);
176  return pow(2.,exponent)*significand*LSB/1000.;
177  }
178 
179  void setTimeError(uint8_t timeErrBits) {
180  extra_ = setMasked(extra_, timeErrBits & 0xFF, 24, 8);
181  }
182 
184  void setFlag(int flag) {flagBits_|= (0x1 << flag);}
185  void unsetFlag(int flag) {flagBits_ &= ~(0x1 << flag);}
186 
188  bool checkFlag(int flag) const {return flagBits_ & ( 0x1<<flag);}
189 
191  bool checkFlags(const std::vector<int>& flagsvec) const {
192  for (std::vector<int>::const_iterator flagPtr = flagsvec.begin();
193  flagPtr!= flagsvec.end(); ++flagPtr) { // check if one of the flags is up
194 
195  if (checkFlag(*flagPtr)) return true;
196  }
197 
198  return false;
199  }
200 
202  bool checkFlagMask(uint32_t mask) const { return flagBits_&mask; }
203 
205  Flags recoFlag() const {
206  for (int i=kUnknown; ; --i){
207  if (checkFlag(i)) return Flags(i);
208  if (i==0) break;
209  }
210 
211  // no flag assigned, assume good
212  return kGood;
213  }
214 
215 private:
216  // from calorechit
218  float energy_;
219  float time_;
220 
222  uint32_t flagBits_;
223 
224  // packed uint32_t for timeError, chi2, energyError
225  uint32_t extra_;
226 };
227 
228 std::ostream& operator<<(std::ostream& s, const EcalRecHit& hit);
229 
230 #endif
int i
Definition: DBlmapReader.cc:9
void unsetFlag(int flag)
Definition: EcalRecHit.h:185
bool isTimeErrorValid() const
Definition: EcalRecHit.h:86
bool checkFlags(const std::vector< int > &flagsvec) const
check if one of the flags in a set is true
Definition: EcalRecHit.h:191
static uint32_t setMasked(uint32_t value, uint32_t x, uint32_t offset, uint32_t width)
Definition: EcalRecHit.h:100
static int getPower10(float e)
Definition: EcalRecHit.h:107
const DetId & detid() const
Definition: EcalRecHit.h:71
float time() const
Definition: EcalRecHit.h:70
void setFlag(int flag)
set the flags (from Flags or ESFlags)
Definition: EcalRecHit.h:184
std::ostream & operator<<(std::ostream &out, const ALILine &li)
Definition: ALILine.cc:188
bool isTimeValid() const
Definition: EcalRecHit.h:84
#define constexpr
bool isRecovered() const
Definition: EcalRecHit.h:78
void setEnergyError(float energy)
Definition: EcalRecHit.h:143
void setTimeError(uint8_t timeErrBits)
Definition: EcalRecHit.h:179
float time_
Definition: EcalRecHit.h:219
bool checkFlag(int flag) const
check if the flag is true
Definition: EcalRecHit.h:188
float chi2() const
Definition: EcalRecHit.h:120
float energy() const
Definition: EcalRecHit.h:68
double f[11][100]
float timeError() const
Definition: EcalRecHit.h:164
Definition: DetId.h:18
static uint32_t getMasked(uint32_t value, uint32_t offset, uint32_t width)
Definition: EcalRecHit.h:96
float energyError() const
Definition: EcalRecHit.h:134
DetId id() const
get the id
Definition: EcalRecHit.h:76
void setEnergy(float energy)
Definition: EcalRecHit.h:69
Flags recoFlag() const
DEPRECATED provided for temporary backward compatibility.
Definition: EcalRecHit.h:205
EcalRecHit(const DetId &id, float energy, float time, uint32_t extra=0, uint32_t flagBits=0)
Definition: EcalRecHit.h:65
bool checkFlagMask(uint32_t mask) const
apply a bitmask to our flags. Experts only
Definition: EcalRecHit.h:202
double b
Definition: hdecay.h:120
float energy_
Definition: EcalRecHit.h:218
void setChi2(float chi2)
Definition: EcalRecHit.h:125
uint32_t extra_
Definition: EcalRecHit.h:225
DetId key_type
Definition: EcalRecHit.h:17
DetId id_
Definition: EcalRecHit.h:217
uint32_t flagBits_
store rechit condition (see Flags enum) in a bit-wise way
Definition: EcalRecHit.h:222
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40