Exemplo n.º 1
0
def main():
    iFile = TFile(input_file)
    c = iFile.Get('tEvent')

    h = TH1F("bdt", "bdt", 40, -1, 1)
    (univ_testBGHists, univ_trainBGHists, univ_testSignalHists, univ_trainSignalHists, univ_methods, univ_names) = cut_optimisation.get_bdt_hists([univ_bdt])
    univ_trainSignalHist, univ_trainBGHist, univ_testSignalHist, univ_testBGHist = univ_trainSignalHists[0], univ_trainBGHists[0], univ_testSignalHists[0], univ_testBGHists[0]
    univ_highestZ, univ_highestS, univ_highestB, univ_highestMVA, univ_ST, univ_BT = cut_optimisation.getHighestZ(univ_trainSignalHist, univ_trainBGHist, univ_testSignalHist, univ_testBGHist)

    univ_bdt_weights = univ_bdt + "/dataset/weights/TMVAClassification_BDT.weights.xml"
    univ_bdt_vars = cut_optimisation.getVariablesFromXMLWeightsFile(univ_bdt_weights)
    univ_bdt_vars_map = cut_optimisation.getVariablesMemMap(univ_bdt_vars)
    univ_bdt_specs = cut_optimisation.getSpecSpectatorFromXMLWeightsFile(univ_bdt_weights)
    univ_bdt_specs_map = cut_optimisation.getSpectatorsMemMap(univ_bdt_specs)
    univ_bdt_reader = cut_optimisation.prepareReader(univ_bdt_weights, univ_bdt_vars, univ_bdt_vars_map, univ_bdt_specs, univ_bdt_specs_map)

    print "univ_highestMVA=" + str(univ_highestMVA)

    nentries = c.GetEntries()
    print 'Analysing', nentries, "entries"

    total = 0
    passed = 0

    for ientry in range(nentries):
        if ientry % 1000 == 0:
            print "Processing " + str(ientry)
        total += 1
        c.GetEntry(ientry)
        for k, v in univ_bdt_vars_map.items():
            v[0] = eval("c." + k)
        for k, v in univ_bdt_specs_map.items():
            v[0] = eval("c." + k)
        value = univ_bdt_reader.EvaluateMVA("BDT")
        h.Fill(value)
        if value >= univ_highestMVA:
            passed += 1

    print "total=" + str(total)
    print "passed=" + str(passed)

    # Create canvas
    canvas = TCanvas("roc", "roc", 520, 10, 1000, 1000)
    canvas.SetTopMargin(0.5 * canvas.GetTopMargin())
    canvas.SetBottomMargin(1 * canvas.GetBottomMargin())
    canvas.SetLeftMargin(1 * canvas.GetLeftMargin())
    canvas.SetRightMargin(0.5 * canvas.GetRightMargin())

    h.Draw('h')

    canvas.Update()
    canvas.SaveAs(output_file)
Exemplo n.º 2
0
def main():

    if jpsi:
        utils.defaultJetIsoSetting = "NoIso"

    iFile = TFile(input_file, "update")
    #hHt = iFile.Get('hHt')
    tree = iFile.Get('tEvent')
    nentries = tree.GetEntries()

    # CREATE VARS, BRANCHES, AND BDT READERS
    vars["BDT"] = ROOT.std.vector(double)()
    vars["BtagsDeepMedium"] = np.zeros(1, dtype=int)

    if tree.GetBranchStatus("BDT"):
        print "Reseting branch", "BDT"
        branches["BDT"] = tree.GetBranch("BDT")
        branches["BDT"].Reset()
        tree.SetBranchAddress("BDT", vars["BDT"])
    else:
        print "Branching", "BDT"
        branches["BDT"] = tree.Branch("BDT", 'std::vector<double>',
                                      vars["BDT"])
        tree.SetBranchAddress("BDT", vars["BDT"])

    if tree.GetBranchStatus("BtagsDeepMedium"):
        branch = tree.GetBranch("BtagsDeepMedium")
        branch.Reset()
        branch.SetAddress(vars["BtagsDeepMedium"])
    else:
        branches["BtagsDeepMedium"] = tree.Branch("BtagsDeepMedium",
                                                  vars["BtagsDeepMedium"],
                                                  "BtagsDeepMedium/I")

    bdt_weights = bdt + "/dataset/weights/TMVAClassification_BDT.weights.xml"
    bdt_vars = cut_optimisation.getVariablesFromXMLWeightsFile(bdt_weights)
    print "bdt_vars", bdt_vars
    bdt_vars_map = cut_optimisation.getVariablesMemMap(bdt_vars)
    print "bdt_vars_map", bdt_vars_map
    bdt_specs = cut_optimisation.getSpecSpectatorFromXMLWeightsFile(
        bdt_weights)
    print "bdt_specs", bdt_specs
    bdt_specs_map = cut_optimisation.getSpectatorsMemMap(bdt_specs)
    print "bdt_specs_map", bdt_specs_map
    bdt_reader = cut_optimisation.prepareReader(bdt_weights, bdt_vars,
                                                bdt_vars_map, bdt_specs,
                                                bdt_specs_map)

    bdt_vars_maps["BDT"] = bdt_vars_map
    bdt_specs_maps["BDT"] = bdt_specs_map
    bdt_readers["BDT"] = bdt_reader

    print 'Analysing', nentries, "entries"

    iFile.cd()

    for ientry in range(nentries):
        if ientry % 1000 == 0:
            print "Processing " + str(ientry) + " out of " + str(nentries)
        tree.GetEntry(ientry)

        c = tree

        vars["BDT"] = ROOT.std.vector(double)()

        nj, btagsDeepMedium, ljet = analysis_ntuples.eventNumberOfJets25Pt2_4Eta_DeepMedium(
            c.Jets, c.Jets_bJetTagDeepCSVBvsAll)
        if nj is None or btagsDeepMedium is None:
            btagsDeepMedium = 0
        vars["BtagsDeepMedium"][0] = btagsDeepMedium

        for i in range(c.invMass.size()):

            tagMuonIdx = c.tagMuon[i]
            probeTrackIdx = c.probeTrack[i]

            tagMuon = c.Muons[tagMuonIdx]
            probeTrack = c.tracks[probeTrackIdx]

            if not (probeTrack.Pt() < 3 and abs(probeTrack.Eta()) >= 1.2
                    and abs(probeTrack.Eta()) <= 2.4):
                vars["BDT"].push_back(1)
            else:
                for k, v in bdt_vars_maps["BDT"].items():
                    #print "********"
                    if analysis_ntuples.commonFlatObs.get(k) is not None:
                        v[0] = eval("tree." + k)
                    elif analysis_ntuples.muonsObs.get(k) is not None:
                        if analysis_ntuples.muonsObs.get(k) == "bool":
                            v[0] = bool(eval("tree." + k)[tagMuonIdx])
                        else:
                            #print "eval(tree." + k + ")", eval("tree." + k + "[" + str(tagMuonIdx) + "]"), tagMuonIdx
                            v[0] = eval("tree." + k)[tagMuonIdx]
                    elif utils.commonObservablesDTypesList.get(k) is not None:
                        v[0] = eval("tree." + k)[i]
                    elif "tagMuon" in k:
                        #print "eval(" + k + ")", eval(k)
                        v[0] = eval(k)
                    else:
                        print "WTF", k
                        exit(1)
                bdt_score = bdt_readers["BDT"].EvaluateMVA("BDT")
                #print bdt_specs_maps["BDT"]
                #print "bdt_score", bdt_score
                vars["BDT"].push_back(bdt_score)

        tree.SetBranchAddress("BDT", vars["BDT"])
        branches["BDT"].Fill()
        branches["BtagsDeepMedium"].Fill()

    tree.Write("tEvent", TObject.kOverwrite)

    print "DONE SKIMMING"
    iFile.Close()
