Пример #1
0
def Return_mTbs(jet, metPt, metPhi):
    #setting of the 4vectors seems fine naeively?
    met4Vec = TLorentzVector()
    met4Vec.SetPtEtaPhiE(metPt, 0, metPhi, metPt)
    bjet4Vec = TLorentzVector()
    bjet4Vec.SetPtEtaPhiE(jet[0], jet[1], jet[2], jet[3])

    mTb = (met4Vec + bjet4Vec).Mt()  # this assumes masses for the b-jet

    #using 4vectors and dPhi method (massless particles)
    mTb0 = math.sqrt(2. * met4Vec.Et() * bjet4Vec.Et() *
                     (1. - math.cos(met4Vec.DeltaPhi(bjet4Vec))))

    return {'mTb_mass': mTb, 'mTb_massless': mTb0}
Пример #2
0
def TagVars(collections):
  results=[]; Et_ratio=[]; Dphi=[]; projB=[]; DzTagMuK=[]; DzTagMuL1=[]; 
  DzTagMuL2=[]; 
  tracks=collections[0]
  Bcands=collections[2]
  trgmuons=(collections[1])
  trgmuon_vec=TLorentzVector()
  trgmuon_vec.SetPtEtaPhiM(0,0,0,0)
  trgmuon_vz=-99
  for trgmuon in trgmuons:
    if not getattr(trgmuon,"isTriggering"): 
       continue;
    trgmuon_vec.SetPtEtaPhiM(getattr(trgmuon,"pt"),getattr(trgmuon,"eta"),getattr(trgmuon,"phi"),0.105)
    trgmuon_vz=getattr(trgmuon,"vz")
    break
  if trgmuon_vec.M()==0:
    result=[[0], [0], [0], [0], [0], [0]]
    return result
  sum_track_vec=trgmuon_vec;
  sum_track=trgmuon_vec.Pt();
  for track  in tracks:
    track_vec=TLorentzVector();
    track_vec.SetPtEtaPhiM(getattr(track,"pt"),getattr(track,"eta"),getattr(track,"phi"),0.139)
    if trgmuon_vec.DrEtaPhi(track_vec)>0.4: 
       continue
    sum_track_vec=sum_track_vec+track_vec;
    sum_track+=track_vec.Pt()

  for Bcand in Bcands:
    Bcand_vec=TLorentzVector();
    Bcand_vec.SetPtEtaPhiM(getattr(Bcand,"fit_pt"),getattr(Bcand,"fit_eta"),getattr(Bcand,"fit_phi"),getattr(Bcand,"fit_mass"))
    if sum_track>0:
      Et_ratio.append(Bcand_vec.Et()/sum_track)
    else:
      Et_ratio.append(0)
    Dphi.append(Bcand_vec.DeltaPhi(sum_track_vec))
    projB.append(Bcand_vec*sum_track_vec)   
    DzTagMuK.append( abs(trgmuon_vz-getattr(Bcand,"kVz")) )
    DzTagMuL1.append( abs(trgmuon_vz-getattr(Bcand,"l1Vz")) ) 
    DzTagMuL2.append( abs(trgmuon_vz-getattr(Bcand,"l2Vz")) )
    
 
  result=[Et_ratio, Dphi, projB, DzTagMuL1, DzTagMuL2, DzTagMuK]
  return result
Пример #3
0
def TagVarsMC(collections):
  results=[]; Et_ratio=-99.; Dphi=-99.; projB=-99.
  tracks=collections[0]
  trgmuons=collections[1]
  recoB_pt=collections[2]
  recoB_eta=collections[3]
  recoB_phi=collections[4]
  recoB_mass=collections[5]
  recoE1_vz=collections[6]
  recoE2_vz=collections[7]
  recoK_vz=collections[8]
  trgmuon_vec=TLorentzVector()
  trgmuon_vec.SetPtEtaPhiM(0,0,0,0)
  for trgmuon in trgmuons:
    if getattr(trgmuon,"isTriggering")==0:
       continue
    trgmuon_vec.SetPtEtaPhiM(getattr(trgmuon,"pt"),getattr(trgmuon,"eta"),getattr(trgmuon,"phi"),0.105)
    break
  if trgmuon_vec.M()==0:
    result=[-99.,-99.,-99.,-99.,-99.,-99.]
    return result 
  sum_track_vec=trgmuon_vec;
  sum_track=trgmuon_vec.Pt();
  trgmuon_vz=getattr(trgmuon,"vz")
  for track  in tracks:
    track_vec=TLorentzVector();
    track_vec.SetPtEtaPhiM(getattr(track,"pt"),getattr(track,"eta"),getattr(track,"phi"),0.139)
    if trgmuon_vec.DrEtaPhi(track_vec)>0.4: 
       continue
    sum_track_vec=sum_track_vec+track_vec;
    sum_track+=track_vec.Pt()

  recoB_vec=TLorentzVector();
  recoB_vec.SetPtEtaPhiM(recoB_pt,recoB_eta,recoB_phi,recoB_mass)
  if sum_track>0:
    Et_ratio=recoB_vec.Et()/sum_track
  else:
    Et_ratio=0
  Dphi=recoB_vec.DeltaPhi(sum_track_vec)
  projB=recoB_vec*sum_track_vec
  result=[Et_ratio,Dphi,projB,abs(trgmuon_vz-recoE1_vz),abs(trgmuon_vz-recoE2_vz),abs(trgmuon_vz-recoK_vz)]
  return result
Пример #4
0
def TagVarsMC(collections):
    results = []
    Et_ratio = []
    Dphi = []
    projB = []
    tracks = collections[0]
    trgmuons = collections[1]
    recoB_pt = collections[2]
    recoB_eta = collections[3]
    recoB_phi = collections[4]
    recoB_mass = collections[5]
    if len(trgmuons) == 0:
        default = [-99., -99., -99.]
        return default
    trgmuon = trgmuons[0]
    trgmuon_vec = TLorentzVector()
    trgmuon_vec.SetPtEtaPhiM(getattr(trgmuon, "pt"), getattr(trgmuon, "eta"),
                             getattr(trgmuon, "phi"), 0.105)
    sum_track_vec = trgmuon_vec
    sum_track = trgmuon_vec.Pt()
    for track in tracks:
        track_vec = TLorentzVector()
        track_vec.SetPtEtaPhiM(getattr(track, "pt"), getattr(track, "eta"),
                               getattr(track, "phi"), 0.139)
        if trgmuon_vec.DrEtaPhi(track_vec) > 0.4:
            continue
        sum_track_vec = sum_track_vec + track_vec
        sum_track += track_vec.Pt()

    recoB_vec = TLorentzVector()
    recoB_vec.SetPtEtaPhiM(recoB_pt, recoB_eta, recoB_phi, recoB_mass)
    if sum_track > 0:
        Et_ratio = recoB_vec.Et() / sum_track
    else:
        Et_ratio = 0
    Dphi = recoB_vec.DeltaPhi(sum_track_vec)
    projB = recoB_vec * sum_track_vec
    result = [Et_ratio, Dphi, projB]
    return result
Пример #5
0
def TagVars(collections):
    results = []
    Et_ratio = []
    Dphi = []
    projB = []
    tracks = collections[0]
    Bcands = collections[2]
    trgmuon = (collections[1])[0]

    trgmuon_vec = TLorentzVector()
    trgmuon_vec.SetPtEtaPhiM(getattr(trgmuon, "pt"), getattr(trgmuon, "eta"),
                             getattr(trgmuon, "phi"), 0.105)
    sum_track_vec = trgmuon_vec
    sum_track = trgmuon_vec.Pt()
    for track in tracks:
        track_vec = TLorentzVector()
        track_vec.SetPtEtaPhiM(getattr(track, "pt"), getattr(track, "eta"),
                               getattr(track, "phi"), 0.139)
        if trgmuon_vec.DrEtaPhi(track_vec) > 0.4:
            continue
        sum_track_vec = sum_track_vec + track_vec
        sum_track += track_vec.Pt()

    for Bcand in Bcands:
        Bcand_vec = TLorentzVector()
        Bcand_vec.SetPtEtaPhiM(getattr(Bcand, "fit_pt"),
                               getattr(Bcand, "fit_eta"),
                               getattr(Bcand, "fit_phi"),
                               getattr(Bcand, "fit_mass"))
        if sum_track > 0:
            Et_ratio.append(Bcand_vec.Et() / sum_track)
        else:
            Et_ratio.append(0)
        Dphi.append(Bcand_vec.DeltaPhi(sum_track_vec))
        projB.append(Bcand_vec * sum_track_vec)
    result = [Et_ratio, Dphi, projB]
    return result
    def fillHistogram(self, tree):

        for count in range(tree.GetEntries()):
            muon_pt = 0
            electron_pt = 0
            jet_pt = 0
            lep_pt = 0
            met_pt = 0

            tree.GetEntry(count)
            jets = getJets(tree)
            muons = getMuons(tree)
            electrons = getElectrons(tree)
            METs = getMissingET(tree)

            jetTL = TLorentzVector()
            leptonTL = TLorentzVector()
            METTL = TLorentzVector()

            for jet in jets:
                if jet['btag'] == 1:
                    #print count, jet['pt'], jet['btag']
                    jet_pt = jet['pt']
                    jetTL.SetPtEtaPhiM(jet['pt'], jet['eta'], jet['phi'],
                                       jet['mass'])

                    break

            for met in METs:
                METTL.SetPtEtaPhiM(met['MET'], met['eta'], met['phi'], 0)
                met_pt = met['MET']
                break

            for muon in muons:
                #print count, muon['pt']
                muon_pt = muon['pt']
                lep_pt = muon['pt']
                leptonTL.SetPtEtaPhiM(muon['pt'], muon['eta'], muon['phi'],
                                      muon['mass'])
                break

            for electron in electrons:
                #print count, electron['pt']
                electron_pt = electron['pt']
                if muon_pt > 0 and electron_pt > muon_pt:
                    lep_pt = electron['pt']
                    leptonTL.SetPtEtaPhiM(muon['pt'], muon['eta'], muon['phi'],
                                          muon['mass'])
                break

            if lep_pt * jet_pt > 0:
                #print jet_pt/(jet_pt+muon_pt)
                self.TH1F_ratio.Fill(jet_pt / (jet_pt + lep_pt))
                self.TH1F_pt.Fill(met_pt)
            #elif electron_pt*jet_pt > 0:
            #print jet_pt/(jet_pt+electron_pt)
            #	self.TH1F_ratio.Fill(jet_pt/(jet_pt+electron_pt))
            #	self.TH1F_pt.Fill(electron_pt)

            if jet_pt * met_pt * lep_pt:
                self.TH1F_deltaR_MET_b.Fill(jetTL.DeltaR(METTL))
                self.TH1F_deltaR_MET_l.Fill(leptonTL.DeltaR(METTL))
                self.TH1F_deltaR_b_l.Fill(leptonTL.DeltaR(jetTL))
                self.TH1F_deltaPhi_MET_b.Fill(jetTL.DeltaPhi(METTL))
                self.TH1F_deltaPhi_MET_l.Fill(leptonTL.DeltaPhi(METTL))
                self.TH1F_deltaPhi_b_l.Fill(leptonTL.DeltaPhi(jetTL))
Пример #7
0
def plotATOut(inputname, outputname, weighted=True, treename='nominal'):
    infile = TFile.Open(inputname, 'read')
    tree = infile.Get(treename)

    foutput = TFile(outputname, 'recreate')

    # histograms
    histsToPlot = HistogramsTTbar()

    # loop over all events in the tree
    for event in tree:
        if not isSelected(event):
            continue

        weight = event.weight_mc if weighted else 1.

        # jets
        njets = len(event.jet_pt)
        histsToPlot.histNJets.Fill(njets, weight)

        for i in range(njets):
            histsToPlot.histJetPT.Fill(event.jet_pt[i] * 1e-3, weight)
            if i == 0:
                histsToPlot.histJet0PT.Fill(event.jet_pt[i] * 1e-3, weight)
            if i == 1:
                histsToPlot.histJet1PT.Fill(event.jet_pt[i] * 1e-3, weight)

        # MET
        histsToPlot.histMET.Fill(event.met_met * 1e-3, weight)

        # lepton
        if event.el_pt.size() > 0:
            histsToPlot.histElePT.Fill(event.el_pt[0] * 1e-3)
        if event.mu_pt.size() > 0:
            histsToPlot.histMuPT.Fill(event.mu_pt[0] * 1e-3)

        # parton
        # top
        t_p4 = TLorentzVector()
        t_p4.SetPtEtaPhiM(event.MC_t_afterFSR_pt * 1e-3,
                          event.MC_t_afterFSR_eta, event.MC_t_afterFSR_phi,
                          event.MC_t_afterFSR_m * 1e-3)

        histsToPlot.histTopPT.Fill(t_p4.Pt(), weight)
        histsToPlot.histTopY.Fill(t_p4.Rapidity(), weight)

        # anti-top
        tbar_p4 = TLorentzVector()
        tbar_p4.SetPtEtaPhiM(event.MC_tbar_afterFSR_pt * 1e-3,
                             event.MC_tbar_afterFSR_eta,
                             event.MC_tbar_afterFSR_phi,
                             event.MC_tbar_afterFSR_m * 1e-3)

        histsToPlot.histTbarPT.Fill(tbar_p4.Pt(), weight)
        histsToPlot.histTbarY.Fill(tbar_p4.Rapidity(), weight)

        # ttbar
        ttbar_p4 = t_p4 + tbar_p4
        histsToPlot.histTTbarM.Fill(ttbar_p4.M(), weight)
        histsToPlot.histTTbarPT.Fill(ttbar_p4.Pt(), weight)
        histsToPlot.histTTbarDPHI.Fill(abs(t_p4.DeltaPhi(tbar_p4)), weight)

    # Write histograms to the output file
    foutput.cd()
    foutput.Write()
    foutput.Close()
Пример #8
0
    def analyze(self, event):
        """Process event, return True (go to next module) or False (fail, go to next event)."""
      
        ## Event filter preselection
        passedMETFilters = False
        try: 
                if event.Flag_goodVertices and event.Flag_globalSuperTightHalo2016Filter and event.Flag_BadPFMuonFilter and event.Flag_EcalDeadCellTriggerPrimitiveFilter and event.Flag_HBHENoiseFilter and event.Flag_HBHENoiseIsoFilter and (self.isMC or event.Flag_eeBadScFilter) and event.Flag_ecalBadCalibFilter: 
                        passedMETFilters = True 
        except: 
                passedMETFilters = False

        if not passedMETFilters: return False

        ## jet order check 
        if event.nJet < 2: return False
        if event.Jet_pt_nom[0]>event.Jet_pt_nom[1]:
            leading1 = 0
            leading2 = 1
        else:
            leading1 = 1
            leading2 = 0
        for ijet in range(event.nJet)[2:]:
            if event.Jet_pt_nom[ijet] > event.Jet_pt_nom[leading1]: 
                leading2=leading1
                leading1=ijet
            elif event.Jet_pt_nom[ijet] > event.Jet_pt_nom[leading2]: 
                leading2=ijet

        ## Loop over Jets
        jetIds = [ ]
        jetHT = 0.
        for ijet in range(event.nJet):
            if event.Jet_pt_nom[ijet] < 30: continue
            if abs(event.Jet_eta[ijet]) > 2.5: continue
            if event.Jet_jetId[ijet]<6: continue                                                    
            jetIds.append(ijet)
            jetHT += event.Jet_pt_nom[ijet]

        ## Jet-based event selections
        if len(jetIds)<2: return False
        
        ## Compute dijet quantities
        j1_p4 = TLorentzVector()
        j1_p4.SetPtEtaPhiM(event.Jet_pt_nom[jetIds[0]], event.Jet_eta[jetIds[0]], event.Jet_phi[jetIds[0]], event.Jet_mass_nom[jetIds[0]])
        j2_p4 = TLorentzVector()
        j2_p4.SetPtEtaPhiM(event.Jet_pt_nom[jetIds[1]], event.Jet_eta[jetIds[1]], event.Jet_phi[jetIds[1]], event.Jet_mass_nom[jetIds[1]])
        self.out.jj_mass[0]       = (j1_p4+j2_p4).M()
        self.out.jj_deltaEta[0]   = abs(event.Jet_eta[jetIds[0]]-event.Jet_eta[jetIds[1]])
        
        ## Dijet-based event selections
        if self.out.jj_mass[0] < 800: return False  # will need to change this when deriving the trigger efficiency
        
        j1_p4_lepcorr = j1_p4 * (1. + event.Jet_chEmEF[jetIds[0]]+event.Jet_muEF[jetIds[0]])
        j2_p4_lepcorr = j2_p4 * (1. + event.Jet_chEmEF[jetIds[1]]+event.Jet_muEF[jetIds[1]])
        self.out.jj_mass_lepcorr[0] = (j1_p4_lepcorr+j2_p4_lepcorr).M()
        
        met_p4 = TLorentzVector()
        met_p4.SetPtEtaPhiM(event.MET_pt_nom, 0., event.MET_phi, 0.)
        j1_p4_metcorr = j1_p4 * (1. + event.MET_pt_nom/j1_p4.Pt() * math.cos(j1_p4.DeltaPhi(met_p4)+3.1415))
        j2_p4_metcorr = j2_p4 * (1. + event.MET_pt_nom/j2_p4.Pt() * math.cos(j2_p4.DeltaPhi(met_p4)+3.1415))
        self.out.jj_mass_metcorr[0] = (j1_p4_metcorr+j2_p4_metcorr).M()
        
        wj1_p4 = j1_p4
        wj2_p4 = j2_p4
        for ijet in range(event.nJet):
            if ijet == jetIds[0] or ijet == jetIds[1]: continue
            if event.Jet_pt_nom[ijet] < 30 or abs(event.Jet_eta[ijet]) > 2.5: continue
            if event.Jet_jetId[ijet]<6: continue                                                    
            j_p4 = TLorentzVector()
            j_p4.SetPtEtaPhiM(event.Jet_pt_nom[ijet], event.Jet_eta[ijet], event.Jet_phi[ijet], event.Jet_mass_nom[ijet])
            if j1_p4.DeltaR(j_p4) < 1.1: wj1_p4 += j_p4
            if j2_p4.DeltaR(j_p4) < 1.1: wj2_p4 += j_p4
        self.out.jj_mass_widejet[0] = (wj1_p4+wj2_p4).M()
        self.out.jj_deltaEta_widejet[0]   = abs(wj1_p4.Eta() - wj2_p4.Eta())
        
        nIsoElectrons = 0.
        for iel in range(event.nElectron):
            if event.Electron_pt[iel] > 50. and abs(event.Electron_eta[iel]) < 2.5 and event.Electron_cutBased[iel] >= 2: nIsoElectrons += 1

        nIsoMuons = 0.
        for imu in range(event.nMuon):
            if event.Muon_pt[imu] > 50. and abs(event.Muon_eta[imu]) < 2.4 and event.Muon_highPtId[imu]>=2 and event.Muon_tkRelIso[imu]<0.1: nIsoMuons += 1
       
        nLooseMuons1, nLooseMuons2 = 0, 0 
        ptMuons1, ptMuons2 = 0., 0.
        if event.Jet_muonIdx1[jetIds[0]] >=0 and event.Muon_looseId[event.Jet_muonIdx1[jetIds[0]]]:
            nLooseMuons1 += 1 
            ptMuons1 += event.Muon_pt[event.Jet_muonIdx1[jetIds[0]]]
        if event.Jet_muonIdx2[jetIds[0]] >=0 and event.Muon_looseId[event.Jet_muonIdx2[jetIds[0]]]:
            nLooseMuons1 += 1  
            ptMuons1 += event.Muon_pt[event.Jet_muonIdx2[jetIds[0]]]
        if event.Jet_muonIdx1[jetIds[1]] >=0 and event.Muon_looseId[event.Jet_muonIdx1[jetIds[1]]]: 
            nLooseMuons2 += 1  
            ptMuons2 += event.Muon_pt[event.Jet_muonIdx1[jetIds[1]]]
        if event.Jet_muonIdx2[jetIds[1]] >=0 and event.Muon_looseId[event.Jet_muonIdx2[jetIds[1]]]: 
            nLooseMuons2 += 1  
            ptMuons2 += event.Muon_pt[event.Jet_muonIdx2[jetIds[1]]]
        
        ptRel1, ptRel2 = 0., 0.
        if event.Jet_muonIdx1[jetIds[0]] >=0: ptRel1 = event.Muon_jetPtRelv2[event.Jet_muonIdx1[jetIds[0]]]
        if event.Jet_muonIdx1[jetIds[1]] >=0: ptRel2 = event.Muon_jetPtRelv2[event.Jet_muonIdx1[jetIds[1]]]

        ## Fill jet branches
        self.out.njets[0]       = len(jetIds)
        self.out.jid_1[0] = event.Jet_jetId[jetIds[0]]        
        self.out.jid_2[0] = event.Jet_jetId[jetIds[1]]        
        #self.out.MET_over_SumEt[0] = event.MET_pt/jetHT
        if event.nFatJet >= 1 and event.FatJet_pt[0] > 200.:
            self.out.fatjetmass_1[0] = event.FatJet_msoftdrop[0]
        if event.nFatJet >= 2 and event.FatJet_pt[1] > 200.:
            self.out.fatjetmass_2[0] = event.FatJet_msoftdrop[1]
        self.out.nelectrons[0] = nIsoElectrons
        self.out.nmuons[0] = nIsoMuons

        ## fill trigger branches (different years have different triggers 500<->550, 900<->1050)
        try:
                self.out.HLT_AK8PFJet500[0]             = event.HLT_AK8PFJet500         
        except: 
                self.out.HLT_AK8PFJet500[0]             = -1
        try:
                self.out.HLT_PFJet500[0]                = event.HLT_PFJet500                            
        except:
                self.out.HLT_PFJet500[0]                = -1                            
        try:
                self.out.HLT_CaloJet500_NoJetID[0]      = event.HLT_CaloJet500_NoJetID          
        except:
                self.out.HLT_CaloJet500_NoJetID[0]      = -1    
        try:
                self.out.HLT_PFHT900[0]         = event.HLT_PFHT900             
        except:
                self.out.HLT_PFHT900[0]         = -1                            
        try:
                self.out.HLT_AK8PFJet550[0]             = event.HLT_AK8PFJet550         
        except: 
                self.out.HLT_AK8PFJet550[0]             = -1
        try:
                self.out.HLT_PFJet550[0]                = event.HLT_PFJet550                            
        except:
                self.out.HLT_PFJet550[0]                = -1                            
        try:
                self.out.HLT_CaloJet550_NoJetID[0]      = event.HLT_CaloJet550_NoJetID          
        except:
                self.out.HLT_CaloJet550_NoJetID[0]      = -1    
        try:
                self.out.HLT_PFHT1050[0]                = event.HLT_PFHT1050            
        except:
                self.out.HLT_PFHT1050[0]                = -1                    

        self.out.isMC[0] = int(self.isMC)

        self.out.tree.Fill()
        return True
