def match(self, genParticles): # TODO review matching algorithm # TODO move matching stuff even higher? # print self genTaus = [] ZorPhotonorHiggs = [22, 23, 25, 35, 36, 37] for gen in genParticles: # print '\t', gen if abs(gen.pdgId()) == 15 and gen.mother().pdgId() in ZorPhotonorHiggs: genTaus.append(gen) # print 'Gen taus: ' # print '\n'.join( map( str, genTaus ) ) if len(genTaus) != 2: # COLIN what about WW, ZZ? return (-1, -1) else: dR2leg1Min, self.leg1Gen = (float('inf'), None) dR2leg2Min, self.leg2Gen = (float('inf'), None) for genTau in genTaus: dR2leg1 = deltaR2(self.leg1().eta(), self.leg1().phi(), genTau.eta(), genTau.phi()) dR2leg2 = deltaR2(self.leg2().eta(), self.leg2().phi(), genTau.eta(), genTau.phi()) if dR2leg1 < dR2leg1Min: dR2leg1Min, self.leg1Gen = (dR2leg1, genTau) if dR2leg2 < dR2leg2Min: dR2leg2Min, self.leg2Gen = (dR2leg2, genTau) # print dR2leg1Min, dR2leg2Min # print self.leg1Gen # print self.leg2Gen self.leg1DeltaR = math.sqrt(dR2leg1Min) self.leg2DeltaR = math.sqrt(dR2leg2Min) return (self.leg1DeltaR, self.leg2DeltaR)
def cleanNearestJetOnly(jets,leptons,deltaR): dr2 = deltaR**2 good = [ True for j in jets ] for l in leptons: ibest, d2m = -1, dr2 for i,j in enumerate(jets): d2i = deltaR2(l.eta(),l.phi(), j.eta(),j.phi()) if d2i < d2m: ibest, d2m = i, d2i if ibest != -1: good[ibest] = False return [ j for (i,j) in enumerate(jets) if good[i] == True ]
def trigObjMatched(self, to, legs, dR2Max=0.25): # dR2Max=0.089999 '''Returns true if the trigger object is matched to one of the given legs''' eta = to.eta() phi = to.phi() pdgId = abs(to.pdgId()) to.matched = False for leg in legs: # JAN - Single-ele trigger filter has pdg ID 0, to be understood # RIC - same seems to happen with di-tau if pdgId == abs(leg.pdgId()) or \ (pdgId == 0 and abs(leg.pdgId()) == 11) or \ (pdgId == 0 and abs(leg.pdgId()) == 15): if deltaR2(eta, phi, leg.eta(), leg.phi()) < dR2Max: to.matched = True return to.matched
def cleanJetsAndLeptons(jets,leptons,deltaR,arbitration): dr2 = deltaR**2 goodjet = [ True for j in jets ] goodlep = [ True for l in leptons ] for il, l in enumerate(leptons): ibest, d2m = -1, dr2 for i,j in enumerate(jets): d2i = deltaR2(l.eta(),l.phi(), j.eta(),j.phi()) if d2i < dr2: if arbitration(j,l) == j: # if the two match, and we prefer the jet, then drop the lepton and be done goodlep[il] = False break if d2i < d2m: ibest, d2m = i, d2i # this lepton has been killed by a jet, then we clean the jet that best matches it if not goodlep[il]: continue if ibest != -1: goodjet[ibest] = False return ( [ j for (i ,j) in enumerate(jets) if goodjet[i ] == True ], [ l for (il,l) in enumerate(leptons) if goodlep[il] == True ] )
def process(self, event): self.readCollections( event.input ) rho = float(self.handles['rho'].product()[0]) self.rho = rho ## Read jets, if necessary recalibrate and shift MET if self.cfg_ana.copyJetsByValue: import ROOT #from ROOT.heppy import JetUtils allJets = map(lambda j:Jet(ROOT.heppy.JetUtils.copyJet(j)), self.handles['jets'].product()) #copy-by-value is safe if JetAnalyzer is ran more than once else: allJets = map(Jet, self.handles['jets'].product()) #set dummy MC flavour for all jets in case we want to ntuplize discarded jets later for jet in allJets: jet.mcFlavour = 0 self.deltaMetFromJEC = [0.,0.] self.type1METCorr = [0.,0.,0.] # print "before. rho",self.rho,self.cfg_ana.collectionPostFix,'allJets len ',len(allJets),'pt', [j.pt() for j in allJets] if self.doJEC: if not self.recalibrateJets: # check point that things won't change jetsBefore = [ (j.pt(),j.eta(),j.phi(),j.rawFactor()) for j in allJets ] self.jetReCalibrator.correctAll(allJets, rho, delta=self.shiftJEC, addCorr=True, addShifts=self.addJECShifts, metShift=self.deltaMetFromJEC, type1METCorr=self.type1METCorr ) if not self.recalibrateJets: jetsAfter = [ (j.pt(),j.eta(),j.phi(),j.rawFactor()) for j in allJets ] if len(jetsBefore) != len(jetsAfter): print("ERROR: I had to recompute jet corrections, and they rejected some of the jets:\nold = %s\n new = %s\n" % (jetsBefore,jetsAfter)) else: for (told, tnew) in zip(jetsBefore,jetsAfter): if (deltaR2(told[1],told[2],tnew[1],tnew[2])) > 0.0001: print("ERROR: I had to recompute jet corrections, and one jet direction moved: old = %s, new = %s\n" % (told, tnew)) elif abs(told[0]-tnew[0])/(told[0]+tnew[0]) > 0.5e-3 or abs(told[3]-tnew[3]) > 0.5e-3: print("ERROR: I had to recompute jet corrections, and one jet pt or corr changed: old = %s, new = %s\n" % (told, tnew)) self.allJetsUsedForMET = allJets # print "after. rho",self.rho,self.cfg_ana.collectionPostFix,'allJets len ',len(allJets),'pt', [j.pt() for j in allJets] if self.cfg_comp.isMC: self.genJets = [ x for x in self.handles['genJet'].product() ] if self.cfg_ana.do_mc_match: for igj, gj in enumerate(self.genJets): gj.index = igj # self.matchJets(event, allJets) self.matchJets(event, [ j for j in allJets if j.pt()>self.cfg_ana.jetPt ]) # To match only jets above chosen threshold if getattr(self.cfg_ana, 'smearJets', False): self.smearJets(event, allJets) ##Sort Jets by pT allJets.sort(key = lambda j : j.pt(), reverse = True) leptons = [] if hasattr(event, 'selectedLeptons'): leptons = [ l for l in event.selectedLeptons if l.pt() > self.lepPtMin and self.lepSelCut(l) ] if self.cfg_ana.cleanJetsFromTaus and hasattr(event, 'selectedTaus'): leptons = leptons[:] + event.selectedTaus if self.cfg_ana.cleanJetsFromIsoTracks and hasattr(event, 'selectedIsoCleanTrack'): leptons = leptons[:] + event.selectedIsoCleanTrack ## Apply jet selection self.jets = [] self.jetsFailId = [] self.jetsAllNoID = [] self.jetsIdOnly = [] for jet in allJets: #Check if lepton and jet have overlapping PF candidates leps_with_overlaps = [] if getattr(self.cfg_ana, 'checkLeptonPFOverlap', True): for i in range(jet.numberOfSourceCandidatePtrs()): p1 = jet.sourceCandidatePtr(i) #Ptr<Candidate> p1 for lep in leptons: for j in range(lep.numberOfSourceCandidatePtrs()): p2 = lep.sourceCandidatePtr(j) has_overlaps = p1.key() == p2.key() and p1.refCore().id().productIndex() == p2.refCore().id().productIndex() and p1.refCore().id().processIndex() == p2.refCore().id().processIndex() if has_overlaps: leps_with_overlaps += [lep] if len(leps_with_overlaps)>0: for lep in leps_with_overlaps: lep.jetOverlap = jet if self.testJetNoID( jet ): self.jetsAllNoID.append(jet) if(self.cfg_ana.doQG): jet.qgl_calc = self.qglcalc.computeQGLikelihood jet.qgl_rho = rho if self.testJetID( jet ): self.jets.append(jet) self.jetsIdOnly.append(jet) else: self.jetsFailId.append(jet) elif self.testJetID (jet ): self.jetsIdOnly.append(jet) jetsEtaCut = [j for j in self.jets if abs(j.eta()) < self.cfg_ana.jetEta ] self.cleanJetsAll, cleanLeptons = cleanJetsAndLeptons(jetsEtaCut, leptons, self.jetLepDR, self.jetLepArbitration) self.cleanJets = [j for j in self.cleanJetsAll if abs(j.eta()) < self.cfg_ana.jetEtaCentral ] self.cleanJetsFwd = [j for j in self.cleanJetsAll if abs(j.eta()) >= self.cfg_ana.jetEtaCentral ] self.discardedJets = [j for j in self.jets if j not in self.cleanJetsAll] if hasattr(event, 'selectedLeptons') and self.cfg_ana.cleanSelectedLeptons: event.discardedLeptons = [ l for l in leptons if l not in cleanLeptons ] event.selectedLeptons = [ l for l in event.selectedLeptons if l not in event.discardedLeptons ] for lep in leptons: if hasattr(lep, "jetOverlap"): if lep.jetOverlap in self.cleanJetsAll: #print "overlap reco", lep.p4().pt(), lep.p4().eta(), lep.p4().phi(), lep.jetOverlap.p4().pt(), lep.jetOverlap.p4().eta(), lep.jetOverlap.p4().phi() lep.jetOverlapIdx = self.cleanJetsAll.index(lep.jetOverlap) elif lep.jetOverlap in self.discardedJets: #print "overlap discarded", lep.p4().pt(), lep.p4().eta(), lep.p4().phi(), lep.jetOverlap.p4().pt(), lep.jetOverlap.p4().eta(), lep.jetOverlap.p4().phi() lep.jetOverlapIdx = 1000 + self.discardedJets.index(lep.jetOverlap) ## First cleaning, then Jet Id self.noIdCleanJetsAll, cleanLeptons = cleanJetsAndLeptons(self.jetsAllNoID, leptons, self.jetLepDR, self.jetLepArbitration) self.noIdCleanJets = [j for j in self.noIdCleanJetsAll if abs(j.eta()) < self.cfg_ana.jetEtaCentral ] self.noIdCleanJetsFwd = [j for j in self.noIdCleanJetsAll if abs(j.eta()) >= self.cfg_ana.jetEtaCentral ] self.noIdDiscardedJets = [j for j in self.jetsAllNoID if j not in self.noIdCleanJetsAll] ## Clean Jets from photons (first cleaning, then Jet Id) photons = [] if hasattr(event, 'selectedPhotons'): if self.cfg_ana.cleanJetsFromFirstPhoton: photons = event.selectedPhotons[:1] else: photons = [ g for g in event.selectedPhotons ] self.gamma_cleanJetaAll = [] self.gamma_noIdCleanJetsAll = [] if self.cleanFromLepAndGammaSimultaneously: self.gamma_cleanJetsAll = cleanNearestJetOnly(jetsEtaCut, photons+leptons, self.jetGammaLepDR) self.gamma_noIdCleanJetsAll = cleanNearestJetOnly(self.jetsAllNoID, photons+leptons, self.jetGammaLepDR) else: self.gamma_cleanJetsAll = cleanNearestJetOnly(self.cleanJetsAll, photons, self.jetGammaDR) self.gamma_noIdCleanJetsAll = cleanNearestJetOnly(self.noIdCleanJetsAll, photons, self.jetGammaDR) self.gamma_cleanJets = [j for j in self.gamma_cleanJetsAll if abs(j.eta()) < self.cfg_ana.jetEtaCentral ] self.gamma_cleanJetsFwd = [j for j in self.gamma_cleanJetsAll if abs(j.eta()) >= self.cfg_ana.jetEtaCentral ] self.gamma_noIdCleanJets = [j for j in self.gamma_noIdCleanJetsAll if abs(j.eta()) < self.cfg_ana.jetEtaCentral ] self.gamma_noIdCleanJetsFwd = [j for j in self.gamma_noIdCleanJetsAll if abs(j.eta()) >= self.cfg_ana.jetEtaCentral ] ### if self.cfg_ana.alwaysCleanPhotons: self.cleanJets = self.gamma_cleanJets self.cleanJetsAll = self.gamma_cleanJetsAll self.cleanJetsFwd = self.gamma_cleanJetsFwd # self.noIdCleanJets = self.gamma_noIdCleanJets self.noIdCleanJetsAll = self.gamma_noIdCleanJetsAll self.noIdCleanJetsFwd = self.gamma_noIdCleanJetsFwd ## Jet Id, after jet/lepton cleaning self.cleanJetsFailIdAll = [] for jet in self.noIdCleanJetsAll: if not self.testJetID( jet ): self.cleanJetsFailIdAll.append(jet) self.cleanJetsFailId = [j for j in self.cleanJetsFailIdAll if abs(j.eta()) < self.cfg_ana.jetEtaCentral ] ## Jet Id, after jet/photon cleaning self.gamma_cleanJetsFailIdAll = [] for jet in self.gamma_noIdCleanJetsAll: if not self.testJetID( jet ): self.gamma_cleanJetsFailIdAll.append(jet) self.gamma_cleanJetsFailId = [j for j in self.gamma_cleanJetsFailIdAll if abs(j.eta()) < self.cfg_ana.jetEtaCentral ] ## Associate jets to leptons incleptons = event.inclusiveLeptons if hasattr(event, 'inclusiveLeptons') else event.selectedLeptons jlpairs = matchObjectCollection(incleptons, allJets, self.jetLepDR**2) for jet in allJets: jet.leptons = [l for l in jlpairs if jlpairs[l] == jet ] for lep in incleptons: jet = jlpairs[lep] if jet is None: setattr(lep,"jet"+self.cfg_ana.collectionPostFix,lep) else: setattr(lep,"jet"+self.cfg_ana.collectionPostFix,jet) ## Associate jets to taus taus = getattr(event,'selectedTaus',[]) jtaupairs = matchObjectCollection( taus, allJets, self.jetLepDR**2) for jet in allJets: jet.taus = [l for l in jtaupairs if jtaupairs[l] == jet ] for tau in taus: setattr(tau,"jet"+self.cfg_ana.collectionPostFix,jtaupairs[tau]) #MC stuff if self.cfg_comp.isMC: self.deltaMetFromJetSmearing = [0, 0] for j in self.cleanJetsAll: if hasattr(j, 'deltaMetFromJetSmearing'): self.deltaMetFromJetSmearing[0] += j.deltaMetFromJetSmearing[0] self.deltaMetFromJetSmearing[1] += j.deltaMetFromJetSmearing[1] self.cleanGenJets = cleanNearestJetOnly(self.genJets, leptons, self.jetLepDR) if self.cfg_ana.cleanGenJetsFromPhoton: self.cleanGenJets = cleanNearestJetOnly(self.cleanGenJets, photons, self.jetLepDR) if getattr(self.cfg_ana, 'attachNeutrinos', True) and hasattr(self.cfg_ana,"genNuSelection") : jetNus=[x for x in event.genParticles if abs(x.pdgId()) in [12,14,16] and self.cfg_ana.genNuSelection(x) ] pairs= matchObjectCollection (jetNus, self.genJets, 0.4**2) for (nu,genJet) in six.iteritems(pairs) : if genJet is not None : if not hasattr(genJet,"nu") : genJet.nu=nu.p4() else : genJet.nu+=nu.p4() if self.cfg_ana.do_mc_match: self.jetFlavour(event) if hasattr(event,"jets"+self.cfg_ana.collectionPostFix): raise RuntimeError("Event already contains a jet collection with the following postfix: "+self.cfg_ana.collectionPostFix) setattr(event,"rho" +self.cfg_ana.collectionPostFix, self.rho ) setattr(event,"deltaMetFromJEC" +self.cfg_ana.collectionPostFix, self.deltaMetFromJEC ) setattr(event,"type1METCorr" +self.cfg_ana.collectionPostFix, self.type1METCorr ) setattr(event,"allJetsUsedForMET" +self.cfg_ana.collectionPostFix, self.allJetsUsedForMET ) setattr(event,"jets" +self.cfg_ana.collectionPostFix, self.jets ) setattr(event,"jetsFailId" +self.cfg_ana.collectionPostFix, self.jetsFailId ) setattr(event,"jetsAllNoID" +self.cfg_ana.collectionPostFix, self.jetsAllNoID ) setattr(event,"jetsIdOnly" +self.cfg_ana.collectionPostFix, self.jetsIdOnly ) setattr(event,"cleanJetsAll" +self.cfg_ana.collectionPostFix, self.cleanJetsAll ) setattr(event,"cleanJets" +self.cfg_ana.collectionPostFix, self.cleanJets ) setattr(event,"cleanJetsFwd" +self.cfg_ana.collectionPostFix, self.cleanJetsFwd ) setattr(event,"cleanJetsFailIdAll" +self.cfg_ana.collectionPostFix, self.cleanJetsFailIdAll ) setattr(event,"cleanJetsFailId" +self.cfg_ana.collectionPostFix, self.cleanJetsFailId ) setattr(event,"discardedJets" +self.cfg_ana.collectionPostFix, self.discardedJets ) setattr(event,"gamma_cleanJetsAll" +self.cfg_ana.collectionPostFix, self.gamma_cleanJetsAll ) setattr(event,"gamma_cleanJets" +self.cfg_ana.collectionPostFix, self.gamma_cleanJets ) setattr(event,"gamma_cleanJetsFwd" +self.cfg_ana.collectionPostFix, self.gamma_cleanJetsFwd ) setattr(event,"gamma_cleanJetsFailIdAll" +self.cfg_ana.collectionPostFix, self.gamma_cleanJetsFailIdAll ) setattr(event,"gamma_cleanJetsFailId" +self.cfg_ana.collectionPostFix, self.gamma_cleanJetsFailId ) if self.cfg_comp.isMC: setattr(event,"deltaMetFromJetSmearing"+self.cfg_ana.collectionPostFix, self.deltaMetFromJetSmearing) setattr(event,"cleanGenJets" +self.cfg_ana.collectionPostFix, self.cleanGenJets ) setattr(event,"genJets" +self.cfg_ana.collectionPostFix, self.genJets ) if self.cfg_ana.do_mc_match: setattr(event,"bqObjects" +self.cfg_ana.collectionPostFix, self.bqObjects ) setattr(event,"cqObjects" +self.cfg_ana.collectionPostFix, self.cqObjects ) setattr(event,"partons" +self.cfg_ana.collectionPostFix, self.partons ) setattr(event,"heaviestQCDFlavour" +self.cfg_ana.collectionPostFix, self.heaviestQCDFlavour ) return True
def process(self, event): self.readCollections(event.input) miniaodjets = self.handles['jets'].product() allJets = [] event.jets = [] event.bJets = [] event.cleanJets = [] event.cleanBJets = [] leptons = [] if hasattr(event, 'selectedLeptons'): leptons = event.selectedLeptons genJets = None if self.cfg_comp.isMC: genJets = map(GenJet, self.mchandles['genJets'].product()) for maodjet in miniaodjets: jet = Jet(maodjet) allJets.append(jet) if self.cfg_comp.isMC and hasattr(self.cfg_comp, 'jetScale'): scale = random.gauss(self.cfg_comp.jetScale, self.cfg_comp.jetSmear) jet.scaleEnergy(scale) if genJets: # Use DeltaR = 0.25 matching like JetMET pairs = matchObjectCollection([jet], genJets, 0.25 * 0.25) if pairs[jet] is None: pass else: jet.matchedGenJet = pairs[jet] # Add JER correction for MC jets. Requires gen-jet matching. if self.cfg_comp.isMC and hasattr(self.cfg_ana, 'jerCorr') and self.cfg_ana.jerCorr: self.jerCorrection(jet) # Add JES correction for MC jets. if self.cfg_comp.isMC and hasattr(self.cfg_ana, 'jesCorr'): self.jesCorrection(jet, self.cfg_ana.jesCorr) if self.testJet(jet): event.jets.append(jet) if self.testBJet(jet): event.bJets.append(jet) self.counters.counter('jets').inc('all events') event.cleanJets, dummy = cleanObjectCollection(event.jets, masks=leptons, deltaRMin=0.5) event.cleanBJets, dummy = cleanObjectCollection(event.bJets, masks=leptons, deltaRMin=0.5) pairs = matchObjectCollection(leptons, allJets, 0.5 * 0.5) # associating a jet to each lepton for lepton in leptons: jet = pairs[lepton] if jet is None: lepton.jet = lepton else: lepton.jet = jet # associating a leg to each clean jet invpairs = matchObjectCollection(event.cleanJets, leptons, 99999.) for jet in event.cleanJets: leg = invpairs[jet] jet.leg = leg for jet in event.cleanJets: jet.matchGenParton = 999.0 if self.cfg_comp.isMC and "BB" in self.cfg_comp.name: genParticles = self.mchandles['genParticles'].product() event.genParticles = map(GenParticle, genParticles) for gen in genParticles: if abs(gen.pdgId()) == 5 and gen.mother() and abs(gen.mother().pdgId()) == 21: for jet in event.cleanJets: dR = deltaR2(jet.eta(), jet.phi(), gen.eta(), gen.phi()) if dR < jet.matchGenParton: jet.matchGenParton = dR event.jets30 = [jet for jet in event.jets if jet.pt() > 30] event.cleanJets30 = [jet for jet in event.cleanJets if jet.pt() > 30] if len(event.jets30) >= 2: self.counters.counter('jets').inc('at least 2 good jets') if len(event.cleanJets30) >= 2: self.counters.counter('jets').inc('at least 2 clean jets') if len(event.cleanBJets) > 0: self.counters.counter('jets').inc('at least 1 b jet') if len(event.cleanBJets) > 1: self.counters.counter('jets').inc('at least 2 b jets') return True
def process(self, event): self.readCollections(event.input) cmgJets = self.handles['jets'].product() allJets = [] event.jets = [] event.bJets = [] event.cleanJets = [] event.cleanBJets = [] leg1 = event.diLepton.leg1() leg2 = event.diLepton.leg2() genJets = None if self.cfg_comp.isMC: genJets = map(GenJet, self.mchandles['genJets'].product()) for cmgJet in cmgJets: jet = Jet(cmgJet) allJets.append(jet) if self.cfg_comp.isMC and hasattr(self.cfg_comp, 'jetScale'): scale = random.gauss(self.cfg_comp.jetScale, self.cfg_comp.jetSmear) jet.scaleEnergy(scale) if self.testJet(jet): event.jets.append(jet) if self.testBJet(jet): event.bJets.append(jet) if genJets: # Use DeltaR = 0.25 matching like JetMET pairs = matchObjectCollection([jet], genJets, 0.25 * 0.25) if pairs[jet] is None: pass else: jet.matchedGenJet = pairs[jet] #Add JER correction for MC jets. Requires gen-jet matching if self.cfg_comp.isMC and hasattr( self.cfg_ana, 'jerCorr') and self.cfg_ana.jerCorr: self.jerCorrection(jet) self.counters.counter('VBF').inc('all events') event.cleanJets, dummy = cleanObjectCollection(event.jets, masks=[leg1, leg2], deltaRMin=0.5) event.cleanBJets, dummy = cleanObjectCollection(event.bJets, masks=[leg1, leg2], deltaRMin=0.5) pairs = matchObjectCollection([leg1, leg2], allJets, 0.5 * 0.5) # associating a jet to each leg leg1.jet = pairs[leg1] leg2.jet = pairs[leg2] if leg1.jet is None: #COLIN: I don't understand the code below... leg1.jet = leg1 if leg2.jet is None: leg2.jet = leg2 # associating a leg to each clean jet invpairs = matchObjectCollection(event.cleanJets, [leg1, leg2], 99999.) for jet in event.cleanJets: leg = invpairs[jet] jet.leg = leg for jet in event.cleanJets: jet.matchGenParton = 999.0 if self.cfg_comp.isMC and "BB" in self.cfg_comp.name: genParticles = self.mchandles['genParticles'].product() event.genParticles = map(GenParticle, genParticles) for gen in genParticles: if abs(gen.pdgId()) == 5 and gen.mother() and abs( gen.mother().pdgId()) == 21: for jet in event.cleanJets: dR = deltaR2(jet.eta(), jet.phi(), gen.eta(), gen.phi()) if dR < jet.matchGenParton: jet.matchGenParton = dR event.jets30 = [jet for jet in event.jets if jet.pt() > 30] event.cleanJets30 = [jet for jet in event.cleanJets if jet.pt() > 30] if len(event.jets30) >= 2: self.counters.counter('VBF').inc('at least 2 good jets') if len(event.cleanJets30) >= 2: self.counters.counter('VBF').inc('at least 2 clean jets') if len(event.cleanJets) < 2: return True event.vbf = VBF(event.cleanJets, event.diLepton, None, self.cfg_ana.cjvPtCut) if event.vbf.mjj > self.cfg_ana.Mjj: self.counters.counter('VBF').inc( 'M_jj > {cut:3.1f}'.format(cut=self.cfg_ana.Mjj)) else: return True if abs(event.vbf.deta) > self.cfg_ana.deltaEta: self.counters.counter('VBF').inc( 'delta Eta > {cut:3.1f}'.format(cut=self.cfg_ana.deltaEta)) else: return True if len(event.vbf.centralJets) == 0: self.counters.counter('VBF').inc('no central jets') else: return True return True
def process(self, event): self.readCollections( event.input ) rho = float(self.handles['rho'].product()[0]) self.rho = rho ## Read jets, if necessary recalibrate and shift MET if self.cfg_ana.copyJetsByValue: import ROOT allJets = map(lambda j:Jet(ROOT.pat.Jet(ROOT.edm.Ptr(ROOT.pat.Jet)(ROOT.edm.ProductID(),j,0))), self.handles['jets'].product()) #copy-by-value is safe if JetAnalyzer is ran more than once else: allJets = map(Jet, self.handles['jets'].product()) #set dummy MC flavour for all jets in case we want to ntuplize discarded jets later for jet in allJets: jet.mcFlavour = 0 self.deltaMetFromJEC = [0.,0.] self.type1METCorr = [0.,0.,0.] # print "before. rho",self.rho,self.cfg_ana.collectionPostFix,'allJets len ',len(allJets),'pt', [j.pt() for j in allJets] if self.doJEC: if not self.recalibrateJets: # check point that things won't change jetsBefore = [ (j.pt(),j.eta(),j.phi(),j.rawFactor()) for j in allJets ] self.jetReCalibrator.correctAll(allJets, rho, delta=self.shiftJEC, addCorr=True, addShifts=self.addJECShifts, metShift=self.deltaMetFromJEC, type1METCorr=self.type1METCorr ) if not self.recalibrateJets: jetsAfter = [ (j.pt(),j.eta(),j.phi(),j.rawFactor()) for j in allJets ] if len(jetsBefore) != len(jetsAfter): print "ERROR: I had to recompute jet corrections, and they rejected some of the jets:\nold = %s\n new = %s\n" % (jetsBefore,jetsAfter) else: for (told, tnew) in zip(jetsBefore,jetsAfter): if (deltaR2(told[1],told[2],tnew[1],tnew[2])) > 0.0001: print "ERROR: I had to recompute jet corrections, and one jet direction moved: old = %s, new = %s\n" % (told, tnew) elif abs(told[0]-tnew[0])/(told[0]+tnew[0]) > 0.5e-3 or abs(told[3]-tnew[3]) > 0.5e-3: print "ERROR: I had to recompute jet corrections, and one jet pt or corr changed: old = %s, new = %s\n" % (told, tnew) self.allJetsUsedForMET = allJets # print "after. rho",self.rho,self.cfg_ana.collectionPostFix,'allJets len ',len(allJets),'pt', [j.pt() for j in allJets] if self.cfg_comp.isMC: self.genJets = [ x for x in self.handles['genJet'].product() ] if self.cfg_ana.do_mc_match: for igj, gj in enumerate(self.genJets): gj.index = igj self.matchJets(event, allJets) if getattr(self.cfg_ana, 'smearJets', False): self.smearJets(event, allJets) ##Sort Jets by pT allJets.sort(key = lambda j : j.pt(), reverse = True) leptons = [] if hasattr(event, 'selectedLeptons'): leptons = [ l for l in event.selectedLeptons if l.pt() > self.lepPtMin and self.lepSelCut(l) ] if self.cfg_ana.cleanJetsFromTaus and hasattr(event, 'selectedTaus'): leptons = leptons[:] + event.selectedTaus if self.cfg_ana.cleanJetsFromIsoTracks and hasattr(event, 'selectedIsoCleanTrack'): leptons = leptons[:] + event.selectedIsoCleanTrack ## Apply jet selection self.jets = [] self.jetsFailId = [] self.jetsAllNoID = [] self.jetsIdOnly = [] for jet in allJets: #Check if lepton and jet have overlapping PF candidates leps_with_overlaps = [] if getattr(self.cfg_ana, 'checkLeptonPFOverlap', True): for i in range(jet.numberOfSourceCandidatePtrs()): p1 = jet.sourceCandidatePtr(i) #Ptr<Candidate> p1 for lep in leptons: for j in range(lep.numberOfSourceCandidatePtrs()): p2 = lep.sourceCandidatePtr(j) has_overlaps = p1.key() == p2.key() and p1.refCore().id().productIndex() == p2.refCore().id().productIndex() and p1.refCore().id().processIndex() == p2.refCore().id().processIndex() if has_overlaps: leps_with_overlaps += [lep] if len(leps_with_overlaps)>0: for lep in leps_with_overlaps: lep.jetOverlap = jet if self.testJetNoID( jet ): self.jetsAllNoID.append(jet) if(self.cfg_ana.doQG): jet.qgl_calc = self.qglcalc.computeQGLikelihood jet.qgl_rho = rho if self.testJetID( jet ): self.jets.append(jet) self.jetsIdOnly.append(jet) else: self.jetsFailId.append(jet) elif self.testJetID (jet ): self.jetsIdOnly.append(jet) jetsEtaCut = [j for j in self.jets if abs(j.eta()) < self.cfg_ana.jetEta ] self.cleanJetsAll, cleanLeptons = cleanJetsAndLeptons(jetsEtaCut, leptons, self.jetLepDR, self.jetLepArbitration) self.cleanJets = [j for j in self.cleanJetsAll if abs(j.eta()) < self.cfg_ana.jetEtaCentral ] self.cleanJetsFwd = [j for j in self.cleanJetsAll if abs(j.eta()) >= self.cfg_ana.jetEtaCentral ] self.discardedJets = [j for j in self.jets if j not in self.cleanJetsAll] if hasattr(event, 'selectedLeptons') and self.cfg_ana.cleanSelectedLeptons: event.discardedLeptons = [ l for l in leptons if l not in cleanLeptons ] event.selectedLeptons = [ l for l in event.selectedLeptons if l not in event.discardedLeptons ] for lep in leptons: if hasattr(lep, "jetOverlap"): if lep.jetOverlap in self.cleanJetsAll: #print "overlap reco", lep.p4().pt(), lep.p4().eta(), lep.p4().phi(), lep.jetOverlap.p4().pt(), lep.jetOverlap.p4().eta(), lep.jetOverlap.p4().phi() lep.jetOverlapIdx = self.cleanJetsAll.index(lep.jetOverlap) elif lep.jetOverlap in self.discardedJets: #print "overlap discarded", lep.p4().pt(), lep.p4().eta(), lep.p4().phi(), lep.jetOverlap.p4().pt(), lep.jetOverlap.p4().eta(), lep.jetOverlap.p4().phi() lep.jetOverlapIdx = 1000 + self.discardedJets.index(lep.jetOverlap) ## First cleaning, then Jet Id self.noIdCleanJetsAll, cleanLeptons = cleanJetsAndLeptons(self.jetsAllNoID, leptons, self.jetLepDR, self.jetLepArbitration) self.noIdCleanJets = [j for j in self.noIdCleanJetsAll if abs(j.eta()) < self.cfg_ana.jetEtaCentral ] self.noIdCleanJetsFwd = [j for j in self.noIdCleanJetsAll if abs(j.eta()) >= self.cfg_ana.jetEtaCentral ] self.noIdDiscardedJets = [j for j in self.jetsAllNoID if j not in self.noIdCleanJetsAll] ## Clean Jets from photons (first cleaning, then Jet Id) photons = [] if hasattr(event, 'selectedPhotons'): if self.cfg_ana.cleanJetsFromFirstPhoton: photons = event.selectedPhotons[:1] else: photons = [ g for g in event.selectedPhotons ] self.gamma_cleanJetsAll = cleanNearestJetOnly(self.cleanJetsAll, photons, self.jetGammaDR) self.gamma_cleanJets = [j for j in self.gamma_cleanJetsAll if abs(j.eta()) < self.cfg_ana.jetEtaCentral ] self.gamma_cleanJetsFwd = [j for j in self.gamma_cleanJetsAll if abs(j.eta()) >= self.cfg_ana.jetEtaCentral ] self.gamma_noIdCleanJetsAll = cleanNearestJetOnly(self.noIdCleanJetsAll, photons, self.jetGammaDR) self.gamma_noIdCleanJets = [j for j in self.gamma_noIdCleanJetsAll if abs(j.eta()) < self.cfg_ana.jetEtaCentral ] self.gamma_noIdCleanJetsFwd = [j for j in self.gamma_noIdCleanJetsAll if abs(j.eta()) >= self.cfg_ana.jetEtaCentral ] ### if self.cfg_ana.alwaysCleanPhotons: self.cleanJets = self.gamma_cleanJets self.cleanJetsAll = self.gamma_cleanJetsAll self.cleanJetsFwd = self.gamma_cleanJetsFwd # self.noIdCleanJets = self.gamma_noIdCleanJets self.noIdCleanJetsAll = self.gamma_noIdCleanJetsAll self.noIdCleanJetsFwd = self.gamma_noIdCleanJetsFwd ## Jet Id, after jet/lepton cleaning self.cleanJetsFailIdAll = [] for jet in self.noIdCleanJetsAll: if not self.testJetID( jet ): self.cleanJetsFailIdAll.append(jet) self.cleanJetsFailId = [j for j in self.cleanJetsFailIdAll if abs(j.eta()) < self.cfg_ana.jetEtaCentral ] ## Jet Id, after jet/photon cleaning self.gamma_cleanJetsFailIdAll = [] for jet in self.gamma_noIdCleanJetsAll: if not self.testJetID( jet ): self.gamma_cleanJetsFailIdAll.append(jet) self.gamma_cleanJetsFailId = [j for j in self.gamma_cleanJetsFailIdAll if abs(j.eta()) < self.cfg_ana.jetEtaCentral ] ## Associate jets to leptons incleptons = event.inclusiveLeptons if hasattr(event, 'inclusiveLeptons') else event.selectedLeptons jlpairs = matchObjectCollection(incleptons, allJets, self.jetLepDR**2) for jet in allJets: jet.leptons = [l for l in jlpairs if jlpairs[l] == jet ] for lep in incleptons: jet = jlpairs[lep] if jet is None: setattr(lep,"jet"+self.cfg_ana.collectionPostFix,lep) else: setattr(lep,"jet"+self.cfg_ana.collectionPostFix,jet) ## Associate jets to taus taus = getattr(event,'selectedTaus',[]) jtaupairs = matchObjectCollection( taus, allJets, self.jetLepDR**2) for jet in allJets: jet.taus = [l for l in jtaupairs if jtaupairs[l] == jet ] for tau in taus: setattr(tau,"jet"+self.cfg_ana.collectionPostFix,jtaupairs[tau]) #MC stuff if self.cfg_comp.isMC: self.deltaMetFromJetSmearing = [0, 0] for j in self.cleanJetsAll: if hasattr(j, 'deltaMetFromJetSmearing'): self.deltaMetFromJetSmearing[0] += j.deltaMetFromJetSmearing[0] self.deltaMetFromJetSmearing[1] += j.deltaMetFromJetSmearing[1] self.cleanGenJets = cleanNearestJetOnly(self.genJets, leptons, self.jetLepDR) if self.cfg_ana.cleanGenJetsFromPhoton: self.cleanGenJets = cleanNearestJetOnly(self.cleanGenJets, photons, self.jetLepDR) if getattr(self.cfg_ana, 'attachNeutrinos', True) and hasattr(self.cfg_ana,"genNuSelection") : jetNus=[x for x in event.genParticles if abs(x.pdgId()) in [12,14,16] and self.cfg_ana.genNuSelection(x) ] pairs= matchObjectCollection (jetNus, self.genJets, 0.4**2) for (nu,genJet) in pairs.iteritems() : if genJet is not None : if not hasattr(genJet,"nu") : genJet.nu=nu.p4() else : genJet.nu+=nu.p4() if self.cfg_ana.do_mc_match: self.jetFlavour(event) if hasattr(event,"jets"+self.cfg_ana.collectionPostFix): raise RuntimeError, "Event already contains a jet collection with the following postfix: "+self.cfg_ana.collectionPostFix setattr(event,"rho" +self.cfg_ana.collectionPostFix, self.rho ) setattr(event,"deltaMetFromJEC" +self.cfg_ana.collectionPostFix, self.deltaMetFromJEC ) setattr(event,"type1METCorr" +self.cfg_ana.collectionPostFix, self.type1METCorr ) setattr(event,"allJetsUsedForMET" +self.cfg_ana.collectionPostFix, self.allJetsUsedForMET ) setattr(event,"jets" +self.cfg_ana.collectionPostFix, self.jets ) setattr(event,"jetsFailId" +self.cfg_ana.collectionPostFix, self.jetsFailId ) setattr(event,"jetsAllNoID" +self.cfg_ana.collectionPostFix, self.jetsAllNoID ) setattr(event,"jetsIdOnly" +self.cfg_ana.collectionPostFix, self.jetsIdOnly ) setattr(event,"cleanJetsAll" +self.cfg_ana.collectionPostFix, self.cleanJetsAll ) setattr(event,"cleanJets" +self.cfg_ana.collectionPostFix, self.cleanJets ) setattr(event,"cleanJetsFwd" +self.cfg_ana.collectionPostFix, self.cleanJetsFwd ) setattr(event,"cleanJetsFailIdAll" +self.cfg_ana.collectionPostFix, self.cleanJetsFailIdAll ) setattr(event,"cleanJetsFailId" +self.cfg_ana.collectionPostFix, self.cleanJetsFailId ) setattr(event,"discardedJets" +self.cfg_ana.collectionPostFix, self.discardedJets ) setattr(event,"gamma_cleanJetsAll" +self.cfg_ana.collectionPostFix, self.gamma_cleanJetsAll ) setattr(event,"gamma_cleanJets" +self.cfg_ana.collectionPostFix, self.gamma_cleanJets ) setattr(event,"gamma_cleanJetsFwd" +self.cfg_ana.collectionPostFix, self.gamma_cleanJetsFwd ) setattr(event,"gamma_cleanJetsFailIdAll" +self.cfg_ana.collectionPostFix, self.gamma_cleanJetsFailIdAll ) setattr(event,"gamma_cleanJetsFailId" +self.cfg_ana.collectionPostFix, self.gamma_cleanJetsFailId ) if self.cfg_comp.isMC: setattr(event,"deltaMetFromJetSmearing"+self.cfg_ana.collectionPostFix, self.deltaMetFromJetSmearing) setattr(event,"cleanGenJets" +self.cfg_ana.collectionPostFix, self.cleanGenJets ) setattr(event,"genJets" +self.cfg_ana.collectionPostFix, self.genJets ) if self.cfg_ana.do_mc_match: setattr(event,"bqObjects" +self.cfg_ana.collectionPostFix, self.bqObjects ) setattr(event,"cqObjects" +self.cfg_ana.collectionPostFix, self.cqObjects ) setattr(event,"partons" +self.cfg_ana.collectionPostFix, self.partons ) setattr(event,"heaviestQCDFlavour" +self.cfg_ana.collectionPostFix, self.heaviestQCDFlavour ) return True
def process(self, event): self.readCollections(event.input) miniaodjets = self.handles['jets'].product() allJets = [] event.jets = [] event.bJets = [] event.cleanJets = [] event.cleanBJets = [] leptons = [] if hasattr(event, 'selectedLeptons'): leptons = event.selectedLeptons genJets = None if self.cfg_comp.isMC: genJets = map(GenJet, self.mchandles['genJets'].product()) for maodjet in miniaodjets: jet = Jet(maodjet) allJets.append(jet) if self.cfg_comp.isMC and hasattr(self.cfg_comp, 'jetScale'): scale = random.gauss(self.cfg_comp.jetScale, self.cfg_comp.jetSmear) jet.scaleEnergy(scale) if genJets: # Use DeltaR = 0.25 matching like JetMET pairs = matchObjectCollection([jet], genJets, 0.25 * 0.25) if pairs[jet] is None: pass else: jet.matchedGenJet = pairs[jet] # Add JER correction for MC jets. Requires gen-jet matching. if self.cfg_comp.isMC and hasattr(self.cfg_ana, 'jerCorr') and self.cfg_ana.jerCorr: self.jerCorrection(jet) # Add JES correction for MC jets. if self.cfg_comp.isMC and hasattr(self.cfg_ana, 'jesCorr'): self.jesCorrection(jet, self.cfg_ana.jesCorr) if self.testJet(jet): event.jets.append(jet) if self.testBJet(jet): event.bJets.append(jet) self.counters.counter('jets').inc('all events') event.cleanJets, dummy = cleanObjectCollection(event.jets, masks=leptons, deltaRMin=0.5) event.cleanBJets, dummy = cleanObjectCollection(event.bJets, masks=leptons, deltaRMin=0.5) # Attach matched jets to selected + other leptons if hasattr(event, 'otherLeptons'): leptons += event.otherLeptons pairs = matchObjectCollection(leptons, allJets, 0.5 * 0.5) # associating a jet to each lepton for lepton in leptons: jet = pairs[lepton] if jet is None: lepton.jet = lepton else: lepton.jet = jet # associating a leg to each clean jet invpairs = matchObjectCollection(event.cleanJets, leptons, 99999.) for jet in event.cleanJets: leg = invpairs[jet] jet.leg = leg for jet in event.cleanJets: jet.matchGenParton = 999.0 if self.cfg_comp.isMC and "BB" in self.cfg_comp.name: genParticles = self.mchandles['genParticles'].product() event.genParticles = map(GenParticle, genParticles) for gen in genParticles: if abs(gen.pdgId()) == 5 and gen.mother() and abs(gen.mother().pdgId()) == 21: for jet in event.cleanJets: dR = deltaR2(jet.eta(), jet.phi(), gen.eta(), gen.phi()) if dR < jet.matchGenParton: jet.matchGenParton = dR event.jets30 = [jet for jet in event.jets if jet.pt() > 30] event.cleanJets30 = [jet for jet in event.cleanJets if jet.pt() > 30] if len(event.jets30) >= 2: self.counters.counter('jets').inc('at least 2 good jets') if len(event.cleanJets30) >= 2: self.counters.counter('jets').inc('at least 2 clean jets') if len(event.cleanBJets) > 0: self.counters.counter('jets').inc('at least 1 b jet') if len(event.cleanBJets) > 1: self.counters.counter('jets').inc('at least 2 b jets') return True