File indexing completed on 2024-04-06 12:23:26
0001 from builtins import range
0002 import operator
0003 import itertools
0004 import copy
0005 from math import *
0006
0007 from ROOT import std
0008 from ROOT import TLorentzVector, TVectorD
0009
0010 from PhysicsTools.Heppy.analyzers.core.Analyzer import Analyzer
0011 from PhysicsTools.HeppyCore.framework.event import Event
0012 from PhysicsTools.HeppyCore.statistics.counter import Counter, Counters
0013 from PhysicsTools.Heppy.analyzers.core.AutoHandle import AutoHandle
0014
0015 import PhysicsTools.HeppyCore.framework.config as cfg
0016
0017 from PhysicsTools.HeppyCore.utils.deltar import deltaR
0018
0019 from ROOT.heppy import Hemisphere
0020 from ROOT.heppy import ReclusterJets
0021
0022 from ROOT.heppy import Davismt2
0023 davismt2 = Davismt2()
0024
0025 from ROOT.heppy import mt2w_bisect
0026 mt2wSNT = mt2w_bisect.mt2w()
0027
0028 import ROOT
0029
0030 import os
0031
0032
0033 class MT2Analyzer( Analyzer ):
0034 def __init__(self, cfg_ana, cfg_comp, looperName ):
0035 super(MT2Analyzer,self).__init__(cfg_ana,cfg_comp,looperName)
0036 self.jetPt = cfg_ana.jetPt
0037
0038 def declareHandles(self):
0039 super(MT2Analyzer, self).declareHandles()
0040
0041 self.handles['genJets'] = AutoHandle( 'slimmedGenJets','std::vector<reco::GenJet>')
0042 self.handles['met'] = AutoHandle( self.cfg_ana.metCollection, 'std::vector<pat::MET>' )
0043
0044 def beginLoop(self, setup):
0045 super(MT2Analyzer,self).beginLoop(setup)
0046 self.counters.addCounter('pairs')
0047 count = self.counters.counter('pairs')
0048 count.register('all events')
0049
0050 def computeMT2(self, visaVec, visbVec, metVec):
0051
0052 import array
0053 import numpy
0054
0055 metVector = array.array('d',[0.,metVec.px(), metVec.py()])
0056 visaVector = array.array('d',[0.,visaVec.px(), visaVec.py()])
0057 visbVector = array.array('d',[0.,visbVec.px(), visbVec.py()])
0058
0059 davismt2.set_momenta(visaVector,visbVector,metVector);
0060 davismt2.set_mn(0);
0061
0062 return davismt2.get_mt2()
0063
0064 def getMT2AKT(self, event, TMPobjects40jc, met , collectionPostFix, postFix):
0065
0066
0067 if len(TMPobjects40jc)>=2:
0068
0069 objects = ROOT.std.vector(ROOT.reco.Particle.LorentzVector)()
0070 for jet in TMPobjects40jc:
0071 objects.push_back(jet.p4())
0072
0073 hemisphereViaKt = ReclusterJets(objects, 1.,50.0)
0074 groupingViaKt=hemisphereViaKt.getGroupingExclusive(2)
0075
0076 if len(groupingViaKt)>=2:
0077 setattr(event, "pseudoViaKtJet1"+collectionPostFix+postFix, ROOT.reco.Particle.LorentzVector(groupingViaKt[0]) )
0078 setattr(event, "pseudoViaKtJet2"+collectionPostFix+postFix, ROOT.reco.Particle.LorentzVector(groupingViaKt[1]) )
0079 setattr(event, "mt2ViaAKt"+collectionPostFix+postFix, self.computeMT2(getattr(event,'pseudoViaKtJet1'+collectionPostFix+postFix), getattr(event,'pseudoViaKtJet2'+collectionPostFix+postFix), met) )
0080 return self.computeMT2(getattr(event,'pseudoViaKtJet1'+collectionPostFix+postFix), getattr(event,'pseudoViaKtJet2'+collectionPostFix+postFix), met)
0081
0082 if not self.cfg_ana.doOnlyDefault:
0083 hemisphereViaAKt = ReclusterJets(objects, -1.,50.0)
0084 groupingViaAKt=hemisphereViaAKt.getGroupingExclusive(2)
0085
0086 if len(groupingViaAKt)>=2:
0087 setattr(event, "pseudoViaAKtJet1"+collectionPostFix+postFix, ROOT.reco.Particle.LorentzVector(groupingViaAKt[0]) )
0088 setattr(event, "pseudoViaAKtJet2"+collectionPostFix+postFix, ROOT.reco.Particle.LorentzVector(groupingViaAKt[1]) )
0089 setattr(event, "mt2ViaAKt"+collectionPostFix+postFix, self.computeMT2(getattr(event,'pseudoViaAKtJet1'+collectionPostFix+postFix), getattr(event,'pseudoViaAKtJet2'+collectionPostFix+postFix), met) )
0090 return self.computeMT2(getattr(event,'pseudoViaAKtJet1'+collectionPostFix+postFix), getattr(event,'pseudoViaAKtJet2'+collectionPostFix+postFix), met)
0091
0092 def getMT2Hemi(self, event, TMPobjects40jc, met, collectionPostFix, postFix):
0093
0094 if len(TMPobjects40jc)>=2:
0095
0096 pxvec = ROOT.std.vector(float)()
0097 pyvec = ROOT.std.vector(float)()
0098 pzvec = ROOT.std.vector(float)()
0099 Evec = ROOT.std.vector(float)()
0100 grouping = ROOT.std.vector(int)()
0101
0102 for jet in TMPobjects40jc:
0103 pxvec.push_back(jet.px())
0104 pyvec.push_back(jet.py())
0105 pzvec.push_back(jet.pz())
0106 Evec.push_back(jet.energy())
0107
0108 hemisphere = Hemisphere(pxvec, pyvec, pzvec, Evec, 2, 3)
0109 grouping=hemisphere.getGrouping()
0110
0111 pseudoJet1px = 0
0112 pseudoJet1py = 0
0113 pseudoJet1pz = 0
0114 pseudoJet1energy = 0
0115 multPSJ1 = 0
0116
0117 pseudoJet2px = 0
0118 pseudoJet2py = 0
0119 pseudoJet2pz = 0
0120 pseudoJet2energy = 0
0121 multPSJ2 = 0
0122
0123 for index in range(0, len(pxvec)):
0124 if(grouping[index]==1):
0125 pseudoJet1px += pxvec[index]
0126 pseudoJet1py += pyvec[index]
0127 pseudoJet1pz += pzvec[index]
0128 pseudoJet1energy += Evec[index]
0129 multPSJ1 += 1
0130 if(grouping[index]==2):
0131 pseudoJet2px += pxvec[index]
0132 pseudoJet2py += pyvec[index]
0133 pseudoJet2pz += pzvec[index]
0134 pseudoJet2energy += Evec[index]
0135 multPSJ2 += 1
0136
0137 pseudoJet1pt2 = pseudoJet1px*pseudoJet1px + pseudoJet1py*pseudoJet1py
0138 pseudoJet2pt2 = pseudoJet2px*pseudoJet2px + pseudoJet2py*pseudoJet2py
0139
0140 if pseudoJet1pt2 >= pseudoJet2pt2:
0141 setattr(event, "pseudoJet1"+collectionPostFix+postFix, ROOT.reco.Particle.LorentzVector( pseudoJet1px, pseudoJet1py, pseudoJet1pz, pseudoJet1energy ))
0142 setattr(event, "pseudoJet2"+collectionPostFix+postFix, ROOT.reco.Particle.LorentzVector( pseudoJet2px, pseudoJet2py, pseudoJet2pz, pseudoJet2energy ))
0143 setattr(event, "multPseudoJet1"+collectionPostFix+postFix, multPSJ1 )
0144 setattr(event, "multPseudoJet2"+collectionPostFix+postFix, multPSJ2 )
0145 else:
0146 setattr(event, "pseudoJet2"+collectionPostFix+postFix, ROOT.reco.Particle.LorentzVector( pseudoJet1px, pseudoJet1py, pseudoJet1pz, pseudoJet1energy ))
0147 setattr(event, "pseudoJet1"+collectionPostFix+postFix, ROOT.reco.Particle.LorentzVector( pseudoJet2px, pseudoJet2py, pseudoJet2pz, pseudoJet2energy ))
0148 setattr(event, "multPseudoJet1"+collectionPostFix+postFix, multPSJ2 )
0149 setattr(event, "multPseudoJet2"+collectionPostFix+postFix, multPSJ1 )
0150
0151 setattr(event, "mt2"+collectionPostFix+postFix, self.computeMT2(getattr(event,'pseudoJet1'+collectionPostFix+postFix), getattr(event,'pseudoJet2'+collectionPostFix+postFix), met) )
0152 return self.computeMT2(getattr(event,'pseudoJet1'+collectionPostFix+postFix), getattr(event,'pseudoJet2'+collectionPostFix+postFix), met)
0153
0154
0155 def makeMT2(self, event):
0156
0157
0158
0159 self.met = ROOT.pat.MET(self.handles['met'].product()[0])
0160
0161 import array
0162 import numpy
0163
0164 objects40jc = [ j for j in event.cleanJets if j.pt() > 40 and abs(j.eta())<2.5 ]
0165 objectsXjc = [ j for j in event.cleanJets if j.pt() > self.jetPt and abs(j.eta())<2.5 ]
0166
0167 setattr(event, "mt2ViaKt"+self.cfg_ana.collectionPostFix+"had", -999)
0168 setattr(event, "mt2ViaKt"+self.cfg_ana.collectionPostFix+"_Xj_had", -999)
0169 setattr(event, "pseudoViaKtJet1"+self.cfg_ana.collectionPostFix+"_had", ROOT.reco.Particle.LorentzVector( 0, 0, 0, 0 ))
0170 setattr(event, "pseudoViaKtJet2"+self.cfg_ana.collectionPostFix+"_had", ROOT.reco.Particle.LorentzVector( 0, 0, 0, 0 ))
0171 setattr(event, "pseudoViaKtJet1"+self.cfg_ana.collectionPostFix+"_Xj_had", ROOT.reco.Particle.LorentzVector( 0, 0, 0, 0 ))
0172 setattr(event, "pseudoViaKtJet2"+self.cfg_ana.collectionPostFix+"_Xj_had", ROOT.reco.Particle.LorentzVector( 0, 0, 0, 0 ))
0173
0174 setattr(event, "mt2ViaAKt"+self.cfg_ana.collectionPostFix+"had", -999)
0175 setattr(event, "mt2ViaAKt"+self.cfg_ana.collectionPostFix+"_Xj_had", -999)
0176 setattr(event, "pseudoViaAKtJet1"+self.cfg_ana.collectionPostFix+"_had", ROOT.reco.Particle.LorentzVector( 0, 0, 0, 0 ))
0177 setattr(event, "pseudoViaAKtJet2"+self.cfg_ana.collectionPostFix+"_had", ROOT.reco.Particle.LorentzVector( 0, 0, 0, 0 ))
0178 setattr(event, "pseudoViaAKtJet1"+self.cfg_ana.collectionPostFix+"_Xj_had", ROOT.reco.Particle.LorentzVector( 0, 0, 0, 0 ))
0179 setattr(event, "pseudoViaAKtJet2"+self.cfg_ana.collectionPostFix+"_Xj_had", ROOT.reco.Particle.LorentzVector( 0, 0, 0, 0 ))
0180
0181
0182 if len(objects40jc)>=2:
0183
0184 self.mt2ViaKt_had=self.getMT2AKT(event, objects40jc, self.met, self.cfg_ana.collectionPostFix, "_had")
0185
0186 if len(objectsXjc)>=2:
0187
0188 self.mt2ViaKt_Xj_had=self.getMT2AKT(event, objectsXjc, self.met, self.cfg_ana.collectionPostFix, "_Xj_had")
0189
0190
0191
0192
0193 setattr(event, "mt2"+self.cfg_ana.collectionPostFix+"_had", -999)
0194 setattr(event, "mt2"+self.cfg_ana.collectionPostFix+"_Xj_had", -999)
0195
0196 setattr(event, "pseudoJet1"+self.cfg_ana.collectionPostFix+"_had", ROOT.reco.Particle.LorentzVector( 0, 0, 0, 0 ))
0197 setattr(event, "pseudoJet2"+self.cfg_ana.collectionPostFix+"_had", ROOT.reco.Particle.LorentzVector( 0, 0, 0, 0 ))
0198 setattr(event, "pseudoJet1"+self.cfg_ana.collectionPostFix+"_Xj_had", ROOT.reco.Particle.LorentzVector( 0, 0, 0, 0 ))
0199 setattr(event, "pseudoJet2"+self.cfg_ana.collectionPostFix+"_Xj_had", ROOT.reco.Particle.LorentzVector( 0, 0, 0, 0 ))
0200
0201 if len(objects40jc)>=2:
0202
0203 self.mt2_had = self.getMT2Hemi(event,objects40jc, self.met, self.cfg_ana.collectionPostFix, "_had")
0204
0205 if len(objectsXjc)>=2:
0206
0207 self.mt2_Xj_had = self.getMT2Hemi(event,objectsXjc, self.met, self.cfg_ana.collectionPostFix, "_Xj_had")
0208
0209
0210
0211 setattr(event, "mt2"+self.cfg_ana.collectionPostFix+"_gen", -999)
0212 setattr(event, "mt2"+self.cfg_ana.collectionPostFix+"_Xj_gen", -999)
0213
0214 if self.cfg_comp.isMC and self.met.genMET():
0215 allGenJets = [ x for x in self.handles['genJets'].product() ]
0216 objects40jc_Gen = [ j for j in allGenJets if j.pt() > 40 and abs(j.eta())<2.5 ]
0217 objectsXjc_Gen = [ j for j in allGenJets if j.pt() > self.jetPt and abs(j.eta())<2.5 ]
0218
0219 if len(objects40jc_Gen)>=2:
0220 self.mt2_gen = self.getMT2Hemi(event,objects40jc_Gen, self.met.genMET(), self.cfg_ana.collectionPostFix, "_gen")
0221
0222 if len(objectsXjc_Gen)>=2:
0223 self.mt2_Xj_gen = self.getMT2Hemi(event,objectsXjc_Gen, self.met.genMET(), self.cfg_ana.collectionPostFix, "_Xj_gen")
0224
0225 else:
0226 self.mt2_gen = -999.
0227
0228
0229
0230
0231 objects10lc = [ l for l in event.selectedLeptons if l.pt() > 10 and abs(l.eta())<2.5 ]
0232 if hasattr(event, 'selectedIsoCleanTrack'):
0233 objects10lc = [ l for l in event.selectedLeptons if l.pt() > 10 and abs(l.eta())<2.5 ] + [ t for t in event.selectedIsoCleanTrack ]
0234
0235 objects40j10lc = objects40jc + objects10lc
0236 objects40j10lc.sort(key = lambda obj : obj.pt(), reverse = True)
0237
0238 objectsXj10lc = objectsXjc + objects10lc
0239 objectsXj10lc.sort(key = lambda obj : obj.pt(), reverse = True)
0240
0241 setattr(event, "mt2"+self.cfg_ana.collectionPostFix+"", -999)
0242 setattr(event, "mt2"+self.cfg_ana.collectionPostFix+"_Xj", -999)
0243
0244 setattr(event, "pseudoJet1"+self.cfg_ana.collectionPostFix+"", ROOT.reco.Particle.LorentzVector( 0, 0, 0, 0 ))
0245 setattr(event, "pseudoJet2"+self.cfg_ana.collectionPostFix+"", ROOT.reco.Particle.LorentzVector( 0, 0, 0, 0 ))
0246 setattr(event, "pseudoJet1"+self.cfg_ana.collectionPostFix+"_Xj", ROOT.reco.Particle.LorentzVector( 0, 0, 0, 0 ))
0247 setattr(event, "pseudoJet2"+self.cfg_ana.collectionPostFix+"_Xj", ROOT.reco.Particle.LorentzVector( 0, 0, 0, 0 ))
0248
0249 if len(objects40j10lc)>=2:
0250
0251 self.mt2 = self.getMT2Hemi(event,objects40j10lc,self.met,self.cfg_ana.collectionPostFix,"")
0252
0253 if len(objectsXj10lc)>=2:
0254
0255 self.mt2_Xj = self.getMT2Hemi(event,objectsXj10lc,self.met,self.cfg_ana.collectionPostFix,"_Xj")
0256
0257
0258
0259 setattr(event, "mt2"+self.cfg_ana.collectionPostFix+"_gamma", -999)
0260
0261 setattr(event, "pseudoJet1"+self.cfg_ana.collectionPostFix+"_gamma", ROOT.reco.Particle.LorentzVector( 0, 0, 0, 0 ))
0262 setattr(event, "pseudoJet2"+self.cfg_ana.collectionPostFix+"_gamma", ROOT.reco.Particle.LorentzVector( 0, 0, 0, 0 ))
0263
0264 if hasattr(event, 'gamma_met'):
0265
0266 gamma_objects40jc = [ j for j in event.gamma_cleanJets if j.pt() > 40 and abs(j.eta())<2.5 ]
0267
0268 gamma_objects40j10lc = gamma_objects40jc + objects10lc
0269
0270 gamma_objects40j10lc.sort(key = lambda obj : obj.pt(), reverse = True)
0271
0272
0273 if len(gamma_objects40jc)>=2:
0274
0275 self.gamma_mt2 = self.getMT2Hemi(event,gamma_objects40jc,event.gamma_met,self.cfg_ana.collectionPostFix,"_gamma")
0276
0277 setattr(event, "mt2"+self.cfg_ana.collectionPostFix+"_Xj_gamma", -999)
0278 setattr(event, "pseudoJet1"+self.cfg_ana.collectionPostFix+"_Xj_gamma", ROOT.reco.Particle.LorentzVector( 0, 0, 0, 0 ))
0279 setattr(event, "pseudoJet2"+self.cfg_ana.collectionPostFix+"_Xj_gamma", ROOT.reco.Particle.LorentzVector( 0, 0, 0, 0 ))
0280
0281 if hasattr(event, 'gamma_met'):
0282
0283 gamma_objectsXjc = [ j for j in event.gamma_cleanJets if j.pt() > self.jetPt and abs(j.eta())<2.5 ]
0284
0285 gamma_objectsXj10lc = gamma_objectsXjc + objects10lc
0286
0287 gamma_objectsXj10lc.sort(key = lambda obj : obj.pt(), reverse = True)
0288
0289 if len(gamma_objectsXjc)>=2:
0290
0291 self.gamma_mt2_Xj = self.getMT2Hemi(event,gamma_objectsXjc,event.gamma_met,self.cfg_ana.collectionPostFix,"_Xj_gamma")
0292
0293
0294
0295
0296
0297 setattr(event, "mt2"+self.cfg_ana.collectionPostFix+"_zll", -999)
0298 setattr(event, "pseudoJet1"+self.cfg_ana.collectionPostFix+"_zll", ROOT.reco.Particle.LorentzVector( 0, 0, 0, 0 ))
0299 setattr(event, "pseudoJet2"+self.cfg_ana.collectionPostFix+"_zll", ROOT.reco.Particle.LorentzVector( 0, 0, 0, 0 ))
0300
0301 if hasattr(event, 'zll_met'):
0302
0303 csLeptons = [ l for l in event.selectedLeptons if l.pt() > 10 and abs(l.eta()) < 2.5 ]
0304
0305 if len(csLeptons)==2 and len(objects40jc)>=2:
0306
0307 self.zll_mt2 = self.getMT2Hemi(event,objects40jc,event.zll_met,self.cfg_ana.collectionPostFix,"_zll")
0308
0309 setattr(event, "mt2"+self.cfg_ana.collectionPostFix+"_Xj_zll", -999)
0310 setattr(event, "pseudoJet1"+self.cfg_ana.collectionPostFix+"_Xj_zll", ROOT.reco.Particle.LorentzVector( 0, 0, 0, 0 ))
0311 setattr(event, "pseudoJet2"+self.cfg_ana.collectionPostFix+"_Xj_zll", ROOT.reco.Particle.LorentzVector( 0, 0, 0, 0 ))
0312
0313 if hasattr(event, 'zll_met'):
0314
0315 csLeptons = [ l for l in event.selectedLeptons if l.pt() > 10 and abs(l.eta()) < 2.5 ]
0316
0317 if len(csLeptons)==2 and len(objectsXjc)>=2:
0318
0319 self.zll_mt2_Xj = self.getMT2Hemi(event,objectsXjc,event.zll_met,self.cfg_ana.collectionPostFix,"_Xj_zll")
0320
0321
0322
0323
0324
0325
0326
0327
0328
0329
0330
0331
0332
0333
0334
0335
0336
0337
0338
0339
0340
0341
0342
0343
0344
0345
0346
0347
0348
0349
0350 setattr(event, "mt2"+self.cfg_ana.collectionPostFix+"_rl", -999)
0351 setattr(event, "pseudoJet1"+self.cfg_ana.collectionPostFix+"_rl", ROOT.reco.Particle.LorentzVector( 0, 0, 0, 0 ))
0352 setattr(event, "pseudoJet2"+self.cfg_ana.collectionPostFix+"_rl", ROOT.reco.Particle.LorentzVector( 0, 0, 0, 0 ))
0353
0354 if hasattr(event, 'rl_met'):
0355
0356 csLeptons = [ l for l in event.selectedLeptons if l.pt() > 10 and abs(l.eta()) < 2.5 ]
0357
0358 if len(csLeptons)==1 and len(objects40jc)>=2:
0359
0360 self.rl_mt2 = self.getMT2Hemi(event,objects40jc,event.rl_met,self.cfg_ana.collectionPostFix,"_rl")
0361
0362 setattr(event, "mt2"+self.cfg_ana.collectionPostFix+"_Xj_rl", -999)
0363 setattr(event, "pseudoJet1"+self.cfg_ana.collectionPostFix+"_Xj_rl", ROOT.reco.Particle.LorentzVector( 0, 0, 0, 0 ))
0364 setattr(event, "pseudoJet2"+self.cfg_ana.collectionPostFix+"_Xj_rl", ROOT.reco.Particle.LorentzVector( 0, 0, 0, 0 ))
0365
0366 if hasattr(event, 'rl_met'):
0367
0368 csLeptons = [ l for l in event.selectedLeptons if l.pt() > 10 and abs(l.eta()) < 2.5 ]
0369
0370 if len(csLeptons)==1 and len(objectsXjc)>=2:
0371
0372 self.rl_mt2_Xj = self.getMT2Hemi(event,objectsXjc,event.rl_met,self.cfg_ana.collectionPostFix,"_Xj_rl")
0373
0374
0375
0376
0377 setattr(event, "mt2"+self.cfg_ana.collectionPostFix+"_zllmt", -999)
0378 setattr(event, "pseudoJet1"+self.cfg_ana.collectionPostFix+"_zllmt", ROOT.reco.Particle.LorentzVector( 0, 0, 0, 0 ))
0379 setattr(event, "pseudoJet2"+self.cfg_ana.collectionPostFix+"_zllmt", ROOT.reco.Particle.LorentzVector( 0, 0, 0, 0 ))
0380
0381 if hasattr(event, 'zllmt_met'):
0382
0383 csLeptons = [ l for l in event.selectedLeptons if l.pt() > 10 and abs(l.eta()) < 2.5 ]
0384
0385 if len(csLeptons)==2 and len(objects40jc)>=2:
0386
0387 self.zllmt_mt2 = self.getMT2Hemi(event,objects40jc,event.zllmt_met,self.cfg_ana.collectionPostFix,"_zllmt")
0388
0389 setattr(event, "mt2"+self.cfg_ana.collectionPostFix+"_Xj_zllmt", -999)
0390 setattr(event, "pseudoJet1"+self.cfg_ana.collectionPostFix+"_Xj_zllmt", ROOT.reco.Particle.LorentzVector( 0, 0, 0, 0 ))
0391 setattr(event, "pseudoJet2"+self.cfg_ana.collectionPostFix+"_Xj_zllmt", ROOT.reco.Particle.LorentzVector( 0, 0, 0, 0 ))
0392
0393 if hasattr(event, 'zllmt_met'):
0394
0395 csLeptons = [ l for l in event.selectedLeptons if l.pt() > 10 and abs(l.eta()) < 2.5 ]
0396
0397 if len(csLeptons)==2 and len(objectsXjc)>=1:
0398
0399 csLeptons_mt = []
0400 if (event.eventId%2):
0401 csLeptons_mt.append(csLeptons[1])
0402 else:
0403 csLeptons_mt.append(csLeptons[0])
0404
0405 self.zllmt_mt2_Xj = self.getMT2Hemi(event,objectsXjc+[l for l in csLeptons if l not in csLeptons_mt],event.zllmt_met,self.cfg_ana.collectionPostFix,"_Xj_zllmt")
0406
0407
0408
0409 if len(event.bjetsMedium)>=2:
0410
0411 event.mt2bb = self.computeMT2(event.bjetsMedium[0], event.bjetsMedium[1], self.met)
0412 event.mt2bb_Xj = self.computeMT2(event.bjetsMedium[0], event.bjetsMedium[1], self.met)
0413
0414 if len(event.bjetsMedium)==1:
0415
0416 objects40jcCSV = [ j for j in event.cleanJets if j.pt() > 40 and abs(j.eta())<2.5 and j.p4()!=event.bjetsMedium[0].p4() ]
0417 objects40jcCSV.sort(key = lambda l : l.btag('pfCombinedInclusiveSecondaryVertexV2BJetTags'), reverse = True)
0418
0419 objectsXjcCSV = [ j for j in event.cleanJets if j.pt() > self.jetPt and abs(j.eta())<2.5 and j.p4()!=event.bjetsMedium[0].p4() ]
0420 objectsXjcCSV.sort(key = lambda l : l.btag('pfCombinedInclusiveSecondaryVertexV2BJetTags'), reverse = True)
0421
0422 if len(objects40jcCSV)>0:
0423 self.mt2bb = self.computeMT2(event.bjetsMedium[0], objects40jcCSV[0], self.met)
0424 setattr(event, "mt2bb"+self.cfg_ana.collectionPostFix, self.mt2bb)
0425
0426 if len(objectsXjcCSV)>0:
0427 self.mt2bb_Xj = self.computeMT2(event.bjetsMedium[0], objectsXjcCSV[0], self.met)
0428 setattr(event, "mt2bb_Xj"+self.cfg_ana.collectionPostFix, self.mt2bb_Xj)
0429
0430
0431
0432
0433 if not self.cfg_ana.doOnlyDefault:
0434 if len(event.selectedLeptons)>=2:
0435 self.mt2lep = self.computeMT2(event.selectedLeptons[0], event.selectedLeptons[1], self.met)
0436 setattr(event, "mt2lep"+self.cfg_ana.collectionPostFix, self.mt2lep)
0437
0438
0439
0440 def process(self, event):
0441 self.readCollections( event.input )
0442
0443 event.mt2bb=-999
0444 event.mt2bb_Xj=-999
0445 event.mt2lept=-999
0446
0447 event.multPseudoJet1_had=0
0448 event.multPseudoJet2_had=0
0449
0450 event.multPseudoJet1_Xj_had=0
0451 event.multPseudoJet2_Xj_had=0
0452
0453
0454
0455 self.makeMT2(event)
0456
0457
0458
0459
0460
0461 return True
0462
0463
0464
0465 setattr(MT2Analyzer,"defaultConfig", cfg.Analyzer(
0466 class_object = MT2Analyzer,
0467 metCollection = "slimmedMETs",
0468 collectionPostFix = "",
0469 doOnlyDefault = True,
0470 )
0471 )