Esempio n. 1
0
 def process(self, event):
     dileptons = getattr(event, self.cfg_ana.dileptons)
     leptons = [dileptons[0].leg1(), dileptons[0].leg2()]
     jets = getattr(event, self.cfg_ana.jets)
     clean_jets, dirty_jets = cleanObjectCollection(
         jets, masks=leptons, deltaRMin=self.cfg_ana.drmin)
     setattr(event, self.cfg_ana.output, clean_jets)
Esempio n. 2
0
    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
Esempio n. 3
0
    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
        if hasattr(self.cfg_ana, 'toClean'):
            leptons = getattr(event, self.cfg_ana.toClean)

        if hasattr(self.cfg_ana, 'leptonCollections'):
            for coll in self.cfg_ana.leptonCollections:
                leptons += self.handles[coll].product()

        genJets = None
        if self.cfg_comp.isMC:
            genJets = map(GenJet, self.mchandles['genJets'].product())

        allJets = [Jet(jet) for jet in miniaodjets]

        if self.recalibrateJets:
            self.jetReCalibrator.correctAll(allJets,
                                            event.rho,
                                            delta=0.,
                                            addCorr=True,
                                            addShifts=True)

        for jet in allJets:
            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

        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')

        # save HTs
        event.HT_allJets = sum([jet.pt() for jet in allJets])
        event.HT_jets = sum([jet.pt() for jet in event.jets])
        event.HT_bJets = sum([jet.pt() for jet in event.bJets])
        event.HT_cleanJets = sum([jet.pt() for jet in event.cleanJets])
        event.HT_jets30 = sum([jet.pt() for jet in event.jets30])
        event.HT_cleanJets30 = sum([jet.pt() for jet in event.cleanJets30])

        return True
    def process(self, event):
        self.readCollections( event.input )
                
        tr = self.tree
        tr.reset()

        fill( tr, 'run', event.input.eventAuxiliary().id().run())
        fill( tr, 'lumi', event.input.eventAuxiliary().id().luminosityBlock())
        fill( tr, 'evt', event.input.eventAuxiliary().id().event())

        genParticles = self.mchandles['genParticles'].product()
        event.genParticles = map( GenParticle, genParticles)

#         # For Z
# #        parent = 23
# #        parent_status = 22