Exemplo n.º 3
0
def main():
    iFile = TFile(input_file)
    #hHt = iFile.Get('hHt')
    c = iFile.Get('tEvent')

    triggerFileName = os.path.expandvars(
        "$CMSSW_BASE/src/cms-tools/lib/susy-trig-plots.root")
    print "Opening trigger file: " + triggerFileName

    triggerFile = TFile(triggerFileName, "read")

    tEffhMetMhtRealXMet2016 = analysis_ntuples.getTrigEffGraph(
        triggerFile, 'tEffhMetMhtRealXMet;1')
    tEffhMetMhtRealXMet2017 = analysis_ntuples.getTrigEffGraph(
        triggerFile, 'tEffhMetMhtRealXMet;2')
    tEffhMetMhtRealXMet2018 = analysis_ntuples.getTrigEffGraph(
        triggerFile, 'tEffhMetMhtRealXMet;3')

    tEffhMetMhtRealXMht2016 = analysis_ntuples.getTrigEffGraph(
        triggerFile, 'tEffhMetMhtRealXMht;1')
    tEffhMetMhtRealXMht2017 = analysis_ntuples.getTrigEffGraph(
        triggerFile, 'tEffhMetMhtRealXMht;2')
    tEffhMetMhtRealXMht2018 = analysis_ntuples.getTrigEffGraph(
        triggerFile, 'tEffhMetMhtRealXMht;3')

    tree = c.CloneTree(0)
    tree.SetDirectory(0)
    var_dilepBDT = np.zeros(1, dtype=float)

    var_leptons_ParentPdgId = ROOT.std.vector(int)()
    var_leptonParentPdgId = np.zeros(1, dtype=int)
    var_trackParentPdgId = np.zeros(1, dtype=int)

    var_trackParentPdgId = np.zeros(1, dtype=int)

    var_tEffhMetMhtRealXMet2016 = np.zeros(1, dtype=float)
    var_tEffhMetMhtRealXMet2017 = np.zeros(1, dtype=float)
    var_tEffhMetMhtRealXMet2018 = np.zeros(1, dtype=float)

    var_tEffhMetMhtRealXMht2016 = np.zeros(1, dtype=float)
    var_tEffhMetMhtRealXMht2017 = np.zeros(1, dtype=float)
    var_tEffhMetMhtRealXMht2018 = np.zeros(1, dtype=float)

    var_passedMhtMet6pack = np.zeros(1, dtype=bool)

    var_tautau = np.zeros(1, dtype=bool)
    var_rr = np.zeros(1, dtype=bool)
    var_rf = np.zeros(1, dtype=bool)
    var_ff = np.zeros(1, dtype=bool)
    var_sc = np.zeros(1, dtype=bool)
    var_n_body = np.zeros(1, dtype=bool)
    var_tc = np.zeros(1, dtype=bool)
    var_other = np.zeros(1, dtype=bool)

    var_omega = np.zeros(1, dtype=bool)
    var_rho_0 = np.zeros(1, dtype=bool)
    var_eta = np.zeros(1, dtype=bool)
    var_phi = np.zeros(1, dtype=bool)
    var_eta_prime = np.zeros(1, dtype=bool)
    var_j_psi = np.zeros(1, dtype=bool)
    var_upsilon_1 = np.zeros(1, dtype=bool)
    var_upsilon_2 = np.zeros(1, dtype=bool)

    tree.Branch('dilepBDT', var_dilepBDT, 'dilepBDT/D')

    tree.Branch('tEffhMetMhtRealXMet2016', var_tEffhMetMhtRealXMet2016,
                'tEffhMetMhtRealXMet2016/D')
    tree.Branch('tEffhMetMhtRealXMet2017', var_tEffhMetMhtRealXMet2017,
                'tEffhMetMhtRealXMet2017/D')
    tree.Branch('tEffhMetMhtRealXMet2018', var_tEffhMetMhtRealXMet2018,
                'tEffhMetMhtRealXMet2018/D')

    tree.Branch('tEffhMetMhtRealXMht2016', var_tEffhMetMhtRealXMht2016,
                'tEffhMetMhtRealXMht2016/D')
    tree.Branch('tEffhMetMhtRealXMht2017', var_tEffhMetMhtRealXMht2017,
                'tEffhMetMhtRealXMht2017/D')
    tree.Branch('tEffhMetMhtRealXMht2018', var_tEffhMetMhtRealXMht2018,
                'tEffhMetMhtRealXMht2018/D')

    tree.Branch('passedMhtMet6pack', var_passedMhtMet6pack,
                'passedMhtMet6pack/b')

    if not data:
        if two_leptons:
            print "TWO_LEPTONS!"
            tree.Branch('leptons_ParentPdgId', 'std::vector<int>',
                        var_leptons_ParentPdgId)

            if bg:
                tree.Branch('tautau', var_tautau, 'tautau/b')
                tree.Branch('rr', var_rr, 'rr/b')
                tree.Branch('rf', var_rf, 'rf/b')
                tree.Branch('ff', var_ff, 'ff/b')
                tree.Branch('sc', var_sc, 'sc/b')
                tree.Branch('n_body', var_n_body, 'n_body/b')
                tree.Branch('tc', var_tc, 'tc/b')
                tree.Branch('other', var_other, 'other/b')

                tree.Branch('omega', var_omega, 'omega/b')
                tree.Branch('rho_0', var_rho_0, 'rho_0/b')
                tree.Branch('eta', var_eta, 'eta/b')
                tree.Branch('phi', var_phi, 'phi/b')
                tree.Branch('eta_prime', var_eta_prime, 'eta_prime/b')
                tree.Branch('j_psi', var_j_psi, 'j_psi/b')
                tree.Branch('upsilon_1', var_upsilon_1, 'upsilon_1/b')
                tree.Branch('upsilon_2', var_upsilon_2, 'upsilon_2/b')
        else:
            tree.Branch('leptonParentPdgId', var_leptonParentPdgId,
                        'leptonParentPdgId/I')
            tree.Branch('trackParentPdgId', var_trackParentPdgId,
                        'trackParentPdgId/I')

    nentries = c.GetEntries()
    print 'Analysing', nentries, "entries"

    (univ_testBGHists, univ_trainBGHists, univ_testSignalHists,
     univ_trainSignalHists, univ_methods,
     univ_names) = cut_optimisation.get_bdt_hists([univ_bdt])
    univ_trainSignalHist, univ_trainBGHist, univ_testSignalHist, univ_testBGHist = univ_trainSignalHists[
        0], univ_trainBGHists[0], univ_testSignalHists[0], univ_testBGHists[0]
    univ_highestZ, univ_highestS, univ_highestB, univ_highestMVA, univ_ST, univ_BT = cut_optimisation.getHighestZ(
        univ_trainSignalHist, univ_trainBGHist, univ_testSignalHist,
        univ_testBGHist)

    univ_bdt_weights = univ_bdt + "/dataset/weights/TMVAClassification_BDT.weights.xml"
    univ_bdt_vars = cut_optimisation.getVariablesFromXMLWeightsFile(
        univ_bdt_weights)
    univ_bdt_vars_map = cut_optimisation.getVariablesMemMap(univ_bdt_vars)
    univ_bdt_specs = cut_optimisation.getSpecSpectatorFromXMLWeightsFile(
        univ_bdt_weights)
    univ_bdt_specs_map = cut_optimisation.getSpectatorsMemMap(univ_bdt_specs)
    print univ_bdt_vars
    print univ_bdt_vars_map
    print univ_bdt_specs
    print univ_bdt_specs_map
    univ_bdt_reader = cut_optimisation.prepareReader(univ_bdt_weights,
                                                     univ_bdt_vars,
                                                     univ_bdt_vars_map,
                                                     univ_bdt_specs,
                                                     univ_bdt_specs_map)

    print "-------------------"

    print "univ_highestZ=" + str(univ_highestZ)
    print "univ_highestS=" + str(univ_highestS)
    print "univ_highestB=" + str(univ_highestB)
    print "univ_highestMVA=" + str(univ_highestMVA)
    print "univ_ST=" + str(univ_ST)
    print "univ_BT=" + str(univ_BT)

    print "-------------------"

    for ientry in range(nentries):
        if ientry % 1000 == 0:
            print "Processing " + str(ientry) + " out of " + str(nentries)
        c.GetEntry(ientry)

        for k, v in univ_bdt_vars_map.items():
            v[0] = eval("c." + k)
        dilep_tmva_value = univ_bdt_reader.EvaluateMVA("BDT")
        # Selection
        #if dilep_tmva_value < -0.3 or c.Met < 200 or c.univBDT < -0.4 or c.tracks[0].Pt() < 3 or c.tracks[0].Pt() > 15 or c.tracks_dzVtx[0] > 0.1 or c.tracks_dxyVtx[0] > 0.1 or abs(c.tracks[0].Eta()) > 2.4:
        #if dilep_tmva_value < -0.3 or c.Met < 200 or c.univBDT < -0.4 or c.tracks[0].Pt() < 3 or c.tracks[0].Pt() > 15 or abs(c.tracks[0].Eta()) > 2.4:
        #    continue
        #if c.Mht < 200:
        #    continue
        var_dilepBDT[0] = dilep_tmva_value

        if not data:
            gens = [i for i in range(c.GenParticles.size())]
            #print "c.GenParticles.size() ", c.GenParticles.size(), gens
            if two_leptons:
                if bg:
                    var_tautau[0] = False
                    var_rr[0] = False
                    var_rf[0] = False
                    var_ff[0] = False
                    var_sc[0] = False
                    var_n_body[0] = False
                    var_tc[0] = False
                    var_other[0] = False

                    var_omega[0] = False
                    var_rho_0[0] = False
                    var_eta[0] = False
                    var_phi[0] = False
                    var_eta_prime[0] = False
                    var_j_psi[0] = False
                    var_upsilon_1[0] = False
                    var_upsilon_2[0] = False
                var_leptons_ParentPdgId = ROOT.std.vector(int)()
                lepCans = []
                numRealLeptons = 0

                for i in range(c.leptons.size()):
                    lepton = c.leptons[i]
                    min, minCan = analysis_ntuples.minDeltaRGenParticles(
                        lepton, gens, c.GenParticles)
                    pdgId = c.GenParticles_ParentId[minCan]
                    if min > 0.01:
                        #print "BAD GEN!!! ", min
                        pdgId = 0
                    else:
                        if ((abs(c.GenParticles_PdgId[minCan]) == 13
                             and c.leptonFlavour == "Muons") or
                            (abs(c.GenParticles_PdgId[minCan]) == 11
                             and c.leptonFlavour
                             == "Electrons")) and c.leptons_charge[
                                 i] * c.GenParticles_PdgId[minCan] < 0:
                            numRealLeptons += 1
                            lepCans.append(minCan)
                        else:
                            #print "BAD GEN MATCH! "
                            pdgId = 0
                        # parentIdx = c.GenParticles_ParentIdx[minCan]


