4 #include <TSystemDirectory.h>
5 #include <TSystemFile.h>
14 const std::vector<std::string>& matrixNames,
15 const char* eventHistName =
"bcid") {
18 TList* filesList =
dir.GetListOfFiles();
20 std::cerr <<
"Error: cannot open directory " <<
inputDir <<
"\n";
25 TIter
next(filesList);
26 while (TSystemFile*
f = (TSystemFile*)
next()) {
27 TString
fname =
f->GetName();
28 if (!
f->IsDirectory() &&
fname.EndsWith(
".root") &&
fname.BeginsWith(
"RatesHistograms_data24_13p6TeV.")) {
34 std::cerr <<
"Error: no valid files found in " <<
inputDir <<
"\n";
38 std::cout <<
"Input files to be combined:\n";
40 std::cout <<
" " <<
f <<
"\n";
42 std::cout <<
"Found " <<
inputFiles.size() <<
" files to combine.\n";
45 std::vector<TFile*>
files;
50 TFile*
f = TFile::Open((
"file:" + std::string(
filename)).c_str());
51 if (!
f ||
f->IsZombie()) {
52 std::cerr <<
"Error: cannot open " <<
filename <<
"\n";
57 TH1* h_event =
dynamic_cast<TH1*
>(
f->Get(eventHistName));
59 std::cerr <<
"Error: histogram \"" << eventHistName <<
"\" not found in " <<
filename <<
"\n";
63 double nev = h_event->GetEntries();
65 std::cerr <<
"Error: zero events in " <<
filename <<
"\n";
74 std::cout <<
"Total number of events processed (bcid sum): " <<
totalEvents <<
"\n";
80 for (
const auto& matrixName : matrixNames) {
81 std::vector<TH2D*> matrices;
84 for (
size_t i = 0;
i <
files.size(); ++
i) {
85 TH2D* h_matrix =
dynamic_cast<TH2D*
>(
files[
i]->Get(matrixName.c_str()));
87 std::cerr <<
"Error: matrix \"" << matrixName <<
"\" not found in "
88 <<
files[
i]->GetName() <<
"\n";
91 matrices.push_back(h_matrix);
95 TH2D* h_combined = (TH2D*)matrices[0]->Clone((matrixName +
"_combined").c_str());
97 h_combined->SetDirectory(0);
99 int nbx = h_combined->GetNbinsX();
100 int nby = h_combined->GetNbinsY();
102 bool isCounts = (matrixName ==
"counts_matrix");
104 for (
int x = 1;
x <= nbx; ++
x) {
105 for (
int y = 1;
y <= nby; ++
y) {
107 double sumErr2 = 0.0;
108 for (
size_t i = 0;
i < matrices.size(); ++
i) {
109 double val = matrices[
i]->GetBinContent(
x,
y);
110 double err = matrices[
i]->GetBinError(
x,
y);
121 h_combined->SetBinContent(
x,
y,
sum);
122 h_combined->SetBinError(
x,
y, std::sqrt(sumErr2));
128 std::cout <<
"Combined matrix \"" << matrixName <<
"\" written.\n";
132 for (
auto*
f :
files)
f->Close();
133 std::cout <<
"Output file written to: " <<
outputFile <<
"\n";
138 const char*
inputDir =
"./athena24/run_grid/user.$.l1topoRates.EB_fullRun_00482596_1Oct25_RatesHistograms_XYZ.root.tgz/";
140 const char*
outputFile =
"CombinedMatrices.root";
143 std::vector<std::string> matrices = {
153 std::cerr <<
"Error: cannot open combined file to add L1TopoScore_matrix.\n";
157 TH2D* h_rates = (TH2D*)
fout->Get(
"rates_matrix_combined");
159 std::cerr <<
"Error: rates_matrix_combined not found!\n";
164 int nbx = h_rates->GetNbinsX();
165 int nby = h_rates->GetNbinsY();
167 TH2D* h_topo = (TH2D*)h_rates->Clone(
"L1TopoScore_matrix_combined");
171 for (
int ix = 1; ix <= nbx; ++ix) {
172 for (
int jy = 1; jy <= nby; ++jy) {
175 h_topo->SetBinContent(ix, jy, 1.0);
176 h_topo->SetBinError(ix, jy, 0.0);
180 double A = h_rates->GetBinContent(ix, ix);
181 double sigmaA = h_rates->GetBinError(ix, ix);
182 double B = h_rates->GetBinContent(jy, jy);
183 double sigmaB = h_rates->GetBinError(jy, jy);
184 double O = h_rates->GetBinContent(ix, jy);
185 double sigmaO = h_rates->GetBinError(ix, jy);
189 h_topo->SetBinContent(ix, jy, 0.0);
190 h_topo->SetBinError(ix, jy, 0.0);
193 double denom = O * (
A +
B - O);
195 h_topo->SetBinContent(ix, jy, 0.0);
196 h_topo->SetBinError(ix, jy, 0.0);
207 double dD_dO = (
A +
B - 2.0 * O);
213 double dTS_dA = (
B * D -
N * dD_dA) / (D * D);
215 double dTS_dB = (
A * D -
N * dD_dB) / (D * D);
217 double dTS_dO = -
N * dD_dO / (D * D);
221 if (sigmaA > 0.0) varTS += (dTS_dA * dTS_dA) * (sigmaA * sigmaA);
222 if (sigmaB > 0.0) varTS += (dTS_dB * dTS_dB) * (sigmaB * sigmaB);
223 if (sigmaO > 0.0) varTS += (dTS_dO * dTS_dO) * (sigmaO * sigmaO);
225 double sigmaTS = (varTS > 0.0) ? std::sqrt(varTS) : 0.0;
227 h_topo->SetBinContent(ix, jy,
TS);
228 h_topo->SetBinError(ix, jy, sigmaTS);
235 std::cout <<
"L1TopoScore_matrix_combined written successfully.\n";