File indexing completed on 2025-08-05 08:11:19
0001 #include "./plotutil.h"
0002
0003 std::vector<float> centralitybins = {0, 3, 6, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70};
0004
0005 std::vector<float> getuncertainty(std::string filename, std::string histname)
0006 {
0007 TFile *f = new TFile(filename.c_str(), "READ");
0008 TH1F *h = (TH1F *)f->Get(histname.c_str());
0009 h->SetDirectory(0);
0010 std::vector<float> v_uncertainty;
0011 v_uncertainty.clear();
0012 for (int i = 1; i <= h->GetNbinsX(); i++)
0013 {
0014 if (h->GetBinContent(i) != 0)
0015 v_uncertainty.push_back(h->GetBinContent(i));
0016 }
0017 f->Close();
0018
0019 return v_uncertainty;
0020 }
0021
0022 void print_SystTable()
0023 {
0024
0025 std::vector<float> v_unc_statunccorr_max_allcent, v_unc_dRcut_max_allcent, v_unc_clusAdcCut_max_allcent, v_unc_clusSizeCut_max_allcent, v_unc_segment_max_allcent, v_unc_strangeness_max_allcent, v_unc_generator_max_allcent, v_unc_total_max_allcent;
0026 std::vector<float> v_unc_statunccorr_min_allcent, v_unc_dRcut_min_allcent, v_unc_clusAdcCut_min_allcent, v_unc_clusSizeCut_min_allcent, v_unc_segment_min_allcent, v_unc_strangeness_min_allcent, v_unc_generator_min_allcent, v_unc_total_min_allcent;
0027 for (int i = 0; i < centralitybins.size() - 1; i++)
0028 {
0029 std::cout << "Centrality " << (int)centralitybins[i] << "-" << (int)centralitybins[i + 1] << "%" << std::endl;
0030 std::string fname = Form("./systematics/Centrality%dto%d_Zvtxm10p0to10p0_noasel/finalhists_systematics_Centrality%dto%d_Zvtxm10p0to10p0_noasel.root", (int)centralitybins[i], (int)centralitybins[i + 1], (int)centralitybins[i], (int)centralitybins[i + 1]);
0031 std::vector<float> v_unc_statunccorr = getuncertainty(fname, "hM_statunc_nominal");
0032 std::vector<float> v_unc_dRcut = getuncertainty(fname, "hM_maxreldiff_dRcut");
0033 std::vector<float> v_unc_clusAdcCut = getuncertainty(fname, "hM_maxreldiff_clusAdcCut");
0034 std::vector<float> v_unc_clusSizeCut = getuncertainty(fname, "hM_maxreldiff_clusPhiSizeCut");
0035 std::vector<float> v_unc_segment = getuncertainty(fname, "hM_maxreldiff_segment");
0036 std::vector<float> v_unc_strangeness = getuncertainty(fname, "hM_maxreldiff_strangeness");
0037 std::vector<float> v_unc_generator = getuncertainty(fname, "hM_maxreldiff_eventgen");
0038 std::vector<float> v_unc_total = getuncertainty(fname, "hM_TotalRelUnc");
0039
0040 float unc_statunccorr_max = *std::max_element(v_unc_statunccorr.begin(), v_unc_statunccorr.end());
0041 float unc_dRcut_max = *std::max_element(v_unc_dRcut.begin(), v_unc_dRcut.end());
0042 float unc_clusAdcCut_max = *std::max_element(v_unc_clusAdcCut.begin(), v_unc_clusAdcCut.end());
0043 float unc_clusSizeCut_max = *std::max_element(v_unc_clusSizeCut.begin(), v_unc_clusSizeCut.end());
0044 float unc_segment_max = *std::max_element(v_unc_segment.begin(), v_unc_segment.end());
0045 float unc_strangeness_max = *std::max_element(v_unc_strangeness.begin(), v_unc_strangeness.end());
0046 float unc_generator_max = *std::max_element(v_unc_generator.begin(), v_unc_generator.end());
0047 float unc_total_max = *std::max_element(v_unc_total.begin(), v_unc_total.end());
0048
0049 float unc_statunccorr_min = *std::min_element(v_unc_statunccorr.begin(), v_unc_statunccorr.end());
0050 float unc_dRcut_min = *std::min_element(v_unc_dRcut.begin(), v_unc_dRcut.end());
0051 float unc_clusAdcCut_min = *std::min_element(v_unc_clusAdcCut.begin(), v_unc_clusAdcCut.end());
0052 float unc_clusSizeCut_min = *std::min_element(v_unc_clusSizeCut.begin(), v_unc_clusSizeCut.end());
0053 float unc_segment_min = *std::min_element(v_unc_segment.begin(), v_unc_segment.end());
0054 float unc_strangeness_min = *std::min_element(v_unc_strangeness.begin(), v_unc_strangeness.end());
0055 float unc_generator_min = *std::min_element(v_unc_generator.begin(), v_unc_generator.end());
0056 float unc_total_min = *std::min_element(v_unc_total.begin(), v_unc_total.end());
0057
0058 std::cout << "Max uncertainty for (statunc, dRcut, clusAdcCut, clusSizeCut, segment, strangeness, generator, total) = (" << unc_statunccorr_max * 100 << ", " << unc_dRcut_max * 100 << ", " << unc_clusAdcCut_max * 100 << ", " << unc_clusSizeCut_max * 100 << ", " << unc_segment_max * 100 << ", " << unc_strangeness_max * 100 << ", " << unc_generator_max * 100 << ", " << unc_total_max * 100 << ")" << std::endl;
0059 std::cout << "Min uncertainty for (statunc, dRcut, clusAdcCut, clusSizeCut, segment, strangeness, generator, total) = (" << unc_statunccorr_min * 100 << ", " << unc_dRcut_min * 100 << ", " << unc_clusAdcCut_min * 100 << ", " << unc_clusSizeCut_min * 100 << ", " << unc_segment_min * 100 << ", " << unc_strangeness_min * 100 << ", " << unc_generator_min * 100 << ", " << unc_total_min * 100 << ")" << std::endl;
0060
0061 v_unc_statunccorr_max_allcent.push_back(unc_statunccorr_max);
0062 v_unc_dRcut_max_allcent.push_back(unc_dRcut_max);
0063 v_unc_clusAdcCut_max_allcent.push_back(unc_clusAdcCut_max);
0064 v_unc_clusSizeCut_max_allcent.push_back(unc_clusSizeCut_max);
0065 v_unc_segment_max_allcent.push_back(unc_segment_max);
0066 v_unc_strangeness_max_allcent.push_back(unc_strangeness_max);
0067 v_unc_generator_max_allcent.push_back(unc_generator_max);
0068 v_unc_total_max_allcent.push_back(unc_total_max);
0069 v_unc_statunccorr_min_allcent.push_back(unc_statunccorr_min);
0070 v_unc_dRcut_min_allcent.push_back(unc_dRcut_min);
0071 v_unc_clusAdcCut_min_allcent.push_back(unc_clusAdcCut_min);
0072 v_unc_clusSizeCut_min_allcent.push_back(unc_clusSizeCut_min);
0073 v_unc_segment_min_allcent.push_back(unc_segment_min);
0074 v_unc_strangeness_min_allcent.push_back(unc_strangeness_min);
0075 v_unc_generator_min_allcent.push_back(unc_generator_min);
0076 v_unc_total_min_allcent.push_back(unc_total_min);
0077 }
0078
0079 std::cout << "--------------------------------" << std::endl;
0080 std::cout << "Max uncertainty for all centralities for (statuncorr, dRcut, clusAdcCut, clusSizeCut, segment, strangeness, generator, total) = (" << *std::max_element(v_unc_statunccorr_max_allcent.begin(), v_unc_statunccorr_max_allcent.end()) * 100 << ", " << *std::max_element(v_unc_dRcut_max_allcent.begin(), v_unc_dRcut_max_allcent.end()) * 100 << ", "
0081 << *std::max_element(v_unc_clusAdcCut_max_allcent.begin(), v_unc_clusAdcCut_max_allcent.end()) * 100 << ", " << *std::max_element(v_unc_clusSizeCut_max_allcent.begin(), v_unc_clusSizeCut_max_allcent.end()) * 100 << ", " << *std::max_element(v_unc_segment_max_allcent.begin(), v_unc_segment_max_allcent.end()) * 100 << ", "
0082 << *std::max_element(v_unc_strangeness_max_allcent.begin(), v_unc_strangeness_max_allcent.end()) * 100 << ", " << *std::max_element(v_unc_generator_max_allcent.begin(), v_unc_generator_max_allcent.end()) * 100 << ", " << *std::max_element(v_unc_total_max_allcent.begin(), v_unc_total_max_allcent.end()) * 100 << ")" << std::endl;
0083 std::cout << "Min uncertainty for all centralities for (statuncorr, dRcut, clusAdcCut, clusSizeCut, segment, strangeness, generator, total) = (" << *std::min_element(v_unc_statunccorr_min_allcent.begin(), v_unc_statunccorr_min_allcent.end()) * 100 << ", " << *std::min_element(v_unc_dRcut_min_allcent.begin(), v_unc_dRcut_min_allcent.end()) * 100 << ", "
0084 << *std::min_element(v_unc_clusAdcCut_min_allcent.begin(), v_unc_clusAdcCut_min_allcent.end()) * 100 << ", " << *std::min_element(v_unc_clusSizeCut_min_allcent.begin(), v_unc_clusSizeCut_min_allcent.end()) * 100 << ", " << *std::min_element(v_unc_segment_min_allcent.begin(), v_unc_segment_min_allcent.end()) * 100 << ", "
0085 << *std::min_element(v_unc_strangeness_min_allcent.begin(), v_unc_strangeness_min_allcent.end()) * 100 << ", " << *std::min_element(v_unc_generator_min_allcent.begin(), v_unc_generator_min_allcent.end()) * 100 << ", " << *std::min_element(v_unc_total_min_allcent.begin(), v_unc_total_min_allcent.end()) * 100 << ")" << std::endl;
0086
0087
0088 bool unc_phisize_small = (*std::max_element(v_unc_clusSizeCut_max_allcent.begin(), v_unc_clusSizeCut_max_allcent.end()) * 100 < 0.1) ? true : false;
0089
0090 float unc_phisize_small_rounded = 0.0;
0091 if (unc_phisize_small)
0092 {
0093 unc_phisize_small_rounded = ceil(*std::max_element(v_unc_clusSizeCut_max_allcent.begin(), v_unc_clusSizeCut_max_allcent.end()) * 100 * 100) / 100;
0094 }
0095
0096 std::ostringstream oss;
0097 oss << "<" << std::fixed << std::setprecision(2) << unc_phisize_small_rounded;
0098 std::string unc_phisize_small_str = oss.str();
0099 std::cout << "\\begin{table}[H]" << std::endl;
0100 std::cout << "\t\\centering" << std::endl;
0101 std::cout << "\t\\begin{tabular}{l c c}" << std::endl;
0102 std::cout << "\t\\hline" << std::endl;
0103 std::cout << "\t\\textbf{Source} & \\textbf{\\phobos approach [\\%]} & \\textbf{\\cms approach [\\%]} \\\\" << std::endl;
0104 std::cout << "\t\\hline" << std::endl;
0105 std::cout << "\tStatistical Uncertainty in corrections & & ";
0106
0107
0108 printf("%.1f", *std::min_element(v_unc_statunccorr_min_allcent.begin(), v_unc_statunccorr_min_allcent.end()) * 100);
0109 std::cout << "--";
0110
0111 printf("%.1f", *std::max_element(v_unc_statunccorr_max_allcent.begin(), v_unc_statunccorr_max_allcent.end()) * 100);
0112 std::cout << " \\\\" << std::endl;
0113 std::cout << "\tTracklet reconstruction cut variation & & ";
0114
0115 if (*std::min_element(v_unc_dRcut_min_allcent.begin(), v_unc_dRcut_min_allcent.end()) * 100 < 0.1)
0116 printf("%.1e", *std::min_element(v_unc_dRcut_min_allcent.begin(), v_unc_dRcut_min_allcent.end()) * 100);
0117 else
0118 printf("%.1f", *std::min_element(v_unc_dRcut_min_allcent.begin(), v_unc_dRcut_min_allcent.end()) * 100);
0119 std::cout << "--";
0120
0121 printf("%.1f", *std::max_element(v_unc_dRcut_max_allcent.begin(), v_unc_dRcut_max_allcent.end()) * 100);
0122 std::cout << " \\\\" << std::endl;
0123 std::cout << "\tCluster ADC cut variation & & ";
0124
0125 printf("%.1f", *std::min_element(v_unc_clusAdcCut_min_allcent.begin(), v_unc_clusAdcCut_min_allcent.end()) * 100);
0126 std::cout << "--";
0127
0128 printf("%.1f", *std::max_element(v_unc_clusAdcCut_max_allcent.begin(), v_unc_clusAdcCut_max_allcent.end()) * 100);
0129 std::cout << " \\\\" << std::endl;
0130 std::cout << "\tCluster \$\\phi\$-size cut variation & & ";
0131
0132 if (*std::min_element(v_unc_clusSizeCut_min_allcent.begin(), v_unc_clusSizeCut_min_allcent.end()) * 100 < 0.1)
0133 printf("%.1e", *std::min_element(v_unc_clusSizeCut_min_allcent.begin(), v_unc_clusSizeCut_min_allcent.end()) * 100);
0134 else
0135 printf("%.1f", *std::min_element(v_unc_clusSizeCut_min_allcent.begin(), v_unc_clusSizeCut_min_allcent.end()) * 100);
0136 std::cout << "--";
0137
0138 printf("%.1f", *std::max_element(v_unc_clusSizeCut_max_allcent.begin(), v_unc_clusSizeCut_max_allcent.end()) * 100);
0139 std::cout << " \\\\" << std::endl;
0140 std::cout << "\tRun segment variation & & ";
0141
0142 printf("%.1f", *std::min_element(v_unc_segment_min_allcent.begin(), v_unc_segment_min_allcent.end()) * 100);
0143 std::cout << "--";
0144
0145 printf("%.1f", *std::max_element(v_unc_segment_max_allcent.begin(), v_unc_segment_max_allcent.end()) * 100);
0146 std::cout << " \\\\" << std::endl;
0147 std::cout << "\tStrangeness variation & & ";
0148
0149 if (*std::min_element(v_unc_strangeness_min_allcent.begin(), v_unc_strangeness_min_allcent.end()) * 100 < 0.1)
0150 printf("%.1e", *std::min_element(v_unc_strangeness_min_allcent.begin(), v_unc_strangeness_min_allcent.end()) * 100);
0151 else
0152 printf("%.1f", *std::min_element(v_unc_strangeness_min_allcent.begin(), v_unc_strangeness_min_allcent.end()) * 100);
0153 std::cout << "--";
0154
0155 printf("%.1f", *std::max_element(v_unc_strangeness_max_allcent.begin(), v_unc_strangeness_max_allcent.end()) * 100);
0156 std::cout << " \\\\" << std::endl;
0157 std::cout << "\tGenerator variation & & ";
0158
0159 printf("%.1f", *std::min_element(v_unc_generator_min_allcent.begin(), v_unc_generator_min_allcent.end()) * 100);
0160 std::cout << "--";
0161
0162 printf("%.1f", *std::max_element(v_unc_generator_max_allcent.begin(), v_unc_generator_max_allcent.end()) * 100);
0163 std::cout << " \\\\" << std::endl;
0164 std::cout << "\tMisalignment & & -- \\\\\\cmidrule(rl){2-3}" << std::endl;
0165 std::cout << "\t\\textbf{Total} & & ";
0166
0167 printf("%.1f", *std::min_element(v_unc_total_min_allcent.begin(), v_unc_total_min_allcent.end()) * 100);
0168 std::cout << "--";
0169
0170 printf("%.1f", *std::max_element(v_unc_total_max_allcent.begin(), v_unc_total_max_allcent.end()) * 100);
0171 std::cout << " \\\\" << std::endl;
0172 std::cout << "\t\\hline" << std::endl;
0173 std::cout << "\t\\end{tabular}" << std::endl;
0174 std::cout << "\t\\caption{Systematic uncertainties for different sources.}" << std::endl;
0175 std::cout << "\t\\label{tab:uncsummary}" << std::endl;
0176 std::cout << "\\end{table}" << std::endl;
0177 }