Esempio n. 1
0
def controlplot(config_list):
    for index, parameter in enumerate(x):
        if data:
            config = configmaster.ConfigMaster(*base_config(parameter))
            config.add_config_info(controlplot_config(parameter), 0)
            config.add_config_info(
                sumofhists_config(
                    [" ".join([nick for nick in sample_list[:-2]])],
                    ["bkg_sum_noplot"]), 1)
            config.add_config_info(
                ratio_config(["data", "bkg_sum_noplot"],
                             ["bkg_sum_noplot", "bkg_sum_noplot"]), 6)
            config.add_config_info(blind_config(), 8)

        else:
            config = configmaster.ConfigMaster(*base_config(parameter))
            config.add_config_info(controlplot_config(parameter), 0)

        config_list.append(config.return_config())
        config_list[index]["no_cache"] = True

        if signal:
            config_list[index]["weights"][-2 if data else -1] += "*(10)"
            config_list[index]["labels"][
                -2 if data else -1] = "Z #rightarrow " + {
                    "em": "e#mu",
                    "et": "e#tau",
                    "mt": "#mu#tau"
                }[channel] + " (LFV) x 10"

    return config_list
Esempio n. 2
0
def efficiencyplot(config_list):
    for parameter in x:
        config = configmaster.ConfigMaster(
            *base_config(parameter, nick_suffix="noplot", no_plot=True))
        config.add_config_info(
            sumofhists_config(
                ["zttnoplot zllnoplot ttjnoplot vvnoplot wjnoplot qcdnoplot"],
                ["bkg_sum"]), 1)
        config.add_config_info(efficiency_config(parameter, ["bkg_sum"])[0], 0)
        config.add_config_info(efficiency_config(parameter, ["bkg_sum"])[1], 2)
        config_list.append(config.return_config())

    return config_list
Esempio n. 3
0
def shapeplot(config_list):
    for index, parameter in enumerate(x):
        config = configmaster.ConfigMaster(*base_config(parameter))
        config.add_config_info(shape_config(parameter)[0], 0)
        config.add_config_info(shape_config(parameter)[1], 3)
        config.pop(["stacks", "colors"])
        config_list.append(config.return_config())

        ##Delete information not needed
        config_list[index]["markers"] = [
            "LINE" for value in config_list[index]["markers"]
        ]

    return config_list
Esempio n. 4
0
def nminus1plot(config_list):
    ##Get information about cuts from parameter_info
    cut_strings = [
        parameter_info[param][4] for param in
        cut_info[0 if weight == "(njetspt30==0)" else 1][channel].keys()
    ]
    cut_values, cut_side = [[
        entry[index] for entry in
        cut_info[0 if weight == "(njetspt30==0)" else 1][channel].values()
    ] for index in [0, 1]]

    for index1, parameter in enumerate(
            cut_info[0 if weight == "(njetspt30==0)" else 1][channel].keys()):
        ##Construct weight for N-1 plot
        weights = "*".join([
            cut_strings[index2].format(side=side, cut=value)
            for index2, (side, value) in enumerate(zip(cut_side, cut_values))
            if index1 != index2
        ])

        #Build config
        config = configmaster.ConfigMaster(
            *base_config(parameter, weight_input=weights))
        config.add_config_info(nminus1_config(parameter), 0)
        config.change_config_info("vertical_lines", [cut_values[index1]])

        if signal:
            config = config.return_config()
            config["stacks"][-1] = "sig"
            config["markers"][-1] = "LINE"
            config["weights"][-1] += "*(500)"
            config["labels"][-1] = "Z #rightarrow " + {
                "em": "e#mu",
                "et": "e#tau",
                "mt": "#mu#tau"
            }[channel] + " (LFV) x 500"

        config_list.append(config if signal else config.return_config())

    return config_list