#                         if c.GenParticles_PdgId[parentIdx] != pdgId:
#                             print "WHAT?!?! ******** c.GenParticles_PdgId[parentIdx]", c.GenParticles_PdgId[parentIdx], "pdgId", pdgId, "parentIdx", parentIdx
#                             print "c.GenParticles_ParentId[minCan]", c.GenParticles_ParentId[minCan], "c.GenParticles_PdgId[parentIdx]", c.GenParticles_PdgId[parentIdx]
                    var_leptons_ParentPdgId.push_back(pdgId)
                tree.SetBranchAddress('leptons_ParentPdgId',
                                      var_leptons_ParentPdgId)
                if bg:
                    if numRealLeptons == 0:
                        var_ff[0] = True
                    elif numRealLeptons == 1:
                        var_rf[0] = True
                    else:
                        var_rr[0] = True
                        if abs(var_leptons_ParentPdgId[0]) == abs(
                                var_leptons_ParentPdgId[1]) == 15:
                            var_tautau[0] = True

                        parentIdx = c.GenParticles_ParentIdx[lepCans[0]]
                        parentIdx2 = c.GenParticles_ParentIdx[lepCans[1]]
                        if parentIdx == -1 and parentIdx2 == -1:
                            var_other[0] = True
                            if abs(var_leptons_ParentPdgId[0]) == abs(
                                    var_leptons_ParentPdgId[1]) == 223:
                                var_omega[0] = True
                            elif abs(var_leptons_ParentPdgId[0]) == abs(
                                    var_leptons_ParentPdgId[1]) == 113:
                                var_rho_0[0] = True
                            elif abs(var_leptons_ParentPdgId[0]) == abs(
                                    var_leptons_ParentPdgId[1]) == 221:
                                var_eta[0] = True
                            elif abs(var_leptons_ParentPdgId[0]) == abs(
                                    var_leptons_ParentPdgId[1]) == 333:
                                var_phi[0] = True
                            elif abs(var_leptons_ParentPdgId[0]) == abs(
                                    var_leptons_ParentPdgId[1]) == 331:
                                var_eta_prime[0] = True
                            elif abs(var_leptons_ParentPdgId[0]) == abs(
                                    var_leptons_ParentPdgId[1]) == 443:
                                var_j_psi[0] = True
                            elif abs(var_leptons_ParentPdgId[0]) == abs(
                                    var_leptons_ParentPdgId[1]) == 553:
                                var_upsilon_1[0] = True
                            elif abs(var_leptons_ParentPdgId[0]) == abs(
                                    var_leptons_ParentPdgId[1]) == 100553:
                                var_upsilon_2[0] = True
                        else:
                            if c.GenParticles_ParentIdx[
                                    lepCans[0]] == c.GenParticles_ParentIdx[
                                        lepCans[1]]:
                                numOfParentChildren = 0
                                for i in range(c.GenParticles.size()):
                                    if c.GenParticles_Status[
                                            i] == 1 and c.GenParticles_ParentIdx[
                                                i] == parentIdx:
                                        numOfParentChildren += 1
                                #print "numOfParentChildren=", numOfParentChildren, "var_leptons_ParentPdgId[0]", var_leptons_ParentPdgId[0], "c.GenParticles_PdgId[parentIdx]", c.GenParticles_PdgId[parentIdx], "c.GenParticles_PdgId[parentIdx2]", c.GenParticles_PdgId[parentIdx2]
                                #print lepCans
                                if numOfParentChildren == 2:
                                    var_sc[0] = True
                                    if abs(c.GenParticles_PdgId[parentIdx]
                                           ) == 223:
                                        var_omega[0] = True
                                    elif abs(c.GenParticles_PdgId[parentIdx]
                                             ) == 113:
                                        var_rho_0[0] = True
                                    elif abs(c.GenParticles_PdgId[parentIdx]
                                             ) == 221:
                                        var_eta[0] = True
                                    elif abs(c.GenParticles_PdgId[parentIdx]
                                             ) == 333:
                                        var_phi[0] = True
                                    elif abs(c.GenParticles_PdgId[parentIdx]
                                             ) == 331:
                                        var_eta_prime[0] = True
                                    elif abs(c.GenParticles_PdgId[parentIdx]
                                             ) == 443:
                                        var_j_psi[0] = True
                                    elif abs(c.GenParticles_PdgId[parentIdx]
                                             ) == 553:
                                        var_upsilon_1[0] = True
                                    elif abs(c.GenParticles_PdgId[parentIdx]
                                             ) == 100553:
                                        var_upsilon_2[0] = True
                                else:
                                    var_n_body[0] = True
                            else:
                                var_tc[0] = True
            else:
                min, minCan = analysis_ntuples.minDeltaRGenParticles(
                    c.lepton, gens, c.GenParticles)
                #print min, m inCan
                pdgId = c.GenParticles_ParentId[minCan]
                if min > 0.05:
                    #   print "BAD GEN LEPTON!!!"
                    pdgId = 0
                #else:
                #    print "GOOD LEPTON ", pdgId
                var_leptonParentPdgId[0] = pdgId
                min, minCan = analysis_ntuples.minDeltaRGenParticles(
                    c.track, gens, c.GenParticles)
                pdgId = c.GenParticles_ParentId[minCan]
                if min > 0.05:
                    #print "BAD GEN TRACK!!!"
                    pdgId = 0
                #else:
                #    print "GOOD TRACK ", pdgId
                var_trackParentPdgId[0] = pdgId
        if not data:
            var_tEffhMetMhtRealXMet2016[0] = tEffhMetMhtRealXMet2016.Eval(
                c.Met)
            var_tEffhMetMhtRealXMet2017[0] = tEffhMetMhtRealXMet2017.Eval(
                c.Met)
            var_tEffhMetMhtRealXMet2018[0] = tEffhMetMhtRealXMet2018.Eval(
                c.Met)

            var_tEffhMetMhtRealXMht2016[0] = tEffhMetMhtRealXMht2016.Eval(
                c.Mht)
            var_tEffhMetMhtRealXMht2017[0] = tEffhMetMhtRealXMht2017.Eval(
                c.Mht)
            var_tEffhMetMhtRealXMht2018[0] = tEffhMetMhtRealXMht2018.Eval(
                c.Mht)

            var_passedMhtMet6pack[0] = True

            #if c.Met < 200:
            #    print "HERE:", var_tEffhMetMhtRealXMet2016[0]
        else:
            print "ELSE!!"
            var_tEffhMetMhtRealXMet2016[0] = 1
            var_tEffhMetMhtRealXMet2017[0] = 1
            var_tEffhMetMhtRealXMet2018[0] = 1

            var_tEffhMetMhtRealXMht2016[0] = 1
            var_tEffhMetMhtRealXMht2017[0] = 1
            var_tEffhMetMhtRealXMht2018[0] = 1

            var_passedMhtMet6pack[0] = analysis_ntuples.passTrig(
                c, "MhtMet6pack")

        tree.Fill()

    print "DONE SKIMMING"
    if iFile.GetListOfKeys().Contains("lumiSecs") or tree.GetEntries() != 0:
        fnew = TFile(output_file, 'recreate')
        tree.Write()
        print "Done writing tree..."
        if iFile.GetListOfKeys().Contains("lumiSecs"):
            lumiSecs = iFile.Get("lumiSecs")
            lumiSecs.Write("lumiSecs")
        #hHt.Write()
        fnew.Close()
    else:
        print "*** RESULT EMPTY"
    iFile.Close()
