CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Member Functions | Private Attributes
HcalHF_S9S1algorithm Class Reference

#include <HcalHF_S9S1algorithm.h>

Public Member Functions

double bit ()
 
double CalcEnergyThreshold (double abs_energy, std::vector< double > params)
 
double CalcSlope (int abs_ieta, std::vector< double > params)
 
 HcalHF_S9S1algorithm ()
 
 HcalHF_S9S1algorithm (std::vector< double > short_optimumSlope, std::vector< double > short_Energy, std::vector< double > short_ET, std::vector< double > long_optimumSlope, std::vector< double > long_Energy, std::vector< double > long_ET, int flagsToSkip, bool isS8S1)
 
void HFSetFlagFromS9S1 (HFRecHit &hf, HFRecHitCollection &rec, HcalChannelQuality *myqual, const HcalSeverityLevelComputer *mySeverity)
 
 ~HcalHF_S9S1algorithm ()
 

Private Attributes

int flagsToSkip_
 
bool isS8S1_
 
std::vector< double > long_Energy_
 
std::vector< double > long_ET_
 
std::vector< double > LongEnergyThreshold
 
std::vector< double > LongETThreshold
 
std::vector< double > LongSlopes
 
std::vector< double > short_Energy_
 
std::vector< double > short_ET_
 
std::vector< double > ShortEnergyThreshold
 
std::vector< double > ShortETThreshold
 
std::vector< double > ShortSlopes
 

Detailed Description

Class evaluates the ratio |(L-S)/(L+S)| for a given cell, and flags the cell if the threshold exceeds a given maximum value R(Energy). Each cell must also pass ieta-dependent energy and ET cuts to be considered for flagging.

Date:
2010/03/24 20:48:18
Revision:
1.2
Author
J. Temple and D. Ferencek

Definition at line 24 of file HcalHF_S9S1algorithm.h.

Constructor & Destructor Documentation

HcalHF_S9S1algorithm::HcalHF_S9S1algorithm ( )

Constructors

Definition at line 13 of file HcalHF_S9S1algorithm.cc.

References flagsToSkip_, i, isS8S1_, LongEnergyThreshold, LongETThreshold, LongSlopes, ShortEnergyThreshold, ShortETThreshold, and ShortSlopes.

14 {
15  // Default settings: Energy > 50 GeV, slope = 0, ET = 0
16  std::vector<double> blank;
17  blank.clear();
18  blank.push_back(0);
19  std::vector<double> EnergyDefault;
20  EnergyDefault.clear();
21  EnergyDefault.push_back(50);
22 
23  // Thresholds only need to be computed once, not every event!
24  LongSlopes.clear();
25  ShortSlopes.clear();
26  for (int i=29;i<=41;++i)
27  {
28  LongSlopes.push_back(0);
29  ShortSlopes.push_back(0);
30  }
31  LongEnergyThreshold.clear();
32  LongETThreshold.clear();
33  ShortEnergyThreshold.clear();
34  ShortETThreshold.clear();
35  for (int i=29;i<=41;++i)
36  {
37  LongEnergyThreshold.push_back(EnergyDefault[0]);
38  LongETThreshold.push_back(blank[0]);
39  ShortEnergyThreshold.push_back(EnergyDefault[0]);
40  ShortETThreshold.push_back(blank[0]);
41  }
42  flagsToSkip_=0;
43  isS8S1_=false; // S8S1 is almost the same as S9S1
44 }
int i
Definition: DBlmapReader.cc:9
std::vector< double > LongSlopes
std::vector< double > LongEnergyThreshold
std::vector< double > LongETThreshold
std::vector< double > ShortSlopes
std::vector< double > ShortETThreshold
std::vector< double > ShortEnergyThreshold
HcalHF_S9S1algorithm::HcalHF_S9S1algorithm ( std::vector< double >  short_optimumSlope,
std::vector< double >  short_Energy,
std::vector< double >  short_ET,
std::vector< double >  long_optimumSlope,
std::vector< double >  long_Energy,
std::vector< double >  long_ET,
int  flagsToSkip,
bool  isS8S1 
)

Definition at line 47 of file HcalHF_S9S1algorithm.cc.

References flagsToSkip_, isS8S1_, LongEnergyThreshold, LongETThreshold, LongSlopes, ShortEnergyThreshold, ShortETThreshold, and ShortSlopes.

