コード例 #1
0
    def process(self, event):
        self.tree.reset()
        jets_trk02 = getattr(event, self.cfg_ana.jets_trk02_1000)
        jets_pf02 = getattr(event, self.cfg_ana.jets_pf02_1500)
        jets_pf04 = getattr(event, self.cfg_ana.jets_pf04_1000)
        jets_pf04_pdg = event.jets_pf04_1000_pdg
        jets_pf08 = getattr(event, self.cfg_ana.jets_pf08_1500)
        #gen_particles = event.all_particles

        jets_pf04_1500 = getattr(event, self.cfg_ana.jets_pf04_1500)
        jets_trk04 = getattr(event, self.cfg_ana.jets_trk04_1000)
        jets_trk08 = getattr(event, self.cfg_ana.jets_trk08_1000)
        
        electrons = getattr(event, self.cfg_ana.electrons)
        muons = getattr(event, self.cfg_ana.muons)

        #self.tree2.reset()
        ##
        #label = -1
        #part1 = -10000
        #part2 = -10000
        #index = 0
        #part_index = -1
        #count = 0
        #for j in gen_particles :
        #  # 1st part
        #  if (j.status()==22 or j.status()==23) and count==0:
        #    part1 = j.pdgid()
        #    count += 1
        #    part_index = index
        #  # 2nd part
        #  if (j.status()==22 or j.status()==23) and count==1 and j.q()+gen_particles[part_index].q()==0:
        #    part2 = j.pdgid()
        #    count += 1
        #  index += 1
        #if abs(part1)==6 and abs(part2)==6 : label = 6
        #if abs(part1)==5 and abs(part2)==5 : label = 5
        #if abs(part1)==4 and abs(part2)==4 : label = 4
        #if abs(part1)==3 and abs(part2)==3 : label = 0
        #if abs(part1)==2 and abs(part2)==2 : label = 0
        #if abs(part1)==1 and abs(part2)==1 : label = 0
        ## missed cases
        #if label == -1 :
        #  count = 0
        #  for j in gen_particles :
        #    if count<10 and abs(j.pdgid())==6 :
        #      label = 6
        #    count += 1
        #if label==-1 : print "issue label==-1"
        ##
        #self.tree2.fill('label' , label )
        #self.tree2.tree.Fill()

        Jet1_trk02_dR_lep = 999
        Jet2_trk02_dR_lep  = 999
        if ( len(jets_trk02)>=2 and  len(jets_pf02)>=2):

            #self.tree.fill('label' , label )

            j1 = ROOT.TLorentzVector(); j2 = ROOT.TLorentzVector()
            j1.SetPtEtaPhiE(jets_trk02[0].pt(), jets_trk02[0].eta(), jets_trk02[0].phi(), jets_trk02[0].e())
            j2.SetPtEtaPhiE(jets_trk02[1].pt(), jets_trk02[1].eta(), jets_trk02[1].phi(), jets_trk02[1].e())
            if ( len(electrons)!=0 and len(muons)==0 ):
                e = ROOT.TLorentzVector()
                e.SetPtEtaPhiE(electrons[0].pt(), electrons[0].eta(), electrons[0].phi(), electrons[0].e())
                Jet1_dR = j1.DeltaR(e)
                Jet2_dR = j2.DeltaR(e)
            if ( len(electrons)==0 and len(muons)!=0 ):
                m = ROOT.TLorentzVector()
                m.SetPtEtaPhiE(muons[0].pt(), muons[0].eta(), muons[0].phi(), muons[0].e())
                Jet1_dR = j1.DeltaR(m)
                Jet2_dR = j2.DeltaR(m)
            if ( len(electrons)!=0 and len(muons)!=0 ):
                isElectron = False; isMuon = False
                if ( electrons[0].pt() > muons[0].pt() ): isElectron = True
                else: isMuon = True
                l = ROOT.TLorentzVector()
                if isElectron: l.SetPtEtaPhiE(electrons[0].pt(), electrons[0].eta(), electrons[0].phi(), electrons[0].e())
                if isMuon: l.SetPtEtaPhiE(muons[0].pt(), muons[0].eta(), muons[0].phi(), muons[0].e())
                Jet1_trk02_dR_lep  = j1.DeltaR(l)
                Jet2_trk02_dR_lep  = j2.DeltaR(l)
            
            self.tree.fill('Jet1_trk02_dR_lep' , Jet1_trk02_dR_lep )
            self.tree.fill('Jet2_trk02_dR_lep' , Jet2_trk02_dR_lep )