Esempio n. 5
0
def limitplot(config_list):
    import array

    directory = os.path.abspath(
        os.path.expandvars(
            "$CMSSW_BASE/src/FlavioOutput/Limits/{channel}".format(
                channel=channel)))

    if not x[0] == 30:

        old_limits = {"em": 7.3e-7, "et": 9.8e-6, "mt": 1.2e-5}

        #for method in ["cut_based", "BDT_cut", "BDT"]:
        #	os.system("python HiggsAnalysis/KITHiggsToTauTau/scripts/FlavioLimits.py --channel {channel} --method {method}".format(channel=channel, method=method))

        root_file = "/limits.root"
        output = ROOT.TFile(directory + root_file, "RECREATE")

        for method in ["cut_based", "cut_BDT", "BDT"]:
            output.mkdir(method)
            output_tree = ROOT.TTree("limit",
                                     "tree with limit values for categories")

            branch_names = [("two_sigma_down", "/F"), ("one_sigma_down", "/F"),
                            ("limit_exp", "/F"), ("one_sigma_up", "/F"),
                            ("two_sigma_up", "/F"), ("limit_obs", "/F"),
                            ("limit_old", "/F"), ("categories", "/I")]
            branch_adresses = [
                array.array("f", [0]) for branch in branch_names[:-1]
            ] + [array.array("i", [0])]
            branches = [
                output_tree.Branch(branch_name, branch_adress,
                                   branch_name + branch_type)
                for (branch_name, branch_type
                     ), branch_adress in zip(branch_names, branch_adresses)
            ]

            for index2, category in enumerate(
                ["OneJet", "ZeroJet", "combined"]):
                limit_file = ROOT.TFile.Open(
                    directory + "/limit_{cat}_{method}.root".format(
                        cat=category, method=method))
                tree = limit_file.Get("limit")

                for index, event in enumerate(tree):
                    branch_adresses[index][
                        0] = event.limit * old_limits[channel]

                if index2 == 2:
                    branch_adresses[index + 1][0] = old_limits[channel]
                else:
                    branch_adresses[index + 1][0] = 0

                branch_adresses[index + 2][0] = index2

                output_tree.Fill()
                limit_file.Close()

            output.cd(method)
            output_tree.Write()
        output.Close()
        sys.exit(0)

    else:
        for index, analysis in enumerate(["cut_based", "BDT", "cut_BDT"]):
            ##Write config for limit plots
            config = configmaster.ConfigMaster(base_config(x[0])[0])
            config.add_config_info(limit_config(x[0])[0], 0)
            config.add_config_info(limit_config(x[0])[1], 7)
            config.replace(["directories", "folders", "filename", "y_lims"], [
                directory, [analysis + "/limit"], "Limit_" + analysis, {
                    "em": [0.0, 2.5e-6],
                    "et": [0., 2.5e-4],
                    "mt": [0., 2.5e-4]
                }[channel]
            ])

            config_list.append(config.return_config())
            config_list[index]["nicks"] = config_list[index]["nicks"][:-1]
            config_list[index]["y_expressions"] = config_list[index][
                "y_expressions"][:-1]

    return config_list
Esempio n. 6
0
def cutflowplot(config_list):
    ##Import math for s/sqrt(s+b)
    from math import sqrt

    ##Name of output root file
    root_file = "/cutflow_" + channel + ".root"

    ##Construct list of weights = [no cut, cut1, cut1+cut2, ..., cut1+...+cutN]
    cut_strings = [
        parameter_info[param][4] for param in
        cut_info[0 if weight == "(njetspt30==0)" else 1][channel].keys()
    ]
    cut_values, cut_side = [[
        entry[index] for entry in
        cut_info[0 if weight == "(njetspt30==0)" else 1][channel].values()
    ] for index in [0, 1]]
    weight_list = ["1"] + [
        "*".join(cut_strings[index].format(cut=cut, side=side)
                 for index, (cut, side) in enumerate(
                     zip(cut_values[:1 + index2], cut_side[:1 + index2])))
        for index2 in range(len(cut_strings))
    ]

    ##Using harry.py the magician to get root files, read out for each process the total number of events and save them in hists as list for each weight
    hists = []
    configs = []
    for index, weights in enumerate(weight_list):
        config = configmaster.ConfigMaster(
            *base_config(x[0], weight_input=weights))
        config.change_config_info("plot_modules", "ExportRoot")
        config.pop(["www", "www_nodate", "legend_markers"])
        config.change_config_info("filename", str(index))
        configs.append(config.return_config())

    higgsplot.HiggsPlotter(list_of_config_dicts=configs,
                           n_plots=len(configs),
                           batch="rwthcondor")

    for index in range(len(weight_list)):
        root = ROOT.TFile.Open(flavio_path + "/VisibleMass" + weight_name +
                               str(index) + ".root")
        hists.append([root.Get(process).Integral() for process in sample_list])
        hists[index].append(hists[index][0] /
                            sqrt(hists[index][0] + sum(hists[index][1:])))

    for filetype in [".root", ".json"]:
        for index in range(len(weight_list)):
            os.remove(flavio_path + "/VisibleMass" + weight_name + str(index) +
                      filetype)

    ##Use ROOT to fill hists in a new root file in which each process is a hist with the Number of events for each weight applied
    if not os.path.exists(flavio_path):
        os.mkdir(flavio_path)

    if os.path.isfile(flavio_path + root_file):
        os.remove(flavio_path + root_file)

    for index1, process in enumerate(sample_list + ["soverb"]):
        output = ROOT.TFile(flavio_path + root_file, "UPDATE")
        root_hist = ROOT.TH1F(process, process, len(hists), 0, len(hists))
        for index2, hist in enumerate(hists):
            root_hist.SetBinContent(index2 + 1, hist[index1])

        output.Write()
        output.Close()

    ##Write config for cutflow plots
    config = configmaster.ConfigMaster(base_config(x[0], no_plot=True)[0])
    config.add_config_info(cutflow_config(x[0])[0], 0)
    config.add_config_info(cutflow_config(x[0])[1], 5)
    config.pop(["directories", "x_expressions", "x_bins"])
    config.change_config_info(
        ["directories", "x_expressions", "x_tick_labels"],
        [flavio_path, sample_list + ["soverb"], ["no cuts"] + cut_strings])
    config.print_config()

    config_list.append(config.return_config())

    return config_list
