CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
EGammaCutBasedEleId.cc
Go to the documentation of this file.
4 
5 #include <algorithm>
6 
7 #ifndef STANDALONEID
8 
10  const reco::GsfElectron &ele,
12  const reco::BeamSpot &beamspot,
14  const double &iso_ch,
15  const double &iso_em,
16  const double &iso_nh,
17  const double &rho,
19 {
20 
21  // get the mask
22  unsigned int mask = TestWP(workingPoint, ele, conversions, beamspot, vtxs, iso_ch, iso_em, iso_nh, rho, EAtarget);
23 
24  // check if the desired WP passed
25  if ((mask & PassAll) == PassAll) return true;
26  return false;
27 }
28 
30  const reco::GsfElectronRef &ele,
32  const reco::BeamSpot &beamspot,
34  const double &iso_ch,
35  const double &iso_em,
36  const double &iso_nh,
37  const double &rho,
39 {
40  return PassWP(workingPoint,*ele,conversions,beamspot,vtxs,iso_ch,iso_em,iso_nh,rho, EAtarget);
41 }
42 
44 {
45 
46  // get the variables
47  bool isEB = ele.isEB() ? true : false;
48  float pt = ele.pt();
49  float dEtaIn = ele.deltaEtaSuperClusterTrackAtVtx();
50  float dPhiIn = ele.deltaPhiSuperClusterTrackAtVtx();
51  float sigmaIEtaIEta = ele.sigmaIetaIeta();
52  float hoe = ele.hadronicOverEm();
53  float trackIso = ele.dr03TkSumPt();
54  float ecalIso = ele.dr03EcalRecHitSumEt();
55  float hcalIso = ele.dr03HcalTowerSumEt();
56 
57  // test the trigger cuts
58  return EgammaCutBasedEleId::PassTriggerCuts(triggerWorkingPoint, isEB, pt, dEtaIn, dPhiIn, sigmaIEtaIEta, hoe, trackIso, ecalIso, hcalIso);
59 
60 }
61 
63 {
64  return EgammaCutBasedEleId::PassTriggerCuts(triggerWorkingPoint, *ele);
65 }
66 
68 {
69 
70  // get the variables
71  float eta = ele.superCluster()->eta();
72  float eopin = ele.eSuperClusterOverP();
73  float fbrem = ele.fbrem();
74 
75  // test the eop/fbrem cuts
76  return EgammaCutBasedEleId::PassEoverPCuts(eta, eopin, fbrem);
77 
78 }
79 
81  return PassEoverPCuts(*ele);
82 }
83 
84 
85 unsigned int EgammaCutBasedEleId::TestWP(WorkingPoint workingPoint,
86  const reco::GsfElectron &ele,
88  const reco::BeamSpot &beamspot,
90  const double &iso_ch,
91  const double &iso_em,
92  const double &iso_nh,
93  const double &rho,
95 {
96 
97  // get the ID variables from the electron object
98 
99  // kinematic variables
100  bool isEB = ele.isEB() ? true : false;
101  float pt = ele.pt();
102  float eta = ele.superCluster()->eta();
103 
104  // id variables
105  float dEtaIn = ele.deltaEtaSuperClusterTrackAtVtx();
106  float dPhiIn = ele.deltaPhiSuperClusterTrackAtVtx();
107  float sigmaIEtaIEta = ele.sigmaIetaIeta();
108  float hoe = ele.hadronicOverEm();
109  float ooemoop = (1.0/ele.ecalEnergy() - ele.eSuperClusterOverP()/ele.ecalEnergy());
110 
111  // impact parameter variables
112  float d0vtx = 0.0;
113  float dzvtx = 0.0;
114  if (vtxs->size() > 0) {
115  reco::VertexRef vtx(vtxs, 0);
116  d0vtx = ele.gsfTrack()->dxy(vtx->position());
117  dzvtx = ele.gsfTrack()->dz(vtx->position());
118  } else {
119  d0vtx = ele.gsfTrack()->dxy();
120  dzvtx = ele.gsfTrack()->dz();
121  }
122 
123  // conversion rejection variables
124  bool vtxFitConversion = ConversionTools::hasMatchedConversion(ele, conversions, beamspot.position());
125  float mHits = ele.gsfTrack()->trackerExpectedHitsInner().numberOfHits();
126 
127  // get the mask value
128  unsigned int mask = EgammaCutBasedEleId::TestWP(workingPoint, isEB, pt, eta, dEtaIn, dPhiIn,
129  sigmaIEtaIEta, hoe, ooemoop, d0vtx, dzvtx, iso_ch, iso_em, iso_nh, vtxFitConversion, mHits, rho, EAtarget);
130 
131  // return the mask value
132  return mask;
133 
134 }
135 
136 unsigned int EgammaCutBasedEleId::TestWP(WorkingPoint workingPoint,
137  const reco::GsfElectronRef &ele,
139  const reco::BeamSpot &beamspot,
141  const double &iso_ch,
142  const double &iso_em,
143  const double &iso_nh,
144  const double &rho,
146  return TestWP(workingPoint,*ele,conversions,beamspot,vtxs,iso_ch,iso_em,iso_nh,rho, EAtarget);
147 }
148 
149 
150 #endif
151 
152 bool EgammaCutBasedEleId::PassWP(WorkingPoint workingPoint, const bool isEB, const float pt, const float eta,
153  const float dEtaIn, const float dPhiIn, const float sigmaIEtaIEta, const float hoe,
154  const float ooemoop, const float d0vtx, const float dzvtx, const float iso_ch, const float iso_em, const float iso_nh,
155  const bool vtxFitConversion, const unsigned int mHits, const double rho, ElectronEffectiveArea::ElectronEffectiveAreaTarget EAtarget)
156 {
157  unsigned int mask = EgammaCutBasedEleId::TestWP(workingPoint, isEB, pt, eta, dEtaIn, dPhiIn,
158  sigmaIEtaIEta, hoe, ooemoop, d0vtx, dzvtx, iso_ch, iso_em, iso_nh, vtxFitConversion, mHits, rho, EAtarget);
159 
160  if ((mask & PassAll) == PassAll) return true;
161  return false;
162 }
163 
165  const bool isEB, const float pt,
166  const float dEtaIn, const float dPhiIn, const float sigmaIEtaIEta, const float hoe,
167  const float trackIso, const float ecalIso, const float hcalIso)
168 {
169 
170 
171  // choose cut if barrel or endcap
172  unsigned int idx = isEB ? 0 : 1;
173 
174  if (triggerWorkingPoint == EgammaCutBasedEleId::TRIGGERTIGHT) {
175  float cut_dEtaIn[2] = {0.007, 0.009};
176  float cut_dPhiIn[2] = {0.15, 0.10};
177  float cut_sigmaIEtaIEta[2] = {0.01, 0.03};
178  float cut_hoe[2] = {0.12, 0.10};
179  float cut_trackIso[2] = {0.20, 0.20};
180  float cut_ecalIso[2] = {0.20, 0.20};
181  float cut_hcalIso[2] = {0.20, 0.20};
182  if (fabs(dEtaIn) > cut_dEtaIn[idx]) return false;
183  if (fabs(dPhiIn) > cut_dPhiIn[idx]) return false;
184  if (sigmaIEtaIEta > cut_sigmaIEtaIEta[idx]) return false;
185  if (hoe > cut_hoe[idx]) return false;
186  if (trackIso / pt > cut_trackIso[idx]) return false;
187  if (ecalIso / pt > cut_ecalIso[idx]) return false;
188  if (hcalIso / pt > cut_hcalIso[idx]) return false;
189  }
190  else if (triggerWorkingPoint == EgammaCutBasedEleId::TRIGGERWP70) {
191  float cut_dEtaIn[2] = {0.004, 0.005};
192  float cut_dPhiIn[2] = {0.03, 0.02};
193  float cut_sigmaIEtaIEta[2] = {0.01, 0.03};
194  float cut_hoe[2] = {0.025, 0.025};
195  float cut_trackIso[2] = {0.10, 0.10};
196  float cut_ecalIso[2] = {0.10, 0.05};
197  float cut_hcalIso[2] = {0.05, 0.05};
198  if (fabs(dEtaIn) > cut_dEtaIn[idx]) return false;
199  if (fabs(dPhiIn) > cut_dPhiIn[idx]) return false;
200  if (sigmaIEtaIEta > cut_sigmaIEtaIEta[idx]) return false;
201  if (hoe > cut_hoe[idx]) return false;
202  if (trackIso / pt > cut_trackIso[idx]) return false;
203  if (ecalIso / pt > cut_ecalIso[idx]) return false;
204  if (hcalIso / pt > cut_hcalIso[idx]) return false;
205  }
206  else {
207  std::cout << "[EgammaCutBasedEleId::PassTriggerCuts] Undefined working point" << std::endl;
208  }
209 
210  return true;
211 }
212 
213 bool EgammaCutBasedEleId::PassEoverPCuts(const float eta, const float eopin, const float fbrem)
214 {
215  if (fbrem > 0.15) return true;
216  else if (fabs(eta) < 1.0 && eopin > 0.95) return true;
217  return false;
218 }
219 
220 unsigned int EgammaCutBasedEleId::TestWP(WorkingPoint workingPoint, const bool isEB, const float pt, const float eta,
221  const float dEtaIn, const float dPhiIn, const float sigmaIEtaIEta, const float hoe,
222  const float ooemoop, const float d0vtx, const float dzvtx, const float iso_ch, const float iso_em, const float iso_nh,
223  const bool vtxFitConversion, const unsigned int mHits, const double rho, ElectronEffectiveArea::ElectronEffectiveAreaTarget EAtarget)
224 {
225 
226  unsigned int mask = 0;
227  float cut_dEtaIn[2] = {999.9, 999.9};
228  float cut_dPhiIn[2] = {999.9, 999.9};
229  float cut_sigmaIEtaIEta[2] = {999.9, 999.9};
230  float cut_hoe[2] = {999.9, 999.9};
231  float cut_ooemoop[2] = {999.9, 999.9};
232  float cut_d0vtx[2] = {999.9, 999.9};
233  float cut_dzvtx[2] = {999.9, 999.9};
234  float cut_iso[2] = {999.9, 999.9};
235  bool cut_vtxFit[2] = {false, false};
236  unsigned int cut_mHits[2] = {999, 999};
237 
238  if (workingPoint == EgammaCutBasedEleId::VETO) {
239  cut_dEtaIn[0] = 0.007; cut_dEtaIn[1] = 0.010;
240  cut_dPhiIn[0] = 0.800; cut_dPhiIn[1] = 0.700;
241  cut_sigmaIEtaIEta[0] = 0.010; cut_sigmaIEtaIEta[1] = 0.030;
242  cut_hoe[0] = 0.150; cut_hoe[1] = 999.9;
243  cut_ooemoop[0] = 999.9; cut_ooemoop[1] = 999.9;
244  cut_d0vtx[0] = 0.040; cut_d0vtx[1] = 0.040;
245  cut_dzvtx[0] = 0.200; cut_dzvtx[1] = 0.200;
246  cut_vtxFit[0] = false; cut_vtxFit[1] = false;
247  cut_mHits[0] = 999 ; cut_mHits[1] = 999;
248  cut_iso[0] = 0.150; cut_iso[1] = 0.150;
249  }
250  else if (workingPoint == EgammaCutBasedEleId::LOOSE) {
251  cut_dEtaIn[0] = 0.007; cut_dEtaIn[1] = 0.009;
252  cut_dPhiIn[0] = 0.150; cut_dPhiIn[1] = 0.100;
253  cut_sigmaIEtaIEta[0] = 0.010; cut_sigmaIEtaIEta[1] = 0.030;
254  cut_hoe[0] = 0.120; cut_hoe[1] = 0.100;
255  cut_ooemoop[0] = 0.050; cut_ooemoop[1] = 0.050;
256  cut_d0vtx[0] = 0.020; cut_d0vtx[1] = 0.020;
257  cut_dzvtx[0] = 0.200; cut_dzvtx[1] = 0.200;
258  cut_vtxFit[0] = true ; cut_vtxFit[1] = true;
259  cut_mHits[0] = 1 ; cut_mHits[1] = 1;
260  if (pt >= 20.0) {
261  cut_iso[0] = 0.150; cut_iso[1] = 0.150;
262  }
263  else {
264  cut_iso[0] = 0.150; cut_iso[1] = 0.100;
265  }
266  }
267  else if (workingPoint == EgammaCutBasedEleId::MEDIUM) {
268  cut_dEtaIn[0] = 0.004; cut_dEtaIn[1] = 0.007;
269  cut_dPhiIn[0] = 0.060; cut_dPhiIn[1] = 0.030;
270  cut_sigmaIEtaIEta[0] = 0.010; cut_sigmaIEtaIEta[1] = 0.030;
271  cut_hoe[0] = 0.120; cut_hoe[1] = 0.100;
272  cut_ooemoop[0] = 0.050; cut_ooemoop[1] = 0.050;
273  cut_d0vtx[0] = 0.020; cut_d0vtx[1] = 0.020;
274  cut_dzvtx[0] = 0.100; cut_dzvtx[1] = 0.100;
275  cut_vtxFit[0] = true ; cut_vtxFit[1] = true;
276  cut_mHits[0] = 1 ; cut_mHits[1] = 1;
277  if (pt >= 20.0) {
278  cut_iso[0] = 0.150; cut_iso[1] = 0.150;
279  }
280  else {
281  cut_iso[0] = 0.150; cut_iso[1] = 0.100;
282  }
283  }
284  else if (workingPoint == EgammaCutBasedEleId::TIGHT) {
285  cut_dEtaIn[0] = 0.004; cut_dEtaIn[1] = 0.005;
286  cut_dPhiIn[0] = 0.030; cut_dPhiIn[1] = 0.020;
287  cut_sigmaIEtaIEta[0] = 0.010; cut_sigmaIEtaIEta[1] = 0.030;
288  cut_hoe[0] = 0.120; cut_hoe[1] = 0.100;
289  cut_ooemoop[0] = 0.050; cut_ooemoop[1] = 0.050;
290  cut_d0vtx[0] = 0.020; cut_d0vtx[1] = 0.020;
291  cut_dzvtx[0] = 0.100; cut_dzvtx[1] = 0.100;
292  cut_vtxFit[0] = true ; cut_vtxFit[1] = true;
293  cut_mHits[0] = 0 ; cut_mHits[1] = 0;
294  if (pt >= 20.0) {
295  cut_iso[0] = 0.100; cut_iso[1] = 0.100;
296  }
297  else {
298  cut_iso[0] = 0.100; cut_iso[1] = 0.070;
299  }
300  }
301  else {
302  std::cout << "[EgammaCutBasedEleId::TestWP] Undefined working point" << std::endl;
303  }
304 
305  // choose cut if barrel or endcap
306  unsigned int idx = isEB ? 0 : 1;
307 
308  // effective area for isolation
310 
311  // apply to neutrals
312  double rhoPrime = std::max(rho, 0.0);
313  double iso_n = std::max(iso_nh + iso_em - rhoPrime * AEff, 0.0);
314 
315  // compute final isolation
316  double iso = (iso_n + iso_ch) / pt;
317 
318  // test cuts
319  if (fabs(dEtaIn) < cut_dEtaIn[idx]) mask |= DETAIN;
320  if (fabs(dPhiIn) < cut_dPhiIn[idx]) mask |= DPHIIN;
321  if (sigmaIEtaIEta < cut_sigmaIEtaIEta[idx]) mask |= SIGMAIETAIETA;
322  if (hoe < cut_hoe[idx]) mask |= HOE;
323  if (fabs(ooemoop) < cut_ooemoop[idx]) mask |= OOEMOOP;
324  if (fabs(d0vtx) < cut_d0vtx[idx]) mask |= D0VTX;
325  if (fabs(dzvtx) < cut_dzvtx[idx]) mask |= DZVTX;
326  if (!cut_vtxFit[idx] || !vtxFitConversion) mask |= VTXFIT;
327  if (mHits <= cut_mHits[idx]) mask |= MHITS;
328  if (iso < cut_iso[idx]) mask |= ISO;
329 
330  // return the mask
331  return mask;
332 
333 }
334 
335 void EgammaCutBasedEleId::PrintDebug(unsigned int mask)
336 {
337  printf("detain(%i), ", bool(mask & DETAIN));
338  printf("dphiin(%i), ", bool(mask & DPHIIN));
339  printf("sieie(%i), ", bool(mask & SIGMAIETAIETA));
340  printf("hoe(%i), ", bool(mask & HOE));
341  printf("ooemoop(%i), ", bool(mask & OOEMOOP));
342  printf("d0vtx(%i), ", bool(mask & D0VTX));
343  printf("dzvtx(%i), ", bool(mask & DZVTX));
344  printf("iso(%i), ", bool(mask & ISO));
345  printf("vtxfit(%i), ", bool(mask & VTXFIT));
346  printf("mhits(%i)\n", bool(mask & MHITS));
347 }
348 
float eSuperClusterOverP() const
Definition: GsfElectron.h:229
unsigned int TestWP(const WorkingPoint workingPoint, const reco::GsfElectronRef &ele, const edm::Handle< reco::ConversionCollection > &conversions, const reco::BeamSpot &beamspot, const edm::Handle< reco::VertexCollection > &vtxs, const double &iso_ch, const double &iso_em, const double &iso_nh, const double &rho, ElectronEffectiveArea::ElectronEffectiveAreaTarget EAtarget)
void PrintDebug(unsigned int mask)
bool PassWP(const WorkingPoint workingPoint, const reco::GsfElectronRef &ele, const edm::Handle< reco::ConversionCollection > &conversions, const reco::BeamSpot &beamspot, const edm::Handle< reco::VertexCollection > &vtxs, const double &iso_ch, const double &iso_em, const double &iso_nh, const double &rho, ElectronEffectiveArea::ElectronEffectiveAreaTarget EAtarget)
Definition: DDAxes.h:10
static Double_t GetElectronEffectiveArea(ElectronEffectiveAreaType type, Double_t SCEta, ElectronEffectiveAreaTarget EffectiveAreaTarget=kEleEAData2011)
float fbrem() const
Definition: GsfElectron.h:639
T eta() const
bool isEB() const
Definition: GsfElectron.h:330
float deltaEtaSuperClusterTrackAtVtx() const
Definition: GsfElectron.h:233
float sigmaIetaIeta() const
Definition: GsfElectron.h:382
float hadronicOverEm() const
Definition: GsfElectron.h:403
const T & max(const T &a, const T &b)
bool PassTriggerCuts(const TriggerWorkingPoint triggerWorkingPoint, const reco::GsfElectronRef &ele)
virtual SuperClusterRef superCluster() const
reference to a SuperCluster
Definition: GsfElectron.h:168
float deltaPhiSuperClusterTrackAtVtx() const
Definition: GsfElectron.h:236
bool PassEoverPCuts(const reco::GsfElectronRef &ele)
float dr03TkSumPt() const
Definition: GsfElectron.h:436
static const unsigned int PassAll
static bool hasMatchedConversion(const reco::GsfElectron &ele, const edm::Handle< reco::ConversionCollection > &convCol, const math::XYZPoint &beamspot, bool allowCkfMatch=true, float lxyMin=2.0, float probMin=1e-6, unsigned int nHitsBeforeVtxMax=0)
virtual double pt() const
transverse momentum
float ecalEnergy() const
Definition: GsfElectron.h:724
float dr03EcalRecHitSumEt() const
Definition: GsfElectron.h:437
float dr03HcalTowerSumEt() const
Definition: GsfElectron.h:440
tuple cout
Definition: gather_cfg.py:121
const Point & position() const
position
Definition: BeamSpot.h:63
virtual GsfTrackRef gsfTrack() const
reference to a GsfTrack
Definition: GsfElectron.h:169