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}
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
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
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
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))
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()
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
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]
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
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() *
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
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
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
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()
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
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()