Пример #9
0
		
		L1.SetPtEtaPhiM(l1pt[0],l1eta[0],l1phi[0],0)
		L2.SetPtEtaPhiM(l2pt[0],l2eta[0],l2phi[0],0)
		ZB.SetPtEtaPhiM(zpt[0],zeta[0],zphi[0],mass[0])
		MET.SetPtEtaPhiM(met[0],0,metphi[0],0)
		
		
		##for h in HiggsMass:
			##exec('MET'+h+'.SetPtEtaPhiM(met[0],0,metphi[0],'+h+')')
			##exec('TransMass'+h+'[0] = (L1 + L2 + MET'+h+').Mt()')
			##exec('TransMass_Eff'+h+'[0] = L1.Et() + L2.Et() + MET'+h+'.Et()')
			
		
		Thrust[0] = (L1-L2).Pt()
		DeltaPz[0] = abs((L1-L2).Pz())
		DeltaPhi_ZH[0] = abs(ZB.DeltaPhi(MET))
		#TransMass_Eff[0] = l1pt[0] + l2pt[0] + met[0]
		#TransMass_EffZ[0] = math.sqrt(zpt[0]**2 + mass[0]**2) + met[0]
		TransMass[0] = (L1 + L2 + MET).Mt()
		TransMass_Eff[0] = L1.Et() + L2.Et() + MET.Et()
		#print costheta_CS(1.0)
		CScostheta[0] = costheta_CS(l1pt[0],l1eta[0],l1phi[0],l2pt[0],l2eta[0],l2phi[0])
		#CScostheta[0] = costheta_CS(1,0.5,0.5,2,0.2,0.2)
		#ST[0] = L1.Pt() + L2.Pt() + MET.Pt()
		#CScos[0] = CSAngle(l1pt[0],l1eta[0],l1phi[0],l2pt[0],l2eta[0],l2phi[0])
		#TransMass_EffZ[0] = (ZB + MET).Mt()
		#TransMass[0] = mass[0]**2 + massH**2 + math.sqrt(mass[0]**2 + zpt[0]**2)*math.sqrt(massH**2 + met[0]**2)*2 - 2*zpt[0]*met[0]*cos(DeltaPhi_ZH[0])
		#TransMass[0] = (mass[0]**2 + massH**2 + 2*(((mass[0]**2 + zpt[0]**2))**(0.5))*(((massH**2 + met[0]**2))**(0.5)) - 2*zpt[0]*met[0]*cos(DeltaPhi_ZH[0]))**(0.5)
		#XX[0] = l1pt[0] + l2pt[0]
		
		
Пример #10
0
    def analyze(self, event):
        iSkim = 0
        eventWeightLumi, lheWeight, stitchWeight, puWeight, qcdnloWeight, qcdnnloWeight, ewknloWeight, topWeight = 1., 1., 1., 1., 1., 1., 1., 1.
        triggerWeight, leptonWeight = 1., 1.
        MinMuonIso, MaxMuonIso, MinMuonMetDPhi, MaxMuonMetDPhi, MinMuonJetDR = -1., -1., -1., -1., -1.
        mZ, mW, mT, ptZ, ptW = -1., -1., -1., -1., -1.
        dEtaLL, dPhiLL, dRLL = -1., -1., -1.
        mJJ, ptJJ, dEtaJJ, dPhiJJ, dRJJ = -1., -1., -1., -1., -1.
        mLLJJ, mNJ = -1., -1.
        mHadW, mLepTop1, mLepTop2, mHadTop1, mHadTop2 = -1., -1., -1., -1., -1.
        isSingleMuIsoTrigger, isSingleMuTrigger, isDoubleMuonTrigger, isSingleEleIsoTrigger, isSingleEleTrigger = False, False, False, False, False
        for t in self.SingleMuIsoTriggers:
            if hasattr(event, t) and getattr(event, t):
                isSingleMuIsoTrigger = True
        for t in self.SingleMuTriggers:
            if hasattr(event, t) and getattr(event, t):
                isSingleMuTrigger = True
        for t in self.DoubleMuonTriggers:
            if hasattr(event, t) and getattr(event, t):
                isDoubleMuonTrigger = True
        for t in self.SingleEleIsoTriggers:
            if hasattr(event, t) and getattr(event, t):
                isSingleEleIsoTrigger = True
        for t in self.SingleEleTriggers:
            if hasattr(event, t) and getattr(event, t):
                isSingleEleTrigger = True

        lheWeight = 1.

        if self.isMC:
            # Event weight
            if not self.isLO and hasattr(event, "LHEWeight_originalXWGTUP"):
                lheWeight = event.LHEWeight_originalXWGTUP

            GenVpt = self.VptCorr.getGenVpt(
                event) if not self.VptCorr is None else 0.

            # MC stitching weight

            # W+jets inclusive and exclusive
            if 'WJetsToLNu_TuneCUETP8M1_13TeV-amcatnloFXFX-pythia8' in self.fileName and 'Summer16' in self.fileName:
                if event.LHE_Vpt > 100.: stitchWeight = 0.

            # Z+jets and Z+gamma
            if self.fileName.startswith(
                    'ZGTo2LG_TuneCUETP8M1') or self.fileName.startswith(
                        'ZGToLLG_01J_5f_TuneCP5') or self.fileName.startswith(
                            'DYJetsToLL_M-50_Tune'):
                nGenPhotons = 0
                photonPtTh = 15. if self.fileName.startswith(
                    'ZGTo2LG_TuneCUETP8M1') or self.fileName.startswith(
                        'DYJetsToLL_M-50_TuneCUETP8M1') else 20.
                for i in range(event.nGenPart):
                    if GenPart_pdgId[i] == 22 and TMath.Odd(
                            GenPart_statusFlags[i]
                    ) and GenPart_pt > photonPtTh:
                        nGenPhotons += 1
                if self.fileName.startswith('ZG') and nGenPhotons <= 0:
                    stitchWeight = 0.
                if self.fileName.startswith(
                        'DYJetsToLL_M-50') and nGenPhotons >= 1:
                    stitchWeight = 0.

            # PU weight
            puWeight = self.puTool.getWeight(event.Pileup_nTrueInt)

            # Higher order correction weights
            if not self.VptCorr is None:
                if not 'amcatnlo' in self.fileName:
                    qcdnloWeight = self.VptCorr.getWeightQCDNLO(GenVpt)
                qcdnnloWeight = self.VptCorr.getWeightQCDNNLO(GenVpt)
                ewknloWeight = self.VptCorr.getWeightEWKNLO(GenVpt)

            if 'TTTo' in self.fileName:
                Top1_pt, Top2_pt = getTTPt(event)
                topWeight = getTTptWeight(Top1_pt, Top2_pt)

        self.hists["Events"].Fill(0, lheWeight)

        #        electrons = Collection(event, "Electron")
        #        muons = Collection(event, "Muon")
        #        jets = Collection(event, "Jet")
        #        eventSum = ROOT.TLorentzVector()

        #        #select events with at least 2 muons
        #        if len(muons) >=2 :
        #          for lep in muons :     #loop on muons
        #                  eventSum += lep.p4()
        #          for lep in electrons : #loop on electrons
        #            eventSum += lep.p4()
        #          for j in jets :       #loop on jets
        #            eventSum += j.p4()

        # Clean collections

        # Electrons
        cleanElectron = []
        for i in range(event.nElectron):
            if event.Electron_pt[i] > 10. and event.Electron_cutBased[i] >= 2:
                p4 = TLorentzVector()
                p4.SetPtEtaPhiM(event.Electron_pt[i], event.Electron_eta[i],
                                event.Electron_phi[i], event.Electron_mass[i])
                cleanElectron.append(p4)

        # Muons
        cleanMuon = []
        for i in range(event.nMuon):
            if event.Muon_pt[i] > 10. and event.Muon_mediumId[
                    i] and event.Muon_pfRelIso03_all[i] < 0.15:
                p4 = TLorentzVector()
                p4.SetPtEtaPhiM(event.Muon_pt[i], event.Muon_eta[i],
                                event.Muon_phi[i], event.Muon_mass[i])
                cleanMuon.append(p4)

        # Jets and Event variables
        cleanJet, cleanBJet, cleanNonBJet = [], [], []
        HT30, Nj20, Nj30, Nj40, nBJet = 0., 0, 0, 0, 0
        CSVs = []
        twoJets, allJets = TLorentzVector(), TLorentzVector()
        for i in range(event.nJet):
            if event.Jet_jetId[i] >= 6 and abs(event.Jet_eta[i]) < 2.5:
                p4 = TLorentzVector()
                p4.SetPtEtaPhiM(event.Jet_pt[i], event.Jet_eta[i],
                                event.Jet_phi[i], event.Jet_mass[i])
                # remove overlaps with electrons and muons
                cleanFromLeptons = True
                for e in range(len(cleanElectron)):
                    if cleanElectron[e].DeltaR(p4) < 0.4:
                        cleanFromLeptons = False
                for m in range(len(cleanMuon)):
                    if cleanMuon[m].DeltaR(p4) < 0.4: cleanFromLeptons = False
                # fill variables
                if cleanFromLeptons:
                    if event.Jet_pt[i] > 20.:
                        Nj20 += 1
                    if event.Jet_pt[i] > 30.:
                        HT30 += event.Jet_pt[i]
                        Nj30 += 1
                        cleanJet.append(p4)
                        if event.Jet_btagDeepB[i] >= self.btagMedium:
                            cleanBJet.append(p4)
                        else:
                            cleanNonBJet.append(p4)
                        CSVs.append([i, event.Jet_btagDeepB[i]])
                        if len(cleanJet) < 2: twoJets += p4
                        allJets += p4
                    if event.Jet_pt[i] > 40.:
                        Nj40 += 1

        # b-tag ranking
        nBJet = len(cleanBJet)
        CSV1, CSV2, CSV3, CSV4, iCSV1, iCSV2, iCSV3, iCSV4 = 0., 0., 0., 0., -1, -1, -1, -1

        CSVs.sort(key=lambda x: x[1], reverse=True)
        if len(CSVs) > 0: iCSV1, CSV1 = CSVs[0][0], CSVs[0][1]
        if len(CSVs) > 1: iCSV2, CSV2 = CSVs[1][0], CSVs[1][1]
        if len(CSVs) > 2: iCSV3, CSV3 = CSVs[2][0], CSVs[2][1]
        if len(CSVs) > 3: iCSV4, CSV4 = CSVs[3][0], CSVs[3][1]

        if len(cleanJet) >= 2:
            mJJ = (cleanJet[0] + cleanJet[1]).M()
            ptJJ = (cleanJet[0] + cleanJet[1]).Pt()
            dEtaJJ = abs(cleanJet[0].Eta() - cleanJet[1].Eta())
            dPhiJJ = abs(cleanJet[0].DeltaPhi(cleanJet[1]))
            dRJJ = cleanJet[0].DeltaR(cleanJet[1])
        mNJ = allJets.M()

        Lepton1, Lepton2, Lepton3, Neutrino, MET, LLJJ, Vis = TLorentzVector(
        ), TLorentzVector(), TLorentzVector(), TLorentzVector(
        ), TLorentzVector(), TLorentzVector(), TLorentzVector()
        MET.SetPtEtaPhiM(event.MET_pt, 0., event.MET_phi, 0.)

        # Categorization:
        # iSkim = 1: 2 muons (OS or SS)
        # iSkim = 2: 1 muon and 1 electron (no OS requirement)
        # iSkim = 3: 3 muons (assumed that they are not 3 same-sign)
        # iSkim = 4: 2 muons (OS) and 1 electron
        # iSkim = 5: 1 muons, 3 jets, >= 1 btag
        # iSkim = 6: 2 electrons

        # case 3a: 3 lepton CR (3mu)
        if iSkim == 0 and event.nMuon >= 3:
            if (isSingleMuIsoTrigger or isSingleMuTrigger) and event.Muon_pt[
                    0] > 27. and event.Muon_pt[1] > 15. and event.Muon_pt[
                        2] > 15. and event.Muon_mediumId[
                            0] and event.Muon_mediumId[
                                1] and event.Muon_mediumId[2]:
                Lepton1.SetPtEtaPhiM(event.Muon_pt[0], event.Muon_eta[0],
                                     event.Muon_phi[0], event.Muon_mass[0])
                Lepton2.SetPtEtaPhiM(event.Muon_pt[1], event.Muon_eta[1],
                                     event.Muon_phi[1], event.Muon_mass[1])
                Lepton3.SetPtEtaPhiM(event.Muon_pt[2], event.Muon_eta[2],
                                     event.Muon_phi[2], event.Muon_mass[2])
                if event.Muon_charge[0] * event.Muon_charge[1] < 0:
                    mll = (Lepton1 + Lepton2).M()
                    ptll = (Lepton1 + Lepton2).Pt()
                    detall = abs(Lepton1.Eta() - Lepton2.Eta())
                    dphill = abs(Lepton1.DeltaPhi(Lepton2))
                    drll = Lepton1.DeltaR(Lepton2)
                else:
                    mll = (Lepton1 + Lepton3).M()
                    ptll = (Lepton1 + Lepton3).Pt()
                    detall = abs(Lepton1.Eta() - Lepton3.Eta())
                    dphill = abs(Lepton1.DeltaPhi(Lepton3))
                    drll = Lepton1.DeltaR(Lepton3)
                if mll > 15.:
                    iSkim = 3
                    # Variables
                    mZ, ptZ = mll, ptll
                    dEtaLL, dPhiLL, dRLL = detall, dphill, drll
                    MinMuonIso = min(
                        min(event.Muon_pfRelIso03_all[0],
                            event.Muon_pfRelIso03_all[1]),
                        event.Muon_pfRelIso03_all[2])
                    MaxMuonIso = max(
                        max(event.Muon_pfRelIso03_all[0],
                            event.Muon_pfRelIso03_all[1]),
                        event.Muon_pfRelIso03_all[2])
                    MinMuonMetDPhi = min(
                        min(abs(Lepton1.DeltaPhi(MET)),
                            abs(Lepton2.DeltaPhi(MET))),
                        abs(Lepton3.DeltaPhi(MET)))
                    MaxMuonMetDPhi = max(
                        max(abs(Lepton1.DeltaPhi(MET)),
                            abs(Lepton2.DeltaPhi(MET))),
                        abs(Lepton3.DeltaPhi(MET)))
                    MinMuonJetDR = min(
                        min(getMinMuonJetDR(cleanJet, Lepton1),
                            getMinMuonJetDR(cleanJet, Lepton2)),
                        getMinMuonJetDR(cleanJet, Lepton3))
                    LLJJ = twoJets + Lepton1 + Lepton2
                    Vis = allJets + Lepton1 + Lepton2 + Lepton3
                    # Weights
                    if self.isMC:
                        triggerWeight = self.muSFs.getTriggerSF(
                            event.Muon_pt[0], event.Muon_eta[0])
                        IdSF1 = self.muSFs.getIdSF(event.Muon_pt[0],
                                                   event.Muon_eta[0], 2)
                        IsoSF1 = self.muSFs.getIsoSF(event.Muon_pt[0],
                                                     event.Muon_eta[0])
                        IdSF2 = self.muSFs.getIdSF(event.Muon_pt[1],
                                                   event.Muon_eta[1], 2)
                        IsoSF2 = self.muSFs.getIsoSF(event.Muon_pt[1],
                                                     event.Muon_eta[1])
                        IdSF3 = self.muSFs.getIdSF(event.Muon_pt[2],
                                                   event.Muon_eta[2], 2)
                        IsoSF3 = self.muSFs.getIsoSF(event.Muon_pt[2],
                                                     event.Muon_eta[2])
                        leptonWeight = IdSF1 * IsoSF1 * IdSF2 * IsoSF2 * IdSF3 * IsoSF3

        # case 3b: 3 lepton CR (2mu 1e)
        if iSkim == 0 and event.nMuon >= 2 and event.nElectron >= 1:
            if (isSingleMuIsoTrigger or isSingleMuTrigger) and event.Muon_pt[
                    0] > 27. and event.Muon_pt[1] > 15. and event.Electron_pt[
                        0] > 15. and event.Muon_mediumId[
                            0] and event.Muon_mediumId[
                                1] and event.Electron_cutBased[
                                    0] >= 2 and event.Muon_charge[
                                        0] * event.Muon_charge[1] < 0:
                Lepton1.SetPtEtaPhiM(event.Muon_pt[0], event.Muon_eta[0],
                                     event.Muon_phi[0], event.Muon_mass[0])
                Lepton2.SetPtEtaPhiM(event.Muon_pt[1], event.Muon_eta[1],
                                     event.Muon_phi[1], event.Muon_mass[1])
                Lepton3.SetPtEtaPhiM(event.Electron_pt[0],
                                     event.Electron_eta[0],
                                     event.Electron_phi[0],
                                     event.Electron_mass[0])
                mll = (Lepton1 + Lepton2).M()
                ptll = (Lepton1 + Lepton2).Pt()
                if mll > 15.:
                    iSkim = 4
                    # Variables
                    mZ, ptZ = mll, ptll
                    dEtaLL = abs(Lepton1.Eta() - Lepton2.Eta())
                    dPhiLL = abs(Lepton1.DeltaPhi(Lepton2))
                    dRLL = Lepton1.DeltaR(Lepton2)
                    MinMuonIso = min(event.Muon_pfRelIso03_all[0],
                                     event.Muon_pfRelIso03_all[1])
                    MaxMuonIso = max(event.Muon_pfRelIso03_all[0],
                                     event.Muon_pfRelIso03_all[1])
                    MinMuonMetDPhi = min(
                        min(abs(Lepton1.DeltaPhi(MET)),
                            abs(Lepton2.DeltaPhi(MET))),
                        abs(Lepton3.DeltaPhi(MET)))
                    MaxMuonMetDPhi = max(
                        max(abs(Lepton1.DeltaPhi(MET)),
                            abs(Lepton2.DeltaPhi(MET))),
                        abs(Lepton3.DeltaPhi(MET)))
                    MinMuonJetDR = min(getMinMuonJetDR(cleanJet, Lepton1),
                                       getMinMuonJetDR(cleanJet, Lepton2))
                    LLJJ = twoJets + Lepton1 + Lepton2
                    Vis = allJets + Lepton1 + Lepton2 + Lepton3
                    # Weights
                    if self.isMC:
                        triggerWeight = self.muSFs.getTriggerSF(
                            event.Muon_pt[0], event.Muon_eta[0])
                        IdSF1 = self.muSFs.getIdSF(event.Muon_pt[0],
                                                   event.Muon_eta[0], 2)
                        IsoSF1 = self.muSFs.getIsoSF(event.Muon_pt[0],
                                                     event.Muon_eta[0])
                        IdSF2 = self.muSFs.getIdSF(event.Muon_pt[1],
                                                   event.Muon_eta[1], 2)
                        IsoSF2 = self.muSFs.getIsoSF(event.Muon_pt[1],
                                                     event.Muon_eta[1])
                        IdIsoSF3 = self.elSFs.getIdIsoSF(
                            event.Electron_pt[0], event.Electron_eta[0])
                        leptonWeight = IdSF1 * IsoSF1 * IdSF2 * IsoSF2 * IdIsoSF3

        # case 1: Z->mumu CR (2 mu)
        if iSkim == 0 and event.nMuon >= 2:
            if (isSingleMuIsoTrigger or isSingleMuTrigger) and event.Muon_pt[
                    0] > 27. and event.Muon_pt[1] > 7. and event.Muon_mediumId[
                        0] and event.Muon_mediumId[1]:
                Lepton1.SetPtEtaPhiM(event.Muon_pt[0], event.Muon_eta[0],
                                     event.Muon_phi[0], event.Muon_mass[0])
                Lepton2.SetPtEtaPhiM(event.Muon_pt[1], event.Muon_eta[1],
                                     event.Muon_phi[1], event.Muon_mass[1])
                mll = (Lepton1 + Lepton2).M()
                ptll = (Lepton1 + Lepton2).Pt()
                if mll > 15.:
                    iSkim = 1
                    # Variables
                    mZ, ptZ = mll, ptll
                    dEtaLL = abs(Lepton1.Eta() - Lepton2.Eta())
                    dPhiLL = abs(Lepton1.DeltaPhi(Lepton2))
                    dRLL = Lepton1.DeltaR(Lepton2)
                    MinMuonIso = min(event.Muon_pfRelIso03_all[0],
                                     event.Muon_pfRelIso03_all[1])
                    MaxMuonIso = max(event.Muon_pfRelIso03_all[0],
                                     event.Muon_pfRelIso03_all[1])
                    MinMuonMetDPhi = min(abs(Lepton1.DeltaPhi(MET)),
                                         abs(Lepton2.DeltaPhi(MET)))
                    MaxMuonMetDPhi = max(abs(Lepton1.DeltaPhi(MET)),
                                         abs(Lepton2.DeltaPhi(MET)))
                    MinMuonJetDR = min(getMinMuonJetDR(cleanJet, Lepton1),
                                       getMinMuonJetDR(cleanJet, Lepton2))
                    LLJJ = twoJets + Lepton1 + Lepton2
                    Vis = allJets + Lepton1 + Lepton2
                    # Weights
                    if self.isMC:
                        triggerWeight = self.muSFs.getTriggerSF(
                            event.Muon_pt[0], event.Muon_eta[0])
                        IdSF1 = self.muSFs.getIdSF(event.Muon_pt[0],
                                                   event.Muon_eta[0], 2)
                        IdSF2 = self.muSFs.getIdSF(event.Muon_pt[1],
                                                   event.Muon_eta[1], 2)
                        IsoSF1 = self.muSFs.getIsoSF(event.Muon_pt[0],
                                                     event.Muon_eta[0])
                        IsoSF2 = self.muSFs.getIsoSF(event.Muon_pt[1],
                                                     event.Muon_eta[1])
                        leptonWeight = IdSF1 * IdSF2 * IsoSF1 * IsoSF2

        # case 4: Z->ee CR (2 electrons)
        if iSkim == 0 and event.nElectron >= 2:
            if isSingleEleIsoTrigger and event.Electron_pt[
                    0] > 35. and event.Electron_pt[
                        1] > 10. and event.Electron_cutBased[
                            0] > 0 and event.Electron_cutBased[1] > 0:
                Lepton1.SetPtEtaPhiM(event.Electron_pt[0],
                                     event.Electron_eta[0],
                                     event.Electron_phi[0],
                                     event.Electron_mass[0])
                Lepton2.SetPtEtaPhiM(event.Electron_pt[1],
                                     event.Electron_eta[1],
                                     event.Electron_phi[1],
                                     event.Electron_mass[1])
                mll = (Lepton1 + Lepton2).M()
                ptll = (Lepton1 + Lepton2).Pt()
                if mll > 15.:
                    iSkim = 6
                    # Variables
                    mZ, ptZ = mll, ptll
                    dEtaLL = abs(Lepton1.Eta() - Lepton2.Eta())
                    dPhiLL = abs(Lepton1.DeltaPhi(Lepton2))
                    dRLL = Lepton1.DeltaR(Lepton2)
                    MinMuonIso = event.Electron_pfRelIso03_all[0]
                    MaxMuonIso = event.Electron_pfRelIso03_all[0]
                    MinMuonMetDPhi = min(abs(Lepton1.DeltaPhi(MET)),
                                         abs(Lepton2.DeltaPhi(MET)))
                    MaxMuonMetDPhi = max(abs(Lepton1.DeltaPhi(MET)),
                                         abs(Lepton2.DeltaPhi(MET)))
                    MinMuonJetDR = min(getMinMuonJetDR(cleanJet, Lepton1),
                                       getMinMuonJetDR(cleanJet, Lepton2))
                    LLJJ = twoJets + Lepton1 + Lepton2
                    Vis = allJets + Lepton1 + Lepton2
                    # Weights
                    if self.isMC:
                        triggerWeight = self.elSFs.getTriggerSF(
                            event.Electron_pt[0], event.Electron_eta[0])
                        leptonWeight = self.elSFs.getIdIsoSF(
                            event.Electron_pt[0],
                            event.Electron_eta[0]) * self.elSFs.getIdIsoSF(
                                event.Electron_pt[1], event.Electron_eta[1])

        # case 2: ttbar and Z OF CR (1 muon and 1 electron)
        if iSkim == 0 and event.nMuon >= 1 and event.nElectron >= 1:
            if (isSingleMuIsoTrigger or isSingleMuTrigger
                ) and event.Muon_pt[0] > 27. and event.Electron_pt[
                    0] > 20. and event.Muon_mediumId[
                        0] and event.Electron_cutBased[0] >= 2:
                Lepton1.SetPtEtaPhiM(event.Muon_pt[0], event.Muon_eta[0],
                                     event.Muon_phi[0], event.Muon_mass[0])
                Lepton2.SetPtEtaPhiM(event.Electron_pt[0],
                                     event.Electron_eta[0],
                                     event.Electron_phi[0],
                                     event.Electron_mass[0])
                mll = (Lepton1 + Lepton2).M()
                ptll = (Lepton1 + Lepton2).Pt()
                if mll > 15.:
                    iSkim = 2
                    # Variables
                    mZ, ptZ = mll, ptll
                    dEtaLL = abs(Lepton1.Eta() - Lepton2.Eta())
                    dPhiLL = abs(Lepton1.DeltaPhi(Lepton2))
                    dRLL = Lepton1.DeltaR(Lepton2)
                    MinMuonIso = event.Muon_pfRelIso03_all[0]
                    MaxMuonIso = event.Muon_pfRelIso03_all[0]
                    MinMuonMetDPhi = abs(Lepton1.DeltaPhi(MET))
                    MaxMuonMetDPhi = abs(Lepton1.DeltaPhi(MET))
                    MinMuonJetDR = min(getMinMuonJetDR(cleanJet, Lepton1),
                                       getMinMuonJetDR(cleanJet, Lepton2))
                    LLJJ = twoJets + Lepton1 + Lepton2
                    Vis = allJets + Lepton1 + Lepton2
                    # Weights
                    if self.isMC:
                        triggerWeight = self.muSFs.getTriggerSF(
                            Lepton1.Pt(), Lepton1.Eta())
                        IdSF1 = self.muSFs.getIdSF(event.Muon_pt[0],
                                                   event.Muon_eta[0], 2)
                        IsoSF1 = self.muSFs.getIsoSF(event.Muon_pt[0],
                                                     event.Muon_eta[0])
                        IdIsoSF2 = self.elSFs.getIdIsoSF(
                            event.Electron_pt[0], event.Electron_eta[0])
                        leptonWeight = IdSF1 * IsoSF1 * IdIsoSF2

        # case 4: ttbar CR (1 muon and >= 3 jets)
        if iSkim == 0 and event.nMuon >= 1:
            if (isSingleMuIsoTrigger or isSingleMuTrigger
                ) and event.Muon_pt[0] > 27. and event.Muon_mediumId[
                    0] and event.Muon_pfRelIso03_all[0] < 0.15:
                Lepton1.SetPtEtaPhiM(event.Muon_pt[0], event.Muon_eta[0],
                                     event.Muon_phi[0], event.Muon_mass[0])
                pzN = recoverNeutrinoPz(Lepton1, MET)
                Neutrino.SetPxPyPzE(MET.Px(), MET.Py(), pzN, MET.Pt())
                mW = (Lepton1 + Neutrino).M()
                ptW = (Lepton1 + Neutrino).Pt()
                mT = math.sqrt(2. * Lepton1.Pt() * MET.Pt() *
                               (1. - math.cos(Lepton1.DeltaPhi(MET))))
                if Nj30 >= 3:  # and nBJet >= 1:
                    iSkim = 5
                    # Variables
                    MinMuonIso = event.Muon_pfRelIso03_all[0]
                    MaxMuonIso = event.Muon_pfRelIso03_all[0]
                    MinMuonMetDPhi = abs(Lepton1.DeltaPhi(MET))
                    MaxMuonMetDPhi = abs(Lepton1.DeltaPhi(MET))
                    MinMuonJetDR = getMinMuonJetDR(cleanJet, Lepton1)
                    LLJJ = twoJets + Lepton1
                    Vis = allJets + Lepton1
                    # W and Top reconstruction
                    if len(cleanBJet) >= 2:
                        mLepTop1 = (Lepton1 + Neutrino + cleanBJet[0]).M()
                        mLepTop2 = (Lepton1 + Neutrino + cleanBJet[1]).M()
                    elif len(cleanBJet) >= 1:
                        mLepTop1 = (Lepton1 + Neutrino + cleanBJet[0]).M()
                        mHadTop2 = mHadTop1
                    if len(cleanNonBJet) >= 2:
                        mHadW = (cleanNonBJet[0] + cleanNonBJet[1]).M()
                        if len(cleanBJet) >= 2:
                            mHadTop1 = (cleanNonBJet[0] + cleanNonBJet[1] +
                                        cleanBJet[0]).M()
                            mHadTop2 = (cleanNonBJet[0] + cleanNonBJet[1] +
                                        cleanBJet[1]).M()
                        elif len(cleanBJet) >= 1:
                            mHadTop1 = (cleanNonBJet[0] + cleanNonBJet[1] +
                                        cleanBJet[0]).M()
                            mHadTop2 = mHadTop1
                    # Weights
                    if self.isMC:
                        triggerWeight = self.muSFs.getTriggerSF(
                            Lepton1.Pt(), Lepton1.Eta())
                        IdSF1 = self.muSFs.getIdSF(event.Muon_pt[0],
                                                   event.Muon_eta[0], 2)
                        IsoSF1 = self.muSFs.getIsoSF(event.Muon_pt[0],
                                                     event.Muon_eta[0])
                        leptonWeight = IdSF1 * IsoSF1

        passedMETFilters = True
        filters = [
            "Flag_goodVertices", "Flag_globalSuperTightHalo2016Filter",
            "Flag_BadPFMuonFilter", "Flag_EcalDeadCellTriggerPrimitiveFilter",
            "Flag_HBHENoiseFilter", "Flag_HBHENoiseIsoFilter",
            "Flag_ecalBadCalibFilter", "Flag_ecalBadCalibFilterV2"
        ]
        if not self.isMC: filters += ["Flag_eeBadScFilter"]
        for f in filters:
            if hasattr(event, f) and getattr(event, f) == False:
                passedMETFilters = False
