예제 #1
0
    def analyze(self, event):
        # Read branches that may be created by previous step in the chain
        # It's important to read them like this in case they
        # are created by the step before in a PostProcessor chain.
        event = mappedEvent(event, mapname=self._branch_map)

        self.vbs_category = event.VBS_category
        self.rawJet_coll = Collection(event, 'Jet')
        self.Jet_coll = Collection(event, 'CleanJet')
        self.JetNotFat_coll = Collection(event, 'CleanJetNotFat')

        lepton_raw = Object(event, "Lepton", index=0)
        met_raw = Object(event, self.metType)

        category = int(self.vbs_category)

        # Check if VBS category
        if category not in [0, 1]:
            output = vbs_vars.getDefault()
            # Fill the branches
            for var, val in output.items():
                self.out.fillBranch(var, val)
            return True

        lep = TLorentzVector()
        lep.SetPtEtaPhiE(lepton_raw.pt, lepton_raw.eta, lepton_raw.phi,
                         lepton_raw.pt * cosh(lepton_raw.eta))
        met = TLorentzVector()
        met.SetPtEtaPhiE(met_raw.pt, 0., met_raw.phi, met_raw.pt)

        # Reconstruct neutrino from lepton and met
        reco_neutrino = RecoNeutrino.reconstruct_neutrino(lep,
                                                          met,
                                                          mode="central")

        # Extract the jets four momenta using only JetNotFat but keeping
        # a reference to the CleanJet index.
        jets, jets_ids = self.get_jets_vectors()
        vbsjets = []
        vjets = []
        other_jets = []
        other_jets_ind = []
        for jet, jetind in zip(jets, jets_ids):
            if jetind in event[self.VBS_jets_var[category]]:
                vbsjets.append(jet)
            elif jetind in event[self.V_jets_var[category]]:
                vjets.append(jet)
            else:
                other_jets.append(jet)
                other_jets_ind.append(jetind)

        # Check Mjj_vbs and deltaeta_vbs cuts
        if ((vbsjets[0]+vbsjets[1]).M() < self.mjj_vbs_cut or \
               abs(vbsjets[0].Eta() - vbsjets[1].Eta()) < self.deltaeta_vbs_cut):
            return False

        output = None

        if category == 0:
            #####################
            # Boosted category
            fatjet = Object(event, "CleanFatJet", index=0)
            # CleanFatJet collection mass is Softdrop PUPPI mass
            output = vbs_vars.getVBSkin_boosted(vbsjets,
                                                fatjet.p4(),
                                                lep,
                                                met,
                                                reco_neutrino,
                                                other_jets,
                                                other_jets_ind,
                                                debug=self.debug)

        elif category == 1:
            #####################
            # Resolved category
            output = vbs_vars.getVBSkin_resolved(vbsjets,
                                                 vjets,
                                                 lep,
                                                 met,
                                                 reco_neutrino,
                                                 other_jets,
                                                 other_jets_ind,
                                                 debug=self.debug)

        # Fill the branches
        for var, val in output.items():
            self.out.fillBranch(var, val)
        """return True (go to next module) or False (fail, go to next event)"""
        return True
예제 #2
0
    def analyze(self, event):
        # Read branches that may be created by previous step in the chain
        # It's important to read them like this in case they
        # are created by the step before in a PostProcessor chain.
        self.vbs_category = event.VBS_category
        self.rawJet_coll = Collection(event, 'Jet')
        self.Jet_coll = Collection(event, 'CleanJet')
        self.JetNotFat_coll = Collection(event, 'CleanJetNotFat')

        # # do this check at every event, as other modules might have read further branches
        # if event._tree._ttreereaderversion > self._ttreereaderversion:
        #     self.initReaders(event._tree)

        lepton_raw = Object(event, "Lepton", index=0)
        puppiMET = Object(event, "PuppiMET")
        category = int(self.vbs_category)

        lep = TLorentzVector()
        lep.SetPtEtaPhiE(lepton_raw.pt, lepton_raw.eta, lepton_raw.phi,
                         lepton_raw.pt * cosh(lepton_raw.eta))
        puppimet = TLorentzVector()
        puppimet.SetPtEtaPhiE(puppiMET.pt, 0., puppiMET.phi, puppiMET.pt)

        # Trick for ArrayRead -> list
        # vbs_jets_index = [self.vbs_jets[0], self.vbs_jets[1]]
        # v_jets_index = [self.v_jets[0], self.v_jets[1]]

        jets, jets_ids = self.get_jets_vectors(self.minptjet)

        output = None

        if category == 0:
            #####################
            # Boosted category
            v_jets_index = [
                event[self.V_jets_var[0]][0], event[self.V_jets_var[0]][1]
            ]
            vbs_jets_index = [
                event[self.VBS_jets_var[0]][0], event[self.VBS_jets_var[0]][1]
            ]
            fatjet = Object(event, "CleanFatJet", index=0)
            other_jets = []
            vbsjets = []
            # N.B. VBsjets and VJets indexes refers to the original CleanJet collection
            # the jets list is loaded with the NotFatJet mask. We have to compare original ids.
            for jet, jetind in zip(jets, jets_ids):
                if jetind in vbs_jets_index:
                    vbsjets.append(jet)
                else:
                    other_jets.append(jet)

            # CleanFatJet collection mass is Softdrop PUPPI mass
            output = vbs_vars.getVBSkin_boosted(vbsjets,
                                                fatjet.p4(),
                                                lep,
                                                puppimet,
                                                other_jets,
                                                debug=self.debug)

        elif category == 1:
            #####################
            # Resolved category
            v_jets_index = [
                event[self.V_jets_var[1]][0], event[self.V_jets_var[1]][1]
            ]
            vbs_jets_index = [
                event[self.VBS_jets_var[1]][0], event[self.VBS_jets_var[1]][1]
            ]
            other_jets = []
            vbsjets = []
            vjets = []
            for jet, jetind in zip(jets, jets_ids):
                if jetind in vbs_jets_index:
                    vbsjets.append(jet)
                elif jetind in v_jets_index:
                    vjets.append(jet)
                else:
                    other_jets.append(jet)
            output = vbs_vars.getVBSkin_resolved(vbsjets,
                                                 vjets,
                                                 lep,
                                                 puppimet,
                                                 other_jets,
                                                 debug=self.debug)

        # elif category == 2:
        #     ##############################
        #     # Missing jet (3-jet) category
        #     if self.debug: print "Category 2: Missing one jet"
        #     output = vbs_vars.getDefault()

        # Fill the branches
        for var, val in output.items():
            self.out.fillBranch(var, val)
        """return True (go to next module) or False (fail, go to next event)"""
        return True