56 {
57  // Constructor in the case where all parameters are provided by the user
58 
59  // Thresholds only need to be computed once, not every event!
60 
61  LongSlopes=long_optimumSlope;
62  ShortSlopes=short_optimumSlope;
63 
64  while (LongSlopes.size()<13)
65  LongSlopes.push_back(0); // should be unnecessary, but include this protection to avoid crashes
66  while (ShortSlopes.size()<13)
67  ShortSlopes.push_back(0);
68 
69  // Get long, short energy thresholds (different threshold for each |ieta|)
70  LongEnergyThreshold.clear();
71  LongETThreshold.clear();
72  ShortEnergyThreshold.clear();
73  ShortETThreshold.clear();
74  LongEnergyThreshold=long_Energy;
75  LongETThreshold=long_ET;
76  ShortEnergyThreshold=short_Energy;
77  ShortETThreshold=short_ET;
78 
79  flagsToSkip_=flagsToSkip;
80  isS8S1_=isS8S1;
81 } // HcalHF_S9S1algorithm constructor with parameters
std::vector< double > LongSlopes
std::vector< double > LongEnergyThreshold
std::vector< double > LongETThreshold
std::vector< double > ShortSlopes
std::vector< double > ShortETThreshold
std::vector< double > ShortEnergyThreshold
HcalHF_S9S1algorithm::~HcalHF_S9S1algorithm ( )

Definition at line 83 of file HcalHF_S9S1algorithm.cc.

83 {}

Member Function Documentation

double HcalHF_S9S1algorithm::bit ( )
inline
double HcalHF_S9S1algorithm::CalcEnergyThreshold ( double  abs_energy,
std::vector< double >  params 
)

Definition at line 236 of file HcalHF_S9S1algorithm.cc.

References i, funct::pow(), and dtT0WireCalibration_cfg::threshold.

237 {
238  /* CalcEnergyThreshold calculates the polynomial [0]+[1]*x + [2]*x^2 + ....,
239  where x is an integer provided by the first argument (int abs_ieta),
240  and [0],[1],[2] is a vector of doubles provided by the second (std::vector<double> params).
241  The output of the polynomial calculation (threshold) is returned by the function.
242  */
243  double threshold=0;
244  for (std::vector<double>::size_type i=0;i<params.size();++i)
245  {
246  threshold+=params[i]*pow(abs_energy, (int)i);
247  }
248  return threshold;
249 } //double HcalHF_S9S1algorithm::CalcEnergyThreshold(double abs_energy,std::vector<double> params)
int i
Definition: DBlmapReader.cc:9
uint16_t size_type
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40
double HcalHF_S9S1algorithm::CalcSlope ( int  abs_ieta,
std::vector< double >  params 
)

Definition at line 217 of file HcalHF_S9S1algorithm.cc.

References i, funct::pow(), and dtT0WireCalibration_cfg::threshold.

218 {
219  /* CalcSlope calculates the polynomial [0]+[1]*x + [2]*x^2 + ....,
220  where x is an integer provided by the first argument (int abs_ieta),
221  and [0],[1],[2] is a vector of doubles provided by the second (std::vector<double> params).
222  The output of the polynomial calculation (threshold) is returned by the function.
223  This function should no longer be needed, since we pass slopes for all ietas into the function via the parameter set.
224  */
225  double threshold=0;
226  for (std::vector<double>::size_type i=0;i<params.size();++i)
227  {
228  threshold+=params[i]*pow(static_cast<double>(abs_ieta), (int)i);
229  }
230  return threshold;
231 } // HcalHF_S9S1algorithm::CalcRThreshold(int abs_ieta, std::vector<double> params)
int i
Definition: DBlmapReader.cc:9
uint16_t size_type
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40
void HcalHF_S9S1algorithm::HFSetFlagFromS9S1 ( HFRecHit hf,
HFRecHitCollection rec,
HcalChannelQuality myqual,
const HcalSeverityLevelComputer mySeverity 
)

Definition at line 86 of file HcalHF_S9S1algorithm.cc.

References abs, HcalDetId::depth(), edm::SortedCollection< T, SORT >::end(), CaloRecHit::energy(), relval_parameters_module::energy, ET, edm::SortedCollection< T, SORT >::find(), flagsToSkip_, HcalForward, HcalCaloFlagLabels::HFLongShort, HcalCaloFlagLabels::HFS8S1Ratio, i, HFRecHit::id(), HcalDetId::ieta(), HcalDetId::iphi(), isS8S1_, funct::log(), LongEnergyThreshold, LongETThreshold, LongSlopes, CaloRecHit::setFlagField(), ShortEnergyThreshold, ShortETThreshold, ShortSlopes, slope, and theHFEtaBounds.

Referenced by HcalHitReconstructor::produce().

