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 {
81  }
82 
83  bool isTimeValid() const { return (this->timeError() > 0); }
84 
85  bool isTimeErrorValid() const {
86  if (!isTimeValid())
87  return false;
88 
89  if (timeError() >= 10000)
90  return false;
91 
92  return true;
93  }
94 
95  static inline uint32_t getMasked(uint32_t value, uint32_t offset, uint32_t width) {
96  return (value >> offset) & ((1 << width) - 1);
97  }
98 
99  static inline uint32_t setMasked(uint32_t value, uint32_t x, uint32_t offset, uint32_t width) {
100  const uint32_t mask = ((1 << width) - 1) << offset;
101  value &= ~mask;
102  value |= (x & ((1U << width) - 1)) << offset;
103  return value;
104  }
105 
106  static inline int getPower10(float e) {
107  static constexpr float p10[] = {1.e-2f, 1.e-1f, 1.f, 1.e1f, 1.e2f, 1.e3f, 1.e4f, 1.e5f, 1.e6f};
108  int b = e < p10[4] ? 0 : 5;
109  for (; b < 9; ++b)
110  if (e < p10[b])
111  break;
112  return b;
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)
128  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) { extra_ = setMasked(extra_, timeErrBits & 0xFF, 24, 8); }
181 
183  void setFlag(int flag) { flagBits_ |= (0x1 << flag); }
184  void unsetFlag(int flag) { flagBits_ &= ~(0x1 << flag); }
185 
187  bool checkFlag(int flag) const { return flagBits_ & (0x1 << flag); }
188 
190  bool checkFlags(const std::vector<int>& flagsvec) const {
191  for (std::vector<int>::const_iterator flagPtr = flagsvec.begin(); flagPtr != flagsvec.end();
192  ++flagPtr) { // check if one of the flags is up
193 
194  if (checkFlag(*flagPtr))
195  return true;
196  }
197 
198  return false;
199  }
200 
201  uint32_t flagsBits() const { return flagBits_; }
202 
204  bool checkFlagMask(uint32_t mask) const { return flagBits_ & mask; }
205 
207  Flags recoFlag() const {
208  for (int i = kUnknown;; --i) {
209  if (checkFlag(i))
210  return Flags(i);
211  if (i == 0)
212  break;
213  }
214 
215  // no flag assigned, assume good
216  return kGood;
217  }
218 
219 private:
220  // from calorechit
222  float energy_;
223  float time_;
224 
226  uint32_t flagBits_;
227 
228  // packed uint32_t for timeError, chi2, energyError
229  uint32_t extra_;
230 };
231 
232 std::ostream& operator<<(std::ostream& s, const EcalRecHit& hit);
233 
234 #endif
void unsetFlag(int flag)
Definition: EcalRecHit.h:184
bool isTimeErrorValid() const
Definition: EcalRecHit.h:85
bool checkFlags(const std::vector< int > &flagsvec) const
check if one of the flags in a set is true
Definition: EcalRecHit.h:190
static uint32_t setMasked(uint32_t value, uint32_t x, uint32_t offset, uint32_t width)
Definition: EcalRecHit.h:99
static int getPower10(float e)
Definition: EcalRecHit.h:106
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:183
bool isTimeValid() const
Definition: EcalRecHit.h:83
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:223
bool checkFlag(int flag) const
check if the flag is true
Definition: EcalRecHit.h:187
float chi2() const
Definition: EcalRecHit.h:120
uint32_t flagsBits() const
Definition: EcalRecHit.h:201
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:95
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:207
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:204
double b
Definition: hdecay.h:120
float energy_
Definition: EcalRecHit.h:222
void setChi2(float chi2)
Definition: EcalRecHit.h:125
uint32_t extra_
Definition: EcalRecHit.h:229
DetId key_type
Definition: EcalRecHit.h:17
DetId id_
Definition: EcalRecHit.h:221
uint32_t flagBits_
store rechit condition (see Flags enum) in a bit-wise way
Definition: EcalRecHit.h:226
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40
#define constexpr