19#include "HistogramAccumulator.hh"
25#include "BDSBH4DBase.hh"
44 const std::string& resultHistNameIn,
45 const std::string& resultHistTitleIn):
46 HistogramAccumulator(baseHistogram, (int)baseHistogram->GetDimension(), resultHistNameIn, resultHistTitleIn)
51 const std::string& resultHistNameIn,
52 const std::string& resultHistTitleIn):
53 nDimensions(nDimensionsIn),
56 resultHistName(resultHistNameIn),
57 resultHistTitle(resultHistTitleIn),
68 mean =
dynamic_cast<TH1D*
>(baseHistogram->Clone(meanName.c_str()));
69 variance =
dynamic_cast<TH1D*
>(baseHistogram->Clone(variName.c_str()));
70 result =
dynamic_cast<TH1D*
>(baseHistogram->Clone(
resultHistName.c_str()));
75 mean =
dynamic_cast<TH2D*
>(baseHistogram->Clone(meanName.c_str()));
76 variance =
dynamic_cast<TH2D*
>(baseHistogram->Clone(variName.c_str()));
77 result =
dynamic_cast<TH2D*
>(baseHistogram->Clone(
resultHistName.c_str()));
82 mean =
dynamic_cast<TH3D*
>(baseHistogram->Clone(meanName.c_str()));
83 variance =
dynamic_cast<TH3D*
>(baseHistogram->Clone(variName.c_str()));
84 result =
dynamic_cast<TH3D*
>(baseHistogram->Clone(
resultHistName.c_str()));
90 mean =
dynamic_cast<BDSBH4DBase*
>(baseHistogram)->Clone(meanName.c_str());
91 variance =
dynamic_cast<BDSBH4DBase*
>(baseHistogram)->Clone(variName.c_str());
97 {
throw std::domain_error(
"Invalid number of dimensions");
break;}
99 if (mean && variance && result)
109 mean->SetTitle(meanName.c_str());
110 variance->SetTitle(variName.c_str());
117 static_cast<BDSBH4DBase*
>(variance)->Reset_BDSBH4D();
118 static_cast<BDSBH4DBase*
>(result)->Reset_BDSBH4D();
121 static_cast<BDSBH4DBase*
>(mean)->SetTitle(meanName.c_str());
122 static_cast<BDSBH4DBase*
>(variance)->SetTitle(variName.c_str());
141 const double error = 0;
142 const unsigned long nEntriesToAccumulate = 1;
150 TH1D* h1 =
dynamic_cast<TH1D*
>(mean);
151 TH1D* h1e =
dynamic_cast<TH1D*
>(variance);
152 TH1D* ht =
dynamic_cast<TH1D*
>(newValue);
153 for (
int j = 0; j <= h1->GetNbinsX() + 1; ++j)
156 h1e->GetBinContent(j),
157 ht->GetBinContent(j),
158 error,
n, nEntriesToAccumulate,
160 h1->SetBinContent(j, newMean);
161 h1e->SetBinContent(j, newVari);
167 TH2D* h1 =
dynamic_cast<TH2D*
>(mean);
168 TH2D* h1e =
dynamic_cast<TH2D*
>(variance);
169 TH2D* ht =
dynamic_cast<TH2D*
>(newValue);
170 for (
int j = 0; j <= h1->GetNbinsX() + 1; ++j)
172 for (
int k = 0; k <= h1->GetNbinsY() + 1; ++k)
175 h1e->GetBinContent(j,k),
176 ht->GetBinContent(j,k),
177 error,
n, nEntriesToAccumulate,
179 h1->SetBinContent(j, k, newMean);
180 h1e->SetBinContent(j, k, newVari);
187 TH3D* h1 =
dynamic_cast<TH3D*
>(mean);
188 TH3D* h1e =
dynamic_cast<TH3D*
>(variance);
189 TH3D* ht =
dynamic_cast<TH3D*
>(newValue);
190 for (
int j = 0; j <= h1->GetNbinsX() + 1; ++j)
192 for (
int k = 0; k <= h1->GetNbinsY() + 1; ++k)
194 for (
int l = 0; l <= h1->GetNbinsZ() + 1; ++l)
197 h1e->GetBinContent(j,k,l),
198 ht->GetBinContent(j,k,l),
199 error,
n, nEntriesToAccumulate,
201 h1->SetBinContent(j, k, l, newMean);
202 h1e->SetBinContent(j, k, l, newVari);
214 for (
int j = -1; j <= h1->GetNbinsX(); ++j)
216 for (
int k = -1; k <= h1->GetNbinsY(); ++k)
218 for (
int l = -1; l <= h1->GetNbinsZ(); ++l)
220 for (
int e = -1; e <= h1->GetNbinsE(); ++e)
225 error,
n, nEntriesToAccumulate,
227 h1->Set_BDSBH4D(j,k,l,e, newMean);
228 h1e->Set_BDSBH4D(j,k,l,e, newVari);
246 const double nD = (double)
n;
247 const double factor = std::sqrt(1./(nD * (nD - 1)));
258 for (
int j = 0; j <= result->GetNbinsX() + 1; ++j)
260 mn = mean->GetBinContent(j);
261 var = variance->GetBinContent(j);
262 err =
n > 1 ? factor*std::sqrt(var) : 0;
263 result->SetBinContent(j, mn);
264 result->SetBinError(j, err);
270 for (
int j = 0; j <= result->GetNbinsX() + 1; ++j)
272 for (
int k = 0; k <= result->GetNbinsY() + 1; ++k)
274 mn = mean->GetBinContent(j,k);
275 var = variance->GetBinContent(j, k);
276 err =
n > 1 ? factor*std::sqrt(var) : 0;
277 result->SetBinContent(j, k, mn);
278 result->SetBinError(j, k, err);
285 for (
int j = 0; j <= result->GetNbinsX() + 1; ++j)
287 for (
int k = 0; k <= result->GetNbinsY() + 1; ++k)
289 for (
int l = 0; l <= result->GetNbinsZ() + 1; ++l)
291 mn = mean->GetBinContent(j,k,l);
292 var = variance->GetBinContent(j, k, l);
293 err =
n > 1 ? factor*std::sqrt(var) : 0;
294 result->SetBinContent(j,k,l, mn);
295 result->SetBinError(j,k,l, err);
304 auto histCast =
dynamic_cast<BDSBH4DBase*
>(result);
306 auto varCast =
dynamic_cast<BDSBH4DBase*
>(variance);
308 int nBinsX = histCast->GetNbinsX();
309 int nBinsY = histCast->GetNbinsY();
310 int nBinsZ = histCast->GetNbinsZ();
311 int nBinsE = histCast->GetNbinsE();
312 for (
int j = -1; j <= nBinsX; ++j)
314 for (
int k = -1; k <= nBinsY; ++k)
316 for (
int l = -1; l <= nBinsZ; ++l)
318 for (
int e = -1; e <= nBinsE; ++e)
320 mn = mnCast->At(j, k, l, e);
321 var = varCast->At(j, k, l, e);
322 err =
n > 1 ? factor*std::sqrt(var) : 0;
323 resCast->Set_BDSBH4D(j, k, l, e, mn);
324 resCast->SetError_BDSBH4D(j, k, l, e, err);
336 {
dynamic_cast<BDSBH4DBase*
>(result)->SetEntries_BDSBH4D((
double)
n);}
338 {result->SetEntries((
double)
n);}
347 unsigned long nEntriesAccumulated,
350 double& newVari)
const
352 newMean = oldMean + ((x - oldMean) / (
double)nEntriesAccumulated);
353 newVari = oldVari + ((x - oldMean) * (x - newMean));
Base class for the 4D histogram classes.
Class to accumulate and merge histograms in different ways.
const std::string resultHistName
Name for resultant histogram.
int nDimensions
Number of dimensions.
virtual ~HistogramAccumulator()
virtual void AccumulateSingleValue(double oldMean, double oldVari, double x, double xVari, unsigned long nEntriesAccumulated, unsigned long nEntriesToAccumulate, double &newMean, double &newVari) const
const std::string resultHistTitle
Title for resultant histogram.
virtual TH1 * Terminate()
HistogramAccumulator()
Default constructor only for ROOT reflexivity - not intended for use.
virtual void Accumulate(TH1 *newValue)