CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
Electron.py
Go to the documentation of this file.
1 from PhysicsTools.Heppy.physicsobjects.Lepton import Lepton
4 import ROOT
5 
6 class Electron( Lepton ):
7 
8  def __init__(self, *args, **kwargs):
9  '''Initializing tightIdResult to None. The user is responsible
10  for setting this attribute externally if he wants to use the tightId
11  function.'''
12  super(Electron, self).__init__(*args, **kwargs)
13  self._physObjInit()
14 
15  def _physObjInit(self):
16  self.tightIdResult = None
17  self.associatedVertex = None
18  self.rho = None
19  self._mvaNonTrigV0 = {True:None, False:None}
20  self._mvaTrigV0 = {True:None, False:None}
21  self._mvaTrigNoIPV0 = {True:None, False:None}
22  self._mvaRun2 = {}
23 
24  def electronID( self, id, vertex=None, rho=None ):
25  if id is None or id == "": return True
26  if vertex == None and hasattr(self,'associatedVertex') and self.associatedVertex != None: vertex = self.associatedVertex
27  if rho == None and hasattr(self,'rho') and self.rho != None: rho = self.rho
28  if id == "POG_MVA_ID_NonTrig": return self.mvaIDLoose()
29  elif id == "POG_MVA_ID_Trig": return self.mvaIDTight()
30  elif id == "POG_MVA_ID_NonTrig_full5x5": return self.mvaIDLoose(full5x5=True)
31  elif id == "POG_MVA_ID_Trig_full5x5": return self.mvaIDTight(full5x5=True)
32  elif id == "POG_MVA_ID_Phys14_NonTrig_VLoose": return self.mvaIDRun2("NonTrigPhys14","VLoose")
33  elif id == "POG_MVA_ID_Phys14_NonTrig_Loose": return self.mvaIDRun2("NonTrigPhys14","Loose")
34  elif id == "POG_MVA_ID_Phys14_NonTrig_Tight": return self.mvaIDRun2("NonTrigPhys14","Tight")
35  elif id == "POG_MVA_ID_Spring15_NonTrig_VLoose": return self.mvaIDRun2("NonTrigSpring15","VLoose")
36  elif id == "POG_MVA_ID_Spring15_NonTrig_VLooseIdEmu": return self.mvaIDRun2("NonTrigSpring15","VLooseIdEmu")
37  elif id == "POG_MVA_ID_Spring15_NonTrig_VLooseIdIsoEmu": return self.mvaIDRun2("NonTrigSpring15","VLooseIdIsoEmu")
38  elif id == "POG_MVA_ID_Spring15_NonTrig_Tight": return self.mvaIDRun2("NonTrigSpring15","Tight")
39  elif id == "MVA_ID_NonTrig_Phys14Fix_HZZ": return self.mvaIDRun2("NonTrigPhys14Fix","HZZ")
40  elif id.startswith("POG_Cuts_ID_"):
41  return self.cutBasedId(id.replace("POG_Cuts_ID_","POG_"))
42  for ID in self.electronIDs():
43  if ID.first == id:
44  return ID.second
45  raise RuntimeError("Electron id '%s' not yet implemented in Electron.py" % id)
46 
47  def cutBasedId(self, wp, showerShapes="auto"):
48  if "_full5x5" in wp:
49  showerShapes = "full5x5"
50  wp = wp.replace("_full5x5","")
51  elif showerShapes == "auto":
52  if "POG_CSA14_25ns_v1" in wp or "POG_CSA14_50ns_v1" in wp or "POG_PHYS14_25ns_v1" in wp or "POG_PHYS14_25ns_v1_ConvVeto" in wp or "POG_PHYS14_25ns_v1_ConvVetoDxyDz" in wp or "POG_PHYS14_25ns_v2" in wp or "POG_PHYS14_25ns_v2_ConvVeto" in wp or "POG_PHYS14_25ns_v2_ConvVetoDxyDz" in wp or "POG_SPRING15_25ns_v1" in wp or "POG_SPRING15_25ns_v1_ConvVeto" in wp or "POG_SPRING15_25ns_v1_ConvVetoDxyDz" in wp or "POG_SPRING15_50ns_v2" in wp or "POG_SPRING15_50ns_v2_ConvVeto" in wp or "POG_SPRING15_50ns_v2_ConvVetoDxyDz" in wp:
53  showerShapes = "full5x5"
54  vars = {
55  'dEtaIn' : abs(self.physObj.deltaEtaSuperClusterTrackAtVtx()),
56  'dPhiIn' : abs(self.physObj.deltaPhiSuperClusterTrackAtVtx()),
57  'sigmaIEtaIEta' : self.physObj.full5x5_sigmaIetaIeta() if showerShapes == "full5x5" else self.physObj.sigmaIetaIeta(),
58  'H/E' : self.physObj.hadronicOverEm(),
59  #'1/E-1/p' : abs(1.0/self.physObj.ecalEnergy() - self.physObj.eSuperClusterOverP()/self.physObj.ecalEnergy()),
60  '1/E-1/p' : abs(1.0/self.physObj.ecalEnergy() - self.physObj.eSuperClusterOverP()/self.physObj.ecalEnergy()) if self.physObj.ecalEnergy()>0. else 9e9,
61  'conversionVeto' : self.physObj.passConversionVeto(),
62  'missingHits' : self.physObj.gsfTrack().hitPattern().numberOfHits(ROOT.reco.HitPattern.MISSING_INNER_HITS), # http://cmslxr.fnal.gov/source/DataFormats/TrackReco/interface/HitPattern.h?v=CMSSW_7_2_3#0153
63  'dxy' : abs(self.dxy()),
64  'dz' : abs(self.dz()),
65  }
66  WP = {
67  ## ------- https://twiki.cern.ch/twiki/bin/viewauth/CMS/EgammaCutBasedIdentification?rev=31
68  'POG_2012_Veto' : [('dEtaIn', [0.007, 0.01]), ('dPhiIn', [0.8, 0.7 ]), ('sigmaIEtaIEta', [0.01, 0.03]), ('H/E', [0.15, 9e9]), ('1/E-1/p', [9e9, 9e9])],
69  'POG_2012_Loose' : [('dEtaIn', [0.007, 0.009]), ('dPhiIn', [0.15, 0.1 ]), ('sigmaIEtaIEta', [0.01, 0.03]), ('H/E', [0.12, 0.1]), ('1/E-1/p', [0.05, 0.05])],
70  'POG_2012_Medium' : [('dEtaIn', [0.004, 0.007]), ('dPhiIn', [0.06, 0.03]), ('sigmaIEtaIEta', [0.01, 0.03]), ('H/E', [0.12, 0.1]), ('1/E-1/p', [0.05, 0.05])],
71  'POG_2012_Tight' : [('dEtaIn', [0.004, 0.005]), ('dPhiIn', [0.03, 0.02]), ('sigmaIEtaIEta', [0.01, 0.03]), ('H/E', [0.12, 0.1]), ('1/E-1/p', [0.05, 0.05])],
72  # RIC: in the EG POG WPs, isolation is included too. Here only the pure ID part.
73  # dz and d0 cuts are excluded here as well.
74  ## ------- https://twiki.cern.ch/twiki/bin/viewauth/CMS/CutBasedElectronIdentificationRun2#Working_points_for_CSA14_samples?rev=13
75  'POG_CSA14_25ns_v1_Veto' : [('dEtaIn', [0.017938, 0.014569]), ('dPhiIn', [0.182958, 0.230914]), ('sigmaIEtaIEta', [0.012708, 0.036384]), ('H/E', [0.335015, 0.200792]), ('1/E-1/p', [0.198287, 0.146856])],
76  'POG_CSA14_25ns_v1_Loose' : [('dEtaIn', [0.014928, 0.013045]), ('dPhiIn', [0.141050, 0.149017]), ('sigmaIEtaIEta', [0.011304, 0.035536]), ('H/E', [0.127690, 0.107898]), ('1/E-1/p', [0.097806, 0.102261])],
77  'POG_CSA14_25ns_v1_Medium' : [('dEtaIn', [0.013071, 0.010006]), ('dPhiIn', [0.132113, 0.052321]), ('sigmaIEtaIEta', [0.010726, 0.032882]), ('H/E', [0.109761, 0.101755]), ('1/E-1/p', [0.032639, 0.041427])],
78  'POG_CSA14_25ns_v1_Tight' : [('dEtaIn', [0.012671, 0.008823]), ('dPhiIn', [0.025218, 0.027286]), ('sigmaIEtaIEta', [0.010061, 0.030222]), ('H/E', [0.065085, 0.090710]), ('1/E-1/p', [0.027873, 0.019404])],
79  'POG_CSA14_50ns_v1_Veto' : [('dEtaIn', [0.021, 0.028]), ('dPhiIn', [0.25 , 0.23 ]), ('sigmaIEtaIEta', [0.012, 0.035]), ('H/E', [0.24 , 0.19 ]), ('1/E-1/p', [0.32 , 0.13 ])],
80  'POG_CSA14_50ns_v1_Loose' : [('dEtaIn', [0.016, 0.025]), ('dPhiIn', [0.080, 0.097]), ('sigmaIEtaIEta', [0.012, 0.032]), ('H/E', [0.15 , 0.12 ]), ('1/E-1/p', [0.11 , 0.11 ])],
81  'POG_CSA14_50ns_v1_Medium' : [('dEtaIn', [0.015, 0.023]), ('dPhiIn', [0.051, 0.056]), ('sigmaIEtaIEta', [0.010, 0.030]), ('H/E', [0.10 , 0.099]), ('1/E-1/p', [0.053, 0.11 ])],
82  'POG_CSA14_50ns_v1_Tight' : [('dEtaIn', [0.012, 0.019]), ('dPhiIn', [0.024, 0.043]), ('sigmaIEtaIEta', [0.010, 0.029]), ('H/E', [0.074, 0.080]), ('1/E-1/p', [0.026, 0.076])],
83  ## ------- https://twiki.cern.ch/twiki/bin/viewauth/CMS/CutBasedElectronIdentificationRun2#Working_points_for_PHYS14_sample?rev=13
84  'POG_PHYS14_25ns_v1_Veto' : [('dEtaIn', [0.016315, 0.010671]), ('dPhiIn', [0.252044, 0.245263]), ('sigmaIEtaIEta', [0.011100 , 0.033987]), ('H/E', [0.345843, 0.134691]), ('1/E-1/p', [0.248070, 0.157160])],
85  'POG_PHYS14_25ns_v1_Loose' : [('dEtaIn', [0.012442, 0.010654]), ('dPhiIn', [0.072624, 0.145129]), ('sigmaIEtaIEta', [0.010557 , 0.032602]), ('H/E', [0.121476, 0.131862]), ('1/E-1/p', [0.221803, 0.142283])],
86  'POG_PHYS14_25ns_v1_Medium' : [('dEtaIn', [0.007641, 0.009285]), ('dPhiIn', [0.032643, 0.042447]), ('sigmaIEtaIEta', [0.010399 , 0.029524]), ('H/E', [0.060662, 0.104263]), ('1/E-1/p', [0.153897, 0.137468])],
87  'POG_PHYS14_25ns_v1_Tight' : [('dEtaIn', [0.006574, 0.005681]), ('dPhiIn', [0.022868, 0.032046]), ('sigmaIEtaIEta', [0.010181 , 0.028766]), ('H/E', [0.037553, 0.081902]), ('1/E-1/p', [0.131191, 0.106055])],
88  ## ------- https://twiki.cern.ch/twiki/bin/viewauth/CMS/CutBasedElectronIdentificationRun2#Working_points_for_PHYS14_sample?rev=17
89  'POG_PHYS14_25ns_v2_Veto' : [('dEtaIn', [0.013625, 0.011932]), ('dPhiIn', [0.230374, 0.255450]), ('sigmaIEtaIEta', [0.011586 , 0.031849]), ('H/E', [0.181130, 0.223870]), ('1/E-1/p', [0.295751, 0.155501])],
90  'POG_PHYS14_25ns_v2_Loose' : [('dEtaIn', [0.009277, 0.009833]), ('dPhiIn', [0.094739, 0.149934]), ('sigmaIEtaIEta', [0.010331 , 0.031838]), ('H/E', [0.093068, 0.115754]), ('1/E-1/p', [0.189968, 0.140662])],
91  'POG_PHYS14_25ns_v2_Medium' : [('dEtaIn', [0.008925, 0.007429]), ('dPhiIn', [0.035973, 0.067879]), ('sigmaIEtaIEta', [0.009996 , 0.030135]), ('H/E', [0.050537, 0.086782]), ('1/E-1/p', [0.091942, 0.100683])],
92  'POG_PHYS14_25ns_v2_Tight' : [('dEtaIn', [0.006046, 0.007057]), ('dPhiIn', [0.028092, 0.030159]), ('sigmaIEtaIEta', [0.009947 , 0.028237]), ('H/E', [0.045772, 0.067778]), ('1/E-1/p', [0.020118, 0.098919])],
93  ## ------- https://twiki.cern.ch/twiki/bin/view/CMS/CutBasedElectronIdentificationRun2?rev=24#Working_points_for_Spring15_MC_s
94  'POG_SPRING15_50ns_v2_Veto' : [('dEtaIn', [0.01260, 0.01090]), ('dPhiIn', [0.1070, 0.2190]), ('sigmaIEtaIEta', [0.0120, 0.0339]), ('H/E', [0.1860, 0.0962]), ('1/E-1/p', [0.2390, 0.141])],
95  'POG_SPRING15_50ns_v2_Loose' : [('dEtaIn', [0.00976, 0.00952]), ('dPhiIn', [0.0929, 0.1810]), ('sigmaIEtaIEta', [0.0105, 0.0318]), ('H/E', [0.0765, 0.0824]), ('1/E-1/p', [0.1840, 0.125])],
96  'POG_SPRING15_50ns_v2_Medium' : [('dEtaIn', [0.00940, 0.00773]), ('dPhiIn', [0.0296, 0.1480]), ('sigmaIEtaIEta', [0.0101, 0.0287]), ('H/E', [0.0372, 0.0546]), ('1/E-1/p', [0.1180, 0.104])],
97  'POG_SPRING15_50ns_v2_Tight' : [('dEtaIn', [0.00864, 0.00762]), ('dPhiIn', [0.0291, 0.0439]), ('sigmaIEtaIEta', [0.0101, 0.0287]), ('H/E', [0.0372, 0.0544]), ('1/E-1/p', [0.0116, 0.010])],
98  'POG_SPRING15_25ns_v1_Veto' : [('dEtaIn', [0.01520, 0.01130]), ('dPhiIn', [0.2160, 0.2370]), ('sigmaIEtaIEta', [0.0114, 0.0352]), ('H/E', [0.1810, 0.1160]), ('1/E-1/p', [0.2070, 0.17400])],
99  'POG_SPRING15_25ns_v1_Loose' : [('dEtaIn', [0.01050, 0.00814]), ('dPhiIn', [0.1150, 0.1820]), ('sigmaIEtaIEta', [0.0103, 0.0301]), ('H/E', [0.1040, 0.0897]), ('1/E-1/p', [0.1020, 0.12600])],
100  'POG_SPRING15_25ns_v1_Medium' : [('dEtaIn', [0.01030, 0.00733]), ('dPhiIn', [0.0336, 0.1140]), ('sigmaIEtaIEta', [0.0101, 0.0283]), ('H/E', [0.0876, 0.0678]), ('1/E-1/p', [0.0174, 0.08980])],
101  'POG_SPRING15_25ns_v1_Tight' : [('dEtaIn', [0.00926, 0.00724]), ('dPhiIn', [0.0336, 0.0918]), ('sigmaIEtaIEta', [0.0101, 0.0279]), ('H/E', [0.0597, 0.0615]), ('1/E-1/p', [0.0120, 0.00999])],
102 
103  }
104  WP_conversion_veto = {
105  # missing Hits incremented by 1 because we return False if >=, note the '='
106  ## ------- https://twiki.cern.ch/twiki/bin/viewauth/CMS/CutBasedElectronIdentificationRun2#Working_points_for_CSA14_samples?rev=13
107  'POG_CSA14_25ns_v1_ConvVeto_Veto' : WP['POG_CSA14_25ns_v1_Veto' ]+[('conversionVeto', [True, True]), ('missingHits', [3, 4])],
108  'POG_CSA14_25ns_v1_ConvVeto_Loose' : WP['POG_CSA14_25ns_v1_Loose' ]+[('conversionVeto', [True, True]), ('missingHits', [2, 2])],
109  'POG_CSA14_25ns_v1_ConvVeto_Medium' : WP['POG_CSA14_25ns_v1_Medium']+[('conversionVeto', [True, True]), ('missingHits', [2, 2])],
110  'POG_CSA14_25ns_v1_ConvVeto_Tight' : WP['POG_CSA14_25ns_v1_Tight' ]+[('conversionVeto', [True, True]), ('missingHits', [2, 2])],
111  'POG_CSA14_50ns_v1_ConvVeto_Veto' : WP['POG_CSA14_50ns_v1_Veto' ]+[('conversionVeto', [True, True]), ('missingHits', [3, 4])],
112  'POG_CSA14_50ns_v1_ConvVeto_Loose' : WP['POG_CSA14_50ns_v1_Loose' ]+[('conversionVeto', [True, True]), ('missingHits', [2, 2])],
113  'POG_CSA14_50ns_v1_ConvVeto_Medium' : WP['POG_CSA14_50ns_v1_Medium']+[('conversionVeto', [True, True]), ('missingHits', [2, 2])],
114  'POG_CSA14_50ns_v1_ConvVeto_Tight' : WP['POG_CSA14_50ns_v1_Tight' ]+[('conversionVeto', [True, True]), ('missingHits', [2, 2])],
115  ## ------- https://twiki.cern.ch/twiki/bin/viewauth/CMS/CutBasedElectronIdentificationRun2#Working_points_for_PHYS14_sample?rev=13
116  'POG_PHYS14_25ns_v1_ConvVeto_Veto' : WP['POG_PHYS14_25ns_v1_Veto' ]+[('conversionVeto', [True, True]), ('missingHits', [3, 4])],
117  'POG_PHYS14_25ns_v1_ConvVeto_Loose' : WP['POG_PHYS14_25ns_v1_Loose' ]+[('conversionVeto', [True, True]), ('missingHits', [2, 2])],
118  'POG_PHYS14_25ns_v1_ConvVeto_Medium' : WP['POG_PHYS14_25ns_v1_Medium']+[('conversionVeto', [True, True]), ('missingHits', [2, 2])],
119  'POG_PHYS14_25ns_v1_ConvVeto_Tight' : WP['POG_PHYS14_25ns_v1_Tight' ]+[('conversionVeto', [True, True]), ('missingHits', [2, 2])],
120  ## ------- https://twiki.cern.ch/twiki/bin/viewauth/CMS/CutBasedElectronIdentificationRun2#Working_points_for_PHYS14_sample?rev=17
121  'POG_PHYS14_25ns_v2_ConvVeto_Veto' : WP['POG_PHYS14_25ns_v2_Veto' ]+[('conversionVeto', [True, True]), ('missingHits', [3, 4])],
122  'POG_PHYS14_25ns_v2_ConvVeto_Loose' : WP['POG_PHYS14_25ns_v2_Loose' ]+[('conversionVeto', [True, True]), ('missingHits', [2, 2])],
123  'POG_PHYS14_25ns_v2_ConvVeto_Medium' : WP['POG_PHYS14_25ns_v2_Medium']+[('conversionVeto', [True, True]), ('missingHits', [2, 2])],
124  'POG_PHYS14_25ns_v2_ConvVeto_Tight' : WP['POG_PHYS14_25ns_v2_Tight' ]+[('conversionVeto', [True, True]), ('missingHits', [2, 2])],
125  ## ------- https://twiki.cern.ch/twiki/bin/view/CMS/CutBasedElectronIdentificationRun2?rev=24#Working_points_for_Spring15_MC_s
126  'POG_SPRING15_50ns_v2_ConvVeto_Veto' : WP['POG_SPRING15_50ns_v2_Veto' ]+[('conversionVeto', [True, True]), ('missingHits', [3, 4])],
127  'POG_SPRING15_50ns_v2_ConvVeto_Loose' : WP['POG_SPRING15_50ns_v2_Loose' ]+[('conversionVeto', [True, True]), ('missingHits', [3, 2])],
128  'POG_SPRING15_50ns_v2_ConvVeto_Medium' : WP['POG_SPRING15_50ns_v2_Medium']+[('conversionVeto', [True, True]), ('missingHits', [3, 2])],
129  'POG_SPRING15_50ns_v2_ConvVeto_Tight' : WP['POG_SPRING15_50ns_v2_Tight' ]+[('conversionVeto', [True, True]), ('missingHits', [3, 2])],
130  'POG_SPRING15_25ns_v1_ConvVeto_Veto' : WP['POG_SPRING15_25ns_v1_Veto' ]+[('conversionVeto', [True, True]), ('missingHits', [3, 4])],
131  'POG_SPRING15_25ns_v1_ConvVeto_Loose' : WP['POG_SPRING15_25ns_v1_Loose' ]+[('conversionVeto', [True, True]), ('missingHits', [3, 2])],
132  'POG_SPRING15_25ns_v1_ConvVeto_Medium' : WP['POG_SPRING15_25ns_v1_Medium']+[('conversionVeto', [True, True]), ('missingHits', [3, 2])],
133  'POG_SPRING15_25ns_v1_ConvVeto_Tight' : WP['POG_SPRING15_25ns_v1_Tight' ]+[('conversionVeto', [True, True]), ('missingHits', [3, 2])],
134  }
135 
136  WP.update(WP_conversion_veto)
137 
138  WP_conversion_veto_DxyDz = {
139  ## ------- https://twiki.cern.ch/twiki/bin/viewauth/CMS/CutBasedElectronIdentificationRun2#Working_points_for_PHYS14_sample
140  'POG_PHYS14_25ns_v1_ConvVetoDxyDz_Veto' : WP['POG_PHYS14_25ns_v1_ConvVeto_Veto' ]+[('dxy',[0.060279, 0.273097]), ('dz',[0.800538, 0.885860])],
141  'POG_PHYS14_25ns_v1_ConvVetoDxyDz_Loose' : WP['POG_PHYS14_25ns_v1_ConvVeto_Loose' ]+[('dxy',[0.022664, 0.097358]), ('dz',[0.173670, 0.198444])],
142  'POG_PHYS14_25ns_v1_ConvVetoDxyDz_Medium' : WP['POG_PHYS14_25ns_v1_ConvVeto_Medium']+[('dxy',[0.011811, 0.051682]), ('dz',[0.070775, 0.180720])],
143  'POG_PHYS14_25ns_v1_ConvVetoDxyDz_Tight' : WP['POG_PHYS14_25ns_v1_ConvVeto_Tight' ]+[('dxy',[0.009924, 0.027261]), ('dz',[0.015310, 0.147154])],
144  ## ------- https://twiki.cern.ch/twiki/bin/viewauth/CMS/CutBasedElectronIdentificationRun2#Working_points_for_PHYS14_sample?rev=17
145  'POG_PHYS14_25ns_v2_ConvVetoDxyDz_Veto' : WP['POG_PHYS14_25ns_v2_ConvVeto_Veto' ]+[('dxy',[0.094095, 0.342293]), ('dz',[0.713070, 0.953461])],
146  'POG_PHYS14_25ns_v2_ConvVetoDxyDz_Loose' : WP['POG_PHYS14_25ns_v2_ConvVeto_Loose' ]+[('dxy',[0.035904, 0.099266]), ('dz',[0.075496, 0.197897])],
147  'POG_PHYS14_25ns_v2_ConvVetoDxyDz_Medium' : WP['POG_PHYS14_25ns_v2_ConvVeto_Medium']+[('dxy',[0.012235, 0.036719]), ('dz',[0.042020, 0.138142])],
148  'POG_PHYS14_25ns_v2_ConvVetoDxyDz_Tight' : WP['POG_PHYS14_25ns_v2_ConvVeto_Tight' ]+[('dxy',[0.008790, 0.027984]), ('dz',[0.021226, 0.133431])],
149  ## ------- https://twiki.cern.ch/twiki/bin/view/CMS/CutBasedElectronIdentificationRun2?rev=24#Working_points_for_Spring15_MC_s
150  'POG_SPRING15_50ns_v2_ConvVetoDxyDz_Veto' : WP['POG_SPRING15_50ns_v2_ConvVeto_Veto' ]+[('dxy',[0.0621, 0.2790]), ('dz',[0.613, 0.947])],
151  'POG_SPRING15_50ns_v2_ConvVetoDxyDz_Loose' : WP['POG_SPRING15_50ns_v2_ConvVeto_Loose' ]+[('dxy',[0.0227, 0.2420]), ('dz',[0.379, 0.921])],
152  'POG_SPRING15_50ns_v2_ConvVetoDxyDz_Medium' : WP['POG_SPRING15_50ns_v2_ConvVeto_Medium']+[('dxy',[0.0151, 0.0535]), ('dz',[0.238, 0.572])],
153  'POG_SPRING15_50ns_v2_ConvVetoDxyDz_Tight' : WP['POG_SPRING15_50ns_v2_ConvVeto_Tight' ]+[('dxy',[0.0144, 0.0377]), ('dz',[0.170, 0.571])],
154  'POG_SPRING15_25ns_v1_ConvVetoDxyDz_Veto' : WP['POG_SPRING15_25ns_v1_ConvVeto_Veto' ]+[('dxy',[0.0564, 0.2220]), ('dz',[0.472, 0.921])],
155  'POG_SPRING15_25ns_v1_ConvVetoDxyDz_Loose' : WP['POG_SPRING15_25ns_v1_ConvVeto_Loose' ]+[('dxy',[0.0261, 0.1180]), ('dz',[0.410, 0.822])],
156  'POG_SPRING15_25ns_v1_ConvVetoDxyDz_Medium' : WP['POG_SPRING15_25ns_v1_ConvVeto_Medium']+[('dxy',[0.0118, 0.0739]), ('dz',[0.373, 0.602])],
157  'POG_SPRING15_25ns_v1_ConvVetoDxyDz_Tight' : WP['POG_SPRING15_25ns_v1_ConvVeto_Tight' ]+[('dxy',[0.0111, 0.0351]), ('dz',[0.0466,0.417])],
158  }
159 
160  WP.update(WP_conversion_veto_DxyDz)
161 
162 
163  if wp not in WP:
164  raise RuntimeError("Working point '%s' not yet implemented in Electron.py" % wp)
165  for (cut_name,(cut_eb,cut_ee)) in WP[wp]:
166  if cut_name == 'conversionVeto':
167  if (cut_eb if self.physObj.isEB() else cut_ee) and not vars[cut_name]:
168  return False
169  elif vars[cut_name] >= (cut_eb if self.physObj.isEB() else cut_ee):
170  return False
171  return True
172 
173  def mvaId( self ):
174  return self.mvaNonTrigV0()
175 
176  def tightId( self ):
177  return self.tightIdResult
178 
179  def mvaNonTrigV0( self, full5x5=False, debug = False ):
180  if self._mvaNonTrigV0[full5x5] == None:
181  if self.associatedVertex == None: raise RuntimeError("You need to set electron.associatedVertex before calling any MVA")
182  if self.rho == None: raise RuntimeError("You need to set electron.rho before calling any MVA")
183  self._mvaNonTrigV0[full5x5] = ElectronMVAID_NonTrig(self.physObj, self.associatedVertex, self.rho, full5x5, debug)
184  return self._mvaNonTrigV0[full5x5]
185 
186  def mvaTrigV0( self, full5x5=False, debug = False ):
187  if self._mvaTrigV0[full5x5] == None:
188  if self.associatedVertex == None: raise RuntimeError("You need to set electron.associatedVertex before calling any MVA")
189  if self.rho == None: raise RuntimeError("You need to set electron.rho before calling any MVA")
190  self._mvaTrigV0[full5x5] = ElectronMVAID_Trig(self.physObj, self.associatedVertex, self.rho, full5x5, debug)
191  return self._mvaTrigV0[full5x5]
192 
193  def mvaTrigNoIPV0( self, full5x5=False, debug = False ):
194  if self._mvaTrigNoIPV0[full5x5] == None:
195  if self.associatedVertex == None: raise RuntimeError("You need to set electron.associatedVertex before calling any MVA")
196  if self.rho == None: raise RuntimeError("You need to set electron.rho before calling any MVA")
197  self._mvaTrigNoIPV0[full5x5] = ElectronMVAID_TrigNoIP(self.physObj, self.associatedVertex, self.rho, full5x5, debug)
198  return self._mvaTrigNoIPV0[full5x5]
199 
200  def mvaRun2( self, name, debug = False ):
201  if name not in self._mvaRun2:
202  if name not in ElectronMVAID_ByName: raise RuntimeError("Unknown electron run2 mva id %s (known ones are: %s)\n" % (name, ElectronMVAID_ByName.keys()))
203  if self.associatedVertex == None: raise RuntimeError("You need to set electron.associatedVertex before calling any MVA")
204  if self.rho == None: raise RuntimeError("You need to set electron.rho before calling any MVA")
205  self._mvaRun2[name] = ElectronMVAID_ByName[name](self.physObj, self.associatedVertex, self.rho, True, debug)
206  return self._mvaRun2[name]
207 
208  def mvaIDTight(self, full5x5=False):
209  eta = abs(self.superCluster().eta())
210  if self.pt() < 20:
211  if (eta < 0.8) : return self.mvaTrigV0(full5x5) > +0.00;
212  elif (eta < 1.479): return self.mvaTrigV0(full5x5) > +0.10;
213  else : return self.mvaTrigV0(full5x5) > +0.62;
214  else:
215  if (eta < 0.8) : return self.mvaTrigV0(full5x5) > +0.94;
216  elif (eta < 1.479): return self.mvaTrigV0(full5x5) > +0.85;
217  else : return self.mvaTrigV0(full5x5) > +0.92;
218 
219  def mvaIDLoose(self, full5x5=False):
220  eta = abs(self.superCluster().eta())
221  if self.pt() < 10:
222  if (eta < 0.8) : return self.mvaNonTrigV0(full5x5) > +0.47;
223  elif (eta < 1.479): return self.mvaNonTrigV0(full5x5) > +0.004;
224  else : return self.mvaNonTrigV0(full5x5) > +0.295;
225  else:
226  if (eta < 0.8) : return self.mvaNonTrigV0(full5x5) > -0.34;
227  elif (eta < 1.479): return self.mvaNonTrigV0(full5x5) > -0.65;
228  else : return self.mvaNonTrigV0(full5x5) > +0.60;
229 
230  def mvaIDRun2(self, name, wp):
231  eta = abs(self.superCluster().eta())
232  if name == "NonTrigPhys14":
233  if wp=="Loose":
234  if (eta < 0.8) : return self.mvaRun2(name) > +0.35;
235  elif (eta < 1.479): return self.mvaRun2(name) > +0.20;
236  else : return self.mvaRun2(name) > -0.52;
237  elif wp=="VLoose":
238  if (eta < 0.8) : return self.mvaRun2(name) > -0.11;
239  elif (eta < 1.479): return self.mvaRun2(name) > -0.35;
240  else : return self.mvaRun2(name) > -0.55;
241  elif wp=="Tight":
242  if (eta < 0.8) : return self.mvaRun2(name) > 0.73;
243  elif (eta < 1.479): return self.mvaRun2(name) > 0.57;
244  else : return self.mvaRun2(name) > 0.05;
245  else: raise RuntimeError("Ele MVA ID Working point not found")
246  else: raise RuntimeError("Ele MVA ID type not found")
247 
248 
249 
250  def chargedHadronIsoR(self,R=0.4):
251  if R == 0.3: return self.physObj.pfIsolationVariables().sumChargedHadronPt
252  elif R == 0.4: return self.physObj.chargedHadronIso()
253  raise RuntimeError("Electron chargedHadronIso missing for R=%s" % R)
254 
255  def neutralHadronIsoR(self,R=0.4):
256  if R == 0.3: return self.physObj.pfIsolationVariables().sumNeutralHadronEt
257  elif R == 0.4: return self.physObj.neutralHadronIso()
258  raise RuntimeError("Electron neutralHadronIso missing for R=%s" % R)
259 
260  def photonIsoR(self,R=0.4):
261  if R == 0.3: return self.physObj.pfIsolationVariables().sumPhotonEt
262  elif R == 0.4: return self.physObj.photonIso()
263  raise RuntimeError("Electron photonIso missing for R=%s" % R)
264 
265  def chargedAllIsoR(self,R=0.4):
266  if R == 0.3: return self.physObj.pfIsolationVariables().sumChargedParticlePt
267  raise RuntimeError("Electron chargedAllIso missing for R=%s" % R)
268 
269  def chargedAllIso(self):
270  raise RuntimeError("Electron chargedAllIso missing")
271 
272  def puChargedHadronIsoR(self,R=0.4):
273  if R == 0.3: return self.physObj.pfIsolationVariables().sumPUPt
274  elif R == 0.4: return self.physObj.puChargedHadronIso()
275  raise RuntimeError("Electron chargedHadronIso missing for R=%s" % R)
276 
277 
278  def absIsoWithFSR(self, R=0.4, puCorr="rhoArea", dBetaFactor=0.5):
279  '''
280  Calculate Isolation, subtract FSR, apply specific PU corrections"
281  '''
282  photonIso = self.photonIsoR(R)
283  if hasattr(self,'fsrPhotons'):
284  for gamma in self.fsrPhotons:
285  dr = deltaR(gamma.eta(), gamma.phi(), self.physObj.eta(), self.physObj.phi())
286  if (self.isEB() or dr > 0.08) and dr < R:
287  photonIso = max(photonIso-gamma.pt(),0.0)
288  if puCorr == "deltaBeta":
289  offset = dBetaFactor * self.puChargedHadronIsoR(R)
290  elif puCorr == "rhoArea":
291  offset = self.rho*getattr(self,"EffectiveArea"+(str(R).replace(".","")))
292  elif puCorr in ["none","None",None]:
293  offset = 0
294  else:
295  raise RuntimeError("Unsupported PU correction scheme %s" % puCorr)
296  return self.chargedHadronIsoR(R)+max(0.,photonIso+self.neutralHadronIsoR(R)-offset)
297 
298 
299  def dxy(self, vertex=None):
300  '''Returns dxy.
301  Computed using vertex (or self.associatedVertex if vertex not specified),
302  and the gsf track.
303  '''
304  if vertex is None:
305  vertex = self.associatedVertex
306  return self.gsfTrack().dxy( vertex.position() )
307 
308  def edxy(self):
309  '''returns the uncertainty on dxy (from gsf track)'''
310  return self.gsfTrack().dxyError()
311 
312  def p4(self):
313  return ROOT.reco.Candidate.p4(self.physObj)
314 
315 # def p4(self):
316 # return self.physObj.p4(self.physObj.candidateP4Kind()) # if kind == None else kind)
317 
318  def dz(self, vertex=None):
319  '''Returns dz.
320  Computed using vertex (or self.associatedVertex if vertex not specified),
321  and the gsf track.
322  '''
323  if vertex is None:
324  vertex = self.associatedVertex
325  return self.gsfTrack().dz( vertex.position() )
326 
327  def edz(self):
328  '''returns the uncertainty on dxz (from gsf track)'''
329  return self.gsfTrack().dzError()
330 
331 
332  def lostInner(self) :
333  if hasattr(self.gsfTrack(),"trackerExpectedHitsInner") :
334  return self.gsfTrack().trackerExpectedHitsInner().numberOfLostHits()
335  else :
336  return self.gsfTrack().hitPattern().numberOfHits(ROOT.reco.HitPattern.MISSING_INNER_HITS)
337 
tuple ElectronMVAID_NonTrig
tuple ElectronMVAID_TrigNoIP
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
double deltaR(double eta1, double eta2, double phi1, double phi2)
Definition: TreeUtility.cc:17
def puChargedHadronIsoR
Definition: Electron.py:272
Definition: Lepton.py:1
tuple ElectronMVAID_Trig