File indexing completed on 2024-11-25 02:29:49
0001 from PhysicsTools.Heppy.physicsobjects.PhysicsObject import *
0002 from math import exp
0003 import re
0004
0005 import ROOT
0006
0007 class Photon(PhysicsObject ):
0008
0009 def __init__(self, *args, **kwargs):
0010 '''Initializing rho to None. The user is responsible for setting it to the right value
0011 to get the rho-corrected isolation.'''
0012 super(Photon, self).__init__(*args, **kwargs)
0013 self._physObjInit()
0014
0015 def _physObjInit(self):
0016 self.rho = None
0017
0018
0019 def hOVERe(self):
0020 return self.physObj.hadTowOverEm()
0021
0022 def r9(self):
0023 return self.physObj.r9()
0024
0025 def sigmaIetaIeta(self):
0026 return self.physObj.sigmaIetaIeta()
0027
0028 def full5x5_r9(self):
0029 return self.physObj.full5x5_r9()
0030
0031 def full5x5_sigmaIetaIeta(self):
0032 return self.physObj.full5x5_sigmaIetaIeta()
0033
0034 def chargedHadronIso(self, corr=None):
0035 isoCharged = self.ftprAbsIsoCharged03 if hasattr(self,'ftprAbsIsoCharged03') else self.physObj.chargedHadronIso()
0036 if corr is None or corr == "": return isoCharged
0037 elif corr == "rhoArea": return max(isoCharged-self.rho*self.EffectiveArea03[0],0)
0038 else: raise RuntimeError("Photon isolation correction '%s' not yet implemented in Photon.py" % corr)
0039
0040 def neutralHadronIso(self, corr=None):
0041 isoNHad = self.ftprAbsIsoNHad03 if hasattr(self,'ftprAbsIsoNHad03') else self.physObj.neutralHadronIso()
0042 if corr is None or corr == "": return isoNHad
0043 elif corr == "rhoArea": return max(isoNHad-self.rho*self.EffectiveArea03[1],0)
0044 else: raise RuntimeError("Photon isolation correction '%s' not yet implemented in Photon.py" % corr)
0045
0046 def photonIso(self, corr=None):
0047 isoPho = self.ftprAbsIsoPho03 if hasattr(self,'ftprAbsIsoPho03') else self.physObj.photonIso()
0048 if corr is None or corr == "": return isoPho
0049 elif corr == "rhoArea": return max(isoPho-self.rho*self.EffectiveArea03[2],0)
0050 else: raise RuntimeError("Photon isolation correction '%s' not yet implemented in Photon.py" % corr)
0051
0052 def photonIDCSA14(self, name, sidebands=False):
0053 keepThisPhoton = True
0054 sigmaThresh = 999
0055 hovereThresh = 999
0056 if name == "PhotonCutBasedIDLoose_CSA14":
0057 if abs(self.physObj.eta())<1.479 :
0058 sigmaThresh = 0.010
0059 hovereThresh = 0.0559
0060 else :
0061 sigmaThresh = 0.030
0062 hovereThresh = 0.049
0063 elif name == "PhotonCutBasedIDLoose_PHYS14":
0064 if abs(self.physObj.eta())<1.479 :
0065 sigmaThresh = 0.0106
0066 hovereThresh = 0.048
0067 else :
0068 sigmaThresh = 0.0266
0069 hovereThresh = 0.069
0070 else :
0071 print("WARNING! Unkown photon ID! Will return true!")
0072 return True
0073
0074 if sidebands:
0075 if abs(self.physObj.eta())<1.479 :
0076 sigmaThresh = 0.015
0077 else :
0078 sigmaThresh = 0.035
0079
0080 if self.full5x5_sigmaIetaIeta() > sigmaThresh : keepThisPhoton = False
0081 if self.hOVERe() > hovereThresh : keepThisPhoton = False
0082
0083 return keepThisPhoton
0084
0085 def CutBasedIDWP( self, name):
0086
0087 WPs = {
0088
0089 "POG_PHYS14_25ns_Loose": {"conversionVeto": [True,True], "H/E":[0.028,0.093],"sigmaIEtaIEta":[0.0107,0.0272],
0090 "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]]},
0091
0092
0093 "POG_PHYS14_25ns_Loose_old": {"conversionVeto": [True,True], "H/E":[0.048,0.069],"sigmaIEtaIEta":[0.0106,0.0266],
0094 "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]]},
0095
0096 "POG_PHYS14_25ns_Medium": {"conversionVeto": [True,True], "H/E":[0.012,0.023],"sigmaIEtaIEta":[0.0100,0.0267],
0097 "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]]},
0098
0099 "POG_PHYS14_25ns_Tight": {"conversionVeto": [True,True], "H/E":[0.010,0.015],"sigmaIEtaIEta":[0.0100,0.0265],
0100 "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]]},
0101
0102
0103 "POG_SPRING15_50ns_Loose": {"conversionVeto": [True,True], "H/E":[0.05,0.05],"sigmaIEtaIEta":[0.0103,0.0277],
0104 "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]]},
0105
0106 "POG_SPRING15_50ns_Medium": {"conversionVeto": [True,True], "H/E":[0.05,0.05],"sigmaIEtaIEta":[0.0100,0.0267],
0107 "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]]},
0108
0109 "POG_SPRING15_50ns_Tight": {"conversionVeto": [True,True], "H/E":[0.05,0.05],"sigmaIEtaIEta":[0.0100,0.0267],
0110 "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]]},
0111
0112
0113 "POG_SPRING15_25ns_Loose": {"conversionVeto": [True,True], "H/E":[0.05,0.05],"sigmaIEtaIEta":[0.0102,0.0274],
0114 "chaHadIso":[3.32,1.97],"neuHadIso":[[1.92,0.0014,0.000019],[11.86, 0.00139,0.000025]],"phoIso":[[0.81,0.0053],[0.83,0.0034]]},
0115
0116 "POG_SPRING15_25ns_Medium": {"conversionVeto": [True,True], "H/E":[0.05,0.05],"sigmaIEtaIEta":[0.0102,0.0268],
0117 "chaHadIso":[1.37,1.10],"neuHadIso":[[1.06,0.0014,0.000019],[2.69, 0.00139,0.000025]],"phoIso":[[0.28,0.0053],[0.39,0.0034]]},
0118
0119 "POG_SPRING15_25ns_Tight": {"conversionVeto": [True,True], "H/E":[0.05,0.05],"sigmaIEtaIEta":[0.0100,0.0268],
0120 "chaHadIso":[0.76,0.56],"neuHadIso":[[0.97,0.0014,0.000019],[2.09, 0.00139,0.000025]],"phoIso":[[0.08,0.0053],[0.16,0.0034]]},
0121
0122
0123 "POG_CSA14_25ns_Loose": {"conversionVeto": [True,True], "H/E":[0.553,0.062],"sigmaIEtaIEta":[0.0099,0.0284],
0124 "chaHadIso":[2.49,1.04],"neuHadIso":[[15.43,0.007],[19.71,0.0129]],"phoIso":[[9.42,0.0033],[11.88,0.0108]]},
0125
0126 "POG_CSA14_25ns_Medium": {"conversionVeto": [True,True], "H/E":[0.058,0.020],"sigmaIEtaIEta":[0.0099,0.0268],
0127 "chaHadIso":[1.91,0.82],"neuHadIso":[[4.66,0.007],[14.65,0.0129]],"phoIso":[[4.29,0.0033],[4.06,0.0108]]},
0128
0129 "POG_CSA14_25ns_Tight": {"conversionVeto": [True,True], "H/E":[0.019,0.016],"sigmaIEtaIEta":[0.0099,0.0263],
0130 "chaHadIso":[1.61,0.69],"neuHadIso":[[3.98,0.007],[4.52,0.0129]],"phoIso":[[3.01,0.0033],[3.61,0.0108]]},
0131
0132
0133 }
0134
0135 baseWP = re.split('_',name)
0136 if "looseSieie" in baseWP[-1]:
0137 baseWP.pop()
0138 WPs["_".join(baseWP)]["sigmaIEtaIEta"] = [0.015,0.035]
0139
0140 return WPs["_".join(baseWP)]
0141
0142
0143 def etaRegionID(self):
0144
0145 if abs(self.physObj.eta())<1.479 :
0146 idForBarrel = 0
0147 else:
0148 idForBarrel = 1
0149 return idForBarrel
0150
0151 def calScaledIsoValueLin(self,offset,slope):
0152 return slope*self.pt()+offset
0153
0154 def calScaledIsoValueQuadr(self,offset,term_1,term_2):
0155 return offset + term_1*self.pt() + term_2*pow(self.pt(),2)
0156
0157 def calScaledIsoValueExp(self,offset,slope_exp,offset_exp):
0158 return offset + exp(slope_exp*self.pt()+offset_exp)
0159
0160 def passPhotonID(self,name,conversionSafe_eleVeto=False):
0161
0162 idForBarrel = self.etaRegionID()
0163 passPhotonID = True
0164
0165 if self.CutBasedIDWP(name)["conversionVeto"][idForBarrel]:
0166 if (conversionSafe_eleVeto==False and self.physObj.hasPixelSeed()) or (conversionSafe_eleVeto==True and self.physObj.passElectronVeto()==False):
0167 passPhotonID = False
0168
0169 if self.CutBasedIDWP(name)["H/E"][idForBarrel] < self.hOVERe():
0170 passPhotonID = False
0171
0172 if self.CutBasedIDWP(name)["sigmaIEtaIEta"][idForBarrel] < self.full5x5_sigmaIetaIeta():
0173 passPhotonID = False
0174
0175 return passPhotonID
0176
0177 def passPhotonIso(self,name,isocorr):
0178
0179 idForBarrel = self.etaRegionID()
0180 passPhotonIso = True
0181
0182 if self.CutBasedIDWP(name)["chaHadIso"][idForBarrel] < self.chargedHadronIso(isocorr):
0183 passPhotonIso = False
0184
0185 if "POG_PHYS14_25ns" in name and idForBarrel == 0:
0186 if self.calScaledIsoValueExp(*self.CutBasedIDWP(name)["neuHadIso"][idForBarrel]) < self.neutralHadronIso(isocorr):
0187 passPhotonIso = False
0188 elif "POG_SPRING15_50ns" in name:
0189 if self.calScaledIsoValueExp(*self.CutBasedIDWP(name)["neuHadIso"][idForBarrel]) < self.neutralHadronIso(isocorr):
0190 passPhotonIso = False
0191 elif "POG_SPRING15_25ns" in name:
0192 if self.calScaledIsoValueQuadr(*self.CutBasedIDWP(name)["neuHadIso"][idForBarrel]) < self.neutralHadronIso(isocorr):
0193 passPhotonIso = False
0194 else:
0195 if self.calScaledIsoValueLin(*self.CutBasedIDWP(name)["neuHadIso"][idForBarrel]) < self.neutralHadronIso(isocorr):
0196 passPhotonIso = False
0197
0198 if self.calScaledIsoValueLin(*self.CutBasedIDWP(name)["phoIso"][idForBarrel]) < self.photonIso(isocorr):
0199 passPhotonIso = False
0200
0201 return passPhotonIso
0202
0203 pass
0204
0205 setattr(ROOT.pat.Photon, "recoPhotonIso", ROOT.reco.Photon.photonIso)
0206 setattr(ROOT.pat.Photon, "recoNeutralHadronIso", ROOT.reco.Photon.neutralHadronIso)
0207 setattr(ROOT.pat.Photon, "recoChargedHadronIso", ROOT.reco.Photon.chargedHadronIso)