CMS 3D CMS Logo

HBHETimeProfileStatusBitSetter.cc
Go to the documentation of this file.
4 
5 #include <algorithm> // for "max"
6 #include <cmath>
7 #include <TH1.h>
8 #include <TF1.h>
9 
11  // use simple values in default constructor
12  R1Min_ = 0.1;
13  R1Max_ = 0.7;
14  R2Min_ = 0.2;
15  R2Max_ = 0.5;
16  FracLeaderMin_ = 0.4;
17  FracLeaderMax_ = 0.7;
18  SlopeMin_ = -1.5;
19  SlopeMax_ = -0.6;
20  OuterMin_ = 0.9;
21  OuterMax_ = 1.0;
22  EnergyThreshold_ = 30;
23 }
24 
26  double R1Max,
27  double R2Min,
28  double R2Max,
29  double FracLeaderMin,
30  double FracLeaderMax,
31  double SlopeMin,
32  double SlopeMax,
33  double OuterMin,
34  double OuterMax,
35  double EnergyThreshold) {
36  R1Min_ = R1Min;
37  R1Max_ = R1Max;
38  R2Min_ = R2Min;
39  R2Max_ = R2Max;
40  FracLeaderMin_ = FracLeaderMin;
41  FracLeaderMax_ = FracLeaderMax;
42  SlopeMin_ = SlopeMin;
43  SlopeMax_ = SlopeMax;
44  OuterMin_ = OuterMin;
45  OuterMax_ = OuterMax;
47 }
48 
50 
51 namespace {
52  bool compareDigiEnergy(const HBHEDataFrame& x, const HBHEDataFrame& y) {
53  double totalX = 0;
54  double totalY = 0;
55  for (int i = 0; i != x.size(); totalX += x.sample(i++).nominal_fC())
56  ;
57  for (int i = 0; i != y.size(); totalY += y.sample(i++).nominal_fC())
58  ;
59 
60  return totalX > totalY;
61  }
62 } // namespace
63 
65  const std::vector<HBHEDataFrame>& udigi,
66  const std::vector<int>& RecHitIndex) {
67  bool Bits[4] = {false, false, false, false};
68  std::vector<HBHEDataFrame> digi(udigi);
69  std::sort(digi.begin(), digi.end(), compareDigiEnergy); // sort digis according to energies
70  std::vector<double> PulseShape; // store fC values for each time slice
71  int DigiSize = 0;
72  // int LeadingEta=0;
73  int LeadingPhi = 0;
74  bool FoundLeadingChannel = false;
75  for (std::vector<HBHEDataFrame>::const_iterator itDigi = digi.begin(); itDigi != digi.end(); itDigi++) {
76  if (!FoundLeadingChannel) {
77  // LeadingEta = itDigi->id().ieta();
78  LeadingPhi = itDigi->id().iphi();
79  DigiSize = (*itDigi).size();
80  PulseShape.clear();
81  PulseShape.resize(DigiSize, 0);
82  FoundLeadingChannel = true;
83  }
84  if (abs(LeadingPhi - itDigi->id().iphi()) < 2)
85  for (int i = 0; i != DigiSize; i++)
86  PulseShape[i] += itDigi->sample(i).nominal_fC();
87  }
88 
89  if (!RecHitIndex.empty()) {
90  double FracInLeader = -1;
91  //double Slope=0; // not currently used
92  double R1 = -1;
93  double R2 = -1;
94  double OuterEnergy = -1;
95  double TotalEnergy = 0;
96  int PeakPosition = 0;
97 
98  for (int i = 0; i != DigiSize; i++) {
99  if (PulseShape[i] > PulseShape[PeakPosition])
100  PeakPosition = i;
101  TotalEnergy += PulseShape[i];
102  }
103 
104  if (PeakPosition < (DigiSize - 2)) {
105  R1 = PulseShape[PeakPosition + 1] / PulseShape[PeakPosition];
106  R2 = PulseShape[PeakPosition + 2] / PulseShape[PeakPosition + 1];
107  }
108 
109  FracInLeader = PulseShape[PeakPosition] / TotalEnergy;
110 
111  if ((PeakPosition > 0) && (PeakPosition < (DigiSize - 2))) {
112  OuterEnergy = 1. - ((PulseShape[PeakPosition - 1] + PulseShape[PeakPosition] + PulseShape[PeakPosition + 1] +
113  PulseShape[PeakPosition + 2]) /
114  TotalEnergy);
115  }
116 
117  /* TH1D * HistForFit = new TH1D("HistForFit","HistForFit",DigiSize,0,DigiSize);
118  for(int i=0; i!=DigiSize; i++)
119  {
120  HistForFit->Fill(i,PulseShape[i]);
121  HistForFit->Fit("expo","WWQ","",PeakPosition, DigiSize-1);
122  TF1 * Fit = HistForFit->GetFunction("expo");
123  Slope = Fit->GetParameter("Slope");
124  }
125  delete HistForFit;
126  */
127  if (R1 != -1 && R2 != -1)
128  Bits[0] = (R1Min_ > R1) || (R1Max_ < R1) || (R2Min_ > R2) || (R2Max_ < R2);
129  if (FracInLeader != -1)
130  Bits[1] = (FracInLeader < FracLeaderMin_) || (FracInLeader > FracLeaderMax_);
131  if (OuterEnergy != -1)
132  Bits[2] = (OuterEnergy < OuterMin_) || (OuterEnergy > OuterMax_);
133  // Bits[3] = (SlopeMin_ > Slope) || (SlopeMax_ < Slope);
134  Bits[3] = false;
135 
136  } // if (RecHitIndex.size()>0)
137  else {
138  Bits[0] = false;
139  Bits[1] = false;
140  Bits[2] = false;
141  Bits[3] = true;
142 
143  } // (RecHitIndex.size()==0; no need to set Bit3 true?)
144 
145  for (unsigned int i = 0; i != RecHitIndex.size(); i++) {
146  // Write calculated bit values starting from position FirstBit
147  (*hbhe)[RecHitIndex.at(i)].setFlagField(Bits[0], HcalCaloFlagLabels::HSCP_R1R2);
148  (*hbhe)[RecHitIndex.at(i)].setFlagField(Bits[1], HcalCaloFlagLabels::HSCP_FracLeader);
149  (*hbhe)[RecHitIndex.at(i)].setFlagField(Bits[2], HcalCaloFlagLabels::HSCP_OuterEnergy);
150  (*hbhe)[RecHitIndex.at(i)].setFlagField(Bits[3], HcalCaloFlagLabels::HSCP_ExpFit);
151  }
152 }
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
void hbheSetTimeFlagsFromDigi(HBHERecHitCollection *, const std::vector< HBHEDataFrame > &, const std::vector< int > &)
float x