#had_hadsemilep_lep_decays

            self.tree.fill('weight' , event.weight )
            self.tree.fill('missingET', event.met.pt())
            self.tree.fill('numberOfElectrons', len(electrons))
            self.tree.fill('numberOfMuons', len(muons))

            self.tree.fill('rapiditySeparation_trk02', abs(jets_trk02[0].eta() - jets_trk02[1].eta()))
            self.tree.fill('transverseMomentumAsymmetry_trk02', (jets_trk02[0].pt() - jets_trk02[1].pt())/(jets_trk02[0].pt() + jets_trk02[1].pt()))

            self.tree.fill('Jet1_trk02_tau1' , jets_trk02[0].tau1 )
            self.tree.fill('Jet1_trk02_tau2' , jets_trk02[0].tau2 )
            self.tree.fill('Jet1_trk02_tau3' , jets_trk02[0].tau3 )
            self.tree.fill('Jet2_trk02_tau1' , jets_trk02[1].tau1 )
            self.tree.fill('Jet2_trk02_tau2' , jets_trk02[1].tau2 )
            self.tree.fill('Jet2_trk02_tau3' , jets_trk02[1].tau3 )

            Jet1_trk02_tau31 = -999.0
            Jet1_trk02_tau21 = -999.0
            Jet1_trk02_tau32 = -999.0
            Jet2_trk02_tau31 = -999.0
            Jet2_trk02_tau21 = -999.0
            Jet2_trk02_tau32 = -999.0

            if (jets_trk02[0].tau1 != 0.0):
                Jet1_trk02_tau31 = jets_trk02[0].tau3/jets_trk02[0].tau1
                Jet1_trk02_tau21 = jets_trk02[0].tau2/jets_trk02[0].tau1 
            if (jets_trk02[0].tau2 != 0.0):
                Jet1_trk02_tau32 = jets_trk02[0].tau3/jets_trk02[0].tau2

            if (jets_trk02[1].tau1 != 0.0):
                Jet2_trk02_tau31 = jets_trk02[1].tau3/jets_trk02[1].tau1
                Jet2_trk02_tau21 = jets_trk02[1].tau2/jets_trk02[1].tau1
            if (jets_trk02[1].tau2 != 0.0):
                Jet2_trk02_tau32 = jets_trk02[1].tau3/jets_trk02[1].tau2

            self.tree.fill('Jet1_trk02_tau31', Jet1_trk02_tau31)
            self.tree.fill('Jet1_trk02_tau21', Jet1_trk02_tau21)
            self.tree.fill('Jet1_trk02_tau32', Jet1_trk02_tau32)
            self.tree.fill('Jet2_trk02_tau31', Jet2_trk02_tau31)
            self.tree.fill('Jet2_trk02_tau21', Jet2_trk02_tau21)
            self.tree.fill('Jet2_trk02_tau32', Jet2_trk02_tau32)

	    # here is btag, need matching in DR
            Jet1_trk02_dR_pf04 = 999
            Jet2_trk02_dR_pf04 = 999
	    for j in jets_pf04:
                pf04= ROOT.TLorentzVector()
                pf04.SetPtEtaPhiE(j.pt(), j.eta(), j.phi(), j.e())
                if j.tags['bf'] > 0:
                    if pf04.DeltaR(j1)<Jet1_trk02_dR_pf04:
                        Jet1_trk02_dR_pf04=pf04.DeltaR(j1)
                    if pf04.DeltaR(j2)<Jet2_trk02_dR_pf04:
                        Jet2_trk02_dR_pf04=pf04.DeltaR(j2)
            #print 'dr j1  ',Jet1_trk02_dR_pf04
            #print 'dr j2  ',Jet2_trk02_dR_pf04
            
            pdg1 = 0
            pdg2 = 0
            if Jet1_trk02_dR_pf04 < 0.3:
                pdg1 = 5
            if Jet2_trk02_dR_pf04 < 0.3:
                pdg2 = 5

            # TRF / truth b-tagging -> need at least 2 jets_pf04
            use_DELPHES=False
            weight_1tagex=0.
            weight_2tagex=0.
            jet=[]
            ipdg=0
            for i in range(len(jets_pf04)):
              if use_DELPHES==True:
                ipdg = jets_pf04[i].tags['flav']
                if ipdg!=4 and ipdg!=5 : ipdg=0
              else:
                ipdg = jets_pf04_pdg[i].flavour
              jet.append([jets_pf04[i],ipdg])
            if (len(jet)>0): weight_1tagex=getNbTagEx(1,jet,2)
            if (len(jet)>1): weight_2tagex=getNbTagEx(2,jet,2)
            weight_1tagin=weight_1tagex+weight_2tagex
            self.tree.fill('weight_1tagex', weight_1tagex)
            self.tree.fill('weight_2tagex', weight_2tagex)
            self.tree.fill('weight_1tagin', weight_1tagin)

            #MATCHING PF02 and trk02 for CORRECTION
            Jet1_trk02_dR_pf02 = 999
            Jet2_trk02_dR_pf02 = 999
            Jet1_pf02 = None
            Jet2_pf02 = None
            for j in jets_pf02:
                pf02= ROOT.TLorentzVector()
                pf02.SetPtEtaPhiE(j.pt(), j.eta(), j.phi(), j.e())
                if pf02.DeltaR(j1)<Jet1_trk02_dR_pf02:
                    Jet1_trk02_dR_pf02=pf02.DeltaR(j1)
                    Jet1_pf02=j
                if pf02.DeltaR(j2)<Jet2_trk02_dR_pf02:
                    Jet2_trk02_dR_pf02=pf02.DeltaR(j2)
                    Jet2_pf02=j
            #print 'jet1 dr ',Jet1_trk02_dR_pf02,'  pf02   ',Jet1_pf02,'  trk02  ',jets_trk02[0]
            #print 'jet2 dr ',Jet2_trk02_dR_pf02,'  pf02   ',Jet2_pf02,'  trk02  ',jets_trk02[1]

	    corr1 = Jet1_pf02.p4().Pt()/j1.Pt()
	    corr2 = Jet2_pf02.p4().Pt()/j2.Pt()

            #print 'corr 1  ',corr1,'   corr2  ',corr2
            #NORMAL TRK02 SD corrected jet
	    p4sd1 = ROOT.TLorentzVector(); p4sd2 = ROOT.TLorentzVector()
	    p4sd1.SetPtEtaPhiM(jets_trk02[0].subjetsSoftDrop[0].p4().Pt()*corr1, 
	    			jets_trk02[0].eta(), 
	        		jets_trk02[0].phi(), 
	        		jets_trk02[0].subjetsSoftDrop[0].p4().M()*corr1)
	    
	    p4sd2.SetPtEtaPhiM(jets_trk02[1].subjetsSoftDrop[0].p4().Pt()*corr2, 
	    			jets_trk02[1].eta(), 
	        		jets_trk02[1].phi(), 
	        		jets_trk02[1].subjetsSoftDrop[0].p4().M()*corr2)
	    
            sdjet1_corr = Particle(pdg1, 0, p4sd1, 1)
            sdjet2_corr = Particle(pdg2, 0, p4sd2, 1)
            fillParticle(self.tree, 'Jet1_trk02_SD_Corr', sdjet1_corr)
            fillParticle(self.tree, 'Jet2_trk02_SD_Corr', sdjet2_corr)

            #NORMAL TRK02 SD jet
	    #sdjet1 = Particle(pdg1, 0, jets_trk02[0].subjetsSoftDrop[0].p4(), 1)
            #sdjet2 = Particle(pdg2, 0, jets_trk02[1].subjetsSoftDrop[0].p4(), 1)
            #fillParticle(self.tree, 'Jet1_trk02_SD', sdjet1)
            #fillParticle(self.tree, 'Jet2_trk02_SD', sdjet2)

            #CORRECTED TRK02 jet
	    p4jet1_corr = ROOT.TLorentzVector(); p4jet2_corr = ROOT.TLorentzVector()
            p4jet1_corr.SetPtEtaPhiM(jets_trk02[0].pt()*corr1, jets_trk02[0].eta(), jets_trk02[0].phi(), jets_trk02[0].m()*corr1)
	    p4jet2_corr.SetPtEtaPhiM(jets_trk02[1].pt()*corr2, jets_trk02[1].eta(), jets_trk02[1].phi(), jets_trk02[1].m()*corr2)

            jet1_corr = Particle(pdg1, 0, p4jet1_corr, 1)
            jet2_corr = Particle(pdg2, 0, p4jet2_corr, 1)
            #fillParticle(self.tree, 'Jet1_trk02_Corr', jet1_corr)
            #fillParticle(self.tree, 'Jet2_trk02_Corr', jet2_corr)

 
            # associate MET to one jet or another based on softdrop
            sdjetmet1, sdjetmet2 = self.corrMET(jets_trk02[0].subjetsSoftDrop[0], pdg1, jets_trk02[1].subjetsSoftDrop[0], pdg2, event.met)
            fillParticle(self.tree, 'Jet1_trk02_SD_MetCorr', sdjetmet1)
            fillParticle(self.tree, 'Jet2_trk02_SD_MetCorr', sdjetmet2)

            sdjetmet1, sdjetmet2 = self.corrMET(sdjet1_corr, pdg1, sdjet2_corr, pdg2, event.met)
            fillParticle(self.tree, 'Jet1_trk02_SD_Corr_MetCorr', sdjetmet1)
            fillParticle(self.tree, 'Jet2_trk02_SD_Corr_MetCorr', sdjetmet2)

            ######################
            # trkjet04 mass info #
            ######################
            #MATCHING PF04 and trk04 for CORRECTION
            Jet1_trk04_dR_pf04 = 999
            Jet2_trk04_dR_pf04 = 999
            Jet1_pf04 = None
            Jet2_pf04 = None
            for j in jets_pf04_1500:
                pf04= ROOT.TLorentzVector()
                pf04.SetPtEtaPhiE(j.pt(), j.eta(), j.phi(), j.e())
                if pf04.DeltaR(j1)<Jet1_trk04_dR_pf04:
                    Jet1_trk04_dR_pf04=pf04.DeltaR(j1)
                    Jet1_pf04=j
                if pf04.DeltaR(j2)<Jet2_trk04_dR_pf04:
                    Jet2_trk04_dR_pf04=pf04.DeltaR(j2)
                    Jet2_pf04=j
            corr1_04 = Jet1_pf04.p4().Pt()/j1.Pt()
            corr2_04 = Jet2_pf04.p4().Pt()/j2.Pt()

            #NORMAL TRK04 SD corrected jet
            p4sd1_04 = ROOT.TLorentzVector(); p4sd2_04 = ROOT.TLorentzVector()
            Jet1_trk04_SD_Corr_m = -1000.   ; Jet2_trk04_SD_Corr_m = -1000.

            if len(jets_trk04)>=1 :
                p4sd1_04.SetPtEtaPhiM(jets_trk04[0].subjetsSoftDrop[0].p4().Pt()*corr1_04,
                                      jets_trk04[0].eta(),
                                      jets_trk04[0].phi(),
                                      jets_trk04[0].subjetsSoftDrop[0].p4().M()*corr1_04)
                pdg1 = 0
                sdjet1_corr_04 = Particle(pdg1, 0, p4sd1_04, 1)
                Jet1_trk04_SD_Corr_m = sdjet1_corr_04.p4().M()

            if len(jets_trk04)>=2 :
                p4sd2_04.SetPtEtaPhiM(jets_trk04[1].subjetsSoftDrop[0].p4().Pt()*corr2_04,
                                      jets_trk04[1].eta(),
                                      jets_trk04[1].phi(),
                                      jets_trk04[1].subjetsSoftDrop[0].p4().M()*corr2_04)
                pdg2 = 0
                sdjet2_corr_04 = Particle(pdg2, 0, p4sd2_04, 1)
                Jet2_trk04_SD_Corr_m = sdjet2_corr_04.p4().M()

            self.tree.fill('Jet1_trk04_SD_Corr_m', Jet1_trk04_SD_Corr_m)
            self.tree.fill('Jet2_trk04_SD_Corr_m', Jet2_trk04_SD_Corr_m)

            ######################
            # trkjet08 mass info #
            ######################
            #MATCHING PF08 and trk08 for CORRECTION
            Jet1_trk08_dR_pf08 = 999
            Jet2_trk08_dR_pf08 = 999
            Jet1_pf08 = None
            Jet2_pf08 = None
            for j in jets_pf08:
                pf08= ROOT.TLorentzVector()
                pf08.SetPtEtaPhiE(j.pt(), j.eta(), j.phi(), j.e())
                if pf08.DeltaR(j1)<Jet1_trk08_dR_pf08:
                    Jet1_trk08_dR_pf08=pf08.DeltaR(j1)
                    Jet1_pf08=j
                if pf08.DeltaR(j2)<Jet2_trk08_dR_pf08:
                    Jet2_trk08_dR_pf08=pf08.DeltaR(j2)
                    Jet2_pf08=j
            corr1_08 = Jet1_pf08.p4().Pt()/j1.Pt()
            corr2_08 = Jet2_pf08.p4().Pt()/j2.Pt()

            #NORMAL TRK08 SD corrected jet
            p4sd1_08 = ROOT.TLorentzVector(); p4sd2_08 = ROOT.TLorentzVector()
            Jet1_trk08_SD_Corr_m = -1000.   ; Jet2_trk08_SD_Corr_m = -1000.

            if len(jets_trk08)>=1 :
                p4sd1_08.SetPtEtaPhiM(jets_trk08[0].subjetsSoftDrop[0].p4().Pt()*corr1_08,
                                      jets_trk08[0].eta(),
                                      jets_trk08[0].phi(),
                                      jets_trk08[0].subjetsSoftDrop[0].p4().M()*corr1_08)
                pdg1 = 0
                sdjet1_corr_08 = Particle(pdg1, 0, p4sd1_08, 1)
                Jet1_trk08_SD_Corr_m = sdjet1_corr_08.p4().M()

            if len(jets_trk08)>=2 :
                p4sd2_08.SetPtEtaPhiM(jets_trk08[1].subjetsSoftDrop[0].p4().Pt()*corr2_08,
                                      jets_trk08[1].eta(),
                                      jets_trk08[1].phi(),
                                      jets_trk08[1].subjetsSoftDrop[0].p4().M()*corr2_08)
                pdg2 = 0
                sdjet2_corr_08 = Particle(pdg2, 0, p4sd2_08, 1)
                Jet2_trk08_SD_Corr_m = sdjet2_corr_08.p4().M()

            self.tree.fill('Jet1_trk08_SD_Corr_m', Jet1_trk08_SD_Corr_m)
            self.tree.fill('Jet2_trk08_SD_Corr_m', Jet2_trk08_SD_Corr_m)

            if (len(jets_trk02)>1): 
                self.tree.fill( 'Mj1j2_trk02',self.fillMass(jets_trk02[0],jets_trk02[1]))
                self.tree.fill( 'Mj1j2_trk02_Corr',self.fillMass(jet1_corr,jet2_corr))
                jetmet1, jetmet2 = self.corrMET(jets_trk02[0], pdg1, jets_trk02[1], pdg2, event.met)
                self.tree.fill( 'Mj1j2_trk02_MetCorr',self.fillMass(jetmet1,jetmet2))
                #fillParticle(self.tree, 'Jet1_trk02_MetCorr', jetmet1)
                #fillParticle(self.tree, 'Jet2_trk02_MetCorr', jetmet2)

                jetmet1, jetmet2 = self.corrMET(jet1_corr, pdg1, jet2_corr, pdg2, event.met)
                self.tree.fill( 'Mj1j2_trk02_Corr_MetCorr',self.fillMass(jetmet1,jetmet2))
                fillParticle(self.tree, 'Jet1_trk02_Corr_MetCorr', jetmet1)
                fillParticle(self.tree, 'Jet2_trk02_Corr_MetCorr', jetmet2)

            if (len(jets_pf02)>1):  
                self.tree.fill( 'Mj1j2_pf02', self.fillMass(jets_pf02[0],jets_pf02[1]))
                jetmet1, jetmet2 = self.corrMET(jets_pf02[0], pdg1, jets_pf02[1], pdg2, event.met)
                self.tree.fill( 'Mj1j2_pf02_MetCorr', self.fillMass(jetmet1,jetmet2))

            if (len(jets_pf04)>1):  
                self.tree.fill( 'Mj1j2_pf04', self.fillMass(jets_pf04[0],jets_pf04[1]))
                jetmet1, jetmet2 = self.corrMET(jets_pf04[0], pdg1, jets_pf04[1], pdg2, event.met)
                self.tree.fill( 'Mj1j2_pf04_MetCorr', self.fillMass(jetmet1,jetmet2))

            if (len(jets_pf08)>1):  
                self.tree.fill( 'Mj1j2_pf08', self.fillMass(jets_pf08[0],jets_pf08[1]))
                jetmet1, jetmet2 = self.corrMET(jets_pf08[0], pdg1, jets_pf08[1], pdg2, event.met)
                self.tree.fill( 'Mj1j2_pf08_MetCorr', self.fillMass(jetmet1,jetmet2))





            if ( len(electrons) >=1 ): fillParticle(self.tree, 'Electron1', electrons[0])
            if ( len(electrons) >=2 ): fillParticle(self.tree, 'Electron2', electrons[1])

            if ( len(muons) >=1 ): fillParticle(self.tree, 'Muon1', muons[0])
            if ( len(muons) >=2 ): fillParticle(self.tree, 'Muon2', muons[1])

            ###################################
            #TMVA Stuff Starts!
            ###################################

            self.bdt_Jet_trk02_tau1[0] = jets_trk02[0].tau1
            self.bdt_Jet_trk02_tau2[0] = jets_trk02[0].tau2
            self.bdt_Jet_trk02_tau3[0] = jets_trk02[0].tau3
            self.bdt_Jet_trk02_tau21[0] = Jet1_trk02_tau21
            self.bdt_Jet_trk02_tau31[0] = Jet1_trk02_tau31
            self.bdt_Jet_trk02_tau32[0] = Jet1_trk02_tau32
            self.bdt_Jet_trk02_SD_Corr_m[0]  = sdjet1_corr.p4().M()
            if len(jets_trk04)>=1 : self.bdt_Jet_trk04_SD_Corr_m[0] = sdjet1_corr_04.p4().M()
            else                  : self.bdt_Jet_trk04_SD_Corr_m[0] = -1000.
            if len(jets_trk08)>=1 : self.bdt_Jet_trk08_SD_Corr_m[0] = sdjet1_corr_08.p4().M()
            else                  : self.bdt_Jet_trk08_SD_Corr_m[0] = -1000.
            mva_value = self.reader.EvaluateMVA("BDT")
            self.tree.fill( 'Jet1_thad_vs_QCD_tagger', mva_value)
            #
            self.bdt_Jet_trk02_tau1[0] = jets_trk02[1].tau1
            self.bdt_Jet_trk02_tau2[0] = jets_trk02[1].tau2
            self.bdt_Jet_trk02_tau3[0] = jets_trk02[1].tau3
            self.bdt_Jet_trk02_tau21[0] = Jet2_trk02_tau21
            self.bdt_Jet_trk02_tau31[0] = Jet2_trk02_tau31
            self.bdt_Jet_trk02_tau32[0] = Jet2_trk02_tau32
            self.bdt_Jet_trk02_SD_Corr_m[0]  = sdjet2_corr.p4().M()
            if len(jets_trk04)>=2 : self.bdt_Jet_trk04_SD_Corr_m[0] = sdjet2_corr_04.p4().M()
            else                  : self.bdt_Jet_trk04_SD_Corr_m[0] = -1000.
            if len(jets_trk08)>=2 : self.bdt_Jet_trk08_SD_Corr_m[0] = sdjet2_corr_08.p4().M()
            else                  : self.bdt_Jet_trk08_SD_Corr_m[0] = -1000.
            mva_value = self.reader.EvaluateMVA("BDT")
            self.tree.fill( 'Jet2_thad_vs_QCD_tagger', mva_value)

            self.tree.tree.Fill()