#        try:
##            if event.Flag_goodVertices: print "Flag_goodVertices"
##            if event.Flag_globalSuperTightHalo2016Filter: print "Flag_globalSuperTightHalo2016Filter"
##            if event.Flag_BadPFMuonFilter: print "Flag_BadPFMuonFilter"
##            if event.Flag_EcalDeadCellTriggerPrimitiveFilter: print "Flag_EcalDeadCellTriggerPrimitiveFilter"
##            if event.Flag_HBHENoiseFilter: print "Flag_HBHENoiseFilter"
##            if event.Flag_HBHENoiseIsoFilter: print "Flag_HBHENoiseIsoFilter"
###            if (self.isMC or event.Flag_eeBadScFilter): print "Flag_eeBadScFilter"
##            if event.Flag_ecalBadCalibFilter: print "Flag_ecalBadCalibFilterV2"
#            if event.Flag_goodVertices and event.Flag_globalSuperTightHalo2016Filter and event.Flag_BadPFMuonFilter and event.Flag_EcalDeadCellTriggerPrimitiveFilter and event.Flag_HBHENoiseFilter and event.Flag_HBHENoiseIsoFilter: # and event.Flag_ecalBadCalibFilter: #and (self.isMC or event.Flag_eeBadScFilter): FIXME
#                passedMETFilters = True
##            if not self.isMC:
##                if not event.Flag_eeBadScFilter:
##                    passedMETFilters = False
#        except:
#            passedMETFilters = False

        if iSkim == 0: return False

        if self.isMC:
            eventWeightLumi = self.lumiWeight * lheWeight * puWeight * topWeight * qcdnloWeight * qcdnnloWeight * ewknloWeight * triggerWeight * leptonWeight

        self.out.fillBranch("iSkim", iSkim)
        self.out.fillBranch("isMC", self.isMC)
        self.out.fillBranch("isSingleMuIsoTrigger", isSingleMuIsoTrigger)
        self.out.fillBranch("isSingleMuTrigger", isSingleMuTrigger)
        self.out.fillBranch("isDoubleMuonTrigger", isDoubleMuonTrigger)
        self.out.fillBranch("isSingleEleIsoTrigger", isSingleEleIsoTrigger)
        self.out.fillBranch("isSingleEleTrigger", isSingleEleTrigger)
        self.out.fillBranch("passedMETFilters", passedMETFilters)
        self.out.fillBranch("nCleanElectron", len(cleanElectron))
        self.out.fillBranch("nCleanMuon", len(cleanMuon))
        self.out.fillBranch("nCleanJet", len(cleanJet))
        self.out.fillBranch("Z_mass", mZ)
        self.out.fillBranch("Z_pt", ptZ)
        self.out.fillBranch("W_mass", mW)
        self.out.fillBranch("W_tmass", mT)
        self.out.fillBranch("W_pt", ptW)
        self.out.fillBranch("ll_dEta", dEtaLL)
        self.out.fillBranch("ll_dPhi", dPhiLL)
        self.out.fillBranch("ll_dR", dRLL)
        self.out.fillBranch("Wqq_mass", mHadW)
        self.out.fillBranch("Tlvb1_mass", mLepTop1)
        self.out.fillBranch("Tlvb2_mass", mLepTop2)
        self.out.fillBranch("Tqqb1_mass", mHadTop1)
        self.out.fillBranch("Tqqb2_mass", mHadTop2)
        self.out.fillBranch("jj_mass", mJJ)
        self.out.fillBranch("jj_pt", ptJJ)
        self.out.fillBranch("jj_dEta", dEtaJJ)
        self.out.fillBranch("jj_dPhi", dPhiJJ)
        self.out.fillBranch("jj_dR", dRJJ)
        self.out.fillBranch("nj_mass", mNJ)
        self.out.fillBranch("vis_mass", Vis.M())
        self.out.fillBranch("lljj_mass", LLJJ.M())
        self.out.fillBranch("minMuonIso", MinMuonIso)
        self.out.fillBranch("maxMuonIso", MaxMuonIso)
        self.out.fillBranch("minMuonMetDPhi", MinMuonMetDPhi)
        self.out.fillBranch("maxMuonMetDPhi", MaxMuonMetDPhi)
        self.out.fillBranch("minMuonJetDR", MinMuonJetDR)
        self.out.fillBranch("HT30", HT30)
        self.out.fillBranch("nj20", Nj20)
        self.out.fillBranch("nj30", Nj30)
        self.out.fillBranch("nj40", Nj40)
        self.out.fillBranch("nBJet", nBJet)
        self.out.fillBranch("CSV1", CSV1)
        self.out.fillBranch("CSV2", CSV2)
        self.out.fillBranch("CSV3", CSV3)
        self.out.fillBranch("CSV4", CSV4)
        self.out.fillBranch("iCSV1", iCSV1)
        self.out.fillBranch("iCSV2", iCSV2)
        self.out.fillBranch("iCSV3", iCSV3)
        self.out.fillBranch("iCSV4", iCSV4)
        self.out.fillBranch("lumiWeight", self.lumiWeight)
        self.out.fillBranch("lheWeight", lheWeight)
        self.out.fillBranch("stitchWeight", stitchWeight)
        self.out.fillBranch("puWeight", puWeight)
        self.out.fillBranch("topWeight", topWeight)
        self.out.fillBranch("qcdnloWeight", qcdnloWeight)
        self.out.fillBranch("qcdnnloWeight", qcdnnloWeight)
        self.out.fillBranch("ewknloWeight", ewknloWeight)
        self.out.fillBranch("triggerWeight", triggerWeight)
        self.out.fillBranch("leptonWeight", leptonWeight)
        self.out.fillBranch("eventWeightLumi", eventWeightLumi)

        return True
Пример #11
0
    def analyze(self, event):
        eventWeightLumi, lheWeight, stitchWeight, puWeight, qcdnloWeight, qcdnnloWeight, ewknloWeight, topWeight = 1., 1., 1., 1., 1., 1., 1., 1.
        triggerWeight, leptonWeight = 1., 1.
        isSingleMuonTrigger, isSingleMuonPhotonTrigger, isSingleMuonNoFiltersPhotonTrigger, isDoubleMuonTrigger, isDoubleMuonPhotonTrigger, isJPsiTrigger, isDisplacedTrigger = False, False, False, False, False, False, False
        nCleanElectron, nCleanMuon, nCleanTau, nCleanPhoton, nCleanJet, nCleanBTagJet, HT30 = 0, 0, 0, 0, 0, 0, 0
        cosThetaStar, cosTheta1, phi1 = -2., -2., -4.
        genCosThetaStar, genCosTheta1, genPhi1 = -2., -2., -4.

        for t in self.SingleMuonTriggers:
            if hasattr(event, t) and getattr(event, t): isSingleMuonTrigger = True
        for t in self.SingleMuonPhotonTriggers:
            if hasattr(event, t) and getattr(event, t): isSingleMuonPhotonTrigger = True
        for t in self.SingleMuonNoFiltersPhotonTriggers:
            if hasattr(event, t) and getattr(event, t): isSingleMuonNoFiltersPhotonTrigger = True
        for t in self.DoubleMuonTriggers:
            if hasattr(event, t) and getattr(event, t): isDoubleMuonTrigger = True
        for t in self.DoubleMuonPhotonTriggers:
            if hasattr(event, t) and getattr(event, t): isDoubleMuonPhotonTrigger = True
        for t in self.JPsiTriggers:
            if hasattr(event, t) and getattr(event, t): isJPsiTrigger = True
        for t in self.DisplacedTriggers:
            if hasattr(event, t) and getattr(event, t): isDisplacedTrigger = True
        
        lheWeight = 1.
        
        if self.isMC: 
            # Event weight
            if not self.isLO and hasattr(event, "LHEWeight_originalXWGTUP"): lheWeight = event.LHEWeight_originalXWGTUP
            
            # PU weight
            puWeight = self.puTool.getWeight(event.Pileup_nTrueInt)
        
        self.hists["Nevents"].Fill(0, lheWeight)
        self.hists["Acceptance"].Fill(0, lheWeight)
        self.hists["Cutflow"].Fill(0, lheWeight)
        

        # Gen studies
        if self.isMC and self.isSignal:
            genHIdx, genJPsiIdx, genMuon1Idx, genMuon2Idx, genPhotonIdx = -1, -1, -1, -1, -1
#            print "-"*40
            for i in range(event.nGenPart):
