CMS 3D CMS Logo

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  void setTime(float time) { time_ = time; }
72  const DetId& detid() const { return id_; }
73 
75  // For the moment not returning a specific id for subdetector
76  // @TODO why this method?! should use detid()
77  DetId id() const { return DetId(detid());}
78 
79  bool isRecovered() const {
83  }
84 
85  bool isTimeValid() const { return (this->timeError() > 0); }
86 
87  bool isTimeErrorValid() const {
88  if(!isTimeValid())
89  return false;
90 
91  if(timeError() >= 10000)
92  return false;
93 
94  return true;
95  }
96 
97  static inline uint32_t getMasked(uint32_t value, uint32_t offset, uint32_t width) {
98  return (value >> offset) & ((1 << width) - 1);
99  }
100 
101  static inline uint32_t setMasked(uint32_t value, uint32_t x, uint32_t offset, uint32_t width) {
102  const uint32_t mask = ((1 << width) - 1) << offset;
103  value &= ~mask;
104  value |= (x & ((1U << width) - 1)) << offset;
105  return value;
106  }
107 
108  static inline int getPower10(float e) {
109  static constexpr float p10[] = {1.e-2f,1.e-1f,1.f,1.e1f,1.e2f,1.e3f,1.e4f,1.e5f,1.e6f};
110  int b = e<p10[4] ? 0 : 5;
111  for (;b<9;++b) if (e<p10[b]) break;
112  return b;
113  }
114 
115 
116  /* the new bit structure
117  * 0..6 - chi2 in time events (chi2()), offset=0, width=7
118  * 8..20 - energy uncertainty, offset=8, width=13
119  * 24..31 - timeError(), offset=24, width=8
120  */
121  float chi2() const {
122  uint32_t rawChi2 = getMasked(extra_, 0, 7);
123  return (float)rawChi2 / (float)((1<<7)-1) * 64.;
124  }
125 
126  void setChi2(float chi2) {
127  // bound the max value of the chi2
128  if (chi2 > 64) chi2 = 64;
129 
130  // use 7 bits
131  uint32_t rawChi2 = lround(chi2 / 64. * ((1<<7)-1));
132  extra_ = setMasked(extra_, rawChi2, 0, 7);
133  }
134 
135  float energyError() const {
136  uint32_t rawEnergy = getMasked(extra_, 8, 13);
137  uint16_t exponent = rawEnergy >> 10;
138  uint16_t significand = ~(0xE<<9) & rawEnergy;
139  return (float) significand*pow(10,exponent-5);
140  }
141 
142  // set the energy uncertainty
143  // (only energy >= 0 will be stored)
144  void setEnergyError(float energy) {
145  uint32_t rawEnergy = 0;
146  if (energy > 0.001) {
147  uint16_t exponent = getPower10(energy);
148  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};
149  uint16_t significand = lround(energy*ip10[exponent]);
150  // use 13 bits (3 exponent, 10 significand)
151  rawEnergy = exponent << 10 | significand;
152  /* here for doc and regression test
153  uint16_t exponent_old = lround(floor(log10(energy))) + 3;
154  uint16_t significand_old = lround(energy/pow(10, exponent - 5));
155  std::cout << energy << ' ' << exponent << ' ' << significand
156  << ' ' << exponent_old << ' ' << significand_old << std::endl;
157  assert(exponent==exponent_old);
158  assert(significand==significand_old);
159  */
160  }
161 
162  extra_ = setMasked(extra_, rawEnergy, 8, 13);
163  }
164 
165  float timeError() const {
166  uint32_t timeErrorBits = getMasked(extra_, 24, 8);
167  // all bits off --> time reco bailed out (return negative value)
168  if( (0xFF & timeErrorBits) == 0x00 )
169  return -1;
170  // all bits on --> time error over 5 ns (return large value)
171  if( (0xFF & timeErrorBits) == 0xFF )
172  return 10000;
173 
174  float LSB = 1.26008;
175  uint8_t exponent = timeErrorBits>>5;
176  uint8_t significand = timeErrorBits & ~(0x7<<5);
177  return pow(2.,exponent)*significand*LSB/1000.;
178  }
179 
180  void setTimeError(uint8_t timeErrBits) {
181  extra_ = setMasked(extra_, timeErrBits & 0xFF, 24, 8);
182  }
183 
185  void setFlag(int flag) {flagBits_|= (0x1 << flag);}
186  void unsetFlag(int flag) {flagBits_ &= ~(0x1 << flag);}
187 
189  bool checkFlag(int flag) const {return flagBits_ & ( 0x1<<flag);}
190 
192  bool checkFlags(const std::vector<int>& flagsvec) const {
193  for (std::vector<int>::const_iterator flagPtr = flagsvec.begin();
194  flagPtr!= flagsvec.end(); ++flagPtr) { // check if one of the flags is up
195 
196  if (checkFlag(*flagPtr)) return true;
197  }
198 
199  return false;
200  }
201 
203  bool checkFlagMask(uint32_t mask) const { return flagBits_&mask; }
204 
206  Flags recoFlag() const {
207  for (int i=kUnknown; ; --i){
208  if (checkFlag(i)) return Flags(i);
209  if (i==0) break;
210  }
211 
212  // no flag assigned, assume good
213  return kGood;
214  }
215 
216 private:
217  // from calorechit
219  float energy_;
220  float time_;
221 
223  uint32_t flagBits_;
224 
225  // packed uint32_t for timeError, chi2, energyError
226  uint32_t extra_;
227 };
228 
229 std::ostream& operator<<(std::ostream& s, const EcalRecHit& hit);
230 
231 #endif
void unsetFlag(int flag)
Definition: EcalRecHit.h:186
bool isTimeErrorValid() const
Definition: EcalRecHit.h:87
bool checkFlags(const std::vector< int > &flagsvec) const
check if one of the flags in a set is true
Definition: EcalRecHit.h:192
static uint32_t setMasked(uint32_t value, uint32_t x, uint32_t offset, uint32_t width)
Definition: EcalRecHit.h:101
static int getPower10(float e)
Definition: EcalRecHit.h:108
const DetId & detid() const
Definition: EcalRecHit.h:72
float time() const
Definition: EcalRecHit.h:70
void setFlag(int flag)
set the flags (from Flags or ESFlags)
Definition: EcalRecHit.h:185
bool isTimeValid() const
Definition: EcalRecHit.h:85
#define constexpr
bool isRecovered() const
Definition: EcalRecHit.h:79
void setEnergyError(float energy)
Definition: EcalRecHit.h:144
void setTimeError(uint8_t timeErrBits)
Definition: EcalRecHit.h:180
void setTime(float time)
Definition: EcalRecHit.h:71
float time_
Definition: EcalRecHit.h:220
bool checkFlag(int flag) const
check if the flag is true
Definition: EcalRecHit.h:189
float chi2() const
Definition: EcalRecHit.h:121
float energy() const
Definition: EcalRecHit.h:68
double f[11][100]
Definition: value.py:1
float timeError() const
Definition: EcalRecHit.h:165
std::ostream & operator<<(std::ostream &s, const EcalRecHit &hit)
Definition: EcalRecHit.cc:10
Definition: DetId.h:18
static uint32_t getMasked(uint32_t value, uint32_t offset, uint32_t width)
Definition: EcalRecHit.h:97
float energyError() const
Definition: EcalRecHit.h:135
DetId id() const
get the id
Definition: EcalRecHit.h:77
void setEnergy(float energy)
Definition: EcalRecHit.h:69
Flags recoFlag() const
DEPRECATED provided for temporary backward compatibility.
Definition: EcalRecHit.h:206
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:203
double b
Definition: hdecay.h:120
float energy_
Definition: EcalRecHit.h:219
void setChi2(float chi2)
Definition: EcalRecHit.h:126
uint32_t extra_
Definition: EcalRecHit.h:226
DetId key_type
Definition: EcalRecHit.h:17
DetId id_
Definition: EcalRecHit.h:218
uint32_t flagBits_
store rechit condition (see Flags enum) in a bit-wise way
Definition: EcalRecHit.h:223
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40