#         # For Higgs
#         parent = 25
#         parent_status = 3

        bosonParents = [23, 25]

        bosonStati = [3, 22]

        bosons = [self.finalSelf(gen) for gen in event.genParticles if gen.status() in bosonStati and abs(gen.pdgId()) in bosonParents]

        if len(bosons)!=1:
            strerr = '{nhiggs} bosons! :\n {comp}'.format(nhiggs=len(higbosonsgsBosons), comp=str(self.cfg_comp))
            print strerr
            return False
        
        boson = bosons[0]

        # Get generated taus
        taus = []
        for i_d in range(boson.numberOfDaughters()):
            daughter = boson.daughter(i_d)
            if abs(daughter.pdgId()) == 15:
                taus.append(self.finalSelf(daughter))

        if len(taus) != 2:
            print 'Non-tau decay'
            return False

        # Get tau daughters
        tauDecayIds = []
        muon = None
        had_tau = None
        for tau in taus:
            decayId = 15
            for i_d in range(tau.numberOfDaughters()):
                if abs(tau.daughter(i_d).pdgId()) == 13:
                    muon = self.finalSelf(tau.daughter(i_d))
                    decayId = 13
                    continue
                elif abs(tau.daughter(i_d).pdgId()) == 11:
                    decayId = 11
                    continue
            if decayId == 15:
                had_tau = tau
            tauDecayIds.append(decayId)

        if not (13 in tauDecayIds and 15 in tauDecayIds):
            print 'Not a mu-tau decay'
            return False


        fillGenParticle(tr, 'l2_gen', muon)
        genVisTau = self.getVisibleP4(muon)
        fill(tr, 'l2_gen_vis_pt', genVisTau.pt())
        fill(tr, 'l2_gen_vis_eta', genVisTau.eta())
        fill(tr, 'l2_gen_vis_phi', genVisTau.phi())
        fill(tr, 'l2_gen_vis_m', genVisTau.mass())
        fill(tr, 'l2_gen_decay_pdgId', muon.pdgId())



        fillGenParticle(tr, 'higgs', boson)


        fillGenParticle(tr, 'l1_gen', had_tau)
        genVisTau1 = self.getVisibleP4(had_tau)
        fill(tr, 'l1_gen_vis_pt', genVisTau1.pt())
        fill(tr, 'l1_gen_vis_eta', genVisTau1.eta())
        fill(tr, 'l1_gen_vis_phi', genVisTau1.phi())
        fill(tr, 'l1_gen_vis_m', genVisTau1.mass())
        fill(tr, 'l1_gen_decay_pdgId', had_tau.pdgId())
        
        daughters = [muon, had_tau]

        genJets = self.mchandles['genJets'].product()
        event.genJets = map(GenJet, genJets)

        selGenJets = [jet for jet in event.genJets if jet.pt() > 30 and abs(jet.eta()) < 4.7]
        
        cleanGenJets, dummy = cleanObjectCollection( selGenJets,
                                                     masks = daughters,
                                                     deltaRMin = 0.5)

        cleanGenJets.sort(key=lambda x: -x.pt())

        deta = -1
        mjj = -1
        ncentral = -1
        
        fill(tr, 'nGenJets', len(cleanGenJets))

        if len(cleanGenJets) >= 2:
            deta = cleanGenJets[0].eta() - cleanGenJets[1].eta()
            dijetp4 = cleanGenJets[0].p4() + cleanGenJets[1].p4()
            mjj = dijetp4.M()
            
            leadJets = cleanGenJets[:2]
            otherJets = cleanGenJets[2:]
            centralJets = self.findCentralJets( leadJets, otherJets )
            ncentral = len(centralJets)
            
            fill(tr, 'mjj', mjj)
            fill(tr, 'deta', deta)
            fill(tr, 'nCentral', ncentral)
            
            

        if len(cleanGenJets)>=1:
            fillGenParticle(tr, 'genjet1', cleanGenJets[0])
        if len(cleanGenJets)>=2:
            fillGenParticle(tr, 'genjet2', cleanGenJets[1])


        neutrinos = [p for p in event.genParticles if abs(p.pdgId()) in (12, 14, 16) and self.isFinal(p)]
        if neutrinos:
            genMet = neutrinos[0].p4()
            for p in neutrinos[1:]:
                genMet += p.p4()
            fill(tr, 'genMet', p.pt())
            fill(tr, 'genMex', p.px())
            fill(tr, 'genMey', p.py())
        else:
            fill(tr, 'genMet', 0.)
            fill(tr, 'genMex', 0.)
            fill(tr, 'genMey', 0.)
          

        quarksGluons = [p for p in event.genParticles if abs(p.pdgId()) in (1, 2, 3, 4, 5, 21) and p.status() == 3 and (p.numberOfDaughters() == 0 or p.daughter(0).status() != 3)]
        quarksGluons.sort(key=lambda x: -x.pt())
        for i in range(0, min(self.maxNGenJets, len(quarksGluons))):
            fillGenParticle(tr, 'genQG_{i}'.format(i=i), quarksGluons[i])
            
            
        self.tree.tree.Fill()
Esempio n. 5
0
    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
