Back to home page

sPhenix code displayed by LXR

 
 

    


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     // loop over all centrality bins
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         // the minimum of non-zero values
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     // print the LaTeX table: for each category, print the min and max uncertainty for all centralities in the format of %.2f-%.2f %
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     // if the uncertainty is less than 0.1%, round up the number to the nearest 0.01 and print it as <[rounded number]
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     // format to print 2 significant digits
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     // print_with_significant_digits(*std::min_element(v_unc_statunccorr_min_allcent.begin(), v_unc_statunccorr_min_allcent.end()) * 100, 2);
0107     // print the float number, with exactly 1 digit after the decimal point
0108     printf("%.1f", *std::min_element(v_unc_statunccorr_min_allcent.begin(), v_unc_statunccorr_min_allcent.end()) * 100);
0109     std::cout << "--";
0110     // print_with_significant_digits(*std::max_element(v_unc_statunccorr_max_allcent.begin(), v_unc_statunccorr_max_allcent.end()) * 100, 2);
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     // print_with_significant_digits(*std::min_element(v_unc_dRcut_min_allcent.begin(), v_unc_dRcut_min_allcent.end()) * 100, 2);
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     // print_with_significant_digits(*std::max_element(v_unc_dRcut_max_allcent.begin(), v_unc_dRcut_max_allcent.end()) * 100, 2);
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     // print_with_significant_digits(*std::min_element(v_unc_clusAdcCut_min_allcent.begin(), v_unc_clusAdcCut_min_allcent.end()) * 100, 2);
0125     printf("%.1f", *std::min_element(v_unc_clusAdcCut_min_allcent.begin(), v_unc_clusAdcCut_min_allcent.end()) * 100);
0126     std::cout << "--";
0127     // print_with_significant_digits(*std::max_element(v_unc_clusAdcCut_max_allcent.begin(), v_unc_clusAdcCut_max_allcent.end()) * 100, 2);
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     // print_with_significant_digits(*std::min_element(v_unc_clusSizeCut_min_allcent.begin(), v_unc_clusSizeCut_min_allcent.end()) * 100, 2);
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     // print_with_significant_digits(*std::max_element(v_unc_clusSizeCut_max_allcent.begin(), v_unc_clusSizeCut_max_allcent.end()) * 100, 2);
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     // print_with_significant_digits(*std::min_element(v_unc_segment_min_allcent.begin(), v_unc_segment_min_allcent.end()) * 100, 2);
0142     printf("%.1f", *std::min_element(v_unc_segment_min_allcent.begin(), v_unc_segment_min_allcent.end()) * 100);
0143     std::cout << "--";
0144     // print_with_significant_digits(*std::max_element(v_unc_segment_max_allcent.begin(), v_unc_segment_max_allcent.end()) * 100, 2);
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     // print_with_significant_digits(*std::min_element(v_unc_strangeness_min_allcent.begin(), v_unc_strangeness_min_allcent.end()) * 100, 2);
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     // print_with_significant_digits(*std::max_element(v_unc_strangeness_max_allcent.begin(), v_unc_strangeness_max_allcent.end()) * 100, 2);
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     // print_with_significant_digits(*std::min_element(v_unc_generator_min_allcent.begin(), v_unc_generator_min_allcent.end()) * 100, 2);
0159     printf("%.1f", *std::min_element(v_unc_generator_min_allcent.begin(), v_unc_generator_min_allcent.end()) * 100);
0160     std::cout << "--";
0161     // print_with_significant_digits(*std::max_element(v_unc_generator_max_allcent.begin(), v_unc_generator_max_allcent.end()) * 100, 2);
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     // print_with_significant_digits(*std::min_element(v_unc_total_min_allcent.begin(), v_unc_total_min_allcent.end()) * 100, 2);
0167     printf("%.1f", *std::min_element(v_unc_total_min_allcent.begin(), v_unc_total_min_allcent.end()) * 100);
0168     std::cout << "--";
0169     // print_with_significant_digits(*std::max_element(v_unc_total_max_allcent.begin(), v_unc_total_max_allcent.end()) * 100, 2);
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 }