File indexing completed on 2024-04-06 12:23:27
0001 from PhysicsTools.Heppy.physicsobjects.PhysicsObject import *
0002 import ROOT
0003
0004 class Lepton( PhysicsObject):
0005 def ip3D(self):
0006 '''3D impact parameter value.'''
0007 return abs(self.dB(self.PV3D))
0008
0009 def sip3D(self):
0010 '''3D impact parameter significance.'''
0011 db, edb = self.dB(self.PV3D), self.edB(self.PV3D)
0012 return abs(db/edb) if edb > 0 else 999.
0013
0014 def absIsoFromEA(self, area='04'):
0015 '''Calculate Isolation using the effective area approach.'''
0016 photonIso = self.photonIso()
0017 offset = self.rho*getattr(self,"EffectiveArea"+area)
0018 return self.chargedHadronIso()+max(0.,photonIso+self.neutralHadronIso()-offset)
0019
0020 def relIsoFromEA(self, area='04'):
0021 return self.absIsoFromEA(area)/self.pt()
0022
0023 def relIso(self, dBetaFactor=0, allCharged=0):
0024 '''Relative isolation with default cone size of 0.4.'''
0025 rel = self.absIsoR(dBetaFactor=dBetaFactor, allCharged=allCharged)/self.pt()
0026 return rel
0027
0028 def absIsoR(self, R=0.4, dBetaFactor=0, allCharged=False):
0029 '''Isolation in given cone with optional delta-beta subtraction.'''
0030 if dBetaFactor>0 and self.puChargedHadronIsoR(R)<0:
0031 raise ValueError('If you want to use dbeta corrections, you must make sure that the pu charged hadron iso is available. This should never happen')
0032 neutralIso = self.neutralHadronIsoR(R) + self.photonIsoR(R)
0033 corNeutralIso = neutralIso - dBetaFactor * self.puChargedHadronIsoR(R)
0034 charged = self.chargedHadronIsoR(R)
0035 if allCharged:
0036 charged = self.chargedAllIsoR(R)
0037 return charged + max(corNeutralIso, 0.)
0038
0039 def relIsoR(self, R=0.4, dBetaFactor=0, allCharged=False):
0040 return self.absIsoR(R, dBetaFactor, allCharged)/self.pt()
0041
0042 def lostInner(self):
0043 if hasattr(self.innerTrack(),"trackerExpectedHitsInner") :
0044 return self.innerTrack().trackerExpectedHitsInner().numberOfLostHits()
0045 else :
0046 return self.innerTrack().hitPattern().numberOfLostHits(ROOT.reco.HitPattern.MISSING_INNER_HITS)
0047
0048 def p4WithFSR(self):
0049 ret = self.p4()
0050 for p in getattr(self, 'ownFsrPhotons', getattr(self, 'fsrPhotons', [])):
0051 ret += p.p4()
0052 return ret
0053
0054 def __str__(self):
0055 ptc = super(Lepton, self).__str__()
0056 return '{ptc}, iso={iso:5.2f}'.format(ptc=ptc, iso=self.relIso())