def main():
    
    if jpsi:
        utils.defaultJetIsoSetting = "NoIso"
    
    iFile = TFile(input_file, "update")
    #hHt = iFile.Get('hHt')
    tree = iFile.Get('tEvent')
    nentries = tree.GetEntries()
    
    # CREATE VARS, BRANCHES, AND BDT READERS
              
    for iso in utils.leptonIsolationList:
        for cat in utils.leptonIsolationCategories:
            
            ptRanges = [""]
            drCuts = [""]
            if iso == "CorrJetIso":
                ptRanges = utils.leptonCorrJetIsoPtRange
                drCuts = utils.leptonCorrJetIsoDrCuts
            for ptRange in ptRanges:
                for drCut in drCuts:
                    cuts = ""
                    if len(str(ptRange)) > 0:
                        cuts = str(ptRange) + "Dr" + str(drCut)
                
                    postfixi = [iso + cuts + cat]
                    
                    if iso + str(ptRange) + cat == utils.defaultJetIsoSetting:
                        postfixi = [iso + cuts + cat, ""]
                
                    for postfix in postfixi:
                
                        for DTypeObs in analysis_observables.commonPostBdtObservablesDTypesList:
                            for prefix in ["", "exTrack_"]:
                                sameChargeOptions = [False, True] if prefix == "exTrack_" else [False]
                            
                                for sameCharge in sameChargeOptions:
                            
                                    sc_prefix = "sc_" if sameCharge else ""
                            
                                    vars[sc_prefix + prefix + DTypeObs + postfix] = np.zeros(1,dtype=analysis_observables.commonPostBdtObservablesDTypesList[DTypeObs])
                                    if tree.GetBranchStatus(sc_prefix + prefix + DTypeObs + postfix):
                                        print "Reseting branch", sc_prefix + prefix + DTypeObs + postfix
                                        branches[sc_prefix + prefix + DTypeObs + postfix] = tree.GetBranch(sc_prefix + prefix + DTypeObs + postfix)
                                        branches[sc_prefix + prefix + DTypeObs + postfix].Reset()
                                        tree.SetBranchAddress(sc_prefix + prefix + DTypeObs + postfix, vars[sc_prefix + prefix + DTypeObs + postfix])
                                    else:
                                        print "Branching", sc_prefix + prefix + DTypeObs + postfix
                                        branches[sc_prefix + prefix + DTypeObs + postfix] = tree.Branch(sc_prefix + prefix + DTypeObs + postfix, vars[sc_prefix + prefix + DTypeObs + postfix], sc_prefix + prefix + DTypeObs + postfix + "/" + utils.typeTranslation[analysis_observables.commonPostBdtObservablesDTypesList[DTypeObs]])
                                        tree.SetBranchAddress(sc_prefix + prefix + DTypeObs + postfix, vars[sc_prefix + prefix + DTypeObs + postfix])
                                
                        for DTypeObs in analysis_observables.exclusiveTrackPostBdtObservablesDTypesList:
                        
                            for sameCharge in [False, True]:
                                sc_prefix = "sc_" if sameCharge else ""
                            
                                vars[sc_prefix + DTypeObs + postfix] = np.zeros(1,dtype=analysis_observables.exclusiveTrackPostBdtObservablesDTypesList[DTypeObs])
                                if tree.GetBranchStatus(sc_prefix + DTypeObs + postfix):
                                    print "Reseting branch", sc_prefix + DTypeObs + postfix
                                    branches[sc_prefix + DTypeObs + postfix] = tree.GetBranch(sc_prefix + DTypeObs + postfix)
                                    branches[sc_prefix + DTypeObs + postfix].Reset()
                                    tree.SetBranchAddress(sc_prefix + DTypeObs + postfix, vars[sc_prefix + DTypeObs + postfix])
                                else:
                                    print "Branching", sc_prefix + DTypeObs + postfix
                                    branches[sc_prefix + DTypeObs + postfix] = tree.Branch(sc_prefix + DTypeObs + postfix, vars[sc_prefix + DTypeObs + postfix], sc_prefix + DTypeObs + postfix + "/" + utils.typeTranslation[analysis_observables.exclusiveTrackPostBdtObservablesDTypesList[DTypeObs]])
                                    tree.SetBranchAddress(sc_prefix + DTypeObs + postfix, vars[sc_prefix + DTypeObs + postfix])
                
                    if not jpsi:    
                        for prefix in ["reco", "exTrack"]:
                            for lep in ["Muons", "Electrons"]:
                                dirname = prefix + lep + iso + cat + cuts
                                name = prefix + lep + iso + cuts + cat
                                bdt_weights = bdt + "/" + dirname + "/dataset/weights/TMVAClassification_" + name + ".weights.xml"
                                bdt_vars = cut_optimisation.getVariablesFromXMLWeightsFile(bdt_weights)
                                bdt_vars_map = cut_optimisation.getVariablesMemMap(bdt_vars)
                                bdt_specs = cut_optimisation.getSpecSpectatorFromXMLWeightsFile(bdt_weights)
                                bdt_specs_map = cut_optimisation.getSpectatorsMemMap(bdt_specs)
                                bdt_reader = cut_optimisation.prepareReader(bdt_weights, bdt_vars, bdt_vars_map, bdt_specs, bdt_specs_map)

                                bdt_vars_maps[prefix + lep + iso + cuts + cat] = bdt_vars_map
                                bdt_specs_maps[prefix + lep + iso + cuts + cat] = bdt_specs_map
                                bdt_readers[prefix + lep + iso + cuts + cat] = bdt_reader

    print 'Analysing', nentries, "entries"
    
    iFile.cd()

    for ientry in range(nentries):
        if ientry % 1000 == 0:
            print "Processing " + str(ientry) + " out of " + str(nentries)
        tree.GetEntry(ientry)
        
        for iso in utils.leptonIsolationList:
            for cat in utils.leptonIsolationCategories:
                ptRanges = [""]
                drCuts = [""]
                if iso == "CorrJetIso":
                    ptRanges = utils.leptonCorrJetIsoPtRange
                    drCuts = utils.leptonCorrJetIsoDrCuts
                for ptRange in ptRanges:
                    for drCut in drCuts:
                        cuts = ""
                        if len(str(ptRange)) > 0:
                            cuts = str(ptRange) + "Dr" + str(drCut)
                
                        postfixi = [iso + cuts + cat]
                    
                        if iso + str(ptRange) + cat == utils.defaultJetIsoSetting:
                            postfixi = [iso + cuts + cat, ""]
                
                        for postfix in postfixi:
                            for prefix in ["reco", "exTrack"]:
                                prefixVars = ""
                            
                                if prefix == "exTrack":
                                    prefixVars = "exTrack_"
                            
                                sameChargeOptions = [False, True] if prefix == "exTrack" else [False]
                            
                                for sameCharge in sameChargeOptions:
                            
                                    sc_prefix = "sc_" if sameCharge else ""
                            
                                    eventPassed = False
                                    leptonFlavour = ""
                                    if prefix == "reco":
                                        #if eval("tree.twoLeptons"  + postfix) == 1 and tree.BTagsDeepMedium == 0 and eval("tree.leptons"  + postfix).size() == 2:
                                        
                                        if getattr(tree, "twoLeptons"  + postfix) == 1 and getattr(tree, "leptons"  + postfix).size() == 2:
                                            eventPassed = True
                                            leptonFlavour = getattr(tree, "leptonFlavour"  + postfix)
                                    # Before
                                    #elif eval("tree." + sc_prefix + "exclusiveTrack"  + postfix) == 1 and tree.BTagsDeepMedium == 0 and eval("tree." + sc_prefix + "trackBDT"  + postfix) >= 0:
                                    # Making new version without trackBDT precut
                                    elif getattr(tree, sc_prefix + "exclusiveTrack"  + postfix) == 1 and tree.BTagsDeepMedium == 0:
                                        eventPassed = True
                                        leptonFlavour = getattr(tree, sc_prefix + "exclusiveTrackLeptonFlavour"  + postfix)
                                    if not jpsi and eventPassed:
                                        leptonFlavour = str(leptonFlavour)
                                        name = prefix + leptonFlavour + postfix
                                        #print bdt_vars_maps[prefix + postfix]
                                        #print name, eval("tree.twoLeptons"  + postfix), eval("tree.exclusiveTrack"  + postfix)
                                        for k, v in bdt_vars_maps[prefix + leptonFlavour + iso + cuts + cat].items():
                                            #print k, v
                                            try:
                                                if k in analysis_observables.dileptonBDTeventObservables:
                                                    if k == "LeadingJet.Eta()":
                                                        v[0] = eval("tree.LeadingJet.Eta()")
                                                    else:
                                                        #print "getattr(tree, k)", k
                                                        v[0] = getattr(tree, k)
                                                else:
                                                    #print k, " not in analysis_observables.dileptonBDTeventObservables"
                                                    #print "eval", "tree." + sc_prefix  + k
                                                    #print "getattr(tree, sc_prefix + k)", sc_prefix + k
                                                    if "[" in k:
                                                        #print "Special stuff"
                                                        (basenameK, postfixK) = k.split("[")
                                                        #print basenameK, postfixK
                                                        branch = getattr(tree, sc_prefix + basenameK)
                                                        #print "branch", branch
                                                        #print "Going to eval", "branch[" + postfixK
                                                        v[0] = eval("branch[" + postfixK)
                                                        #print "After", v[0]
                                                    elif "()" in k:
                                                        #print "Special stuff"
                                                        (basenameK, postfixK) = k.rsplit(".", 1)
                                                        #print basenameK, postfixK
                                                        branch = getattr(tree, sc_prefix + basenameK)
                                                        #print "branch", branch
                                                        #print "Going to eval", "branch." + postfixK
                                                        v[0] = eval("branch." + postfixK)
                                                        #print "After", v[0]
                                                    else:
                                                        v[0] = getattr(tree, sc_prefix + k)
                                                
                                            except Exception as e:
                                                print "exception", e
                                                print ientry, k, name, getattr(tree, "twoLeptons"  + iso + cuts + cat), getattr(tree, "exclusiveTrack"  + iso + cuts + cat)
                                                print "ERROR!!! GIVING UP..."
                                                exit(0)
                                        for k, v in bdt_specs_maps[prefix + leptonFlavour + iso + cuts + cat].items():
                                            if data and k == "Weight":
                                                v[0] = 1
                                            else:
                                                v[0] = getattr(tree, k)
                                     
                                        vars[sc_prefix + prefixVars + "dilepBDT" + postfix][0] = bdt_readers[prefix + leptonFlavour+ iso + cuts + cat].EvaluateMVA("BDT")
                                        #if sc_prefix == "sc_" and postfix == "" and prefixVars == "exTrack_":
                                        #    print "Getting BDT score", sc_prefix + prefixVars + "dilepBDT" + postfix, vars[sc_prefix + prefixVars + "dilepBDT" + postfix][0]
                                            #print bdt_vars_maps
                                    else:
                                        vars[sc_prefix + prefixVars + "dilepBDT" + postfix][0] = -1

                                    if signal and getattr(tree, sc_prefix + "exclusiveTrack"  + postfix) == 1:
                                        gens = [i for i in range(tree.GenParticles.size())]
                                        min, minCan = analysis_ntuples.minDeltaRGenParticles(getattr(tree, sc_prefix + "lepton" + postfix), gens, tree.GenParticles)
                                        #print min, minCan
                                        pdgId = tree.GenParticles_ParentId[minCan]
                                        if minCan is None or min > 0.05:
                                         #   print "BAD GEN LEPTON!!!"
                                            pdgId = 0
                                        #else:
                                        #    print "GOOD LEPTON ", pdgId
                                        vars[sc_prefix + "leptonParentPdgId" + postfix][0] = pdgId
                                        min, minCan = analysis_ntuples.minDeltaRGenParticles(getattr(tree, sc_prefix + "track"+ postfix), gens, tree.GenParticles)
                                        pdgId = tree.GenParticles_ParentId[minCan]
                                        if min > 0.05:
                                            #print "BAD GEN TRACK!!!"
                                            pdgId = 0
                                        #else:
                                        #    print "GOOD TRACK ", pdgId
                                        vars[sc_prefix + "trackParentPdgId" + postfix][0] = pdgId
                                    else:
                                        vars[sc_prefix + "leptonParentPdgId" + postfix][0] = -1
                                        vars[sc_prefix + "trackParentPdgId" + postfix][0] = -1
                            
                            for DTypeObs in analysis_observables.commonPostBdtObservablesDTypesList:
                                for prefix in ["", "exTrack_"]:
                                    sameChargeOptions = [False, True] if prefix == "exTrack_" else [False]
                            
                                    for sameCharge in sameChargeOptions:
                                        sc_prefix = "sc_" if sameCharge else ""
                                        branches[sc_prefix + prefix + DTypeObs + postfix].Fill()
                        
                            for DTypeObs in analysis_observables.exclusiveTrackPostBdtObservablesDTypesList:
                                for sameCharge in [False, True]:
                                    sc_prefix = "sc_" if sameCharge else ""
                                    branches[sc_prefix + DTypeObs + postfix].Fill()
            
    tree.Write("tEvent",TObject.kOverwrite)
        
    print "DONE SKIMMING"
    iFile.Close()
