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
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
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
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
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
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
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()