コード例 #2
0
    def process(self, event):
        self.tree.reset()

        jets_trk02 = getattr(event, self.cfg_ana.jets_trk02_1000)
        jets_pf02 = getattr(event, self.cfg_ana.jets_pf02_1500)
        jets_pf04 = getattr(event, self.cfg_ana.jets_pf04_1000)
        jets_pf08 = getattr(event, self.cfg_ana.jets_pf08_1500)

        jets_pf04_1500 = getattr(event, self.cfg_ana.jets_pf04_1500)
        jets_trk04 = getattr(event, self.cfg_ana.jets_trk04_1000)
        jets_trk08 = getattr(event, self.cfg_ana.jets_trk08_1000)

        electrons = getattr(event, self.cfg_ana.electrons)
        muons = getattr(event, self.cfg_ana.muons)

        if (len(jets_trk02) >= 2 and len(jets_pf02) >= 2):

            self.tree.fill('weight', event.weight)
            self.tree.fill('rapiditySeparation_trk02',
                           abs(jets_trk02[0].eta() - jets_trk02[1].eta()))
            self.tree.fill('transverseMomentumAsymmetry_trk02',
                           (jets_trk02[0].pt() - jets_trk02[1].pt()) /
                           (jets_trk02[0].pt() + jets_trk02[1].pt()))

            self.tree.fill('Jet1_trk02_tau1', jets_trk02[0].tau1)
            self.tree.fill('Jet1_trk02_tau2', jets_trk02[0].tau2)
            self.tree.fill('Jet1_trk02_tau3', jets_trk02[0].tau3)
            self.tree.fill('Jet2_trk02_tau1', jets_trk02[1].tau1)
            self.tree.fill('Jet2_trk02_tau2', jets_trk02[1].tau2)
            self.tree.fill('Jet2_trk02_tau3', jets_trk02[1].tau3)

            self.tree.fill('numberOfElectrons', len(electrons))
            self.tree.fill('numberOfMuons', len(muons))

            if (len(muons) >= 1): fillParticle(self.tree, 'Muon1', muons[0])
            if (len(muons) >= 2): fillParticle(self.tree, 'Muon2', muons[1])

            Jet1_trk02_tau31 = -9.0
            Jet1_trk02_tau21 = -9.0
            Jet1_trk02_tau32 = -9.0
            Jet2_trk02_tau31 = -9.0
            Jet2_trk02_tau21 = -9.0
            Jet2_trk02_tau32 = -9.0

            if (jets_trk02[0].tau1 != 0.0):
                Jet1_trk02_tau31 = jets_trk02[0].tau3 / jets_trk02[0].tau1
                Jet1_trk02_tau21 = jets_trk02[0].tau2 / jets_trk02[0].tau1
            if (jets_trk02[0].tau2 != 0.0):
                Jet1_trk02_tau32 = jets_trk02[0].tau3 / jets_trk02[0].tau2

            if (jets_trk02[1].tau1 != 0.0):
                Jet2_trk02_tau31 = jets_trk02[1].tau3 / jets_trk02[1].tau1
                Jet2_trk02_tau21 = jets_trk02[1].tau2 / jets_trk02[1].tau1
            if (jets_trk02[1].tau2 != 0.0):
                Jet2_trk02_tau32 = jets_trk02[1].tau3 / jets_trk02[1].tau2

            self.tree.fill('Jet1_trk02_tau31', Jet1_trk02_tau31)
            self.tree.fill('Jet1_trk02_tau21', Jet1_trk02_tau21)
            self.tree.fill('Jet1_trk02_tau32', Jet1_trk02_tau32)
            self.tree.fill('Jet2_trk02_tau31', Jet2_trk02_tau31)
            self.tree.fill('Jet2_trk02_tau21', Jet2_trk02_tau21)
            self.tree.fill('Jet2_trk02_tau32', Jet2_trk02_tau32)

            j1 = ROOT.TLorentzVector()
            j2 = ROOT.TLorentzVector()
            j1.SetPtEtaPhiE(jets_trk02[0].pt(), jets_trk02[0].eta(),
                            jets_trk02[0].phi(), jets_trk02[0].e())
            j2.SetPtEtaPhiE(jets_trk02[1].pt(), jets_trk02[1].eta(),
                            jets_trk02[1].phi(), jets_trk02[1].e())

            #MATCHING PF02 and trk02 for CORRECTION
            Jet1_trk02_dR_pf02 = 999
            Jet2_trk02_dR_pf02 = 999
            Jet1_pf02 = None
            Jet2_pf02 = None
            for j in jets_pf02:
                pf02 = ROOT.TLorentzVector()
                pf02.SetPtEtaPhiE(j.pt(), j.eta(), j.phi(), j.e())
                if pf02.DeltaR(j1) < Jet1_trk02_dR_pf02:
                    Jet1_trk02_dR_pf02 = pf02.DeltaR(j1)
                    Jet1_pf02 = j
                if pf02.DeltaR(j2) < Jet2_trk02_dR_pf02:
                    Jet2_trk02_dR_pf02 = pf02.DeltaR(j2)
                    Jet2_pf02 = j
        #print 'jet1 dr ',Jet1_trk02_dR_pf02,'  pf02   ',Jet1_pf02,'  trk02  ',jets_trk02[0]
        #print 'jet2 dr ',Jet2_trk02_dR_pf02,'  pf02   ',Jet2_pf02,'  trk02  ',jets_trk02[1]

            corr1 = Jet1_pf02.p4().Pt() / j1.Pt()
            corr2 = Jet2_pf02.p4().Pt() / j2.Pt()

            #print 'corr 1  ',corr1,'   corr2  ',corr2
            #NORMAL TRK02 SD corrected jet
            p4sd1 = ROOT.TLorentzVector()
            p4sd2 = ROOT.TLorentzVector()
            p4sd1.SetPtEtaPhiM(
                jets_trk02[0].subjetsSoftDrop[0].p4().Pt() * corr1,
                jets_trk02[0].eta(), jets_trk02[0].phi(),
                jets_trk02[0].subjetsSoftDrop[0].p4().M() * corr1)

            p4sd2.SetPtEtaPhiM(
                jets_trk02[1].subjetsSoftDrop[0].p4().Pt() * corr2,
                jets_trk02[1].eta(), jets_trk02[1].phi(),
                jets_trk02[1].subjetsSoftDrop[0].p4().M() * corr2)

            pdg1 = 0
            pdg2 = 0
            sdjet1_corr = Particle(pdg1, 0, p4sd1, 1)
            sdjet2_corr = Particle(pdg2, 0, p4sd2, 1)
            fillParticle(self.tree, 'Jet1_trk02_SD_Corr', sdjet1_corr)
            fillParticle(self.tree, 'Jet2_trk02_SD_Corr', sdjet2_corr)

            ######################
            # trkjet04 mass info #
            ######################
            #MATCHING PF04 and trk04 for CORRECTION
            Jet1_trk04_dR_pf04 = 999
            Jet2_trk04_dR_pf04 = 999
            Jet1_pf04 = None
            Jet2_pf04 = None
            for j in jets_pf04_1500:
                pf04 = ROOT.TLorentzVector()
                pf04.SetPtEtaPhiE(j.pt(), j.eta(), j.phi(), j.e())
                if pf04.DeltaR(j1) < Jet1_trk04_dR_pf04:
                    Jet1_trk04_dR_pf04 = pf04.DeltaR(j1)
                    Jet1_pf04 = j
                if pf04.DeltaR(j2) < Jet2_trk04_dR_pf04:
                    Jet2_trk04_dR_pf04 = pf04.DeltaR(j2)
                    Jet2_pf04 = j
            corr1_04 = Jet1_pf04.p4().Pt() / j1.Pt()
            corr2_04 = Jet2_pf04.p4().Pt() / j2.Pt()

            #NORMAL TRK04 SD corrected jet
            p4sd1_04 = ROOT.TLorentzVector()
            p4sd2_04 = ROOT.TLorentzVector()
            Jet1_trk04_SD_Corr_m = -1000.
            Jet2_trk04_SD_Corr_m = -1000.

            if len(jets_trk04) >= 1:
                p4sd1_04.SetPtEtaPhiM(
                    jets_trk04[0].subjetsSoftDrop[0].p4().Pt() * corr1_04,
                    jets_trk04[0].eta(), jets_trk04[0].phi(),
                    jets_trk04[0].subjetsSoftDrop[0].p4().M() * corr1_04)
                pdg1 = 0
                sdjet1_corr_04 = Particle(pdg1, 0, p4sd1_04, 1)
                Jet1_trk04_SD_Corr_m = sdjet1_corr_04.p4().M()

            if len(jets_trk04) >= 2:
                p4sd2_04.SetPtEtaPhiM(
                    jets_trk04[1].subjetsSoftDrop[0].p4().Pt() * corr2_04,
                    jets_trk04[1].eta(), jets_trk04[1].phi(),
                    jets_trk04[1].subjetsSoftDrop[0].p4().M() * corr2_04)
                pdg2 = 0
                sdjet2_corr_04 = Particle(pdg2, 0, p4sd2_04, 1)
                Jet2_trk04_SD_Corr_m = sdjet2_corr_04.p4().M()

            self.tree.fill('Jet1_trk04_SD_Corr_m', Jet1_trk04_SD_Corr_m)
            self.tree.fill('Jet2_trk04_SD_Corr_m', Jet2_trk04_SD_Corr_m)

            ######################
            # trkjet08 mass info #
            ######################
            #MATCHING PF08 and trk08 for CORRECTION
            Jet1_trk08_dR_pf08 = 999
            Jet2_trk08_dR_pf08 = 999
            Jet1_pf08 = None
            Jet2_pf08 = None
            for j in jets_pf08:
                pf08 = ROOT.TLorentzVector()
                pf08.SetPtEtaPhiE(j.pt(), j.eta(), j.phi(), j.e())
                if pf08.DeltaR(j1) < Jet1_trk08_dR_pf08:
                    Jet1_trk08_dR_pf08 = pf08.DeltaR(j1)
                    Jet1_pf08 = j
                if pf08.DeltaR(j2) < Jet2_trk08_dR_pf08:
                    Jet2_trk08_dR_pf08 = pf08.DeltaR(j2)
                    Jet2_pf08 = j
            corr1_08 = Jet1_pf08.p4().Pt() / j1.Pt()
            corr2_08 = Jet2_pf08.p4().Pt() / j2.Pt()

            #NORMAL TRK08 SD corrected jet
            p4sd1_08 = ROOT.TLorentzVector()
            p4sd2_08 = ROOT.TLorentzVector()
            Jet1_trk08_SD_Corr_m = -1000.
            Jet2_trk08_SD_Corr_m = -1000.

            if len(jets_trk08) >= 1:
                p4sd1_08.SetPtEtaPhiM(
                    jets_trk08[0].subjetsSoftDrop[0].p4().Pt() * corr1_08,
                    jets_trk08[0].eta(), jets_trk08[0].phi(),
                    jets_trk08[0].subjetsSoftDrop[0].p4().M() * corr1_08)
                pdg1 = 0
                sdjet1_corr_08 = Particle(pdg1, 0, p4sd1_08, 1)
                Jet1_trk08_SD_Corr_m = sdjet1_corr_08.p4().M()

            if len(jets_trk08) >= 2:
                p4sd2_08.SetPtEtaPhiM(
                    jets_trk08[1].subjetsSoftDrop[0].p4().Pt() * corr2_08,
                    jets_trk08[1].eta(), jets_trk08[1].phi(),
                    jets_trk08[1].subjetsSoftDrop[0].p4().M() * corr2_08)
                pdg2 = 0
                sdjet2_corr_08 = Particle(pdg2, 0, p4sd2_08, 1)
                Jet2_trk08_SD_Corr_m = sdjet2_corr_08.p4().M()

            self.tree.fill('Jet1_trk08_SD_Corr_m', Jet1_trk08_SD_Corr_m)
            self.tree.fill('Jet2_trk08_SD_Corr_m', Jet2_trk08_SD_Corr_m)

            #CORRECTED TRK02 jet
            p4jet1_corr = ROOT.TLorentzVector()
            p4jet2_corr = ROOT.TLorentzVector()
            p4jet1_corr.SetPtEtaPhiM(jets_trk02[0].pt() * corr1,
                                     jets_trk02[0].eta(), jets_trk02[0].phi(),
                                     jets_trk02[0].m() * corr1)
            p4jet2_corr.SetPtEtaPhiM(jets_trk02[1].pt() * corr2,
                                     jets_trk02[1].eta(), jets_trk02[1].phi(),
                                     jets_trk02[1].m() * corr2)

            jet1_corr = Particle(pdg1, 0, p4jet1_corr, 1)
            jet2_corr = Particle(pdg2, 0, p4jet2_corr, 1)

            if (len(jets_trk02) > 1):
                self.tree.fill('Mj1j2_trk02',
                               self.fillMass(jets_trk02[0], jets_trk02[1]))
                self.tree.fill('Mj1j2_trk02_Corr',
                               self.fillMass(jet1_corr, jet2_corr))

            if (len(jets_pf02) > 1):
                self.tree.fill('Mj1j2_pf02',
                               self.fillMass(jets_pf02[0], jets_pf02[1]))

            if (len(jets_pf04) > 1):
                self.tree.fill('Mj1j2_pf04',
                               self.fillMass(jets_pf04[0], jets_pf04[1]))

            if (len(jets_pf08) > 1):
                self.tree.fill('Mj1j2_pf08',
                               self.fillMass(jets_pf08[0], jets_pf08[1]))

            #Flow n,5
            #############################################################################
            #REQUIRES THE FOLLOWING IN heppy/analyzers/fcc/Reader.py AFTER LINE 151:

            #	particle_relations = defaultdict(list)
            #       for tjet in store.get(self.cfg_ana.fatjets):
            #		for i in range(tjet.particles_size()):
            #     			particle_relations[Jet(tjet)].append(Particle(tjet.particles(i)))
            #	for fatjet, particles in particle_relations.items():
            # 		fatjets[fatjet].jetConstituents = particles

            #############################################################################

            #R = 0.8 # init
            R = 0.05

            flow_Jet1 = [0] * 5
            flow_Jet2 = [0] * 5
            if len(jets_pf08) < 2: return
            jet1_ungroomed = ROOT.TLorentzVector()
            jet2_ungroomed = ROOT.TLorentzVector()
            jet1_ungroomed.SetPtEtaPhiE(jets_pf08[0].pt(), jets_pf08[0].eta(),
                                        jets_pf08[0].phi(), jets_pf08[0].e())
            jet2_ungroomed.SetPtEtaPhiE(jets_pf08[1].pt(), jets_pf08[1].eta(),
                                        jets_pf08[1].phi(), jets_pf08[1].e())

            constituent_vector = ROOT.TLorentzVector()
            for n in range(1, 5 + 1):
                for constituent in jets_pf08[0].jetConstituents[1:]:
                    constituent_vector.SetPtEtaPhiE(constituent.pt(),
                                                    constituent.eta(),
                                                    constituent.phi(),
                                                    constituent.e())
                    dR = jet1_ungroomed.DeltaR(constituent_vector)
                    if ((dR >= (n - 1) / 5 * R) and (dR < n / 5 * R)):
                        flow_Jet1[n - 1] += abs(constituent.pt()) / abs(
                            jets_pf08[0].pt())
                for constituent in jets_pf08[1].jetConstituents[1:]:
                    constituent_vector.SetPtEtaPhiE(constituent.pt(),
                                                    constituent.eta(),
                                                    constituent.phi(),
                                                    constituent.e())
                    dR = jet2_ungroomed.DeltaR(constituent_vector)
                    if ((dR >= (n - 1) / 5 * R) and (dR < n / 5 * R)):
                        flow_Jet2[n - 1] += abs(constituent.pt()) / abs(
                            jets_pf08[1].pt())

            self.tree.fill('Jet1_Flow15', flow_Jet1[0])
            self.tree.fill('Jet2_Flow15', flow_Jet2[0])
            self.tree.fill('Jet1_Flow25', flow_Jet1[1])
            self.tree.fill('Jet2_Flow25', flow_Jet2[1])
            self.tree.fill('Jet1_Flow35', flow_Jet1[2])
            self.tree.fill('Jet2_Flow35', flow_Jet2[2])
            self.tree.fill('Jet1_Flow45', flow_Jet1[3])
            self.tree.fill('Jet2_Flow45', flow_Jet2[3])
            self.tree.fill('Jet1_Flow55', flow_Jet1[4])
            self.tree.fill('Jet2_Flow55', flow_Jet2[4])

            ###################################
            #TMVA Stuff Starts!
            ###################################

            self.bdt_Jet_trk02_tau1[0] = jets_trk02[0].tau1
            self.bdt_Jet_trk02_tau2[0] = jets_trk02[0].tau2
            self.bdt_Jet_trk02_tau3[0] = jets_trk02[0].tau3
            self.bdt_Jet_trk02_tau21[0] = Jet1_trk02_tau21
            self.bdt_Jet_trk02_tau31[0] = Jet1_trk02_tau31
            self.bdt_Jet_trk02_tau32[0] = Jet1_trk02_tau32
            self.bdt_Jet_trk02_SD_Corr_m[0] = sdjet1_corr.p4().M()
            if len(jets_trk04) >= 1:
                self.bdt_Jet_trk04_SD_Corr_m[0] = sdjet1_corr_04.p4().M()
            else:
                self.bdt_Jet_trk04_SD_Corr_m[0] = -1000.
            if len(jets_trk08) >= 1:
                self.bdt_Jet_trk08_SD_Corr_m[0] = sdjet1_corr_08.p4().M()
            else:
                self.bdt_Jet_trk08_SD_Corr_m[0] = -1000.
            self.bdt_Jet_Flow15[0] = flow_Jet1[0]
            self.bdt_Jet_Flow25[0] = flow_Jet1[1]
            self.bdt_Jet_Flow35[0] = flow_Jet1[2]
            self.bdt_Jet_Flow45[0] = flow_Jet1[3]
            self.bdt_Jet_Flow55[0] = flow_Jet1[4]
            mva_value = self.reader.EvaluateMVA("BDT")
            self.tree.fill('Jet1_Whad_vs_QCD_tagger', mva_value)
            #
            self.bdt_Jet_trk02_tau1[0] = jets_trk02[1].tau1
            self.bdt_Jet_trk02_tau2[0] = jets_trk02[1].tau2
            self.bdt_Jet_trk02_tau3[0] = jets_trk02[1].tau3
            self.bdt_Jet_trk02_tau21[0] = Jet2_trk02_tau21
            self.bdt_Jet_trk02_tau31[0] = Jet2_trk02_tau31
            self.bdt_Jet_trk02_tau32[0] = Jet2_trk02_tau32
            self.bdt_Jet_trk02_SD_Corr_m[0] = sdjet2_corr.p4().M()
            if len(jets_trk04) >= 2:
                self.bdt_Jet_trk04_SD_Corr_m[0] = sdjet2_corr_04.p4().M()
            else:
                self.bdt_Jet_trk04_SD_Corr_m[0] = -1000.
            if len(jets_trk08) >= 2:
                self.bdt_Jet_trk08_SD_Corr_m[0] = sdjet2_corr_08.p4().M()
            else:
                self.bdt_Jet_trk08_SD_Corr_m[0] = -1000.
            self.bdt_Jet_Flow15[0] = flow_Jet2[0]
            self.bdt_Jet_Flow25[0] = flow_Jet2[1]
            self.bdt_Jet_Flow35[0] = flow_Jet2[2]
            self.bdt_Jet_Flow45[0] = flow_Jet2[3]
            self.bdt_Jet_Flow55[0] = flow_Jet2[4]
            mva_value = self.reader.EvaluateMVA("BDT")
            self.tree.fill('Jet2_Whad_vs_QCD_tagger', mva_value)

            self.tree.tree.Fill()