Exemplo n.º 5
0
def main():
    
    if jpsi:
        utils.defaultJetIsoSetting = "NoIso"
    
    file = TFile(input_file, "update")
    
    c = file.Get("tEvent")
    nentries = c.GetEntries()
    
    # CREATE VARS, BRANCHES, AND BDT READERS
    
    for iso in utils.leptonIsolationList:
        for cat in utils.leptonIsolationCategories:
            ptRanges = [""]
            drCuts  = [""]

            if iso == "CorrJetIso":
                ptRanges = utils.leptonCorrJetIsoPtRange
                drCuts = utils.leptonCorrJetIsoDrCuts
            for ptRange in ptRanges:
                for drCut in drCuts:
                    cuts = ""
                    if len(str(ptRange)) > 0:
                        cuts = str(ptRange) + "Dr" + str(drCut)

                    postfixi = [iso + cuts + cat]
                    
                    if iso + cuts + cat == utils.defaultJetIsoSetting:
                        postfixi = [iso + cuts + cat, ""]
                
                    for postfix in postfixi:
                        for sameCharge in [False, True]:
                            prefix = "sc_" if sameCharge else ""
                            for stringObs in analysis_observables.exclusiveTrackObservablesStringList:
                                exTrackVars[prefix + stringObs + postfix] = cppyy.gbl.std.string("")
                                if c.GetBranchStatus(prefix + stringObs + postfix):
                                    print("Reseting branch", prefix + stringObs + postfix)
                                    branches[prefix + stringObs + postfix] = c.GetBranch(prefix + stringObs + postfix)
                                    branches[prefix + stringObs + postfix].Reset()
                                    c.SetBranchAddress(prefix + stringObs + postfix, exTrackVars[prefix + stringObs + postfix])
                                else:
                                    print("Branching", prefix + stringObs + postfix)
                                    branches[prefix + stringObs + postfix] = c.Branch(prefix + stringObs + postfix, 'std::string', exTrackVars[prefix + stringObs + postfix])
                                    c.SetBranchAddress(prefix + stringObs + postfix, exTrackVars[prefix + stringObs + postfix])
                            for DTypeObs in analysis_observables.commonObservablesDTypesList:
                                exTrackVars[prefix + "exTrack_" + DTypeObs + postfix] = np.zeros(1,dtype=analysis_observables.commonObservablesDTypesList[DTypeObs])
                                if c.GetBranchStatus(prefix + "exTrack_" + DTypeObs + postfix):
                                    print("Reseting branch", prefix + "exTrack_" + DTypeObs + postfix)
                                    branches[prefix + "exTrack_" + DTypeObs + postfix] = c.GetBranch(prefix + "exTrack_" + DTypeObs + postfix)
                                    branches[prefix + "exTrack_" + DTypeObs + postfix].Reset()
                                    c.SetBranchAddress(prefix + "exTrack_" + DTypeObs + postfix, exTrackVars[prefix + "exTrack_" + DTypeObs + postfix])
                                    #branches["exTrack_" + DTypeObs + postfix].SetAddress(exTrackVars["exTrack_" + DTypeObs + postfix])
                                else:
                                    print("Branching", prefix + "exTrack_" + DTypeObs + postfix)
                                    branches[prefix + "exTrack_" + DTypeObs + postfix] = c.Branch(prefix + "exTrack_" + DTypeObs + postfix, exTrackVars[prefix + stringObs + postfix], prefix + "exTrack_" + DTypeObs + postfix + "/" + utils.typeTranslation[analysis_observables.commonObservablesDTypesList[DTypeObs]])
                                    c.SetBranchAddress(prefix + "exTrack_" + DTypeObs + postfix, exTrackVars[prefix + "exTrack_" + DTypeObs + postfix])
                            for DTypeObs in analysis_observables.exclusiveTrackObservablesDTypesList:
                                exTrackVars[prefix + DTypeObs + postfix] = np.zeros(1,dtype=analysis_observables.exclusiveTrackObservablesDTypesList[DTypeObs])
                                if c.GetBranchStatus(prefix + DTypeObs + postfix):
                                    print("Reseting branch", prefix + DTypeObs + postfix)
                                    branches[prefix + DTypeObs + postfix] = c.GetBranch(prefix + DTypeObs + postfix)
                                    branches[prefix + DTypeObs + postfix].Reset()
                                    c.SetBranchAddress(prefix + DTypeObs + postfix, exTrackVars[prefix + DTypeObs + postfix])
                                    #branches[DTypeObs + postfix].SetAddress(exTrackVars[DTypeObs + postfix])
                                else:
                                    print("Branching", prefix + DTypeObs + postfix)
                                    branches[prefix + DTypeObs + postfix] = c.Branch(prefix + DTypeObs + postfix, exTrackVars[prefix + DTypeObs + postfix], prefix + DTypeObs + postfix + "/" + utils.typeTranslation[analysis_observables.exclusiveTrackObservablesDTypesList[DTypeObs]])
                                    c.SetBranchAddress(prefix + DTypeObs + postfix, exTrackVars[prefix + DTypeObs + postfix])
                            for CTypeObs in analysis_observables.exclusiveTrackObservablesClassList:
                                exTrackVars[prefix + CTypeObs + postfix] = eval(analysis_observables.exclusiveTrackObservablesClassList[CTypeObs])()
                                if c.GetBranchStatus(prefix + CTypeObs + postfix):
                                    print("Reseting branch", prefix + CTypeObs + postfix)
                                    branches[prefix + CTypeObs + postfix] = c.GetBranch(prefix + CTypeObs + postfix)
                                    branches[prefix + CTypeObs + postfix].Reset()
                                    c.SetBranchAddress(prefix + CTypeObs + postfix, exTrackVars[prefix + CTypeObs + postfix])
                                else:
                                    print("Branching", prefix + CTypeObs + postfix)
                                    branches[prefix + CTypeObs + postfix] = c.Branch(prefix + CTypeObs + postfix, analysis_observables.exclusiveTrackObservablesClassList[CTypeObs], exTrackVars[prefix + CTypeObs + postfix])
                                    c.SetBranchAddress(prefix + CTypeObs + postfix, exTrackVars[prefix + CTypeObs + postfix])
                    if not jpsi:
                        for lep in ["Muons", "Electrons"]:
                            track_bdt_weights = track_bdt + "/dataset/weights/TMVAClassification_" + lep + iso + cuts + cat + ".weights.xml"
                            track_bdt_vars = cut_optimisation.getVariablesFromXMLWeightsFile(track_bdt_weights)
                            track_bdt_vars_map = cut_optimisation.getVariablesMemMap(track_bdt_vars)
                            track_bdt_specs = cut_optimisation.getSpecSpectatorFromXMLWeightsFile(track_bdt_weights)
                            track_bdt_specs_map = cut_optimisation.getSpectatorsMemMap(track_bdt_specs)
                            track_bdt_reader = cut_optimisation.prepareReader(track_bdt_weights, track_bdt_vars, track_bdt_vars_map, track_bdt_specs, track_bdt_specs_map)

                            track_bdt_vars_maps[lep + iso + cuts + cat] = track_bdt_vars_map
                            track_bdt_specs_maps[lep + iso + cuts + cat] = track_bdt_specs_map
                            track_bdt_readers[lep + iso + cuts + cat] = track_bdt_reader

    print('Analysing', nentries, "entries")

    afterMonoLepton = 0
    afterUniversalBdt = 0
    afterMonoTrack = 0
    afterAtLeastOneTrack = 0

    totalTracks = 0
    totalSurvivedTracks = 0
    eventsWithGreaterThanOneOppSignTracks = 0
    noSurvivingTracks = 0
    
    file.cd()
    
    for ientry in range(nentries):
        if ientry % 100 == 0:
            print("Processing " + str(ientry) + " out of " + str(nentries))
        c.GetEntry(ientry)
        #continue
        
        genZL, genNonZL = None, None
        if signal:
            genZL, genNonZL = analysis_ntuples.classifyGenZLeptons(c)
        
        for iso in utils.leptonIsolationList:
            for cat in utils.leptonIsolationCategories:
                ptRanges = [""]
                drCuts  = [""]

                if iso == "CorrJetIso":
                    ptRanges = utils.leptonCorrJetIsoPtRange
                    drCuts = utils.leptonCorrJetIsoDrCuts
                for ptRange in ptRanges:
                    for drCut in drCuts:
                        cuts = ""
                        if len(str(ptRange)) > 0:
                            cuts = str(ptRange) + "Dr" + str(drCut)

                        postfixi = [iso + cuts + cat]

                        if iso + cuts + cat == utils.defaultJetIsoSetting:
                            postfixi = [iso + cuts + cat, ""]
                    
                        for postfix in postfixi:
                            for sameCharge in [False, True]:
                            
                                prefix = "sc_" if sameCharge else ""
                            
                                exTrackVars[prefix + "exclusiveTrack" + postfix][0] = 0
                                exTrackVars[prefix + "trackZ" + postfix][0] = 0
                        
                                ll, lepIdx, leptonCharge, leptonFlavour, t, ti = None, None, None, None, None, None
                        
                                if jpsi:
                                    ll, lepIdx, t, ti = analysis_ntuples.getSingleJPsiLeptonAfterSelection(24, 24, c.Muons, getattr(c, "Muons_pass" + iso + cuts), c.Muons_mediumID, c.Muons_charge, c.tracks, c.tracks_charge, utils.leptonIsolationCategories[cat]["muonPt"], utils.leptonIsolationCategories[cat]["lowPtTightMuons"], c.Muons_tightID, c.Muons_passIso)
                                else:
                                    ll, lepIdx, leptonCharge, leptonFlavour = analysis_ntuples.getSingleLeptonAfterSelection(c.Electrons, getattr(c, "Electrons_pass" + iso + cuts), c.Electrons_deltaRLJ, c.Electrons_charge, c.Muons, getattr(c, "Muons_pass" + iso + cuts), c.Muons_mediumID, c.Muons_deltaRLJ, c.Muons_charge, utils.leptonIsolationCategories[cat]["muonPt"], utils.leptonIsolationCategories[cat]["lowPtTightMuons"], c.Muons_tightID)
        
                                if ll is None:
                                    # NOT TWO TRACKS
                                    #print "**** BEFORE FILL ***" 
                                    fillInNonTrackInfo(c, postfix, prefix)
                                    #print "**** AFTER FILL ***"
                                    continue
                        
                                if jpsi:
                                    leptonFlavour = "Muons"
                                    leptonCharge = c.Muons_charge[lepIdx]
                        
                                if leptonCharge == 0:
                                    print("WHAT?! leptonCharge=0")
                        
                                exTrackVars[prefix + "lepton_charge" + postfix][0] = leptonCharge
                                exTrackVars[prefix + "exclusiveTrackLeptonFlavour" + postfix] = cppyy.gbl.std.string(leptonFlavour)
    
                                afterMonoLepton += 1
                    
                                exTrackVars[prefix + "secondTrackBDT" + postfix][0] = -1
        
                                metvec = TLorentzVector()
                                metvec.SetPtEtaPhiE(c.MET, 0, c.METPhi, c.MET)
                                
                                mhtvec = TLorentzVector()
                                mhtvec.SetPtEtaPhiE(c.MHT, 0, c.MHTPhi, c.MHT)
                        
                                highestOppositeTrackScore = None
                                secondTrackScore = None
                                secondTrack = None
                                oppositeChargeTrack = None
                                ntracks = 0
                        
                                if not jpsi:
                                    for ti in range(c.tracks.size()):
                                        t = c.tracks[ti]
                                        if t.Pt() > 10:
                                            continue
                                        if abs(t.Eta()) > 2.4:
                                            continue
                                        tcharge = c.tracks_charge[ti]
                                        #Try lowering to 0!!
            
                                        if c.tracks_trkRelIso[ti] > 0.1:
                                            continue 
                                        if c.tracks_dxyVtx[ti] > 0.02:
                                            continue
                                        if c.tracks_dzVtx[ti] > 0.02:
                                            continue
                                        if sameCharge:
                                            if tcharge * leptonCharge < 0:
                                                continue
                                        else:
                                            if tcharge * leptonCharge > 0:
                                                continue
            
                                        totalTracks +=1
        
                                        deltaRLL = abs(t.DeltaR(ll))
                                        if deltaRLL < 0.01:
                                            continue
                                        ntracks += 1
                        
                                        track_bdt_vars_maps[leptonFlavour + iso + cuts + cat]["deltaEtaLJ"][0] = abs(t.Eta() - c.LeadingJet.Eta())
                                        track_bdt_vars_maps[leptonFlavour + iso + cuts + cat]["deltaRLJ"][0] = abs(t.DeltaR(c.LeadingJet))
                                        track_bdt_vars_maps[leptonFlavour + iso + cuts + cat]["track.Phi()"][0] = t.Phi()
                                        track_bdt_vars_maps[leptonFlavour + iso + cuts + cat]["track.Pt()"][0] = t.Pt()
                                        track_bdt_vars_maps[leptonFlavour + iso + cuts + cat]["track.Eta()"][0] = t.Eta()
            
            
                                        track_bdt_vars_maps[leptonFlavour + iso + cuts + cat]["deltaEtaLL"][0] = abs(t.Eta()-ll.Eta()) 
                                        track_bdt_vars_maps[leptonFlavour + iso + cuts + cat]["deltaRLL"][0] = abs(t.DeltaR(ll))
                                        track_bdt_vars_maps[leptonFlavour + iso + cuts + cat]["mtt"][0] = analysis_tools.MT2(c.MET, c.METPhi, t)
                                        #track_bdt_vars_map["deltaRMet"][0] = abs(t.DeltaR(metvec))
                                        track_bdt_vars_maps[leptonFlavour + iso + cuts + cat]["deltaPhiMht"][0] = abs(t.DeltaPhi(mhtvec))
            
                                        track_bdt_vars_maps[leptonFlavour + iso + cuts + cat]["lepton.Eta()"][0] = ll.Eta()
                                        track_bdt_vars_maps[leptonFlavour + iso + cuts + cat]["lepton.Phi()"][0] = ll.Phi()
                                        track_bdt_vars_maps[leptonFlavour + iso + cuts + cat]["lepton.Pt()"][0] = ll.Pt()
                                        track_bdt_vars_maps[leptonFlavour + iso + cuts + cat]["invMass"][0] = (t + ll).M()
            
            
                                        #for trackVar in ['dxyVtx', 'dzVtx','trkMiniRelIso', 'trkRelIso']:
                                        #    val = eval("c.tracks_" + trackVar + "[" + str(ti) + "]")
                                        #    if val == 0:
                                        #        val = 0.000000000000001
                                        #    track_bdt_vars_maps[leptonFlavour + iso + cuts + cat]["log(" + trackVar + ")"][0] = log(val)
            
                                        track_tmva_value = track_bdt_readers[leptonFlavour + iso + cuts + cat].EvaluateMVA("BDT")
            
                                        if  highestOppositeTrackScore is None or highestOppositeTrackScore < track_tmva_value:
                                            if highestOppositeTrackScore is not None:
                                                secondTrackScore = highestOppositeTrackScore
                                                exTrackVars[prefix + "secondTrackBDT" + postfix][0] = exTrackVars[prefix + "trackBDT" + postfix][0]
                                                secondTrack = oppositeChargeTrack
                                            highestOppositeTrackScore = track_tmva_value
                                            exTrackVars[prefix + "trackBDT" + postfix][0] = track_tmva_value
                                            oppositeChargeTrack = ti
                                else:
                                    highestOppositeTrackScore = 1
                                    secondTrackScore = 1
                                    secondTrack = None
                                    oppositeChargeTrack = ti
                                    ntracks = 0
                            
                            
                                if highestOppositeTrackScore is None:
                                    fillInNonTrackInfo(c, postfix, prefix)
                                    #print "2"
                                    continue
                                #print "REAL ONE"
                                afterAtLeastOneTrack += 1
                                afterMonoTrack += 1
                    
                                exTrackVars[prefix + "exclusiveTrack" + postfix][0] = 1
                    
                                exTrackVars[prefix + "ti" + postfix][0] = oppositeChargeTrack
                                if secondTrack is not None:
                                    exTrackVars[prefix + "sti" + postfix][0] = secondTrack
                                else:
                                    exTrackVars[prefix + "sti" + postfix][0] = -1
                                if signal:
                                    if genZL is None:
                                        exTrackVars[prefix + "trackZ" + postfix][0] = 0
                                    else:
                                        l = c.tracks[oppositeChargeTrack]
                                        minZ, minCanZ = analysis_ntuples.minDeltaRGenParticles(l, genZL, c.GenParticles)
                                        minNZ, minCanNZ = analysis_ntuples.minDeltaRGenParticles(l, genNonZL, c.GenParticles)
                                        min = 0
                                        if minNZ is None or minZ < minNZ:
                                            min = minZ
                                        else:
                                            min = minNZ
                            
                                        if min < 0.01 and (minNZ is None or minZ < minNZ):
                                            if c.tracks_charge[ti] * c.GenParticles_PdgId[minCanZ] < 0 and (abs(c.GenParticles_PdgId[minCanZ]) == 11 or abs(c.GenParticles_PdgId[minCanZ]) == 13):
                                                exTrackVars[prefix + "trackZ" + postfix][0] = 1
        
                                l1 = None
                                l2 = None
                                if ll.Pt() > c.tracks[oppositeChargeTrack].Pt():
                                    l1 = ll
                                    l2 = c.tracks[oppositeChargeTrack]
                                else:
                                    l1 = c.tracks[oppositeChargeTrack]
                                    l2 = ll
                    
                                exTrackVars[prefix + "l1" + postfix] = l1
                                exTrackVars[prefix + "l2" + postfix] = l2
                                exTrackVars[prefix + "lepton" + postfix] = ll
                                exTrackVars[prefix + "track" + postfix] = c.tracks[oppositeChargeTrack]
                                exTrackVars[prefix + "leptonIdx" + postfix][0] = lepIdx
                    
                                if secondTrack is not None:
                                    exTrackVars[prefix + "secondTrack" + postfix] = c.tracks[secondTrack]
                                else:
                                    exTrackVars[prefix + "secondTrack" + postfix] = TLorentzVector()
                    
                                exTrackVars[prefix + "exTrack_invMass" + postfix][0] = (l1 + l2).M()
                                exTrackVars[prefix + "exTrack_dileptonPt" + postfix][0] = abs((l1 + l2).Pt())
                                exTrackVars[prefix + "exTrack_deltaPhi" + postfix][0] =  abs(l1.DeltaPhi(l2))
                                exTrackVars[prefix + "exTrack_deltaEta" + postfix][0] = abs(l1.Eta() - l2.Eta())
                                exTrackVars[prefix + "exTrack_deltaR" + postfix][0] = abs(l1.DeltaR(l2))
                                exTrackVars[prefix + "NTracks" + postfix][0] = ntracks

                                exTrackVars[prefix + "exTrack_pt3" + postfix][0] = analysis_tools.pt3(l1.Pt(),l1.Phi(),l2.Pt(),l2.Phi(),c.MET,c.METPhi)

                                exTrackVars[prefix + "exTrack_mt1" + postfix][0] = analysis_tools.MT2(c.MET, c.METPhi, l1)
                                exTrackVars[prefix + "exTrack_mt2" + postfix][0] = analysis_tools.MT2(c.MET, c.METPhi, l2)

                                exTrackVars[prefix + "mtt" + postfix][0] = analysis_tools.MT2(c.MET, c.METPhi, c.tracks[oppositeChargeTrack])
                                exTrackVars[prefix + "mtl" + postfix][0] = analysis_tools.MT2(c.MET, c.METPhi, ll)
                        
                                exTrackVars[prefix + "exTrack_mtautau" + postfix][0] = analysis_tools.Mtautau(metvec, l1, l2)
                    
                                exTrackVars[prefix + "exTrack_deltaEtaLeadingJetDilepton" + postfix][0] = abs((l1 + l2).Eta() - c.LeadingJet.Eta())
                                exTrackVars[prefix + "exTrack_deltaPhiLeadingJetDilepton" + postfix][0] = abs((l1 + l2).DeltaPhi(c.LeadingJet))
                    
                                exTrackVars[prefix + "exTrack_dilepHt" + postfix][0] = analysis_ntuples.htJet30Leps(c.Jets, [l1,l2])
                    
                                exTrackVars[prefix + "deltaPhiMetTrack" + postfix][0] = abs(c.tracks[oppositeChargeTrack].DeltaPhi(metvec))
                                exTrackVars[prefix + "deltaPhiMetLepton" + postfix][0] = abs(ll.DeltaPhi(metvec))
                                
                                exTrackVars[prefix + "deltaPhiMhtTrack" + postfix][0] = abs(c.tracks[oppositeChargeTrack].DeltaPhi(mhtvec))
                                exTrackVars[prefix + "deltaPhiMhtLepton" + postfix][0] = abs(ll.DeltaPhi(mhtvec))
                                
                                
                                #print "HERE!!!"
                                for stringObs in analysis_observables.exclusiveTrackObservablesStringList:
                                    c.SetBranchAddress(prefix + stringObs + postfix, exTrackVars[prefix + stringObs + postfix])
                                    #branches[stringObs + postfix].SetAddress(exTrackVars[stringObs + postfix])
                                    branches[prefix + stringObs + postfix].Fill()
                                for DTypeObs in analysis_observables.commonObservablesDTypesList:
                                    branches[prefix + "exTrack_" + DTypeObs + postfix].Fill()
                                for DTypeObs in analysis_observables.exclusiveTrackObservablesDTypesList:
                                    branches[prefix + DTypeObs + postfix].Fill()         
                                for CTypeObs in analysis_observables.exclusiveTrackObservablesClassList:
                                    c.SetBranchAddress(prefix + CTypeObs + postfix, exTrackVars[prefix + CTypeObs + postfix])
                                    #branches[CTypeObs + postfix].SetAddress(exTrackVars[CTypeObs + postfix])
                                    branches[prefix + CTypeObs + postfix].Fill()
                            #print "AFTER!!!"

    c.Write("tEvent",TObject.kOverwrite)
    
    file.Close()

    print("nentries=" + str(nentries))
    print("totalTracks=" + str(totalTracks))
    print("totalSurvivedTracks=" + str(totalSurvivedTracks))
    print("eventsWithGreaterThanOneOppSignTracks=" + str(eventsWithGreaterThanOneOppSignTracks))
    print("noSurvivingTracks=" + str(noSurvivingTracks))
    print("afterAtLeastOneTrack=" + str(afterAtLeastOneTrack))
    print("afterMonoLepton=" + str(afterMonoLepton))
    print("afterUniversalBdt=" + str(afterUniversalBdt))
    print("afterMonoTrack=" + str(afterMonoTrack))
