ndmspc 0.20250304.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{
16 fNBins = (fBaseAxis->GetNbins() - rebinShift) / fRebin;
17
18 // if ((fBaseAxis->GetNbins() % fRebin) - rebinShift != 0) fNBins--;
19
20 if (max < min) {
22 }
23};
25{
29}
30void Axis::Print(Option_t * option, int spaces) const
31{
35 if (fBaseAxis == nullptr) {
36 Printf("Base Axis is not set !!!");
37 return;
38 }
39
40 Printf("%*cname=%s nbins=%d rebin=%d rebinShift=%d step=%.2f range=[%d,%d] rangeBase=[%d,%d]...", spaces, ' ',
41 fBaseAxis->GetName(), fNBins, fRebin, fRebinStart - 1, (double)fRebin * fBaseAxis->GetBinWidth(1), fBinMin,
43 TString opt(option);
44 if (opt.Contains("baseOnly")) {
45 return;
46 }
47 if (opt.Contains("ranges") && fChildren.size() == 0) {
48 for (int iBin = fBinMin - 1; iBin < fBinMax; iBin++) {
49 int binMin = iBin * fRebin + fRebinStart;
50 int binMax = (binMin + fRebin) - 1;
51 Printf("%*cbin=%d [%.2f,%.2f]", spaces + 2, ' ', iBin + 1, fBaseAxis->GetBinLowEdge(binMin),
52 fBaseAxis->GetBinUpEdge(binMax));
53 }
54 }
55 for (auto child : fChildren) {
56 child->Print(option, spaces + 2);
57 }
58}
59Axis * Axis::AddChild(int rebin, int rebinShift, int min, int max, Option_t * option)
60{
64 if (max == -1) max = fBinMax;
65 Axis * axis = new Axis(fBaseAxis, rebin, rebinShift, min, max);
66 if (axis->GetBinMaxBase() > fBinMax) {
67 Printf("Error: Out of range of in rangeBase: binMax=%d > baseBinMax=%d", axis->GetBinMaxBase(), fBinMax);
68 Printf(" Base axis:");
69 Print("baseOnly", 4);
70 Printf(" New axis :");
71 axis->Print("", 4);
72
73 gSystem->Exit(1);
74 return nullptr;
75 }
76 TString opt(option);
77 if (!opt.IsNull()) {
78 axis->Print(option);
79 }
80 fChildren.push_back(axis);
81 return axis;
82}
83
84Axis * Axis::AddRange(int rebin, int nBins)
85{
89
90 if (fChildren.size() == 0) {
91 Printf("Axis:");
92 Print("baseOnly");
93 Printf("Adding range rebin=%d nBins=%d ...", rebin, nBins);
94 int rebinShift = (fBinMin % rebin) - 1;
95 int minFromBase = (fBinMin / rebin) + 1;
96 SetRebinShift(rebinShift);
97 SetBinMin(minFromBase + 1);
98 SetBinMax(fBinMax - (rebinShift - 1));
99 return AddChild(rebin, rebinShift, minFromBase, nBins, "ranges");
100 }
101 Printf("Adding range rebin=%d nBins=%d ...", rebin, nBins);
102 // auto child = GetChild(fChildren.size() - 1);
103
104 int nBinsBase = 0;
105 for (auto c : fChildren) {
106 nBinsBase += c->GetRebin() * (c->GetBinMax() - c->GetBinMin() + 1);
107 }
108
109 int rebinShift = nBinsBase % rebin;
110 int min = ((nBinsBase - rebinShift) / rebin) + 1;
111 int max = min + nBins - 1;
112 if (GetRebinShift() > 0) {
113 rebinShift += GetRebinShift();
114 }
115
116 return AddChild(rebin, rebinShift, min, max, "ranges");
117}
118
120{
124
125 Printf("Checking ranage validity ...");
126
127 if (fChildren.size() == 0) {
128 Printf("Axis:");
129 Print("", 0);
130 Printf("Error: No ranges defined !!!");
131 return false;
132 }
133
134 int bin = -1;
135 for (auto child : fChildren) {
136 // child->Print("ranges");
137 int binFirst = child->GetBinMinBase() + fBinMin;
138 int binLast = child->GetBinMaxBase() + fBinMin;
139 if (bin == -1) {
140 bin = binLast + 1;
141 // Printf("Ok");
142 continue;
143 }
144
145 if (bin == binFirst) {
146 bin = binLast + 1;
147 // Printf("Ok");
148 continue;
149 }
150 else {
151 Printf("Axis:");
152 child->Print("ranges");
153 Printf("Invalid bin range: %d != %d in axis below", bin, binFirst);
154 return false;
155 }
156 }
157
158 return true;
159}
160void Axis::FillAxis(TAxis * axis)
161{
162 //
163 // Fill Axis with current binning
164 //
165 double bins[fNBins + 1];
166 int count = 0;
167 for (auto child : fChildren) {
168 // child->Print();
169 if (count == 0) {
170 bins[count++] = fBaseAxis->GetBinLowEdge(child->GetBinMinBase());
171 }
172
173 for (int iBin = child->GetBinMin(); iBin <= child->GetBinMax(); iBin++) {
174 bins[count++] = fBaseAxis->GetBinUpEdge(iBin * child->GetRebin() + child->GetRebinShift());
175 }
176 }
177 if (count == 0) {
178 return;
179 }
180 axis->Set(count - 1, bins);
181}
183{
184 if (fRebin == 1) return fBinMin;
185
186 return ((fBinMin - 1) * fRebin) + 1 + GetRebinShift();
187}
189{
190 if (fRebin == 1) return fBinMax;
191 return fBinMax * fRebin + GetRebinShift();
192}
193
194} // namespace Ndmspc
Axis object.
Definition Axis.h:16
int GetBinMaxBase() const
Returns base maximum.
Definition Axis.cxx:188
virtual ~Axis()
Definition Axis.cxx:24
int fRebinStart
rebin start
Definition Axis.h:79
int fBinMin
range minimum
Definition Axis.h:80
int fRebin
rebin factor
Definition Axis.h:78
TAxis * fBaseAxis
Base axis.
Definition Axis.h:76
int GetBinMax() const
Return bin maximum.
Definition Axis.h:51
int GetBinMinBase() const
Returns base minimum.
Definition Axis.cxx:182
void AddChild(Axis *axis)
Add axis child.
Definition Axis.h:60
int fNBins
Total number of bins.
Definition Axis.h:77
virtual void Print(Option_t *option="") const
Print function.
Definition Axis.h:22
int fBinMax
range maximum
Definition Axis.h:81
void SetBinMin(int min)
Sets bin minimum.
Definition Axis.h:35
Axis * AddRange(int rebin, int nBins=-1)
Add range.
Definition Axis.cxx:84
std::vector< Axis * > fChildren
list of children axis
Definition Axis.h:82
int GetRebinShift() const
Returns rebin shift.
Definition Axis.h:47
Axis(TAxis *base=nullptr, int rebin=1, int rebinShift=0, int min=1, int max=-1)
Definition Axis.cxx:10
void SetBinMax(int max)
Sets bin maximum.
Definition Axis.h:37
void FillAxis(TAxis *axis)
Fill axis.
Definition Axis.cxx:160
void SetRebinShift(int rebinShift)
Sets rebin shift.
Definition Axis.h:33
bool IsRangeValid()
Checks if range is valid.
Definition Axis.cxx:119