ndmspc  0.20250128.0
Axis.cxx
1 #include <TString.h>
2 #include <TSystem.h>
3 #include "Axis.h"
4 
6 ClassImp(Ndmspc::Axis);
8 
9 namespace Ndmspc {
10 Axis::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 };
21 Axis::~Axis() {}
22 void 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 }
48 Axis * 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 
70 Axis * 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 
105 bool 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 }
146 void 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 }
168 int Axis::GetBinMinBase() const
169 {
170  if (fRebin == 1) return fBinMin;
171 
172  return ((fBinMin - 1) * fRebin) + 1 + GetRebinShift();
173 }
174 int 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