#                print i, "\t", event.GenPart_pdgId[i], "\t", event.GenPart_status[i], "\t", event.GenPart_statusFlags[i], "\t", event.GenPart_pt[i]
                if event.GenPart_pdgId[i] == 25 or event.GenPart_pdgId[i] == 23: genHIdx = i
                if event.GenPart_pdgId[i] == 443 and event.GenPart_genPartIdxMother[i] >= 0 and event.GenPart_pdgId[event.GenPart_genPartIdxMother[i]] == 25: genJPsiIdx = i
                if event.GenPart_pdgId[i] == 22 and event.GenPart_status[i] in [1, 23] and event.GenPart_genPartIdxMother[i] >= 0 and event.GenPart_pdgId[event.GenPart_genPartIdxMother[i]] == 25: genPhotonIdx = i #and (genPhotonIdx < 0 or event.GenPart_pt[i] > event.GenPart_pt[genPhotonIdx])
                if event.GenPart_pdgId[i] == -13 and event.GenPart_status[i] == 1 and event.GenPart_genPartIdxMother[i] >= 0 and event.GenPart_pdgId[event.GenPart_genPartIdxMother[i]] != 22 and (genMuon1Idx < 0 or event.GenPart_pt[i] > event.GenPart_pt[genMuon1Idx]): genMuon1Idx = i
                if event.GenPart_pdgId[i] == +13 and event.GenPart_status[i] == 1 and event.GenPart_genPartIdxMother[i] >= 0 and event.GenPart_pdgId[event.GenPart_genPartIdxMother[i]] != 22 and (genMuon2Idx < 0 or event.GenPart_pt[i] > event.GenPart_pt[genMuon2Idx]): genMuon2Idx = i
            
            if genHIdx >= 0 and genJPsiIdx >= 0 and genPhotonIdx >= 0 and genMuon1Idx >= 0 and genMuon2Idx >= 0:
                genH, genJPsi, genMuon1, genMuon2, genPhoton = TLorentzVector(), TLorentzVector(), TLorentzVector(), TLorentzVector(), TLorentzVector()
                if genHIdx >= 0: genH.SetPtEtaPhiM(event.GenPart_pt[genHIdx], event.GenPart_eta[genHIdx], event.GenPart_phi[genHIdx], event.GenPart_mass[genHIdx])
                if genJPsiIdx >= 0: genJPsi.SetPtEtaPhiM(event.GenPart_pt[genJPsiIdx], event.GenPart_eta[genJPsiIdx], event.GenPart_phi[genJPsiIdx], event.GenPart_mass[genJPsiIdx])
                if genPhotonIdx >= 0: genPhoton.SetPtEtaPhiM(event.GenPart_pt[genPhotonIdx], event.GenPart_eta[genPhotonIdx], event.GenPart_phi[genPhotonIdx], event.GenPart_mass[genPhotonIdx])
                if genMuon1Idx >= 0: genMuon1.SetPtEtaPhiM(event.GenPart_pt[genMuon1Idx], event.GenPart_eta[genMuon1Idx], event.GenPart_phi[genMuon1Idx], event.GenPart_mass[genMuon1Idx])
                if genMuon2Idx >= 0: genMuon2.SetPtEtaPhiM(event.GenPart_pt[genMuon2Idx], event.GenPart_eta[genMuon2Idx], event.GenPart_phi[genMuon2Idx], event.GenPart_mass[genMuon2Idx])
                
                # Recalculate candidate 4-vectors for consistent calculation of angular variables
                genJPsi = genMuon1 + genMuon2
                genH = genJPsi + genPhoton
                
                genCosThetaStar, genCosTheta1, genPhi1 = self.returnCosThetaStar(genH, genJPsi), self.returnCosTheta1(genJPsi, genMuon1, genMuon2, genPhoton), self.returnPhi1(genH, genMuon1, genMuon2)
                
                self.hists["genH_pt"].Fill(genH.Pt(), lheWeight)
                self.hists["genH_eta"].Fill(genH.Eta(), lheWeight)
                self.hists["genH_phi"].Fill(genH.Phi(), lheWeight)
                self.hists["genH_mass"].Fill(genH.M(), lheWeight)
                self.hists["genJPsi_pt"].Fill(genJPsi.Pt(), lheWeight)
                self.hists["genJPsi_eta"].Fill(genJPsi.Eta(), lheWeight)
                self.hists["genJPsi_phi"].Fill(genJPsi.Phi(), lheWeight)
                self.hists["genJPsi_mass"].Fill(genJPsi.M(), lheWeight)
                self.hists["genPhoton_pt"].Fill(genPhoton.Pt(), lheWeight)
                self.hists["genPhoton_eta"].Fill(genPhoton.Eta(), lheWeight)
                self.hists["genMuon1_pt"].Fill(max(genMuon1.Pt(), genMuon2.Pt()), lheWeight)
                self.hists["genMuon1_eta"].Fill(genMuon1.Eta(), lheWeight)
                self.hists["genMuon2_pt"].Fill(min(genMuon1.Pt(), genMuon2.Pt()), lheWeight)
                self.hists["genMuon2_eta"].Fill(genMuon2.Eta(), lheWeight)
                self.hists["genCosThetaStar"].Fill(genCosThetaStar, lheWeight)
                self.hists["genCosTheta1"].Fill(genCosTheta1, lheWeight)
                self.hists["genPhi1"].Fill(genPhi1, lheWeight)
                self.hists["genCosThetaStarZtoMM"].Fill(self.returnCosThetaStar(genH, genMuon1), lheWeight)
                
                # Reweight
                topWeight = 3./4. * (1. + genCosTheta1**2) # Transverse polarization (H, Z)
                if 'ZToJPsiG' in self.sampleName:
                    stitchWeight = 3./2. * (1. - genCosTheta1**2) # Longitudinal polarization (Z)
                
                # Acceptance
                if abs(genPhoton.Eta()) < 2.5:
                    self.hists["Acceptance"].Fill(1, lheWeight)
                    if abs(genMuon1.Eta()) < 2.4:
                        self.hists["Acceptance"].Fill(2, lheWeight)
                        if abs(genMuon2.Eta()) < 2.4:
                            self.hists["Acceptance"].Fill(3, lheWeight)
                            self.hists["Cutflow"].Fill(1, lheWeight)
                            if genPhoton.Pt() > 15. and genMuon1.Pt() > 5. and genMuon2.Pt() > 5.:
                                self.hists["Acceptance"].Fill(4, lheWeight)

        # Muons
        m1, m2 = -1, -1
        for i in range(event.nMuon):
            if event.Muon_pt[i] > self.thMuons[0 if m1 < 0 else 1] and abs(event.Muon_eta[i]) < 2.4 and event.Muon_looseId[i]:
                if m1 < 0: m1 = i
                if m2 < 0 and m1 >= 0 and event.Muon_charge[m1] != event.Muon_charge[i]: m2 = i
            
        if m1 < 0 or m2 < 0:
            if self.verbose >= 2: print "- No OS loose muons in acceptance"
            return False
            
        self.hists["Cutflow"].Fill(2, lheWeight)
        
        muon1, muon2 = TLorentzVector(), TLorentzVector()
        muon1.SetPtEtaPhiM(event.Muon_pt[m1], event.Muon_eta[m1], event.Muon_phi[m1], event.Muon_mass[m1])
        muon2.SetPtEtaPhiM(event.Muon_pt[m2], event.Muon_eta[m2], event.Muon_phi[m2], event.Muon_mass[m2])
        muonP = muon1 if event.Muon_charge[m1] > event.Muon_charge[m2] else muon2
        muonM = muon1 if event.Muon_charge[m1] < event.Muon_charge[m2] else muon2
        muon1v2, muon2v2 = TVector2(muon1.Px(), muon1.Py()), TVector2(muon2.Px(), muon2.Py())
        
        jpsi = muon1 + muon2
        
        if jpsi.M() < 2. or jpsi.M() > 12.:
            if self.verbose >= 2: print "- Dimuon invariant mass < 2 or > 12 GeV"
            return False
        
        self.hists["Cutflow"].Fill(3, lheWeight)
        
        # Photons
        p0 = -1
        for i in range(event.nPhoton):
            if event.Photon_pt[i] > self.thPhoton[0] and abs(event.Photon_eta[i]) < 2.5 and event.Photon_pfRelIso03_all[i] < 0.25: # and event.Photon_mvaID_WP80[i]:
                if p0 < 0: p0 = i
        
        if p0 < 0:
            if self.verbose >= 2: print "- No isolated photons in acceptance"
            return False
        
        self.hists["Cutflow"].Fill(4, lheWeight)
        
        photon = TLorentzVector()
        photon.SetPtEtaPhiM(event.Photon_pt[p0], event.Photon_eta[p0], event.Photon_phi[p0], event.Photon_mass[p0])
        photonv2 = TVector2(photon.Px(), photon.Py())
        
        met, metPlusPhoton = TVector2(), TVector2()
        met.SetMagPhi(event.MET_pt, event.MET_phi)
        metPlusPhoton.Set(met.Px() + photon.Px(), met.Py() + photon.Py())
        
        h = jpsi + photon

        jpsi_pt = jpsi.Pt()
        jpsi_eta = jpsi.Eta()
        jpsi_phi = jpsi.Phi()
        jpsi_mass = jpsi.M()
        jpsi_dEta = abs(muon1.Eta() - muon2.Eta())
        jpsi_dPhi = abs(muon1.DeltaPhi(muon2))
        jpsi_dR = muon1.DeltaR(muon2)
        
        h_pt = h.Pt()
        h_eta = h.Eta()
        h_phi = h.Phi()
        h_mass = h.M()
        h_dEta = abs(jpsi.Eta() - photon.Eta())
        h_dPhi = abs(jpsi.DeltaPhi(photon))
        h_dR = jpsi.DeltaR(photon)
        
        Muon1TrkIso, Muon2TrkIso = event.Muon_tkRelIso[m1], event.Muon_tkRelIso[m2]
        if jpsi_dR < 0.3:
            Muon1TrkIso = max(0., (Muon1TrkIso * event.Muon_pt[m1] * event.Muon_tunepRelPt[m1] - event.Muon_pt[m2] * event.Muon_tunepRelPt[m2])) / (event.Muon_pt[m1] * event.Muon_tunepRelPt[m1])
            Muon2TrkIso = max(0., (Muon2TrkIso * event.Muon_pt[m2] * event.Muon_tunepRelPt[m2] - event.Muon_pt[m1] * event.Muon_tunepRelPt[m1])) / (event.Muon_pt[m2] * event.Muon_tunepRelPt[m2])
        minMuonTrkIso = min(Muon1TrkIso, Muon2TrkIso)
        maxMuonTrkIso = max(Muon1TrkIso, Muon2TrkIso)
        minMuonIso = min(event.Muon_pfRelIso03_all[m1], event.Muon_pfRelIso03_all[m2])
        maxMuonIso = max(event.Muon_pfRelIso03_all[m1], event.Muon_pfRelIso03_all[m2])
        minMuonMetDPhi = min(abs(muon1v2.DeltaPhi(met)), abs(muon2v2.DeltaPhi(met)))
        maxMuonMetDPhi = max(abs(muon1v2.DeltaPhi(met)), abs(muon2v2.DeltaPhi(met)))
        photonMetDPhi = abs(photonv2.DeltaPhi(met))
        metPlusPhotonDPhi = abs(met.DeltaPhi(metPlusPhoton))
        
        cosThetaStar = self.returnCosThetaStar(h, jpsi)
        cosTheta1 = self.returnCosTheta1(jpsi, muonP, muonM, photon)
        phi1 = self.returnPhi1(h, muonP, muonM)

        # Weights
#        if self.isMC:
#            triggerWeight = self.muSFs.getTriggerSF(event.Muon_pt[m1], event.Muon_eta[m1])
#            IdSF1 = self.muSFs.getIdSF(event.Muon_pt[0], event.Muon_eta[0], 2)
#            IsoSF1 = self.muSFs.getIsoSF(event.Muon_pt[0], event.Muon_eta[0])
#            IdSF2 = self.muSFs.getIdSF(event.Muon_pt[1], event.Muon_eta[1], 2)
#            IsoSF2 = self.muSFs.getIsoSF(event.Muon_pt[1], event.Muon_eta[1])
#            IdIsoSF3 = self.elSFs.getIdIsoSF(event.Electron_pt[0], event.Electron_eta[0])
#            leptonWeight = IdSF1 * IsoSF1 * IdSF2 * IsoSF2 * IdIsoSF3
        
        passedMETFilters = True
        filters = ["Flag_goodVertices", "Flag_globalSuperTightHalo2016Filter", "Flag_BadPFMuonFilter", "Flag_EcalDeadCellTriggerPrimitiveFilter", "Flag_HBHENoiseFilter", "Flag_HBHENoiseIsoFilter", "Flag_ecalBadCalibFilter", "Flag_ecalBadCalibFilterV2"]
        if not self.isMC: filters += ["Flag_eeBadScFilter"]
        for f in filters:
            if hasattr(event, f) and getattr(event, f) == False: passedMETFilters = False
