24 void THnChain::AddFile(
const char* fileName)
26 fFiles.emplace_back(fileName);
30 THnBase* hs = ReadHistogram(fileName);
33 const Int_t naxes = hs->GetNdimensions();
34 for (Int_t i = 0; i < naxes; ++i) {
35 fAxes.push_back(hs->GetAxis(i));
39 "Could not find histogram %s in file %s",
46 TAxis* THnChain::GetAxis(Int_t i)
const
48 if (i < 0 || i >= static_cast<Int_t>(fAxes.size())) {
55 TObject* THnChain::ProjectionAny(Int_t ndim,
const Int_t* dim, Option_t* option)
const
61 TObject* h_merged =
nullptr;
62 for (
const auto& file : fFiles) {
63 THnBase* hs = ReadHistogram(file.c_str());
66 Warning(
"ProjectionAny",
67 "Could not find histogram %s in file %s",
74 if (!CheckConsistency(*hs, fAxes)) {
75 Warning(
"ProjectionAny",
76 "Histogram %s from file %s is inconsistent with the histogram from file %s",
90 h = hs->Projection(dim[0], option);
91 }
else if (ndim == 2) {
92 h = hs->Projection(dim[0], dim[1], option);
93 }
else if (ndim == 3) {
94 h = hs->Projection(dim[0], dim[1], dim[2], option);
96 h = hs->ProjectionND(ndim, dim, option);
104 static_cast<TH1*
>(h_merged)->Add(static_cast<TH1*>(h));
106 static_cast<THnBase*
>(h_merged)->Add(static_cast<THnBase*>(h));
118 THnBase* THnChain::ReadHistogram(
const char* fileName)
const
120 TDirectory::TContext ctxt(gDirectory);
122 TFile* f = TFile::Open(fileName);
128 THnBase* hs =
nullptr;
129 f->GetObject(fName.c_str(), hs);
135 void THnChain::SetupAxes(THnBase& hs)
const
137 const Int_t naxes = fAxes.size();
138 for (Int_t i = 0; i < naxes; ++i) {
139 const TAxis* ax_ref = fAxes[i];
140 TAxis* ax = hs.GetAxis(i);
145 bool THnChain::CheckConsistency(
const THnBase& h,
const std::vector<TAxis*>& axes)
151 const Int_t naxes = h.GetNdimensions();
152 const Int_t naxes2 = axes.size();
154 if (naxes != naxes2) {
158 for (Int_t i = 0; i < naxes; ++i) {
159 const TAxis* ax1 = h.GetAxis(i);
160 const TAxis* ax2 = axes[i];
162 if (ax1->GetNbins() != ax2->GetNbins()) {
167 if (!TMath::AreEqualRel(ax1->GetXmin(), ax2->GetXmin(), 1.E-12) ||
168 !TMath::AreEqualRel(ax1->GetXmax(), ax2->GetXmax(), 1.E-12)) {
173 const TArrayD* h1Array = ax1->GetXbins();
174 const TArrayD* h2Array = ax2->GetXbins();
175 Int_t fN = h1Array->fN;
177 if (h2Array->fN != fN) {
180 for (
int ibin = 0; ibin < fN; ++ibin) {
181 if (!TMath::AreEqualRel(h1Array->GetAt(ibin), h2Array->GetAt(ibin), 1E-10)) {
195 TH1* THnChain::Projection(Int_t xDim, Option_t* option)
const
198 Int_t dim[1] = {xDim};
199 return static_cast<TH1*
>(ProjectionAny(1, dim, option));
202 TH2* THnChain::Projection(Int_t yDim, Int_t xDim, Option_t* option)
const
205 Int_t dim[2] = {xDim, yDim};
206 return static_cast<TH2*
>(ProjectionAny(2, dim, option));
209 TH3* THnChain::Projection(Int_t xDim, Int_t yDim, Int_t zDim, Option_t* option)
const
212 Int_t dim[3] = {xDim, yDim, zDim};
213 return static_cast<TH3*
>(ProjectionAny(3, dim, option));
216 THnBase* THnChain::ProjectionND(Int_t ndim,
const Int_t* dim, Option_t* option)
const
219 return static_cast<THnBase*
>(ProjectionAny(ndim, dim, option));