Exemplo n.º 6
0
def main():
    iFile = TFile(input_file)
    #hHt = iFile.Get('hHt')
    c = iFile.Get('tEvent')

    tree = c.CloneTree(0)
    tree.SetDirectory(0)

    var_univBDT = np.zeros(1, dtype=float)
    tree.Branch('univBDT', var_univBDT, 'univBDT/D')
    var_trackBDT = np.zeros(1, dtype=float)
    tree.Branch('trackBDT', var_trackBDT, 'trackBDT/D')

    var_secondTrackBDT = np.zeros(1, dtype=float)
    tree.Branch('secondTrackBDT', var_secondTrackBDT, 'secondTrackBDT/D')

    var_l1 = TLorentzVector()
    var_l2 = TLorentzVector()

    var_lepton = TLorentzVector()
    var_track = TLorentzVector()
    var_secondTrack = TLorentzVector()

    var_leptonFlavour = ROOT.std.string()

    tree.Branch('l1', 'TLorentzVector', var_l1)
    tree.Branch('l2', 'TLorentzVector', var_l2)

    tree.Branch('lepton', 'TLorentzVector', var_lepton)
    tree.Branch('track', 'TLorentzVector', var_track)
    tree.Branch('secondTrack', 'TLorentzVector', var_secondTrack)

    var_ti = np.zeros(1, dtype=int)
    tree.Branch('ti', var_ti, 'ti/I')

    var_sti = np.zeros(1, dtype=int)
    tree.Branch('sti', var_sti, 'sti/I')

    var_invMass = np.zeros(1, dtype=float)
    var_dileptonPt = np.zeros(1, dtype=float)
    var_deltaPhi = np.zeros(1, dtype=float)
    var_deltaEta = np.zeros(1, dtype=float)
    var_deltaR = np.zeros(1, dtype=float)
    var_pt3 = np.zeros(1, dtype=float)
    var_mtautau = np.zeros(1, dtype=float)
    var_mt1 = np.zeros(1, dtype=float)
    var_mt2 = np.zeros(1, dtype=float)
    var_mtt = np.zeros(1, dtype=float)
    var_mtl = np.zeros(1, dtype=float)
    var_DeltaEtaLeadingJetDilepton = np.zeros(1, dtype=float)
    var_DeltaPhiLeadingJetDilepton = np.zeros(1, dtype=float)
    var_dilepHt = np.zeros(1, dtype=float)
    var_NTracks = np.zeros(1, dtype=int)
    var_leptonCharge = np.zeros(1, dtype=int)
    var_deltaRMetTrack = np.zeros(1, dtype=float)
    var_deltaRMetLepton = np.zeros(1, dtype=float)
    var_deltaPhiMetTrack = np.zeros(1, dtype=float)
    var_deltaPhiMetLepton = np.zeros(1, dtype=float)

    tree.Branch('leptonCharge', var_leptonCharge, 'leptonCharge/I')
    #tree.Branch('leptonFlavour', var_leptonFlavour,'leptonCharge/C')
    tree.Branch('leptonFlavour', 'std::string', var_leptonFlavour)

    tree.Branch('invMass', var_invMass, 'invMass/D')
    tree.Branch('dileptonPt', var_dileptonPt, 'dileptonPt/D')
    tree.Branch('deltaPhi', var_deltaPhi, 'deltaPhi/D')
    tree.Branch('deltaEta', var_deltaEta, 'deltaEta/D')
    tree.Branch('deltaR', var_deltaR, 'deltaR/D')
    tree.Branch('pt3', var_pt3, 'pt3/D')
    tree.Branch('mtautau', var_mtautau, 'mtautau/D')
    tree.Branch('mt1', var_mt1, 'mt1/D')
    tree.Branch('mt2', var_mt2, 'mt2/D')
    tree.Branch('mtt', var_mtt, 'mtt/D')
    tree.Branch('mtl', var_mtl, 'mtl/D')
    tree.Branch('DeltaEtaLeadingJetDilepton', var_DeltaEtaLeadingJetDilepton,
                'DeltaEtaLeadingJetDilepton/D')
    tree.Branch('DeltaPhiLeadingJetDilepton', var_DeltaPhiLeadingJetDilepton,
                'DeltaPhiLeadingJetDilepton/D')
    tree.Branch('dilepHt', var_dilepHt, 'dilepHt/D')
    tree.Branch('NTracks', var_NTracks, 'NTracks/I')

    tree.Branch('deltaRMetTrack', var_deltaRMetTrack, 'deltaRMetTrack/D')
    tree.Branch('deltaRMetLepton', var_deltaRMetLepton, 'deltaRMetLepton/D')
    tree.Branch('deltaPhiMetTrack', var_deltaPhiMetTrack, 'deltaPhiMetTrack/D')
    tree.Branch('deltaPhiMetLepton', var_deltaPhiMetLepton,
                'deltaPhiMetLepton/D')

    nentries = c.GetEntries()
    print 'Analysing', nentries, "entries"

    # (univ_testBGHists, univ_trainBGHists, univ_testSignalHists, univ_trainSignalHists, univ_methods, univ_names) = cut_optimisation.get_bdt_hists([univ_bdt])
    #     univ_trainSignalHist, univ_trainBGHist, univ_testSignalHist, univ_testBGHist = univ_trainSignalHists[0], univ_trainBGHists[0], univ_testSignalHists[0], univ_testBGHists[0]
    #     univ_highestZ, univ_highestS, univ_highestB, univ_highestMVA, univ_ST, univ_BT = cut_optimisation.getHighestZ(univ_trainSignalHist, univ_trainBGHist, univ_testSignalHist, univ_testBGHist)
    #
    #     univ_bdt_weights = univ_bdt + "/dataset/weights/TMVAClassification_BDT.weights.xml"
    #     univ_bdt_vars = cut_optimisation.getVariablesFromXMLWeightsFile(univ_bdt_weights)
    #     univ_bdt_vars_map = cut_optimisation.getVariablesMemMap(univ_bdt_vars)
    #     univ_bdt_reader = cut_optimisation.prepareReader(univ_bdt_weights, univ_bdt_vars, univ_bdt_vars_map)

    (track_testBGHists, track_trainBGHists, track_testSignalHists,
     track_trainSignalHists, track_methods,
     track_names) = cut_optimisation.get_bdt_hists([track_bdt])
    track_trainSignalHist, track_trainBGHist, track_testSignalHist, track_testBGHist = track_trainSignalHists[
        0], track_trainBGHists[0], track_testSignalHists[0], track_testBGHists[
            0]
    track_highestZ, track_highestS, track_highestB, track_highestMVA, track_ST, track_BT = cut_optimisation.getHighestZ(
        track_trainSignalHist, track_trainBGHist, track_testSignalHist,
        track_testBGHist)

    track_bdt_weights = track_bdt + "/dataset/weights/TMVAClassification_BDT.weights.xml"
    track_bdt_vars = cut_optimisation.getVariablesFromXMLWeightsFile(
        track_bdt_weights)
    track_bdt_vars_map = cut_optimisation.getVariablesMemMap(track_bdt_vars)
    track_bdt_specs = cut_optimisation.getSpecSpectatorFromXMLWeightsFile(
        track_bdt_vars)
    track_bdt_specs_map = cut_optimisation.getSpectatorsMemMap(track_bdt_vars)
    track_bdt_reader = cut_optimisation.prepareReader(track_bdt_weights,
                                                      track_bdt_vars,
                                                      track_bdt_vars_map,
                                                      track_bdt_specs,
                                                      track_bdt_specs_map)

    print track_bdt_vars_map

    #     print "-------------------"
    #
    #     print "univ_highestZ=" + str(univ_highestZ)
    #     print "univ_highestS=" + str(univ_highestS)
    #     print "univ_highestB=" + str(univ_highestB)
    #     print "univ_highestMVA=" + str(univ_highestMVA)
    #     print "univ_ST=" + str(univ_ST)
    #     print "univ_BT=" + str(univ_BT)

    print "-------------------"

    print "track_highestZ=" + str(track_highestZ)
    print "track_highestS=" + str(track_highestS)
    print "track_highestB=" + str(track_highestB)
    print "track_highestMVA=" + str(track_highestMVA)
    print "track_ST=" + str(track_ST)
    print "track_BT=" + str(track_BT)

    print "-------------------"

    afterMonoLepton = 0
    afterUniversalBdt = 0
    afterMonoTrack = 0
    afterAtLeastOneTrack = 0

    totalTracks = 0
    totalSurvivedTracks = 0
    eventsWithGreaterThanOneOppSignTracks = 0
    noSurvivingTracks = 0

    for ientry in range(nentries):
        if ientry % 1000 == 0:
            print "Processing " + str(ientry)
        c.GetEntry(ientry)

        if c.MaxCsv25 > 0.7:
            continue

        ll, leptonCharge, leptonFlavour = analysis_ntuples.getSingleLeptonAfterSelection(
            c, c.LeadingJet)

        if ll is None:
            continue
        if leptonCharge == 0:
            print "WHAT?! leptonCharge=0"
        var_leptonCharge[0] = leptonCharge
        var_leptonFlavour = ROOT.std.string(leptonFlavour)

        afterMonoLepton += 1

        # for k, v in univ_bdt_vars_map.items():
        #             v[0] = eval("c." + k)
        univ_tmva_value = 0  #univ_bdt_reader.EvaluateMVA("BDT")
        var_univBDT[0] = univ_tmva_value
        #if univ_tmva_value < univ_highestMVA:
        #	continue

        afterUniversalBdt += 1

        var_secondTrackBDT[0] = -1

        metvec = TLorentzVector()
        metvec.SetPtEtaPhiE(c.Met, 0, c.METPhi, c.Met)

        highestOppositeTrackScore = None
        secondTrackScore = None
        secondTrack = None
        oppositeChargeTrack = None
        ntracks = 0
        for ti in range(c.tracks.size()):
            t = c.tracks[ti]
            tcharge = c.tracks_charge[ti]
            #Try lowering to 0!!

            if c.tracks_trkRelIso[ti] > 0.1:
                continue
            if c.tracks_dxyVtx[ti] > 0.02:
                continue
            if c.tracks_dzVtx[ti] > 0.05:
                continue

            if sc:
                if tcharge * leptonCharge < 0:
                    continue
            else:
                if tcharge * leptonCharge > 0:
                    continue

            totalTracks += 1

            deltaRLL = abs(t.DeltaR(ll))
            if deltaRLL < 0.01:
                continue
            ntracks += 1

            track_bdt_vars_map["deltaEtaLJ"][0] = abs(t.Eta() -
                                                      c.LeadingJet.Eta())
            track_bdt_vars_map["deltaRLJ"][0] = abs(t.DeltaR(c.LeadingJet))
            track_bdt_vars_map["track.Phi()"][0] = t.Phi()
            track_bdt_vars_map["track.Pt()"][0] = t.Pt()
            track_bdt_vars_map["track.Eta()"][0] = t.Eta()

            track_bdt_vars_map["deltaEtaLL"][0] = abs(t.Eta() - ll.Eta())
            track_bdt_vars_map["deltaRLL"][0] = abs(t.DeltaR(ll))
            track_bdt_vars_map["mtt"][0] = analysis_tools.MT2(
                c.Met, c.METPhi, t)
            #track_bdt_vars_map["deltaRMet"][0] = abs(t.DeltaR(metvec))
            track_bdt_vars_map["deltaPhiMet"][0] = abs(t.DeltaPhi(metvec))

            track_bdt_vars_map["lepton.Eta()"][0] = ll.Eta()
            track_bdt_vars_map["lepton.Phi()"][0] = ll.Phi()
            track_bdt_vars_map["lepton.Pt()"][0] = ll.Pt()
            track_bdt_vars_map["invMass"][0] = (t + ll).M()

            for trackVar in ['dxyVtx', 'dzVtx', 'trkMiniRelIso',
                             'trkRelIso']:  #, 'trkMiniRelIso', 'trkRelIso']:
                track_bdt_vars_map[trackVar][0] = eval("c.tracks_" + trackVar +
                                                       "[" + str(ti) + "]")

            track_tmva_value = track_bdt_reader.EvaluateMVA("BDT")

            if highestOppositeTrackScore is None or highestOppositeTrackScore < track_tmva_value:
                if highestOppositeTrackScore is not None:
                    secondTrackScore = highestOppositeTrackScore
                    var_secondTrackBDT[0] = var_trackBDT[0]
                    secondTrack = oppositeChargeTrack
                highestOppositeTrackScore = track_tmva_value
                var_trackBDT[0] = track_tmva_value
                oppositeChargeTrack = ti

        #print "-------------"
        #print "Total Tracks=" + str(c.tracks.size())
        #print "Passed Tracks=" + str(len(survivedTracks))

        #print "survivedTracks=" + str(len(survivedTracks))