Esempio n. 6
0
    def process(self, event):

        self.counters.counter('jets').inc('all events')
        self.readCollections(event.input)
        miniaodjets = self.handles['jets'].product()

        allJets = []

        to_clean_against = []
        if hasattr(self.cfg_ana, 'toClean'):
            for collection in self.cfg_ana.toClean:
                to_clean_against += getattr(event, collection)

        genJets = None
        if self.cfg_comp.isMC:
            genJets = map(GenJet, self.mchandles['genJets'].product())

        allJets = [Jet(jet) for jet in miniaodjets]

        if self.recalibrateJets:
            self.jetReCalibrator.correctAll(allJets,
                                            event.rho,
                                            delta=0.,
                                            addCorr=True,
                                            addShifts=True)

        for jet in allJets:
            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)
            jet.btagMVA = jet.btag(
                'pfCombinedInclusiveSecondaryVertexV2BJetTags'
            )  #TODO switch to deepCSV
            jet.btagged = self.btagSF.isBTagged(
                pt=jet.pt(),
                eta=jet.eta(),
                csv=jet.btag("pfCombinedInclusiveSecondaryVertexV2BJetTags"),
                jetflavor=abs(jet.hadronFlavour()),
                is_data=not self.cfg_comp.isMC,
                csv_cut=
                0.800  #CSVM from https://twiki.cern.ch/twiki/bin/viewauth/CMS/BtagRecommendation80X
            )
            ## if self.testJet(jet):
            ## 	event.jets.append(jet)
            ## if self.testBJet(jet):
            ## 	event.bJets.append(jet)

        allJets = [
            jet for jet in allJets if bool(jet.jetID("POG_PFID_Loose"))
            if jet.pt() > 20. if abs(jet.eta()) < 2.4
        ]
        if len(allJets) < 2: return False
        self.counters.counter('jets').inc('at least 2 good jets')

        event.jets, dummy = cleanObjectCollection(allJets,
                                                  masks=to_clean_against,
                                                  deltaRMin=0.5)
        if len(event.jets) < 2: return False
        self.counters.counter('jets').inc('at least 2 clean jets')

        event.bJets = [jet for jet in event.jets if jet.btagged]
        if len(event.bJets) != 2: return False
        self.counters.counter('jets').inc('exactly 2 b jets')

        # save HTs
        event.HT_jets = sum([jet.pt() for jet in event.jets])
        event.HT_bJets = sum([jet.pt() for jet in event.bJets])

        return True
    def process(self, event):
        self.readCollections(event.input)

        tr = self.tree
        tr.reset()

        fill(tr, 'run', event.input.eventAuxiliary().id().run())
        fill(tr, 'lumi', event.input.eventAuxiliary().id().luminosityBlock())
        fill(tr, 'evt', event.input.eventAuxiliary().id().event())

        genParticles = self.mchandles['genParticles'].product()
        event.genParticles = map(GenParticle, genParticles)

        #         # For Z
        # #        parent = 23
        # #        parent_status = 22

        #         # For Higgs
        #         parent = 25
        #         parent_status = 3

        bosonParents = [23, 25]

        bosonStati = [3, 22]

        bosons = [
            self.finalSelf(gen) for gen in event.genParticles
            if gen.status() in bosonStati and abs(gen.pdgId()) in bosonParents
        ]

        if len(bosons) != 1:
            strerr = '{nhiggs} bosons! :\n {comp}'.format(
                nhiggs=len(higbosonsgsBosons), comp=str(self.cfg_comp))
            print strerr
            return False

        boson = bosons[0]

        # Get generated taus
        taus = []
        for i_d in range(boson.numberOfDaughters()):
            daughter = boson.daughter(i_d)
            if abs(daughter.pdgId()) == 15:
                taus.append(self.finalSelf(daughter))

        if len(taus) != 2:
            print 'Non-tau decay'
            return False

        # Get tau daughters
        tauDecayIds = []
        muon = None
        had_tau = None
        for tau in taus:
            decayId = 15
            for i_d in range(tau.numberOfDaughters()):
                if abs(tau.daughter(i_d).pdgId()) == 13:
                    muon = self.finalSelf(tau.daughter(i_d))
                    decayId = 13
                    continue
                elif abs(tau.daughter(i_d).pdgId()) == 11:
                    decayId = 11
                    continue
            if decayId == 15:
                had_tau = tau
            tauDecayIds.append(decayId)

        if not (13 in tauDecayIds and 15 in tauDecayIds):
            print 'Not a mu-tau decay'
            return False

        fillGenParticle(tr, 'l2_gen', muon)
        genVisTau = self.getVisibleP4(muon)
        fill(tr, 'l2_gen_vis_pt', genVisTau.pt())
        fill(tr, 'l2_gen_vis_eta', genVisTau.eta())
        fill(tr, 'l2_gen_vis_phi', genVisTau.phi())
        fill(tr, 'l2_gen_vis_m', genVisTau.mass())
        fill(tr, 'l2_gen_decay_pdgId', muon.pdgId())

        fillGenParticle(tr, 'higgs', boson)

        fillGenParticle(tr, 'l1_gen', had_tau)
        genVisTau1 = self.getVisibleP4(had_tau)
        fill(tr, 'l1_gen_vis_pt', genVisTau1.pt())
        fill(tr, 'l1_gen_vis_eta', genVisTau1.eta())
        fill(tr, 'l1_gen_vis_phi', genVisTau1.phi())
        fill(tr, 'l1_gen_vis_m', genVisTau1.mass())
        fill(tr, 'l1_gen_decay_pdgId', had_tau.pdgId())

        daughters = [muon, had_tau]

        genJets = self.mchandles['genJets'].product()
        event.genJets = map(GenJet, genJets)

        selGenJets = [
            jet for jet in event.genJets
            if jet.pt() > 30 and abs(jet.eta()) < 4.7
        ]

        cleanGenJets, dummy = cleanObjectCollection(selGenJets,
                                                    masks=daughters,
                                                    deltaRMin=0.5)

        cleanGenJets.sort(key=lambda x: -x.pt())

        deta = -1
        mjj = -1
        ncentral = -1

        fill(tr, 'nGenJets', len(cleanGenJets))

        if len(cleanGenJets) >= 2:
            deta = cleanGenJets[0].eta() - cleanGenJets[1].eta()
            dijetp4 = cleanGenJets[0].p4() + cleanGenJets[1].p4()
            mjj = dijetp4.M()

            leadJets = cleanGenJets[:2]
            otherJets = cleanGenJets[2:]
            centralJets = self.findCentralJets(leadJets, otherJets)
            ncentral = len(centralJets)

            fill(tr, 'mjj', mjj)
            fill(tr, 'deta', deta)
            fill(tr, 'nCentral', ncentral)

        if len(cleanGenJets) >= 1:
            fillGenParticle(tr, 'genjet1', cleanGenJets[0])
        if len(cleanGenJets) >= 2:
            fillGenParticle(tr, 'genjet2', cleanGenJets[1])

        neutrinos = [
            p for p in event.genParticles
            if abs(p.pdgId()) in (12, 14, 16) and self.isFinal(p)
        ]
        if neutrinos:
            genMet = neutrinos[0].p4()
            for p in neutrinos[1:]:
                genMet += p.p4()
            fill(tr, 'genMet', p.pt())
            fill(tr, 'genMex', p.px())
            fill(tr, 'genMey', p.py())
        else:
            fill(tr, 'genMet', 0.)
            fill(tr, 'genMex', 0.)
            fill(tr, 'genMey', 0.)

        quarksGluons = [
            p for p in event.genParticles
            if abs(p.pdgId()) in (1, 2, 3, 4, 5, 21) and p.status() == 3 and (
                p.numberOfDaughters() == 0 or p.daughter(0).status() != 3)
        ]
        quarksGluons.sort(key=lambda x: -x.pt())
        for i in range(0, min(self.maxNGenJets, len(quarksGluons))):
            fillGenParticle(tr, 'genQG_{i}'.format(i=i), quarksGluons[i])

        self.tree.tree.Fill()
