37 ClassImp(TProfile2Poly);
42 TProfile2PolyBin::TProfile2PolyBin()
50 fErrorMode = kERRORMEAN;
56 TProfile2PolyBin::TProfile2PolyBin(TObject *poly, Int_t bin_number) : TH2PolyBin(poly, bin_number)
64 fErrorMode = kERRORMEAN;
70 void TProfile2PolyBin::Merge(
const TProfile2PolyBin *toMerge)
72 this->fSumw += toMerge->fSumw;
73 this->fSumvw += toMerge->fSumvw;
74 this->fSumw2 += toMerge->fSumw2;
75 this->fSumwv2 += toMerge->fSumwv2;
81 void TProfile2PolyBin::Update()
91 void TProfile2PolyBin::UpdateAverage()
93 if (fSumw != 0) fAverage = fSumvw / fSumw;
99 void TProfile2PolyBin::UpdateError()
102 if (fSumw != 0) tmp = std::sqrt((fSumwv2 / fSumw) - (fAverage * fAverage));
113 void TProfile2PolyBin::ClearStats()
126 void TProfile2PolyBin::Fill(Double_t value, Double_t weight)
129 fSumvw += value * weight;
130 fSumw2 += weight * weight;
131 fSumwv2 += weight * value * value;
138 TProfile2Poly::TProfile2Poly(
const char *name,
const char *title, Double_t xlow, Double_t xup, Double_t ylow,
140 : TH2Poly(name, title, xlow, xup, ylow, yup)
147 TProfile2Poly::TProfile2Poly(
const char *name,
const char *title, Int_t nX, Double_t xlow, Double_t xup, Int_t nY,
148 Double_t ylow, Double_t yup)
149 : TH2Poly(name, title, nX, xlow, xup, nY, ylow, yup)
156 TProfile2PolyBin *TProfile2Poly::CreateBin(TObject *poly)
166 Int_t ibin = fNcells - kNOverflow;
167 return new TProfile2PolyBin(poly, ibin);
173 Int_t TProfile2Poly::Fill(Double_t xcoord, Double_t ycoord, Double_t value)
175 return Fill(xcoord, ycoord, value, 1);
181 Int_t TProfile2Poly::Fill(Double_t xcoord, Double_t ycoord, Double_t value, Double_t weight)
184 Int_t tmp = GetOverflowRegionFromCoordinates(xcoord, ycoord);
186 Int_t overflow_idx = OverflowIdxToArrayIdx(tmp);
187 fOverflowBins[overflow_idx].Fill(value, weight);
188 fOverflowBins[overflow_idx].SetContent(fOverflowBins[overflow_idx].fAverage );
192 Int_t n = (Int_t)(floor((xcoord - fXaxis.GetXmin()) / fStepX));
193 Int_t m = (Int_t)(floor((ycoord - fYaxis.GetXmin()) / fStepY));
196 if (n >= fCellX) n = fCellX - 1;
197 if (m >= fCellY) m = fCellY - 1;
203 fTsumw2 += weight * weight;
204 fTsumwx += weight * xcoord;
205 fTsumwx2 += weight * xcoord * xcoord;
206 fTsumwy += weight * ycoord;
207 fTsumwy2 += weight * ycoord * ycoord;
208 fTsumwxy += weight * xcoord * ycoord;
209 fTsumwz += weight * value;
210 fTsumwz2 += weight * value * value;
213 TProfile2PolyBin *bin;
214 TIter next(&fCells[n + fCellX * m]);
216 while ((obj = next())) {
217 bin = (TProfile2PolyBin *)obj;
218 if (bin->IsInside(xcoord, ycoord)) {
220 bin->Fill(value, weight);
222 bin->SetContent(bin->fAverage);
232 Long64_t TProfile2Poly::Merge(TCollection *in)
234 Int_t size = in->GetSize();
236 std::vector<TProfile2Poly *> list;
239 for (
int i = 0; i < size; i++) {
240 list.push_back((TProfile2Poly *)((TList *)in)->At(i));
242 return this->Merge(list);
248 Long64_t TProfile2Poly::Merge(
const std::vector<TProfile2Poly *> &list)
250 if (list.size() == 0) {
251 std::cout <<
"[FAIL] TProfile2Poly::Merge: No objects to be merged " << std::endl;
256 std::set<Int_t> numBinUnique;
257 for (
const auto &histo : list) {
258 if (histo->fBins) numBinUnique.insert(histo->fBins->GetSize());
260 if (numBinUnique.size() != 1) {
261 std::cout <<
"[FAIL] TProfile2Poly::Merge: Bin numbers of TProfile2Polys to be merged differ!" << std::endl;
264 Int_t nbins = *numBinUnique.begin();
267 for (
const auto &histo : list) {
268 this->fEntries += histo->fEntries;
269 this->fTsumw += histo->fTsumw;
270 this->fTsumw2 += histo->fTsumw2;
271 this->fTsumwx += histo->fTsumwx;
272 this->fTsumwx2 += histo->fTsumwx2;
273 this->fTsumwy += histo->fTsumwy;
274 this->fTsumwy2 += histo->fTsumwy2;
275 this->fTsumwxy += histo->fTsumwxy;
276 this->fTsumwz += histo->fTsumwz;
277 this->fTsumwz2 += histo->fTsumwz2;
280 for (Int_t i = 0; i < kNOverflow; ++i) {
281 this->fOverflowBins[i].Merge(&histo->fOverflowBins[i]);
286 TProfile2PolyBin *dst =
nullptr;
287 TProfile2PolyBin *src =
nullptr;
288 for (Int_t i = 0; i < nbins; i++) {
289 dst = (TProfile2PolyBin *)fBins->At(i);
291 for (
const auto &e : list) {
292 src = (TProfile2PolyBin *)e->fBins->At(i);
299 this->SetContentToAverage();
306 void TProfile2Poly::SetContentToAverage()
308 Int_t nbins = fBins ? fBins->GetSize() : 0;
309 for (Int_t i = 0; i < nbins; i++) {
310 TProfile2PolyBin *bin = (TProfile2PolyBin *)fBins->At(i);
312 bin->SetContent(bin->fAverage);
314 for (Int_t i = 0; i < kNOverflow; ++i) {
315 TProfile2PolyBin & bin = fOverflowBins[i];
317 bin.SetContent(bin.fAverage);
324 void TProfile2Poly::SetContentToError()
326 Int_t nbins = fBins ? fBins->GetSize() : 0;
327 for (Int_t i = 0; i < nbins; i++) {
328 TProfile2PolyBin *bin = (TProfile2PolyBin *)fBins->At(i);
330 bin->SetContent(bin->fError);
332 for (Int_t i = 0; i < kNOverflow; ++i) {
333 TProfile2PolyBin & bin = fOverflowBins[i];
335 bin.SetContent(bin.fError);
342 Double_t TProfile2Poly::GetBinContent(Int_t bin)
const
344 if (bin > GetNumberOfBins() || bin == 0 || bin < -kNOverflow)
return 0;
345 if (bin<0)
return fOverflowBins[-bin - 1].GetContent();
346 return ((TProfile2PolyBin*) fBins->At(bin-1))->GetContent();
353 Double_t TProfile2Poly::GetBinEffectiveEntries(Int_t bin)
const
355 if (bin > GetNumberOfBins() || bin == 0 || bin < -kNOverflow)
return 0;
356 if (bin < 0)
return fOverflowBins[-bin - 1].GetEffectiveEntries();
357 return ((TProfile2PolyBin *)fBins->At(bin - 1))->GetEffectiveEntries();
363 Double_t TProfile2Poly::GetBinEntries(Int_t bin)
const
365 if (bin > GetNumberOfBins() || bin == 0 || bin < -kNOverflow)
return 0;
366 if (bin < 0)
return fOverflowBins[-bin - 1].GetEntries();
367 return ((TProfile2PolyBin *)fBins->At(bin - 1))->GetEntries();
373 Double_t TProfile2Poly::GetBinEntriesW2(Int_t bin)
const
375 if (bin > GetNumberOfBins() || bin == 0 || bin < -kNOverflow)
return 0;
376 if (bin < 0)
return fOverflowBins[-bin - 1].GetEntriesW2();
377 return ((TProfile2PolyBin *)fBins->At(bin - 1))->GetEntriesW2();
383 Double_t TProfile2Poly::GetBinEntriesVW(Int_t bin)
const
385 if (bin > GetNumberOfBins() || bin == 0 || bin < -kNOverflow)
return 0;
386 if (bin < 0)
return fOverflowBins[-bin - 1].GetEntriesVW();
387 return ((TProfile2PolyBin *)fBins->At(bin - 1))->GetEntriesVW();
393 Double_t TProfile2Poly::GetBinEntriesWV2(Int_t bin)
const
395 if (bin > GetNumberOfBins() || bin == 0 || bin < -kNOverflow)
return 0;
396 if (bin < 0)
return fOverflowBins[-bin - 1].GetEntriesWV2();
397 return ((TProfile2PolyBin *)fBins->At(bin - 1))->GetEntriesWV2();
403 Double_t TProfile2Poly::GetBinError(Int_t bin)
const
406 if (bin > GetNumberOfBins() || bin == 0 || bin < -kNOverflow)
return 0;
408 tmp = fOverflowBins[-bin - 1].GetError();
410 tmp = ((TProfile2PolyBin *)fBins->At(bin - 1))->GetError();
412 return (fErrorMode == kERRORSPREAD) ? tmp : tmp / std::sqrt(GetBinEffectiveEntries(bin));
435 void TProfile2Poly::GetStats(Double_t *stats)
const
451 void TProfile2Poly::PrintOverflowRegions()
455 for (Int_t i = 0; i < kNOverflow; ++i) {
456 cont = GetOverflowContent(i);
458 std::cout <<
"\t" << cont <<
"\t";
459 if ((i + 1) % 3 == 0) std::cout << std::endl;
462 std::cout <<
"Total: " << total << std::endl;
468 void TProfile2Poly::Reset(Option_t *opt)
472 TProfile2PolyBin *bin;
475 while ((obj = next())) {
476 bin = (TProfile2PolyBin *)obj;
495 Int_t TProfile2Poly::GetOverflowRegionFromCoordinates(Double_t x, Double_t y)
501 if (fNcells <= kNOverflow)
return 0;
504 if (y > fYaxis.GetXmax())
506 else if (y > fYaxis.GetXmin())
512 if (x > fXaxis.GetXmax())
514 else if (x > fXaxis.GetXmin())
525 void TProfile2Poly::SetErrorOption(EErrorType type)