CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
Photon.py
Go to the documentation of this file.
2 from math import exp
3 import re
4 
5 import ROOT
6 
8 
9  def __init__(self, *args, **kwargs):
10  '''Initializing rho to None. The user is responsible for setting it to the right value
11  to get the rho-corrected isolation.'''
12  super(Photon, self).__init__(*args, **kwargs)
13  self._physObjInit()
14 
15  def _physObjInit(self):
16  self.rho = None
17 
18 
19  def hOVERe(self):
20  return self.physObj.hadTowOverEm()
21 
22  def r9(self):
23  return self.physObj.r9()
24 
25  def sigmaIetaIeta(self):
26  return self.physObj.sigmaIetaIeta()
27 
28  def full5x5_r9(self):
29  return self.physObj.full5x5_r9()
30 
32  return self.physObj.full5x5_sigmaIetaIeta()
33 
34  def chargedHadronIso(self, corr=None):
35  isoCharged = self.ftprAbsIsoCharged03 if hasattr(self,'ftprAbsIsoCharged03') else self.physObj.chargedHadronIso()
36  if corr is None or corr == "": return isoCharged
37  elif corr == "rhoArea": return max(isoCharged-self.rho*self.EffectiveArea03[0],0)
38  else: raise RuntimeError("Photon isolation correction '%s' not yet implemented in Photon.py" % corr)
39 
40  def neutralHadronIso(self, corr=None):
41  isoNHad = self.ftprAbsIsoNHad03 if hasattr(self,'ftprAbsIsoNHad03') else self.physObj.neutralHadronIso()
42  if corr is None or corr == "": return isoNHad
43  elif corr == "rhoArea": return max(isoNHad-self.rho*self.EffectiveArea03[1],0)
44  else: raise RuntimeError("Photon isolation correction '%s' not yet implemented in Photon.py" % corr)
45 
46  def photonIso(self, corr=None):
47  isoPho = self.ftprAbsIsoPho03 if hasattr(self,'ftprAbsIsoPho03') else self.physObj.photonIso()
48  if corr is None or corr == "": return isoPho
49  elif corr == "rhoArea": return max(isoPho-self.rho*self.EffectiveArea03[2],0)
50  else: raise RuntimeError("Photon isolation correction '%s' not yet implemented in Photon.py" % corr)
51 
52  def photonIDCSA14(self, name, sidebands=False):
53  keepThisPhoton = True
54  sigmaThresh = 999
55  hovereThresh = 999
56  if name == "PhotonCutBasedIDLoose_CSA14":
57  if abs(self.physObj.eta())<1.479 :
58  sigmaThresh = 0.010
59  hovereThresh = 0.0559
60  else :
61  sigmaThresh = 0.030
62  hovereThresh = 0.049
63  elif name == "PhotonCutBasedIDLoose_PHYS14":
64  if abs(self.physObj.eta())<1.479 :
65  sigmaThresh = 0.0106
66  hovereThresh = 0.048
67  else :
68  sigmaThresh = 0.0266
69  hovereThresh = 0.069
70  else :
71  print "WARNING! Unkown photon ID! Will return true!"
72  return True
73 
74  if sidebands:
75  if abs(self.physObj.eta())<1.479 :
76  sigmaThresh = 0.015
77  else :
78  sigmaThresh = 0.035
79 
80  if self.full5x5_sigmaIetaIeta() > sigmaThresh : keepThisPhoton = False
81  if self.hOVERe() > hovereThresh : keepThisPhoton = False
82 
83  return keepThisPhoton
84 
85  def CutBasedIDWP( self, name):
86  # recommeneded PHYS14 working points from POG
87  WPs = {
88  # https://twiki.cern.ch/twiki/bin/viewauth/CMS/CutBasedPhotonIdentificationRun2#Pointers_for_PHYS14_selection_im
89  "POG_PHYS14_25ns_Loose": {"conversionVeto": [True,True], "H/E":[0.028,0.093],"sigmaIEtaIEta":[0.0107,0.0272],
90  "chaHadIso":[2.67,1.79],"neuHadIso":[[7.23,0.0028,0.5408],[8.89,0.01725]],"phoIso":[[2.11,0.0014],[3.09,0.0091]]},
91 
92  # https://twiki.cern.ch/twiki/bin/view/CMS/CutBasedPhotonIdentificationRun2?rev=11
93  "POG_PHYS14_25ns_Loose_old": {"conversionVeto": [True,True], "H/E":[0.048,0.069],"sigmaIEtaIEta":[0.0106,0.0266],
94  "chaHadIso":[2.56,3.12],"neuHadIso":[[3.74,0.0025,0.],[17.11,0.0118,0.]],"phoIso":[[2.68,0.001],[2.70,0.0059]]},
95 
96  "POG_PHYS14_25ns_Medium": {"conversionVeto": [True,True], "H/E":[0.012,0.023],"sigmaIEtaIEta":[0.0100,0.0267],
97  "chaHadIso":[1.79,1.09],"neuHadIso":[[0.16,0.0028,0.5408],[4.31,0.0172]],"phoIso":[[1.90,0.0014],[1.90,0.0091]]},
98 
99  "POG_PHYS14_25ns_Tight": {"conversionVeto": [True,True], "H/E":[0.010,0.015],"sigmaIEtaIEta":[0.0100,0.0265],
100  "chaHadIso":[1.66,1.04],"neuHadIso":[[0.14,0.0028,0.5408],[3.89,0.0172]],"phoIso":[[1.40,0.0014],[1.40,0.0091]]},
101 
102  # https://twiki.cern.ch/twiki/bin/viewauth/CMS/CutBasedPhotonIdentificationRun2#SPRING15_selections_bunch_crossing
103  "POG_SPRING15_50ns_Loose": {"conversionVeto": [True,True], "H/E":[0.05,0.05],"sigmaIEtaIEta":[0.0103,0.0277],
104  "chaHadIso":[2.44,1.84],"neuHadIso":[[2.57,0.0044,0.5809],[4.00, 0.0040,0.9402]],"phoIso":[[1.92,0.0043],[2.15,0.0041]]},
105 
106  "POG_SPRING15_50ns_Medium": {"conversionVeto": [True,True], "H/E":[0.05,0.05],"sigmaIEtaIEta":[0.0100,0.0267],
107  "chaHadIso":[1.31,1.25],"neuHadIso":[[0.60,0.0044,0.5809],[1.65, 0.0040,0.9402]],"phoIso":[[1.33,0.0043],[1.02,0.0041]]},
108 
109  "POG_SPRING15_50ns_Tight": {"conversionVeto": [True,True], "H/E":[0.05,0.05],"sigmaIEtaIEta":[0.0100,0.0267],
110  "chaHadIso":[0.91,0.65],"neuHadIso":[[0.33,0.0044,0.5809],[0.93, 0.0040,0.9402]],"phoIso":[[0.61,0.0043],[0.54,0.0041]]},
111 
112  # https://twiki.cern.ch/twiki/bin/viewauth/CMS/CutBasedPhotonIdentificationRun2#CSA14_selections_for_20_bx_25_sc
113  "POG_CSA14_25ns_Loose": {"conversionVeto": [True,True], "H/E":[0.553,0.062],"sigmaIEtaIEta":[0.0099,0.0284],
114  "chaHadIso":[2.49,1.04],"neuHadIso":[[15.43,0.007],[19.71,0.0129]],"phoIso":[[9.42,0.0033],[11.88,0.0108]]},
115 
116  "POG_CSA14_25ns_Medium": {"conversionVeto": [True,True], "H/E":[0.058,0.020],"sigmaIEtaIEta":[0.0099,0.0268],
117  "chaHadIso":[1.91,0.82],"neuHadIso":[[4.66,0.007],[14.65,0.0129]],"phoIso":[[4.29,0.0033],[4.06,0.0108]]},
118 
119  "POG_CSA14_25ns_Tight": {"conversionVeto": [True,True], "H/E":[0.019,0.016],"sigmaIEtaIEta":[0.0099,0.0263],
120  "chaHadIso":[1.61,0.69],"neuHadIso":[[3.98,0.007],[4.52,0.0129]],"phoIso":[[3.01,0.0033],[3.61,0.0108]]},
121 
122 
123  }
124 
125  baseWP = re.split('_',name)
126  if "looseSieie" in baseWP[-1]:
127  baseWP.pop()
128  WPs["_".join(baseWP)]["sigmaIEtaIEta"] = [0.015,0.035]
129 
130  return WPs["_".join(baseWP)]
131 
132 
133  def etaRegionID(self):
134  #return 0 if the photon is in barrel and 1 if in endcap
135  if abs(self.physObj.eta())<1.479 :
136  idForBarrel = 0
137  else:
138  idForBarrel = 1
139  return idForBarrel
140 
141  def calScaledIsoValueLin(self,offset,slope):
142  return slope*self.pt()+offset
143 
144  def calScaledIsoValueExp(self,offset,slope_exp,offset_exp):
145  return offset + exp(slope_exp*self.pt()+offset_exp)
146 
147 
148  def passPhotonID(self,name,conversionSafe_eleVeto=False):
149 
150  idForBarrel = self.etaRegionID()
151  passPhotonID = True
152 
153  if self.CutBasedIDWP(name)["conversionVeto"][idForBarrel]:
154  if (conversionSafe_eleVeto==False and self.physObj.hasPixelSeed()) or (conversionSafe_eleVeto==True and self.physObj.passElectronVeto()==False):
155  passPhotonID = False
156 
157  if self.CutBasedIDWP(name)["H/E"][idForBarrel] < self.hOVERe():
158  passPhotonID = False
159 
160  if self.CutBasedIDWP(name)["sigmaIEtaIEta"][idForBarrel] < self.full5x5_sigmaIetaIeta():
161  passPhotonID = False
162 
163  return passPhotonID
164 
165  def passPhotonIso(self,name,isocorr):
166 
167  idForBarrel = self.etaRegionID()
168  passPhotonIso = True
169 
170  if self.CutBasedIDWP(name)["chaHadIso"][idForBarrel] < self.chargedHadronIso(isocorr):
171  passPhotonIso = False
172 
173  if "POG_PHYS14_25ns" in name and idForBarrel == 0:
174  if self.calScaledIsoValueExp(*self.CutBasedIDWP(name)["neuHadIso"][idForBarrel]) < self.neutralHadronIso(isocorr):
175  passPhotonIso = False
176  elif "POG_SPRING15_50ns" in name:
177  if self.calScaledIsoValueExp(*self.CutBasedIDWP(name)["neuHadIso"][idForBarrel]) < self.neutralHadronIso(isocorr):
178  passPhotonIso = False
179  else:
180  if self.calScaledIsoValueLin(*self.CutBasedIDWP(name)["neuHadIso"][idForBarrel]) < self.neutralHadronIso(isocorr):
181  passPhotonIso = False
182 
183  if self.calScaledIsoValueLin(*self.CutBasedIDWP(name)["phoIso"][idForBarrel]) < self.photonIso(isocorr):
184  passPhotonIso = False
185 
186  return passPhotonIso
187 
188  pass
189 
190 setattr(ROOT.pat.Photon, "recoPhotonIso", ROOT.reco.Photon.photonIso)
191 setattr(ROOT.pat.Photon, "recoNeutralHadronIso", ROOT.reco.Photon.neutralHadronIso)
192 setattr(ROOT.pat.Photon, "recoChargedHadronIso", ROOT.reco.Photon.chargedHadronIso)
def neutralHadronIso
Definition: Photon.py:40
def photonIso
Definition: Photon.py:46
def full5x5_r9
Definition: Photon.py:28
def CutBasedIDWP
Definition: Photon.py:85
def etaRegionID
Definition: Photon.py:133
def _physObjInit
Definition: Photon.py:15
def __init__
Definition: Photon.py:9
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
def passPhotonIso
Definition: Photon.py:165
def calScaledIsoValueExp
Definition: Photon.py:144
static std::string join(char **cmd)
Definition: RemoteFile.cc:18
def calScaledIsoValueLin
Definition: Photon.py:141
def sigmaIetaIeta
Definition: Photon.py:25
def hOVERe
Definition: Photon.py:19
def passPhotonID
Definition: Photon.py:148
def photonIDCSA14
Definition: Photon.py:52
def chargedHadronIso
Definition: Photon.py:34
def full5x5_sigmaIetaIeta
Definition: Photon.py:31