Esempio n. 7
0
def cutoptimization(config_list):
    ##Information to create weight string for harry plotter
    cut_side = ["<" for parameter in x]
    cut_values = range(len(cut_side))
    cut_strings = [parameter_info[parameter][4] for parameter in x]

    for index1 in range(3):
        for index2, parameter in enumerate(x):
            ##Create N-1 weight for Nth parameter if not zero Iteration
            if index1 != 0:
                weights = "*".join([
                    cut_strings[index3].format(side=side, cut=value)
                    for index3, (side,
                                 value) in enumerate(zip(cut_side, cut_values))
                    if index2 != index3
                ])

            ##Create harry plotter config
            config = configmaster.ConfigMaster(
                *base_config(parameter,
                             nick_suffix="noplot",
                             no_plot=True,
                             weight_input="1" if index1 == 0 else weights))
            config.add_config_info(
                sumofhists_config([
                    "zttnoplot zllnoplot ttjnoplot vvnoplot wjnoplot qcdnoplot"
                ], ["bkg_sum"]), 1)
            config.add_config_info(
                efficiency_config(
                    parameter, ["bkg_sum"],
                    lower_cut=True if cut_side[index2] == "<" else False)[1],
                2)
            config.pop(["www", "www_nodate", "cms", "extra_text"])
            config.change_config_info(["filename", "plot_modules"],
                                      ["_" + channel, "ExportRoot"])

            ##Create config in zero iteration to check on which side the cut should be applied
            if (index1 == 0):
                config2 = config.copy()
                config2.replace("select_lower_values", False)
                config2.change_config_info("filename", "_2")

            ##Harry.py the MVP
            higgsplot.HiggsPlotter(
                list_of_config_dicts=[config.return_config()] if index1 != 0
                else [config.return_config(),
                      config2.return_config()],
                n_plots=2 if index1 == 0 else 1)

            ##Readout best cut value
            cut_file = ROOT.TFile.Open(flavio_path + "/" +
                                       config.return_config()["filename"] +
                                       ".root")
            histogram = cut_file.Get("sOverSqrtSB")
            cut_values[index2] = (histogram.GetXaxis().GetBinCenter(
                histogram.GetMaximumBin()))

            for filetype in [".json", ".root"]:
                os.remove(flavio_path + "/" +
                          config.return_config()["filename"] + filetype)

            ##Choose which side to cut on in zero iteration
            if index1 == 0:
                cut_file2 = ROOT.TFile.Open(
                    flavio_path + "/" + config2.return_config()["filename"] +
                    ".root")
                histogram2 = cut_file2.Get("sOverSqrtSB")

                if histogram.GetMaximum() < histogram2.GetMaximum():
                    cut_values[index2] = histogram2.GetXaxis().GetBinCenter(
                        histogram2.GetMaximumBin())
                    cut_side[index2] = ">"

                for filetype in [".json", ".root"]:
                    os.remove(flavio_path + "/" +
                              config2.return_config()["filename"] + filetype)

        ##print progress
        if index1 == 0:
            print "Cut sides which are choosen: {sides}".format(sides=cut_side)
        print "Cut values for iteration {index}: {values}".format(
            index=index1, values=cut_values)

    ##Save data in cut.yaml
    cut_info = yaml.load(
        open(
            os.path.abspath(
                os.path.expandvars(
                    "$CMSSW_BASE/src/HiggsAnalysis/KITHiggsToTauTau/python/lfv/cuts.yaml"
                )), "r"))
    if cut_info == None:
        for category in [0 if weight == "(njetspt30==0)" else 1]:
            cut_info = {category: {channel: {}}}
            for (cut, side, parameter) in zip(cut_values, cut_side, x):
                cut_info[category][channel][parameter] = [cut, side]

    else:
        for category in [0 if weight == "(njetspt30==0)" else 1]:
            try:
                cut_info[category][channel] = {}
            except KeyError:
                cut_info[category] = {channel: {}}
            for (cut, side, parameter) in zip(cut_values, cut_side, x):
                cut_info[category][channel][parameter] = [cut, side]

    yaml.dump(
        cut_info,
        open(
            os.path.abspath(
                os.path.expandvars(
                    "$CMSSW_BASE/src/HiggsAnalysis/KITHiggsToTauTau/python/lfv/cuts.yaml"
                )), "w"),
        default_flow_style=False)

    sys.exit()