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
示例#2
0
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
示例#3
0
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
示例#4
0
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
        })
示例#5
0
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]})
示例#6
0
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]})
示例#7
0
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())
示例#8
0
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'])
示例#9
0
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'])
示例#11
0
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
示例#12
0
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
示例#13
0
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