File indexing completed on 2025-11-03 09:01:32
0001 #include "TFile.h"
0002 #include "TH1F.h"
0003 #include "TMath.h"
0004 #include <iostream>
0005 #include <fstream>
0006 
0007 int checkResolutions(const TString inputFile="/home/simong/EIC/detector_benchmarks_anl/sim_output/beamline/acceptanceTestcurrent.edm4hep.root", const TString outputFile="test.json") {
0008     
0009     int fail = 0;
0010 
0011     TFile *file = TFile::Open(inputFile);
0012     if (!file || file->IsZombie()) {
0013         std::cerr << "Error opening file: " << inputFile << std::endl;
0014         return 1; 
0015     }
0016 
0017     TH1F* E_res_Hist = (TH1F*)file->Get("E_res");
0018     TH1F* theta_diff_Hist = (TH1F*)file->Get("theta_diff");
0019     TH1F* phi_diff_Hist = (TH1F*)file->Get("phi_diff");
0020 
0021 
0022     double mean_E_res = E_res_Hist->GetMean();
0023     double mean_theta_res = theta_diff_Hist->GetMean();
0024     double mean_phi_res = phi_diff_Hist->GetMean();
0025     double mean_E_res_error = E_res_Hist->GetMeanError();
0026     double mean_theta_res_error = theta_diff_Hist->GetMeanError();
0027     double mean_phi_res_error = phi_diff_Hist->GetMeanError();
0028 
0029     
0030     double stddev_E_res = E_res_Hist->GetStdDev();
0031     double stddev_theta_res = theta_diff_Hist->GetStdDev();
0032     double stddev_phi_res = phi_diff_Hist->GetStdDev();
0033     double stddev_E_res_error = E_res_Hist->GetStdDevError();
0034     double stddev_theta_res_error = theta_diff_Hist->GetStdDevError();
0035     double stddev_phi_res_error = phi_diff_Hist->GetStdDevError();
0036 
0037     
0038     std::cout << "Mean E offset: " << mean_E_res << " +/- " << mean_E_res_error << std::endl;
0039     std::cout << "Mean theta offset: " << mean_theta_res << " +/- " << mean_theta_res_error << std::endl;
0040     std::cout << "Mean phi offset: " << mean_phi_res << " +/- " << mean_phi_res_error << std::endl;
0041     std::cout << "Standard deviation of E resolution: " << stddev_E_res << " +/- " << stddev_E_res_error << std::endl;
0042     std::cout << "Standard deviation of theta resolution: " << stddev_theta_res << " +/- " << stddev_theta_res_error << std::endl;
0043     std::cout << "Standard deviation of phi resolution: " << stddev_phi_res << " +/- " << stddev_phi_res_error << std::endl;
0044 
0045     
0046     if(std::abs(mean_E_res) > 0.2 * stddev_E_res) {
0047         std::cout << "Mean E offset is more than 20\% (" << 0.2 * stddev_E_res << ") of the standard deviation away from zero!" << std::endl;
0048         fail = 1;
0049     }
0050     if(std::abs(mean_theta_res) > 0.2 * stddev_theta_res) {
0051         std::cout << "Mean theta offset is more than 20\% (" << 0.2 * stddev_theta_res << ") of the standard deviation away from zero!" << std::endl;
0052         fail = 1;
0053     }
0054     if(std::abs(mean_phi_res) > 0.2 * stddev_phi_res) {
0055         std::cout << "Mean phi offset is more than 20\% (" << 0.2 * stddev_phi_res << ") of the standard deviation away from zero!" << std::endl;
0056         fail = 1;
0057     }
0058 
0059     
0060     double E_res_limit = 0.05; 
0061     double theta_res_limit = 0.001; 
0062     double phi_res_limit = 30; 
0063 
0064     
0065     if(std::abs(stddev_E_res) > E_res_limit) {
0066         std::cout << "E resolution is more than the limit of " << E_res_limit << "!" << std::endl;
0067         fail = 1;
0068     }
0069     if(std::abs(stddev_theta_res) > theta_res_limit) {
0070         std::cout << "Theta resolution is more than the limit of " << theta_res_limit << " radians!" << std::endl;
0071         fail = 1;
0072     }
0073     if(std::abs(stddev_phi_res) > phi_res_limit) {
0074         std::cout << "Phi resolution is more than the limit of " << phi_res_limit << " degrees!" << std::endl;
0075         fail = 1;
0076     }
0077 
0078     
0079     std::ofstream jsonFile(outputFile);
0080     if (!jsonFile.is_open()) {
0081         std::cerr << "Error opening output file: " << outputFile << std::endl;
0082         return 1; 
0083     }
0084     jsonFile << "{\n";
0085     jsonFile << "  \"mean_E_res\": " << mean_E_res << ",\n";
0086     jsonFile << "  \"mean_theta_res\": " << mean_theta_res << ",\n";
0087     jsonFile << "  \"mean_phi_res\": " << mean_phi_res << ",\n";
0088     jsonFile << "  \"mean_E_res_error\": " << mean_E_res_error << ",\n";
0089     jsonFile << "  \"mean_theta_res_error\": " << mean_theta_res_error << ",\n";
0090     jsonFile << "  \"mean_phi_res_error\": " << mean_phi_res_error << ",\n";
0091     jsonFile << "  \"stddev_E_res\": " << stddev_E_res << ",\n";
0092     jsonFile << "  \"stddev_theta_res\": " << stddev_theta_res << ",\n";
0093     jsonFile << "  \"stddev_phi_res\": " << stddev_phi_res << ",\n";
0094     jsonFile << "  \"stddev_E_res_error\": " << stddev_E_res_error << ",\n";
0095     jsonFile << "  \"stddev_theta_res_error\": " << stddev_theta_res_error << ",\n";
0096     jsonFile << "  \"stddev_phi_res_error\": " << stddev_phi_res_error << ",\n";
0097     jsonFile << "  \"fail\": " << fail << "\n";
0098     jsonFile << "}\n";
0099     jsonFile.close();
0100 
0101     return 0;
0102 
0103 }