def find_jet_pair(tree):
    # Find a pair of two tau jets
    jets = tree.jets
    tau_tags = tree.tauTags
    pair = None
    n_jets = len(jets)
    for i in range(n_jets - 1):
        if tau_tags[i].tag < 0.5:
            continue
        vector1 = utils.get_lorentz_vector(jets[i])
        if not check_deltaR(vector1, tree):
            continue
        if not utils.check_pt(vector1, 15):
            continue
        for j in range(i + 1, n_jets):
            if tau_tags[j].tag < 0.5:
                continue
            vector2 = utils.get_lorentz_vector(jets[j])
            if not check_deltaR(vector2, tree):
                continue
            if not utils.check_pt(vector2, 15):
                continue
            pair = {
                jets[i]: vector1,
                jets[j]: vector2
            }
    return pair
Beispiel #2
0
 def match_neutrino(self, neutrino):
     # Match a tau neutrino to a generator level tau particle
     if self.gen_tau.core.pdgId * neutrino.core.pdgId > 0:
         self.gen_neutrino = neutrino
         self.gen_vector = utils.get_lorentz_vector(self.gen_tau) - utils.get_lorentz_vector(neutrino)
         return True
     return False
Beispiel #3
0
def get_tau_collection(tree):
    # get data from tree
    jets = tree.jets
    tau_tags = tree.tauTags
    gen_particles = tree.skimmedGenParticles
    tau_collection = []

    # loop through reconstructed jets
    for i in range(len(jets)):
        curr_set = {}

        # select only tau-tagged jets
        if tau_tags[i].tag < 0.5:
            continue

        # get lorentz vector of selected jet
        vector = utils.get_lorentz_vector(jets[i])

        # find a matching generator tau particle for reconstructed jet
        for particle in gen_particles:

            # select only taus
            pdg = particle.core.pdgId
            if abs(pdg) == 15:

                # find delta R of tau jet w.r.t generated tau
                deltaR = vector.DeltaR(utils.get_lorentz_vector(particle))

                # select generated tau with small delta R
                if deltaR < 0.05:
                    curr_set = {
                        'gen': particle,
                        'rec': jets[i],
                        'rec_vector': vector
                    }
                    break

        # find corresponding neutrino for gen tau
        if curr_set:
            for particle in gen_particles:

                # select only tau neutrinos
                pdg = particle.core.pdgId
                if abs(pdg) == 16:

                    # check if charges match
                    if pdg * curr_set['gen'].core.pdgId > 0:
                        curr_set.update({'gen_neutrino': particle})

            # add found set into collection
            tau_collection.append(curr_set)

        else:
            print(
                'Reconstructed tau jet found with no matching generator tau particle'
            )

    return tau_collection
Beispiel #4
0
def find_muon_pair_nofilter(tree):
    # Find a pair of two oppositely charged muons (legacy TLorentzVector)
    muons = tree.muons
    pair = None
    n_mu = len(muons)
    for i in range(n_mu - 1):
        vector1 = utils.get_lorentz_vector(muons[i])
        ch1 = muons[i].core.charge
        for j in range(i + 1, n_mu):
            vector2 = utils.get_lorentz_vector(muons[j])
            ch2 = muons[j].core.charge
            if ch1 * ch2 < 0:
                pair = {muons[i]: vector1, muons[j]: vector2}
    return pair
Beispiel #5
0
def get_particle_cone(tree, lorentz_vector, cone_size):
    gen_particles = tree.genParticles
    cone_particles = {}

    # loop through all generator particles
    for gen_particle in gen_particles:
        gen_vector = utils.get_lorentz_vector(gen_particle)

        # pdg = gen_particle.core.pdgId
        status = gen_particle.core.status

        # check if particle is stable
        if status != 1:
            continue

        # find delta R w.r.t given lorentz vector
        deltaR = lorentz_vector.DeltaR(gen_vector)

        # if pdg in [11, 12, -11, -12]:
        #     print('Found ', pdg, ' with delta R ', deltaR, ' and energy ', gen_vector.E())

        # compare delta R to given cone size
        if deltaR < cone_size:
            cone_particles.update({gen_particle: gen_vector})

    return cone_particles
def check_deltaR(vector, tree):
    # compares delta R w.r.t. MC taus
    mc_particles = tree.skimmedGenParticles
    for particle in mc_particles:
        pdg = particle.core.pdgId
        if abs(pdg) == 15:
            deltaR = vector.DeltaR(utils.get_lorentz_vector(particle))
            if deltaR < 0.05:
                return True
    return False
