CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
HBHEStatusBitSetter.cc
Go to the documentation of this file.
1 #include <cassert>
4 
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) continue;
90  // digi[i].nominal_fC() could be replaced by tool[iSlice], I think... -- Jeff, 11 April 2011
91  double qsum3=digi[iSlice].nominal_fC() + digi[iSlice-1].nominal_fC() + digi[iSlice-2].nominal_fC() - 3*nominalPedestal_;
92  if (qsum3>charge_max3) {
93  charge_max3=qsum3;
94  slice_max3=iSlice;
95  }
96  }
97 
98  if ((4+slice_max3)>size) return;
99  charge_late3=digi[slice_max3+1].nominal_fC() + digi[slice_max3+2].nominal_fC() + digi[slice_max3+3].nominal_fC() - 3*nominalPedestal_;
100 
101  for (unsigned int iCut=0;iCut<pulseShapeParameters_.size();iCut++) {
102  if (pulseShapeParameters_[iCut].size()!=6) continue;
103  if (nominal_charge_total<pulseShapeParameters_[iCut].at(0) || nominal_charge_total>=pulseShapeParameters_[iCut].at(1)) continue;
104  if ( charge_late3< (pulseShapeParameters_[iCut].at(2)+nominal_charge_total*pulseShapeParameters_[iCut].at(3)) ) continue;
105  if ( charge_late3>=(pulseShapeParameters_[iCut].at(4)+nominal_charge_total*pulseShapeParameters_[iCut].at(5)) ) continue;
107  return;
108  }
109 
110 }
111 
112 
114 
115  if (frontEndMap_==nullptr) {
116  edm::LogError("HBHEStatusBitSetter") << "No HcalFrontEndMap in SetFlagsFromRecHits";
117  return;
118  }
119 
120  for (HBHERecHitCollection::iterator iHBHE=rec.begin();iHBHE!=rec.end();++iHBHE) {
121  const int index=frontEndMap_->lookupRMIndex(iHBHE->detid());
122  if (hpdMultiplicity_.at(index)<hitMultiplicityThreshold_) continue;
123  iHBHE->setFlagField(1,HcalCaloFlagLabels::HBHEHpdHitMultiplicity);
124  }
125 }
T getParameter(std::string const &) const
int i
Definition: DBlmapReader.cc:9
const DetId & detid() const
Definition: CaloRecHit.h:21
int size() const
total number of samples in the digi
Definition: HBHEDataFrame.h:26
std::vector< int > hpdMultiplicity_
void setFlagField(uint32_t value, int base, int width=1)
Definition: CaloRecHit.cc:20
const int lookupRMIndex(DetId fId) const
#define nullptr
void SetFrontEndMap(const HcalFrontEndMap *m)
const HcalFrontEndMap * frontEndMap_
void rememberHit(const HBHERecHit &hbhe)
MVATrainerComputer * calib
Definition: MVATrainer.cc:64
float energy() const
Definition: CaloRecHit.h:17
std::vector< HBHERecHit >::iterator iterator
const_iterator end() const
void SetFlagsFromDigi(HBHERecHit &hbhe, const HBHEDataFrame &digi, const HcalCoder &coder, const HcalCalibrations &calib)
std::vector< std::vector< double > > pulseShapeParameters_
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