#         if len(survivedTracks) == 0:
#             noSurvivingTracks += 1
#             continue
        if highestOppositeTrackScore is None or highestOppositeTrackScore < 0:
            continue
        afterAtLeastOneTrack += 1
        #numberOfOppositeChargeTracks = 0

        #for i in survivedTracks:
        #    if c.tracks_charge[i] * leptonCharge < 0:
        #        numberOfOppositeChargeTracks +=1
        #        oppositeChargeTrack = i

        #if numberOfOppositeChargeTracks > 1:
        #    eventsWithGreaterThanOneOppSignTracks += 1

        #if numberOfOppositeChargeTracks != 1:
        #    continue

        #print "Track charge=" + str(c.tracks_charge[survivedTracks[0]])
        #print "Lepton charge=" + str(leptonCharge)

        #if c.tracks_charge[survivedTracks[0]] * leptonCharge > 0:
        #	continue

        afterMonoTrack += 1

        var_ti[0] = oppositeChargeTrack
        if secondTrack is not None:
            var_sti[0] = secondTrack
        else:
            var_sti[0] = -1

        # tracksMem = {}


#         tracksMem["tracks"] = ROOT.std.vector(TLorentzVector)()
#         tracksMem["tracks"].push_back(c.tracks[oppositeChargeTrack])
#         tree.SetBranchAddress('tracks', tracksMem["tracks"])

