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