91 {
92  int ieta=hf.id().ieta(); // get coordinates of rechit being checked
93  int depth=hf.id().depth();
94  int iphi=hf.id().iphi();
95  double fEta = 0.5*(theHFEtaBounds[abs(ieta)-29] + theHFEtaBounds[abs(ieta)-28]); // calculate eta as average of eta values at ieta boundaries
96  double energy=hf.energy();
97  double ET = energy/fabs(cosh(fEta));
98 
99  // Step 1: Check eta-dependent energy and ET thresholds -- same as PET algorithm
100  double ETthresh=0, Energythresh=0; // set ET, energy thresholds
101  if (depth==1) // set thresholds for long fibers
102  {
103  Energythresh = LongEnergyThreshold[abs(ieta)-29];
104  ETthresh = LongETThreshold[abs(ieta)-29];
105  }
106  else if (depth==2) // short fibers
107  {
108  Energythresh = ShortEnergyThreshold[abs(ieta)-29];
109  ETthresh = ShortETThreshold[abs(ieta)-29];
110  }
111  if (energy<Energythresh || ET < ETthresh)
112  return;
113 
114  // Step 1A:
115  // Check that EL<ES when evaluating short fibers (S8S1 check only)
116  if (depth==2 && abs(ieta)>29 && isS8S1_)
117  {
118  double EL=0;
119  // look for long partner
120  HcalDetId neighbor(HcalForward, ieta,iphi,1);
121  HFRecHitCollection::const_iterator neigh=rec.find(neighbor);
122  if (neigh!=rec.end())
123  EL=neigh->energy();
124 
125  if (EL>=energy)
126  return;
127  }
128 
129  // Step 2: Find all neighbors, and calculate S9/S1
130  double S9S1=0;
131  int testphi=-99;
132 
133  // Part A: Check fixed iphi, and vary ieta
134  for (int d=1;d<=2;++d) // depth loop
135  {
136  for (int i=ieta-1;i<=ieta+1;++i) // ieta loop
137  {
138  testphi=iphi;
139  // Special case when ieta=39, since ieta=40 only has phi values at 3,7,11,...
140  // phi=3 covers 3,4,5,6
141  if (abs(ieta)==39 && abs(i)>39 && testphi%4==1)
142  testphi-=2;
143  while (testphi<0) testphi+=72;
144  if (i==ieta)
145  if (d==depth || isS8S1_==true) continue; // don't add the cell itself; don't count neighbor in same ieta-phi if S8S1 test enabled
146 
147  // Look to see if neighbor is in rechit collection
148  HcalDetId neighbor(HcalForward, i,testphi,d);
149  HFRecHitCollection::const_iterator neigh=rec.find(neighbor);
150  // require that neighbor exists, and that it doesn't have a prior flag already set
151  if (neigh!=rec.end() && ((flagsToSkip_&neigh->flags())==0))
152  S9S1+=neigh->energy();
153  }
154  }
155 
156  // Part B: Fix ieta, and loop over iphi. A bit more tricky, because of iphi wraparound and different segmentation at 40, 41
157 
158  int phiseg=2; // 10 degree segmentation for most of HF (1 iphi unit = 5 degrees)
159  if (abs(ieta)>39) phiseg=4; // 20 degree segmentation for |ieta|>39
160  for (int d=1;d<=2;++d)
161  {
162  for (int i=iphi-phiseg;i<=iphi+phiseg;i+=phiseg)
163  {
164  if (i==iphi) continue; // don't add the cell itself, or its depthwise partner (which is already counted above)
165  testphi=i;
166  // Our own modular function, since default produces results -1%72 = -1
167  while (testphi<0) testphi+=72;
168  while (testphi>72) testphi-=72;
169  // Look to see if neighbor is in rechit collection
170  HcalDetId neighbor(HcalForward, ieta,testphi,d);
171  HFRecHitCollection::const_iterator neigh=rec.find(neighbor);
172  if (neigh!=rec.end() && ((flagsToSkip_&neigh->flags())==0))
173  S9S1+=neigh->energy();
174  }
175  }
176 
177  if (abs(ieta)==40) // add extra cells for 39/40 boundary due to increased phi size at ieta=40.
178  {
179  for (int d=1;d<=2;++d) // add cells from both depths!
180  {
181  HcalDetId neighbor(HcalForward, 39*abs(ieta)/ieta,(iphi+2)%72,d);
182  HFRecHitCollection::const_iterator neigh=rec.find(neighbor);
183  if (neigh!=rec.end() && ((flagsToSkip_&neigh->flags())==0))
184  S9S1+=neigh->energy();
185  }
186  }
187 
188  // So far, S9S1 is the sum of the neighbors; divide to form ratio
189  S9S1/=energy;
190 
191  // Now compare to threshold
192  double slope=0;
193  if (depth==1) slope = LongSlopes[abs(ieta)-29];
194  else if (depth==2) slope=ShortSlopes[abs(ieta)-29];
195  double intercept = 0;
196  if (depth==1) intercept = LongEnergyThreshold[abs(ieta)-29];
197  else if (depth==2) intercept = ShortEnergyThreshold[abs(ieta)-29];
198 
199  // S9S1 cut has the form [0] + [1]*log[E]; S9S1 value should be above this line
200  double S9S1cut = 0;
201  // Protection in case intercept or energy are ever less than 0. Do we have some other default value of S9S1cut we'd like touse in this case?
202  if (intercept>0 && energy>0)
203  S9S1cut=-1.*slope*log(intercept) + slope*log(energy);
204  if (S9S1<S9S1cut)
205  {
206  // Only set HFS8S1Ratio if S8/S1 ratio test fails
207  if (isS8S1_==true)
209  // *Always* set the HFLongShort bit if either S8S1 or S9S1 fail
211  }
212  return;
213 } // void HcalHF_S9S1algorithm::HFSetFlagFromS9S1
int i
Definition: DBlmapReader.cc:9
std::vector< double > LongSlopes
static const double slope[3]
void setFlagField(uint32_t value, int base, int width=1)
Definition: CaloRecHit.cc:22
std::vector< T >::const_iterator const_iterator
std::vector< double > LongEnergyThreshold
#define abs(x)
Definition: mlp_lapack.h:159
std::vector< double > LongETThreshold
int depth() const
get the tower depth
Definition: HcalDetId.h:42
std::vector< double > ShortSlopes
float energy() const
Definition: CaloRecHit.h:19
int ieta() const
get the cell ieta
Definition: HcalDetId.h:38
const_iterator end() const
int iphi() const
get the cell iphi
Definition: HcalDetId.h:40
static const double theHFEtaBounds[]
Log< T >::type log(const T &t)
Definition: Log.h:22
iterator find(key_type k)
std::vector< double > ShortETThreshold
#define ET
HcalDetId id() const
get the id
Definition: HFRecHit.h:21
std::vector< double > ShortEnergyThreshold

