File indexing completed on 2024-11-25 02:29:49
0001 import operator
0002 import itertools
0003 import copy
0004 import types
0005
0006 from ROOT import TLorentzVector
0007
0008 from PhysicsTools.Heppy.analyzers.core.Analyzer import Analyzer
0009 from PhysicsTools.HeppyCore.framework.event import Event
0010 from PhysicsTools.HeppyCore.statistics.counter import Counter, Counters
0011 from PhysicsTools.Heppy.analyzers.core.AutoHandle import AutoHandle
0012 from PhysicsTools.Heppy.physicsobjects.Lepton import Lepton
0013 from PhysicsTools.Heppy.physicsobjects.Tau import Tau
0014 from PhysicsTools.Heppy.physicsobjects.IsoTrack import IsoTrack
0015
0016 from PhysicsTools.HeppyCore.utils.deltar import deltaR, deltaPhi, bestMatch , matchObjectCollection3
0017
0018 import PhysicsTools.HeppyCore.framework.config as cfg
0019
0020 from ROOT import heppy
0021
0022
0023
0024
0025 def mtw(x1,x2):
0026 import math
0027 return math.sqrt(2*x1.pt()*x2.pt()*(1-math.cos(x1.phi()-x2.phi())))
0028
0029 def makeNearestLeptons(leptons,track, event):
0030
0031 minDeltaR = 99999
0032
0033 nearestLepton = []
0034 ibest=-1
0035 for i,lepton in enumerate(leptons):
0036 minDeltaRtemp=deltaR(lepton.eta(),lepton.phi(),track.eta(),track.phi())
0037 if minDeltaRtemp < minDeltaR:
0038 minDeltaR = minDeltaRtemp
0039 ibest=i
0040
0041 if len(leptons) > 0 and ibest!=-1:
0042 nearestLepton.append(leptons[ibest])
0043
0044 return nearestLepton
0045
0046 class IsoTrackAnalyzer( Analyzer ):
0047
0048 def __init__(self, cfg_ana, cfg_comp, looperName ):
0049 super(IsoTrackAnalyzer,self).__init__(cfg_ana,cfg_comp,looperName)
0050 self.IsoTrackIsolationComputer = heppy.IsolationComputer()
0051
0052 self.doIsoAnnulus = getattr(cfg_ana, 'doIsoAnnulus', False)
0053
0054
0055
0056
0057
0058 def declareHandles(self):
0059 super(IsoTrackAnalyzer, self).declareHandles()
0060 self.handles['met'] = AutoHandle( 'slimmedMETs', 'std::vector<pat::MET>' )
0061 self.handles['packedCandidates'] = AutoHandle( 'packedPFCandidates', 'std::vector<pat::PackedCandidate>')
0062
0063 def beginLoop(self, setup):
0064 super(IsoTrackAnalyzer,self).beginLoop(setup)
0065 self.counters.addCounter('events')
0066 count = self.counters.counter('events')
0067 count.register('all events')
0068 count.register('has >=1 selected Track')
0069 count.register('has >=1 selected Iso Track')
0070
0071
0072
0073
0074 def makeIsoTrack(self, event):
0075
0076 event.selectedIsoTrack = []
0077 event.selectedIsoCleanTrack = []
0078
0079
0080 patcands = self.handles['packedCandidates'].product()
0081
0082 charged = [ p for p in patcands if ( p.charge() != 0 and p.fromPV() > 1 ) ]
0083
0084 self.IsoTrackIsolationComputer.setPackedCandidates(patcands, 1, 9999, 9999.)
0085
0086
0087 alltrack = map( IsoTrack, charged )
0088
0089
0090 for track in alltrack:
0091
0092 if ( abs(track.dz()) > self.cfg_ana.dzMax ): continue
0093 if ( (abs(track.pdgId())!=11) and (abs(track.pdgId())!=13) and (track.pt() < self.cfg_ana.ptMin) ): continue
0094 if ( track.pt() < self.cfg_ana.ptMinEMU ): continue
0095
0096 foundNonIsoTrack = False
0097
0098
0099 if( (self.cfg_ana.doSecondVeto) and len(event.selectedLeptons)>0) :
0100 if( deltaR(event.selectedLeptons[0].eta(), event.selectedLeptons[0].phi(), track.eta(), track.phi()) <0.01) : continue
0101 if ( (abs(track.pdgId())!=11) and (abs(track.pdgId())!=13) and (track.charge()*event.selectedLeptons[0].charge()) ): continue
0102
0103
0104
0105 track.associatedVertex = event.goodVertices[0] if len(event.goodVertices)>0 else event.vertices[0]
0106
0107
0108
0109 isoSum = self.IsoTrackIsolationComputer.chargedAbsIso(track.physObj, self.cfg_ana.isoDR, 0., self.cfg_ana.ptPartMin)
0110 if( abs(track.pdgId())==211 ): isoSum = isoSum - track.pt()
0111
0112 if self.cfg_ana.doRelIsolation:
0113 relIso = (isoSum)/track.pt()
0114 if ( (abs(track.pdgId())!=11) and (abs(track.pdgId())!=13) and (relIso > self.cfg_ana.MaxIsoSum) ): continue
0115 elif((relIso > self.cfg_ana.MaxIsoSumEMU)): continue
0116 else:
0117 if(isoSum > (self.cfg_ana.maxAbsIso)): continue
0118
0119 if self.doIsoAnnulus:
0120 self.attachIsoAnnulus04(track)
0121
0122 track.absIso = isoSum
0123
0124
0125
0126
0127
0128 if self.cfg_ana.doRelIsolation or (track.absIso < min(0.2*track.pt(), self.cfg_ana.maxAbsIso)):
0129 event.selectedIsoTrack.append(track)
0130
0131 if self.cfg_ana.doPrune:
0132 myMet = self.handles['met'].product()[0]
0133 mtwIsoTrack = mtw(track, myMet)
0134 if mtwIsoTrack < 100:
0135 if abs(track.pdgId()) == 11 or abs(track.pdgId()) == 13:
0136 if track.pt()>5 and track.absIso/track.pt()<0.2:
0137
0138 myLeptons = [ l for l in event.selectedLeptons if l.pt() > 10 ]
0139 nearestSelectedLeptons = makeNearestLeptons(myLeptons,track, event)
0140 if len(nearestSelectedLeptons) > 0:
0141 for lep in nearestSelectedLeptons:
0142 if deltaR(lep.eta(), lep.phi(), track.eta(), track.phi()) > 0.01:
0143 event.selectedIsoCleanTrack.append(track)
0144 else:
0145 event.selectedIsoCleanTrack.append(track)
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219
0220
0221
0222
0223
0224
0225 event.selectedIsoTrack.sort(key = lambda l : l.pt(), reverse = True)
0226 event.selectedIsoCleanTrack.sort(key = lambda l : l.pt(), reverse = True)
0227
0228 self.counters.counter('events').inc('all events')
0229
0230 if(len(event.selectedIsoTrack)): self.counters.counter('events').inc('has >=1 selected Iso Track')
0231
0232
0233 def attachIsoAnnulus04(self, mu):
0234 mu.absIsoAnCharged = self.IsoTrackIsolationComputer.chargedAbsIso (mu.physObj, 0.4, self.cfg_ana.isoDR, 0.0,self.IsoTrackIsolationComputer.selfVetoNone)
0235 mu.absIsoAnPho = self.IsoTrackIsolationComputer.photonAbsIsoRaw (mu.physObj, 0.4, self.cfg_ana.isoDR, 0.0,self.IsoTrackIsolationComputer.selfVetoNone)
0236 mu.absIsoAnNHad = self.IsoTrackIsolationComputer.neutralHadAbsIsoRaw(mu.physObj, 0.4, self.cfg_ana.isoDR, 0.0,self.IsoTrackIsolationComputer.selfVetoNone)
0237 mu.absIsoAnPU = self.IsoTrackIsolationComputer.puAbsIso (mu.physObj, 0.4, self.cfg_ana.isoDR, 0.0,self.IsoTrackIsolationComputer.selfVetoNone)
0238 mu.absIsoAnNeutral = max(0.0, mu.absIsoAnPho + mu.absIsoAnNHad - 0.5*mu.absIsoAnPU)
0239
0240 mu.absIsoAn04 = mu.absIsoAnCharged + mu.absIsoAnNeutral
0241 mu.relIsoAn04 = mu.absIsoAn04/mu.pt()
0242
0243
0244 def matchIsoTrack(self, event):
0245 matchTau = matchObjectCollection3(event.selectedIsoTrack, event.gentaus + event.gentauleps + event.genleps, deltaRMax = 0.5)
0246 for lep in event.selectedIsoTrack:
0247 gen = matchTau[lep]
0248 lep.mcMatchId = 1 if gen else 0
0249
0250
0251 def printInfo(self, event):
0252 print('event to Veto')
0253 print('----------------')
0254
0255 if len(event.selectedIsoTrack)>0:
0256 print('lenght: ',len(event.selectedIsoTrack))
0257 print('track candidate pt: ',event.selectedIsoTrack[0].pt())
0258 print('track candidate eta: ',event.selectedIsoTrack[0].eta())
0259 print('track candidate phi: ',event.selectedIsoTrack[0].phi())
0260 print('track candidate mass: ',event.selectedIsoTrack[0].mass())
0261 print('pdgId candidate : ',event.selectedIsoTrack[0].pdgId())
0262 print('dz: ',event.selectedIsoTrack[0].dz())
0263 print('iso: ',event.selectedIsoTrack[0].absIso)
0264 print('matchId: ',event.selectedIsoTrack[0].mcMatchId)
0265
0266
0267
0268
0269
0270
0271
0272
0273
0274 print('----------------')
0275
0276
0277 def process(self, event):
0278
0279 if self.cfg_ana.setOff:
0280 return True
0281
0282 self.readCollections( event.input )
0283 self.makeIsoTrack(event)
0284
0285 if len(event.selectedIsoTrack)==0 : return True
0286
0287
0288
0289
0290
0291
0292
0293 if not self.cfg_comp.isMC:
0294 return True
0295
0296 if hasattr(event, 'gentaus') and hasattr(event, 'gentauleps') and hasattr(event, 'genleps') and self.cfg_ana.do_mc_match :
0297 self.matchIsoTrack(event)
0298
0299
0300
0301
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311
0312 return True
0313
0314
0315 setattr(IsoTrackAnalyzer,"defaultConfig",cfg.Analyzer(
0316 class_object=IsoTrackAnalyzer,
0317 setOff=True,
0318
0319 candidates='packedPFCandidates',
0320 candidatesTypes='std::vector<pat::PackedCandidate>',
0321 ptMin = 5,
0322 ptMinEMU = 5,
0323 dzMax = 0.1,
0324
0325 isoDR = 0.3,
0326 ptPartMin = 0,
0327 dzPartMax = 0.1,
0328 maxAbsIso = 8,
0329
0330 doRelIsolation = False,
0331 MaxIsoSum = 0.1,
0332 MaxIsoSumEMU = 0.2,
0333 doSecondVeto = False,
0334
0335 doIsoAnnulus= False,
0336
0337 doPrune = True,
0338 do_mc_match = True,
0339 )
0340 )