File indexing completed on 2025-12-16 09:17:31
0001 #include <iostream>
0002 #include <TFile.h>
0003 #include <TH1D.h>
0004 #include "/sphenix/user/hanpuj/CaloDataAna24_skimmed/src/draw_template.C"
0005 #include "unfold_Def.h"
0006
0007 void get_purityefficiency_hist(TH1D *&h_purity, TH1D *&h_efficiency, string surfix, TFile *f_in, TFile *f_out, int jet_radius_index) {
0008
0009 TH1D* h_truth = (TH1D*)f_in->Get(("h_truth"+surfix).c_str());
0010 TH1D* h_measure = (TH1D*)f_in->Get(("h_measure"+surfix).c_str());
0011 TH2D* h_respmatrix = (TH2D*)f_in->Get(("h_respmatrix"+surfix).c_str());
0012 TH1D* h_fake = (TH1D*)f_in->Get(("h_fake"+surfix).c_str());
0013 TH1D* h_miss = (TH1D*)f_in->Get(("h_miss"+surfix).c_str());
0014 if (!h_truth || !h_measure || !h_respmatrix || !h_fake || !h_miss) {
0015 std::cerr << "Error: One or more histograms not found in input file for surfix: " << surfix << std::endl;
0016 return;
0017 }
0018
0019 h_purity = (TH1D*)h_respmatrix->ProjectionX(("h_purity"+surfix).c_str());
0020 h_purity->Divide(h_purity, h_measure, 1, 1, "B");
0021 h_efficiency = (TH1D*)h_respmatrix->ProjectionY(("h_efficiency"+surfix).c_str());
0022 h_efficiency->Divide(h_efficiency, h_truth, 1, 1, "B");
0023
0024 TH1D* h_purity_check = (TH1D*)h_respmatrix->ProjectionX(("h_purity"+surfix+"_check").c_str());
0025 h_purity_check->Add(h_fake);
0026 TH1D* h_efficiency_check = (TH1D*)h_respmatrix->ProjectionY(("h_efficiency"+surfix+"_check").c_str());
0027 h_efficiency_check->Add(h_miss);
0028 for (int i = 1; i <= h_purity_check->GetNbinsX(); i++) {
0029 float purity_check = h_purity_check->GetBinContent(i) / (double)h_measure->GetBinContent(i);
0030 if (purity_check != 1.0) std::cout << "Case: " << surfix << " in purity check failed at bin " << i << " with ratio = " << purity_check << " with purity content = " << h_purity_check->GetBinContent(i) << " and measurement content = " << h_measure->GetBinContent(i) << std::endl;
0031 }
0032 for (int i = 1; i <= h_efficiency_check->GetNbinsX(); i++) {
0033 float efficiency_check = h_efficiency_check->GetBinContent(i) / (double)h_truth->GetBinContent(i);
0034 if (efficiency_check != 1.0) std::cout << "Case: " << surfix << " in efficiency check failed at bin " << i << " with ratio = " << efficiency_check << " with purity content = " << h_efficiency_check->GetBinContent(i) << " and measurement content = " << h_truth->GetBinContent(i) << std::endl;
0035 }
0036
0037 f_out->cd();
0038 h_purity->Write();
0039 h_efficiency->Write();
0040
0041 TH1D* h_purity_proj = (TH1D*)h_respmatrix->ProjectionX("h_purity_proj");
0042 TH1D* h_efficiency_proj = (TH1D*)h_respmatrix->ProjectionY("h_efficiency_proj");
0043 std::vector<TH1F*> h_input;
0044 std::vector<int> color;
0045 std::vector<int> markerstyle;
0046 std::vector<std::string> text;
0047 std::vector<std::string> legend;
0048
0049 h_input.push_back((TH1F*)h_measure);
0050 h_input.push_back((TH1F*)h_purity_proj);
0051 color.push_back(kBlack);
0052 color.push_back(kRed);
0053 markerstyle.push_back(20);
0054 markerstyle.push_back(20);
0055 text.push_back("#bf{#it{sPHENIX}} Simulation");
0056 text.push_back("PYTHIA8 p+p#sqrt{s} = 200 GeV");
0057 text.push_back(("anti-k_{t} #kern[-0.5]{#it{R}} = 0." + std::to_string(jet_radius_index)).c_str());
0058 text.push_back(("|#eta^{jet}| < 0." + std::to_string((int)(11-jet_radius_index))).c_str());
0059 text.push_back("No z-vertex cut");
0060 legend.push_back("Reco jet spectrum");
0061 legend.push_back("Matched reco jet spectrum");
0062 draw_1D_multiple_plot_ratio(h_input, color, markerstyle,
0063 false, 10, true,
0064 true, 15, 75, false,
0065 false, 0, 0.5, true,
0066 false, 0.75, 1.1,
0067 true, "p_{T}^{reco jet} [GeV]", "Arbitrary Unit", "Purity", 1,
0068 true, text, 0.45, 0.9, 0.05,
0069 true, legend, 0.25, 0.2, 0.05,
0070 Form("figure_purityefficiency/purity%s_r0%d.png", surfix.c_str(), jet_radius_index));
0071 h_input.clear();
0072 legend.clear();
0073
0074 h_input.push_back((TH1F*)h_truth);
0075 h_input.push_back((TH1F*)h_efficiency_proj);
0076 legend.push_back("Truth jet spectrum");
0077 legend.push_back("Matched truth jet spectrum");
0078 draw_1D_multiple_plot_ratio(h_input, color, markerstyle,
0079 false, 10, true,
0080 true, 15, 75, false,
0081 false, 1e-9, 1e-1, true,
0082 false, 0., 1.2,
0083 true, "p_{T}^{truth jet} [GeV]", "Arbitrary Unit", "Efficiency", 1,
0084 true, text, 0.45, 0.9, 0.05,
0085 true, legend, 0.25, 0.2, 0.05,
0086 Form("figure_purityefficiency/efficiency%s_r0%d.png", surfix.c_str(), jet_radius_index));
0087 h_input.clear();
0088 color.clear();
0089 markerstyle.clear();
0090 text.clear();
0091 legend.clear();
0092 }
0093
0094 void get_purityefficiency_clonehist(TH1D *&h_purity, TH1D *&h_efficiency, string surfix, TH1D *h_purity_forclone, TH1D *h_efficiency_forclone, TFile *f_out) {
0095 h_purity = dynamic_cast<TH1D*>(h_purity_forclone->Clone(("h_purity"+surfix).c_str()));
0096 h_efficiency = dynamic_cast<TH1D*>((TH1D*)h_efficiency_forclone->Clone(("h_efficiency"+surfix).c_str()));
0097 f_out->cd();
0098 h_purity->Write();
0099 h_efficiency->Write();
0100 }
0101
0102 void do_puritycorr(TH1D* h_result, TH1D* h_purity, string result_surfix, string data_surfix, TFile* f_data, TFile* f_dataout) {
0103 TH1D* h_calibjet_pt = (TH1D*)f_data->Get(("h_calibjet_pt_scaled" + data_surfix).c_str());
0104 h_result = (TH1D*)h_calibjet_pt->Clone(("h_calibjet_pt_puritycorr" + result_surfix).c_str());
0105 h_result->Multiply(h_purity);
0106 f_dataout->cd();
0107 h_result->Write();
0108 }
0109
0110
0111 void get_purityefficiency(int radius_index = 4) {
0112
0113 TFile *f_in = new TFile(Form("output_sim_r0%d.root", radius_index), "READ");
0114 if (!f_in) {
0115 std::cout << "Error: cannot open output_sim_r0" << radius_index << ".root" << std::endl;
0116 return;
0117 }
0118 TFile *f_out = new TFile(Form("output_purityefficiency_r0%d.root", radius_index), "RECREATE");
0119 TFile* f_data = new TFile(Form("output_data_r0%d.root", radius_index), "READ");
0120 TFile* f_dataout = new TFile(Form("output_data_puritycorr_r0%d.root", radius_index), "RECREATE");
0121
0122
0123 TH1D* h_purity_nominal, *h_efficiency_nominal; get_purityefficiency_hist(h_purity_nominal, h_efficiency_nominal, "_nominal", f_in, f_out, radius_index);
0124 TH1D* h_purity_jesup, *h_efficiency_jesup; get_purityefficiency_hist(h_purity_jesup, h_efficiency_jesup, "_jesup", f_in, f_out, radius_index);
0125 TH1D* h_purity_jesdown, *h_efficiency_jesdown; get_purityefficiency_hist(h_purity_jesdown, h_efficiency_jesdown, "_jesdown", f_in, f_out, radius_index);
0126 TH1D* h_purity_jerup, *h_efficiency_jerup; get_purityefficiency_hist(h_purity_jerup, h_efficiency_jerup, "_jerup", f_in, f_out, radius_index);
0127 TH1D* h_purity_jerdown, *h_efficiency_jerdown; get_purityefficiency_hist(h_purity_jerdown, h_efficiency_jerdown, "_jerdown", f_in, f_out, radius_index);
0128 TH1D* h_purity_jettrigup, *h_efficiency_jettrigup; get_purityefficiency_clonehist(h_purity_jettrigup, h_efficiency_jettrigup, "_jettrigup", h_purity_nominal, h_efficiency_nominal, f_out);
0129 TH1D* h_purity_jettrigdown, *h_efficiency_jettrigdown; get_purityefficiency_clonehist(h_purity_jettrigdown, h_efficiency_jettrigdown, "_jettrigdown", h_purity_nominal, h_efficiency_nominal, f_out);
0130 TH1D* h_purity_jettimingup, *h_efficiency_jettimingup; get_purityefficiency_clonehist(h_purity_jettimingup, h_efficiency_jettimingup, "_jettimingup", h_purity_nominal, h_efficiency_nominal, f_out);
0131 TH1D* h_purity_jettimingdown, *h_efficiency_jettimingdown; get_purityefficiency_clonehist(h_purity_jettimingdown, h_efficiency_jettimingdown, "_jettimingdown", h_purity_nominal, h_efficiency_nominal, f_out);
0132
0133
0134 TH1D* h_calibjet_pt_puritycorr_nominal; do_puritycorr(h_calibjet_pt_puritycorr_nominal, h_purity_nominal, "_nominal", "_nominal", f_data, f_dataout);
0135 TH1D* h_calibjet_pt_puritycorr_jesup; do_puritycorr(h_calibjet_pt_puritycorr_jesup, h_purity_jesup, "_jesup", "_nominal", f_data, f_dataout);
0136 TH1D* h_calibjet_pt_puritycorr_jesdown; do_puritycorr(h_calibjet_pt_puritycorr_jesdown, h_purity_jesdown, "_jesdown", "_nominal", f_data, f_dataout);
0137 TH1D* h_calibjet_pt_puritycorr_jerup; do_puritycorr(h_calibjet_pt_puritycorr_jerup, h_purity_jerup, "_jerup", "_nominal", f_data, f_dataout);
0138 TH1D* h_calibjet_pt_puritycorr_jerdown; do_puritycorr(h_calibjet_pt_puritycorr_jerdown, h_purity_jerdown, "_jerdown", "_nominal", f_data, f_dataout);
0139 TH1D* h_calibjet_pt_puritycorr_jettrigup; do_puritycorr(h_calibjet_pt_puritycorr_jettrigup, h_purity_jettrigup, "_jettrigup", "_jettrigup", f_data, f_dataout);
0140 TH1D* h_calibjet_pt_puritycorr_jettrigdown; do_puritycorr(h_calibjet_pt_puritycorr_jettrigdown, h_purity_jettrigdown, "_jettrigdown", "_jettrigdown", f_data, f_dataout);
0141 TH1D* h_calibjet_pt_puritycorr_jettimingup; do_puritycorr(h_calibjet_pt_puritycorr_jettimingup, h_purity_jettimingup, "_jettimingup", "_jettimingup", f_data, f_dataout);
0142 TH1D* h_calibjet_pt_puritycorr_jettimingdown; do_puritycorr(h_calibjet_pt_puritycorr_jettimingdown, h_purity_jettimingdown, "_jettimingdown", "_jettimingdown", f_data, f_dataout);
0143 }