File indexing completed on 2025-12-16 09:17:31
0001 #include <TChain.h>
0002 #include <TFile.h>
0003 #include <TH1F.h>
0004 #include <TH2F.h>
0005 #include <TF1.h>
0006 #include <TMath.h>
0007 #include <iostream>
0008 #include <vector>
0009 #include <string>
0010 #include <cmath>
0011 #include "RooUnfold.h"
0012 #include "RooUnfoldResponse.h"
0013 #include "RooUnfoldBayes.h"
0014
0015 void do_unfolding_iteration_check(TH2D* h_respmatrix, TH1D* h_spectrum, string figure_name) {
0016 TH1D* h_meas = (TH1D*)h_respmatrix->ProjectionX("h_meas");
0017 TH1D* h_truth = (TH1D*)h_respmatrix->ProjectionY("h_truth");
0018 const int niter = 20;
0019 TH1D* h_unfolded[niter];
0020 for (int i = 0; i < niter; ++i) {
0021 RooUnfoldResponse* response = new RooUnfoldResponse(h_meas, h_truth, h_respmatrix, "response", "");
0022 RooUnfoldBayes unfold(response, h_spectrum, i + 1);
0023 h_unfolded[i] = (TH1D*)unfold.Hunfold(RooUnfold::kErrors);
0024 h_unfolded[i]->SetName(Form("h_unfolded_iter_%d", i + 1));
0025 }
0026
0027 TGraph* g_var_iter = new TGraph(niter-1);
0028 TGraph* g_var_error = new TGraph(niter-1);
0029 TGraph* g_var_total = new TGraph(niter-1);
0030 for (int i = 1; i < niter; ++i) {
0031 double var_iter = 0;
0032 double var_error = 0;
0033 double var_total = 0;
0034 for (int j = 3; j <= h_unfolded[i]->GetNbinsX()-1; ++j) {
0035 double diff = h_unfolded[i]->GetBinContent(j) - h_unfolded[i-1]->GetBinContent(j);
0036 double cont = (h_unfolded[i]->GetBinContent(j) + h_unfolded[i-1]->GetBinContent(j)) / 2.0;
0037 var_iter += diff * diff / (double)(cont * cont);
0038 var_error += h_unfolded[i]->GetBinError(j) * h_unfolded[i]->GetBinError(j) / (double)(h_unfolded[i]->GetBinContent(j) * h_unfolded[i]->GetBinContent(j));
0039 }
0040 var_iter = std::sqrt(var_iter / (double)(h_unfolded[i]->GetNbinsX()-3));
0041 var_error = std::sqrt(var_error / (double)(h_unfolded[i]->GetNbinsX()-3));
0042 var_total = std::sqrt(var_iter * var_iter + var_error * var_error);
0043
0044 g_var_iter->SetPoint(i-1, i+1, var_iter);
0045 g_var_error->SetPoint(i-1, i+1, var_error);
0046 g_var_total->SetPoint(i-1, i+1, var_total);
0047 }
0048 TCanvas* can = new TCanvas("can", "Unfolding Iteration Check", 800, 600);
0049 g_var_iter->SetMarkerStyle(20);
0050 g_var_iter->SetMarkerColor(kBlue);
0051 g_var_iter->SetLineColor(kBlue);
0052 g_var_error->SetMarkerStyle(20);
0053 g_var_error->SetMarkerColor(kRed);
0054 g_var_error->SetLineColor(kRed);
0055 g_var_total->SetMarkerStyle(20);
0056 g_var_total->SetMarkerColor(kBlack);
0057 g_var_total->SetLineColor(kBlack);
0058 g_var_total->SetMinimum(0);
0059 g_var_total->Draw("AP");
0060 g_var_iter->Draw("P same");
0061 g_var_error->Draw("P same");
0062 g_var_iter->GetXaxis()->SetTitle("Iteration");
0063 can->SaveAs((figure_name + ".png").c_str());
0064 }
0065
0066 void get_unfolded_spectrum(TH2D* h_respmatrix, TH1D* h_spectrum, TH1D*& h_unfolded, int niter, std::string hist_name, TH1D* h_eff) {
0067 TH1D* h_meas = (TH1D*)h_respmatrix->ProjectionX("h_meas");
0068 TH1D* h_truth = (TH1D*)h_respmatrix->ProjectionY("h_truth");
0069 RooUnfoldResponse* response = new RooUnfoldResponse(h_meas, h_truth, h_respmatrix, "response", "");
0070 RooUnfoldBayes unfold(response, h_spectrum, niter);
0071 h_unfolded = (TH1D*)unfold.Hunfold(RooUnfold::kErrors);
0072 h_unfolded->SetName(hist_name.c_str());
0073 h_unfolded->Divide(h_eff);
0074 }
0075
0076
0077 void do_unfolding_iter(int radius_index = 4) {
0078
0079 const float PI = TMath::Pi();
0080 float jet_radius = 0.1 * radius_index;
0081
0082
0083 TFile *f_out = new TFile(Form("output_unfolded_r0%d.root", radius_index), "RECREATE");
0084 TFile *f_data = new TFile(Form("output_data_puritycorr_r0%d.root", radius_index), "READ");
0085 TFile *f_in_rm = new TFile(Form("output_sim_r0%d.root", radius_index), "READ");
0086 TFile *f_efficiency = new TFile(Form("output_purityefficiency_r0%d.root", radius_index), "READ");
0087
0088
0089 TH1D* h_calibjet_pt_puritycorr_nominal = (TH1D*)f_data->Get("h_calibjet_pt_puritycorr_nominal");
0090 TH1D* h_calibjet_pt_puritycorr_jesup = (TH1D*)f_data->Get("h_calibjet_pt_puritycorr_jesup");
0091 TH1D* h_calibjet_pt_puritycorr_jesdown = (TH1D*)f_data->Get("h_calibjet_pt_puritycorr_jesdown");
0092 TH1D* h_calibjet_pt_puritycorr_jerup = (TH1D*)f_data->Get("h_calibjet_pt_puritycorr_jerup");
0093 TH1D* h_calibjet_pt_puritycorr_jerdown = (TH1D*)f_data->Get("h_calibjet_pt_puritycorr_jerdown");
0094 TH1D* h_calibjet_pt_puritycorr_jettrigup = (TH1D*)f_data->Get("h_calibjet_pt_puritycorr_jettrigup");
0095 TH1D* h_calibjet_pt_puritycorr_jettrigdown = (TH1D*)f_data->Get("h_calibjet_pt_puritycorr_jettrigdown");
0096 TH1D* h_calibjet_pt_puritycorr_jettimingup = (TH1D*)f_data->Get("h_calibjet_pt_puritycorr_jettimingup");
0097 TH1D* h_calibjet_pt_puritycorr_jettimingdown = (TH1D*)f_data->Get("h_calibjet_pt_puritycorr_jettimingdown");
0098
0099
0100 TH2D* h_respmatrix_nominal = (TH2D*)f_in_rm->Get("h_respmatrix_nominal");
0101 TH2D* h_respmatrix_jesup = (TH2D*)f_in_rm->Get("h_respmatrix_jesup");
0102 TH2D* h_respmatrix_jesdown = (TH2D*)f_in_rm->Get("h_respmatrix_jesdown");
0103 TH2D* h_respmatrix_jerup = (TH2D*)f_in_rm->Get("h_respmatrix_jerup");
0104 TH2D* h_respmatrix_jerdown = (TH2D*)f_in_rm->Get("h_respmatrix_jerdown");
0105 TH2D* h_respmatrix_jettrigup = (TH2D*)h_respmatrix_nominal->Clone("h_respmatrix_jettrigup");
0106 TH2D* h_respmatrix_jettrigdown = (TH2D*)h_respmatrix_nominal->Clone("h_respmatrix_jettrigdown");
0107 TH2D* h_respmatrix_jettimingup = (TH2D*)h_respmatrix_nominal->Clone("h_respmatrix_jettimingup");
0108 TH2D* h_respmatrix_jettimingdown = (TH2D*)h_respmatrix_nominal->Clone("h_respmatrix_jettimingdown");
0109
0110
0111 TH1D* h_efficiency_nominal = (TH1D*)f_efficiency->Get("h_efficiency_nominal");
0112 TH1D* h_efficiency_jesup = (TH1D*)f_efficiency->Get("h_efficiency_jesup");
0113 TH1D* h_efficiency_jesdown = (TH1D*)f_efficiency->Get("h_efficiency_jesdown");
0114 TH1D* h_efficiency_jerup = (TH1D*)f_efficiency->Get("h_efficiency_jerup");
0115 TH1D* h_efficiency_jerdown = (TH1D*)f_efficiency->Get("h_efficiency_jerdown");
0116 TH1D* h_efficiency_jettrigup = (TH1D*)f_efficiency->Get("h_efficiency_jettrigup");
0117 TH1D* h_efficiency_jettrigdown = (TH1D*)f_efficiency->Get("h_efficiency_jettrigdown");
0118 TH1D* h_efficiency_jettimingup = (TH1D*)f_efficiency->Get("h_efficiency_jettimingup");
0119 TH1D* h_efficiency_jettimingdown = (TH1D*)f_efficiency->Get("h_efficiency_jettimingdown");
0120
0121
0122 do_unfolding_iteration_check(h_respmatrix_nominal, h_calibjet_pt_puritycorr_nominal, Form("unfolding_iteration_check_nominal_r0%d", radius_index));
0123 int iteration = 4;
0124
0125 TH1D* h_unfold_nominal; get_unfolded_spectrum(h_respmatrix_nominal, h_calibjet_pt_puritycorr_nominal, h_unfold_nominal, iteration, "h_unfold_nominal", h_efficiency_nominal);
0126 TH1D* h_unfold_jesup; get_unfolded_spectrum(h_respmatrix_jesup, h_calibjet_pt_puritycorr_jesup, h_unfold_jesup, iteration, "h_unfold_jesup", h_efficiency_jesup);
0127 TH1D* h_unfold_jesdown; get_unfolded_spectrum(h_respmatrix_jesdown, h_calibjet_pt_puritycorr_jesdown, h_unfold_jesdown, iteration, "h_unfold_jesdown", h_efficiency_jesdown);
0128 TH1D* h_unfold_jerup; get_unfolded_spectrum(h_respmatrix_jerup, h_calibjet_pt_puritycorr_jerup, h_unfold_jerup, iteration, "h_unfold_jerup", h_efficiency_jerup);
0129 TH1D* h_unfold_jerdown; get_unfolded_spectrum(h_respmatrix_jerdown, h_calibjet_pt_puritycorr_jerdown, h_unfold_jerdown, iteration, "h_unfold_jerdown", h_efficiency_jerdown);
0130 TH1D* h_unfold_jettrigup; get_unfolded_spectrum(h_respmatrix_jettrigup, h_calibjet_pt_puritycorr_jettrigup, h_unfold_jettrigup, iteration, "h_unfold_jettrigup", h_efficiency_jettrigup);
0131 TH1D* h_unfold_jettrigdown; get_unfolded_spectrum(h_respmatrix_jettrigdown, h_calibjet_pt_puritycorr_jettrigdown, h_unfold_jettrigdown, iteration, "h_unfold_jettrigdown", h_efficiency_jettrigdown);
0132 TH1D* h_unfold_jettimingup; get_unfolded_spectrum(h_respmatrix_jettimingup, h_calibjet_pt_puritycorr_jettimingup, h_unfold_jettimingup, iteration, "h_unfold_jettimingup", h_efficiency_jettimingup);
0133 TH1D* h_unfold_jettimingdown; get_unfolded_spectrum(h_respmatrix_jettimingdown, h_calibjet_pt_puritycorr_jettimingdown, h_unfold_jettimingdown, iteration, "h_unfold_jettimingdown", h_efficiency_jettimingdown);
0134 TH1D* h_unfold_unfolditerup; get_unfolded_spectrum(h_respmatrix_nominal, h_calibjet_pt_puritycorr_nominal, h_unfold_unfolditerup, iteration+1, "h_unfold_unfolditerup", h_efficiency_nominal);
0135 TH1D* h_unfold_unfolditerdown; get_unfolded_spectrum(h_respmatrix_nominal, h_calibjet_pt_puritycorr_nominal, h_unfold_unfolditerdown, iteration-1, "h_unfold_unfolditerdown", h_efficiency_nominal);
0136
0137
0138 std::cout << "Writing histograms..." << std::endl;
0139 f_out->cd();
0140
0141 h_unfold_nominal->Write();
0142 h_unfold_jesup->Write();
0143 h_unfold_jesdown->Write();
0144 h_unfold_jerup->Write();
0145 h_unfold_jerdown->Write();
0146 h_unfold_jettrigup->Write();
0147 h_unfold_jettrigdown->Write();
0148 h_unfold_jettimingup->Write();
0149 h_unfold_jettimingdown->Write();
0150 h_unfold_unfolditerup->Write();
0151 h_unfold_unfolditerdown->Write();
0152
0153 f_out->Close();
0154 std::cout << "All done!" << std::endl;
0155 }