CMS 3D CMS Logo

HFFlexibleTimeCheck.cc
Go to the documentation of this file.
1 #include <cmath>
2 
8 
9 // Phase 1 rechit status bit assignments
11 
13  const unsigned ianode, const HFQIE10Info& anode,
14  bool* isTimingReliable) const
15 {
16  // Return quickly if this anode has a dataframe error
17  if (!anode.isDataframeOK())
19 
20  // Require minimum charge for reliable timing measurement
21  const float charge = anode.charge();
22  const float minCharge = ianode ? pmtInfo_->minCharge1() :
24  if (charge < minCharge)
25  {
26  *isTimingReliable = false;
27  return HFAnodeStatus::OK;
28  }
29 
30  // Special handling of under/overshoot TDC values, as well
31  // as of DLL failures
32  float trise = anode.timeRising();
34  charge < minChargeForUndershoot()) ||
36  charge < minChargeForOvershoot()) ||
38  {
39  *isTimingReliable = false;
40  return HFAnodeStatus::OK;
41  }
42 
43  // Check if the rise time information is meaningful
44  if (HcalSpecialTimes::isSpecial(trise))
46 
47  // Figure out the timing cuts for this PMT
48  const AbsHcalFunctor& minTimeShape = pmtInfo_->cut(
50  const AbsHcalFunctor& maxTimeShape = pmtInfo_->cut(
52 
53  // Apply the timing cuts
54  trise += timeShift();
55  if (minTimeShape(charge) <= trise && trise <= maxTimeShape(charge))
56  return HFAnodeStatus::OK;
57  else
59 }
60 
62  const HcalCalibrations& calibs,
63  const bool flaggedBadInDB[2],
64  const bool expectSingleAnodePMT)
65 {
66  // The algorithm must be configured by now
67  if (!algoConf_)
68  throw cms::Exception("HFPhase1BadConfig")
69  << "In HFFlexibleTimeCheck::reconstruct: algorithm is not configured";
70 
71  // Fetch the algorithm configuration data for this PMT
72  pmtInfo_ = &algoConf_->at(prehit.id());
73 
74  // Run the reconstruction algorithm from the base class
76  prehit, calibs, flaggedBadInDB, expectSingleAnodePMT);
77 
78  if (rh.id().rawId())
79  {
80  // Check the charge asymmetry between the two anodes
81  bool setAsymmetryFlag = true;
83  {
84  using namespace CaloRecHitAuxSetter;
85 
86  const unsigned st0 = getField(rh.aux(), HFRecHitAuxSetter::MASK_STATUS,
88  const unsigned st1 = getField(rh.getAuxHF(), HFRecHitAuxSetter::MASK_STATUS,
90  setAsymmetryFlag = st0 == HFAnodeStatus::OK && st1 == HFAnodeStatus::OK;
91  }
92 
93  if (setAsymmetryFlag)
94  {
95  bool passesAsymmetryCut = true;
96  const std::pair<float,bool> qAsymm =
98  if (qAsymm.second)
99  {
100  const float q = prehit.charge();
101  const float minAsymm = (pmtInfo_->cut(HFPhase1PMTData::ASYMM_MIN))(q);
102  const float maxAsymm = (pmtInfo_->cut(HFPhase1PMTData::ASYMM_MAX))(q);
103  passesAsymmetryCut = minAsymm <= qAsymm.first && qAsymm.first <= maxAsymm;
104  }
105  if (!passesAsymmetryCut)
107  }
108  }
109 
110  return rh;
111 }
float minChargeForOvershoot() const
unsigned determineAnodeStatus(unsigned anodeNumber, const HFQIE10Info &anode, bool *isTimingReliable) const override
float minChargeAsymm() const
float timeRising() const
Definition: HFQIE10Info.h:72
constexpr float UNKNOWN_T_DLL_FAILURE
const HFPhase1PMTParams * algoConf_
bool isDataframeOK(bool checkAllTimeSlices=false) const
Definition: HFQIE10Info.h:86
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:50
bool alwaysCalculatingQAsym() const
constexpr void setFlagField(uint32_t value, int base, int width=1)
Definition: CaloRecHit.h:38
constexpr float UNKNOWN_T_UNDERSHOOT
static const unsigned OFF_STATUS
const Item & at(const HcalDetId &id) const
constexpr float UNKNOWN_T_OVERSHOOT
HcalDetId id() const
Definition: HFPreRecHit.h:38
HFRecHit reconstruct(const HFPreRecHit &prehit, const HcalCalibrations &calibs, const bool flaggedBadInDB[2], bool expectSingleAnodePMT) override
static const unsigned MASK_STATUS
const AbsHcalFunctor & cut(const unsigned which) const
float minCharge0() const
constexpr unsigned getField(const uint32_t u, const unsigned mask, const unsigned offset)
constexpr bool isSpecial(const float t)
float minCharge1() const
HFRecHit reconstruct(const HFPreRecHit &prehit, const HcalCalibrations &calibs, const bool flaggedBadInDB[2], bool expectSingleAnodePMT) override
float charge() const
Definition: HFPreRecHit.h:51
float timeShift() const
uint32_t getAuxHF() const
Definition: HFRecHit.h:34
constexpr uint32_t aux() const
Definition: CaloRecHit.h:52
std::pair< float, bool > chargeAsymmetry(float chargeThreshold) const
Definition: HFPreRecHit.cc:3
HcalDetId id() const
Definition: HFRecHit.h:31
const HFPhase1PMTData * pmtInfo_
float charge() const
Definition: HFQIE10Info.h:70
float minChargeForUndershoot() const