コード例 #3
0
    def process(self, event):
        self.tree.reset()
        jets_trk02 = getattr(event, self.cfg_ana.jets_trk02_1000)
        jets_pf02 = getattr(event, self.cfg_ana.jets_pf02_1500)
        jets_pf04 = getattr(event, self.cfg_ana.jets_pf04_1000)
        jets_pf04_pdg = event.jets_pf04_1000_pdg
        jets_pf08 = getattr(event, self.cfg_ana.jets_pf08_1500)
        #gen_particles = event.all_particles

        jets_pf04_1500 = getattr(event, self.cfg_ana.jets_pf04_1500)
        jets_trk04 = getattr(event, self.cfg_ana.jets_trk04_1000)
        jets_trk08 = getattr(event, self.cfg_ana.jets_trk08_1000)

        electrons = getattr(event, self.cfg_ana.electrons)
        muons = getattr(event, self.cfg_ana.muons)

        Jet1_trk02_dR_lep = 999
        Jet2_trk02_dR_lep = 999
        Jet1_trk02_dR_Jet2_trk02 = 999
        if (len(jets_trk02) >= 2 and len(jets_pf02) >= 2):
            j1 = ROOT.TLorentzVector()
            j2 = ROOT.TLorentzVector()
            j1.SetPtEtaPhiE(jets_trk02[0].pt(), jets_trk02[0].eta(),
                            jets_trk02[0].phi(), jets_trk02[0].e())
            j2.SetPtEtaPhiE(jets_trk02[1].pt(), jets_trk02[1].eta(),
                            jets_trk02[1].phi(), jets_trk02[1].e())
            if (len(electrons) != 0 and len(muons) == 0):
                e = ROOT.TLorentzVector()
                e.SetPtEtaPhiE(electrons[0].pt(), electrons[0].eta(),
                               electrons[0].phi(), electrons[0].e())
                Jet1_dR = j1.DeltaR(e)
                Jet2_dR = j2.DeltaR(e)
            if (len(electrons) == 0 and len(muons) != 0):
                m = ROOT.TLorentzVector()
                m.SetPtEtaPhiE(muons[0].pt(), muons[0].eta(), muons[0].phi(),
                               muons[0].e())
                Jet1_dR = j1.DeltaR(m)
                Jet2_dR = j2.DeltaR(m)
            if (len(electrons) != 0 and len(muons) != 0):
                isElectron = False
                isMuon = False
                if (electrons[0].pt() > muons[0].pt()): isElectron = True
                else: isMuon = True
                l = ROOT.TLorentzVector()
                if isElectron:
                    l.SetPtEtaPhiE(electrons[0].pt(), electrons[0].eta(),
                                   electrons[0].phi(), electrons[0].e())
                if isMuon:
                    l.SetPtEtaPhiE(muons[0].pt(), muons[0].eta(),
                                   muons[0].phi(), muons[0].e())
                Jet1_trk02_dR_lep = j1.DeltaR(l)
                Jet2_trk02_dR_lep = j2.DeltaR(l)

            self.tree.fill('Jet1_trk02_dR_lep', Jet1_trk02_dR_lep)
            self.tree.fill('Jet2_trk02_dR_lep', Jet2_trk02_dR_lep)

            Jet1_trk02_dR_Jet2_trk02 = j1.DeltaR(j2)
            self.tree.fill('Jet1_trk02_dR_Jet2_trk02',
                           Jet1_trk02_dR_Jet2_trk02)

            # jets and leptons
            Jet1_lepclose = False
            Jet2_lepclose = False
            dR_close = 0.7
            for i in xrange(len(electrons)):
                l = ROOT.TLorentzVector()
                l.SetPtEtaPhiE(electrons[i].pt(), electrons[i].eta(),
                               electrons[i].phi(), electrons[i].e())
                # do not use leptons with pTl/pTj<0.15 (our definiton of a semi-lep decay)
                if j1.DeltaR(l) < dR_close and l.Pt() / j1.Pt() > 0.15:
                    Jet1_lepclose = True
                if j2.DeltaR(l) < dR_close and l.Pt() / j2.Pt() > 0.15:
                    Jet2_lepclose = True
            for i in xrange(len(muons)):
                l = ROOT.TLorentzVector()
                l.SetPtEtaPhiE(muons[i].pt(), muons[i].eta(), muons[i].phi(),
                               muons[i].e())
                # do not use leptons with pTl/pTj<0.15 (our definiton of a semi-lep decay)
                if j1.DeltaR(l) < dR_close and l.Pt() / j1.Pt() > 0.15:
                    Jet1_lepclose = True
                if j2.DeltaR(l) < dR_close and l.Pt() / j2.Pt() > 0.15:
                    Jet2_lepclose = True
            #
            lepton_iso = False
            dR_match = 0.2
            for i in xrange(len(electrons)):
                l = ROOT.TLorentzVector()
                l.SetPtEtaPhiE(electrons[i].pt(), electrons[i].eta(),
                               electrons[i].phi(), electrons[i].e())
                if lepton_iso == False:
                    n_match = 0
                    for j in xrange(len(jets_trk02)):
                        j1 = ROOT.TLorentzVector()
                        j1.SetPtEtaPhiE(jets_trk02[j].pt(),
                                        jets_trk02[j].eta(),
                                        jets_trk02[j].phi(), jets_trk02[j].e())
                        if j1.DeltaR(l) < dR_match: n_match += 1
                    if n_match == 0: lepton_iso = True
            for i in xrange(len(muons)):
                l = ROOT.TLorentzVector()
                l.SetPtEtaPhiE(muons[i].pt(), muons[i].eta(), muons[i].phi(),
                               muons[i].e())
                if lepton_iso == False:
                    n_match = 0
                    for j in xrange(len(jets_trk02)):
                        j1 = ROOT.TLorentzVector()
                        j1.SetPtEtaPhiE(jets_trk02[j].pt(),
                                        jets_trk02[j].eta(),
                                        jets_trk02[j].phi(), jets_trk02[j].e())
                        if j1.DeltaR(l) < dR_match: n_match += 1
                    if n_match == 0: lepton_iso = True
            #
            self.tree.fill('Jet1_lepclose', Jet1_lepclose)
            self.tree.fill('Jet2_lepclose', Jet2_lepclose)
            self.tree.fill('lepton_iso', lepton_iso)

            self.tree.fill('weight', event.weight)
            self.tree.fill('missingET', event.met.pt())
            self.tree.fill('numberOfElectrons', len(electrons))
            self.tree.fill('numberOfMuons', len(muons))

            self.tree.fill('rapiditySeparation_trk02',
                           abs(jets_trk02[0].eta() - jets_trk02[1].eta()))
            self.tree.fill('transverseMomentumAsymmetry_trk02',
                           (jets_trk02[0].pt() - jets_trk02[1].pt()) /
                           (jets_trk02[0].pt() + jets_trk02[1].pt()))

            self.tree.fill('Jet1_trk02_tau1', jets_trk02[0].tau1)
            self.tree.fill('Jet1_trk02_tau2', jets_trk02[0].tau2)
            self.tree.fill('Jet1_trk02_tau3', jets_trk02[0].tau3)
            self.tree.fill('Jet2_trk02_tau1', jets_trk02[1].tau1)
            self.tree.fill('Jet2_trk02_tau2', jets_trk02[1].tau2)
            self.tree.fill('Jet2_trk02_tau3', jets_trk02[1].tau3)

            Jet1_trk02_tau31 = -999.0
            Jet1_trk02_tau21 = -999.0
            Jet1_trk02_tau32 = -999.0
            Jet2_trk02_tau31 = -999.0
            Jet2_trk02_tau21 = -999.0
            Jet2_trk02_tau32 = -999.0

            if (jets_trk02[0].tau1 != 0.0):
                Jet1_trk02_tau31 = jets_trk02[0].tau3 / jets_trk02[0].tau1
                Jet1_trk02_tau21 = jets_trk02[0].tau2 / jets_trk02[0].tau1
            if (jets_trk02[0].tau2 != 0.0):
                Jet1_trk02_tau32 = jets_trk02[0].tau3 / jets_trk02[0].tau2

            if (jets_trk02[1].tau1 != 0.0):
                Jet2_trk02_tau31 = jets_trk02[1].tau3 / jets_trk02[1].tau1
                Jet2_trk02_tau21 = jets_trk02[1].tau2 / jets_trk02[1].tau1
            if (jets_trk02[1].tau2 != 0.0):
                Jet2_trk02_tau32 = jets_trk02[1].tau3 / jets_trk02[1].tau2

            self.tree.fill('Jet1_trk02_tau31', Jet1_trk02_tau31)
            self.tree.fill('Jet1_trk02_tau21', Jet1_trk02_tau21)
            self.tree.fill('Jet1_trk02_tau32', Jet1_trk02_tau32)
            self.tree.fill('Jet2_trk02_tau31', Jet2_trk02_tau31)
            self.tree.fill('Jet2_trk02_tau21', Jet2_trk02_tau21)
            self.tree.fill('Jet2_trk02_tau32', Jet2_trk02_tau32)

            # here is btag, need matching in DR
            Jet1_trk02_dR_pf04 = 999
            Jet2_trk02_dR_pf04 = 999
            for j in jets_pf04:
                pf04 = ROOT.TLorentzVector()
                pf04.SetPtEtaPhiE(j.pt(), j.eta(), j.phi(), j.e())
                if j.tags['bf'] > 0:
                    if pf04.DeltaR(j1) < Jet1_trk02_dR_pf04:
                        Jet1_trk02_dR_pf04 = pf04.DeltaR(j1)
                    if pf04.DeltaR(j2) < Jet2_trk02_dR_pf04:
                        Jet2_trk02_dR_pf04 = pf04.DeltaR(j2)
            #print 'dr j1  ',Jet1_trk02_dR_pf04
            #print 'dr j2  ',Jet2_trk02_dR_pf04

            pdg1 = 0
            pdg2 = 0
            if Jet1_trk02_dR_pf04 < 0.3:
                pdg1 = 5
            if Jet2_trk02_dR_pf04 < 0.3:
                pdg2 = 5

            # TRF / truth b-tagging -> need at least 2 jets_pf04
            use_DELPHES = False
            jet = []
            ipdg = 0
            for i in range(len(jets_pf04)):
                if use_DELPHES == True:
                    ipdg = jets_pf04[i].tags['flav']
                    if ipdg != 4 and ipdg != 5: ipdg = 0
                else:
                    ipdg = jets_pf04_pdg[i].flavour
                jet.append([jets_pf04[i], ipdg])
            weight_1tagex = getNbTagEx(1, jet, 2)
            weight_1tagexJet1 = getNbTagEx(1, jet, 2, 0)
            weight_1tagexJet2 = getNbTagEx(1, jet, 2, 1)
            weight_2tagex = getNbTagEx(2, jet, 2)
            self.tree.fill('weight_1tagex', weight_1tagex)
            self.tree.fill('weight_2tagex', weight_2tagex)
            self.tree.fill('weight_1tagexJet1', weight_1tagexJet1)
            self.tree.fill('weight_1tagexJet2', weight_1tagexJet2)

            #MATCHING PF02 and trk02 for CORRECTION
            Jet1_trk02_dR_pf02 = 999
            Jet2_trk02_dR_pf02 = 999
            Jet1_pf02 = None
            Jet2_pf02 = None
            for j in jets_pf02:
                pf02 = ROOT.TLorentzVector()
                pf02.SetPtEtaPhiE(j.pt(), j.eta(), j.phi(), j.e())
                if pf02.DeltaR(j1) < Jet1_trk02_dR_pf02:
                    Jet1_trk02_dR_pf02 = pf02.DeltaR(j1)
                    Jet1_pf02 = j
                if pf02.DeltaR(j2) < Jet2_trk02_dR_pf02:
                    Jet2_trk02_dR_pf02 = pf02.DeltaR(j2)
                    Jet2_pf02 = j
            #print 'jet1 dr ',Jet1_trk02_dR_pf02,'  pf02   ',Jet1_pf02,'  trk02  ',jets_trk02[0]
            #print 'jet2 dr ',Jet2_trk02_dR_pf02,'  pf02   ',Jet2_pf02,'  trk02  ',jets_trk02[1]

            corr1 = Jet1_pf02.p4().Pt() / j1.Pt()
            corr2 = Jet2_pf02.p4().Pt() / j2.Pt()

            #print 'corr 1  ',corr1,'   corr2  ',corr2
            #NORMAL TRK02 SD corrected jet
            p4sd1 = ROOT.TLorentzVector()
            p4sd2 = ROOT.TLorentzVector()
            p4sd1.SetPtEtaPhiM(
                jets_trk02[0].subjetsSoftDrop[0].p4().Pt() * corr1,
                jets_trk02[0].eta(), jets_trk02[0].phi(),
                jets_trk02[0].subjetsSoftDrop[0].p4().M() * corr1)

            p4sd2.SetPtEtaPhiM(
                jets_trk02[1].subjetsSoftDrop[0].p4().Pt() * corr2,
                jets_trk02[1].eta(), jets_trk02[1].phi(),
                jets_trk02[1].subjetsSoftDrop[0].p4().M() * corr2)

            sdjet1_corr = Particle(pdg1, 0, p4sd1, 1)
            sdjet2_corr = Particle(pdg2, 0, p4sd2, 1)
            fillParticle(self.tree, 'Jet1_trk02_SD_Corr', sdjet1_corr)
            fillParticle(self.tree, 'Jet2_trk02_SD_Corr', sdjet2_corr)

            #NORMAL TRK02 SD jet
            #sdjet1 = Particle(pdg1, 0, jets_trk02[0].subjetsSoftDrop[0].p4(), 1)
            #sdjet2 = Particle(pdg2, 0, jets_trk02[1].subjetsSoftDrop[0].p4(), 1)
            #fillParticle(self.tree, 'Jet1_trk02_SD', sdjet1)
            #fillParticle(self.tree, 'Jet2_trk02_SD', sdjet2)

            #CORRECTED TRK02 jet
            p4jet1_corr = ROOT.TLorentzVector()
            p4jet2_corr = ROOT.TLorentzVector()
            p4jet1_corr.SetPtEtaPhiM(jets_trk02[0].pt() * corr1,
                                     jets_trk02[0].eta(), jets_trk02[0].phi(),
                                     jets_trk02[0].m() * corr1)
            p4jet2_corr.SetPtEtaPhiM(jets_trk02[1].pt() * corr2,
                                     jets_trk02[1].eta(), jets_trk02[1].phi(),
                                     jets_trk02[1].m() * corr2)

            jet1_corr = Particle(pdg1, 0, p4jet1_corr, 1)
            jet2_corr = Particle(pdg2, 0, p4jet2_corr, 1)
            #fillParticle(self.tree, 'Jet1_trk02_Corr', jet1_corr)
            #fillParticle(self.tree, 'Jet2_trk02_Corr', jet2_corr)

            # associate MET to one jet or another based on softdrop
            sdjetmet1, sdjetmet2 = self.corrMET(
                jets_trk02[0].subjetsSoftDrop[0], pdg1,
                jets_trk02[1].subjetsSoftDrop[0], pdg2, event.met)
            fillParticle(self.tree, 'Jet1_trk02_SD_MetCorr', sdjetmet1)
            fillParticle(self.tree, 'Jet2_trk02_SD_MetCorr', sdjetmet2)

            sdjetmet1, sdjetmet2 = self.corrMET(sdjet1_corr, pdg1, sdjet2_corr,
                                                pdg2, event.met)
            fillParticle(self.tree, 'Jet1_trk02_SD_Corr_MetCorr', sdjetmet1)
            fillParticle(self.tree, 'Jet2_trk02_SD_Corr_MetCorr', sdjetmet2)

            ######################
            # trkjet04 mass info #
            ######################
            #MATCHING PF04 and trk04 for CORRECTION
            Jet1_trk04_dR_pf04 = 999
            Jet2_trk04_dR_pf04 = 999
            Jet1_pf04 = None
            Jet2_pf04 = None
            for j in jets_pf04_1500:
                pf04 = ROOT.TLorentzVector()
                pf04.SetPtEtaPhiE(j.pt(), j.eta(), j.phi(), j.e())
                if pf04.DeltaR(j1) < Jet1_trk04_dR_pf04:
                    Jet1_trk04_dR_pf04 = pf04.DeltaR(j1)
                    Jet1_pf04 = j
                if pf04.DeltaR(j2) < Jet2_trk04_dR_pf04:
                    Jet2_trk04_dR_pf04 = pf04.DeltaR(j2)
                    Jet2_pf04 = j
            corr1_04 = Jet1_pf04.p4().Pt() / j1.Pt()
            corr2_04 = Jet2_pf04.p4().Pt() / j2.Pt()

            #NORMAL TRK04 SD corrected jet
            p4sd1_04 = ROOT.TLorentzVector()
            p4sd2_04 = ROOT.TLorentzVector()
            Jet1_trk04_SD_Corr_m = -1000.
            Jet2_trk04_SD_Corr_m = -1000.

            if len(jets_trk04) >= 1:
                p4sd1_04.SetPtEtaPhiM(
                    jets_trk04[0].subjetsSoftDrop[0].p4().Pt() * corr1_04,
                    jets_trk04[0].eta(), jets_trk04[0].phi(),
                    jets_trk04[0].subjetsSoftDrop[0].p4().M() * corr1_04)
                pdg1 = 0
                sdjet1_corr_04 = Particle(pdg1, 0, p4sd1_04, 1)
                Jet1_trk04_SD_Corr_m = sdjet1_corr_04.p4().M()

            if len(jets_trk04) >= 2:
                p4sd2_04.SetPtEtaPhiM(
                    jets_trk04[1].subjetsSoftDrop[0].p4().Pt() * corr2_04,
                    jets_trk04[1].eta(), jets_trk04[1].phi(),
                    jets_trk04[1].subjetsSoftDrop[0].p4().M() * corr2_04)
                pdg2 = 0
                sdjet2_corr_04 = Particle(pdg2, 0, p4sd2_04, 1)
                Jet2_trk04_SD_Corr_m = sdjet2_corr_04.p4().M()

            self.tree.fill('Jet1_trk04_SD_Corr_m', Jet1_trk04_SD_Corr_m)
            self.tree.fill('Jet2_trk04_SD_Corr_m', Jet2_trk04_SD_Corr_m)

            ######################
            # trkjet08 mass info #
            ######################
            #MATCHING PF08 and trk08 for CORRECTION
            Jet1_trk08_dR_pf08 = 999
            Jet2_trk08_dR_pf08 = 999
            Jet1_pf08 = None
            Jet2_pf08 = None
            for j in jets_pf08:
                pf08 = ROOT.TLorentzVector()
                pf08.SetPtEtaPhiE(j.pt(), j.eta(), j.phi(), j.e())
                if pf08.DeltaR(j1) < Jet1_trk08_dR_pf08:
                    Jet1_trk08_dR_pf08 = pf08.DeltaR(j1)
                    Jet1_pf08 = j
                if pf08.DeltaR(j2) < Jet2_trk08_dR_pf08:
                    Jet2_trk08_dR_pf08 = pf08.DeltaR(j2)
                    Jet2_pf08 = j
            corr1_08 = Jet1_pf08.p4().Pt() / j1.Pt()
            corr2_08 = Jet2_pf08.p4().Pt() / j2.Pt()

            #NORMAL TRK08 SD corrected jet
            p4sd1_08 = ROOT.TLorentzVector()
            p4sd2_08 = ROOT.TLorentzVector()
            Jet1_trk08_SD_Corr_m = -1000.
            Jet2_trk08_SD_Corr_m = -1000.

            if len(jets_trk08) >= 1:
                p4sd1_08.SetPtEtaPhiM(
                    jets_trk08[0].subjetsSoftDrop[0].p4().Pt() * corr1_08,
                    jets_trk08[0].eta(), jets_trk08[0].phi(),
                    jets_trk08[0].subjetsSoftDrop[0].p4().M() * corr1_08)
                pdg1 = 0
                sdjet1_corr_08 = Particle(pdg1, 0, p4sd1_08, 1)
                Jet1_trk08_SD_Corr_m = sdjet1_corr_08.p4().M()

            if len(jets_trk08) >= 2:
                p4sd2_08.SetPtEtaPhiM(
                    jets_trk08[1].subjetsSoftDrop[0].p4().Pt() * corr2_08,
                    jets_trk08[1].eta(), jets_trk08[1].phi(),
                    jets_trk08[1].subjetsSoftDrop[0].p4().M() * corr2_08)
                pdg2 = 0
                sdjet2_corr_08 = Particle(pdg2, 0, p4sd2_08, 1)
                Jet2_trk08_SD_Corr_m = sdjet2_corr_08.p4().M()

            self.tree.fill('Jet1_trk08_SD_Corr_m', Jet1_trk08_SD_Corr_m)
            self.tree.fill('Jet2_trk08_SD_Corr_m', Jet2_trk08_SD_Corr_m)

            if (len(jets_trk02) > 1):
                self.tree.fill('Mj1j2_trk02',
                               self.fillMass(jets_trk02[0], jets_trk02[1]))
                self.tree.fill('Mj1j2_trk02_Corr',
                               self.fillMass(jet1_corr, jet2_corr))
                jetmet1, jetmet2 = self.corrMET(jets_trk02[0], pdg1,
                                                jets_trk02[1], pdg2, event.met)
                self.tree.fill('Mj1j2_trk02_MetCorr',
                               self.fillMass(jetmet1, jetmet2))
                #fillParticle(self.tree, 'Jet1_trk02_MetCorr', jetmet1)
                #fillParticle(self.tree, 'Jet2_trk02_MetCorr', jetmet2)

                jetmet1, jetmet2 = self.corrMET(jet1_corr, pdg1, jet2_corr,
                                                pdg2, event.met)
                self.tree.fill('Mj1j2_trk02_Corr_MetCorr',
                               self.fillMass(jetmet1, jetmet2))
                fillParticle(self.tree, 'Jet1_trk02_Corr_MetCorr', jetmet1)
                fillParticle(self.tree, 'Jet2_trk02_Corr_MetCorr', jetmet2)

            if (len(jets_pf02) > 1):
                self.tree.fill('Mj1j2_pf02',
                               self.fillMass(jets_pf02[0], jets_pf02[1]))
                jetmet1, jetmet2 = self.corrMET(jets_pf02[0], pdg1,
                                                jets_pf02[1], pdg2, event.met)
                self.tree.fill('Mj1j2_pf02_MetCorr',
                               self.fillMass(jetmet1, jetmet2))

            if (len(jets_pf04) > 1):
                self.tree.fill('Mj1j2_pf04',
                               self.fillMass(jets_pf04[0], jets_pf04[1]))
                jetmet1, jetmet2 = self.corrMET(jets_pf04[0], pdg1,
                                                jets_pf04[1], pdg2, event.met)
                self.tree.fill('Mj1j2_pf04_MetCorr',
                               self.fillMass(jetmet1, jetmet2))

            if (len(jets_pf08) > 1):
                self.tree.fill('Mj1j2_pf08',
                               self.fillMass(jets_pf08[0], jets_pf08[1]))
                jetmet1, jetmet2 = self.corrMET(jets_pf08[0], pdg1,
                                                jets_pf08[1], pdg2, event.met)
                self.tree.fill('Mj1j2_pf08_MetCorr',
                               self.fillMass(jetmet1, jetmet2))

            if (len(electrons) >= 1):
                fillParticle(self.tree, 'Electron1', electrons[0])
            if (len(electrons) >= 2):
                fillParticle(self.tree, 'Electron2', electrons[1])

            if (len(muons) >= 1): fillParticle(self.tree, 'Muon1', muons[0])
            if (len(muons) >= 2): fillParticle(self.tree, 'Muon2', muons[1])

            ###################################
            #TMVA Stuff Starts!
            ###################################

            self.bdt_Jet_trk02_tau1[0] = jets_trk02[0].tau1
            self.bdt_Jet_trk02_tau2[0] = jets_trk02[0].tau2
            self.bdt_Jet_trk02_tau3[0] = jets_trk02[0].tau3
            self.bdt_Jet_trk02_tau21[0] = Jet1_trk02_tau21
            self.bdt_Jet_trk02_tau31[0] = Jet1_trk02_tau31
            self.bdt_Jet_trk02_tau32[0] = Jet1_trk02_tau32
            self.bdt_Jet_trk02_SD_Corr_m[0] = sdjet1_corr.p4().M()
            if len(jets_trk04) >= 1:
                self.bdt_Jet_trk04_SD_Corr_m[0] = sdjet1_corr_04.p4().M()
            else:
                self.bdt_Jet_trk04_SD_Corr_m[0] = -1000.
            if len(jets_trk08) >= 1:
                self.bdt_Jet_trk08_SD_Corr_m[0] = sdjet1_corr_08.p4().M()
            else:
                self.bdt_Jet_trk08_SD_Corr_m[0] = -1000.
            mva_value = self.reader.EvaluateMVA("BDT")
            self.tree.fill('Jet1_thad_vs_QCD_tagger', mva_value)
            #
            self.bdt_Jet_trk02_tau1[0] = jets_trk02[1].tau1
            self.bdt_Jet_trk02_tau2[0] = jets_trk02[1].tau2
            self.bdt_Jet_trk02_tau3[0] = jets_trk02[1].tau3
            self.bdt_Jet_trk02_tau21[0] = Jet2_trk02_tau21
            self.bdt_Jet_trk02_tau31[0] = Jet2_trk02_tau31
            self.bdt_Jet_trk02_tau32[0] = Jet2_trk02_tau32
            self.bdt_Jet_trk02_SD_Corr_m[0] = sdjet2_corr.p4().M()
            if len(jets_trk04) >= 2:
                self.bdt_Jet_trk04_SD_Corr_m[0] = sdjet2_corr_04.p4().M()
            else:
                self.bdt_Jet_trk04_SD_Corr_m[0] = -1000.
            if len(jets_trk08) >= 2:
                self.bdt_Jet_trk08_SD_Corr_m[0] = sdjet2_corr_08.p4().M()
            else:
                self.bdt_Jet_trk08_SD_Corr_m[0] = -1000.
            mva_value = self.reader.EvaluateMVA("BDT")
            self.tree.fill('Jet2_thad_vs_QCD_tagger', mva_value)

            self.tree.tree.Fill()