Beispiel #7
0
def get_jetparts(tree, jet):
    vectors = []
    jetparts = tree.jetParts
    begin = jet.particles_begin
    end = jet.particles_end

    for jetpart in jetparts[begin:end]:
        vectors.append(utils.get_lorentz_vector(jetpart))

    return vectors
Beispiel #8
0
 def match_reconstruction(self, jet):
     # Match a reconstructed tau jet to a generator level tau
     if self.rec_taujet:
         return False
     vector = utils.get_lorentz_vector(jet)
     deltaR = self.gen_vector.DeltaR(vector)
     if deltaR < 0.05:
         self.rec_taujet = jet
         self.rec_vector = vector
         return True
     return False
def missing_energy(tree):
    # finds neutrinos from MC particles
    mc_particles = tree.skimmedGenParticles
    neutrinos = {}
    for particle in mc_particles:
        pdg = particle.core.pdgId
        if abs(pdg) in [12, 14, 16]:
            # print(pdg, end=':')
            # print(particle.core.status, end=' ')
            neutrinos.update({particle: utils.get_lorentz_vector(particle)})
    # print('\n', end='')
    return neutrinos
Beispiel #10
0
def find_muon_pair(tree):
    # Find a pair of two oppositely charged muons
    muons = tree.muons
    pair = None
    n_mu = len(muons)
    for i in range(n_mu - 1):
        vector1 = utils.get_lorentz_vector(muons[i])
        if not utils.check_pt(vector1, 15):
            continue
        if not check_isolation(tree, i):
            continue
        ch1 = muons[i].core.charge
        for j in range(i + 1, n_mu):
            vector2 = utils.get_lorentz_vector(muons[j])
            if not utils.check_pt(vector2, 15):
                continue
            if not check_isolation(tree, j):
                continue
            ch2 = muons[j].core.charge
            if ch1 * ch2 < 0:
                pair = {muons[i]: vector1, muons[j]: vector2}
    return pair
Beispiel #11
0
def get_gen_taus(tree):
    gen_particles = tree.genParticles
    taus = []

    # loop through generator particles
    for particle in gen_particles:
        pdg = particle.core.pdgId
        status = particle.core.status

        # find taus
        if abs(pdg) == 15 and status == 2:
            vector = utils.get_lorentz_vector(particle)
            taus.append(vector)
            # print('Found tau: ', pdg, ' with energy ', vector.E())

    return taus
Beispiel #12
0
n_tot = tree.GetEntries()
for event in range(n_tot):
    tree.GetEntry(event)

    # get tau tagged jets
    tau_jets = []
    jets = tree.jets
    tags = tree.tauTags
    n_jets = len(jets)
    for i in range(n_jets):
        if tags[i].tag > 0:
            tau_jets.append(jets[i])

    # get MC taus
    mc_taus = []
    mc_particles = tree.skimmedGenParticles
    for particle in mc_particles:
        pdg = particle.core.pdgId
        if abs(pdg) == 15:
            mc_taus.append(particle)

    # compare tau tagged jets to MC taus
    for tau_jet in tau_jets:
        jet_vector = utils.get_lorentz_vector(tau_jet)
        for mc_tau in mc_taus:
            mc_vector = utils.get_lorentz_vector(mc_tau)
            histogram.Fill(jet_vector.DeltaR(mc_vector))

# write to file
outf.Write()
Beispiel #13
0
def get_gen_tau_mass(tau_set):
    tau_vector = utils.get_lorentz_vector(tau_set['gen'])
    neutrino_vector = utils.get_lorentz_vector(tau_set['gen_neutrino'])
    jet_vector = tau_vector - neutrino_vector
    mass = jet_vector.M()
    return mass
Beispiel #14
0
def get_gen_tau_energy(tau_set):
    tau_vector = utils.get_lorentz_vector(tau_set['gen'])
    neutrino_vector = utils.get_lorentz_vector(tau_set['gen_neutrino'])
    jet_vector = tau_vector - neutrino_vector
    energy = jet_vector.E()
    return energy
Beispiel #15
0
 def visible_pt(self):
     # Return the visible pT of a generator tau
     if not self.gen_tau:
         return None
     vector = utils.get_lorentz_vector(self.gen_tau)
     return utils.get_pt(vector)
Beispiel #16
0
 def create_rec_tau(self, taujet):
     # Create a reconstructed tau jet
     self.rec_taujet = taujet
     self.rec_vector = utils.get_lorentz_vector(taujet)
Beispiel #17
0
 def create_gen_tau(self, tau):
     # Create a generator level tau
     self.gen_tau = tau
     self.gen_vector = utils.get_lorentz_vector(tau)