def getBJetDR( event, sample ): jets = getJets(event, jetVars=jetVars, jetColl="jet") trueBJets = [ j for j in jets if abs(j['hadronFlavour'])==5 ] bjets = [ j for j in jets if j['btagDeepCSV']>0.6324 and j['pt']>30 and abs(j['eta'])<2.4 ] minDR = -1 mindPhi = -1 if len(bjets)>1: minDR = 999. mindPhi = 4. comb = itertools.combinations(bjets, 2) for c in comb: dR = deltaR(c[0], c[1]) dPhi = deltaPhi(c[0]['phi'], c[1]['phi']) dEta = abs(c[0]['eta'] - c[1]['eta']) if dR < minDR: minDR = dR mindPhi = dPhi mindEta = dEta l1 = ROOT.TLorentzVector() l2 = ROOT.TLorentzVector() l1.SetPtEtaPhiM( c[0]['pt'], c[0]['eta'], c[0]['phi'], 0) l2.SetPtEtaPhiM( c[1]['pt'], c[1]['eta'], c[1]['phi'], 0) M = (l1 + l2).M() event.bjet_dR = minDR event.bjet_dPhi = mindPhi event.bjet_invMass = M event.bjet_dEta = mindEta event.b1_pt = l1.Pt() event.b1_phi = l1.Phi() event.b1_eta = l1.Eta() event.b2_pt = l2.Pt() event.b2_phi = l2.Phi() event.b2_eta = l2.Eta() return
def getAllJets(c, leptons, ptCut=30, absEtaCut=2.4, jetVars=jetVars, jetCollections=["Jet", "DiscJet"], idVar='id'): jets = sum([ filter( lambda j: isAnalysisJet( j, ptCut=ptCut, absEtaCut=absEtaCut, idVar=idVar), getJets(c, jetVars, jetColl=coll)) for coll in jetCollections ], []) res = [] for jet in jets: clean = True for lepton in leptons: if deltaR(lepton, jet) < 0.4: clean = False break if clean: res.append(jet) res.sort(key=lambda j: -j['pt']) return res
def isIsolatedPhoton(g, genparts, coneSize): for other in genparts: if other['pdgId'] == 22: continue # Avoid photon or generator copies of it if other['status'] < 0: continue # Only final state particles if other['pt'] < 5: continue # pt > 5 if deltaR(g, other) > coneSize: continue # check deltaR return False return True
def getDRZLep(event, sample): event.dRZLep = deltaR( { 'phi': event.lep_phi[event.nonZ_l1_index], 'eta': event.lep_eta[event.nonZ_l1_index] }, { 'phi': event.Z_phi, 'eta': event.Z_eta })
def getDeltaR(event, sample=None): # 4l # event.nonZl1_Z1_deltaR = deltaR({'eta':event.lep_eta[event.nonZ1_l1_index_4l], 'phi':event.lep_phi[event.nonZ1_l1_index_4l]}, {'eta':event.Z1_eta_4l, 'phi':event.Z1_phi_4l}) # event.nonZl2_Z1_deltaR = deltaR({'eta':event.lep_eta[event.nonZ1_l2_index_4l], 'phi':event.lep_phi[event.nonZ1_l2_index_4l]}, {'eta':event.Z1_eta_4l, 'phi':event.Z1_phi_4l}) # event.jet0_Z1_deltaR = deltaR({'eta':event.jet_eta[0], 'phi':event.jet_phi[0]}, {'eta':event.Z1_eta_4l, 'phi':event.Z1_phi_4l}) # event.jet0_nonZl1_deltaR = deltaR({'eta':event.jet_eta[0], 'phi':event.jet_phi[0]}, {'eta':event.lep_eta[event.nonZ1_l1_index_4l], 'phi':event.lep_phi[event.nonZ1_l1_index_4l]}) # event.jet0_nonZl2_deltaR = deltaR({'eta':event.jet_eta[0], 'phi':event.jet_phi[0]}, {'eta':event.lep_eta[event.nonZ1_l2_index_4l], 'phi':event.lep_phi[event.nonZ1_l2_index_4l]}) # event.jet1_Z1_deltaR = deltaR({'eta':event.jet_eta[1], 'phi':event.jet_phi[1]}, {'eta':event.Z1_eta_4l, 'phi':event.Z1_phi_4l}) # event.jet1_nonZl1_deltaR = deltaR({'eta':event.jet_eta[1], 'phi':event.jet_phi[1]}, {'eta':event.lep_eta[event.nonZ1_l1_index_4l], 'phi':event.lep_phi[event.nonZ1_l1_index_4l]}) # event.jet1_nonZl2_deltaR = deltaR({'eta':event.jet_eta[1], 'phi':event.jet_phi[1]}, {'eta':event.lep_eta[event.nonZ1_l2_index_4l], 'phi':event.lep_phi[event.nonZ1_l2_index_4l]}) ## event.nonZl1_nonZl2_deltaR = deltaR({'eta':event.lep_eta[event.nonZ1_l1_index_4l], 'phi':event.lep_phi[event.nonZ1_l1_index_4l]}, {'eta':event.lep_eta[event.nonZ1_l2_index_4l], 'phi':event.lep_phi[event.nonZ1_l2_index_4l]}) # 3l event.nonZl1_Z_deltaR = deltaR({'eta':event.lep_eta[event.nonZ_l1_index], 'phi':event.lep_phi[event.nonZ_l1_index]}, {'eta':event.Z_eta, 'phi':event.Z_phi}) event.jet0_Z_deltaR = deltaR({'eta':event.jet_eta[0], 'phi':event.jet_phi[0]}, {'eta':event.Z_eta, 'phi':event.Z_phi}) event.jet0_nonZl1_deltaR = deltaR({'eta':event.jet_eta[0], 'phi':event.jet_phi[0]}, {'eta':event.lep_eta[event.nonZ_l1_index], 'phi':event.lep_phi[event.nonZ_l1_index]}) event.jet1_Z_deltaR = deltaR({'eta':event.jet_eta[1], 'phi':event.jet_phi[1]}, {'eta':event.Z_eta, 'phi':event.Z_phi}) event.jet1_nonZl1_deltaR = deltaR({'eta':event.jet_eta[1], 'phi':event.jet_phi[1]}, {'eta':event.lep_eta[event.nonZ_l1_index], 'phi':event.lep_phi[event.nonZ_l1_index]})
def getDeltaR(event, sample=None): event.nonZl1_Z_deltaR = deltaR({'eta':event.lep_eta[event.nonZ_l1_index], 'phi':event.lep_phi[event.nonZ_l1_index]}, {'eta':event.Z_eta, 'phi':event.Z_phi}) event.jet0_Z_deltaR = deltaR({'eta':event.jet_eta[0], 'phi':event.jet_phi[0]}, {'eta':event.Z_eta, 'phi':event.Z_phi}) event.jet0_nonZl1_deltaR = deltaR({'eta':event.jet_eta[0], 'phi':event.jet_phi[0]}, {'eta':event.lep_eta[event.nonZ_l1_index], 'phi':event.lep_phi[event.nonZ_l1_index]}) event.jet1_Z_deltaR = deltaR({'eta':event.jet_eta[1], 'phi':event.jet_phi[1]}, {'eta':event.Z_eta, 'phi':event.Z_phi}) event.jet1_nonZl1_deltaR = deltaR({'eta':event.jet_eta[1], 'phi':event.jet_phi[1]}, {'eta':event.lep_eta[event.nonZ_l1_index], 'phi':event.lep_phi[event.nonZ_l1_index]}) event.jet2_Z_deltaR = deltaR({'eta':event.jet_eta[2], 'phi':event.jet_phi[2]}, {'eta':event.Z_eta, 'phi':event.Z_phi}) event.jet2_nonZl1_deltaR = deltaR({'eta':event.jet_eta[2], 'phi':event.jet_phi[2]}, {'eta':event.lep_eta[event.nonZ_l1_index], 'phi':event.lep_phi[event.nonZ_l1_index]})
def reconstructLeptonicTop(event, sample): #print #print "Next event" lepton = ROOT.TLorentzVector() met = ROOT.TLorentzVector() n1 = ROOT.TLorentzVector() n2 = ROOT.TLorentzVector() b1 = ROOT.TLorentzVector() b2 = ROOT.TLorentzVector() MW = 80.385 Mt = 172.5 lepton.SetPtEtaPhiM(event.lep_pt[event.nonZ_l1_index], event.lep_eta[event.nonZ_l1_index], event.lep_phi[event.nonZ_l1_index], 0) met.SetPtEtaPhiM(event.met_pt, 0, event.met_phi, 0) # get the b from the top decay, assume back-to-back of the tops t1 = lepton + met + b1 t2 = lepton + met + b2 if t2.Pt() > t1.Pt(): b1, b2 = b2, b1 a = lepton.Pz() * (2 * (lepton.Px() * met.Px() + lepton.Py() * met.Py()) - lepton.M()**2 + MW**2) arg = lepton.E()**2 * ((2 * (lepton.Px() * met.Px() + lepton.Py() * met.Py()) - lepton.M()**2 + MW**2)**2 - 4 * met.Pt()**2 * (lepton.E()**2 - lepton.Pz()**2)) b = sqrt( arg ) if arg > 0 else 0. # need this for events with MET mismeasurements c = 2 * (lepton.E()**2 - lepton.Pz()**2) MET_z_1 = (a + b) / c MET_z_2 = (a - b) / c E_n1 = sqrt(met.Px()**2 + met.Py()**2 + MET_z_1**2) E_n2 = sqrt(met.Px()**2 + met.Py()**2 + MET_z_2**2) n1.SetPxPyPzE(met.Px(), met.Py(), MET_z_1, E_n1) n2.SetPxPyPzE(met.Px(), met.Py(), MET_z_2, E_n2) W1 = lepton + n1 W2 = lepton + n2 t1 = lepton + n1 + b1 t2 = lepton + n2 + b1 # get top candidate with mass closer to Mt if abs(t2.M() - Mt) < abs(t1.M() - Mt): t1, t2 = t2, t1 #print t1.M(), t2.M() event.mt_1 = t1.Mt() event.mt_2 = t2.Mt() event.top1_mass = t1.M() event.top1_pt = t1.Pt() event.top1_phi = t1.Phi() event.top2_mass = t2.M() event.top2_pt = t2.Pt() event.top2_phi = t2.Phi() event.b1_pt = b1.Pt() event.b1_phi = b1.Phi() event.b2_pt = b2.Pt() event.b2_phi = b2.Phi() event.deltaPhi_tl = acos( (t1.Px() * lepton.Px() + t1.Py() * lepton.Py()) / sqrt( (t1.Px()**2 + t1.Py()**2) * (lepton.Px()**2 + lepton.Py()**2))) lepton.Boost(-t1.BoostVector()) event.deltaPhi_tl_topRF = deltaPhi(lepton.Phi(), t1.Phi()) event.deltaR_tl_topRF = deltaR({ 'eta': lepton.Eta(), 'phi': lepton.Phi() }, { 'eta': t1.Eta(), 'phi': t1.Phi() }) event.deltaEta_tl_topRF = abs(lepton.Eta() - t1.Eta())
def filler(event): # shortcut r = reader.event if isMC: gPart = getGenPartsAll(r) # weight if isMC: event.weight = lumiScaleFactor * r.genWeight if lumiScaleFactor is not None else 1 elif isData: event.weight = 1 else: raise NotImplementedError("isMC %r isData %r " % (isMC, isData)) # lumi lists and vetos if isData: #event.vetoPassed = vetoList.passesVeto(r.run, r.lumi, r.evt) event.jsonPassed = lumiList.contains(r.run, r.lumi) # store decision to use after filler has been executed event.jsonPassed_ = event.jsonPassed if isMC: event.reweightPU36fb = nTrueInt36fb_puRW(r.nTrueInt) event.reweightPU36fbDown = nTrueInt36fb_puRWDown(r.nTrueInt) event.reweightPU36fbUp = nTrueInt36fb_puRWUp(r.nTrueInt) # top pt reweighting if isMC and options.doTopPtReweighting: event.reweightTopPt = topPtReweightingFunc(getTopPtsForReweighting( r)) / topScaleF if doTopPtReweighting else 1. # Leptons: Reading LepGood and LepOther and fill new LepGood collection in the output tree mu_selector = muonSelector(isoVar="relIso04", barrelIso=0.25, endcapIso=0.25, absEtaCut=2.4, dxy=0.05, dz=0.1) ele_selector = eleSelector(isoVar="relIso03", barrelIso=0.1, endcapIso=0.1, absEtaCut=2.5, dxy=0.05, dz=0.1, eleId="M", noMissingHits=False) leptons = getGoodAndOtherLeptons(r, ptCut=10, mu_selector=mu_selector, ele_selector=ele_selector) leptons.sort(key=lambda p: -p['pt']) # Store leptons event.nlep = len(leptons) for iLep, lep in enumerate(leptons): lep['index'] = iLep # Index wrt to the output collection! lep['relIso'] = lep["relIso04"] if abs( lep['pdgId']) == 13 else lep["relIso03"] for b in lepton_vars_store: getattr(event, "lep_" + b)[iLep] = lep[b] # Storing lepton counters event.nGoodMuons = len(filter(lambda l: abs(l['pdgId']) == 13, leptons)) event.nGoodElectrons = len(filter(lambda l: abs(l['pdgId']) == 11, leptons)) event.nGoodLeptons = len(leptons) # Lepton convinience if options.leptonConvinience: for i in range(min(4, len(leptons))): for var in lep_convinience_vars: setattr(event, "l{n}_{var}".format(n=i + 1, var=var), leptons[i][var]) # Identify best Z (event.Z_mass, event.Z_l1_index, event.Z_l2_index) = closestOSDLMassToMZ(leptons) nonZ_lepton_indices = [ i for i in range(len(leptons)) if i not in [event.Z_l1_index, event.Z_l2_index] ] event.nonZ_l1_index = nonZ_lepton_indices[0] if len( nonZ_lepton_indices) > 0 else -1 event.nonZ_l2_index = nonZ_lepton_indices[1] if len( nonZ_lepton_indices) > 1 else -1 # Store Z information if event.Z_mass >= 0: if leptons[event.Z_l1_index]['pdgId'] * leptons[ event.Z_l2_index]['pdgId'] > 0 or abs( leptons[event.Z_l1_index]['pdgId']) != abs( leptons[event.Z_l2_index]['pdgId']): raise RuntimeError("not a Z! Should never happen") Z_l1 = ROOT.TLorentzVector() Z_l1.SetPtEtaPhiM(leptons[event.Z_l1_index]['pt'], leptons[event.Z_l1_index]['eta'], leptons[event.Z_l1_index]['phi'], 0) Z_l2 = ROOT.TLorentzVector() Z_l2.SetPtEtaPhiM(leptons[event.Z_l2_index]['pt'], leptons[event.Z_l2_index]['eta'], leptons[event.Z_l2_index]['phi'], 0) Z = Z_l1 + Z_l2 event.Z_pt = Z.Pt() event.Z_eta = Z.Eta() event.Z_phi = Z.Phi() event.Z_lldPhi = deltaPhi(leptons[event.Z_l1_index]['phi'], leptons[event.Z_l2_index]['phi']) event.Z_lldR = deltaR(leptons[event.Z_l1_index], leptons[event.Z_l2_index]) ## get the information for cos(theta*) # get the Z and lepton (negative charge) vectors lm_index = event.Z_l1_index if event.lep_pdgId[ event.Z_l1_index] > 0 else event.Z_l2_index event.cosThetaStar = cosThetaStar(event.Z_mass, event.Z_pt, event.Z_eta, event.Z_phi, event.lep_pt[lm_index], event.lep_eta[lm_index], event.lep_phi[lm_index]) # Jets and lepton jet cross-cleaning allJets = getAllJets(r, leptons, ptCut=0, jetVars=jetVarNames, absEtaCut=99, jetCollections=["Jet", "DiscJet"]) #JetId is required selected_jets, other_jets = [], [] for j in allJets: if isAnalysisJet(j, ptCut=30, absEtaCut=2.4): selected_jets.append(j) else: other_jets.append(j) # Don't change analysis jets even if we keep all jets, hence, apply abs eta cut bJets = filter( lambda j: isBJet(j, tagger='CSVv2') and abs(j['eta']) <= 2.4, selected_jets) bJetsDeepCSV = filter( lambda j: isBJet(j, tagger='DeepCSV') and abs(j['eta']) <= 2.4, selected_jets) nonBJets = filter( lambda j: not (isBJet(j, tagger='CSVv2') and abs(j['eta']) <= 2.4), selected_jets) nonBJetsDeepCSV = filter( lambda j: not (isBJet(j, tagger='DeepCSV') and abs(j['eta']) <= 2.4), selected_jets) # Store jets event.nJetSelected = len(selected_jets) jets_stored = allJets event.njet = len(jets_stored) for iJet, jet in enumerate(jets_stored): for b in jetVarNames: getattr(event, "jet_" + b)[iJet] = jet[b] # ETmiss event.met_pt = r.met_pt event.met_phi = r.met_phi # Analysis observables event.ht = sum([j['pt'] for j in selected_jets]) event.metSig = event.met_pt / sqrt(event.ht) if event.ht > 0 else float( 'nan') event.nBTag = len(bJets) event.nBTagDeepCSV = len(bJetsDeepCSV) # Systematics jets_sys = {} bjets_sys = {} nonBjets_sys = {} metVariants = [''] # default if options.keepPhotons: # Keep photons and estimate met including (leading pt) photon photons = getGoodPhotons(r, ptCut=20, idLevel="loose", isData=isData) event.nPhotonGood = len(photons) if event.nPhotonGood > 0: metVariants += [ '_photonEstimated' ] # do all met calculations also for the photonEstimated variant event.photon_pt = photons[0]['pt'] event.photon_eta = photons[0]['eta'] event.photon_phi = photons[0]['phi'] event.photon_idCutBased = photons[0]['idCutBased'] if isMC: genPhoton = getGenPhoton(gPart) event.photon_genPt = genPhoton[ 'pt'] if genPhoton is not None else float('nan') event.photon_genEta = genPhoton[ 'eta'] if genPhoton is not None else float('nan') event.met_pt_photonEstimated, event.met_phi_photonEstimated = getMetPhotonEstimated( r.met_pt, r.met_phi, photons[0]) event.metSig_photonEstimated = event.met_pt_photonEstimated / sqrt( event.ht) if event.ht > 0 else float('nan') event.photonJetdR = min( deltaR(photons[0], j) for j in selected_jets) if len(selected_jets) > 0 else 999 event.photonLepdR = min( deltaR(photons[0], l) for l in leptons) if len(leptons) > 0 else 999 if isMC: event.TTGJetsEventType = getTTGJetsEventType(r) if addSystematicVariations: for j in allJets: j['pt_JECUp'] = j['pt'] / j['corr'] * j['corr_JECUp'] j['pt_JECDown'] = j['pt'] / j['corr'] * j['corr_JECDown'] # JERUp, JERDown, JER addJERScaling(j) for var in ['JECUp', 'JECDown', 'JERUp', 'JERDown']: jets_sys[var] = filter( lambda j: isAnalysisJet( j, ptCut=30, absEtaCut=2.4, ptVar='pt_' + var), allJets) bjets_sys[var] = filter( lambda j: isBJet(j) and abs(j['eta']) < 2.4, jets_sys[var]) nonBjets_sys[var] = filter( lambda j: not (isBJet(j) and abs(j['eta']) < 2.4), jets_sys[var]) setattr(event, "nJetSelected_" + var, len(jets_sys[var])) setattr(event, "ht_" + var, sum([j['pt_' + var] for j in jets_sys[var]])) setattr(event, "nBTag_" + var, len(bjets_sys[var])) for var in [ 'JECUp', 'JECDown', 'JERUp', 'JERDown', 'UnclusteredEnUp', 'UnclusteredEnDown' ]: for i in metVariants: # use cmg MET correction values ecept for JER where it is zero. There, propagate jet variations. if 'JER' in var or 'JECV' in var: (met_corr_pt, met_corr_phi) = getMetJetCorrected( getattr(event, "met_pt" + i), getattr(event, "met_phi" + i), jets_sys[var], var) else: (met_corr_pt, met_corr_phi) = getMetCorrected( r, var, photons[0] if i.count("photonEstimated") else None) setattr(event, "met_pt" + i + "_" + var, met_corr_pt) setattr(event, "met_phi" + i + "_" + var, met_corr_phi) ht = getattr(event, "ht_" + var) if 'Unclustered' not in var else event.ht setattr( event, "metSig" + i + "_" + var, getattr(event, "met_pt" + i + "_" + var) / sqrt(ht) if ht > 0 else float('nan')) if addSystematicVariations: # B tagging weights method 1a, first for CSVv2 for j in selected_jets: btagEff_CSVv2.addBTagEffToJet(j) #print "CSVv2", selected_jets[0]['beff']['SF'], selected_jets[0]['pt'] for var in btagEff_CSVv2.btagWeightNames: if var != 'MC': setattr( event, 'reweightBTagCSVv2_' + var, btagEff_CSVv2.getBTagSF_1a( var, bJets, filter(lambda j: abs(j['eta']) < 2.4, nonBJets))) # B tagging weights method 1a, now for DeepCSV for j in selected_jets: btagEff_DeepCSV.addBTagEffToJet(j) #print "DeepCSV", selected_jets[0]['beff']['SF'], selected_jets[0]['pt'] for var in btagEff_DeepCSV.btagWeightNames: if var != 'MC': setattr( event, 'reweightBTagDeepCSV_' + var, btagEff_DeepCSV.getBTagSF_1a( var, bJetsDeepCSV, filter(lambda j: abs(j['eta']) < 2.4, nonBJetsDeepCSV))) # gen information on extra leptons if isMC and not options.skipGenMatching: genSearch.init(gPart) # Start with status 1 gen leptons # gLep = filter( lambda p:abs(p['pdgId']) in [11, 13] and p['status']==1 and p['pt']>10 and abs(p['eta'])<2.5, gPart ) # ... no acceptance cuts gLep = filter( lambda p: abs(p['pdgId']) in [11, 13] and p['status'] == 1, gPart) for l in gLep: ancestry = [gPart[x]['pdgId'] for x in genSearch.ancestry(l)] l["n_D"] = sum([ancestry.count(p) for p in D_mesons]) l["n_B"] = sum([ancestry.count(p) for p in B_mesons]) l["n_W"] = sum([ancestry.count(p) for p in [24, -24]]) l["n_t"] = sum([ancestry.count(p) for p in [6, -6]]) l["n_tau"] = sum([ancestry.count(p) for p in [15, -15]]) matched_lep = bestDRMatchInCollection( l, leptons) #FIXME -> fix all the gen / reco match indices! if matched_lep: l["lepGood2MatchIndex"] = matched_lep['index'] else: l["lepGood2MatchIndex"] = -1 # store genleps event.nGenLep = len(gLep) for iLep, lep in enumerate(gLep): for b in genLepVarNames: getattr(event, "GenLep_" + b)[iLep] = lep[b] # gen Z genZs = filter( lambda p: (abs(p['pdgId']) == 23 and genSearch.isLast(p)), gPart) genZs.sort(key=lambda p: -p['pt']) if len(genZs) > 0: genZ = genZs[0] event.genZ_pt = genZ['pt'] event.genZ_mass = genZ['mass'] event.genZ_eta = genZ['eta'] event.genZ_phi = genZ['phi'] lep_m = filter(lambda p: p['pdgId'] in [11, 13, 15], genSearch.daughters(genZ)) event.genZ_daughter_flavor = max( [p['pdgId'] for p in genSearch.daughters(genZ)]) if len(lep_m) == 1: event.genZ_cosThetaStar = cosThetaStar( event.genZ_mass, event.genZ_pt, event.genZ_eta, event.genZ_phi, lep_m[0]['pt'], lep_m[0]['eta'], lep_m[0]['phi'])
def getDeltaR(event, sample=None): event.nonZl1_Z1_deltaR = deltaR( { 'eta': event.lep_eta[event.nonZ1_l1_index_4l], 'phi': event.lep_phi[event.nonZ1_l1_index_4l] }, { 'eta': event.Z1_eta_4l, 'phi': event.Z1_phi_4l }) event.nonZl2_Z1_deltaR = deltaR( { 'eta': event.lep_eta[event.nonZ1_l2_index_4l], 'phi': event.lep_phi[event.nonZ1_l2_index_4l] }, { 'eta': event.Z1_eta_4l, 'phi': event.Z1_phi_4l }) event.jet0_Z1_deltaR = deltaR( { 'eta': event.jet_eta[0], 'phi': event.jet_phi[0] }, { 'eta': event.Z1_eta_4l, 'phi': event.Z1_phi_4l }) event.jet0_nonZl1_deltaR = deltaR( { 'eta': event.jet_eta[0], 'phi': event.jet_phi[0] }, { 'eta': event.lep_eta[event.nonZ1_l1_index_4l], 'phi': event.lep_phi[event.nonZ1_l1_index_4l] }) event.jet0_nonZl2_deltaR = deltaR( { 'eta': event.jet_eta[0], 'phi': event.jet_phi[0] }, { 'eta': event.lep_eta[event.nonZ1_l2_index_4l], 'phi': event.lep_phi[event.nonZ1_l2_index_4l] }) event.jet1_Z1_deltaR = deltaR( { 'eta': event.jet_eta[1], 'phi': event.jet_phi[1] }, { 'eta': event.Z1_eta_4l, 'phi': event.Z1_phi_4l }) event.jet1_nonZl1_deltaR = deltaR( { 'eta': event.jet_eta[1], 'phi': event.jet_phi[1] }, { 'eta': event.lep_eta[event.nonZ1_l1_index_4l], 'phi': event.lep_phi[event.nonZ1_l1_index_4l] }) event.jet1_nonZl2_deltaR = deltaR( { 'eta': event.jet_eta[1], 'phi': event.jet_phi[1] }, { 'eta': event.lep_eta[event.nonZ1_l2_index_4l], 'phi': event.lep_phi[event.nonZ1_l2_index_4l] }) event.jet2_Z1_deltaR = deltaR( { 'eta': event.jet_eta[2], 'phi': event.jet_phi[2] }, { 'eta': event.Z1_eta_4l, 'phi': event.Z1_phi_4l }) event.jet2_nonZl1_deltaR = deltaR( { 'eta': event.jet_eta[2], 'phi': event.jet_phi[2] }, { 'eta': event.lep_eta[event.nonZ1_l1_index_4l], 'phi': event.lep_phi[event.nonZ1_l1_index_4l] }) event.jet2_nonZl2_deltaR = deltaR( { 'eta': event.jet_eta[2], 'phi': event.jet_phi[2] }, { 'eta': event.lep_eta[event.nonZ1_l2_index_4l], 'phi': event.lep_phi[event.nonZ1_l2_index_4l] })
def filler(event): if reader.position % 100 == 0: logger.info("At event %i/%i", reader.position, reader.nEvents) event.lumiweight1fb = lumiweight1fb # read jets jets = filter(lambda j: isGoodDelphesJet(j), reader.jets()) jets.sort(key=lambda p: -p['pt']) addIndex(jets) # make b jets # for j in jets: # print j['pt'], j['eta'], j['bTag'], j['bTagPhys'], j['bTagAlgo'] bJets = filter(lambda j: j['bTagPhys'] >= 4, jets) nonBJets = filter(lambda j: not (j['bTagPhys'] < 4), jets) bj0, bj1 = (bJets + nonBJets + [None, None])[:2] fill_vector(event, "bj0", jet_write_varnames, bj0) fill_vector(event, "bj1", jet_write_varnames, bj1) event.nBTag = len(bJets) # read leptons allLeps = reader.muonsTight() + reader.electrons() allLeps.sort(key=lambda p: -p['pt']) leps = filter(isGoodDelphesLepton, allLeps) # cross-cleaning of reco-objects # leps = filter( lambda l: (min([999]+[deltaR2(l, j) for j in jets if j['pt']>30]) > 0.3**2 ), leps ) # give index to leptons addIndex(leps) # Store fill_vector_collection(event, "lep", lep_varnames, leps) fill_vector_collection(event, "jet", jet_varnames, jets) event.nMuons = len(filter(lambda l: abs(l['pdgId']) == 13, leps)) event.nElectrons = len(filter(lambda l: abs(l['pdgId']) == 11, leps)) # MET met = reader.met()[0] event.met_pt = met['pt'] event.met_phi = met['phi'] # search for Z in leptons (event.Z_mass, Z_l1_index, Z_l2_index) = closestOSDLMassToMZ(leps) nonZ_indices = [ i for i in range(len(leps)) if i not in [Z_l1_index, Z_l2_index] ] event.Z_l1_index = leps[Z_l1_index]['index'] if Z_l1_index >= 0 else -1 event.Z_l2_index = leps[Z_l2_index]['index'] if Z_l2_index >= 0 else -1 event.nonZ_l1_index = leps[ nonZ_indices[0]]['index'] if len(nonZ_indices) > 0 else -1 event.nonZ_l2_index = leps[ nonZ_indices[1]]['index'] if len(nonZ_indices) > 1 else -1 # Store Z information if event.Z_mass >= 0: if leps[event.Z_l1_index]['pdgId'] * leps[ event.Z_l2_index]['pdgId'] > 0 or abs( leps[event.Z_l1_index]['pdgId']) != abs( leps[event.Z_l2_index]['pdgId']): raise RuntimeError("not a Z! Should not happen") Z_l1 = ROOT.TLorentzVector() Z_l1.SetPtEtaPhiM(leps[event.Z_l1_index]['pt'], leps[event.Z_l1_index]['eta'], leps[event.Z_l1_index]['phi'], 0) Z_l2 = ROOT.TLorentzVector() Z_l2.SetPtEtaPhiM(leps[event.Z_l2_index]['pt'], leps[event.Z_l2_index]['eta'], leps[event.Z_l2_index]['phi'], 0) Z = Z_l1 + Z_l2 event.Z_pt = Z.Pt() event.Z_eta = Z.Eta() event.Z_phi = Z.Phi() event.Z_lldPhi = deltaPhi(leps[event.Z_l1_index]['phi'], leps[event.Z_l2_index]['phi']) event.Z_lldR = deltaR(leps[event.Z_l1_index], leps[event.Z_l2_index]) lm_index = event.Z_l1_index if leps[ event.Z_l1_index]['pdgId'] > 0 else event.Z_l2_index event.Z_cosThetaStar = cosThetaStar(event.Z_mass, event.Z_pt, event.Z_eta, event.Z_phi, leps[lm_index]['pt'], leps[lm_index]['eta'], leps[lm_index]['phi'])
def ttG2lPlots(index): ''' return plot list for ttG 2l plots ''' plots = [] plots.append( Plot( name='yield', texX='yield', texY='Number of Events', attribute=lambda event, sample: 0.5 + index, binning=[3, 0, 3], )) plots.append( Plot( name='nVtxs', texX='vertex multiplicity', texY='Number of Events', attribute=TreeVariable.fromString("nVert/I"), binning=[50, 0, 50], )) plots.append( Plot( name='MET', texX='E_{T}^{miss} (GeV)', texY='Number of Events / 20 GeV', attribute=TreeVariable.fromString("met_pt/F"), binning=[400 / 20, 0, 400], )) plots.append( Plot( name='MET_phi', texX='#phi(E_{T}^{miss})', texY='Number of Events / 20 GeV', attribute=TreeVariable.fromString("met_phi/F"), binning=[10, -pi, pi], )) # plots.append(Plot( # name = 'Gamma_pt', texX = 'p_{T}(#gamma) (GeV)', texY = 'Number of Events / 20 GeV', # attribute = TreeVariable.fromString( "gamma_pt/F" ), # binning=[20,0,400], # )) # plots.append(Plot( # name = 'Gamma_pt_coarse', texX = 'p_{T}(#gamma) (GeV)', texY = 'Number of Events / 50 GeV', # attribute = TreeVariable.fromString( "gamma_pt/F" ), # binning=[16,0,800], # )) # plots.append(Plot( # name = 'Gamma_pt_superCoarse', texX = 'p_{T}(#gamma) (GeV)', texY = 'Number of Events', # attribute = TreeVariable.fromString( "gamma_pt/F" ), # binning=[3,0,600], # )) # plots.append(Plot( # name = 'Gamma_pt_analysis', texX = 'p_{T}(#gamma) (GeV)', texY = 'Number of Events / 100 GeV', # attribute = TreeVariable.fromString( "gamma_pt/F" ), # binning=[4,0,400], # )) # plots.append(Plot( # name = 'l0gammaDPhi', # texX = '#Delta#Phi(l_{0},#gamma)', texY = 'Number of Events', # attribute = lambda event, sample: deltaPhi(event.selectedLeps[0]['phi'], event.gammas[0]['phi']), # binning=[20,0,pi], # )) # plots.append(Plot( # name = 'l0gammaDR', # texX = '#Delta R(l_{0},#gamma)', texY = 'Number of Events', # attribute = lambda event, sample: deltaR(event.selectedLeps[0], event.gammas[0]), # binning=[20,0.3,3], # )) plots.append( Plot( name="M3", texX='M_{3} (GeV)', texY='Number of Events', attribute=lambda event, sample: m3(event.selectedJets)[0] if len(event.selectedJets) > 2 else float('nan'), binning=[25, 0, 500], )) plots.append( Plot( name="dRll", texX='#Delta R(ll)', texY='Number of Events', attribute=lambda event, sample: deltaR(event.selectedJets[0], event .selectedJets[1]), binning=[20, 0.3, 3], )) plots.append( Plot( name="dPhill", texX='#Delta#phi(ll)', texY='Number of Events', attribute=lambda event, sample: deltaPhi( event.selectedJets[0]['phi'], event.selectedJets[1]['phi']), binning=[10, 0, pi], )) plots.append( Plot( name="nForwardJet_Pt30_eta3", texX='nJet p_{T}(j)>30 GeV', texY='Number of Events', attribute=lambda event, sample: len(event.jetForward30_eta3), binning=[10, 0, 10], )) plots.append( Plot( name="nForwardJet_Pt40_eta3", texX='nJet p_{T}(j)>40 GeV', texY='Number of Events', attribute=lambda event, sample: len(event.jetForward40_eta3), binning=[10, 0, 10], )) plots.append( Plot( name="nForwardJet_Pt50_eta3", texX='nJet p_{T}(j)>50 GeV', texY='Number of Events', attribute=lambda event, sample: len(event.jetForward50_eta3), binning=[10, 0, 10], )) plots.append( Plot( name="nForwardJet_Pt60_eta3", texX='nJet p_{T}(j)>60 GeV', texY='Number of Events', attribute=lambda event, sample: len(event.jetForward60_eta3), binning=[10, 0, 10], )) plots.append( Plot( name="nForwardJet_Pt70_eta3", texX='nJet p_{T}(j)>70 GeV', texY='Number of Events', attribute=lambda event, sample: len(event.jetForward70_eta3), binning=[10, 0, 10], )) plots.append( Plot( name="M_ll", texX='M(ll) (GeV)', texY='Number of Events / 10 GeV', attribute=lambda event, sample: event.mll, binning=[20, 0, 200], )) plots.append( Plot( name="M_ll_coarse", texX='M(ll) (GeV)', texY='Number of Events / 20 GeV', attribute=lambda event, sample: event.mll, binning=[10, 0, 200], )) # plots.append(Plot( # name = "M_llgamma", texX = 'M(ll#gamma) (GeV)', texY = 'Number of Events / 10 GeV', # attribute = lambda event, sample:event.mllgamma, # binning=[20,0,200], # )) # plots.append(Plot( # name = "M_llgamma_coarse", texX = 'M(ll#gamma) (GeV)', texY = 'Number of Events / 20 GeV', # attribute = lambda event, sample:event.mllgamma, # binning=[10,0,200], # )) plots.append( Plot( name="nJets", texX='N_{jets}', texY='Number of Events', attribute=TreeVariable.fromString("nJetSelected/I"), #nJetSelected binning=[8, -0.5, 7.5], )) plots.append( Plot( name="nBJets", texX='N_{b-tag}', texY='Number of Events', attribute=TreeVariable.fromString("nBTag/I"), #nJetSelected binning=[4, -0.5, 3.5], )) plots.append( Plot( name="nLepLoose", texX='N_{l, loose}', texY='Number of Events', attribute=lambda event, sample: len(event.lepLoose), binning=[3, -0.5, 2.5], )) plots.append( Plot( name="nLep", texX='N_{lep}', texY='Number of Events', attribute=lambda event, sample: len(event.selectedLeps), binning=[3, -0.5, 2.5], )) plots.append( Plot( texX='p_{T}(leading l) (GeV)', texY='Number of Events / 20 GeV', name='lep1_pt', attribute=lambda event, sample: event.selectedLeps[0]['pt'], binning=[400 / 20, 0, 400], )) plots.append( Plot( texX='p_{T}(subleading l) (GeV)', texY='Number of Events / 10 GeV', name='lep2_pt', attribute=lambda event, sample: event.selectedLeps[1]['pt'], binning=[200 / 10, 0, 200], )) plots.append( Plot( texX='p_{T}(leading jet) (GeV)', texY='Number of Events / 30 GeV', name='jet1_pt', attribute=lambda event, sample: event.selectedJets[0]['pt'], binning=[600 / 30, 0, 600], )) plots.append( Plot( texX='p_{T}(2nd leading jet) (GeV)', texY='Number of Events / 30 GeV', name='jet2_pt', attribute=lambda event, sample: event.selectedJets[1]['pt'], binning=[600 / 30, 0, 600], )) plots.append( Plot( texX='p_{T}(leading b-jet cand) (GeV)', texY='Number of Events / 20 GeV', name='bjet1_pt', attribute=lambda event, sample: event.jets_sortbtag[0]['pt'], binning=[20, 0, 400], )) plots.append( Plot( texX='p_{T}(2nd leading b-jet cand) (GeV)', texY='Number of Events / 20 GeV', name='bjet2_pt', attribute=lambda event, sample: event.jets_sortbtag[1]['pt'], binning=[20, 0, 400], )) plots.append( Plot( name='deltaPhi_bb', texX='#Delta#phi(bb)', texY='Number of Events', attribute=lambda event, sample: deltaPhi( event.jets_sortbtag[0]['phi'], event.jets_sortbtag[1]['phi']), binning=[20, 0, pi], )) plots.append( Plot( name='deltaR_bb', texX='#DeltaR(bb)', texY='Number of Events', attribute=lambda event, sample: deltaR(event.jets_sortbtag[0], event.jets_sortbtag[1]), binning=[20, 0, 6], )) return plots
def extra_observables( event, sample ): G = {'pt':event.photon_pt, 'eta':event.photon_eta, 'phi':event.photon_phi} G_2D = ROOT.TVector2( event.photon_pt*cos(event.photon_phi), event.photon_pt*sin(event.photon_phi) ) n_G_2D = ROOT.TVector2( cos(event.photon_phi), sin(event.photon_phi) ) #G_3D = ROOT.TVector2( event.photon_pt*cos(event.photon_phi), event.photon_pt*sin(event.photon_phi) ) #n_G_3D = ROOT.TVector2( cos(event.photon_phi), sin(event.photon_phi) ) # me_x,y met_2D = ROOT.TVector2( event.met_pt*cos(event.met_phi), event.met_pt*sin(event.met_phi) ) event.deltaPhi_G_MET = deltaPhi( G['phi'], event.met_phi ) event.deltaPhi_ll = deltaPhi(event.lep_phi[0], event.lep_phi[1]) event.deltaR_ll = deltaR({'phi':event.lep_phi[0], 'eta':event.lep_eta[0]}, {'phi':event.lep_phi[1], 'eta':event.lep_eta[1]}) ## get jets jetVars = ['eta','pt','phi','btagCSV','id'] jets = filter( isAnalysisJet, [getObjDict(event, 'jet_', jetVars, i) for i in range(int(getVarValue(event, 'njet')))] ) jets.sort( key = lambda l:-l['pt'] ) bJets = filter(lambda j: isBJet(j, tagger = 'CSVv2') and abs(j['eta'])<=2.4, jets ) nonBJets = filter(lambda j: not ( isBJet(j, tagger = 'CSVv2') and abs(j['eta'])<=2.4 ), jets) # take highest-pT b-jet, supplement by non-bjets if there are less than two bj1, bj2 = (bJets+nonBJets)[:2] l_bj1 = ROOT.TLorentzVector() l_bj1.SetPtEtaPhiM( bj1['pt'], bj1['eta'], bj1['phi'], 0 ) l_bj2 = ROOT.TLorentzVector() l_bj2.SetPtEtaPhiM( bj2['pt'], bj2['eta'], bj2['phi'], 0 ) # leptons l_lep1 = ROOT.TLorentzVector() l_lep1.SetPtEtaPhiM( event.lep_pt[0], event.lep_eta[0], event.lep_phi[0], 0 ) lep1 = {'pt':event.lep_pt[0], 'eta':event.lep_eta[0], 'phi':event.lep_phi[0]} l_lep2 = ROOT.TLorentzVector() l_lep2.SetPtEtaPhiM( event.lep_pt[1], event.lep_eta[1], event.lep_phi[1], 0 ) lep2 = {'pt':event.lep_pt[1], 'eta':event.lep_eta[1], 'phi':event.lep_phi[1]} # resolve pairing ambiguity max1 = max([(l_lep1 + l_bj1).M(), (l_lep2 + l_bj2).M()]) max2 = max([(l_lep1 + l_bj2).M(), (l_lep2 + l_bj1).M()]) if max1<max2: #Choose pairing with smaller invariant mass pass else: # switch bj1, bj2 = bj2, bj1 l_bj1, l_bj2 = l_bj2, l_bj1 event.M_lb_max = max(max1, max2) event.M_lb_min = min(max1, max2) # G & leps dPhi_G_l1 = deltaPhi( G['phi'], lep1['phi'] ) dPhi_G_l2 = deltaPhi( G['phi'], lep2['phi'] ) event.dPhi_G_l_max = max(dPhi_G_l1, dPhi_G_l2) event.dPhi_G_l_min = min(dPhi_G_l1, dPhi_G_l2) dR_G_l1 = deltaR( G, lep1 ) dR_G_l2 = deltaR( G, lep2 ) event.dR_G_l_max = max(dR_G_l1, dR_G_l2) event.dR_G_l_min = min(dR_G_l1, dR_G_l2) return
def getGenMatch(lepton, genParticles): # Defaults match = None matchType = None minDeltaR = 9999. isPrompt = False # the full information of the gen match isn't stored in CMG by default. Use mcPt to find all potential matches nReferenceMatches = 0 referenceMatches = [] for p in genParticles: if isclose(p['pt'], lepton['mcPt']): referenceMatches.append(p) nReferenceMatches += 1 # go through all possible reference matches. the right one should be the one on top of the hierarchy that has the right pdgId lastMatch = None if nReferenceMatches > 0: for refMatch in reversed(referenceMatches): if (refMatch['pdgId'] == lepton['pdgId'] ): # and (lastMatch['pdgId'] == refMatch['pdgId']): lastMatch = refMatch if lastMatch: match = lastMatch isPrompt = match["isPromptHard"] minDeltaR = 0 matchType = "reference" # if no match by reference is found, do geometrical matching if not match: genParts = [ p for p in genParticles if abs(p['pdgId']) == abs(lepton['pdgId']) ] for p in genParts: dR = deltaR(lepton, p) if dR < minDeltaR: match, minDeltaR = p, dR matchType = "geometric" #print match, dR if match: isPrompt = match["isPromptHard"] if abs(match['motherId']) == 15: # get the right mother if abs(genParticles[match['motherIndex1']]['pdgId']) == 15: motherIndex = match['motherIndex1'] elif abs(genParticles[match['motherIndex2']]['pdgId']) == 15: motherIndex = match['motherIndex2'] if genParticles[motherIndex]['isPromptHard']: isPrompt = genParticles[motherIndex]['isPromptHard'] if minDeltaR > 0.2: genParts = [p for p in genParticles if p['pdgId'] == 22] for p in genParts: dR = deltaR(lepton, p) if dR < minDeltaR: match, minDeltaR = p, dR matchType = "photon" isPrompt = match['isPromptHard'] return match, isPrompt, matchType