class EleTauProducer(Module): def __init__(self, name, dataType, **kwargs): self.name = name self.out = TreeProducerEleTau(name) self.isData = dataType == 'data' self.year = kwargs.get('year', 2017) self.tes = kwargs.get('tes', 1.0) self.ltf = kwargs.get('ltf', 1.0) self.jtf = kwargs.get('jtf', 1.0) self.doZpt = kwargs.get('doZpt', 'DY' in name) self.doRecoil = kwargs.get( 'doRecoil', ('DY' in name or re.search(r"W\d?Jets", name)) and self.year > 2016) self.doTTpt = kwargs.get('doTTpt', 'TT' in name) self.doTight = kwargs.get('doTight', self.tes != 1 or self.ltf != 1) self.channel = 'eletau' year, channel = self.year, self.channel self.vlooseIso = getVLooseTauIso(year) if year == 2016: self.trigger = lambda e: e.HLT_Ele25_eta2p1_WPTight_Gsf or e.HLT_Ele27_WPTight_Gsf #or e.HLT_Ele45_WPLoose_Gsf_L1JetTauSeeded #or e.HLT_Ele24_eta2p1_WPLoose_Gsf_LooseIsoPFTau20_SingleL1 or e.HLT_Ele24_eta2p1_WPLoose_Gsf_LooseIsoPFTau20 or e.HLT_Ele24_eta2p1_WPLoose_Gsf_LooseIsoPFTau30 self.eleCutPt = 26 elif year == 2017: self.trigger = lambda e: e.HLT_Ele35_WPTight_Gsf or e.HLT_Ele32_WPTight_Gsf_L1DoubleEG or e.HLT_Ele32_WPTight_Gsf self.eleCutPt = 36 else: self.trigger = lambda e: e.HLT_Ele32_WPTight_Gsf or e.HLT_Ele35_WPTight_Gsf self.eleCutPt = 33 self.tauCutPt = 20 if not self.isData: self.eleSFs = ElectronSFs(year=year) self.puTool = PileupWeightTool(year=year) self.ltfSFs = LeptonTauFakeSFs('loose', 'tight', year=year) self.btagTool = BTagWeightTool('DeepCSV', 'medium', channel='mutau', year=year) if self.doZpt: self.zptTool = ZptCorrectionTool(year=year) if self.doRecoil: self.recoilTool = RecoilCorrectionTool(year=year) self.deepcsv_wp = BTagWPs('DeepCSV', year=year) self.Nocut = 0 self.Trigger = 1 self.GoodElectrons = 2 self.GoodTaus = 3 self.GoodDiLepton = 4 self.TotalWeighted = 15 self.TotalWeighted_no0PU = 16 self.out.cutflow.GetXaxis().SetBinLabel(1 + self.Nocut, "no cut") self.out.cutflow.GetXaxis().SetBinLabel(1 + self.Trigger, "trigger") self.out.cutflow.GetXaxis().SetBinLabel(1 + self.GoodElectrons, "electron object") self.out.cutflow.GetXaxis().SetBinLabel(1 + self.GoodTaus, "tau object") self.out.cutflow.GetXaxis().SetBinLabel(1 + self.GoodDiLepton, "eletau pair") self.out.cutflow.GetXaxis().SetBinLabel(1 + self.TotalWeighted, "no cut, weighted") self.out.cutflow.GetXaxis().SetBinLabel(1 + self.TotalWeighted_no0PU, "no cut, weighted, PU>0") self.out.cutflow.GetXaxis().SetLabelSize(0.041) def beginJob(self): pass def endJob(self): if not self.isData: self.btagTool.setDirectory(self.out.outputfile, 'btag') self.out.endJob() def beginFile(self, inputFile, outputFile, inputTree, wrappedOutputTree): sys.stdout.flush() checkBranches(inputTree) def endFile(self, inputFile, outputFile, inputTree, wrappedOutputTree): pass def analyze(self, event): """process event, return True (go to next module) or False (fail, go to next event)""" sys.stdout.flush() ##################################### self.out.cutflow.Fill(self.Nocut) if self.isData: self.out.cutflow.Fill(self.TotalWeighted, 1.) if event.PV_npvs > 0: self.out.cutflow.Fill(self.TotalWeighted_no0PU, 1.) else: return False else: self.out.cutflow.Fill(self.TotalWeighted, event.genWeight) if event.Pileup_nTrueInt > 0: self.out.cutflow.Fill(self.TotalWeighted_no0PU, event.genWeight) else: return False ##################################### if not self.trigger(event): return False ##################################### self.out.cutflow.Fill(self.Trigger) ##################################### idx_goodelectrons = [] for ielectron in range(event.nElectron): if event.Electron_pt[ielectron] < self.eleCutPt: continue if abs(event.Electron_eta[ielectron]) > 2.1: continue if abs(event.Electron_dz[ielectron]) > 0.2: continue if abs(event.Electron_dxy[ielectron]) > 0.045: continue if event.Electron_convVeto[ielectron] != 1: continue if ord(event.Electron_lostHits[ielectron]) > 1: continue if event.Electron_mvaFall17V2Iso_WP80[ielectron] < 0.5: continue idx_goodelectrons.append(ielectron) if len(idx_goodelectrons) == 0: return False ##################################### self.out.cutflow.Fill(self.GoodElectrons) ##################################### Tau_genmatch = {} # bug in Tau_genPartFlav idx_goodtaus = [] for itau in range(event.nTau): if not self.vlooseIso(event, itau): continue if abs(event.Tau_eta[itau]) > 2.3: continue if abs(event.Tau_dz[itau]) > 0.2: continue if event.Tau_decayMode[itau] not in [0, 1, 10]: continue if abs(event.Tau_charge[itau]) != 1: continue if not self.isData: Tau_genmatch[itau] = genmatch(event, itau) #if self.tes!=1.0 and Tau_genmatch[itau]==5: # event.Tau_pt[itau] *= self.tes # event.Tau_mass[itau] *= self.tes #elif self.ltf!=1.0 and 0<Tau_genmatch[itau]<5: # event.Tau_pt[itau] *= self.ltf # event.Tau_mass[itau] *= self.ltf #elif self.jtf!=1.0 and Tau_genmatch[itau]==0: # event.Tau_pt[itau] *= self.jtf # event.Tau_mass[itau] *= self.jtf if event.Tau_pt[itau] < self.tauCutPt: continue ###if ord(event.Tau_idAntiEle[itau])<1: continue ###if ord(event.Tau_idAntiMu[itau])<1: continue idx_goodtaus.append(itau) if len(idx_goodtaus) == 0: return False ##################################### self.out.cutflow.Fill(self.GoodTaus) ##################################### electrons = Collection(event, 'Electron') taus = Collection(event, 'Tau') ltaus = [] for idx1 in idx_goodelectrons: for idx2 in idx_goodtaus: dR = taus[idx2].p4().DeltaR(electrons[idx1].p4()) if dR < 0.5: continue ltau = LeptonTauPair(idx1, event.Electron_pt[idx1], event.Electron_pfRelIso03_all[idx1], idx2, event.Tau_pt[idx2], event.Tau_rawMVAoldDM2017v2[idx2]) ltaus.append(ltau) if len(ltaus) == 0: return False ltau = bestDiLepton(ltaus) electron = electrons[ltau.id1].p4() tau = taus[ltau.id2].p4() #print 'chosen tau1 (idx, pt) = ', ltau.id1, ltau.tau1_pt, 'check', electron.p4().Pt() #print 'chosen tau2 (idx, pt) = ', ltau.id2, ltau.tau2_pt, 'check', tau.p4().Pt() ##################################### self.out.cutflow.Fill(self.GoodDiLepton) ##################################### # VETOS self.out.extramuon_veto[0], self.out.extraelec_veto[ 0], self.out.dilepton_veto[0] = extraLeptonVetos( event, [-1], [ltau.id1], self.channel) self.out.lepton_vetos[0] = self.out.extramuon_veto[ 0] or self.out.extraelec_veto[0] or self.out.dilepton_veto[0] ###if self.doTight and (self.out.lepton_vetos[0] or event.Electron_pfRelIso03_all[ltau.id1]>0.10 or\ ### ord(event.Tau_idAntiMu[ltau.id2]<1 or ord(event.Tau_idAntiEle[ltau.id2]<8): ### return False # JETS jetIds = [] bjetIds = [] jets = Collection(event, 'Jet') nfjets = 0 ncjets = 0 nbtag = 0 for ijet in range(event.nJet): if event.Jet_pt[ijet] < 30: continue if abs(event.Jet_eta[ijet]) > 4.7: continue if electron.DeltaR(jets[ijet].p4()) < 0.5: continue if tau.DeltaR(jets[ijet].p4()) < 0.5: continue jetIds.append(ijet) if abs(event.Jet_eta[ijet]) > 2.4: nfjets += 1 else: ncjets += 1 if event.Jet_btagDeepB[ijet] > self.deepcsv_wp.medium: nbtag += 1 bjetIds.append(ijet) if not self.isData and self.vlooseIso( event, ltau.id2) and event.Electron_pfRelIso03_all[ltau.id1] < 0.50: self.btagTool.fillEfficiencies(event, jetIds) # EVENT self.out.isData[0] = self.isData self.out.run[0] = event.run self.out.lumi[0] = event.luminosityBlock self.out.event[0] = event.event & 0xffffffffffffffff ###self.out.puppimet[0] = event.PuppiMET_pt ###self.out.puppimetphi[0] = event.PuppiMET_phi ###self.out.metsignificance[0] = event.MET_significance ###self.out.metcovXX[0] = event.MET_covXX ###self.out.metcovXY[0] = event.MET_covXY ###self.out.metcovYY[0] = event.MET_covYY self.out.npvs[0] = event.PV_npvs self.out.npvsGood[0] = event.PV_npvsGood if not self.isData: self.out.genmet[0] = event.GenMET_pt self.out.genmetphi[0] = event.GenMET_phi self.out.nPU[0] = event.Pileup_nPU self.out.nTrueInt[0] = event.Pileup_nTrueInt try: self.out.LHE_Njets[0] = event.LHE_Njets except RuntimeError: self.out.LHE_Njets[0] = -1 # ELECTRON self.out.pt_1[0] = event.Electron_pt[ltau.id1] self.out.eta_1[0] = event.Electron_eta[ltau.id1] self.out.phi_1[0] = event.Electron_phi[ltau.id1] self.out.m_1[0] = event.Electron_mass[ltau.id1] self.out.dxy_1[0] = event.Electron_dxy[ltau.id1] self.out.dz_1[0] = event.Electron_dz[ltau.id1] self.out.q_1[0] = event.Electron_charge[ltau.id1] self.out.pfRelIso03_all_1[0] = event.Electron_pfRelIso03_all[ltau.id1] self.out.cutBased_1[0] = event.Electron_cutBased[ltau.id1] self.out.mvaFall17Iso_1[0] = event.Electron_mvaFall17V2Iso[ltau.id1] self.out.mvaFall17Iso_WPL_1[0] = event.Electron_mvaFall17V2Iso_WPL[ ltau.id1] self.out.mvaFall17Iso_WP80_1[0] = event.Electron_mvaFall17V2Iso_WP80[ ltau.id1] self.out.mvaFall17Iso_WP90_1[0] = event.Electron_mvaFall17V2Iso_WP90[ ltau.id1] # TAU self.out.pt_2[0] = event.Tau_pt[ltau.id2] self.out.eta_2[0] = event.Tau_eta[ltau.id2] self.out.phi_2[0] = event.Tau_phi[ltau.id2] self.out.m_2[0] = event.Tau_mass[ltau.id2] self.out.dxy_2[0] = event.Tau_dxy[ltau.id2] self.out.dz_2[0] = event.Tau_dz[ltau.id2] self.out.leadTkPtOverTauPt_2[0] = event.Tau_leadTkPtOverTauPt[ltau.id2] self.out.chargedIso_2[0] = event.Tau_chargedIso[ltau.id2] self.out.neutralIso_2[0] = event.Tau_neutralIso[ltau.id2] self.out.photonsOutsideSignalCone_2[ 0] = event.Tau_photonsOutsideSignalCone[ltau.id2] self.out.puCorr_2[0] = event.Tau_puCorr[ltau.id2] self.out.rawAntiEle_2[0] = event.Tau_rawAntiEle[ltau.id2] self.out.rawIso_2[0] = event.Tau_rawIso[ltau.id2] self.out.q_2[0] = event.Tau_charge[ltau.id2] self.out.decayMode_2[0] = event.Tau_decayMode[ltau.id2] ###self.out.rawAntiEleCat_2[0] = event.Tau_rawAntiEleCat[ltau.id2] self.out.idAntiEle_2[0] = ord(event.Tau_idAntiEle[ltau.id2]) self.out.idAntiMu_2[0] = ord(event.Tau_idAntiMu[ltau.id2]) self.out.idDecayMode_2[0] = event.Tau_idDecayMode[ltau.id2] self.out.idDecayModeNewDMs_2[0] = event.Tau_idDecayModeNewDMs[ltau.id2] self.out.rawMVAoldDM_2[0] = event.Tau_rawMVAoldDM[ltau.id2] self.out.rawMVAnewDM2017v2_2[0] = event.Tau_rawMVAnewDM2017v2[ltau.id2] self.out.rawMVAoldDM2017v1_2[0] = event.Tau_rawMVAoldDM2017v1[ltau.id2] self.out.rawMVAoldDM2017v2_2[0] = event.Tau_rawMVAoldDM2017v2[ltau.id2] self.out.idMVAoldDM_2[0] = ord(event.Tau_idMVAoldDM[ltau.id2]) self.out.idMVAoldDM2017v1_2[0] = ord( event.Tau_idMVAoldDM2017v1[ltau.id2]) self.out.idMVAoldDM2017v2_2[0] = ord( event.Tau_idMVAoldDM2017v2[ltau.id2]) self.out.idMVAnewDM2017v2_2[0] = ord( event.Tau_idMVAnewDM2017v2[ltau.id2]) # GENERATOR if not self.isData: self.out.genPartFlav_1[0] = ord( event.Electron_genPartFlav[ltau.id1]) self.out.genPartFlav_2[0] = Tau_genmatch[ ltau.id2] # ord(event.Tau_genPartFlav[ltau.id2]) genvistau = Collection(event, 'GenVisTau') dRmax = 1000 gendm = -1 genpt = -1 geneta = -1 genphi = -1 for igvt in range(event.nGenVisTau): dR = genvistau[igvt].p4().DeltaR(tau) if dR < 0.5 and dR < dRmax: dRmax = dR gendm = event.GenVisTau_status[igvt] genpt = event.GenVisTau_pt[igvt] geneta = event.GenVisTau_eta[igvt] genphi = event.GenVisTau_phi[igvt] self.out.gendecayMode_2[0] = gendm self.out.genvistaupt_2[0] = genpt self.out.genvistaueta_2[0] = geneta self.out.genvistauphi_2[0] = genphi # WEIGHTS met = TLorentzVector() met.SetPxPyPzE(event.MET_pt * cos(event.MET_phi), event.MET_pt * sin(event.MET_phi), 0, event.MET_pt) if not self.isData: if self.doRecoil: boson, boson_vis = getBoson(event) self.recoilTool.CorrectPFMETByMeanResolution( met, boson, boson_vis, len(jetIds)) event.MET_pt = met.Pt() event.MET_phi = met.Phi() self.out.m_genboson[0] = boson.M() self.out.pt_genboson[0] = boson.Pt() if self.doZpt: self.out.zptweight[0] = self.zptTool.getZptWeight( boson.Pt(), boson.M()) elif self.doZpt: zboson = getZBoson(event) self.out.m_genboson[0] = zboson.M() self.out.pt_genboson[0] = zboson.Pt() self.out.zptweight[0] = self.zptTool.getZptWeight( zboson.Pt(), zboson.M()) elif self.doTTpt: toppt1, toppt2 = getTTPt(event) self.out.ttptweight[0] = getTTptWeight(toppt1, toppt2) self.out.genweight[0] = event.genWeight self.out.puweight[0] = self.puTool.getWeight(event.Pileup_nTrueInt) self.out.trigweight[0] = self.eleSFs.getTriggerSF( self.out.pt_1[0], self.out.eta_1[0]) self.out.idisoweight_1[0] = self.eleSFs.getIdIsoSF( self.out.pt_1[0], self.out.eta_1[0]) self.out.idisoweight_2[0] = self.ltfSFs.getSF( self.out.genPartFlav_2[0], self.out.eta_2[0]) self.out.btagweight[0] = self.btagTool.getWeight(event, jetIds) self.out.weight[0] = self.out.genweight[0] * self.out.puweight[ 0] * self.out.trigweight[0] * self.out.idisoweight_1[ 0] * self.out.idisoweight_2[0] # JETS self.out.njets[0] = len(jetIds) self.out.njets50[0] = len([j for j in jetIds if event.Jet_pt[j] > 50]) self.out.nfjets[0] = nfjets self.out.ncjets[0] = ncjets self.out.nbtag[0] = nbtag if len(jetIds) > 0: 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.jdeepb_1[0] = event.Jet_btagDeepB[jetIds[0]] else: self.out.jpt_1[0] = -9. self.out.jeta_1[0] = -9. self.out.jphi_1[0] = -9. self.out.jdeepb_1[0] = -9. if len(jetIds) > 1: 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.jdeepb_2[0] = event.Jet_btagDeepB[jetIds[1]] else: self.out.jpt_2[0] = -9. self.out.jeta_2[0] = -9. self.out.jphi_2[0] = -9. self.out.jdeepb_2[0] = -9. if len(bjetIds) > 0: self.out.bpt_1[0] = event.Jet_pt[bjetIds[0]] self.out.beta_1[0] = event.Jet_eta[bjetIds[0]] else: self.out.bpt_1[0] = -9. self.out.beta_1[0] = -9. if len(bjetIds) > 1: self.out.bpt_2[0] = event.Jet_pt[bjetIds[1]] self.out.beta_2[0] = event.Jet_eta[bjetIds[1]] else: self.out.bpt_2[0] = -9. self.out.beta_2[0] = -9. self.out.met[0] = event.MET_pt self.out.metphi[0] = event.MET_phi self.out.pfmt_1[0] = sqrt( 2 * self.out.pt_1[0] * self.out.met[0] * (1 - cos(deltaPhi(self.out.phi_1[0], self.out.metphi[0])))) self.out.pfmt_2[0] = sqrt( 2 * self.out.pt_2[0] * self.out.met[0] * (1 - cos(deltaPhi(self.out.phi_2[0], self.out.metphi[0])))) self.out.m_vis[0] = (electron + tau).M() self.out.pt_ll[0] = (electron + tau).Pt() self.out.dR_ll[0] = electron.DeltaR(tau) self.out.dphi_ll[0] = deltaPhi(self.out.phi_1[0], self.out.phi_2[0]) self.out.deta_ll[0] = abs(self.out.eta_1[0] - self.out.eta_2[0]) # PZETA leg1 = TVector3(electron.Px(), electron.Py(), 0.) leg2 = TVector3(tau.Px(), tau.Py(), 0.) zetaAxis = TVector3(leg1.Unit() + leg2.Unit()).Unit() pzeta_vis = leg1 * zetaAxis + leg2 * zetaAxis pzeta_miss = met.Vect() * zetaAxis self.out.pzetamiss[0] = pzeta_miss self.out.pzetavis[0] = pzeta_vis self.out.dzeta[0] = pzeta_miss - 0.85 * pzeta_vis self.out.tree.Fill() return True
class EleTauProducer(Module): def __init__(self, name, dataType, **kwargs): year = kwargs.get('year', 2017) tes = kwargs.get('tes', 1.0) channel = 'eletau' self.name = name self.year = year self.tes = tes self.out = TreeProducerEleTau(name) self.isData = dataType == 'data' self.doZpt = 'DY' in self.name setYear(year) self.vlooseIso = getVLooseTauIso(year) if year == 2016: self.trigger = lambda e: e.HLT_Ele25_eta2p1_WPTight_Gsf or e.HLT_Ele45_WPLoose_Gsf_L1JetTauSeeded #or e.HLT_Ele24_eta2p1_WPLoose_Gsf_LooseIsoPFTau20_SingleL1 or e.HLT_Ele24_eta2p1_WPLoose_Gsf_LooseIsoPFTau20 or e.HLT_Ele24_eta2p1_WPLoose_Gsf_LooseIsoPFTau30 self.electronCutPt = 26 else: # HLT_Ele32_WPTight_Gsf_L1DoubleEG # HLT_Ele32_WPTight_Gsf self.trigger = lambda e: e.HLT_Ele35_WPTight_Gsf or e.HLT_Ele32_WPTight_Gsf self.electronCutPt = 36 self.tauCutPt = 20 if not self.isData: self.eleSFs = ElectronSFs(year=year) self.puTool = PileupWeightTool(year=year) self.ltfSFs = LeptonTauFakeSFs('loose', 'tight', year=year) self.btagTool = BTagWeightTool('CSVv2', 'medium', channel=channel, year=year) self.btagTool_deep = BTagWeightTool('DeepCSV', 'medium', channel=channel, year=year) if self.doZpt: self.recoilTool = RecoilCorrectionTool(year=year) self.csvv2_wp = BTagWPs('CSVv2', year=year) self.deepcsv_wp = BTagWPs('DeepCSV', year=year) self.Nocut = 0 self.Trigger = 1 self.GoodElectrons = 2 self.GoodTaus = 3 self.GoodDiLepton = 4 self.TotalWeighted = 15 self.TotalWeighted_no0PU = 16 self.out.cutflow.GetXaxis().SetBinLabel(1 + self.Nocut, "no cut") self.out.cutflow.GetXaxis().SetBinLabel(1 + self.Trigger, "trigger") self.out.cutflow.GetXaxis().SetBinLabel(1 + self.GoodElectrons, "electron object") self.out.cutflow.GetXaxis().SetBinLabel(1 + self.GoodTaus, "tau object") self.out.cutflow.GetXaxis().SetBinLabel(1 + self.GoodDiLepton, "eletau pair") self.out.cutflow.GetXaxis().SetBinLabel(1 + self.TotalWeighted, "no cut, weighted") self.out.cutflow.GetXaxis().SetBinLabel(1 + self.TotalWeighted_no0PU, "no cut, weighted, PU>0") self.out.cutflow.GetXaxis().SetLabelSize(0.041) def beginJob(self): pass def endJob(self): if not self.isData: self.btagTool.setDirectory(self.out.outputfile, 'btag') self.btagTool_deep.setDirectory(self.out.outputfile, 'btag') self.out.outputfile.Write() self.out.outputfile.Close() def beginFile(self, inputFile, outputFile, inputTree, wrappedOutputTree): pass def endFile(self, inputFile, outputFile, inputTree, wrappedOutputTree): pass def analyze(self, event): """process event, return True (go to next module) or False (fail, go to next event)""" #electrons = Collection(event, "Electron") ##################################### self.out.cutflow.Fill(self.Nocut) if self.isData: self.out.cutflow.Fill(self.TotalWeighted, 1.) if event.PV_npvs > 0: self.out.cutflow.Fill(self.TotalWeighted_no0PU, 1.) else: return False else: self.out.cutflow.Fill(self.TotalWeighted, event.genWeight) if event.Pileup_nTrueInt > 0: self.out.cutflow.Fill(self.TotalWeighted_no0PU, event.genWeight) else: return False ##################################### if not self.trigger(event): return False ##################################### self.out.cutflow.Fill(self.Trigger) ##################################### idx_goodelectrons = [] for ielectron in range(event.nElectron): if event.Electron_pt[ielectron] < self.electronCutPt: continue if abs(event.Electron_eta[ielectron]) > 2.1: continue if abs(event.Electron_dz[ielectron]) > 0.2: continue if abs(event.Electron_dxy[ielectron]) > 0.045: continue if event.Electron_convVeto[ielectron] != 1: continue if ord(event.Electron_lostHits[ielectron]) > 1: continue if getvar(event, 'Electron_mvaFall17Iso_WP80')[ielectron] < 0.5: continue idx_goodelectrons.append(ielectron) if len(idx_goodelectrons) == 0: return False ##################################### self.out.cutflow.Fill(self.GoodElectrons) ##################################### idx_goodtaus = [] for itau in range(event.nTau): if event.Tau_pt[itau] < self.tauCutPt: continue if abs(event.Tau_eta[itau]) > 2.3: continue if abs(event.Tau_dz[itau]) > 0.2: continue if event.Tau_decayMode[itau] not in [0, 1, 10]: continue if abs(event.Tau_charge[itau]) != 1: continue #if ord(event.Tau_idAntiEle[itau])<1: continue #if ord(event.Tau_idAntiMu[itau])<1: continue if not self.vlooseIso(event, itau): continue idx_goodtaus.append(itau) if len(idx_goodtaus) == 0: return False ##################################### self.out.cutflow.Fill(self.GoodTaus) ##################################### electrons = Collection(event, 'Electron') taus = Collection(event, 'Tau') ltaus = [] for idx1 in idx_goodelectrons: for idx2 in idx_goodtaus: dR = taus[idx2].p4().DeltaR(electrons[idx1].p4()) if dR < 0.5: continue ltau = LeptonTauPair(idx1, event.Electron_pt[idx1], event.Electron_pfRelIso03_all[idx1], idx2, event.Tau_pt[idx2], event.Tau_rawMVAoldDM2017v2[idx2]) ltaus.append(ltau) if len(ltaus) == 0: return False ltau = bestDiLepton(ltaus) electron = electrons[ltau.id1].p4() tau = taus[ltau.id2].p4() #print 'chosen tau1 (idx, pt) = ', ltau.id1, ltau.tau1_pt, 'check', electron.p4().Pt() #print 'chosen tau2 (idx, pt) = ', ltau.id2, ltau.tau2_pt, 'check', tau.p4().Pt() ##################################### self.out.cutflow.Fill(self.GoodDiLepton) ##################################### jetIds = [] bjetIds = [] jets = Collection(event, 'Jet') nfjets = 0 ncjets = 0 nbtag = 0 for ijet in range(event.nJet): if event.Jet_pt[ijet] < 30: continue if abs(event.Jet_eta[ijet]) > 4.7: continue if electron.DeltaR(jets[ijet].p4()) < 0.5: continue if tau.DeltaR(jets[ijet].p4()) < 0.5: continue jetIds.append(ijet) if abs(event.Jet_eta[ijet]) > 2.4: nfjets += 1 else: ncjets += 1 if event.Jet_btagDeepB[ijet] > self.deepcsv_wp.medium: nbtag += 1 bjetIds.append(ijet) if not self.isData and self.vlooseIso( event, ltau.id2) and event.Electron_pfRelIso03_all[ltau.id1] < 0.50: self.btagTool.fillEfficiencies(event, jetIds) self.btagTool_deep.fillEfficiencies(event, jetIds) #eventSum = ROOT.TLorentzVector() # #for lep in electrons : # eventSum += lep.p4() #for lep in electrons : # eventSum += lep.p4() #for j in filter(self.jetSel,jets): # eventSum += j.p4() # ELECTRON self.out.pt_1[0] = event.Electron_pt[ltau.id1] self.out.eta_1[0] = event.Electron_eta[ltau.id1] self.out.phi_1[0] = event.Electron_phi[ltau.id1] self.out.m_1[0] = event.Electron_mass[ltau.id1] self.out.dxy_1[0] = event.Electron_dxy[ltau.id1] self.out.dz_1[0] = event.Electron_dz[ltau.id1] self.out.q_1[0] = event.Electron_charge[ltau.id1] self.out.pfRelIso03_all_1[0] = event.Electron_pfRelIso03_all[ltau.id1] self.out.cutBased_1[0] = event.Electron_cutBased[ltau.id1] self.out.mvaFall17Iso_1[0] = getvar(event, 'Electron_mvaFall17Iso')[ltau.id1] self.out.mvaFall17Iso_WP80_1[0] = getvar( event, 'Electron_mvaFall17Iso_WP80')[ltau.id1] self.out.mvaFall17Iso_WP90_1[0] = getvar( event, 'Electron_mvaFall17Iso_WP90')[ltau.id1] self.out.mvaFall17Iso_WPL_1[0] = getvar( event, 'Electron_mvaFall17Iso_WPL')[ltau.id1] # TAU self.out.pt_2[0] = event.Tau_pt[ltau.id2] self.out.eta_2[0] = event.Tau_eta[ltau.id2] self.out.phi_2[0] = event.Tau_phi[ltau.id2] self.out.m_2[0] = event.Tau_mass[ltau.id2] self.out.dxy_2[0] = event.Tau_dxy[ltau.id2] self.out.dz_2[0] = event.Tau_dz[ltau.id2] self.out.leadTkPtOverTauPt_2[0] = event.Tau_leadTkPtOverTauPt[ltau.id2] self.out.chargedIso_2[0] = event.Tau_chargedIso[ltau.id2] self.out.neutralIso_2[0] = event.Tau_neutralIso[ltau.id2] self.out.photonsOutsideSignalCone_2[ 0] = event.Tau_photonsOutsideSignalCone[ltau.id2] self.out.puCorr_2[0] = event.Tau_puCorr[ltau.id2] self.out.rawAntiEle_2[0] = event.Tau_rawAntiEle[ltau.id2] self.out.rawIso_2[0] = event.Tau_rawIso[ltau.id2] self.out.q_2[0] = event.Tau_charge[ltau.id2] self.out.decayMode_2[0] = event.Tau_decayMode[ltau.id2] ###self.out.rawAntiEleCat_2[0] = event.Tau_rawAntiEleCat[ltau.id2] self.out.idAntiEle_2[0] = ord(event.Tau_idAntiEle[ltau.id2]) self.out.idAntiMu_2[0] = ord(event.Tau_idAntiMu[ltau.id2]) self.out.idDecayMode_2[0] = event.Tau_idDecayMode[ltau.id2] self.out.idDecayModeNewDMs_2[0] = event.Tau_idDecayModeNewDMs[ltau.id2] self.out.rawMVAoldDM_2[0] = event.Tau_rawMVAoldDM[ltau.id2] self.out.rawMVAnewDM2017v2_2[0] = event.Tau_rawMVAnewDM2017v2[ltau.id2] self.out.rawMVAoldDM2017v1_2[0] = event.Tau_rawMVAoldDM2017v1[ltau.id2] self.out.rawMVAoldDM2017v2_2[0] = event.Tau_rawMVAoldDM2017v2[ltau.id2] self.out.idMVAoldDM_2[0] = ord(event.Tau_idMVAoldDM[ltau.id2]) self.out.idMVAoldDM2017v1_2[0] = ord( event.Tau_idMVAoldDM2017v1[ltau.id2]) self.out.idMVAoldDM2017v2_2[0] = ord( event.Tau_idMVAoldDM2017v2[ltau.id2]) self.out.idMVAnewDM2017v2_2[0] = ord( event.Tau_idMVAnewDM2017v2[ltau.id2]) # GENERATOR #print type(event.Tau_genPartFlav[ltau.id2]) if not self.isData: self.out.genPartFlav_1[0] = ord( event.Electron_genPartFlav[ltau.id1]) self.out.genPartFlav_2[0] = ord(event.Tau_genPartFlav[ltau.id2]) genvistau = Collection(event, 'GenVisTau') dRmax = 1000 gendm = -1 genpt = -1 geneta = -1 genphi = -1 for igvt in range(event.nGenVisTau): dR = genvistau[igvt].p4().DeltaR(tau) if dR < 0.5 and dR < dRmax: dRmax = dR gendm = event.GenVisTau_status[igvt] genpt = event.GenVisTau_pt[igvt] geneta = event.GenVisTau_eta[igvt] genphi = event.GenVisTau_phi[igvt] self.out.gendecayMode_2[0] = gendm self.out.genvistaupt_2[0] = genpt self.out.genvistaueta_2[0] = geneta self.out.genvistauphi_2[0] = genphi # EVENT self.out.isData[0] = self.isData self.out.run[0] = event.run self.out.luminosityBlock[0] = event.luminosityBlock self.out.event[0] = event.event & 0xffffffffffffffff self.out.met[0] = event.MET_pt self.out.metphi[0] = event.MET_phi ###self.out.puppimet[0] = event.PuppiMET_pt ###self.out.puppimetphi[0] = event.PuppiMET_phi ###self.out.metsignificance[0] = event.MET_significance ###self.out.metcovXX[0] = event.MET_covXX ###self.out.metcovXY[0] = event.MET_covXY ###self.out.metcovYY[0] = event.MET_covYY ###self.out.fixedGridRhoFastjetAll[0] = event.fixedGridRhoFastjetAll self.out.npvs[0] = event.PV_npvs self.out.npvsGood[0] = event.PV_npvsGood if not self.isData: self.out.genmet[0] = event.GenMET_pt self.out.genmetphi[0] = event.GenMET_phi self.out.nPU[0] = event.Pileup_nPU self.out.nTrueInt[0] = event.Pileup_nTrueInt self.out.genWeight[0] = event.genWeight try: self.out.LHE_Njets[0] = event.LHE_Njets except RuntimeError: self.out.LHE_Njets[0] = -1 # JETS self.out.njets[0] = len(jetIds) self.out.njets50[0] = len([j for j in jetIds if event.Jet_pt[j] > 50]) self.out.nfjets[0] = nfjets self.out.ncjets[0] = ncjets self.out.nbtag[0] = nbtag if len(jetIds) > 0: 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.jcsvv2_1[0] = event.Jet_btagCSVV2[jetIds[0]] self.out.jdeepb_1[0] = event.Jet_btagDeepB[jetIds[0]] else: self.out.jpt_1[0] = -9. self.out.jeta_1[0] = -9. self.out.jphi_1[0] = -9. self.out.jcsvv2_1[0] = -9. self.out.jdeepb_1[0] = -9. if len(jetIds) > 1: 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.jcsvv2_2[0] = event.Jet_btagCSVV2[jetIds[1]] self.out.jdeepb_2[0] = event.Jet_btagDeepB[jetIds[1]] else: self.out.jpt_2[0] = -9. self.out.jeta_2[0] = -9. self.out.jphi_2[0] = -9. self.out.jcsvv2_2[0] = -9. self.out.jdeepb_2[0] = -9. if len(bjetIds) > 0: self.out.bpt_1[0] = event.Jet_pt[bjetIds[0]] self.out.beta_1[0] = event.Jet_eta[bjetIds[0]] else: self.out.bpt_1[0] = -9. self.out.beta_1[0] = -9. if len(bjetIds) > 1: self.out.bpt_2[0] = event.Jet_pt[bjetIds[1]] self.out.beta_2[0] = event.Jet_eta[bjetIds[1]] else: self.out.bpt_2[0] = -9. self.out.beta_2[0] = -9. self.out.pfmt_1[0] = math.sqrt( 2 * self.out.pt_1[0] * self.out.met[0] * (1 - math.cos(deltaPhi(self.out.phi_1[0], self.out.metphi[0])))) self.out.pfmt_2[0] = math.sqrt( 2 * self.out.pt_2[0] * self.out.met[0] * (1 - math.cos(deltaPhi(self.out.phi_2[0], self.out.metphi[0])))) self.out.m_vis[0] = (electron + tau).M() self.out.pt_ll[0] = (electron + tau).Pt() self.out.dR_ll[0] = electron.DeltaR(tau) self.out.dphi_ll[0] = deltaPhi(self.out.phi_1[0], self.out.phi_2[0]) # PZETA leg1 = ROOT.TVector3(electron.Px(), electron.Py(), 0.) leg2 = ROOT.TVector3(tau.Px(), tau.Py(), 0.) met_tlv = ROOT.TLorentzVector() met_tlv = ROOT.TLorentzVector() met_tlv.SetPxPyPzE(self.out.met[0] * math.cos(self.out.metphi[0]), self.out.met[0] * math.cos(self.out.metphi[0]), 0, self.out.met[0]) metleg = met_tlv.Vect() zetaAxis = ROOT.TVector3(leg1.Unit() + leg2.Unit()).Unit() pzetaVis = leg1 * zetaAxis + leg2 * zetaAxis pzetaMET = metleg * zetaAxis self.out.pzetamiss[0] = pzetaMET self.out.pzetavis[0] = pzetaVis self.out.dzeta[0] = pzetaMET - 0.85 * pzetaVis # VETOS self.out.extramuon_veto[0], self.out.extraelec_veto[ 0], self.out.dilepton_veto[0] = extraLeptonVetos( event, [-1], [ltau.id1], self.name) # WEIGHTS if not self.isData: if self.doZpt: zboson = getZPTMass(event) self.out.m_genboson[0] = zboson.M() self.out.pt_genboson[0] = zboson.Pt() self.out.zptweight[0] = self.recoilTool.getZptWeight( zboson.Pt(), zboson.M()) self.out.genweight[0] = event.genWeight self.out.puweight[0] = self.puTool.getWeight(event.Pileup_nTrueInt) self.out.trigweight[0] = self.eleSFs.getTriggerSF( self.out.pt_1[0], self.out.eta_1[0]) self.out.idisoweight_1[0] = self.eleSFs.getIdIsoSF( self.out.pt_1[0], self.out.eta_1[0]) self.out.idisoweight_2[0] = self.ltfSFs.getSF( self.out.genPartFlav_2[0], self.out.eta_2[0]) self.out.btagweight[0] = self.btagTool.getWeight(event, jetIds) self.out.btagweight_deep[0] = self.btagTool_deep.getWeight( event, jetIds) self.out.weight[0] = self.out.genWeight[0] * self.out.puweight[ 0] * self.out.trigweight[0] * self.out.idisoweight_1[ 0] * self.out.idisoweight_2[0] self.out.tree.Fill() return True
class TauTauProducer(Module): def __init__(self, name, dataType, **kwargs): self.name = name self.out = TreeProducerTauTau(name) self.isData = dataType == 'data' self.year = kwargs.get('year', 2017) self.tes = kwargs.get('tes', 1.0) self.ltf = kwargs.get('ltf', 1.0) self.jtf = kwargs.get('jtf', 1.0) self.doZpt = kwargs.get('doZpt', 'DY' in name) self.doRecoil = kwargs.get( 'doRecoil', ('DY' in name or re.search(r"W\d?Jets", name)) and self.year > 2016) self.doTTpt = kwargs.get('doTTpt', 'TT' in name) self.doTight = kwargs.get('doTight', self.tes != 1 or self.ltf != 1) self.channel = 'tautau' year, channel = self.year, self.channel self.vlooseIso = getVLooseTauIso(year) if year == 2016: if self.isData: self.trigger = lambda e: e.HLT_DoubleMediumIsoPFTau35_Trk1_eta2p1_Reg \ if e.run<280919 else e.HLT_DoubleMediumCombinedIsoPFTau35_Trk1_eta2p1_Reg else: self.trigger = lambda e: e.HLT_DoubleMediumIsoPFTau35_Trk1_eta2p1_Reg or e.HLT_DoubleMediumCombinedIsoPFTau35_Trk1_eta2p1_Reg elif year == 2017: self.trigger = lambda e: e.HLT_DoubleTightChargedIsoPFTau35_Trk1_TightID_eta2p1_Reg or e.HLT_DoubleTightChargedIsoPFTau40_Trk1_eta2p1_Reg or e.HLT_DoubleMediumChargedIsoPFTau40_Trk1_TightID_eta2p1_Reg else: if self.isData: self.trigger = lambda e: e.HLT_DoubleTightChargedIsoPFTau35_Trk1_TightID_eta2p1_Reg or e.HLT_DoubleTightChargedIsoPFTau40_Trk1_eta2p1_Reg or e.HLT_DoubleMediumChargedIsoPFTau40_Trk1_TightID_eta2p1_Reg \ if e.run<317509 else e.HLT_DoubleMediumChargedIsoPFTauHPS35_Trk1_eta2p1_Reg else: self.trigger = lambda e: e.HLT_DoubleMediumChargedIsoPFTauHPS35_Trk1_eta2p1_Reg self.tauCutPt = 40 if not self.isData: self.tauSFs = TauTriggerSFs('tautau', 'tight', year=year) self.tauSFsVT = TauTriggerSFs('tautau', 'vtight', year=year) self.ltfSFs = LeptonTauFakeSFs('loose', 'vloose', year=year) self.puTool = PileupWeightTool(year=year) self.btagTool = BTagWeightTool('DeepCSV', 'medium', channel='mutau', year=year) if self.doZpt: self.zptTool = ZptCorrectionTool(year=year) if self.doRecoil: self.recoilTool = RecoilCorrectionTool(year=year) self.deepcsv_wp = BTagWPs('DeepCSV', year=year) self.Nocut = 0 self.Trigger = 1 self.GoodTaus = 2 self.GoodDiTau = 3 self.Nocut_GT = 20 self.Trigger_GT = 21 self.GoodTaus_GT = 22 self.GoodDiTau_GT = 23 self.TotalWeighted = 15 self.TotalWeighted_no0PU = 16 self.out.cutflow.GetXaxis().SetBinLabel(1 + self.Nocut, "no cut") self.out.cutflow.GetXaxis().SetBinLabel(1 + self.Trigger, "trigger") self.out.cutflow.GetXaxis().SetBinLabel(1 + self.GoodTaus, "tau objects") self.out.cutflow.GetXaxis().SetBinLabel(1 + self.GoodDiTau, "ditau pair") self.out.cutflow.GetXaxis().SetBinLabel(1 + self.Nocut_GT, "no cut, GM") self.out.cutflow.GetXaxis().SetBinLabel(1 + self.Trigger_GT, "trigger, GM") self.out.cutflow.GetXaxis().SetBinLabel(1 + self.GoodTaus_GT, "tau objects, GM") self.out.cutflow.GetXaxis().SetBinLabel(1 + self.GoodDiTau_GT, "ditau pair, GM") self.out.cutflow.GetXaxis().SetBinLabel(1 + self.TotalWeighted, "no cut, weighted") self.out.cutflow.GetXaxis().SetBinLabel(1 + self.TotalWeighted_no0PU, "no cut, weighted, PU>0") self.out.cutflow.GetXaxis().SetLabelSize(0.041) def beginJob(self): pass def endJob(self): if not self.isData: self.btagTool.setDirectory(self.out.outputfile, 'btag') self.out.endJob() def beginFile(self, inputFile, outputFile, inputTree, wrappedOutputTree): sys.stdout.flush() checkBranches(inputTree) def endFile(self, inputFile, outputFile, inputTree, wrappedOutputTree): pass def analyze(self, event): """process event, return True (go to next module) or False (fail, go to next event)""" sys.stdout.flush() ##print '-'*80 ngentauhads = 0 ngentaus = 0 #if not self.isData: # for igp in range(event.nGenPart): # if abs(event.GenPart_pdgId[igp])==15 and event.GenPart_status[igp]==2: # genflag = event.GenPart_statusFlags[igp] # binary = format(genflag,'b').zfill(15) # # 0 : isPrompt # # 1 : isDecayedLeptonHadron # # 2 : isTauDecayProduct # # 3 : isPromptTauDecayProduct # # 4 : isDirectTauDecayProduct # # 5 : isDirectPromptTauDecayProduct # # 6 : isDirectHadronDecayProduct # # 7 : isHardProcess # # 8 : fromHardProcess # # 9 : isHardProcessTauDecayProduct # # 10 : isDirectHardProcessTauDecayProduct # # 11 : fromHardProcessBeforeFSR # # 12 : isFirstCopy # # 13 : isLastCopy # # 14 : isLastCopyBeforeFSR # # if int(binary[14])==0: continue # if int(binary[6])==0: continue # #print 'Tau found with status = 2 (pt, eta) = ', event.GenPart_pt[igp], event.GenPart_eta[igp], event.GenPart_statusFlags[igp] # # ngentaus += 1 # _pdg_ = -1 # _idx_ = event.GenPart_genPartIdxMother[igp] # #_status_ = -1 # flag_resonance = False # # while abs(_pdg_) not in [9000002, 9000006]: # if _idx_==-1: break # _pdg_ = event.GenPart_pdgId[_idx_] # # _status_ = event.GenPart_status[_idx_] # _idx_ = event.GenPart_genPartIdxMother[_idx_] # if abs(_pdg_) > 30 and abs(_pdg_) not in [9000002, 9000006]: # flag_resonance = True # #print '\t (pdg, mother id) = ', _pdg_, _status_, _idx_ # if flag_resonance: continue # _dr_ = 100. # for igvt in range(event.nGenVisTau): # dr = deltaR(event.GenPart_eta[igp], event.GenPart_phi[igp], event.GenVisTau_eta[igvt], event.GenVisTau_phi[igvt]) # #print dr, _dr_, event.GenPart_eta[igp], event.GenPart_phi[igp], event.GenVisTau_eta[igvt], event.GenVisTau_phi[igvt] # if _dr_ > dr: # _dr_ = dr # #print 'match !',_pdg_, event.nGenVisTau, _dr_ # if _dr_ < 0.1: # ngentauhads += 1 # # #for igvt in range(event.nGenVisTau): # # print 'status = ', event.GenVisTau_status[igvt], 'mother ID = ', event.GenVisTau_genPartIdxMother[igvt], 'pt = ', event.GenVisTau_pt[igvt], ', eta = ', event.GenVisTau_eta[igvt] # # ngentauhads += 1 # # if ngentaus != 2: # print 'WOW!!! ngentaus = %d != 2'%(ngentaus) ##################################### self.out.cutflow.Fill(self.Nocut) #if ngentauhads == 2: # self.out.cutflow.Fill(self.Nocut_GT) if self.isData: self.out.cutflow.Fill(self.TotalWeighted, 1.) if event.PV_npvs > 0: self.out.cutflow.Fill(self.TotalWeighted_no0PU, 1.) else: return False else: self.out.cutflow.Fill(self.TotalWeighted, event.genWeight) self.out.pileup.Fill(event.Pileup_nTrueInt) if event.Pileup_nTrueInt > 0: self.out.cutflow.Fill(self.TotalWeighted_no0PU, event.genWeight) else: return False ##################################### if not self.trigger(event): return False ##################################### self.out.cutflow.Fill(self.Trigger) #if ngentauhads == 2: # self.out.cutflow.Fill(self.Trigger_GT) ##################################### Tau_genmatch = {} # bug in Tau_genPartFlav idx_goodtaus = [] for itau in range(event.nTau): if abs(event.Tau_eta[itau]) > 2.1: continue if abs(event.Tau_dz[itau]) > 0.2: continue if event.Tau_decayMode[itau] not in [0, 1, 10]: continue if abs(event.Tau_charge[itau]) != 1: continue if not self.vlooseIso(event, itau): continue if not self.isData: Tau_genmatch[itau] = genmatch(event, itau) #if self.tes!=1.0: # event.Tau_pt[itau] *= self.tes # event.Tau_mass[itau] *= self.tes if event.Tau_pt[itau] < self.tauCutPt: continue idx_goodtaus.append(itau) if len(idx_goodtaus) < 2: return False ##################################### self.out.cutflow.Fill(self.GoodTaus) #if ngentauhads == 2: # self.out.cutflow.Fill(self.GoodTaus_GT) ##################################### taus = Collection(event, 'Tau') ditaus = [] for idx1 in idx_goodtaus: for idx2 in idx_goodtaus: if idx1 >= idx2: continue dR = taus[idx1].p4().DeltaR(taus[idx2].p4()) if dR < 0.5: continue ditau = DiTauPair(idx1, event.Tau_pt[idx1], event.Tau_rawMVAoldDM[idx1], idx2, event.Tau_pt[idx2], event.Tau_rawMVAoldDM[idx2]) ditaus.append(ditau) if len(ditaus) == 0: return False ditau = bestDiLepton(ditaus) tau1 = taus[ditau.id1].p4() tau2 = taus[ditau.id2].p4() #print 'chosen tau1 (idx, pt) = ', ditau.id1, ditau.tau1_pt, 'check', tau1.p4().Pt() #print 'chosen tau2 (idx, pt) = ', ditau.id2, ditau.tau2_pt, 'check', tau2.p4().Pt() ##################################### self.out.cutflow.Fill(self.GoodDiTau) #if ngentauhads == 2: # self.out.cutflow.Fill(self.GoodDiTau_GT) ##################################### # VETOS self.out.extramuon_veto[0], self.out.extraelec_veto[ 0], self.out.dilepton_veto[0] = extraLeptonVetos( event, [-1], [-1], self.name) self.out.lepton_vetos[0] = self.out.extramuon_veto[ 0] or self.out.extraelec_veto[0] or self.out.dilepton_veto[0] jetIds = [] bjetIds = [] jets = Collection(event, 'Jet') #jets = filter(self.jetSel,jets): nfjets = 0 ncjets = 0 nbtag = 0 for ijet in range(event.nJet): if event.Jet_pt[ijet] < 30: continue if abs(event.Jet_eta[ijet]) > 4.7: continue if tau1.DeltaR(jets[ijet].p4()) < 0.5: continue if tau2.DeltaR(jets[ijet].p4()) < 0.5: continue jetIds.append(ijet) if abs(event.Jet_eta[ijet]) > 2.4: nfjets += 1 else: ncjets += 1 if event.Jet_btagDeepB[ijet] > self.deepcsv_wp.medium: nbtag += 1 bjetIds.append(ijet) if not self.isData and self.vlooseIso( event, ditau.id1) and self.vlooseIso(event, ditau.id2): self.btagTool.fillEfficiencies(event, jetIds) #eventSum = TLorentzVector() # #for lep in muons : # eventSum += lep.p4() #for lep in electrons : # eventSum += lep.p4() #for j in filter(self.jetSel,jets): # eventSum += j.p4() # EVENT self.out.isData[0] = self.isData self.out.run[0] = event.run self.out.lumi[0] = event.luminosityBlock #print 'event =', event.event & 0xffffffffffffffff, 'original = ', event.event self.out.event[0] = event.event & 0xffffffffffffffff ###self.out.puppimetpt[0] = event.PuppiMET_pt ###self.out.puppimetphi[0] = event.PuppiMET_phi ###self.out.metsignificance[0] = event.MET_significance ###self.out.metcovXX[0] = event.MET_covXX ###self.out.metcovXY[0] = event.MET_covXY ###self.out.metcovYY[0] = event.MET_covYY ###self.out.fixedGridRhoFastjetAll[0] = event.fixedGridRhoFastjetAll self.out.npvs[0] = event.PV_npvs self.out.npvsGood[0] = event.PV_npvsGood if not self.isData: self.out.ngentauhads[0] = ngentauhads self.out.ngentaus[0] = ngentaus self.out.genmet[0] = event.GenMET_pt self.out.genmetphi[0] = event.GenMET_phi self.out.nPU[0] = event.Pileup_nPU self.out.nTrueInt[0] = event.Pileup_nTrueInt try: self.out.LHE_Njets[0] = event.LHE_Njets except RuntimeError: self.out.LHE_Njets[0] = -1 #print 'check (LO)', event.LHE_NpLO, type(event.LHE_NpLO) #print 'check (NLO)', event.LHE_NpNLO, type(event.LHE_NpNLO) #self.out.LHE_NpLO[0] = event.LHE_NpLO #self.out.LHE_NpNLO[0] = event.LHE_NpNLO #print self.out.LHE_Njets[0], event.LHE_Njets #print self.out.event[0], event.event, (event.event & 0xffffffffffffffff) #print self.out.LHE_Njets[0], event.LHE_Njets, int(event.LHE_Njets) #print event.LHE_NpNLO #print self.out.Pileup_nPU, event.Pileup_nPU # TAU 1 self.out.pt_1[0] = event.Tau_pt[ditau.id1] self.out.eta_1[0] = event.Tau_eta[ditau.id1] self.out.phi_1[0] = event.Tau_phi[ditau.id1] self.out.m_1[0] = event.Tau_mass[ditau.id1] self.out.dxy_1[0] = event.Tau_dxy[ditau.id1] self.out.dz_1[0] = event.Tau_dz[ditau.id1] self.out.leadTkPtOverTauPt_1[0] = event.Tau_leadTkPtOverTauPt[ ditau.id1] self.out.chargedIso_1[0] = event.Tau_chargedIso[ditau.id1] self.out.neutralIso_1[0] = event.Tau_neutralIso[ditau.id1] self.out.photonsOutsideSignalCone_1[ 0] = event.Tau_photonsOutsideSignalCone[ditau.id1] self.out.puCorr_1[0] = event.Tau_puCorr[ditau.id1] self.out.rawAntiEle_1[0] = event.Tau_rawAntiEle[ditau.id1] self.out.rawIso_1[0] = event.Tau_rawIso[ditau.id1] self.out.rawMVAnewDM2017v2_1[0] = event.Tau_rawMVAnewDM2017v2[ ditau.id1] self.out.rawMVAoldDM_1[0] = event.Tau_rawMVAoldDM[ditau.id1] self.out.rawMVAoldDM2017v1_1[0] = event.Tau_rawMVAoldDM2017v1[ ditau.id1] self.out.rawMVAoldDM2017v2_1[0] = event.Tau_rawMVAoldDM2017v2[ ditau.id1] self.out.q_1[0] = event.Tau_charge[ditau.id1] self.out.decayMode_1[0] = event.Tau_decayMode[ditau.id1] ###self.out.rawAntiEleCat_1[0] = event.Tau_rawAntiEleCat[ditau.id1] self.out.idAntiEle_1[0] = ord(event.Tau_idAntiEle[ditau.id1]) self.out.idAntiMu_1[0] = ord(event.Tau_idAntiMu[ditau.id1]) self.out.idDecayMode_1[0] = event.Tau_idDecayMode[ditau.id1] self.out.idDecayModeNewDMs_1[0] = event.Tau_idDecayModeNewDMs[ ditau.id1] self.out.idMVAnewDM2017v2_1[0] = ord( event.Tau_idMVAnewDM2017v2[ditau.id1]) self.out.idMVAoldDM_1[0] = ord(event.Tau_idMVAoldDM[ditau.id1]) self.out.idMVAoldDM2017v1_1[0] = ord( event.Tau_idMVAoldDM2017v1[ditau.id1]) self.out.idMVAoldDM2017v2_1[0] = ord( event.Tau_idMVAoldDM2017v2[ditau.id1]) # TAU 2 self.out.pt_2[0] = event.Tau_pt[ditau.id2] self.out.eta_2[0] = event.Tau_eta[ditau.id2] self.out.phi_2[0] = event.Tau_phi[ditau.id2] self.out.m_2[0] = event.Tau_mass[ditau.id2] self.out.dxy_2[0] = event.Tau_dxy[ditau.id2] self.out.dz_2[0] = event.Tau_dz[ditau.id2] self.out.leadTkPtOverTauPt_2[0] = event.Tau_leadTkPtOverTauPt[ ditau.id2] self.out.chargedIso_2[0] = event.Tau_chargedIso[ditau.id2] self.out.neutralIso_2[0] = event.Tau_neutralIso[ditau.id2] self.out.photonsOutsideSignalCone_2[ 0] = event.Tau_photonsOutsideSignalCone[ditau.id2] self.out.puCorr_2[0] = event.Tau_puCorr[ditau.id2] self.out.rawAntiEle_2[0] = event.Tau_rawAntiEle[ditau.id2] self.out.rawIso_2[0] = event.Tau_rawIso[ditau.id2] self.out.q_2[0] = event.Tau_charge[ditau.id2] self.out.decayMode_2[0] = event.Tau_decayMode[ditau.id2] ###self.out.rawAntiEleCat_2[0] = event.Tau_rawAntiEleCat[ditau.id2] self.out.idAntiEle_2[0] = ord(event.Tau_idAntiEle[ditau.id2]) self.out.idAntiMu_2[0] = ord(event.Tau_idAntiMu[ditau.id2]) self.out.idDecayMode_2[0] = event.Tau_idDecayMode[ditau.id2] self.out.idDecayModeNewDMs_2[0] = event.Tau_idDecayModeNewDMs[ ditau.id2] self.out.rawMVAoldDM_2[0] = event.Tau_rawMVAoldDM[ditau.id2] self.out.rawMVAoldDM2017v1_2[0] = event.Tau_rawMVAoldDM2017v1[ ditau.id2] self.out.rawMVAoldDM2017v2_2[0] = event.Tau_rawMVAoldDM2017v2[ ditau.id2] self.out.rawMVAnewDM2017v2_2[0] = event.Tau_rawMVAnewDM2017v2[ ditau.id2] self.out.idMVAoldDM_2[0] = ord(event.Tau_idMVAoldDM[ditau.id2]) self.out.idMVAoldDM2017v1_2[0] = ord( event.Tau_idMVAoldDM2017v1[ditau.id2]) self.out.idMVAoldDM2017v2_2[0] = ord( event.Tau_idMVAoldDM2017v2[ditau.id2]) self.out.idMVAnewDM2017v2_2[0] = ord( event.Tau_idMVAnewDM2017v2[ditau.id2]) # GENERATOR if not self.isData: self.out.genPartFlav_1[0] = Tau_genmatch[ditau.id1] self.out.genPartFlav_2[0] = Tau_genmatch[ditau.id2] genvistau = Collection(event, 'GenVisTau') dRmax1, dRmax2 = .5, .5 gendm1, gendm2 = -1, -1 genpt1, genpt2 = -1, -1 geneta1, geneta2 = -9, -9 genphi1, genphi2 = -9, -9 for igvt in range(event.nGenVisTau): dR = genvistau[igvt].p4().DeltaR(tau1) if dR < dRmax1: dRmax1 = dR gendm1 = event.GenVisTau_status[igvt] genpt1 = event.GenVisTau_pt[igvt] geneta1 = event.GenVisTau_eta[igvt] genphi1 = event.GenVisTau_phi[igvt] dR = genvistau[igvt].p4().DeltaR(tau2) if dR < dRmax2: dRmax2 = dR gendm2 = event.GenVisTau_status[igvt] genpt2 = event.GenVisTau_pt[igvt] geneta2 = event.GenVisTau_eta[igvt] genphi2 = event.GenVisTau_phi[igvt] self.out.gendecayMode_1[0] = gendm1 self.out.genvistaupt_1[0] = genpt1 self.out.genvistaueta_1[0] = geneta1 self.out.genvistauphi_1[0] = genphi1 self.out.gendecayMode_2[0] = gendm2 self.out.genvistaupt_2[0] = genpt2 self.out.genvistaueta_2[0] = geneta2 self.out.genvistauphi_2[0] = genphi2 # WEIGHTS met = TLorentzVector() met.SetPxPyPzE(event.MET_pt * cos(event.MET_phi), event.MET_pt * sin(event.MET_phi), 0, event.MET_pt) if not self.isData: if self.doRecoil: boson, boson_vis = getBoson(event) self.recoilTool.CorrectPFMETByMeanResolution( met, boson, boson_vis, len(jetIds)) event.MET_pt = met.Pt() event.MET_phi = met.Phi() self.out.m_genboson[0] = boson.M() self.out.pt_genboson[0] = boson.Pt() if self.doZpt: self.out.zptweight[0] = self.zptTool.getZptWeight( boson.Pt(), boson.M()) elif self.doZpt: zboson = getZBoson(event) self.out.m_genboson[0] = zboson.M() self.out.pt_genboson[0] = zboson.Pt() self.out.zptweight[0] = self.zptTool.getZptWeight( zboson.Pt(), zboson.M()) elif self.doTTpt: toppt1, toppt2 = getTTPt(event) self.out.ttptweight[0] = getTTptWeight(toppt1, toppt2) diTauLeg1SF = self.tauSFs.getTriggerSF(self.out.pt_1[0], self.out.eta_1[0], self.out.phi_1[0], self.out.decayMode_1[0], self.out.genPartFlav_1[0]) diTauLeg2SF = self.tauSFs.getTriggerSF(self.out.pt_2[0], self.out.eta_2[0], self.out.phi_2[0], self.out.decayMode_2[0], self.out.genPartFlav_2[0]) diTauLeg1SFVT = self.tauSFsVT.getTriggerSF( self.out.pt_1[0], self.out.eta_1[0], self.out.phi_1[0], self.out.decayMode_1[0], self.out.genPartFlav_1[0]) diTauLeg2SFVT = self.tauSFsVT.getTriggerSF( self.out.pt_2[0], self.out.eta_2[0], self.out.phi_2[0], self.out.decayMode_2[0], self.out.genPartFlav_2[0]) self.out.genweight[0] = event.genWeight self.out.trigweight[0] = diTauLeg1SF * diTauLeg2SF self.out.trigweightVT[0] = diTauLeg1SFVT * diTauLeg2SFVT self.out.puweight[0] = self.puTool.getWeight(event.Pileup_nTrueInt) self.out.idisoweight_1[0] = self.ltfSFs.getSF( self.out.genPartFlav_1[0], self.out.eta_1[0]) self.out.idisoweight_2[0] = self.ltfSFs.getSF( self.out.genPartFlav_2[0], self.out.eta_2[0]) self.out.btagweight[0] = self.btagTool.getWeight(event, jetIds) self.out.weight[0] = self.out.genweight[0] * self.out.puweight[ 0] * self.out.trigweight[0] * self.out.idisoweight_1[ 0] * self.out.idisoweight_2[0] # JETS self.out.njets[0] = len(jetIds) self.out.njets50[0] = len([j for j in jetIds if event.Jet_pt[j] > 50]) self.out.nfjets[0] = nfjets self.out.ncjets[0] = ncjets self.out.nbtag[0] = nbtag if len(jetIds) > 0: 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.jdeepb_1[0] = event.Jet_btagDeepB[jetIds[0]] else: self.out.jpt_1[0] = -9. self.out.jeta_1[0] = -9. self.out.jphi_1[0] = -9. self.out.jdeepb_1[0] = -9. if len(jetIds) > 1: 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.jdeepb_2[0] = event.Jet_btagDeepB[jetIds[1]] else: self.out.jpt_2[0] = -9. self.out.jeta_2[0] = -9. self.out.jphi_2[0] = -9. self.out.jdeepb_2[0] = -9. if len(bjetIds) > 0: self.out.bpt_1[0] = event.Jet_pt[bjetIds[0]] self.out.beta_1[0] = event.Jet_eta[bjetIds[0]] else: self.out.bpt_1[0] = -9. self.out.beta_1[0] = -9. if len(bjetIds) > 1: self.out.bpt_2[0] = event.Jet_pt[bjetIds[1]] self.out.beta_2[0] = event.Jet_eta[bjetIds[1]] else: self.out.bpt_2[0] = -9. self.out.beta_2[0] = -9. self.out.met[0] = event.MET_pt self.out.metphi[0] = event.MET_phi self.out.pfmt_1[0] = sqrt( 2 * self.out.pt_1[0] * self.out.met[0] * (1 - cos(deltaPhi(self.out.phi_1[0], self.out.metphi[0])))) self.out.pfmt_2[0] = sqrt( 2 * self.out.pt_2[0] * self.out.met[0] * (1 - cos(deltaPhi(self.out.phi_2[0], self.out.metphi[0])))) self.out.m_vis[0] = (tau1 + tau2).M() self.out.pt_ll[0] = (tau1 + tau2).Pt() self.out.dR_ll[0] = tau1.DeltaR(tau2) self.out.dphi_ll[0] = deltaPhi(self.out.phi_1[0], self.out.phi_2[0]) self.out.deta_ll[0] = abs(self.out.eta_1[0] - self.out.eta_2[0]) # PZETA leg1 = TVector3(tau1.Px(), tau1.Py(), 0.) leg2 = TVector3(tau2.Px(), tau2.Py(), 0.) zetaAxis = TVector3(leg1.Unit() + leg2.Unit()).Unit() pzeta_vis = leg1 * zetaAxis + leg2 * zetaAxis pzeta_miss = met.Vect() * zetaAxis self.out.pzetamiss[0] = pzeta_miss self.out.pzetavis[0] = pzeta_vis self.out.dzeta[0] = pzeta_miss - 0.85 * pzeta_vis self.out.tree.Fill() return True