CMS 3D CMS Logo

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