コード例 #4
0
    def process(self, event):
        self.tree.reset()
        htatas = getattr(event, self.cfg_ana.htatas)
        hbbs = getattr(event, self.cfg_ana.hbbs)
        met = event.met

        htatas.sort(key=lambda x: abs(x.m() - 125.))
        hbbs.sort(key=lambda x: abs(x.m() - 125.))

        bs = event.selected_bs
        selected_taus = event.selected_taus
        lights = event.selected_lights
        leptons = event.selected_leptons

        #print '-------------------'

        #print len(htatas), len(hbbs)
        #print len(taus), len(bs)

        #for tau in taus:
        #    print tau.charge

        #print ROOT.return2()
        #f = Foo()
        #f.bar() #and you will see "Hello" on the screen
        '''
        mVisA = 10.; # mass of visible object on side A.  Must be >=0.
        pxA = 20.; # x momentum of visible object on side A.
        pyA = 30.; # y momentum of visible object on side A.

        mVisB = 10.; # mass of visible object on side B.  Must be >=0.
        pxB = -20.; # x momentum of visible object on side B.
        pyB = -30.; # y momentum of visible object on side B.

        pxMiss = -5.; # x component of missing transverse momentum.
        pyMiss = -5.; # y component of missing transverse momentum.

        chiA = 4.; # hypothesised mass of invisible on side A.  Must be >=0.
        chiB = 7.; # hypothesised mass of invisible on side B.  Must be >=0.

        desiredPrecisionOnMt2 = 0.; # Must be >=0.  If 0 alg aims for machine precision.  if >0, MT2 computed to supplied absolute precision.
        useDeciSectionsInitially=True

        asymm_mt2 = asymm_mt2_lester_bisect()
        print '-----------------------------------------'
        MT2 =  asymm_mt2.get_mT2(
           mVisA, pxA, pyA,
           mVisB, pxB, pyB,
           pxMiss, pyMiss,
           chiA, chiB,
           desiredPrecisionOnMt2,
           useDeciSectionsInitially)
        
        print 'MT2', MT2
        '''

        # semileptonic selection
        if len(selected_taus) > 0 and len(bs) > 1 and len(leptons) == 1:

            self.tree.fill('weight', event.weight)
            #print  event.weight
            taus = []
            taus.append(selected_taus[0])
            taus.append(leptons[0])

            fillParticle(self.tree, 'ta1', taus[0])
            fillParticle(self.tree, 'ta2', taus[1])
            fillParticle(self.tree, 'b1', bs[0])
            fillParticle(self.tree, 'b2', bs[1])
            '''
            def mTsq(bT, cT, mB, mC):
                eB = math.sqrt(mB*mB+ bT*bT)
                eC = math.sqrt(mC*mC+ cT*cT)
                return mB*mB+mC*mC+2*(eB*eC - bT*cT)

            def smT2(bt1, bt2):
                return max(math.sqrt(bt1),math.sqrt(bt2))

            mTsq1 = mTsq(taus[0].p4().Vect().XYvector(), bs[0].p4().Vect().XYvector(), taus[0].p4().M(), bs[0].p4().M())
            mTsq2 = mTsq(taus[1].p4().Vect().XYvector(), bs[1].p4().Vect().XYvector(), taus[1].p4().M(), bs[1].p4().M())

            smTsq = smT2(mTsq1, mTsq2)
            #print mTsq1, mTsq2, smTsq
            '''

            mVisA = bs[0].p4().M()
            # mass of visible object on side A.  Must be >=0.
            pxA = bs[0].p4().Px()
            # x momentum of visible object on side A.
            pyA = bs[0].p4().Py()
            # y momentum of visible object on side A.

            mVisB = bs[1].p4().M()
            # mass of visible object on side A.  Must be >=0.
            pxB = bs[1].p4().Px()
            # x momentum of visible object on side A.
            pyB = bs[1].p4().Py()
            # y momentum of visible object on side A.

            pxMiss = taus[0].p4().Px() + taus[1].p4().Px() + met.p4().Px(
            )  # x component of missing transverse momentum.
            pyMiss = taus[0].p4().Py() + taus[1].p4().Py() + met.p4().Py(
            )  # x component of missing transverse momentum.

            chiA = taus[0].p4().M()
            # hypothesised mass of invisible on side A.  Must be >=0.
            chiB = taus[1].p4().M()
            # hypothesised mass of invisible on side B.  Must be >=0.

            desiredPrecisionOnMt2 = 0.
            # Must be >=0.  If 0 alg aims for machine precision.  if >0, MT2 computed to supplied absolute precision.
            useDeciSectionsInitially = True

            asymm_mt2 = asymm_mt2_lester_bisect()

            MT2 = asymm_mt2.get_mT2(mVisA, pxA, pyA, mVisB, pxB, pyB, pxMiss,
                                    pyMiss, chiA, chiB, desiredPrecisionOnMt2,
                                    useDeciSectionsInitially)

            #print 'MT2', MT2

            self.tree.fill('mT2', MT2)

            if len(lights) > 0:
                fillParticle(self.tree, 'j1', lights[0])
                if len(lights) > 1:
                    fillParticle(self.tree, 'j2', lights[1])

            def computeMT(taup4, metp4):
                scalar_prod = taup4.Px() * metp4.Px() + taup4.Py() * metp4.Py()
                return math.sqrt(2 * (taup4.Pt() * metp4.Pt() - scalar_prod))

            mt1 = computeMT(taus[0].p4(), met.p4())
            mt2 = computeMT(taus[1].p4(), met.p4())

            self.tree.fill('ta1_mt', mt1)
            self.tree.fill('ta2_mt', mt2)

            st = taus[0].p4().Pt() + taus[1].p4().Pt() + bs[0].p4().Pt(
            ) + bs[0].p4().Pt() + met.p4().Pt()
            self.tree.fill('sT', st)

            fillMet(self.tree, 'met', met)
            #fillParticle(self.tree, 'htata', htatas[0])
            htata_p4 = taus[0].p4() + taus[1].p4()
            htata = Particle(25, 0, htata_p4, 1)

            fillParticle(self.tree, 'htata', htata)
            fillParticle(self.tree, 'hbb', hbbs[0])

            htata_metcorr_p4 = taus[0].p4() + taus[1].p4() + met.p4()
            htata_metcorr = Particle(25, 0, htata_metcorr_p4, 1)

            fillParticle(self.tree, 'htata_metcorr', htata_metcorr)

            hh = Resonance(htata, hbbs[0], 25)
            hh_metcorr = Resonance(htata_metcorr, hbbs[0], 25)

            fillParticle(self.tree, 'hh', hh)
            fillParticle(self.tree, 'hh_metcorr', hh_metcorr)

            self.tree.fill('nbjets', len(event.selected_bs))
            self.tree.fill('nljets', len(event.selected_lights))
            self.tree.fill(
                'njets',
                len(event.selected_lights) + len(event.selected_bs) +
                len(event.selected_taus))
            self.tree.fill('nlep', len(event.selected_leptons))
            self.tree.fill('ntajets', len(event.selected_taus))

            drbb = deltaR(bs[0], bs[1])
            drtata = deltaR(taus[0], taus[1])

            self.tree.fill('drtata', drtata)
            self.tree.fill('drbb', drbb)

            # here fill all variables for BDT
            self.bdt_ta1_pt[0] = taus[0].p4().Pt()
            self.bdt_ta1_eta[0] = taus[0].p4().Eta()
            self.bdt_ta1_phi[0] = taus[0].p4().Phi()
            self.bdt_ta2_pt[0] = taus[1].p4().Pt()
            self.bdt_ta2_eta[0] = taus[1].p4().Eta()
            self.bdt_ta2_phi[0] = taus[1].p4().Phi()
            self.bdt_b1_pt[0] = bs[0].p4().Pt()
            self.bdt_b1_eta[0] = bs[0].p4().Eta()
            self.bdt_b1_phi[0] = bs[0].p4().Phi()
            self.bdt_b2_pt[0] = bs[1].p4().Pt()
            self.bdt_b2_eta[0] = bs[1].p4().Eta()
            self.bdt_b2_phi[0] = bs[1].p4().Phi()
            self.bdt_met_pt[0] = met.p4().Pt()
            self.bdt_met_phi[0] = met.p4().Phi()
            self.bdt_met_px[0] = met.p4().Px()
            self.bdt_met_py[0] = met.p4().Py()
            self.bdt_htata_pt[0] = htata.p4().Pt()
            self.bdt_htata_eta[0] = htata.p4().Eta()
            self.bdt_htata_phi[0] = htata.p4().Phi()
            self.bdt_htata_m[0] = htata.p4().M()
            self.bdt_hbb_pt[0] = hbbs[0].p4().Pt()
            self.bdt_hbb_eta[0] = hbbs[0].p4().Eta()
            self.bdt_hbb_phi[0] = hbbs[0].p4().Phi()
            self.bdt_hbb_m[0] = hbbs[0].p4().M()
            self.bdt_hh_pt[0] = hh.p4().Pt()
            self.bdt_hh_eta[0] = hh.p4().Eta()
            self.bdt_hh_phi[0] = hh.p4().Phi()
            self.bdt_hh_m[0] = hh.p4().M()
            self.bdt_ta1_mt[0] = mt1
            self.bdt_ta2_mt[0] = mt2
            self.bdt_mT2[0] = MT2
            self.bdt_sT[0] = st
            self.bdt_njets[0] = len(event.selected_lights) + len(
                event.selected_bs) + len(event.selected_taus)
            self.bdt_nbjets[0] = len(event.selected_bs)
            self.bdt_ntajets[0] = len(event.selected_taus)
            #self.bdt_nlep     [0] =  len(event.selected_leptons)

            #print MT2, ",", s ,",", len(event.selected_lights) + len(event.selected_bs) + len(event.selected_taus), ",", len(event.selected_bs) ,",", len(event.selected_taus) ,",", len(event.selected_leptons)t

            #print MT2, ",", s ,",", len(event.selected_lights) + len(event.selected_bs) + len(event.selected_taus), ",", len(event.selected_bs) ,",", len(event.selected_taus) ,",", len(event.selected_leptons)t

            mva_value = self.reader.EvaluateMVA("BDT")
            #print mva_value
            self.tree.fill('tmva_bdt', mva_value)
            self.tree.tree.Fill()