CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
HBHEStatusBitSetter.cc
Go to the documentation of this file.
1 #include <cassert>
4 
5 HBHEStatusBitSetter::HBHEStatusBitSetter() : frontEndMap_(nullptr) {
6  nominalPedestal_ = 3.0;
7  hitEnergyMinimum_ = 2.0;
9 }
10 
12  double hitEnergyMinimum,
13  int hitMultiplicityThreshold,
14  const std::vector<edm::ParameterSet>& pulseShapeParameterSets)
15  : hitEnergyMinimum_(hitEnergyMinimum),
16  hitMultiplicityThreshold_(hitMultiplicityThreshold),
17  nominalPedestal_(nominalPedestal),
18  frontEndMap_(nullptr) {
19  const unsigned sz = pulseShapeParameterSets.size();
20  pulseShapeParameters_.reserve(sz);
21  for (unsigned iPSet = 0; iPSet < sz; iPSet++) {
22  const edm::ParameterSet& pset = pulseShapeParameterSets[iPSet];
23  const std::vector<double>& params = pset.getParameter<std::vector<double> >("pulseShapeParameters");
24  pulseShapeParameters_.push_back(params);
25  }
26 }
27 
29 
31  frontEndMap_ = m;
32  hpdMultiplicity_.clear();
33  if (frontEndMap_) {
34  const int sz = frontEndMap_->maxRMIndex();
35  hpdMultiplicity_.reserve(sz);
36  for (int iRm = 0; iRm < sz; iRm++) {
37  hpdMultiplicity_.push_back(0);
38  }
39  }
40 }
41 
43  const unsigned sz = hpdMultiplicity_.size();
44  for (unsigned i = 0; i < sz; i++)
45  hpdMultiplicity_[i] = 0;
46 }
47 
49  if (frontEndMap_ == nullptr) {
50  edm::LogError("HBHEStatusBitSetter") << "No HcalFrontEndMap in rememberHit";
51  return;
52  }
53  //increment hit multiplicity
54  if (hbhe.energy() > hitEnergyMinimum_) {
55  const int index = frontEndMap_->lookupRMIndex(hbhe.detid());
56  hpdMultiplicity_.at(index)++;
57  }
58 }
59 
61  const HBHEDataFrame& digi,
62  const HcalCoder& coder,
63  const HcalCalibrations& calib) {
64  if (frontEndMap_ == nullptr) {
65  edm::LogError("HBHEStatusBitSetter") << "No HcalFrontEndMap in SetFlagsFromDigi";
66  return;
67  }
68  rememberHit(hbhe);
69 
70  //set pulse shape bits
71  // Shuichi's algorithm uses the "correct" charge & pedestals, while Ted's uses "nominal" values.
72  // Perhaps we should correct Ted's algorithm in the future, though that will mean re-tuning thresholds for his cuts. -- Jeff, 28 May 2010
73  //double shuichi_charge_total=0.0;
74  double nominal_charge_total = 0.0;
75  double charge_max3 = -100.0;
76  double charge_late3 = -100.0;
77  unsigned int slice_max3 = 0;
78  unsigned int size = digi.size();
79 
80  CaloSamples tool;
81  coder.adc2fC(digi, tool);
82 
83  // int capid=-1;
84  for (unsigned int iSlice = 0; iSlice < size; iSlice++) {
85  // capid = digi.sample(iSlice).capid();
86  //shuichi_charge_total+=tool[iSlice]-calib.pedestal(capid);
87  nominal_charge_total += digi[iSlice].nominal_fC() - nominalPedestal_;
88 
89  if (iSlice < 2)
90  continue;
91  // digi[i].nominal_fC() could be replaced by tool[iSlice], I think... -- Jeff, 11 April 2011
92  double qsum3 = digi[iSlice].nominal_fC() + digi[iSlice - 1].nominal_fC() + digi[iSlice - 2].nominal_fC() -
93  3 * nominalPedestal_;
94  if (qsum3 > charge_max3) {
95  charge_max3 = qsum3;
96  slice_max3 = iSlice;
97  }
98  }
99 
100  if ((4 + slice_max3) > size)
101  return;
102  charge_late3 = digi[slice_max3 + 1].nominal_fC() + digi[slice_max3 + 2].nominal_fC() +
103  digi[slice_max3 + 3].nominal_fC() - 3 * nominalPedestal_;
104 
105  for (unsigned int iCut = 0; iCut < pulseShapeParameters_.size(); iCut++) {
106  if (pulseShapeParameters_[iCut].size() != 6)
107  continue;
108  if (nominal_charge_total < pulseShapeParameters_[iCut].at(0) ||
109  nominal_charge_total >= pulseShapeParameters_[iCut].at(1))
110  continue;
111  if (charge_late3 < (pulseShapeParameters_[iCut].at(2) + nominal_charge_total * pulseShapeParameters_[iCut].at(3)))
112  continue;
113  if (charge_late3 >= (pulseShapeParameters_[iCut].at(4) + nominal_charge_total * pulseShapeParameters_[iCut].at(5)))
114  continue;
116  return;
117  }
118 }
119 
121  if (frontEndMap_ == nullptr) {
122  edm::LogError("HBHEStatusBitSetter") << "No HcalFrontEndMap in SetFlagsFromRecHits";
123  return;
124  }
125 
126  for (HBHERecHitCollection::iterator iHBHE = rec.begin(); iHBHE != rec.end(); ++iHBHE) {
127  const int index = frontEndMap_->lookupRMIndex(iHBHE->detid());
129  continue;
130  iHBHE->setFlagField(1, HcalCaloFlagLabels::HBHEHpdHitMultiplicity);
131  }
132 }
constexpr float energy() const
Definition: CaloRecHit.h:29
constexpr const DetId & detid() const
Definition: CaloRecHit.h:33
std::vector< int > hpdMultiplicity_
const int lookupRMIndex(DetId fId) const
Log< level::Error, false > LogError
constexpr void setFlagField(uint32_t value, int base, int width=1)
Definition: CaloRecHit.h:36
void SetFrontEndMap(const HcalFrontEndMap *m)
const HcalFrontEndMap * frontEndMap_
void rememberHit(const HBHERecHit &hbhe)
std::vector< T >::iterator iterator
constexpr int size() const
total number of samples in the digi
Definition: HBHEDataFrame.h:27
const_iterator end() const
std::vector< std::vector< double > > pulseShapeParameters_
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
void SetFlagsFromDigi(HBHERecHit &hbhe, const HBHEDataFrame &digi, const HcalCoder &coder, const HcalCalibrations &calib)
virtual void adc2fC(const HBHEDataFrame &df, CaloSamples &lf) const =0
const int maxRMIndex() const
tuple size
Write out results.
void SetFlagsFromRecHits(HBHERecHitCollection &rec)
const_iterator begin() const