def print_xsections(xsections, channel, toFile=True): global savePath, variable, k_value, met_type, b_tag_bin printout = '\n' printout += '=' * 60 printout = '\n' printout += 'Results for %s variable, %s channel, k-value %s, met type %s, %s b-tag region\n' % ( variable, channel, k_value, met_type, b_tag_bin) printout += '=' * 60 printout += '\n' rows = {} header = 'Measurement' scale = 100 bins = variable_bins_ROOT[variable] assert (len(bins) == len(xsections['central'])) for bin_i, variable_bin in enumerate(bins): header += '& $\sigma_{meas}$ %s bin %s~\GeV' % (variable, variable_bin) for source in categories: value, error = xsections[source][bin_i] relativeError = getRelativeError(value, error) text = ' $(%.2f \pm %.2f) \cdot 10^{-2}$ ' % ( value * scale, error * scale) + '(%.2f' % (relativeError * 100) + '\%)' if rows.has_key(source): rows[source].append(text) else: rows[source] = [translateOptions[source], text] header += '\\\\ \n' printout += header printout += '\hline\n' for item in rows['central']: printout += item + '&' printout = printout.rstrip('&') printout += '\\\\ \n' for source in sorted(rows.keys()): if source == 'central': continue for item in rows[source]: printout += item + '&' printout = printout.rstrip('&') printout += '\\\\ \n' printout += '\hline \n\n' make_folder_if_not_exists(savePath + '/' + variable) if toFile: output_file = open( savePath + '/' + variable + '/normalised_xsection_result_' + channel + '_' + met_type + '_kv' + str(k_value) + '.tex', 'w') output_file.write(printout) output_file.close() else: print printout
def print_xsections(xsections, channel, toFile = True): global savePath, variable, k_value, met_type, b_tag_bin printout = '\n' printout += '=' * 60 printout = '\n' printout += 'Results for %s variable, %s channel, k-value %s, met type %s, %s b-tag region\n' % (variable, channel, k_value, met_type, b_tag_bin) printout += '=' * 60 printout += '\n' rows = {} header = 'Measurement' scale = 100 bins = variable_bins_ROOT[variable] assert(len(bins) == len(xsections['central'])) for bin_i, variable_bin in enumerate(bins): header += '& $\sigma_{meas}$ %s bin %s~\GeV' % (variable, variable_bin) for source in categories: value, error = xsections[source][bin_i] relativeError = getRelativeError(value, error) text = ' $(%.2f \pm %.2f) \cdot 10^{-2}$ ' % (value * scale, error * scale) + '(%.2f' % (relativeError * 100) + '\%)' if rows.has_key(source): rows[source].append(text) else: rows[source] = [translateOptions[source], text] header += '\\\\ \n' printout += header printout += '\hline\n' for item in rows['central']: printout += item + '&' printout = printout.rstrip('&') printout += '\\\\ \n' for source in sorted(rows.keys()): if source == 'central': continue for item in rows[source]: printout += item + '&' printout = printout.rstrip('&') printout += '\\\\ \n' printout += '\hline \n\n' make_folder_if_not_exists(savePath + '/' + variable) if toFile: output_file = open(savePath + '/' + variable + '/normalised_xsection_result_' + channel + '_' + met_type + '_kv' + str(k_value) + '.tex', 'w') output_file.write(printout) output_file.close() else: print printout
def print_xsections_with_uncertainties(xsections, channel, toFile=True): global savePath, variable, k_value, met_type, b_tag_bin printout = '\n' printout += '=' * 60 printout = '\n' printout += 'Results for %s variable, %s channel, k-value %s, met type %s, %s b-tag region\n' % ( variable, channel, k_value, met_type, b_tag_bin) printout += '=' * 60 printout += '\n' # rows = {} printout += '%s bin & $\sigma_{meas}$ \\\\ \n' % variable printout += '\hline\n' uncertainties = {} header = 'Uncertainty' bins = variable_bins_ROOT[variable] assert (len(bins) == len(xsections['central'])) for bin_i, variable_bin in enumerate(bins): header += '& %s bin %s' % (variable, variable_bin) centralresult = xsections['central'][bin_i] uncertainty = calculateTotalUncertainty(xsections, bin_i) uncertainty_total_plus = uncertainty['Total+'][0] uncertainty_total_minus = uncertainty['Total-'][0] uncertainty_total_plus, uncertainty_total_minus = symmetriseErrors( uncertainty_total_plus, uncertainty_total_minus) scale = 100 central_measurement = centralresult[0] fit_error = centralresult[1] formatting = (variable_bins_latex[variable_bin], central_measurement * scale, fit_error * scale, uncertainty_total_plus * scale, uncertainty_total_minus * scale) text = '%s & $%.2f \pm %.2f (fit)^{+%.2f}_{-%.2f} (sys) \cdot 10^{-2}$\\\\ \n' % formatting if doSymmetricErrors: relativeError = getRelativeError( central_measurement, fit_error + uncertainty_total_plus) formatting = (variable_bins_latex[variable_bin], central_measurement * scale, fit_error * scale, uncertainty_total_plus * scale) text = '%s & $\\left(%.2f \\pm %.2f \\text{ (fit)} \pm %.2f \\text{ (syst.)}\\right)' % formatting + '(%.2f' % ( relativeError * 100) + '\%) \\times 10^{-2}\, \\GeV^{-1}$\\\\ \n' printout += text for source in uncertainty.keys(): unc_result = uncertainty[source] if not uncertainties.has_key(source): if source in metsystematics_sources: uncertainties[ source] = metsystematics_sources_latex[source] + ' & ' else: uncertainties[source] = source + ' & ' relativeError = getRelativeError(centralresult[0], unc_result[0]) # text = ' $(%.2f \pm %.2f) \cdot 10^{-2} $ ' % (unc_result[0]*scale,unc_result[1]*scale) + '(%.2f' % (relativeError * 100) + '\%) &' text = '%.2f' % (relativeError * 100) + '\% &' # text = ' $%.2f \pm %.2f $ ' % (unc_result[0]*scale,unc_result[1]*scale) + '(%.2f' % (relativeError * 100) + '\%) &' uncertainties[source] += text printout += '\\\\ \n' for source in sorted(uncertainties.keys()): value = uncertainties[source] value = value.rstrip('&') value += '\\\\ \n' printout += value make_folder_if_not_exists(savePath + '/' + variable) if toFile: output_file = open( savePath + '/' + variable + '/normalised_xsection_main_result_' + channel + '_' + met_type + '_kv' + str(k_value) + '.tex', 'w') output_file.write(printout) output_file.close() else: print printout
def print_typical_systematics_table(central_values, errors, channel, toFile=True, print_before_unfolding=False): global output_folder, variable, met_type, b_tag_bin, all_measurements, phase_space, measurement_config bins = None if phase_space == "VisiblePS": bins = variable_bins_visiblePS_ROOT[variable] elif phase_space == "FullPS": bins = variable_bins_ROOT[variable] if print_before_unfolding: measurement = "measured" else: measurement = "unfolded" assert len(bins) == len(errors["central"]) assert len(bins) == len(central_values[measurement]) typical_systematics = measurement_config.typical_systematics for s in typical_systematics: assert errors.has_key(s) group_errors = {} for group in measurement_config.typical_systematics_summary: group_errors[group] = [] for bin_i, _ in enumerate(bins): central_value = central_values[measurement][bin_i][0] uncertainties = {} # calculate all relative errors for systematic in typical_systematics: abs_error = errors[systematic][bin_i] relative_error = getRelativeError(central_value, abs_error) uncertainties[systematic] = relative_error # add errors in a group in quadrature for group, u_list in measurement_config.typical_systematics_summary.items(): group_error_squared = 0 for subgroup in u_list: # use the biggest of up and down subgroup_error = max(uncertainties[subgroup[0]], uncertainties[subgroup[1]]) group_error_squared += pow(subgroup_error, 2) group_errors[group].append(math.sqrt(group_error_squared)) summarised_typical_systematics = {} summarised_max_systematics = {} # calculate the median # x 100 to be in % for group, u_list in group_errors.items(): summarised_typical_systematics[group] = median(u_list) * 100 summarised_max_systematics[group] = max(u_list) * 100 for summary, errors in {"median": summarised_typical_systematics, "max": summarised_max_systematics}.iteritems(): printout = "%% " + "=" * 60 printout += "\n" printout += "%% Typical systematics table for {0} channel, met type {1}, {2} b-tag region\n".format( channel, met_type, b_tag_bin ) if print_before_unfolding: printout += "%% BEFORE UNFOLDING\n" printout += "%% " + "=" * 60 printout += "\n" printout += "\\begin{table}[htbp]\n" printout += "\\centering\n" printout += "\\caption{Typical systematic uncertainties (median values) for the normalised \\ttbar cross section measurement \n" printout += "at a centre-of-mass energy of {0} TeV ".format(measurement_config.centre_of_mass_energy) if channel == "combined" or channel == "combinedBeforeUnfolding": printout += "(combination of electron and muon channels).}\n" else: printout += "({0} channel).}\n".format(channel) printout += "\\label{{tab:typical_systematics_{0}TeV_{1}}}\n".format( measurement_config.centre_of_mass_energy, channel ) printout += "\\resizebox{\\columnwidth}{!} {\n" printout += "\\begin{tabular}{l" + "r" * len(bins) + "}\n" printout += "\\hline\n" header = "Uncertainty source " header += "& {0}".format(variables_latex[variable]) header += " " printout += header printout += "\n\\hline\n" for group, ts in errors.items(): printout += group + " (\\%) & {:.2f} \\\\ \n".format(ts) printout += "\\hline \n" printout += "\\hline \n" printout += "\\end{tabular}\n" printout += "}\n" printout += "\\end{table}\n" if toFile: path = output_folder + "/" make_folder_if_not_exists(path) file_template = path + "/{0}_systematics_{1}TeV_{2}.tex".format( summary, measurement_config.centre_of_mass_energy, channel ) if print_before_unfolding: make_folder_if_not_exists(path + "/before_unfolding/") file_template = file_template.replace(path, path + "/before_unfolding/") if os.path.isfile(file_template): with open(file_template, "r+") as output_file: lines = output_file.readlines() for line_number, line in enumerate(lines): if line.startswith("Uncertainty source"): lines[line_number] = lines[line_number].strip() + "& " + variables_latex[variable] + "\n" elif variable == "HT" and line.startswith("$E_{T}^{miss}$ uncertainties"): lines[line_number] = lines[line_number].strip() + "& - \n" else: for group, ts in errors.items(): if line.startswith(group): new_line = line.replace("\\\\", "") new_line = new_line.strip() lines[line_number] = new_line + "& {:.2f} \\\\ \n".format(ts) output_file.seek(0) for line in lines: output_file.write(line) else: output_file = open(file_template, "w") output_file.write(printout) output_file.close() else: print printout
def print_error_table(central_values, errors, channel, toFile=True, print_before_unfolding=False): global output_folder, variable, met_type, b_tag_bin, all_measurements, phase_space bins = None bins_latex = None binEdges = None variable_latex = variables_latex[variable] if phase_space == "VisiblePS": bins = variable_bins_visiblePS_ROOT[variable] bins_latex = variable_bins_visiblePS_latex[variable] binEdges = bin_edges_vis[variable] elif phase_space == "FullPS": bins = variable_bins_ROOT[variable] bins_latex = variable_bins_latex[variable] binEdges = bin_edges_full[variable] printout = "%% " + "=" * 60 printout += "\n" printout += "%% Systematics table for %s variable, %s channel, met type %s, %s b-tag region\n" % ( variable, channel, met_type, b_tag_bin, ) if print_before_unfolding: printout += "%% BEFORE UNFOLDING\n" printout += "%% " + "=" * 60 printout += "\n" printout += "\\begin{table}[htbp]\n" printout += "\\centering\n" printout += ( "\\caption{Systematic uncertainties for the normalised \\ttbar cross section measurement with respect to %s variable\n" % variable_latex ) printout += "at a centre-of-mass energy of %d TeV " % measurement_config.centre_of_mass_energy if channel == "combined" or channel == "combinedBeforeUnfolding": printout += "(combination of electron and muon channels).}\n" else: printout += "(%s channel).}\n" % channel printout += "\\label{tab:%s_systematics_%dTeV_%s}\n" % (variable, measurement_config.centre_of_mass_energy, channel) if variable == "MT": printout += "\\resizebox*{!}{\\textheight} {\n" else: printout += "\\resizebox{\\columnwidth}{!} {\n" printout += "\\begin{tabular}{l" + "r" * len(bins) + "}\n" printout += "\\hline\n" header = "Uncertainty source " rows = {} assert len(bins) == len(errors["central"]) if print_before_unfolding: assert len(bins) == len(central_values["measured"]) else: assert len(bins) == len(central_values["unfolded"]) errorHists = {} errorHists["statistical"] = [] for source in all_measurements: errorHists[source] = [] for bin_i, variable_bin in enumerate(bins): header += "& %s" % (bins_latex[variable_bin]) if print_before_unfolding: central_value = central_values["measured"][bin_i][0] else: central_value = central_values["unfolded"][bin_i][0] for source in all_measurements: if ( (variable == "HT" or variable == "NJets" or variable == "lepton_pt" or variable == "abs_lepton_eta") and source in measurement_config.met_systematics and not "JES" in source and not "JER" in source ): continue abs_error = errors[source][bin_i] relative_error = getRelativeError(central_value, abs_error) errorHists[source].append(relative_error) text = "%.2f" % (relative_error * 100) if rows.has_key(source): rows[source].append(text) elif met_type in source: rows[source] = [measurements_latex[source.replace(met_type, "")] + " (\%)", text] else: if source in met_systematics_latex.keys(): rows[source] = [met_systematics_latex[source] + " (\%)", text] else: rows[source] = [measurements_latex[source] + " (\%)", text] header += " \\\\" printout += header printout += "\n\\hline\n" for source in sorted(rows.keys()): if source == "central": continue for item in rows[source]: printout += item + " & " printout = printout.rstrip("& ") printout += " \\\\ \n" # append the total statistical error to the table printout += "\\hline \n" total_line = "Total Stat. (\%)" for bin_i, variable_bin in enumerate(bins): if print_before_unfolding: value, error = central_values["measured"][bin_i] else: value, error = central_values["unfolded"][bin_i] relativeError = getRelativeError(value, error) errorHists["statistical"].append(relativeError) total_line += " & %.2f " % (relativeError * 100) printout += total_line + "\\\\ \n" if not print_before_unfolding: make_error_plot(errorHists, binEdges) # append the total systematic error to the table total_line = "Total Sys. (\%)" for bin_i, variable_bin in enumerate(bins): if print_before_unfolding: value, error_up, error_down = central_values["measured_with_systematics_only"][bin_i] else: value, error_up, error_down = central_values["unfolded_with_systematics_only"][bin_i] error = max(error_up, error_down) relativeError = getRelativeError(value, error) total_line += " & %.2f " % (relativeError * 100) printout += total_line + "\\\\ \n" # append the total error to the table printout += "\\hline \n" total_line = "Total (\%)" for bin_i, variable_bin in enumerate(bins): if print_before_unfolding: value, error_up, error_down = central_values["measured_with_systematics"][bin_i] else: value, error_up, error_down = central_values["unfolded_with_systematics"][bin_i] error = max(error_up, error_down) relativeError = getRelativeError(value, error) total_line += " & %.2f " % (relativeError * 100) printout += total_line + "\\\\ \n" printout += "\\hline \n" printout += "\\end{tabular}\n" printout += "}\n" printout += "\\end{table}\n" if toFile: path = output_folder + "/" + variable + "/" make_folder_if_not_exists(path) file_template = path + "/%s_systematics_%dTeV_%s.tex" % ( variable, measurement_config.centre_of_mass_energy, channel, ) if print_before_unfolding: make_folder_if_not_exists(path + "/before_unfolding/") file_template = file_template.replace(path, path + "/before_unfolding/") output_file = open(file_template, "w") output_file.write(printout) output_file.close() else: print printout
def print_xsections(xsections, channel, toFile=True, print_before_unfolding=False): global output_folder, variable, met_type, b_tag_bin, phase_space printout = "%% " + "=" * 60 printout += "\n" printout += "%% Results for %s variable, %s channel, met type %s, %s b-tag region\n" % ( variable, channel, met_type, b_tag_bin, ) if print_before_unfolding: printout += "%% BEFORE UNFOLDING\n" printout += "%% " + "=" * 60 printout += "\n" printout += "\\begin{table}[htbp]\n" printout += "\\setlength{\\tabcolsep}{2pt}\n" printout += "\\centering\n" printout += ( "\\caption{Normalised \\ttbar cross section measurement with respect to %s variable\n" % variables_latex[variable] ) printout += "at a centre-of-mass energy of %d TeV " % measurement_config.centre_of_mass_energy if channel == "combined": printout += "(combination of electron and muon channels)." else: printout += "(%s channel)." % channel printout += " The errors shown are combined statistical, fit and unfolding errors ($^\dagger$) and systematic uncertainty ($^\star$).}\n" printout += "\\label{tab:%s_xsections_%dTeV_%s}\n" % (variable, measurement_config.centre_of_mass_energy, channel) # printout += '\\resizebox{\\columnwidth}{!} {\n' printout += "\\begin{tabular}{lrrrr}\n" printout += "\\hline\n" printout += ( "$%s$ bin [\\GeV] & \\multicolumn{4}{c}{$\sigma_{meas} \\left(\\times 10^{3}\\right)$}" % variables_latex[variable] ) printout += "\\\\ \n\hline\n" scale = 1000 bins = None bins_latex = None if phase_space == "VisiblePS": bins = variable_bins_visiblePS_ROOT[variable] bins_latex = variable_bins_visiblePS_latex[variable] elif phase_space == "FullPS": bins = variable_bins_ROOT[variable] bins_latex = variable_bins_latex[variable] assert len(bins) == len(xsections["unfolded_with_systematics"]) for bin_i, variable_bin in enumerate(bins): if print_before_unfolding: value, stat_error = xsections["measured"][bin_i] _, total_error_up, total_error_down = xsections["measured_with_systematics"][bin_i] else: value, stat_error = xsections["unfolded"][bin_i] _, total_error_up, total_error_down = xsections["unfolded_with_systematics"][bin_i] # extracting the systematic error from the total in quadrature syst_error_up = math.sqrt(total_error_up ** 2 - stat_error ** 2) syst_error_down = math.sqrt(total_error_down ** 2 - stat_error ** 2) # relative errors for percentages total_relativeError_up = getRelativeError(value, total_error_up) total_relativeError_down = getRelativeError(value, total_error_down) if total_error_up == total_error_down: printout += ( "%s & " % bins_latex[variable_bin] + " $%.2f$ & $ \pm~ %.2f^\\dagger$ & $ \pm~ %.2f^\\star$ & " % (value * scale, stat_error * scale, syst_error_up * scale) + "$(%.2f" % (total_relativeError_up * 100) + "\%)$" ) else: printout += ( "%s & " % bins_latex[variable_bin] + " $%.2f$ & $ \pm~ %.2f^\\dagger$ & $ ~^{+%.2f}_{-%.2f}^\\star$ & " % (value * scale, stat_error * scale, syst_error_up * scale, syst_error_down * scale) + "$(^{+%.2f}_{-%.2f}" % (total_relativeError_up * 100, total_relativeError_down * 100) + "\%)$" ) printout += "\\\\ \n" printout += "\\hline \n" printout += "\\end{tabular}\n" # printout += '}\n' #for resizebox printout += "\\end{table}\n" if toFile: path = output_folder + "/" + variable make_folder_if_not_exists(path) file_template = path + "/%s_normalised_xsection_%dTeV_%s.tex" % ( variable, measurement_config.centre_of_mass_energy, channel, ) if print_before_unfolding: make_folder_if_not_exists(path + "/before_unfolding/") file_template = file_template.replace(path, path + "/before_unfolding/") output_file = open(file_template, "w") output_file.write(printout) output_file.close() else: print printout
def print_xsections_with_uncertainties(xsections, channel, toFile = True): global savePath, variable, k_value, met_type, b_tag_bin printout = '\n' printout += '=' * 60 printout = '\n' printout += 'Results for %s variable, %s channel, k-value %s, met type %s, %s b-tag region\n' % (variable, channel, k_value, met_type, b_tag_bin) printout += '=' * 60 printout += '\n' # rows = {} printout += '%s bin & $\sigma_{meas}$ \\\\ \n' % variable printout += '\hline\n' uncertainties = {} header = 'Uncertainty' bins = variable_bins_ROOT[variable] assert(len(bins) == len(xsections['central'])) for bin_i, variable_bin in enumerate(bins): header += '& %s bin %s' % (variable, variable_bin) centralresult = xsections['central'][bin_i] uncertainty = calculateTotalUncertainty(xsections, bin_i) uncertainty_total_plus = uncertainty['Total+'][0] uncertainty_total_minus = uncertainty['Total-'][0] uncertainty_total_plus, uncertainty_total_minus = symmetriseErrors(uncertainty_total_plus, uncertainty_total_minus) scale = 100 central_measurement = centralresult[0] fit_error = centralresult[1] formatting = (variable_bins_latex[variable_bin], central_measurement * scale, fit_error * scale, uncertainty_total_plus * scale, uncertainty_total_minus * scale) text = '%s & $%.2f \pm %.2f (fit)^{+%.2f}_{-%.2f} (sys) \cdot 10^{-2}$\\\\ \n' % formatting if doSymmetricErrors: relativeError = getRelativeError(central_measurement, fit_error+uncertainty_total_plus) formatting = (variable_bins_latex[variable_bin], central_measurement * scale, fit_error * scale, uncertainty_total_plus * scale) text = '%s & $\\left(%.2f \\pm %.2f \\text{ (fit)} \pm %.2f \\text{ (syst.)}\\right)' % formatting + '(%.2f' % (relativeError * 100) + '\%) \\times 10^{-2}\, \\GeV^{-1}$\\\\ \n' printout += text for source in uncertainty.keys(): unc_result = uncertainty[source] if not uncertainties.has_key(source): if source in metsystematics_sources: uncertainties[source] = metsystematics_sources_latex[source] + ' & ' else: uncertainties[source] = source + ' & ' relativeError = getRelativeError(centralresult[0], unc_result[0]) # text = ' $(%.2f \pm %.2f) \cdot 10^{-2} $ ' % (unc_result[0]*scale,unc_result[1]*scale) + '(%.2f' % (relativeError * 100) + '\%) &' text = '%.2f' % (relativeError * 100) + '\% &' # text = ' $%.2f \pm %.2f $ ' % (unc_result[0]*scale,unc_result[1]*scale) + '(%.2f' % (relativeError * 100) + '\%) &' uncertainties[source] += text printout += '\\\\ \n' for source in sorted(uncertainties.keys()): value = uncertainties[source] value = value.rstrip('&') value += '\\\\ \n' printout += value make_folder_if_not_exists(savePath + '/' + variable) if toFile: output_file = open(savePath + '/' + variable + '/normalised_xsection_main_result_' + channel + '_' + met_type + '_kv' + str(k_value) + '.tex', 'w') output_file.write(printout) output_file.close() else: print printout