ndmspc 0.20250128.0
Loading...
Searching...
No Matches
Axis.cxx
1#include <TString.h>
2#include <TSystem.h>
3#include "Axis.h"
4
6ClassImp(Ndmspc::Axis);
8
9namespace Ndmspc {
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)
12{
13 fNBins = (fBaseAxis->GetNbins() - rebinShift) / fRebin;
14
15 // if ((fBaseAxis->GetNbins() % fRebin) - rebinShift != 0) fNBins--;
16
17 if (max < min) {
18 fBinMax = fNBins;
19 }
20};
21Axis::~Axis() {}
22void Axis::Print(Option_t * option, int spaces) const
23{
24 if (fBaseAxis == nullptr) {
25 Printf("Base Axis is not set !!!");
26 return;
27 }
28
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());
32 TString opt(option);
33 if (opt.Contains("baseOnly")) {
34 return;
35 }
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));
42 }
43 }
44 for (auto child : fChildren) {
45 child->Print(option, spaces + 2);
46 }
47}
48Axis * Axis::AddChild(int rebin, int rebinShift, int min, int max, Option_t * option)
49{
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:");
55 Print("baseOnly", 4);
56 Printf(" New axis :");
57 axis->Print("", 4);
58
59 gSystem->Exit(1);
60 return nullptr;
61 }
62 TString opt(option);
63 if (!opt.IsNull()) {
64 axis->Print(option);
65 }
66 fChildren.push_back(axis);
67 return axis;
68}
69
70Axis * Axis::AddRange(int rebin, int nBins)
71{
72 //
73 // Add Range from rebin and nbins
74 //
75
76 if (fChildren.size() == 0) {
77 Printf("Axis:");
78 Print("baseOnly");
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");
86 }
87 Printf("Adding range rebin=%d nBins=%d ...", rebin, nBins);
88 auto child = GetChild(fChildren.size() - 1);
89
90 int nBinsBase = 0;
91 for (auto c : fChildren) {
92 nBinsBase += c->GetRebin() * (c->GetBinMax() - c->GetBinMin() + 1);
93 }
94
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();
100 }
101
102 return AddChild(rebin, rebinShift, min, max, "ranges");
103}
104
105bool Axis::IsRangeValid()
106{
107 //
108 // Check if bin ranges are valid
109 //
110
111 Printf("Checking ranage validity ...");
112
113 if (fChildren.size() == 0) {
114 Printf("Axis:");
115 Print();
116 Printf("Error: No ranges defined !!!");
117 return false;
118 }
119
120 int bin = -1;
121 for (auto child : fChildren) {
122 // child->Print("ranges");
123 int binFirst = child->GetBinMinBase() + fBinMin;
124 int binLast = child->GetBinMaxBase() + fBinMin;
125 if (bin == -1) {
126 bin = binLast + 1;
127 // Printf("Ok");
128 continue;
129 }
130
131 if (bin == binFirst) {
132 bin = binLast + 1;
133 // Printf("Ok");
134 continue;
135 }
136 else {
137 Printf("Axis:");
138 child->Print("ranges");
139 Printf("Invalid bin range: %d != %d in axis below", bin, binFirst);
140 return false;
141 }
142 }
143
144 return true;
145}
146void Axis::FillAxis(TAxis * axis)
147{
148 //
149 // Fill Axis with current binning
150 //
151 double bins[fNBins + 1];
152 int count = 0;
153 for (auto child : fChildren) {
154 // child->Print();
155 if (count == 0) {
156 bins[count++] = fBaseAxis->GetBinLowEdge(child->GetBinMinBase());
157 }
158
159 for (int iBin = child->GetBinMin(); iBin <= child->GetBinMax(); iBin++) {
160 bins[count++] = fBaseAxis->GetBinUpEdge(iBin * child->GetRebin() + child->GetRebinShift());
161 }
162 }
163 if (count == 0) {
164 return;
165 }
166 axis->Set(count - 1, bins);
167}
168int Axis::GetBinMinBase() const
169{
170 if (fRebin == 1) return fBinMin;
171
172 return ((fBinMin - 1) * fRebin) + 1 + GetRebinShift();
173}
174int Axis::GetBinMaxBase() const
175{
176 if (fRebin == 1) return fBinMax;
177 return fBinMax * fRebin + GetRebinShift();
178}
179
180} // namespace Ndmspc
Axis object.
Definition Axis.h:16