Member Data Documentation

int HcalHF_S9S1algorithm::flagsToSkip_
private

Definition at line 63 of file HcalHF_S9S1algorithm.h.

Referenced by HcalHF_S9S1algorithm(), and HFSetFlagFromS9S1().

bool HcalHF_S9S1algorithm::isS8S1_
private

Definition at line 64 of file HcalHF_S9S1algorithm.h.

Referenced by HcalHF_S9S1algorithm(), and HFSetFlagFromS9S1().

std::vector<double> HcalHF_S9S1algorithm::long_Energy_
private

Definition at line 55 of file HcalHF_S9S1algorithm.h.

std::vector<double> HcalHF_S9S1algorithm::long_ET_
private

Definition at line 54 of file HcalHF_S9S1algorithm.h.

std::vector<double> HcalHF_S9S1algorithm::LongEnergyThreshold
private

Definition at line 59 of file HcalHF_S9S1algorithm.h.

Referenced by HcalHF_S9S1algorithm(), and HFSetFlagFromS9S1().

std::vector<double> HcalHF_S9S1algorithm::LongETThreshold
private

Definition at line 61 of file HcalHF_S9S1algorithm.h.

Referenced by HcalHF_S9S1algorithm(), and HFSetFlagFromS9S1().

std::vector<double> HcalHF_S9S1algorithm::LongSlopes
private

Definition at line 57 of file HcalHF_S9S1algorithm.h.

Referenced by HcalHF_S9S1algorithm(), and HFSetFlagFromS9S1().

std::vector<double> HcalHF_S9S1algorithm::short_Energy_
private

Definition at line 53 of file HcalHF_S9S1algorithm.h.

std::vector<double> HcalHF_S9S1algorithm::short_ET_
private

Definition at line 52 of file HcalHF_S9S1algorithm.h.

std::vector<double> HcalHF_S9S1algorithm::ShortEnergyThreshold
private

Definition at line 60 of file HcalHF_S9S1algorithm.h.

Referenced by HcalHF_S9S1algorithm(), and HFSetFlagFromS9S1().

std::vector<double> HcalHF_S9S1algorithm::ShortETThreshold
private

Definition at line 62 of file HcalHF_S9S1algorithm.h.

Referenced by HcalHF_S9S1algorithm(), and HFSetFlagFromS9S1().

std::vector<double> HcalHF_S9S1algorithm::ShortSlopes
private

Definition at line 58 of file HcalHF_S9S1algorithm.h.

Referenced by HcalHF_S9S1algorithm(), and HFSetFlagFromS9S1().