CMS 3D CMS Logo

HcalHFStatusBitFromRecHits.cc
Go to the documentation of this file.
4 
5 #include <algorithm> // for "max"
6 #include <cmath>
7 #include <iostream>
8 
10  // use simple values in default constructor
13  long_thresholdET_ = 0.5; // default energy requirement
14  short_thresholdET_ = 0.5;
17 }
18 
20  double shortR, double shortET, double shortE, double longR, double longET, double longE) {
21  long_HFlongshortratio_ = longR;
22  short_HFlongshortratio_ = shortR;
23  long_thresholdET_ = longET;
24  short_thresholdET_ = shortET;
25  long_thresholdEnergy_ = longE;
26  short_thresholdEnergy_ = shortE;
27 }
28 
30 
32  HcalChannelQuality* myqual,
33  const HcalSeverityLevelComputer* mySeverity) {
34  // Compares energies from long & short fibers
35  int status;
36  float en, en2;
37  int ieta, iphi, depth;
38  float ratio; // ratio of (L-S)/(L+S) energy magnitudes
39  double coshEta;
40 
41  // Is there a faster way to do this than a double loop?
42  for (HFRecHitCollection::iterator iHF = rec.begin(); iHF != rec.end(); ++iHF) {
43  // skip cells that have already been tagged -- shouldn't happen in current algorithm
44  //if (iHF->flagField(HcalCaloFlagLabels::HFLongShort, HcalCaloFlagLabels::HFLongShort+1)) continue;
45 
46  ieta = iHF->id().ieta(); // int between 29-41
47  // eta = average value between cell eta bounds
48  std::pair<double, double> etas = myqual->topo()->etaRange(HcalForward, abs(ieta));
49  double eta1 = etas.first;
50  double eta2 = etas.second;
51  coshEta = fabs(cosh(0.5 * (eta1 + eta2)));
52 
53  status = 0; // status bit for rechit
54 
55  en2 = -999; // dummy starting value for partner energy
56  depth = iHF->id().depth();
57  en = iHF->energy(); // energy of current rechit
58 
59  if (depth == 1) // check long fiber
60  {
61  if (en < 1.2)
62  continue; // never flag long rechits < 1.2 GeV
64  continue;
65  if (long_thresholdET_ > 0. && en < long_thresholdET_ * coshEta)
66  continue;
67  }
68 
69  else if (depth == 2) // check short fiber
70  {
71  if (en < 1.8)
72  continue; // never flag short rechits < 1.8 GeV
74  continue;
75  if (short_thresholdET_ > 0. && en < short_thresholdET_ * coshEta)
76  continue;
77  }
78 
79  iphi = iHF->id().iphi();
80 
81  // Check for cells whose partners have been excluded from the rechit collections
82  // Such cells will not get flagged (since we can't make an L vs. S comparison)
83 
84  HcalDetId partner(HcalForward, ieta, iphi, 3 - depth); // if depth=1, 3-depth =2, and vice versa
85  DetId detpartner = DetId(partner);
86  const HcalChannelStatus* partnerstatus = myqual->getValues(detpartner.rawId());
87  if (mySeverity->dropChannel(partnerstatus->getValue()))
88  continue; // partner was dropped; don't set flag
89 
90  // inner loop will find 'partner' channel (same ieta, iphi, different depth)
91  for (HFRecHitCollection::iterator iHF2 = rec.begin(); iHF2 != rec.end(); ++iHF2) {
92  if (iHF2->id().ieta() != ieta)
93  continue; // require ieta match
94  if (iHF2->id().iphi() != iphi)
95  continue; // require iphi match
96  if (iHF2->id().depth() == depth)
97  continue; // require short/long combo
98 
99  en2 = iHF2->energy();
100 
101  /*
102  We used to use absolute values of energies for ratios, but I don't think we want to do this any more.
103  For example, for a threshold of 0.995, if en=50 and en2=0, the flag would be set.
104  But if en=50 and en2<-0.125, the threshold would not be set if using the absolute values.
105  I don't think we want to have a range of en2 below which the flag is not set.
106  This does mean that we need to be careful not to set the en energy threshold too low,
107  so as to not falsely flag fluctuations (en=2, en2=-0.01, for example), but we should never be setting our
108  thresholds that low.
109  */
110 
111  ratio = (en - en2) / (en + en2);
112 
113  if (depth == 1 && ratio > long_HFlongshortratio_)
114  status = 1;
115  else if (depth == 2 && ratio > short_HFlongshortratio_)
116  status = 1;
117  break; // once partner channel found, break out of loop
118  } // inner loop
119 
120  // Consider the case where only one depth present
121  if (en2 ==
122  -999) // outer rechit has already passed energy, ET thresholds above; no partner cell means this looks like isolated energy in one channel -- flag it!
123  status = 1;
124 
125  // flag rechit as potential PMT window hit
126  if (status == 1)
127  iHF->setFlagField(status, HcalCaloFlagLabels::HFLongShort, 1);
128  } // outer loop
129  return;
130 } // void HcalHFStatusBitFromRecHits::hfSetFlagFromRecHits(...)
MessageLogger.h
mps_update.status
status
Definition: mps_update.py:69
HLT_2018_cff.eta1
eta1
Definition: HLT_2018_cff.py:8220
edm::SortedCollection
Definition: SortedCollection.h:49
HcalChannelQuality
Definition: HcalChannelQuality.h:17
HcalHFStatusBitFromRecHits::long_HFlongshortratio_
double long_HFlongshortratio_
Definition: HcalHFStatusBitFromRecHits.h:70
HcalHFStatusBitFromRecHits.h
HcalCondObjectContainer::getValues
const Item * getValues(DetId fId, bool throwOnFail=true) const
Definition: HcalCondObjectContainer.h:159
LEDCalibrationChannels.iphi
iphi
Definition: LEDCalibrationChannels.py:64
HcalHFStatusBitFromRecHits::short_thresholdET_
double short_thresholdET_
Definition: HcalHFStatusBitFromRecHits.h:74
HcalHFStatusBitFromRecHits::long_thresholdEnergy_
double long_thresholdEnergy_
Definition: HcalHFStatusBitFromRecHits.h:72
DetId
Definition: DetId.h:17
edm::SortedCollection::begin
const_iterator begin() const
Definition: SortedCollection.h:262
EnergyCorrector.etas
etas
Definition: EnergyCorrector.py:45
HcalChannelStatus
Definition: HcalChannelStatus.h:13
HcalSeverityLevelComputer
Definition: HcalSeverityLevelComputer.h:24
LEDCalibrationChannels.depth
depth
Definition: LEDCalibrationChannels.py:65
HLT_2018_cff.eta2
eta2
Definition: HLT_2018_cff.py:8221
HcalSeverityLevelComputer::dropChannel
bool dropChannel(const uint32_t &mystatus) const
Definition: HcalSeverityLevelComputer.cc:395
HcalHFStatusBitFromRecHits::~HcalHFStatusBitFromRecHits
~HcalHFStatusBitFromRecHits()
Definition: HcalHFStatusBitFromRecHits.cc:29
particleFlowDisplacedVertex_cfi.ratio
ratio
Definition: particleFlowDisplacedVertex_cfi.py:93
HcalChannelStatus::getValue
uint32_t getValue() const
Definition: HcalChannelStatus.h:60
HcalHFStatusBitFromRecHits::long_thresholdET_
double long_thresholdET_
Definition: HcalHFStatusBitFromRecHits.h:71
LEDCalibrationChannels.ieta
ieta
Definition: LEDCalibrationChannels.py:63
HcalHFStatusBitFromRecHits::HcalHFStatusBitFromRecHits
HcalHFStatusBitFromRecHits()
Definition: HcalHFStatusBitFromRecHits.cc:9
edm::SortedCollection::iterator
std::vector< T >::iterator iterator
Definition: SortedCollection.h:81
edm::SortedCollection::end
const_iterator end() const
Definition: SortedCollection.h:267
HcalCondObjectContainerBase::topo
const HcalTopology * topo() const
Definition: HcalCondObjectContainer.h:22
HcalDetId
Definition: HcalDetId.h:12
HcalForward
Definition: HcalAssistant.h:36
HcalTopology.h
HcalHFStatusBitFromRecHits::short_HFlongshortratio_
double short_HFlongshortratio_
Definition: HcalHFStatusBitFromRecHits.h:73
DetId::rawId
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
HcalHFStatusBitFromRecHits::hfSetFlagFromRecHits
void hfSetFlagFromRecHits(HFRecHitCollection &rec, HcalChannelQuality *myqual, const HcalSeverityLevelComputer *mySeverity)
Definition: HcalHFStatusBitFromRecHits.cc:31
HcalHFStatusBitFromRecHits::short_thresholdEnergy_
double short_thresholdEnergy_
Definition: HcalHFStatusBitFromRecHits.h:75
HcalTopology::etaRange
std::pair< double, double > etaRange(HcalSubdetector subdet, int ieta) const
Definition: HcalTopology.cc:1124
HcalCaloFlagLabels::HFLongShort
Definition: HcalCaloFlagLabels.h:37
funct::abs
Abs< T >::type abs(const T &t)
Definition: Abs.h:22