CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
HFRecoEcalCandidateAlgo.cc
Go to the documentation of this file.
1 
9 //#includes
13 #include "CLHEP/Vector/LorentzVector.h"
14 #include <iostream>
17 #include "HFEGammaSLCorrector.h"
18 
19 using namespace std;
20 using namespace reco;
21 
22 HFRecoEcalCandidateAlgo::HFRecoEcalCandidateAlgo(bool correct,double e9e25Cut,double intercept2DCut,double intercept2DSlope,
23  const std::vector<double>& e1e9Cut,
24  const std::vector<double>& eCOREe9Cut,
25  const std::vector<double>& eSeLCut,
26  const reco::HFValueStruct hfvv
27 ) :
28 
29  m_correct(correct),
30  m_e9e25Cut(e9e25Cut),
31  m_intercept2DCut(intercept2DCut),
32  m_intercept2DSlope(intercept2DSlope),
33  m_e1e9Cuthi(e1e9Cut[1]),
34  m_eCOREe9Cuthi(eCOREe9Cut[1]),
35  m_eSeLCuthi(eSeLCut[1]),
36  m_e1e9Cutlo(e1e9Cut[0]),
37  m_eCOREe9Cutlo(eCOREe9Cut[0]),
38  m_eSeLCutlo(eSeLCut[0]),
39  m_era(4),
40  m_hfvv(hfvv)
41 {
42 
43 }
44 
46  double corEta=original.eta();
47  //piece-wise log energy correction to eta
48  double logel=log(shape.eLong3x3()/100.0);
49  double lowC= 0.00911;
50  double hiC = 0.0193;
51  double logSlope = 0.0146;
52  double logIntercept=-0.00988;
53  double sgn=(original.eta()>0)?(1.0):(-1.0);
54  if(logel<=1.25)corEta+=(lowC)*sgn;
55  else if((logel>1.25)&&(logel<=2))corEta+=(logIntercept+logSlope*logel)*sgn;
56  else if(logel>2)corEta+=hiC*sgn;
57  //poly-3 cell eta correction to eta (de)
58  double p0= 0.0125;
59  double p1=-0.0475;
60  double p2= 0.0732;
61  double p3=-0.0506;
62  double de= sgn*(p0+(p1*(shape.CellEta()))+(p2*(shape.CellEta()*shape.CellEta()))+(p3*(shape.CellEta()*shape.CellEta()*shape.CellEta())));
63  corEta+=de;
64 
65  double corPhi=original.phi();
66  //poly-3 cell phi correction to phi (dp)
67  p0= 0.0115;
68  p1=-0.0394;
69  p2= 0.0486;
70  p3=-0.0335;
71  double dp =p0+(p1*(shape.CellPhi()))+(p2*(shape.CellPhi()*shape.CellPhi()))+(p3*(shape.CellPhi()*shape.CellPhi()*shape.CellPhi()));
72  corPhi+=dp;
73 
74 
75  double corEnergy= original.energy();
76  //energy corrections
77  //flat correction for using only long fibers
78  double energyCorrect=0.7397;
79  corEnergy= corEnergy/energyCorrect;
80  //corection based on ieta for pileup and general
81  //find ieta
82  int ieta=0;
83  double etabounds[30]={
84  2.846,2.957,3.132,3.307,3.482,
85  3.657,3.833,4.006,4.184,4.357,
86  4.532,4.709,4.882,5.184};
87  for (int kk=0;kk<=12;kk++){
88  if((fabs(corEta) < etabounds[kk+1])&&(fabs(corEta) > etabounds[kk])){
89  ieta = (corEta > 0)?(kk+29):(-kk-29);
90  }
91  }
92  //check if ieta is in bounds, should be [-41, -29] U [29, 41]
93  if (ieta != 0) corEnergy=(m_hfvv.PUSlope(ieta)*1.0*(nvtx-1)+m_hfvv.PUIntercept(ieta)*1.0)*corEnergy*1.0*m_hfvv.EnCor(ieta);
94 
95  //re-calculate the energy vector
96  double corPx=corEnergy*cos(corPhi)/cosh(corEta);
97  double corPy=corEnergy*sin(corPhi)/cosh(corEta);
98  double corPz=corEnergy*tanh(corEta);
99 
100  //make the candidate
101  RecoEcalCandidate corCand(0,
102  math::XYZTLorentzVector(corPx,corPy,corPz,corEnergy),
103  math::XYZPoint(0,0,0));
104 
105  return corCand;
106 }
107 
109  const HFEMClusterShapeAssociationCollection& AssocShapes,
110  RecoEcalCandidateCollection& RecoECand,
111  int nvtx) {
112 
113 
114 
115  //get super's and cluster shapes and associations
116  for (unsigned int i=0; i < SuperClusters->size(); ++i) {
117  const SuperCluster& supClus=(*SuperClusters)[i];
118  reco::SuperClusterRef theClusRef=edm::Ref<SuperClusterCollection>(SuperClusters,i);
119  const HFEMClusterShapeRef clusShapeRef=AssocShapes.find(theClusRef)->val;
120  const HFEMClusterShape& clusShape=*clusShapeRef;
121 
122  // basic candidate
123  double px=supClus.energy()*cos(supClus.phi())/cosh(supClus.eta());
124  double py=supClus.energy()*sin(supClus.phi())/cosh(supClus.eta());
125  double pz=supClus.energy()*tanh(supClus.eta());
126  RecoEcalCandidate theCand(0,
127  math::XYZTLorentzVector(px,py,pz,supClus.energy()),
128  math::XYZPoint(0,0,0));
129 
130  // correct it?
131  if (m_correct)
132  theCand=correctEPosition(supClus,clusShape,nvtx);
133 
134  double e9e25=clusShape.eLong3x3()/clusShape.eLong5x5();
135  double e1e9=clusShape.eLong1x1()/clusShape.eLong3x3();
136  double eSeL=hf_egamma::eSeLCorrected(clusShape.eShort3x3(),clusShape.eLong3x3(),4);
137  double var2d=(clusShape.eCOREe9()-(eSeL*m_intercept2DSlope));
138 
139  bool isAcceptable=true;
140  isAcceptable=isAcceptable && (e9e25> m_e9e25Cut);
141  isAcceptable=isAcceptable && (var2d > m_intercept2DCut);
142  isAcceptable=isAcceptable && ((e1e9< m_e1e9Cuthi)&&(e1e9> m_e1e9Cutlo));
143  isAcceptable=isAcceptable && ((clusShape.eCOREe9()< m_eCOREe9Cuthi)&&(clusShape.eCOREe9()> m_eCOREe9Cutlo));
144  isAcceptable=isAcceptable && ((clusShape.eSeL()<m_eSeLCuthi)&&(clusShape.eSeL()> m_eSeLCutlo));
145 
146 
147  if(isAcceptable){
148 
149  theCand.setSuperCluster(theClusRef);
150  RecoECand.push_back(theCand);
151  }
152  }
153 }
154 
int i
Definition: DBlmapReader.cc:9
float sgn(float val)
Definition: FWPFMaths.cc:9
double eLong5x5() const
double eLong1x1() const
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
list original
Definition: definitions.py:60
const_iterator find(const key_type &k) const
find element with specified reference key
double CellPhi() const
double PUIntercept(int ieta) const
double eta() const
pseudorapidity of cluster centroid
Definition: CaloCluster.h:160
double EnCor(int ieta) const
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:30
double eShort3x3() const
double eLong3x3() const
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
double energy() const
cluster energy
Definition: CaloCluster.h:120
double p2[4]
Definition: TauolaWrapper.h:90
double PUSlope(int ieta) const
void produce(const edm::Handle< reco::SuperClusterCollection > &SuperClusters, const reco::HFEMClusterShapeAssociationCollection &AssocShapes, reco::RecoEcalCandidateCollection &RecoECand, int nvtx)
auto dp
Definition: deltaR.h:24
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:13
double eSeLCorrected(double es, double el, double pc, double px, double py)
reco::RecoEcalCandidate correctEPosition(const reco::SuperCluster &original, const reco::HFEMClusterShape &shape, int nvtx)
std::vector< RecoEcalCandidate > RecoEcalCandidateCollection
collectin of RecoEcalCandidate objects
double p1[4]
Definition: TauolaWrapper.h:89
double phi() const
azimuthal angle of cluster centroid
Definition: CaloCluster.h:163
double CellEta() const
HFRecoEcalCandidateAlgo(bool correct, double e9e25Cut, double intercept2DCut, double intercept2DSlope, const std::vector< double > &e1e9Cut, const std::vector< double > &eCOREe9Cut, const std::vector< double > &eSeLCut, const reco::HFValueStruct hfvv)
double p3[4]
Definition: TauolaWrapper.h:91