10Axis::Axis(TAxis * base,
int rebin,
int rebinShift,
int min,
int max)
11 : TObject(), fBaseAxis(base), fRebin(rebin), fRebinStart(rebinShift + 1), fBinMin(min), fBinMax(max)
13 fNBins = (fBaseAxis->GetNbins() - rebinShift) / fRebin;
22void Axis::Print(Option_t * option,
int spaces)
const
24 if (fBaseAxis ==
nullptr) {
25 Printf(
"Base Axis is not set !!!");
29 Printf(
"%*cname=%s nbins=%d rebin=%d rebinShift=%d step=%.2f range=[%d,%d] rangeBase=[%d,%d]...", spaces,
' ',
30 fBaseAxis->GetName(), fNBins, fRebin, fRebinStart - 1, (
double)fRebin * fBaseAxis->GetBinWidth(1), fBinMin,
31 fBinMax, GetBinMinBase(), GetBinMaxBase());
33 if (opt.Contains(
"baseOnly")) {
36 if (opt.Contains(
"ranges") && fChildren.size() == 0) {
37 for (
int iBin = fBinMin - 1; iBin < fBinMax; iBin++) {
38 int binMin = iBin * fRebin + fRebinStart;
39 int binMax = (binMin + fRebin) - 1;
40 Printf(
"%*cbin=%d [%.2f,%.2f]", spaces + 2,
' ', iBin + 1, fBaseAxis->GetBinLowEdge(binMin),
41 fBaseAxis->GetBinUpEdge(binMax));
44 for (
auto child : fChildren) {
45 child->Print(option, spaces + 2);
48Axis * Axis::AddChild(
int rebin,
int rebinShift,
int min,
int max, Option_t * option)
50 if (max == -1) max = fBinMax;
51 Axis * axis =
new Axis(fBaseAxis, rebin, rebinShift, min, max);
52 if (axis->GetBinMaxBase() > fBinMax) {
53 Printf(
"Error: Out of range of in rangeBase: binMax=%d > baseBinMax=%d", axis->GetBinMaxBase(), fBinMax);
54 Printf(
" Base axis:");
56 Printf(
" New axis :");
66 fChildren.push_back(axis);
70Axis * Axis::AddRange(
int rebin,
int nBins)
76 if (fChildren.size() == 0) {
79 Printf(
"Adding range rebin=%d nBins=%d ...", rebin, nBins);
80 int rebinShift = (fBinMin % rebin) - 1;
81 int minFromBase = (fBinMin / rebin) + 1;
82 SetRebinShift(rebinShift);
83 SetBinMin(minFromBase + 1);
84 SetBinMax(fBinMax - (rebinShift - 1));
85 return AddChild(rebin, rebinShift, minFromBase, nBins,
"ranges");
87 Printf(
"Adding range rebin=%d nBins=%d ...", rebin, nBins);
88 auto child = GetChild(fChildren.size() - 1);
91 for (
auto c : fChildren) {
92 nBinsBase += c->GetRebin() * (c->GetBinMax() - c->GetBinMin() + 1);
95 int rebinShift = nBinsBase % rebin;
96 int min = ((nBinsBase - rebinShift) / rebin) + 1;
97 int max = min + nBins - 1;
98 if (GetRebinShift() > 0) {
99 rebinShift += GetRebinShift();
102 return AddChild(rebin, rebinShift, min, max,
"ranges");
105bool Axis::IsRangeValid()
111 Printf(
"Checking ranage validity ...");
113 if (fChildren.size() == 0) {
116 Printf(
"Error: No ranges defined !!!");
121 for (
auto child : fChildren) {
123 int binFirst = child->GetBinMinBase() + fBinMin;
124 int binLast = child->GetBinMaxBase() + fBinMin;
131 if (bin == binFirst) {
138 child->Print(
"ranges");
139 Printf(
"Invalid bin range: %d != %d in axis below", bin, binFirst);
146void Axis::FillAxis(TAxis * axis)
151 double bins[fNBins + 1];
153 for (
auto child : fChildren) {
156 bins[count++] = fBaseAxis->GetBinLowEdge(child->GetBinMinBase());
159 for (
int iBin = child->GetBinMin(); iBin <= child->GetBinMax(); iBin++) {
160 bins[count++] = fBaseAxis->GetBinUpEdge(iBin * child->GetRebin() + child->GetRebinShift());
166 axis->Set(count - 1, bins);
168int Axis::GetBinMinBase()
const
170 if (fRebin == 1)
return fBinMin;
172 return ((fBinMin - 1) * fRebin) + 1 + GetRebinShift();
174int Axis::GetBinMaxBase()
const
176 if (fRebin == 1)
return fBinMax;
177 return fBinMax * fRebin + GetRebinShift();