# for v in tracksVars:
#             tracksMem[v["name"]] = eval("ROOT.std.vector(" + v["type"] + ")()")
#             #print eval("c.tracks_" + v["name"] + "[survivedTracks[0]]")
#             tracksMem[v["name"]].push_back(eval(v["type"] + "(c.tracks_" + v["name"] + "[oppositeChargeTrack])"))
#             tree.SetBranchAddress('tracks_' + v["name"], tracksMem[v["name"]])
#

        l1 = None
        l2 = None
        if ll.Pt() > c.tracks[oppositeChargeTrack].Pt():
            l1 = ll
            l2 = c.tracks[oppositeChargeTrack]
        else:
            l1 = c.tracks[oppositeChargeTrack]
            l2 = ll

        var_l1 = l1
        var_l2 = l2
        var_lepton = ll
        var_track = c.tracks[oppositeChargeTrack]

        if secondTrack is not None:
            var_secondTrack = c.tracks[secondTrack]
        else:
            var_secondTrack = TLorentzVector()

        tree.SetBranchAddress('l1', var_l1)
        tree.SetBranchAddress('l2', var_l2)
        tree.SetBranchAddress('lepton', var_lepton)
        tree.SetBranchAddress('track', var_track)
        tree.SetBranchAddress('secondTrack', var_secondTrack)
        tree.SetBranchAddress('leptonFlavour', var_leptonFlavour)

        var_invMass[0] = (l1 + l2).M()
        var_dileptonPt[0] = abs((l1 + l2).Pt())
        var_deltaPhi[0] = abs(l1.DeltaPhi(l2))
        var_deltaEta[0] = abs(l1.Eta() - l2.Eta())
        var_deltaR[0] = abs(l1.DeltaR(l2))
        var_NTracks[0] = ntracks

        var_pt3[0] = analysis_tools.pt3(l1.Pt(), l1.Phi(), l2.Pt(), l2.Phi(),
                                        c.Met, c.METPhi)

        pt = TLorentzVector()
        pt.SetPtEtaPhiE(c.Met, 0, c.METPhi, c.Met)

        var_mt1[0] = analysis_tools.MT2(c.Met, c.METPhi, l1)
        var_mt2[0] = analysis_tools.MT2(c.Met, c.METPhi, l2)

        var_mtt[0] = analysis_tools.MT2(c.Met, c.METPhi,
                                        c.tracks[oppositeChargeTrack])
        var_mtl[0] = analysis_tools.MT2(c.Met, c.METPhi, ll)

        var_mtautau[0] = analysis_tools.Mtautau(pt, l1, l2)

        var_DeltaEtaLeadingJetDilepton[0] = abs((l1 + l2).Eta() -
                                                c.LeadingJet.Eta())
        var_DeltaPhiLeadingJetDilepton[0] = abs(
            (l1 + l2).DeltaPhi(c.LeadingJet))

        var_dilepHt[0] = analysis_ntuples.htJet25Leps(c.Jets, [l1, l2])

        var_deltaRMetTrack[0] = abs(c.tracks[oppositeChargeTrack].DeltaR(pt))
        var_deltaPhiMetTrack[0] = abs(
            c.tracks[oppositeChargeTrack].DeltaPhi(pt))
        var_deltaRMetLepton[0] = abs(ll.DeltaR(pt))
        var_deltaPhiMetLepton[0] = abs(ll.DeltaPhi(pt))

        tree.Fill()

    if iFile.GetListOfKeys().Contains("lumiSecs") or tree.GetEntries() != 0:
        fnew = TFile(output_file, 'recreate')
        tree.Write()
        if iFile.GetListOfKeys().Contains("lumiSecs"):
            lumiSecs = iFile.Get("lumiSecs")
            lumiSecs.Write("lumiSecs")
        #hHt.Write()
        fnew.Close()
    else:
        print "*** RESULT EMPTY"
    iFile.Close()

    print "nentries=" + str(nentries)
    print "totalTracks=" + str(totalTracks)
    print "totalSurvivedTracks=" + str(totalSurvivedTracks)
    print "eventsWithGreaterThanOneOppSignTracks=" + str(
        eventsWithGreaterThanOneOppSignTracks)
    print "noSurvivingTracks=" + str(noSurvivingTracks)
    print "afterAtLeastOneTrack=" + str(afterAtLeastOneTrack)
    print "afterMonoLepton=" + str(afterMonoLepton)
    print "afterUniversalBdt=" + str(afterUniversalBdt)
    print "afterMonoTrack=" + str(afterMonoTrack)