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
EcalRecHit::kNeighboursRecovered
Definition: EcalRecHit.h:29
EcalRecHit::getMasked
static uint32_t getMasked(uint32_t value, uint32_t offset, uint32_t width)
Definition: EcalRecHit.h:95
EcalRecHit::time_
float time_
Definition: EcalRecHit.h:223
ApeEstimator_cff.width
width
Definition: ApeEstimator_cff.py:24
EcalRecHit
Definition: EcalRecHit.h:15
EcalRecHit::kESTS15Sigmas
Definition: EcalRecHit.h:60
EcalRecHit::kTPSaturated
Definition: EcalRecHit.h:33
mps_fire.i
i
Definition: mps_fire.py:428
EcalRecHit::kESBadRatioFor23Lower
Definition: EcalRecHit.h:52
dqmMemoryStats.float
float
Definition: dqmMemoryStats.py:127
EcalRecHit::detid
const DetId & detid() const
Definition: EcalRecHit.h:72
EcalRecHit::id
DetId id() const
get the id
Definition: EcalRecHit.h:77
EcalRecHit::kHasSwitchToGain6
Definition: EcalRecHit.h:37
EcalRecHit::energy_
float energy_
Definition: EcalRecHit.h:222
f
double f[11][100]
Definition: MuScleFitUtils.cc:78
EcalRecHit::kL1SpikeFlag
Definition: EcalRecHit.h:34
EcalRecHit::kESHot
Definition: EcalRecHit.h:47
EcalRecHit::isRecovered
bool isRecovered() const
Definition: EcalRecHit.h:79
EcalRecHit::Flags
Flags
Definition: EcalRecHit.h:20
EcalRecHit::EcalRecHit
EcalRecHit(const DetId &id, float energy, float time, uint32_t extra=0, uint32_t flagBits=0)
Definition: EcalRecHit.h:65
EcalRecHit::kSaturated
Definition: EcalRecHit.h:27
EcalRecHit::kESTS3Saturated
Definition: EcalRecHit.h:58
EcalRecHit::kESTwoGoodRatios
Definition: EcalRecHit.h:49
EcalRecHit::setChi2
void setChi2(float chi2)
Definition: EcalRecHit.h:125
DDAxes::x
EcalRecHit::energy
float energy() const
Definition: EcalRecHit.h:68
EcalRecHit::kTowerRecovered
Definition: EcalRecHit.h:30
EcalRecHit::key_type
DetId key_type
Definition: EcalRecHit.h:17
CaloRecHit.h
EcalRecHit::extra_
uint32_t extra_
Definition: EcalRecHit.h:229
DetId
Definition: DetId.h:17
EcalRecHit::setEnergy
void setEnergy(float energy)
Definition: EcalRecHit.h:69
alignCSCRings.s
s
Definition: alignCSCRings.py:92
EcalRecHit::kNoisy
Definition: EcalRecHit.h:25
EcalRecHit::isTimeErrorValid
bool isTimeErrorValid() const
Definition: EcalRecHit.h:85
EcalRecHit::time
float time() const
Definition: EcalRecHit.h:70
EcalRecHit::kUnknown
Definition: EcalRecHit.h:40
EcalRecHit::checkFlag
bool checkFlag(int flag) const
check if the flag is true
Definition: EcalRecHit.h:187
EcalRecHit::unsetFlag
void unsetFlag(int flag)
Definition: EcalRecHit.h:184
HLT_FULL_cff.exponent
exponent
Definition: HLT_FULL_cff.py:52854
EcalRecHit::flagBits_
uint32_t flagBits_
store rechit condition (see Flags enum) in a bit-wise way
Definition: EcalRecHit.h:226
EcalRecHit::kGood
Definition: EcalRecHit.h:21
EcalRecHit::isTimeValid
bool isTimeValid() const
Definition: EcalRecHit.h:83
b
double b
Definition: hdecay.h:118
EcalRecHit::chi2
float chi2() const
Definition: EcalRecHit.h:120
mitigatedMETSequence_cff.U
U
Definition: mitigatedMETSequence_cff.py:36
EcalRecHit::id_
DetId id_
Definition: EcalRecHit.h:221
EcalRecHit::kPoorReco
Definition: EcalRecHit.h:22
EcalRecHit::kLeadingEdgeRecovered
Definition: EcalRecHit.h:28
EcalRecHit::kOutOfTime
Definition: EcalRecHit.h:23
EcalRecHit::kESSaturated
Definition: EcalRecHit.h:56
EcalRecHit::kESTS1Largest
Definition: EcalRecHit.h:53
EcalRecHit::kESTS3Negative
Definition: EcalRecHit.h:55
EcalRecHit::kESTS13Sigmas
Definition: EcalRecHit.h:59
EcalRecHit::checkFlags
bool checkFlags(const std::vector< int > &flagsvec) const
check if one of the flags in a set is true
Definition: EcalRecHit.h:190
value
Definition: value.py:1
EcalRecHit::setMasked
static uint32_t setMasked(uint32_t value, uint32_t x, uint32_t offset, uint32_t width)
Definition: EcalRecHit.h:99
EcalRecHit::timeError
float timeError() const
Definition: EcalRecHit.h:165
EcalRecHit::recoFlag
Flags recoFlag() const
DEPRECATED provided for temporary backward compatibility.
Definition: EcalRecHit.h:207
EcalRecHit::ESFlags
ESFlags
Definition: EcalRecHit.h:44
EcalRecHit::kWeird
Definition: EcalRecHit.h:35
EcalRecHit::kDead
Definition: EcalRecHit.h:31
EcalRecHit::kESBadRatioFor12
Definition: EcalRecHit.h:50
operator<<
std::ostream & operator<<(std::ostream &s, const EcalRecHit &hit)
Definition: EcalRecHit.cc:9
EcalRecHit::EcalRecHit
EcalRecHit()
Definition: EcalRecHit.h:63
EcalRecHit::energyError
float energyError() const
Definition: EcalRecHit.h:135
EcalRecHit::kHasSwitchToGain1
Definition: EcalRecHit.h:38
DetId.h
relativeConstraints.value
value
Definition: relativeConstraints.py:53
EcalRecHit::setEnergyError
void setEnergyError(float energy)
Definition: EcalRecHit.h:144
EcalRecHit::flagsBits
uint32_t flagsBits() const
Definition: EcalRecHit.h:201
EcalRecHit::setTimeError
void setTimeError(uint8_t timeErrBits)
Definition: EcalRecHit.h:180
EcalRecHit::kPoorCalib
Definition: EcalRecHit.h:26
EcalRecHit::getPower10
static int getPower10(float e)
Definition: EcalRecHit.h:106
funct::pow
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:29
EcalRecHit::kESPassBX
Definition: EcalRecHit.h:48
EcalRecHit::kDiWeird
Definition: EcalRecHit.h:36
EcalRecHit::setFlag
void setFlag(int flag)
set the flags (from Flags or ESFlags)
Definition: EcalRecHit.h:183
EcalRecHit::checkFlagMask
bool checkFlagMask(uint32_t mask) const
apply a bitmask to our flags. Experts only
Definition: EcalRecHit.h:204
EcalRecHit::kKilled
Definition: EcalRecHit.h:32
hltrates_dqm_sourceclient-live_cfg.offset
offset
Definition: hltrates_dqm_sourceclient-live_cfg.py:82
EcalRecHit::kESTS2Saturated
Definition: EcalRecHit.h:57
EcalRecHit::kESBadRatioFor23Upper
Definition: EcalRecHit.h:51
EcalRecHit::setTime
void setTime(float time)
Definition: EcalRecHit.h:71
EcalRecHit::kESDead
Definition: EcalRecHit.h:46
EcalRecHit::kFaultyHardware
Definition: EcalRecHit.h:24
EcalRecHit::kESGood
Definition: EcalRecHit.h:45
hit
Definition: SiStripHitEffFromCalibTree.cc:88
RemoveAddSevLevel.flag
flag
Definition: RemoveAddSevLevel.py:116
EcalRecHit::kESTS3Largest
Definition: EcalRecHit.h:54
MillePedeFileConverter_cfg.e
e
Definition: MillePedeFileConverter_cfg.py:37