#        try:
##            if event.Flag_goodVertices: print "Flag_goodVertices"
##            if event.Flag_globalSuperTightHalo2016Filter: print "Flag_globalSuperTightHalo2016Filter"
##            if event.Flag_BadPFMuonFilter: print "Flag_BadPFMuonFilter"
##            if event.Flag_EcalDeadCellTriggerPrimitiveFilter: print "Flag_EcalDeadCellTriggerPrimitiveFilter"
##            if event.Flag_HBHENoiseFilter: print "Flag_HBHENoiseFilter"
##            if event.Flag_HBHENoiseIsoFilter: print "Flag_HBHENoiseIsoFilter"
###            if (self.isMC or event.Flag_eeBadScFilter): print "Flag_eeBadScFilter"
##            if event.Flag_ecalBadCalibFilter: print "Flag_ecalBadCalibFilterV2"
#            if event.Flag_goodVertices and event.Flag_globalSuperTightHalo2016Filter and event.Flag_BadPFMuonFilter and event.Flag_EcalDeadCellTriggerPrimitiveFilter and event.Flag_HBHENoiseFilter and event.Flag_HBHENoiseIsoFilter: # and event.Flag_ecalBadCalibFilter: #and (self.isMC or event.Flag_eeBadScFilter): FIXME
#                passedMETFilters = True
##            if not self.isMC:
##                if not event.Flag_eeBadScFilter:
##                    passedMETFilters = False
#        except:
#            passedMETFilters = False
        
        
        
        ### Event variables ###
        
        # Muons
        for i in range(event.nMuon):
            if i != m1 and i != m2 and event.Muon_pt[i] > 10. and abs(event.Muon_eta[i]) < 2.4 and event.Muon_looseId[i] and event.Muon_pfRelIso03_all[i] < 0.15:
                nCleanMuon += 1
        
        # Electrons
        for i in range(event.nElectron):
            if event.Electron_pt[i] > 10. and abs(event.Electron_eta[i]) < 2.5 and event.Electron_cutBased[i] >= 2:
                nCleanElectron += 1
        
        # Taus
        for i in range(event.nTau):
            if event.Tau_pt[i] > 20. and abs(event.Tau_eta[i]) < 2.5 and event.Tau_idDeepTau2017v2p1VSe[i] >= 16 and event.Tau_idDeepTau2017v2p1VSmu[i] >= 8 and event.Tau_idDeepTau2017v2p1VSjet[i] >= 16 and event.Tau_rawIsodR03[i] < 0.15:
                nCleanTau += 1
        
        # Photons
        for i in range(event.nPhoton):
            if i != p0 and event.Photon_pt[i] > 15. and abs(event.Photon_eta[i]) < 2.5 and event.Photon_pfRelIso03_all[i] < 0.15 and event.Photon_mvaID_WP90[i]:
                nCleanPhoton += 1
        
        # Jets and Event variables
        for i in range(event.nJet):
            if event.Jet_jetId[i] >= 6 and abs(event.Jet_eta[i]) < 2.5:
                HT30 += event.Jet_pt[i]
                nCleanJet += 1
                if event.Jet_btagDeepB[i] >= self.btagMedium: nCleanBTagJet += 1
        
        
        if self.isMC: eventWeightLumi = self.lumiWeight * lheWeight * puWeight * topWeight * qcdnloWeight * qcdnnloWeight * ewknloWeight * triggerWeight * leptonWeight
        
        self.out.fillBranch("isMC", self.isMC)
        self.out.fillBranch("is2016", (self.year == 2016))
        self.out.fillBranch("is2017", (self.year == 2017))
        self.out.fillBranch("is2018", (self.year == 2018))
        self.out.fillBranch("isSingleMuonTrigger", isSingleMuonTrigger)
        self.out.fillBranch("isSingleMuonPhotonTrigger", isSingleMuonPhotonTrigger)
        self.out.fillBranch("isSingleMuonNoFiltersPhotonTrigger", isSingleMuonNoFiltersPhotonTrigger)
        self.out.fillBranch("isDoubleMuonTrigger", isDoubleMuonTrigger)
        self.out.fillBranch("isDoubleMuonPhotonTrigger", isDoubleMuonPhotonTrigger)
        self.out.fillBranch("isJPsiTrigger", isJPsiTrigger)
        self.out.fillBranch("passedMETFilters", passedMETFilters)
        self.out.fillBranch("nCleanElectron", nCleanElectron)
        self.out.fillBranch("nCleanMuon", nCleanMuon)
        self.out.fillBranch("nCleanTau", nCleanTau)
        self.out.fillBranch("nCleanPhoton", nCleanPhoton)
        self.out.fillBranch("nCleanJet", nCleanJet)
        self.out.fillBranch("nCleanBTagJet", nCleanBTagJet)
        self.out.fillBranch("HT30", HT30)
        self.out.fillBranch("iPhoton", p0)
        self.out.fillBranch("iMuon1", m1)
        self.out.fillBranch("iMuon2", m2)
        #
        self.out.fillBranch("Muon1_pt", event.Muon_pt[m1])
        self.out.fillBranch("Muon1_eta", event.Muon_eta[m1])
        self.out.fillBranch("Muon2_pt", event.Muon_pt[m2])
        self.out.fillBranch("Muon2_eta", event.Muon_eta[m2])
        self.out.fillBranch("Muon1_pfRelIso03_all", event.Muon_pfRelIso03_all[m1])
        self.out.fillBranch("Muon2_pfRelIso03_all", event.Muon_pfRelIso03_all[m2])
        self.out.fillBranch("Muon1_mediumId", event.Muon_mediumId[m1])
        self.out.fillBranch("Muon2_mediumId", event.Muon_mediumId[m2])
        self.out.fillBranch("Muon1_ip3d", event.Muon_ip3d[m1])
        self.out.fillBranch("Muon2_ip3d", event.Muon_ip3d[m2])
        self.out.fillBranch("minMuonIso", minMuonIso)
        self.out.fillBranch("maxMuonIso", maxMuonIso)
        self.out.fillBranch("minMuonTrkIso", minMuonTrkIso)
        self.out.fillBranch("maxMuonTrkIso", maxMuonTrkIso)
        self.out.fillBranch("Muon12_diffdxy", abs(event.Muon_dxy[m1]-event.Muon_dxy[m2]))
        self.out.fillBranch("Muon12_diffdz", abs(event.Muon_dz[m1]-event.Muon_dz[m2]))
        self.out.fillBranch("Muon12_signdxy", abs(event.Muon_dxy[m1]-event.Muon_dxy[m2]) / math.sqrt(event.Muon_dxyErr[m1]**2 + event.Muon_dxyErr[m2]**2))
        self.out.fillBranch("Muon12_signdz", abs(event.Muon_dz[m1]-event.Muon_dz[m2]) / math.sqrt(event.Muon_dzErr[m1]**2 + event.Muon_dzErr[m2]**2))
        self.out.fillBranch("Photon1_pt", event.Photon_pt[p0])
        self.out.fillBranch("Photon1_eta", event.Photon_eta[p0])
        self.out.fillBranch("Photon1_mvaID_WP80", event.Photon_mvaID_WP80[p0])
        self.out.fillBranch("Photon1_pfRelIso03_all", event.Photon_pfRelIso03_all[p0])
        #
        self.out.fillBranch("JPsi_pt", jpsi_pt)
        self.out.fillBranch("JPsi_eta", jpsi_eta)
        self.out.fillBranch("JPsi_phi", jpsi_phi)
        self.out.fillBranch("JPsi_mass", jpsi_mass)
        self.out.fillBranch("JPsi_dEta", jpsi_dEta)
        self.out.fillBranch("JPsi_dPhi", jpsi_dPhi)
        self.out.fillBranch("JPsi_dR", jpsi_dR)
        self.out.fillBranch("H_pt", h_pt)
        self.out.fillBranch("H_eta", h_eta)
        self.out.fillBranch("H_phi", h_phi)
        self.out.fillBranch("H_mass", h_mass)
        self.out.fillBranch("H_dEta", h_dEta)
        self.out.fillBranch("H_dPhi", h_dPhi)
        self.out.fillBranch("H_dR", h_dR)
        self.out.fillBranch("minMuonMetDPhi", minMuonMetDPhi)
        self.out.fillBranch("maxMuonMetDPhi", maxMuonMetDPhi)
        self.out.fillBranch("photonMetDPhi", photonMetDPhi)
        self.out.fillBranch("metPlusPhotonDPhi", metPlusPhotonDPhi)
        self.out.fillBranch("cosThetaStar", cosThetaStar)
        self.out.fillBranch("cosTheta1", cosTheta1)
        self.out.fillBranch("phi1", phi1)
        self.out.fillBranch("genCosThetaStar", genCosThetaStar)
        self.out.fillBranch("genCosTheta1", genCosTheta1)
        self.out.fillBranch("genPhi1", genPhi1)
        self.out.fillBranch("lumiWeight", self.lumiWeight)
        self.out.fillBranch("lheWeight", lheWeight)
        self.out.fillBranch("stitchWeight", stitchWeight)
        self.out.fillBranch("puWeight", puWeight)
        self.out.fillBranch("topWeight", topWeight)
        self.out.fillBranch("qcdnloWeight", qcdnloWeight)
        self.out.fillBranch("qcdnnloWeight", qcdnnloWeight)
        self.out.fillBranch("ewknloWeight", ewknloWeight)
        self.out.fillBranch("triggerWeight", triggerWeight)
        self.out.fillBranch("leptonWeight", leptonWeight)
        self.out.fillBranch("eventWeightLumi", eventWeightLumi)
        
        if self.verbose >= 2: print "+ Tree filled"
        
        return True
                    0, 1
                )  #split up MC sample events into testing/training and application
                if (RND[0] < RND_CUT):
                    CUT[0] = 1.0 / (RND_CUT)  #testing-training
                else:
                    CUT[0] = 1.0 / (1.0 - RND_CUT)  #application

            for v in variables:
                exec(v + '[0]=tin' + suff + '.' + v)

            L1.SetPtEtaPhiM(l1pt[0], l1eta[0], l1phi[0], 0)
            L2.SetPtEtaPhiM(l2pt[0], l2eta[0], l2phi[0], 0)
            ZB.SetPtEtaPhiM(zpt[0], zeta[0], zphi[0], mass[0])
            MET.SetPtEtaPhiM(met[0], 0, metphi[0], 0)

            phil2met[0] = abs(L2.DeltaPhi(MET))
            Thrust[0] = (L1 - L2).Pt()
            DeltaPz[0] = abs((L1 - L2).Pz())
            DeltaPhi_ZH[0] = abs(ZB.DeltaPhi(MET))
            #TransMass_Eff[0] = l1pt[0] + l2pt[0] + met[0]
            #TransMass_EffZ[0] = math.sqrt(zpt[0]**2 + mass[0]**2) + met[0]
            TransMass[0] = (L1 + L2 + MET).Mt()
            TransMass_Eff[0] = L1.Et() + L2.Et() + MET.Et()
            TransMass2[0] = math.sqrt(
                2 *
                (L1.Pt() * L2.Pt() *
                 (1 - math.cos(abs(L1.DeltaPhi(L2)))) + L1.Pt() * MET.Pt() *
                 (1 - math.cos(abs(L1.DeltaPhi(MET)))) + L2.Pt() * MET.Pt() *
                 (1 - math.cos(abs(L2.DeltaPhi(MET))))))
            TransMass3[0] = math.sqrt(
                2 * (L1 + L2).Pt() * MET.Pt() *
Пример #13
0
    def analyze(self, event):

        ## initialize ##

        # Just copy from former parts
        self.out.fillBranch("MVAinput_nGoodJet", event._tree.b_out_nGoodJet)
        self.out.fillBranch("MVAinput_Z_mass", event._tree.b_out_Z_mass)
        self.out.fillBranch("MVAinput_W_mass", event._tree.b_out_W_MT)
        self.out.fillBranch("MVAinput_ZWL_dPhi",
                            event._tree.b_out_TriLepton_WleptonZdPhi)
        self.out.fillBranch("MVAinput_ZWL_dR",
                            event._tree.b_out_TriLepton_WleptonZdR)
        self.out.fillBranch("MVAinput_MET", event._tree.b_out_MET_pt)
        self.out.fillBranch("MVAinput_MET_Phi", event._tree.b_out_MET_phi)
        self.out.fillBranch("MVAinput_TLepton_mass",
                            event._tree.b_out_TriLepton_mass)
        self.out.fillBranch("MVAinput_nbJet", event._tree.b_out_nBjet)

        # Basic event selection for WZCR/TTCR
        if ((event._tree.b_out_GoodLeptonCode != 111)
                or (event._tree.b_out_nGoodLepton > 3)
                or (event._tree.b_out_W_MT > 300)):
            self.out.fillBranch("MVAinput_Status", 0)
            #self.out.fillBranch("MVAinput_nGoodJet", 0)
            self.out.fillBranch("MVAinput_WLZL1_dPhi", 0)
            self.out.fillBranch("MVAinput_WLZL1_dR", 0)
            self.out.fillBranch("MVAinput_WLZL2_dPhi", 0)
            self.out.fillBranch("MVAinput_WLZL2_dR", 0)
            self.out.fillBranch("MVAinput_ZL1ZL2_dPhi", 0)
            self.out.fillBranch("MVAinput_ZL1ZL2_dR", 0)
            #self.out.fillBranch("MVAinput_Z_mass", 0)
            #self.out.fillBranch("MVAinput_W_mass", 0)
            #self.out.fillBranch("MVAinput_ZWL_dPhi", 0)
            #self.out.fillBranch("MVAinput_ZWL_dR", 0)
            #self.out.fillBranch("MVAinput_MET", 0)
            #self.out.fillBranch("MVAinput_MET_Phi", 0)
            #self.out.fillBranch("MVAinput_TLepton_mass", 0)
            self.out.fillBranch("MVAinput_J1_DeepJetB", 0)
            self.out.fillBranch("MVAinput_J1_pt", 0)
            self.out.fillBranch("MVAinput_ZL1J1_dPhi", 0)
            self.out.fillBranch("MVAinput_ZL1J1_dR", 0)
            self.out.fillBranch("MVAinput_ZL2J1_dPhi", 0)
            self.out.fillBranch("MVAinput_ZL2J1_dR", 0)
            self.out.fillBranch("MVAinput_WLJ1_dPhi", 0)
            self.out.fillBranch("MVAinput_WLJ1_dR", 0)
            #self.out.fillBranch("MVAinput_nbJet", 0)
            self.out.fillBranch("MVAinput_bJ_DeepJetB", 0)
            self.out.fillBranch("MVAinput_qJ_DeepJetB", 0)
            self.out.fillBranch("MVAinput_bJ_pt", 0)
            self.out.fillBranch("MVAinput_qJ_pt", 0)
            self.out.fillBranch("MVAinput_bJqJ_dPhi", 0)
            self.out.fillBranch("MVAinput_bJqJ_dR", 0)
            self.out.fillBranch("MVAinput_WLbJ_dPhi", 0)
            self.out.fillBranch("MVAinput_WLqJ_dR", 0)
            self.out.fillBranch("MVAinput_WLbJ_dPhi", 0)
            self.out.fillBranch("MVAinput_WLbJ_dR", 0)
            self.out.fillBranch("MVAinput_ZL1bJ_dPhi", 0)
            self.out.fillBranch("MVAinput_ZL1bJ_dR", 0)
            self.out.fillBranch("MVAinput_ZL1qJ_dPhi", 0)
            self.out.fillBranch("MVAinput_ZL1qJ_dR", 0)
            self.out.fillBranch("MVAinput_ZL2bJ_dPhi", 0)
            self.out.fillBranch("MVAinput_ZL2bJ_dR", 0)
            self.out.fillBranch("MVAinput_ZL2qJ_dPhi", 0)
            self.out.fillBranch("MVAinput_ZL2qJ_dR", 0)
            #self.out.fillBranch("MVAinput_SMTop_mass", 0)
            #self.out.fillBranch("MVAinput_FCNCTop_mass", 0)
            #self.out.fillBranch("MVAinput_TopTop_dEta", 0)
            #self.out.fillBranch("MVAinput_TopTop_dPhi", 0)

            return True
        else:

            # Booking and filling variables for basic variables

            Z1Lepton = TLorentzVector()
            Z2Lepton = TLorentzVector()
            WLepton = TLorentzVector()
            ConstZ = TLorentzVector()
            Jet1 = TLorentzVector()  # For WZCR
            bJet = TLorentzVector()  # For TTCR
            qJet = TLorentzVector()  # For TTCR

            WLepton.SetPtEtaPhiM(event._tree.b_out_Lepton1_pt,
                                 event._tree.b_out_Lepton1_eta,
                                 event._tree.b_out_Lepton1_phi,
                                 event._tree.b_out_Lepton1_mass)
            Z1Lepton.SetPtEtaPhiM(event._tree.b_out_Lepton2_pt,
                                  event._tree.b_out_Lepton2_eta,
                                  event._tree.b_out_Lepton2_phi,
                                  event._tree.b_out_Lepton2_mass)
            Z2Lepton.SetPtEtaPhiM(event._tree.b_out_Lepton2_pt,
                                  event._tree.b_out_Lepton2_eta,
                                  event._tree.b_out_Lepton2_phi,
                                  event._tree.b_out_Lepton2_mass)
            ConstZ.SetPtEtaPhiM(event._tree.b_out_Z_pt,
                                event._tree.b_out_Z_eta,
                                event._tree.b_out_Z_phi,
                                event._tree.b_out_Z_mass)

            self.out.fillBranch("MVAinput_WLZL1_dPhi",
                                WLepton.DeltaPhi(Z1Lepton))
            self.out.fillBranch("MVAinput_WLZL1_dR", WLepton.DeltaR(Z1Lepton))
            self.out.fillBranch("MVAinput_WLZL2_dPhi",
                                WLepton.DeltaPhi(Z2Lepton))
            self.out.fillBranch("MVAinput_WLZL2_dR", WLepton.DeltaR(Z2Lepton))
            self.out.fillBranch("MVAinput_ZL1ZL2_dPhi",
                                Z1Lepton.DeltaPhi(Z2Lepton))
            self.out.fillBranch("MVAinput_ZL1ZL2_dR",
                                Z1Lepton.DeltaR(Z1Lepton))

            # For WZCR case

            if ( ( abs( ConstZ.M() - 91.2) < 7.5 ) and ( event._tree.b_out_nGoodJet >= 1 ) and\
               ( event._tree.b_out_nBjet == 0 ) and ( event._tree.b_out_LeadingLepton_pt > 25 ) and ( event._tree.b_out_Z_charge == 0 ) ):

                Jet1.SetPtEtaPhiM(event._tree.b_out_GoodJet_pt[0],
                                  event._tree.b_out_GoodJet_eta[0],
                                  event._tree.b_out_GoodJet_phi[0],
                                  event._tree.b_out_GoodJet_mass[0])

                self.out.fillBranch("MVAinput_J1_DeepJetB",
                                    event._tree.b_out_GoodJet_DeepFlavB[0]
                                    )  # Should be changed to DeepJet b tagger
                self.out.fillBranch("MVAinput_J1_pt", Jet1.Pt())
                self.out.fillBranch("MVAinput_ZL1J1_dPhi",
                                    Z1Lepton.DeltaPhi(Jet1))
                self.out.fillBranch("MVAinput_ZL1J1_dR", Z1Lepton.DeltaR(Jet1))
                self.out.fillBranch("MVAinput_ZL2J1_dPhi",
                                    Z2Lepton.DeltaPhi(Jet1))
                self.out.fillBranch("MVAinput_ZL2J1_dR", Z2Lepton.DeltaR(Jet1))
                self.out.fillBranch("MVAinput_WLJ1_dPhi",
                                    WLepton.DeltaPhi(Jet1))
                self.out.fillBranch("MVAinput_WLJ1_dR", WLepton.DeltaR(Jet1))
                self.out.fillBranch("MVAinput_Status",
                                    1)  # Status flag 1 : WZCR

                return True
            # For TTCR case

            elif ( not( 20 < abs(ConstZ.M() - 91.2) < 60 ) and ( 2 <= event._tree.b_out_nGoodJet <= 3) and\
                    ( event._tree.b_out_nBjet >= 1 ) and ( event._tree.b_out_LeadingLepton_pt > 25 ) and ( event._tree.b_out_Z_charge == 0 ) ):

                BJet = TLorentzVector()
                QJet = TLorentzVector()
                BJet.SetPtEtaPhiM(event._tree.b_out_GoodJet_pt[0],
                                  event._tree.b_out_GoodJet_eta[0],
                                  event._tree.b_out_GoodJet_phi[0],
                                  event._tree.b_out_GoodJet_mass[0])
                QJet.SetPtEtaPhiM(event._tree.b_out_GoodJet_pt[1],
                                  event._tree.b_out_GoodJet_eta[1],
                                  event._tree.b_out_GoodJet_phi[1],
                                  event._tree.b_out_GoodJet_mass[1])
                btagBj = event._tree.b_out_GoodJet_DeepFlavB[
                    0]  # Should be changed to DeepJet b tagger
                btagQj = event._tree.b_out_GoodJet_DeepFlavB[
                    1]  # Should be changed to DeepJet b tagger

                if (btagBj < btagQj):
                    BJet, QJet = QJet, BJet
                    btagBj, btagQj = btagBj, btagQj

                #SMTop = TLorentzVector()
                #FCNCTop = TLorentzVector()
                #SMTop.SetPtEtaPhiM(event._tree.b_out_KinTopWb_pt, event._tree.b_out_KinTopWb_eta, event._tree.b_out_KinTopWb_phi, event._tree.b_out_KinTopWb_mass)
                #FCNCTop.SetPtEtaPhiM(event._tree.b_out_KinTopZq_pt, event._tree.b_out_KinTopZq_eta, event._tree.b_out_KinTopZq_phi, event._tree.b_out_KinTopZq_mass)

                self.out.fillBranch("MVAinput_bJ_DeepJetB", btagBj)
                self.out.fillBranch("MVAinput_qJ_DeepJetB", btagQj)
                self.out.fillBranch("MVAinput_bJ_pt", BJet.Pt())
                self.out.fillBranch("MVAinput_qJ_pt", QJet.Pt())
                self.out.fillBranch("MVAinput_bJqJ_dPhi", BJet.DeltaPhi(QJet))
                self.out.fillBranch("MVAinput_bJqJ_dR", BJet.DeltaR(QJet))
                self.out.fillBranch("MVAinput_WLbJ_dPhi",
                                    WLepton.DeltaPhi(BJet))
                self.out.fillBranch("MVAinput_WLbJ_dR", WLepton.DeltaR(BJet))
                self.out.fillBranch("MVAinput_WLqJ_dPhi",
                                    WLepton.DeltaPhi(QJet))
                self.out.fillBranch("MVAinput_WLqJ_dR", WLepton.DeltaR(QJet))
                self.out.fillBranch("MVAinput_ZL1bJ_dPhi",
                                    Z1Lepton.DeltaPhi(BJet))
                self.out.fillBranch("MVAinput_ZL1bJ_dR", Z1Lepton.DeltaR(BJet))
                self.out.fillBranch("MVAinput_ZL1qJ_dPhi",
                                    Z1Lepton.DeltaPhi(QJet))
                self.out.fillBranch("MVAinput_ZL1qJ_dR", Z1Lepton.DeltaR(QJet))
                self.out.fillBranch("MVAinput_ZL2bJ_dPhi",
                                    Z2Lepton.DeltaPhi(BJet))
                self.out.fillBranch("MVAinput_ZL2bJ_dR", Z2Lepton.DeltaR(BJet))
                self.out.fillBranch("MVAinput_ZL2qJ_dPhi",
                                    Z2Lepton.DeltaPhi(QJet))
                self.out.fillBranch("MVAinput_ZL2qJ_dR", Z2Lepton.DeltaR(QJet))
            # Top varlables not handled at here.
            #    if ( event._tree.b_out_KinTop_status == 1 ): # Check 2 top are reconstructed
            #    self.out.fillBranch("MVAinput_SMTop_mass", SMTop[3])
            #    self.out.fillBranch("MVAinput_FCNCTop_mass", FCNCTop[3])
            #    self.out.fillBranch("MVAinput_TopTop_dEta", abs(SMTop[1] - FCNCTop[1]))
            #    self.out.fillBranch("MVAinput_TopTop_dPhi", abs(SMTop[2] - FCNCTop[2]))
            #    self.out.fillBranch("MVAinput_Status", 2) # Status flag 2 : TTCR
            #    else:
            #        self.out.fillBranch("MVAinput_SMTop_mass", 0)
            #        self.out.fillBranch("MVAinput_FCNCTop_mass", 0)
            #        self.out.fillBranch("MVAinput_TopTop_dEta", 0)
            #        self.out.fillBranch("MVAinput_TopTop_dPhi", 0)
            #        self.out.fillBranch("MVAinput_Status", 3) # Status flag 3 : TTCR but 2 top are not reconstructed

        return True
Пример #14
0
    def analyze(self, event):

        ## initialize ##
        info = {}
        xsecfile = "%s/src/TZWi/TopAnalysis/test/fcncTriLepton/config/crosssection.yaml" % os.environ["CMSSW_BASE"]
        info.update(yaml.load(open(xsecfile)))
        #info.update(yaml.load(open("../../test/fcncTriLepton/config/datasets/MC.RunIISummer16.central.yaml")))
        info.update(yaml.load(open("%s/src/TZWi/TopAnalysis/test/fcncTriLepton/config/datasets/MC.RunIISummer16.central.yaml" % os.environ["CMSSW_BASE"])))
        info['dataset'].update(yaml.load(open("%s/src/TZWi/TopAnalysis/test/fcncTriLepton/config/datasets/MC.RunIISummer16.rareprocess.yaml" % os.environ["CMSSW_BASE"]))['dataset'])

        rootpath = ROOT.gDirectory.GetPath()
        rootsample1 = rootpath.split('/')[3]
        rootsample = rootsample1.split('.')[0]

        xsecitem = info['crosssection'].items()
        entryitem = info['Entries'].items()
        dataitem = info['dataset'].items()

        fileset = []
        fileroute = []

        for i, items in enumerate(dataitem):
            fileset0 = items[0]
            fileset1 = fileset0.split('.')[1]
            fileset.append(fileset1)
            fileroutekey0 = items[1].keys()
            fileroute.append(fileroutekey0)

        for j, routes in enumerate(fileroute):
            for k, routeitem in enumerate(routes):
                if rootsample in routeitem:
                    findsample = fileset[j]

        targetxsecweight = 1.0
        targetentry = 1
        if ( ( rootsample == "DoubleEG" ) or ( rootsample == "DoubleMuon" ) ):
            targetxsecweight = 1.0
        else:
            for i, xsecslot in enumerate(xsecitem):
                if ( findsample == xsecslot[0] ):
                    targetxsec = xsecslot[1]
            for i, entryslot in enumerate(entryitem):
                if ( findsample == entryslot[0] ):
                    targetentry = entryslot[1]

            targetxsecweight = (targetxsec/targetentry)*35900

        # Basic event selection for WZCR/TTCR
        if ( ( event._tree.b_out_GoodLeptonCode != 111 ) or ( event._tree.b_out_nGoodLepton > 3 ) or ( event._tree.b_out_W_MT > 300 ) ):
            self.out.fillBranch("MVAinput_Status", 0)
            self.out.fillBranch("MVAinput_WLZL1_dPhi", 0)
            self.out.fillBranch("MVAinput_WLZL1_dR", 0)
            self.out.fillBranch("MVAinput_WLZL2_dPhi", 0)
            self.out.fillBranch("MVAinput_WLZL2_dR", 0)
            self.out.fillBranch("MVAinput_ZL1ZL2_dPhi", 0)
            self.out.fillBranch("MVAinput_ZL1ZL2_dR", 0)
            self.out.fillBranch("MVAinput_J1_DeepJetB", 0)
            self.out.fillBranch("MVAinput_J1_pt", 0)
            self.out.fillBranch("MVAinput_ZL1J1_dPhi", 0)
            self.out.fillBranch("MVAinput_ZL1J1_dR", 0)
            self.out.fillBranch("MVAinput_ZL2J1_dPhi", 0)
            self.out.fillBranch("MVAinput_ZL2J1_dR", 0)
            self.out.fillBranch("MVAinput_WLJ1_dPhi", 0)
            self.out.fillBranch("MVAinput_WLJ1_dR", 0)
            self.out.fillBranch("MVAinput_bJ_DeepJetB", 0)
            self.out.fillBranch("MVAinput_qJ_DeepJetB", 0)
            self.out.fillBranch("MVAinput_bJ_pt", 0)
            self.out.fillBranch("MVAinput_qJ_pt", 0)
            self.out.fillBranch("MVAinput_bJqJ_dPhi", 0)
            self.out.fillBranch("MVAinput_bJqJ_dR", 0)
            self.out.fillBranch("MVAinput_WLbJ_dPhi", 0)
            self.out.fillBranch("MVAinput_WLqJ_dR", 0)
            self.out.fillBranch("MVAinput_WLbJ_dPhi", 0)
            self.out.fillBranch("MVAinput_WLbJ_dR", 0)
            self.out.fillBranch("MVAinput_ZL1bJ_dPhi", 0)
            self.out.fillBranch("MVAinput_ZL1bJ_dR", 0)
            self.out.fillBranch("MVAinput_ZL1qJ_dPhi", 0)
            self.out.fillBranch("MVAinput_ZL1qJ_dR", 0)
            self.out.fillBranch("MVAinput_ZL2bJ_dPhi", 0)
            self.out.fillBranch("MVAinput_ZL2bJ_dR", 0)
            self.out.fillBranch("MVAinput_ZL2qJ_dPhi", 0)
            self.out.fillBranch("MVAinput_ZL2qJ_dR", 0)
            self.out.fillBranch("xsecNorm", targetxsecweight)

            return True
        else:

            # Booking and filling variables for basic variables
            
            Z1Lepton = TLorentzVector()
            Z2Lepton = TLorentzVector()
            WLepton = TLorentzVector()
            ConstZ = TLorentzVector()
            Jet1 = TLorentzVector() # For WZCR
            bJet = TLorentzVector() # For TTCR
            qJet = TLorentzVector() # For TTCR

            WLepton.SetPtEtaPhiM(event._tree.b_out_Lepton1_pt, event._tree.b_out_Lepton1_eta, event._tree.b_out_Lepton1_phi, event._tree.b_out_Lepton1_mass)
            Z1Lepton.SetPtEtaPhiM(event._tree.b_out_Lepton2_pt, event._tree.b_out_Lepton2_eta, event._tree.b_out_Lepton2_phi, event._tree.b_out_Lepton2_mass)
            Z2Lepton.SetPtEtaPhiM(event._tree.b_out_Lepton2_pt, event._tree.b_out_Lepton2_eta, event._tree.b_out_Lepton2_phi, event._tree.b_out_Lepton2_mass)
            ConstZ.SetPtEtaPhiM(event._tree.b_out_Z_pt, event._tree.b_out_Z_eta, event._tree.b_out_Z_phi, event._tree.b_out_Z_mass)
            
            self.out.fillBranch("MVAinput_WLZL1_dPhi", WLepton.DeltaPhi(Z1Lepton))
            self.out.fillBranch("MVAinput_WLZL1_dR", WLepton.DeltaR(Z1Lepton))
            self.out.fillBranch("MVAinput_WLZL2_dPhi", WLepton.DeltaPhi(Z2Lepton))
            self.out.fillBranch("MVAinput_WLZL2_dR", WLepton.DeltaR(Z2Lepton))
            self.out.fillBranch("MVAinput_ZL1ZL2_dPhi", Z1Lepton.DeltaPhi(Z2Lepton))
            self.out.fillBranch("MVAinput_ZL1ZL2_dR", Z1Lepton.DeltaR(Z1Lepton))

            # For WZCR case

            if ( ( abs( ConstZ.M() - 91.2) < 7.5 ) and ( event._tree.b_out_nGoodJet >= 1 ) and ( event._tree.b_out_W_MT <= 300) and\
               ( event._tree.b_out_nBjet == 0 ) and ( event._tree.b_out_LeadingLepton_pt > 25 ) and ( event._tree.b_out_Z_charge == 0 ) ):

                Jet1.SetPtEtaPhiM(event._tree.b_out_GoodJet_pt[0], event._tree.b_out_GoodJet_eta[0], event._tree.b_out_GoodJet_phi[0], event._tree.b_out_GoodJet_mass[0])
                
                self.out.fillBranch("MVAinput_J1_DeepJetB", event._tree.b_out_GoodJet_DeepFlavB[0]) # Should be changed to DeepJet b tagger
                self.out.fillBranch("MVAinput_J1_pt", Jet1.Pt())
                self.out.fillBranch("MVAinput_ZL1J1_dPhi", Z1Lepton.DeltaPhi(Jet1))
                self.out.fillBranch("MVAinput_ZL1J1_dR", Z1Lepton.DeltaR(Jet1))
                self.out.fillBranch("MVAinput_ZL2J1_dPhi", Z2Lepton.DeltaPhi(Jet1))
                self.out.fillBranch("MVAinput_ZL2J1_dR", Z2Lepton.DeltaR(Jet1))
                self.out.fillBranch("MVAinput_WLJ1_dPhi", WLepton.DeltaPhi(Jet1))
                self.out.fillBranch("MVAinput_WLJ1_dR", WLepton.DeltaR(Jet1))
                self.out.fillBranch("MVAinput_Status", 1) # Status flag 1 : WZCR
                self.out.fillBranch("xsecNorm", targetxsecweight)

                return True
            # For TTCR case

            elif (  ( 2 <= event._tree.b_out_nGoodJet <= 3) and ( event._tree.b_out_W_MT <= 300) and\
                    ( event._tree.b_out_nBjet >= 1 ) and ( event._tree.b_out_LeadingLepton_pt > 25 ) and ( event._tree.b_out_Z_charge == 0 ) ):

                BJet = TLorentzVector()
                QJet = TLorentzVector()
                BJet.SetPtEtaPhiM(event._tree.b_out_GoodJet_pt[0], event._tree.b_out_GoodJet_eta[0], event._tree.b_out_GoodJet_phi[0], event._tree.b_out_GoodJet_mass[0])
                QJet.SetPtEtaPhiM(event._tree.b_out_GoodJet_pt[1], event._tree.b_out_GoodJet_eta[1], event._tree.b_out_GoodJet_phi[1], event._tree.b_out_GoodJet_mass[1])
                btagBj = event._tree.b_out_GoodJet_DeepFlavB[0] # Should be changed to DeepJet b tagger
                btagQj = event._tree.b_out_GoodJet_DeepFlavB[1] # Should be changed to DeepJet b tagger

                if ( btagBj < btagQj ):
                    BJet, QJet = QJet, BJet
                    btagBj, btagQj = btagBj, btagQj

                self.out.fillBranch("MVAinput_bJ_DeepJetB", btagBj)
                self.out.fillBranch("MVAinput_qJ_DeepJetB", btagQj)
                self.out.fillBranch("MVAinput_bJ_pt", BJet.Pt())
                self.out.fillBranch("MVAinput_qJ_pt", QJet.Pt())
                self.out.fillBranch("MVAinput_bJqJ_dPhi", BJet.DeltaPhi(QJet))
                self.out.fillBranch("MVAinput_bJqJ_dR", BJet.DeltaR(QJet))
                self.out.fillBranch("MVAinput_WLbJ_dPhi", WLepton.DeltaPhi(BJet))
                self.out.fillBranch("MVAinput_WLbJ_dR", WLepton.DeltaR(BJet))
                self.out.fillBranch("MVAinput_WLqJ_dPhi", WLepton.DeltaPhi(QJet))
                self.out.fillBranch("MVAinput_WLqJ_dR", WLepton.DeltaR(QJet))
                self.out.fillBranch("MVAinput_ZL1bJ_dPhi", Z1Lepton.DeltaPhi(BJet))
                self.out.fillBranch("MVAinput_ZL1bJ_dR", Z1Lepton.DeltaR(BJet))
                self.out.fillBranch("MVAinput_ZL1qJ_dPhi", Z1Lepton.DeltaPhi(QJet))
                self.out.fillBranch("MVAinput_ZL1qJ_dR", Z1Lepton.DeltaR(QJet))
                self.out.fillBranch("MVAinput_ZL2bJ_dPhi", Z2Lepton.DeltaPhi(BJet))
                self.out.fillBranch("MVAinput_ZL2bJ_dR", Z2Lepton.DeltaR(BJet))
                self.out.fillBranch("MVAinput_ZL2qJ_dPhi", Z2Lepton.DeltaPhi(QJet))
                self.out.fillBranch("MVAinput_ZL2qJ_dR", Z2Lepton.DeltaR(QJet))
                self.out.fillBranch("MVAinput_Status", 2) # Status flag 2 : TTCR/SR
                self.out.fillBranch("xsecNorm", targetxsecweight)
        return True
Пример #15
0
    def analyze(self, event):
        eventWeightLumi, lheWeight, stitchWeight, puWeight, qcdnloWeight, qcdnnloWeight, ewknloWeight, topWeight = 1., 1., 1., 1., 1., 1., 1., 1.
        triggerWeight, leptonWeight = 1., 1.
        isDoubleElectronTrigger, isDoubleMuonTrigger, isMuonElectronTrigger = False, False, False
        nCleanElectron, nCleanMuon, nCleanTau, nCleanPhoton, nCleanJet, nCleanBTagJet, HT30 = 0, 0, 0, 0, 0, 0, 0
        cosThetaStar, cosTheta1, cosTheta2, phi, phi1 = -2., -2., -2., -4., -4.
        is4e, is4m, is2e2m = False, False, False

        for t in self.DoubleElectronTriggers:
            if hasattr(event, t) and getattr(event, t):
                isDoubleElectronTrigger = True
        for t in self.DoubleMuonTriggers:
            if hasattr(event, t) and getattr(event, t):
                isDoubleMuonTrigger = True
        for t in self.MuonElectronTriggers:
            if hasattr(event, t) and getattr(event, t):
                isMuonElectronTrigger = True

        lheWeight = 1.

        if self.isMC:
            # Event weight
            if not self.isLO and hasattr(event, "LHEWeight_originalXWGTUP"):
                lheWeight = event.LHEWeight_originalXWGTUP

            # PU weight
            puWeight = self.puTool.getWeight(event.Pileup_nTrueInt)

        self.hists["Cutflow"].Fill(1, lheWeight)

        cleanElectrons, cleanMuons = [], []

        # Electrons
        for i in range(event.nElectron):
            if event.Electron_pt[i] > 7. and abs(
                    event.Electron_eta[i]
            ) < 2.5 and event.Electron_mvaFall17V2Iso_WP90[i] and abs(
                    event.Electron_dxy[i]) < 0.5 and abs(
                        event.Electron_dz[i]
                    ) < 1.0 and event.Electron_sip3d[i] < 4.:
                cleanElectrons += [i]

        # Muons
        for i in range(event.nMuon):
            if event.Muon_pt[i] > 5. and abs(event.Muon_eta[i]) < 2.4 and abs(
                    event.Muon_dxy[i]) < 0.5 and abs(
                        event.Muon_dz[i]) < 1.0 and event.Muon_looseId[
                            i] and event.Muon_pfRelIso03_all[
                                i] < 0.35 and event.Muon_sip3d[i] < 4.:
                cleanMuons += [i]

        il1, il2, il3, il4 = -1, -1, -1, -1
        l1, l2, l3, l4, z1, z2 = TLorentzVector(), TLorentzVector(
        ), TLorentzVector(), TLorentzVector(), TLorentzVector(
        ), TLorentzVector()
        lm1, lp1, lm2, lp2 = TLorentzVector(), TLorentzVector(
        ), TLorentzVector(), TLorentzVector()

        # ZZ -> 4mu
        if len(cleanMuons) >= 4:

            # Try to reconstruct Z1
            for i in range(len(cleanMuons)):
                for j in range(len(cleanMuons)):
                    if i == j or (il1 >= 0 and il2 >= 0): continue
                    if event.Muon_charge[i] * event.Muon_charge[j] > 0:
                        continue
                    l1.SetPtEtaPhiM(event.Muon_pt[i], event.Muon_eta[i],
                                    event.Muon_phi[i], event.Muon_mass[i])
                    l2.SetPtEtaPhiM(event.Muon_pt[j], event.Muon_eta[j],
                                    event.Muon_phi[j], event.Muon_mass[j])
                    if 40 < (l1 + l2).M() < 120.:
                        z1, il1, il2 = (l1 + l2), i, j
                        lm1, lp1 = (l1,
                                    l2) if event.Muon_charge[i] < 0 else (l2,
                                                                          l1)

            # Look for Z2
            for i in range(len(cleanMuons)):
                for j in range(len(cleanMuons)):
                    if i == j or i == il1 or j == il1 or i == il2 or j == il2 or (
                            il3 >= 0 and il4 >= 0):
                        continue
                    if event.Muon_charge[i] * event.Muon_charge[j] > 0:
                        continue
                    l3.SetPtEtaPhiM(event.Muon_pt[i], event.Muon_eta[i],
                                    event.Muon_phi[i], event.Muon_mass[i])
                    l4.SetPtEtaPhiM(event.Muon_pt[j], event.Muon_eta[j],
                                    event.Muon_phi[j], event.Muon_mass[j])
                    if (l3 + l4).M() > 4.:
                        z2, il3, il4 = (l3 + l4), i, j
                        lm2, lp2 = (l3,
                                    l4) if event.Muon_charge[i] < 0 else (l4,
                                                                          l3)

            if il1 >= 0 and il2 >= 0 and il3 >= 0 and il4 >= 0 and isDoubleMuonTrigger:
                is4m = True

        # ZZ -> 4e
        elif len(cleanElectrons) >= 4:

            # Try to reconstruct Z1
            for i in range(len(cleanElectrons)):
                for j in range(len(cleanElectrons)):
                    if i == j or (il1 >= 0 and il2 >= 0): continue
                    if event.Electron_charge[i] * event.Electron_charge[j] > 0:
                        continue
                    l1.SetPtEtaPhiM(event.Electron_pt[i],
                                    event.Electron_eta[i],
                                    event.Electron_phi[i],
                                    event.Electron_mass[i])
                    l2.SetPtEtaPhiM(event.Electron_pt[j],
                                    event.Electron_eta[j],
                                    event.Electron_phi[j],
                                    event.Electron_mass[j])
                    if 40 < (l1 + l2).M() < 120.:
                        z1, il1, il2 = (l1 + l2), i, j
                        lm1, lp1 = (l1,
                                    l2) if event.Muon_charge[i] < 0 else (l2,
                                                                          l1)

            # Look for Z2
            for i in range(len(cleanElectrons)):
                for j in range(len(cleanElectrons)):
                    if i == j or i == il1 or j == il1 or i == il2 or j == il2 or (
                            il3 >= 0 and il4 >= 0):
                        continue
                    if event.Electron_charge[i] * event.Electron_charge[j] > 0:
                        continue
                    l3.SetPtEtaPhiM(event.Electron_pt[i],
                                    event.Electron_eta[i],
                                    event.Electron_phi[i],
                                    event.Electron_mass[i])
                    l4.SetPtEtaPhiM(event.Electron_pt[j],
                                    event.Electron_eta[j],
                                    event.Electron_phi[j],
                                    event.Electron_mass[j])
                    if (l3 + l4).M() > 4.:
                        z2, il3, il4 = (l3 + l4), i, j
                        lm2, lp2 = (l3,
                                    l4) if event.Muon_charge[i] < 0 else (l4,
                                                                          l3)

            if il1 >= 0 and il2 >= 0 and il3 >= 0 and il4 >= 0 and isDoubleElectronTrigger:
                is4e = True

        # ZZ -> 2e2mu
        elif len(cleanMuons) >= 2 and len(cleanElectrons) >= 2:

            # Try to reconstruct Z1 (mumu)
            for i in range(len(cleanMuons)):
                for j in range(len(cleanMuons)):
                    if i == j or (il1 >= 0 and il2 >= 0): continue
                    if event.Muon_charge[i] * event.Muon_charge[j] > 0:
                        continue
                    l1.SetPtEtaPhiM(event.Muon_pt[i], event.Muon_eta[i],
                                    event.Muon_phi[i], event.Muon_mass[i])
                    l2.SetPtEtaPhiM(event.Muon_pt[j], event.Muon_eta[j],
                                    event.Muon_phi[j], event.Muon_mass[j])
                    if (l1 + l2).M() > 4.:
                        z1, il1, il2 = (l1 + l2), i, j
                        lm1, lp1 = (l1,
                                    l2) if event.Muon_charge[i] < 0 else (l2,
                                                                          l1)

            # Look for Z2 (ee)
            for i in range(len(cleanElectrons)):
                for j in range(len(cleanElectrons)):
                    if i == j or (il3 >= 0 and il3 >= 0): continue
                    if event.Electron_charge[i] * event.Electron_charge[j] > 0:
                        continue
                    l3.SetPtEtaPhiM(event.Electron_pt[i],
                                    event.Electron_eta[i],
                                    event.Electron_phi[i],
                                    event.Electron_mass[i])
                    l4.SetPtEtaPhiM(event.Electron_pt[j],
                                    event.Electron_eta[j],
                                    event.Electron_phi[j],
                                    event.Electron_mass[j])
                    if (l3 + l4).M() > 4.:
                        z2, il3, il4 = (l3 + l4), i, j
                        lm2, lp2 = (l3,
                                    l4) if event.Muon_charge[i] < 0 else (l4,
                                                                          l3)

            # Swap Z1 and Z2 if needed
            if z2.M() > z1.M():
                z1, z2 = z2, z1
                l1, l2, l3, l4 = l3, l4, l1, l2
                lm1, lp1, lm2, lp2 = lm2, lp2, lm1, lp1
                il1, il2, il3, il4 = il3, il4, il1, il2

            if il1 >= 0 and il2 >= 0 and il3 >= 0 and il4 >= 0 and (
                    40. < z1.M() < 120.) and z2.M() > 4. and (
                        isDoubleElectronTrigger or isDoubleMuonTrigger
                        or isMuonElectronTrigger):
                is2e2m = True

        if not is4m and not is4e and not is2e2m:
            if self.verbose >= 2: print "- No ZZ candidate reconstructed"
            return False

        self.hists["Cutflow"].Fill(2, lheWeight)

        h = z1 + z2

        z1_pt = z1.Pt()
        z1_eta = z1.Eta()
        z1_phi = z1.Phi()
        z1_mass = z1.M()
        z1_dEta = abs(l1.Eta() - l2.Eta())
        z1_dPhi = abs(l1.DeltaPhi(l2))
        z1_dR = l1.DeltaR(l2)

        z2_pt = z2.Pt()
        z2_eta = z2.Eta()
        z2_phi = z2.Phi()
        z2_mass = z2.M()
        z2_dEta = abs(l3.Eta() - l4.Eta())
        z2_dPhi = abs(l3.DeltaPhi(l4))
        z2_dR = l3.DeltaR(l4)

        h_pt = h.Pt()
        h_eta = h.Eta()
        h_phi = h.Phi()
        h_mass = h.M()
        h_dEta = abs(z1.Eta() - z2.Eta())
        h_dPhi = abs(z1.DeltaPhi(z2))
        h_dR = z1.DeltaR(z2)

        cosThetaStar = self.returnCosThetaStar(h, z1)
        cosTheta1 = self.returnCosTheta1(z1, lp1, lm1, z2)
        cosTheta2 = self.returnCosTheta1(z2, lp2, lm2, z1)
        phi = self.returnPhi(h, lp1, lm1, lp2, lm2)
        phi1 = self.returnPhi1(h, lp1, lm1)

        # Weights
        if self.isMC:
            if is4e: triggerWeight = 0.982 / 0.991
            elif is4m: triggerWeight = 1.000 / 0.997
            elif is2e2m: triggerWeight = 0.983 / 0.995
#            IdSF1 = self.muSFs.getIdSF(event.Muon_pt[0], event.Muon_eta[0], 2)
#            IsoSF1 = self.muSFs.getIsoSF(event.Muon_pt[0], event.Muon_eta[0])
#            IdSF2 = self.muSFs.getIdSF(event.Muon_pt[1], event.Muon_eta[1], 2)
#            IsoSF2 = self.muSFs.getIsoSF(event.Muon_pt[1], event.Muon_eta[1])
#            IdIsoSF3 = self.elSFs.getIdIsoSF(event.Electron_pt[0], event.Electron_eta[0])
#            leptonWeight = IdSF1 * IsoSF1 * IdSF2 * IsoSF2 * IdIsoSF3

        passedMETFilters = True
        filters = [
            "Flag_goodVertices", "Flag_globalSuperTightHalo2016Filter",
            "Flag_BadPFMuonFilter", "Flag_EcalDeadCellTriggerPrimitiveFilter",
            "Flag_HBHENoiseFilter", "Flag_HBHENoiseIsoFilter",
            "Flag_ecalBadCalibFilter", "Flag_ecalBadCalibFilterV2"
        ]
        if not self.isMC: filters += ["Flag_eeBadScFilter"]
        for f in filters:
            if hasattr(event, f) and getattr(event, f) == False:
                passedMETFilters = False

        ### Event variables ###

        # Muons
        nCleanMuon = len(cleanMuons)

        # Electrons
        nCleanElectron = len(cleanElectrons)

        # Taus
        for i in range(event.nTau):
            if event.Tau_pt[i] > 20. and abs(
                    event.Tau_eta[i]) < 2.5 and event.Tau_idDeepTau2017v2p1VSe[
                        i] >= 16 and event.Tau_idDeepTau2017v2p1VSmu[
                            i] >= 8 and event.Tau_idDeepTau2017v2p1VSjet[
                                i] >= 16 and event.Tau_rawIsodR03[i] < 0.15:
                nCleanTau += 1

        # Photons
        for i in range(event.nPhoton):
            if event.Photon_pt[i] > 15. and abs(
                    event.Photon_eta[i]) < 2.5 and event.Photon_pfRelIso03_all[
                        i] < 0.15 and event.Photon_mvaID_WP90[i]:
                nCleanPhoton += 1

        # Jets and Event variables
        for i in range(event.nJet):
            if event.Jet_jetId[i] >= 6 and abs(event.Jet_eta[i]) < 2.5:
                HT30 += event.Jet_pt[i]
                nCleanJet += 1
                if event.Jet_btagDeepB[i] >= self.btagMedium:
                    nCleanBTagJet += 1

        if self.isMC:
            eventWeightLumi = self.lumiWeight * lheWeight * puWeight * topWeight * qcdnloWeight * qcdnnloWeight * ewknloWeight * triggerWeight * leptonWeight

        self.out.fillBranch("isMC", self.isMC)
        self.out.fillBranch("is2016", (self.year == 2016))
        self.out.fillBranch("is2017", (self.year == 2017))
        self.out.fillBranch("is2018", (self.year == 2018))
        self.out.fillBranch("is4m", is4m)
        self.out.fillBranch("is4e", is4e)
        self.out.fillBranch("is2e2m", is2e2m)
        self.out.fillBranch("isDoubleElectronTrigger", isDoubleElectronTrigger)
        self.out.fillBranch("isDoubleMuonTrigger", isDoubleMuonTrigger)
        self.out.fillBranch("isMuonElectronTrigger", isMuonElectronTrigger)
        self.out.fillBranch("passedMETFilters", passedMETFilters)
        self.out.fillBranch("nCleanElectron", nCleanElectron)
        self.out.fillBranch("nCleanMuon", nCleanMuon)
        self.out.fillBranch("nCleanTau", nCleanTau)
        self.out.fillBranch("nCleanPhoton", nCleanPhoton)
        self.out.fillBranch("nCleanJet", nCleanJet)
        self.out.fillBranch("nCleanBTagJet", nCleanBTagJet)
        self.out.fillBranch("HT30", HT30)
        self.out.fillBranch("iLepton1", il1)
        self.out.fillBranch("iLepton2", il2)
        self.out.fillBranch("iLepton3", il3)
        self.out.fillBranch("iLepton4", il4)
        self.out.fillBranch("Z1_pt", z1_pt)
        self.out.fillBranch("Z1_eta", z1_eta)
        self.out.fillBranch("Z1_phi", z1_phi)
        self.out.fillBranch("Z1_mass", z1_mass)
        self.out.fillBranch("Z1_dEta", z1_dEta)
        self.out.fillBranch("Z1_dPhi", z1_dPhi)
        self.out.fillBranch("Z1_dR", z1_dR)
        self.out.fillBranch("Z2_pt", z2_pt)
        self.out.fillBranch("Z2_eta", z2_eta)
        self.out.fillBranch("Z2_phi", z2_phi)
        self.out.fillBranch("Z2_mass", z2_mass)
        self.out.fillBranch("Z2_dEta", z2_dEta)
        self.out.fillBranch("Z2_dPhi", z2_dPhi)
        self.out.fillBranch("Z2_dR", z2_dR)
        self.out.fillBranch("H_pt", h_pt)
        self.out.fillBranch("H_eta", h_eta)
        self.out.fillBranch("H_phi", h_phi)
        self.out.fillBranch("H_mass", h_mass)
        self.out.fillBranch("H_dEta", h_dEta)
        self.out.fillBranch("H_dPhi", h_dPhi)
        self.out.fillBranch("H_dR", h_dR)
        self.out.fillBranch("cosThetaStar", cosThetaStar)
        self.out.fillBranch("cosTheta1", cosTheta1)
        self.out.fillBranch("cosTheta2", cosTheta2)
        self.out.fillBranch("phi", phi)
        self.out.fillBranch("phi1", phi1)
        #self.out.fillBranch("genCosThetaStar", genCosThetaStar)
        #self.out.fillBranch("genCosTheta1", genCosTheta1)
        #self.out.fillBranch("genPhi1", genPhi1)
        self.out.fillBranch("lumiWeight", self.lumiWeight)
        self.out.fillBranch("lheWeight", lheWeight)
        self.out.fillBranch("stitchWeight", stitchWeight)
        self.out.fillBranch("puWeight", puWeight)
        self.out.fillBranch("topWeight", topWeight)
        self.out.fillBranch("qcdnloWeight", qcdnloWeight)
        self.out.fillBranch("qcdnnloWeight", qcdnnloWeight)
        self.out.fillBranch("ewknloWeight", ewknloWeight)
        self.out.fillBranch("triggerWeight", triggerWeight)
        self.out.fillBranch("leptonWeight", leptonWeight)
        self.out.fillBranch("eventWeightLumi", eventWeightLumi)

        if self.verbose >= 2: print "+ Tree filled"

        return True
Пример #16
0
                    if (chain == chainS and abs(chain.id[i])
                            == 13) or (chain == chainB or chain == chainD):
                        if chain.charge[i] == 1:
                            plus.push_back(i)
                        elif chain.charge[i] == -1:
                            minus.push_back(i)

        r1 = plus.size()
        r2 = minus.size()
        for i in xrange(r1):
            Vp.SetPxPyPzE(chain.px[plus[i]], chain.py[plus[i]],
                          chain.pz[plus[i]], chain.e[plus[i]])
            for j in xrange(r2):
                Vm.SetPxPyPzE(chain.px[minus[j]], chain.py[minus[j]],
                              chain.pz[minus[j]], chain.e[minus[j]])
                deltaPhi = Vp.DeltaPhi(Vm)
                deltaZ = chain.z[plus[i]] - chain.z[minus[j]]
                #pT1 = plusV.Pt()
                #pT2 = minusV.Pt()
                if (abs(deltaPhi) > 3 and abs(deltaZ) < 0.04):
                    invMass = (Vp + Vm).M()
                    minv.Fill(invMass)

    file.write(str(noe))
    file.write("\n")
    noe = 0
    od.Write()
    od.Close()
file.close()

#TMVA::TMVAGui()
Пример #17
0
    def analyze(self, event):
        """Process event, return True (go to next module) or False (fail, go to next event)."""
      
        if self.isMC:
                PUWeight = 1. #self.puTool.getWeight(event.Pileup_nTrueInt)
                GenWeight = 1.
                if 'signal' in self.name.lower():

                    jetIds = [ ]
                    for ijet in range(event.nJet):
                        if event.Jet_pt[ijet] < 30: continue
                        if abs(event.Jet_eta[ijet]) > 2.5: continue
                        if event.Jet_jetId[ijet]<6: continue
                        #if event.Jet_chEmEF[ijet]>0.9: continue ##FIXME
                        #if (self.year==2017 or self.year==2018) and event.Jet_chEmEF[ijet]>0.8:continue
                        jetIds.append(ijet)

                    BTagAK4Weight_deepJet       = self.btagToolAK4_deepJet.getWeight(event,jetIds, "central")  
                    BTagAK4Weight_deepJet_up    = self.btagToolAK4_deepJet_up.getWeight(event,jetIds, "up")
                    BTagAK4Weight_deepJet_down  = self.btagToolAK4_deepJet_down.getWeight(event,jetIds, "down")

                    self.out.events.Fill(0., BTagAK4Weight_deepJet) 
                else:
                    GenWeight = -1. if event.genWeight<0 else 1.
                    self.out.events.Fill(0., GenWeight)
                try:
                    LHEWeight = event.LHEWeight_originalXWGTUP
                    self.out.original.Fill(0.,LHEWeight)
                except:
                    self.out.original.Fill(0.,-1.)
                self.out.pileup.Fill(event.Pileup_nTrueInt)
 
        ## Event filter preselection
        passedMETFilters = False
        try: 
                if event.Flag_goodVertices and event.Flag_globalSuperTightHalo2016Filter and event.Flag_BadPFMuonFilter and event.Flag_EcalDeadCellTriggerPrimitiveFilter and event.Flag_HBHENoiseFilter and event.Flag_HBHENoiseIsoFilter and (self.isMC or event.Flag_eeBadScFilter) and event.Flag_ecalBadCalibFilter: 
                        passedMETFilters = True 
        except: 
                passedMETFilters = False

        if not passedMETFilters: return False

        ## jet order check 
        if event.nJet < 2: return False
        if event.Jet_pt[0]>event.Jet_pt[1]:
            leading1 = 0
            leading2 = 1
        else:
            leading1 = 1
            leading2 = 0
        for ijet in range(event.nJet)[2:]:
            if event.Jet_pt[ijet] > event.Jet_pt[leading1]: 
                leading2=leading1
                leading1=ijet
            elif event.Jet_pt[ijet] > event.Jet_pt[leading2]: 
                leading2=ijet

        ## Loop over Jets
        jetIds = [ ]
        jetHT = 0.
        jetBTagLoose, jetBTagMedium, jetBTagTight = 0, 0, 0
        for ijet in range(event.nJet):
            if event.Jet_pt[ijet] < 30: continue
            if abs(event.Jet_eta[ijet]) > 2.5: continue
            if event.Jet_jetId[ijet]<6: continue                                                    
            #if event.Jet_chEmEF[ijet]>0.9: continue ## FIXME
            #if (self.year==2017 or self.year==2018) and event.Jet_chEmEF[ijet]>0.8:continue
            jetIds.append(ijet)
            jetHT += event.Jet_pt[ijet]
            if event.Jet_btagDeepFlavB[ijet] >= self.btagLoose: jetBTagLoose += 1
            if event.Jet_btagDeepFlavB[ijet] >= self.btagMedium: jetBTagMedium += 1
            if event.Jet_btagDeepFlavB[ijet] >= self.btagTight: jetBTagTight += 1
            

        ## Jet-based event selections
        if len(jetIds)<2: return False
        #if event.Jet_jetId[jetIds[0]] < 2: return False
        #if event.Jet_jetId[jetIds[1]] < 2: return False
        #if event.MET_pt/jetHT > 0.5: return False      

        
        ### evaluate BTag weights   ## put in beginning of analyze in order to get the weight into the normalization
        #if 'signal' in self.name.lower(): 
        #    BTagAK4Weight_deepJet       = self.btagToolAK4_deepJet.getWeight(event,jetIds)  
        #    BTagAK4Weight_deepJet_up    = self.btagToolAK4_deepJet_up.getWeight(event,jetIds)
        #    BTagAK4Weight_deepJet_down  = self.btagToolAK4_deepJet_down.getWeight(event,jetIds)


        ## Compute dijet quantities
        j1_p4 = TLorentzVector()
        j1_p4.SetPtEtaPhiM(event.Jet_pt[jetIds[0]], event.Jet_eta[jetIds[0]], event.Jet_phi[jetIds[0]], event.Jet_mass[jetIds[0]])
        j2_p4 = TLorentzVector()
        j2_p4.SetPtEtaPhiM(event.Jet_pt[jetIds[1]], event.Jet_eta[jetIds[1]], event.Jet_phi[jetIds[1]], event.Jet_mass[jetIds[1]])
        self.out.jj_mass[0]       = (j1_p4+j2_p4).M()
        self.out.jj_deltaEta[0]   = abs(event.Jet_eta[jetIds[0]]-event.Jet_eta[jetIds[1]])
        self.out.jj_deltaPhi[0]   = abs(j1_p4.DeltaPhi(j2_p4)) #abs(event.Jet_phi[jetIds[0]]-event.Jet_phi[jetIds[1]]) this does not account for phi jump from 2pi to 0

        
        ## Dijet-based event selections
        if self.out.jj_mass[0] < 800: return False  # will need to change this when deriving the trigger efficiency
        
        j1_p4_lepcorr = j1_p4 * (1. + event.Jet_chEmEF[jetIds[0]]+event.Jet_muEF[jetIds[0]])
        j2_p4_lepcorr = j2_p4 * (1. + event.Jet_chEmEF[jetIds[1]]+event.Jet_muEF[jetIds[1]])
        self.out.jj_mass_lepcorr[0] = (j1_p4_lepcorr+j2_p4_lepcorr).M()
        
        met_p4 = TLorentzVector()
        met_p4.SetPtEtaPhiM(event.MET_pt, 0., event.MET_phi, 0.)
        j1_p4_metcorr = j1_p4 * (1. + event.MET_pt/j1_p4.Pt() * math.cos(j1_p4.DeltaPhi(met_p4)+3.1415))
        j2_p4_metcorr = j2_p4 * (1. + event.MET_pt/j2_p4.Pt() * math.cos(j2_p4.DeltaPhi(met_p4)+3.1415))
        self.out.jj_mass_metcorr[0] = (j1_p4_metcorr+j2_p4_metcorr).M()
        
        wj1_p4 = j1_p4
        wj2_p4 = j2_p4
        for ijet in range(event.nJet):
            if ijet == jetIds[0] or ijet == jetIds[1]: continue
            if event.Jet_pt[ijet] < 30 or abs(event.Jet_eta[ijet]) > 2.5: continue
            if event.Jet_jetId[ijet]<6: continue                                                    
            #if event.Jet_chEmEF[ijet]>0.9: continue ## FIXME
            #if (self.year==2017 or self.year==2018) and event.Jet_chEmEF[ijet]>0.8:continue
            j_p4 = TLorentzVector()
            j_p4.SetPtEtaPhiM(event.Jet_pt[ijet], event.Jet_eta[ijet], event.Jet_phi[ijet], event.Jet_mass[ijet])
            if j1_p4.DeltaR(j_p4) < 1.1: wj1_p4 += j_p4
            if j2_p4.DeltaR(j_p4) < 1.1: wj2_p4 += j_p4
        self.out.jj_mass_widejet[0] = (wj1_p4+wj2_p4).M()
        self.out.jj_deltaEta_widejet[0]   = abs(wj1_p4.Eta() - wj2_p4.Eta())
        
        
        nIsoElectrons = 0.
        for iel in range(event.nElectron):
            if event.Electron_pt[iel] > 50. and abs(event.Electron_eta[iel]) < 2.5 and event.Electron_cutBased[iel] >= 2: nIsoElectrons += 1

        nIsoMuons = 0.
        for imu in range(event.nMuon):
            if event.Muon_pt[imu] > 50. and abs(event.Muon_eta[imu]) < 2.4 and event.Muon_highPtId[imu]>=2 and event.Muon_tkRelIso[imu]<0.1: nIsoMuons += 1

        if self.isMC:
            nGenMuons_1 = 0
            nGenMuons_2 = 0
            genMuon_pt_1 = 0.
            genMuon_pt_2 = 0.
            for igen in range(event.nGenPart):
                if abs(event.GenPart_pdgId[igen]) == 13:
                    if ( (event.GenPart_eta[igen] - event.Jet_eta[jetIds[0]])**2 + (event.GenPart_phi[igen] - event.Jet_phi[jetIds[0]])**2 )**0.5  < 0.4:
                        if event.GenPart_pt[igen]>genMuon_pt_1:
                            genMuon_pt_1 = event.GenPart_pt[igen]
                        nGenMuons_1 += 1
                    if ( (event.GenPart_eta[igen] - event.Jet_eta[jetIds[1]])**2 + (event.GenPart_phi[igen] - event.Jet_phi[jetIds[1]])**2 )**0.5  < 0.4:
                        if event.GenPart_pt[igen]>genMuon_pt_2:
                            genMuon_pt_2 = event.GenPart_pt[igen]
                        nGenMuons_2 += 1
       
        nLooseMuons1, nLooseMuons2 = 0, 0 
        ptMuons1, ptMuons2 = 0., 0.
        MuonWeight_central_1, MuonWeight_central_2 = 1., 1.
        MuonWeight_up_1, MuonWeight_up_2 = 1., 1.
        MuonWeight_down_1, MuonWeight_down_2 = 1., 1.       

        ################################################################################ 
        n_gen_matched_muons_1, n_gen_matched_muons_2 = 0, 0
        gen_matched_muon_pt_1, gen_matched_muon_pt_2 = 0., 0.
        smallest_muon_dR_gen_reco_1, smallest_muon_dR_gen_reco_2 = 100., 100.
        ################################################################################ 

        if event.Jet_muonIdx1[jetIds[0]] >=0 and event.Muon_looseId[event.Jet_muonIdx1[jetIds[0]]] and event.Muon_nStations[event.Jet_muonIdx1[jetIds[0]]] >=3:
            nLooseMuons1 += 1 
            ptMuons1 += event.Muon_pt[event.Jet_muonIdx1[jetIds[0]]]
            MuonWeight_central_1 = 1. + (event.Muon_pt[event.Jet_muonIdx1[jetIds[0]]] / 13000.)*(-7)
            MuonWeight_up_1 = 1. + (event.Muon_pt[event.Jet_muonIdx1[jetIds[0]]] / 13000.)*(-7 + 28)
            MuonWeight_down_1 = 1. + (event.Muon_pt[event.Jet_muonIdx1[jetIds[0]]] / 13000.)*(-7 - 28)
            ################################################################################ 
            if self.isMC:
                for igen in range(event.nGenPart):
                    if abs(event.GenPart_pdgId[igen]) == 13:
                        dR_gen_reco = ( (event.GenPart_eta[igen] - event.Muon_eta[event.Jet_muonIdx1[jetIds[0]]])**2 + (event.GenPart_phi[igen] - event.Muon_phi[event.Jet_muonIdx1[jetIds[0]]])**2 )**0.5
                        if dR_gen_reco < smallest_muon_dR_gen_reco_1:
                            smallest_muon_dR_gen_reco_1 = dR_gen_reco
                        if dR_gen_reco < 0.05:
                            n_gen_matched_muons_1 += 1
                            gen_matched_muon_pt_1 += event.Muon_pt[event.Jet_muonIdx1[jetIds[0]]]
            ################################################################################            

        if event.Jet_muonIdx2[jetIds[0]] >=0 and event.Muon_looseId[event.Jet_muonIdx2[jetIds[0]]] and event.Muon_nStations[event.Jet_muonIdx2[jetIds[0]]] >=3:
            nLooseMuons1 += 1  
            ptMuons1 += event.Muon_pt[event.Jet_muonIdx2[jetIds[0]]]
            ################################################################################ 
            if self.isMC:
                for igen in range(event.nGenPart):
                    if abs(event.GenPart_pdgId[igen]) == 13:
                        dR_gen_reco = ( (event.GenPart_eta[igen] - event.Muon_eta[event.Jet_muonIdx2[jetIds[0]]])**2 + (event.GenPart_phi[igen] - event.Muon_phi[event.Jet_muonIdx2[jetIds[0]]])**2 )**0.5
                        if dR_gen_reco < smallest_muon_dR_gen_reco_1:
                            smallest_muon_dR_gen_reco_1 = dR_gen_reco
                        if dR_gen_reco < 0.05:
                            n_gen_matched_muons_1 += 1
                            gen_matched_muon_pt_1 += event.Muon_pt[event.Jet_muonIdx2[jetIds[0]]]
            ################################################################################            

        if event.Jet_muonIdx1[jetIds[1]] >=0 and event.Muon_looseId[event.Jet_muonIdx1[jetIds[1]]] and event.Muon_nStations[event.Jet_muonIdx1[jetIds[1]]] >=3: 
            nLooseMuons2 += 1  
            ptMuons2 += event.Muon_pt[event.Jet_muonIdx1[jetIds[1]]]
            MuonWeight_central_2 = 1. + (event.Muon_pt[event.Jet_muonIdx1[jetIds[1]]] / 13000.)*(-7)
            MuonWeight_up_2 = 1. + (event.Muon_pt[event.Jet_muonIdx1[jetIds[1]]] / 13000.)*(-7 + 28)
            MuonWeight_down_2 = 1. + (event.Muon_pt[event.Jet_muonIdx1[jetIds[1]]] / 13000.)*(-7 - 28)
            ################################################################################ 
            if self.isMC:
                for igen in range(event.nGenPart):
                    if abs(event.GenPart_pdgId[igen]) == 13:
                        dR_gen_reco = ( (event.GenPart_eta[igen] - event.Muon_eta[event.Jet_muonIdx1[jetIds[1]]])**2 + (event.GenPart_phi[igen] - event.Muon_phi[event.Jet_muonIdx1[jetIds[1]]])**2 )**0.5
                        if dR_gen_reco < smallest_muon_dR_gen_reco_2:
                            smallest_muon_dR_gen_reco_2 = dR_gen_reco
                        if dR_gen_reco < 0.05:
                            n_gen_matched_muons_2 += 1
                            gen_matched_muon_pt_2 += event.Muon_pt[event.Jet_muonIdx1[jetIds[1]]]
            ################################################################################            

        if event.Jet_muonIdx2[jetIds[1]] >=0 and event.Muon_looseId[event.Jet_muonIdx2[jetIds[1]]] and event.Muon_nStations[event.Jet_muonIdx2[jetIds[1]]] >=3: 
            nLooseMuons2 += 1  
            ptMuons2 += event.Muon_pt[event.Jet_muonIdx2[jetIds[1]]]
            ################################################################################ 
            if self.isMC:
                for igen in range(event.nGenPart):
                    if abs(event.GenPart_pdgId[igen]) == 13:
                        dR_gen_reco = ( (event.GenPart_eta[igen] - event.Muon_eta[event.Jet_muonIdx2[jetIds[1]]])**2 + (event.GenPart_phi[igen] - event.Muon_phi[event.Jet_muonIdx2[jetIds[1]]])**2 )**0.5
                        if dR_gen_reco < smallest_muon_dR_gen_reco_2:
                            smallest_muon_dR_gen_reco_2 = dR_gen_reco
                        if dR_gen_reco < 0.05:
                            n_gen_matched_muons_2 += 1
                            gen_matched_muon_pt_2 += event.Muon_pt[event.Jet_muonIdx2[jetIds[1]]]
            ################################################################################            

        nMediumMuons1, nMediumMuons2 = 0, 0
        if event.Jet_muonIdx1[jetIds[0]] >=0 and event.Muon_mediumId[event.Jet_muonIdx1[jetIds[0]]] and event.Muon_nStations[event.Jet_muonIdx1[jetIds[0]]] >=3:
            nMediumMuons1 += 1 
        if event.Jet_muonIdx2[jetIds[0]] >=0 and event.Muon_mediumId[event.Jet_muonIdx2[jetIds[0]]] and event.Muon_nStations[event.Jet_muonIdx2[jetIds[0]]] >=3:
            nMediumMuons1 += 1  
        if event.Jet_muonIdx1[jetIds[1]] >=0 and event.Muon_mediumId[event.Jet_muonIdx1[jetIds[1]]] and event.Muon_nStations[event.Jet_muonIdx1[jetIds[1]]] >=3: 
            nMediumMuons2 += 1  
        if event.Jet_muonIdx2[jetIds[1]] >=0 and event.Muon_mediumId[event.Jet_muonIdx2[jetIds[1]]] and event.Muon_nStations[event.Jet_muonIdx2[jetIds[1]]] >=3: 
            nMediumMuons2 += 1  
        
        ptRel1, ptRel2 = 0., 0.
        if event.Jet_muonIdx1[jetIds[0]] >=0: ptRel1 = event.Muon_jetPtRelv2[event.Jet_muonIdx1[jetIds[0]]]
        if event.Jet_muonIdx1[jetIds[1]] >=0: ptRel2 = event.Muon_jetPtRelv2[event.Jet_muonIdx1[jetIds[1]]]

        ## Fill jet branches
        self.out.njets[0]       = len(jetIds)
      
        self.out.jpt_1[0]       = event.Jet_pt[jetIds[0]]
        self.out.jeta_1[0]      = event.Jet_eta[jetIds[0]]
        self.out.jphi_1[0]      = event.Jet_phi[jetIds[0]]
        self.out.jmass_1[0]     = event.Jet_mass[jetIds[0]]
        self.out.jCSV_1[0]      = event.Jet_btagCSVV2[jetIds[0]]
        self.out.jdeepCSV_1[0]  = event.Jet_btagDeepB[jetIds[0]]
        self.out.jdeepFlavour_1[0]  = event.Jet_btagDeepFlavB[jetIds[0]]
        self.out.jnconst_1[0] = event.Jet_nConstituents[jetIds[0]]
        self.out.jchf_1[0] = event.Jet_chHEF[jetIds[0]]
        self.out.jnhf_1[0] = event.Jet_neHEF[jetIds[0]]
        self.out.jcef_1[0] = event.Jet_chEmEF[jetIds[0]]
        self.out.jnef_1[0] = event.Jet_neEmEF[jetIds[0]]
        self.out.jmuf_1[0] = event.Jet_muEF[jetIds[0]]
        self.out.jmuonpt_1[0] = ptMuons1
        self.out.jptRel_1[0] = ptRel1
        self.out.jnelectrons_1[0] = event.Jet_nElectrons[jetIds[0]]
        self.out.jnmuons_1[0] = event.Jet_nMuons[jetIds[0]]
        self.out.jnmuons_loose_1[0] = nLooseMuons1
        self.out.jnmuons_medium_1[0] = nMediumMuons1
        if self.isMC:
            self.out.jnmuons_gen_1[0] = nGenMuons_1 
            self.out.jnmuons_gen_pt_1[0] = genMuon_pt_1 
            self.out.jnmuons_loose_genmatched_1[0] = n_gen_matched_muons_1
            self.out.jmuonpt_genmatched_1[0] = gen_matched_muon_pt_1
            self.out.jflavour_1[0] = event.Jet_hadronFlavour[jetIds[0]]
        else:
            self.out.jflavour_1[0] = -1
        self.out.jmask_1[0] = event.Jet_cleanmask[jetIds[0]]
        self.out.jid_1[0] = event.Jet_jetId[jetIds[0]]        

        self.out.jpt_2[0]       = event.Jet_pt[jetIds[1]]
        self.out.jeta_2[0]      = event.Jet_eta[jetIds[1]]
        self.out.jphi_2[0]      = event.Jet_phi[jetIds[1]]
        self.out.jmass_2[0]     = event.Jet_mass[jetIds[1]]
        self.out.jCSV_2[0]      = event.Jet_btagCSVV2[jetIds[1]]
        self.out.jdeepCSV_2[0]  = event.Jet_btagDeepB[jetIds[1]]
        self.out.jdeepFlavour_2[0]  = event.Jet_btagDeepFlavB[jetIds[1]]
        self.out.jnconst_2[0] = event.Jet_nConstituents[jetIds[1]]
        self.out.jchf_2[0] = event.Jet_chHEF[jetIds[1]]
        self.out.jnhf_2[0] = event.Jet_neHEF[jetIds[1]]
        self.out.jcef_2[0] = event.Jet_chEmEF[jetIds[1]]
        self.out.jnef_2[0] = event.Jet_neEmEF[jetIds[1]]
        self.out.jmuf_2[0] = event.Jet_muEF[jetIds[1]]
        self.out.jmuonpt_2[0] = ptMuons2
        self.out.jptRel_2[0] = ptRel2
        self.out.jnelectrons_2[0] = event.Jet_nElectrons[jetIds[1]]
        self.out.jnmuons_2[0] = event.Jet_nMuons[jetIds[1]]
        self.out.jnmuons_loose_2[0] = nLooseMuons2
        self.out.jnmuons_medium_2[0] = nMediumMuons2 
        if self.isMC:
            self.out.jnmuons_gen_2[0] = nGenMuons_2
            self.out.jnmuons_gen_pt_2[0] = genMuon_pt_2
            self.out.jnmuons_loose_genmatched_2[0] = n_gen_matched_muons_2
            self.out.jmuonpt_genmatched_2[0] = gen_matched_muon_pt_2
            self.out.jflavour_2[0] = event.Jet_hadronFlavour[jetIds[1]]
            self.out.jmuon_gen_reco_dR_1[0] = smallest_muon_dR_gen_reco_1
            self.out.jmuon_gen_reco_dR_2[0] = smallest_muon_dR_gen_reco_2
        else:
            self.out.jflavour_2[0] = -1
        self.out.jmask_2[0] = event.Jet_cleanmask[jetIds[1]]
        self.out.jid_2[0] = event.Jet_jetId[jetIds[1]]        

        self.out.jsorted[0]       = 0
        if leading1==0 and leading2==1: self.out.jsorted[0] = 1

        #self.out.MET_over_SumEt[0] = event.MET_pt/jetHT
        if event.nFatJet >= 1 and event.FatJet_pt[0] > 200.:
            self.out.fatjetmass_1[0] = event.FatJet_msoftdrop[0]
            self.out.fatjettau21_1[0] = (event.FatJet_tau2[0]/event.FatJet_tau1[0]) if event.FatJet_tau1[0] > 0. else -1.
            self.out.fatjettau21ddt_1[0] = self.out.fatjettau21_1[0] + 0.082*ROOT.TMath.Log(event.FatJet_msoftdrop[0]**2/event.FatJet_pt[0])
            self.out.fatjetHbbvsQCD_1[0] = event.FatJet_deepTagMD_HbbvsQCD[0]
            self.out.fatjetWvsQCD_1[0] = event.FatJet_deepTagMD_WvsQCD[0]
            self.out.fatjetZHbbvsQCD_1[0] = event.FatJet_deepTagMD_ZHbbvsQCD[0]
            self.out.fatjetZbbvsQCD_1[0] = event.FatJet_deepTagMD_ZbbvsQCD[0]
            self.out.fatjetZvsQCD_1[0] = event.FatJet_deepTagMD_ZvsQCD[0]
            self.out.fatjetbbvsLight_1[0] = event.FatJet_deepTagMD_bbvsLight[0]
        if event.nFatJet >= 2 and event.FatJet_pt[1] > 200.:
            self.out.fatjetmass_2[0] = event.FatJet_msoftdrop[1]
            self.out.fatjettau21_2[0] = (event.FatJet_tau2[1]/event.FatJet_tau1[1]) if event.FatJet_tau1[1] > 0. else -1.
            self.out.fatjettau21ddt_2[0] = self.out.fatjettau21_2[0] + 0.082*ROOT.TMath.Log(event.FatJet_msoftdrop[1]**2/event.FatJet_pt[1])
            self.out.fatjetHbbvsQCD_2[0] = event.FatJet_deepTagMD_HbbvsQCD[1]
            self.out.fatjetWvsQCD_2[0] = event.FatJet_deepTagMD_WvsQCD[1]
            self.out.fatjetZHbbvsQCD_2[0] = event.FatJet_deepTagMD_ZHbbvsQCD[1]
            self.out.fatjetZbbvsQCD_2[0] = event.FatJet_deepTagMD_ZbbvsQCD[1]
            self.out.fatjetZvsQCD_2[0] = event.FatJet_deepTagMD_ZvsQCD[1]
            self.out.fatjetbbvsLight_2[0] = event.FatJet_deepTagMD_bbvsLight[1]
        self.out.ptBalance[0] = (event.Jet_pt[jetIds[0]] - event.Jet_pt[jetIds[1]])/(event.Jet_pt[jetIds[0]] + event.Jet_pt[jetIds[1]])
        self.out.HT[0] = jetHT
        self.out.MET[0] = event.MET_pt
        self.out.nelectrons[0] = nIsoElectrons
        self.out.nmuons[0] = nIsoMuons
        self.out.nbtagLoose[0]         = jetBTagLoose
        self.out.nbtagMedium[0]        = jetBTagMedium
        self.out.nbtagTight[0]         = jetBTagTight

        ## writing the b-tag category directly into the n-tuple. 0:untagged, 1:loose, 2:medium, 3:tight
        self.out.jbtag_WP_1[0]         = 0
        if event.Jet_btagDeepFlavB[jetIds[0]] > self.btagTight:
            self.out.jbtag_WP_1[0]     = 3
        elif event.Jet_btagDeepFlavB[jetIds[0]] > self.btagMedium:
            self.out.jbtag_WP_1[0]     = 2
        elif event.Jet_btagDeepFlavB[jetIds[0]] > self.btagLoose:
            self.out.jbtag_WP_1[0]     = 1
        self.out.jbtag_WP_2[0]         = 0
        if event.Jet_btagDeepFlavB[jetIds[1]] > self.btagTight:
            self.out.jbtag_WP_2[0]     = 3
        elif event.Jet_btagDeepFlavB[jetIds[1]] > self.btagMedium:
            self.out.jbtag_WP_2[0]     = 2
        elif event.Jet_btagDeepFlavB[jetIds[1]] > self.btagLoose:
            self.out.jbtag_WP_2[0]     = 1
        
        ## fill trigger branches (different years have different triggers 500<->550, 900<->1050)
        try:
                self.out.HLT_AK8PFJet500[0]             = event.HLT_AK8PFJet500         
        except: 
                self.out.HLT_AK8PFJet500[0]             = -1
        try:
                self.out.HLT_PFJet500[0]                = event.HLT_PFJet500                            
        except:
                self.out.HLT_PFJet500[0]                = -1                            
        try:
                self.out.HLT_CaloJet500_NoJetID[0]      = event.HLT_CaloJet500_NoJetID          
        except:
                self.out.HLT_CaloJet500_NoJetID[0]      = -1    
        try:
                self.out.HLT_PFHT900[0]         = event.HLT_PFHT900             
        except:
                self.out.HLT_PFHT900[0]         = -1                            
        try:
                self.out.HLT_AK8PFJet550[0]             = event.HLT_AK8PFJet550         
        except: 
                self.out.HLT_AK8PFJet550[0]             = -1
        try:
                self.out.HLT_PFJet550[0]                = event.HLT_PFJet550                            
        except:
                self.out.HLT_PFJet550[0]                = -1                            
        try:
                self.out.HLT_CaloJet550_NoJetID[0]      = event.HLT_CaloJet550_NoJetID          
        except:
                self.out.HLT_CaloJet550_NoJetID[0]      = -1    
        try:
                self.out.HLT_PFHT1050[0]                = event.HLT_PFHT1050            
        except:
                self.out.HLT_PFHT1050[0]                = -1                    

        try:
                self.out.HLT_DoublePFJets128MaxDeta1p6_DoubleCaloBTagDeepCSV_p71[0]                = event.HLT_DoublePFJets128MaxDeta1p6_DoubleCaloBTagDeepCSV_p71            
        except:
                self.out.HLT_DoublePFJets128MaxDeta1p6_DoubleCaloBTagDeepCSV_p71[0]                = -1                    
        try:
                self.out.HLT_DoublePFJets116MaxDeta1p6_DoubleCaloBTagDeepCSV_p71[0]                = event.HLT_DoublePFJets116MaxDeta1p6_DoubleCaloBTagDeepCSV_p71            
        except:
                self.out.HLT_DoublePFJets116MaxDeta1p6_DoubleCaloBTagDeepCSV_p71[0]                = -1                    
        
        try:
                self.out.HLT_DoublePFJets40_CaloBTagDeepCSV_p71[0]                = event.HLT_DoublePFJets40_CaloBTagDeepCSV_p71            
        except:
                self.out.HLT_DoublePFJets40_CaloBTagDeepCSV_p71[0]                = -1                    
        try:
                self.out.HLT_DoublePFJets100_CaloBTagDeepCSV_p71[0]                = event.HLT_DoublePFJets100_CaloBTagDeepCSV_p71            
        except:
                self.out.HLT_DoublePFJets100_CaloBTagDeepCSV_p71[0]                = -1                    
        try:
                self.out.HLT_DoublePFJets200_CaloBTagDeepCSV_p71[0]                = event.HLT_DoublePFJets200_CaloBTagDeepCSV_p71            
        except:
                self.out.HLT_DoublePFJets200_CaloBTagDeepCSV_p71[0]                = -1                    
        try:
                self.out.HLT_DoublePFJets350_CaloBTagDeepCSV_p71[0]                = event.HLT_DoublePFJets350_CaloBTagDeepCSV_p71            
        except:
                self.out.HLT_DoublePFJets350_CaloBTagDeepCSV_p71[0]                = -1                    
        

        ## add weights
        try:
                self.out.btagWeight_DeepCSVB[0]         = event.btagWeight_DeepCSVB
        except:
                self.out.btagWeight_DeepCSVB[0]         = -100.                         
        try:
                self.out.LHEWeight_originalXWGTUP[0]    = event.LHEWeight_originalXWGTUP
        except:
                self.out.LHEWeight_originalXWGTUP[0]    = -100.         
        try:
                self.out.LHEReweightingWeight[0]        = event.LHEReweightingWeight
        except:
                self.out.LHEReweightingWeight[0]        = -100.      
        try:
                self.out.LHEScaleWeight[0]              = event.LHEScaleWeight
        except:
                self.out.LHEScaleWeight[0]              = -100.      
        try:
                self.out.PSWeight[0]                    = event.PSWeight
        except:
                self.out.PSWeight[0]                    = -100.      
        #try:
        #       self.out.genWeight[0]                   = event.genWeight
        #except:
        #       self.out.genWeight[0]                   = -100.         
        if self.isMC:
                self.out.GenWeight[0]                   = GenWeight
                self.out.PUWeight[0]                    = PUWeight
        else:
                self.out.GenWeight[0]                   = 1.
                self.out.PUWeight[0]                    = 1.
       
        
        if 'signal' in self.name.lower():
            self.out.BTagAK4Weight_deepJet[0]           =  BTagAK4Weight_deepJet        
            self.out.BTagAK4Weight_deepJet_up[0]        =  BTagAK4Weight_deepJet_up  
            self.out.BTagAK4Weight_deepJet_down[0]      =  BTagAK4Weight_deepJet_down
            self.out.MuonWeight[0]           = MuonWeight_central_1 * MuonWeight_central_2
            self.out.MuonWeight_up[0]        = MuonWeight_up_1 * MuonWeight_up_2
            self.out.MuonWeight_down[0]      = MuonWeight_down_1 * MuonWeight_down_2

        ## event weight lumi
        #eventweightlumi = 1.

        #if self.isMC:
        #       eventweightlumi = self.Leq  #minimalist approach, store the things to be multiplied later separately into nTuple
        #       #eventweightlumi = self.Leq * event.LHEWeight_originalXWGTUP
        #       #eventweightlumi = self.Leq * event.lheweight * event.btagweight #event.puweight
        #self.out.eventweightlumi[0] = eventweightlumi
        self.out.isMC[0] = int(self.isMC)

        self.out.tree.Fill()
        return True
Пример #18
0
def plotDelphesOut(inputFiles, outputFile, weighted=True, applyCuts=False):
    print("plotDelphesOut")
    # inputs
    files = getFileList(inputFiles)

    chain = TChain("Delphes")
    for infile in files:
        chain.Add(infile)
        print("Add {} to TChain".format(infile))
    nevents = chain.GetEntries()
    print("Total number of events:", nevents)

    # output
    foutput = TFile(outputFile, "RECREATE")

    # book histograms
    histsToPlot = HistogramsTTbar()

    # loop over events
    ievent = 0
    for ievt, event in enumerate(chain):
        if not ievt % 10000:
            print("processing event", ievt)

        if applyCuts and not passEventSelection(event):
            continue

        weight = event.Event[0].Weight if weighted else 1.

        # jets
        njets = event.Jet.GetEntries()
        histsToPlot.histNJets.Fill(njets)

        for i, jet in enumerate(event.Jet):
            histsToPlot.histJetPT.Fill(jet.PT, weight)
            if i == 0:
                histsToPlot.histJet0PT.Fill(jet.PT, weight)
            if i == 1:
                histsToPlot.histJet1PT.Fill(jet.PT, weight)

        # MET
        if event.MissingET.GetEntries() > 0:
            histsToPlot.histMET.Fill(event.MissingET[0].MET, weight)

        # lepton if l+jets channel selected
        if event.Electron.GetEntries() > 0:
            histsToPlot.histElePT.Fill(event.Electron[0].PT, weight)
        if event.Muon.GetEntries() > 0:
            histsToPlot.histMuPT.Fill(event.Muon[0].PT, weight)

        # partons
        # top
        t_afterFSR = getTopAfterFSR(event.Particle)
        t_p4 = TLorentzVector()
        t_p4.SetPxPyPzE(t_afterFSR.Px, t_afterFSR.Py, t_afterFSR.Pz,
                        t_afterFSR.E)
        histsToPlot.histTopPT.Fill(t_p4.Pt(), weight)
        histsToPlot.histTopY.Fill(t_p4.Rapidity(), weight)

        # antitop
        tbar_afterFSR = getAntiTopAfterFSR(event.Particle)
        tbar_p4 = TLorentzVector()
        tbar_p4.SetPxPyPzE(tbar_afterFSR.Px, tbar_afterFSR.Py,
                           tbar_afterFSR.Pz, tbar_afterFSR.E)
        histsToPlot.histTbarPT.Fill(tbar_p4.Pt(), weight)
        histsToPlot.histTbarY.Fill(tbar_p4.Rapidity(), weight)

        # ttbar
        ttbar_p4 = t_p4 + tbar_p4
        histsToPlot.histTTbarM.Fill(ttbar_p4.M(), weight)
        histsToPlot.histTTbarPT.Fill(ttbar_p4.Pt(), weight)
        histsToPlot.histTTbarDPHI.Fill(abs(t_p4.DeltaPhi(tbar_p4)), weight)

        # decay mode
        isTHadronic = isHadronicTop(t_afterFSR, event.Particle)
        isTbarHadronic = isHadronicTop(tbar_afterFSR, event.Particle)
        histsToPlot.histTTbarMode.Fill(isTHadronic, isTbarHadronic, weight)

    foutput.cd()
    foutput.Write()
    foutput.Close()