Esempio n. 8
0
    def process(self, event):

        self.readCollections(event.input)
        
        # create Heppy Jet objects
        allJets = map(Jet, self.handles['jets'].product())

        # create intially empty jet collections
        event.jets  = []
        event.bJets = []
        event.cleanJets   = OrderedDict()
        event.cleanJets30 = OrderedDict()
        event.cleanBJets  = OrderedDict()
        
        # selected leptons as defined in the analyzer prior to this
        leptons = getattr(event, 'selectedLeptons', [])

        genJets = None
        if self.cfg_comp.isMC:
            genJets = map(GenJet, self.mchandles['genJets'].product())
            
        # recalibrate jets
        if self.recalibrateJets:
            self.jetReCalibrator.correctAll(allJets, event.rho, delta=0., metShift=[0.,0.], addCorr=True, addShifts=True)

        # fill the various jet collections and
        # possibly correct jets (if configured to do so)
        for jet in allJets:
            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/JES correction for MC jets. Requires gen-jet matching.
            # Add JES correction for MC jets.
            if self.cfg_comp.isMC and hasattr(self.cfg_ana, 'jerCorr') and self.cfg_ana.jerCorr: self.jerCorrection(jet)
            if self.cfg_comp.isMC and hasattr(self.cfg_ana, 'jesCorr')                         : self.jesCorrection(jet, self.cfg_ana.jesCorr)
            
            # preselect jets
            if self.testJet(jet) : event.jets.append(jet)
            
            # compute deepjet scores only once
            self._prepareDeepJet(jet, year=self.cfg_ana.year, wp=getattr(self.cfg_ana, 'btag_wp', 'medium'))

            # create collection of bjets
            if self.testBJet(jet, 
                             year=self.cfg_ana.year, 
                             wp=getattr(self.cfg_ana, 'btag_wp', 'medium'), 
                             final_state='tot'): 
                event.bJets.append(jet)

        self.counters.counter('jets').inc('all events')

        for final_state in ['mmm', 'mem', 'eee', 'eem']:
            
            if final_state not in leptons.keys():
                continue

            # RM: found out that there's not a lot of final state dependency,
            #     so we'll use the inclusive measurement that has better stats
            # preselect jets, with the appropriate btag SF correction **final state dependent**!
            # event.bJets = []
            # for jet in event.jets:
            #     if self.testBJet(jet, 
            #                      year=self.cfg_ana.year, 
            #                      wp=getattr(self.cfg_ana, 'btag_wp', 'medium'), 
            #                      final_state=final_state): 
            #         event.bJets.append(jet)
                        
            # clean jets from selected leptons (per final state!)
            event.cleanJets [final_state], dummy = cleanObjectCollection(event.jets , masks=leptons[final_state], deltaRMin=0.5)
            event.cleanBJets[final_state], dummy = cleanObjectCollection(event.bJets, masks=leptons[final_state], deltaRMin=0.5)

            pairs = matchObjectCollection(leptons[final_state], allJets, 0.5 * 0.5)
            # associating a jet to each lepton
            for lepton in leptons[final_state]:
                jet = pairs[lepton]
                if jet is None:
                    lepton.jet = lepton
                else:
                    lepton.jet = jet

            # associating to each (clean) jet the lepton that's closest to it
            invpairs = matchObjectCollection(event.cleanJets[final_state], leptons[final_state], 99999.)
            for jet in event.cleanJets[final_state]:
                leg = invpairs[jet]
                jet.leg = leg

            for jet in event.cleanJets[final_state]:
                jet.matchGenParton = 999.0

            event.jets30                   = [jet for jet in event.jets                   if jet.pt() > 30]
            event.cleanJets30[final_state] = [jet for jet in event.cleanJets[final_state] if jet.pt() > 30]
                                    
        return True
Esempio n. 9
0
    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