6 #include "NBinningDef.h"
7 #include "NBinningPoint.h"
8 #include "NDimensionalExecutor.h"
39 if (axes ==
nullptr) {
40 NLogError(
"NBinning(TObjArray * axes) : axes is nullptr");
44 for (
int i = 0; i < axes->GetEntriesFast(); i++) {
45 TAxis * axis =
dynamic_cast<TAxis *
>(axes->At(i));
47 fAxes.push_back((TAxis *)axis->Clone());
50 NLogError(
"NBinning: Axis %d is not a TAxis", i);
69 for (
auto & axis :
fAxes) {
96 if (
fAxes.size() == 0) {
97 NLogError(
"No axes provided");
101 int dim =
fAxes.size();
104 int nContentDims = 0;
106 for (
int i = 0; i < dim; i++) {
107 int nbins =
fAxes[i]->GetNbins();
108 if (nbins > nbinsMax) {
113 TString axisname(
fAxes[i]->GetName());
114 bool isUser = axisname.Contains(
"/U");
116 axisname.ReplaceAll(
"/U",
"");
117 fAxes[i]->SetName(axisname.Data());
121 binningType = Binning::kUser;
124 else if (
fAxes[i]->IsAlphanumeric()) {
128 binningType = Binning::kMultiple;
132 binningType = Binning::kMultiple;
139 Int_t * nbinsBinning =
new Int_t[dimBinning];
140 Double_t * xminBinning =
new Double_t[dimBinning];
141 Double_t * xmaxBinning =
new Double_t[dimBinning];
144 nbinsBinning[0] = dim;
146 xmaxBinning[0] = dim;
147 for (
int i = 1; i < dimBinning; i++) {
148 nbinsBinning[i] = nbinsMax;
150 xmaxBinning[i] = nbinsMax;
156 fMap =
new THnSparseI(
"ngntBinningMap",
"NGnTree binning map", dimBinning, nbinsBinning, xminBinning, xmaxBinning);
157 if (
fMap ==
nullptr) {
158 NLogError(
"Cannot create binnings !!!");
161 fMap->GetAxis(0)->SetNameTitle(
"dim",
"dimension");
162 fMap->GetAxis(1)->SetNameTitle(
"rebin",
"rebins");
163 fMap->GetAxis(2)->SetNameTitle(
"start",
"rebins start");
164 fMap->GetAxis(3)->SetNameTitle(
"bin",
"bin id");
166 for (
int i = 0; i < dim; i++) {
167 fMap->GetAxis(0)->SetBinLabel(i + 1,
fAxes[i]->GetName());
170 int dimBinningContent = nContentDims;
171 Int_t * nbinsBinningContent =
new Int_t[dimBinningContent];
172 Double_t * xminBinningContent =
new Double_t[dimBinningContent];
173 Double_t * xmaxBinningContent =
new Double_t[dimBinningContent];
175 for (
int i = 0; i < dim; i++) {
178 nbinsBinningContent[iContentDim] =
fAxes[i]->GetNbins();
179 xminBinningContent[iContentDim] = 0;
180 xmaxBinningContent[iContentDim] =
fAxes[i]->GetNbins();
182 NLogTrace(
"[S] Binning %d: %d", i,
fAxes[i]->GetNbins());
185 for (
int j = 0; j < 3; j++) {
186 nbinsBinningContent[iContentDim + j] =
fAxes[i]->GetNbins();
187 xminBinningContent[iContentDim + j] = 0;
188 xmaxBinningContent[iContentDim + j] =
fAxes[i]->GetNbins();
191 NLogTrace(
"[M] Binning %d: %d", i,
fAxes[i]->GetNbins());
195 nbinsBinningContent[iContentDim] =
fAxes[i]->GetNbins();
196 xminBinningContent[iContentDim] = 0;
197 xmaxBinningContent[iContentDim] =
fAxes[i]->GetNbins();
199 NLogTrace(
"[U] Binning %d: %d", i,
fAxes[i]->GetNbins());
206 fContent =
new THnSparseI(
"ngntBinningContent",
"NGnTree binning content", dimBinningContent, nbinsBinningContent,
207 xminBinningContent, xmaxBinningContent);
209 int iContentAxis = 0;
210 std::vector<std::string> types = {
"rebin",
"start",
"bin"};
211 for (
int i = 0; i < dim; i++) {
212 std::string name =
fAxes[i]->GetName();
213 std::string title =
fAxes[i]->GetName();
216 fContent->GetAxis(iContentAxis)->SetNameTitle(name.c_str(), title.c_str());
220 for (
int j = 0; j < 3; j++) {
222 std::string n = name +
"_" + types[imod];
223 std::string t = title +
" (" + types[imod] +
")";
224 fContent->GetAxis(iContentAxis)->SetNameTitle(n.c_str(), t.c_str());
230 fContent->GetAxis(iContentAxis)->SetNameTitle(name.c_str(), title.c_str());
234 for (
int i = 0; i <
fContent->GetNdimensions(); i++) {
235 NLogTrace(
"Axis[fContent] %d: %s nbins=%d", i,
fContent->GetAxis(i)->GetName(),
fContent->GetAxis(i)->GetNbins());
240 delete[] nbinsBinning;
241 delete[] xminBinning;
242 delete[] xmaxBinning;
251 if (
fMap ==
nullptr) {
252 NLogError(
"THnSparse fMap is null");
259 NLogInfo(
"NBinning base axes:");
260 for (
size_t i = 0; i <
fAxes.size(); i++) {
261 NLogInfo(
" Axis %d: name='%s' title='%s' nbins=%d min=%.3f max=%.3f", i,
fAxes[i]->GetName(),
fAxes[i]->GetTitle(),
265 if (opt.Contains(
"A")) {
266 NLogInfo(
"NBinning map name='%s' title='%s'",
fMap->GetName(),
fMap->GetTitle());
267 NLogInfo(
" dimensions: %d",
fMap->GetNdimensions());
269 for (
int i = 0; i <
fMap->GetNdimensions(); i++) {
270 NLogInfo(
" [%d] name='%s' title='%s' nbins=%d min=%.3f max=%.3f", i,
fMap->GetAxis(i)->GetName(),
271 fMap->GetAxis(i)->GetTitle(),
fMap->GetAxis(i)->GetNbins(),
fMap->GetAxis(i)->GetXmin(),
272 fMap->GetAxis(i)->GetXmax());
274 NLogInfo(
" filled bins = %lld",
fMap->GetNbins());
275 NLogInfo(
"NBinning content name='%s' title='%s'",
fContent->GetName(),
fContent->GetTitle());
276 NLogInfo(
" dimensions: %d",
fContent->GetNdimensions());
278 for (
int i = 0; i <
fContent->GetNdimensions(); i++) {
279 NLogInfo(
" [%d] name='%s' title='%s' nbins=%d min=%.3f max=%.3f", i,
fContent->GetAxis(i)->GetName(),
284 NLogInfo(
"NBinning content:");
285 NLogInfo(
" filled bins = %lld",
fContent->GetNbins());
287 NLogInfo(
"NBinning definitions:");
290 NLogInfo(
" '%s' (current)", kv.first.c_str());
293 NLogInfo(
" '%s'", kv.first.c_str());
297 if (option && opt.Contains(
"all")) {
298 NLogInfo(
"NBinning content:");
347 std::map<std::string, std::vector<int>> binningMap;
352 Int_t * bins =
new Int_t[cSparse->GetNdimensions()];
354 std::unique_ptr<ROOT::Internal::THnBaseBinIter> iter{cSparse->CreateIter(
true )};
355 while ((linBin = iter->Next()) >= 0) {
356 Double_t v = cSparse->GetBinContent(linBin, bins);
357 Long64_t idx = cSparse->GetBin(bins);
359 NLogTrace(
"Bin %lld: %f %s idx=%lld content=%f", linBin, v, binCoords.c_str(), idx, v);
362 bool isValid =
false;
365 for (iAxis = 0; iAxis <
fAxes.size(); iAxis++) {
373 binCoords += TString::Format(
" | (S%c) %s %d %d %d [%d,%d] [%d,%d]",
GetAxisTypeChar(iAxis),
374 fAxes[iAxis]->GetName(), 1, 1, bins[index], min, max, 1,
fAxes[iAxis]->GetNbins())
376 binningMap[
fAxes[iAxis]->GetName()] = {1, 1, bins[index]};
382 TString::Format(
" | (M%c) %s %d %d %d [%d,%d] [%d,%d]",
GetAxisTypeChar(iAxis),
fAxes[iAxis]->GetName(),
383 bins[index], bins[index + 1], bins[index + 2], min, max, 1,
fAxes[iAxis]->GetNbins())
385 binningMap[
fAxes[iAxis]->GetName()] = {bins[index], bins[index + 1], bins[index + 2]};
390 binCoords += TString::Format(
" | (U) %s %d %d %d [%d,%d] [%d,%d]",
fAxes[iAxis]->GetName(),
391 fAxes[iAxis]->GetNbins(), 1, 1, min, max, 1,
fAxes[iAxis]->GetNbins())
394 binningMap[
fAxes[iAxis]->GetName()] = {
fAxes[iAxis]->GetNbins(), 1, 1};
398 NLogError(
"[NBinning::PrintContent] Unknown binning type [%d]",
fBinningTypes[iAxis]);
402 NLogError(
"Cannot get axis range for axis %d", iAxis);
408 NLogError(
"Bin %lld: %s [not valid for axis=%s]", linBin, binCoords.c_str(),
fAxes[iAxis]->GetName());
411 NLogDebug(
"Bin %lld: %s", linBin, binCoords.c_str());
421 Long64_t nBinsFilled = 0;
425 std::vector<int> mins(
fMap->GetAxis(0)->GetNbins(), 1);
426 std::vector<int> maxs(
fMap->GetAxis(0)->GetNbins(), 0);
427 std::vector<std::vector<std::vector<int>>> content(
fMap->GetAxis(0)->GetNbins());
430 THnSparse * cSparse =
fMap;
431 Int_t * p =
new Int_t[cSparse->GetNdimensions()];
433 std::unique_ptr<ROOT::Internal::THnBaseBinIter> iter{cSparse->CreateIter(
true )};
436 while ((linBin = iter->Next()) >= 0) {
437 Double_t v = cSparse->GetBinContent(linBin, p);
440 NLogTrace(
"NBinning::FillAll: Bin %lld: %d %d %d %d type=%d content=%f", linBin, p[0], p[1], p[2], p[3],
444 content[idx].push_back({p[0], p[3]});
448 content[idx].push_back({p[0], p[1], p[2], p[3]});
452 content[idx].push_back({p[0], 1});
455 NLogError(
"NBinning::FillAll: Unknown binning type %d",
fBinningTypes[idx]);
458 maxs[idx] = maxs[idx] + 1;
462 Long64_t nTotalBins = 1;
464 for (
size_t i = 0; i < content.size(); i++) {
465 if (content[i].size() == 0) {
466 NLogWarning(
"NBinning::FillAll: No content for binning %zu", i);
470 if (content[i].size() > 1) {
471 TAxis * axis =
fAxes[i];
473 NLogTrace(
"NBinning::FillAll: Axis id=%d name=%s bins=%zu", i, axis->GetName(), content[i].size());
478 NLogTrace(
"NBinning::FillAll: Axis id=%d name=%s already in variable axes of def", i, axis->GetName());
483 NLogTrace(
"NBinning::FillAll: Axis id=%d name=%s set to variable found=%d", i, axis->GetName(), found);
486 nTotalBins *= content[i].size();
490 NLogDebug(
"NBinning::FillAll: Filling total of %lld bins ...", nTotalBins);
492 auto start_par = std::chrono::high_resolution_clock::now();
495 auto binning_task = [&content, &nBinsFilled, &nTotalBins, start_par, def,
this](
const std::vector<int> & coords) {
496 std::vector<int> pointContentVector;
498 for (
size_t i = 0; i < coords.size(); i++) {
499 NLogTrace(
" Binning %zu: coord=%d content size=%zu", i, coords[i], content[i].size());
500 if (content[i][coords[i] - 1].size() == 2) {
501 pointContentVector.push_back(content[i][coords[i] - 1][1]);
504 pointContentVector.push_back(content[i][coords[i] - 1][1]);
505 pointContentVector.push_back(content[i][coords[i] - 1][2]);
506 pointContentVector.push_back(content[i][coords[i] - 1][3]);
511 Int_t nContentDims =
fContent->GetNdimensions();
512 NLogTrace(
"NBinning::FillAll: pointContentVector dims=%zu nContentDims=%d", pointContentVector.size(),
515 auto pointContent = std::make_unique<Int_t[]>(nContentDims);
519 Long64_t pointContentBin =
fContent->GetBin(pointContent.get());
527 def->
GetContent()->SetBinContent(linBin, pointContentBin);
528 def->
GetIds().push_back(pointContentBin);
531 NLogTrace(
"NBinning::FillAll: Setting content bin %lld", pointContentBin);
533 fContent->SetBinContent(pointContentBin, 1);
537 NLogTrace(
"NBinning::FillAll: Filled bin %lld: %lld", nBinsFilled, nTotalBins);
538 int refreshRate = nTotalBins / 100;
539 if (refreshRate == 0) refreshRate = nTotalBins;
544 executor.
Execute(binning_task);
546 auto end_par = std::chrono::high_resolution_clock::now();
547 std::chrono::duration<double, std::milli> par_duration = end_par - start_par;
549 NLogInfo(
"NBinning::FillAll: Filled %lld bins in %s s", nTotalBins,
563 if (
fAxes.size() == 0) {
564 NLogError(
"AddBinning: No axes defined !!!");
568 if (id <= 0 || id >
fAxes.size()) {
569 NLogError(
"AddBinning: Invalid binning id %d",
id);
573 binning.insert(binning.begin(),
id);
574 Int_t * point =
new Int_t[
fMap->GetNdimensions()];
576 if (binning.size() == 2) {
581 for (
size_t i = 0; i < n; i++) {
582 NLogTrace(
"Adding binning %d: %d %d %d %d", i, point[0], point[1], point[2], point[3]);
583 fMap->SetBinContent(point, 1);
595 if (id <= 0 || id >
fAxes.size()) {
596 NLogError(
"AddBinningVariable: Invalid binning id %d",
id);
601 for (
size_t i = 1; i < mins.size(); i++) {
603 if (mins[i] < 1 || mins[i] >
fAxes[
id - 1]->GetNbins() + 1) {
608 int rebin = mins[i] - mins[i - 1];
610 NLogError(
"AddBinningVariable: Invalid binning value rebin=%d", rebin);
614 int rebin_start = mins[i - 1] % rebin;
615 int bin = mins[i] / rebin;
637 std::vector<int> mins;
640 for (
auto & w : widths) {
641 TAxis * axis =
fAxes[
id - 1];
643 int nWidths = w.size() > 1 ? w[1] : axis->GetNbins() / width;
646 for (
int iWidth = 0; iWidth < nWidths; iWidth++) {
647 if (mins[mins.size() - 1] > axis->GetNbins()) {
651 mins.push_back(mins[mins.size() - 1] + width);
656 NLogTrace(
"NBinning::AddBinningViaBinWidths: Adding binning via bin widths: %s",
664 std::vector<std::vector<int>> coordsRange;
665 std::vector<int> ids;
666 std::vector<int> mins;
667 std::vector<int> maxs;
671 for (
size_t iAxis = 0; iAxis <
fAxes.size(); iAxis++) {
689 NLogError(
"NBinning::GetCoordsRange: Unknown binning type %d",
fBinningTypes[iAxis]);
697 NLogDebug(
"Axis %d: %s [%d,%d]", iAxis,
fAxes[iAxis]->GetName(), min, max);
698 ids.push_back(iAxis);
703 coordsRange.push_back(ids);
704 coordsRange.push_back(mins);
705 coordsRange.push_back(maxs);
712 NLogError(
"Invalid binning type %d", i);
714 return Binning::kUndefined;
723 std::vector<std::vector<int>> axisRanges;
727 for (
size_t iAxis = 0; iAxis <
fAxes.size(); iAxis++) {
744 NLogError(
"[NBinning::GetAxisRanges] Unknown binning type [%d]",
fBinningTypes[iAxis]);
752 NLogTrace(
"Axis %d: %s [%d,%d]", iAxis,
fAxes[iAxis]->GetName(), min, max);
753 axisRanges.push_back({(int)iAxis, min, max});
763 std::vector<int> binning;
766 for (
size_t iAxis = 0; iAxis <
fAxes.size(); iAxis++) {
771 if (iAxis == axisId) {
772 binning.push_back(1);
773 binning.push_back(1);
774 binning.push_back(c[index]);
780 if (iAxis == axisId) {
781 binning.push_back(c[index]);
782 binning.push_back(c[index + 1]);
783 binning.push_back(c[index + 2]);
789 if (iAxis == axisId) {
790 binning.push_back(c[index]);
791 binning.push_back(1);
792 binning.push_back(1);
798 NLogError(
"[NBinning::GetAxisBinning] Unknown binning type [%d]",
fBinningTypes[iAxis]);
815 min =
fAxes[axisId]->GetBinLowEdge(minBin);
816 max =
fAxes[axisId]->GetBinUpEdge(maxBin);
825 if (axisId >=
fAxes.size()) {
826 NLogError(
"Invalid axis id %d", axisId);
834 Bool_t isValid =
false;
855 TObjArray * axesArray =
new TObjArray();
858 for (
size_t i = 0; i <
fAxes.size(); i++) {
859 TAxis * axis = (TAxis *)
fAxes[i];
860 TAxis * axisNew = (TAxis *)axis->Clone();
862 std::string name = axis->GetName();
863 NLogTrace(
"NBinning::GetListOfAxes(): Binning '%s': %d", name.c_str(), axis->GetNbins());
865 auto bins = std::make_unique<double[]>(axis->GetNbins() + 1);
869 bins[count++] = axis->GetBinLowEdge(1);
872 std::map<std::string, std::vector<std::vector<int>>> definition = def->
GetDefinition();
873 for (
auto & v : definition.at(name)) {
876 int n = v.size() > 1 ? v[1] : axis->GetNbins() / v[0];
877 for (
int i = 0; i < n; i++) {
879 bins[count++] = axis->GetBinLowEdge(iBin);
883 for (
int i = 0; i < count; i++) {
884 NLogTrace(
" %s: %d %f", axis->GetName(), i + 1, bins[i]);
886 axisNew->Set(count - 1, bins.get());
887 axesArray->Add(axisNew);
898 if (axisId >=
fAxes.size()) {
899 NLogError(
"Invalid axis id %d", axisId);
912 NLogError(
"Invalid axis type %d", i);
913 return AxisType::kUndefined;
920 NLogError(
"Invalid axis type %d", i);
924 case AxisType::kFixed:
return 'F';
925 case AxisType::kVariable:
return 'V';
926 case AxisType::kUndefined:
936 std::vector<int> ids;
937 for (
size_t i = 0; i <
fAxes.size(); i++) {
939 NLogTrace(
"Axis %d: %s type=%d", i,
fAxes[i]->GetName(),
fAxisTypes[i]);
943 NLogTrace(
"Axis %d: %s type=%d [not selected]", i,
fAxes[i]->GetName(),
fAxisTypes[i]);
954 std::vector<TAxis *> axes;
955 for (
size_t i = 0; i <
fAxes.size(); i++) {
957 NLogTrace(
"Axis %d: %s type=%d", i,
fAxes[i]->GetName(),
fAxisTypes[i]);
958 axes.push_back(
fAxes[i]);
961 NLogTrace(
"Axis %d: %s type=%d [not selected]", i,
fAxes[i]->GetName(),
fAxisTypes[i]);
972 std::vector<int> ids;
973 for (
auto & name : names) {
974 for (
size_t i = 0; i <
fAxes.size(); i++) {
975 if (
fAxes[i]->GetName() == name) {
976 NLogTrace(
"Axis %d: %s type=%d", i,
fAxes[i]->GetName(),
fAxisTypes[i]);
990 std::vector<std::string> names;
991 for (
size_t i = 0; i <
fAxes.size(); i++) {
993 NLogTrace(
"Axis %d: %s type=%d", i,
fAxes[i]->GetName(),
fAxisTypes[i]);
994 names.push_back(
fAxes[i]->GetName());
998 NLogTrace(
"Axis %d: %s type=%d [not selected]", i,
fAxes[i]->GetName(),
fAxisTypes[i]);
1008 std::vector<std::string> names;
1009 for (
auto &
id : ids) {
1011 if (id < 0 || id >= (
int)
fAxes.size()) {
1012 NLogError(
"Invalid axis id %d",
id);
1015 NLogTrace(
"Axis %d: %s type=%d",
id,
fAxes[
id]->GetName(),
fAxisTypes[
id]);
1016 names.push_back(
fAxes[
id]->GetName());
1042 NLogError(
"NBinning::GetDefinition: Definition '%s' not found", name.c_str());
1045 NLogTrace(
"NBinning::GetDefinition: Using definition '%s'", name.c_str());
1057 NLogError(
"Binning definition '%s' already exists", name.c_str());
1061 NLogInfo(
"NBinning::AddBinningDefinition: Adding binning definition '%s'", name.c_str());
1068 for (
size_t i = 0; i <
fAxes.size(); i++) {
1069 TAxis * axis =
fAxes[i];
1070 std::string axisName = axis->GetName();
1073 if (!binning[axisName].empty()) {
1080 AddBinning(i + 1, {axis->GetNbins(), 1, 1}, 1);
1089 Long64_t nFilled =
FillAll(def);
1091 NLogTrace(
"NBinning::AddBinningDefinition: Filled %lld bins for definition '%s'", nFilled,
1100 NLogTrace(
"Added binning definition '%s' [not default]", name.c_str());
1125 if (def ==
nullptr) {
1126 NLogError(
"NBinning::FillPoint: Definition '%s' not found", binning.c_str());
1134 Long64_t linBin = def->
GetId(
id);
1136 NLogError(
"NBinning::GetPoint: Invalid linear bin %lld for id=%d in definition '%s'", linBin,
id, binning.c_str());
1139 if (linBin >=
fContent->GetNbins()) {
1140 NLogError(
"NBinning::GetPoint: Linear bin %lld out of range [0,%lld) for id=%d in definition '%s'", linBin,
1141 fContent->GetNbins(),
id, binning.c_str());
1170 NLogInfo(
"Binning definition name='' set to first available definition '%s'",
fCurrentDefinitionName.c_str());
1174 NLogError(
"Binning definition name='' and no definitions are available !!! Ignorred ...");
1180 NLogError(
"Binning definition '%s' not found", name.c_str());
1186 NLogTrace(
"Binning definition '%s' is already current", name.c_str());
Defines binning mapping and content for NDMSPC histograms.
THnSparse * GetContent() const
Get the template content histogram.
std::map< std::string, std::vector< std::vector< int > > > GetDefinition() const
Get the binning mapping definition.
std::vector< int > GetVariableAxes() const
Get list of variable axes indices.
virtual void Print(Option_t *option="") const
Print binning definition information.
void AddVariableAxis(size_t axis)
Add a variable axis index.
Long64_t GetId(size_t index) const
Get bin ID at specified index.
std::vector< Long64_t > GetIds() const
Get list of bin IDs.
Represents a single point in multi-dimensional binning.
bool RecalculateStorageCoords(Long64_t entry=-1, bool useBinningDefCheck=false)
Recalculate storage coordinates for the point.
Int_t * GetStorageCoords() const
Get pointer to storage coordinates array.
void SetCfg(json cfg)
Set configuration JSON object.
Int_t * GetCoords() const
Get pointer to content coordinates array.
virtual void Reset()
Reset the binning point to initial state.
NBinning object for managing multi-dimensional binning and axis definitions.
NBinningDef * GetDefinition(const std::string &name="")
Get binning definition by name.
std::vector< std::string > GetAxisNamesByType(AxisType type) const
Get axis names by type.
std::vector< int > GetAxisIndexes(AxisType type) const
Get indexes of axes by type.
std::vector< std::string > GetAxisNamesByIndexes(std::vector< int > axisIds) const
Get axis names by indexes.
std::vector< AxisType > fAxisTypes
Axis types.
std::vector< TAxis * > fAxes
List of axes.
NBinningPoint * GetPoint()
Get the current binning point.
std::vector< int > GetAxisIndexesByNames(std::vector< std::string > axisNames) const
Get axis indexes by axis names.
bool GetAxisRange(size_t axisId, double &min, double &max, std::vector< int > c) const
Get axis range for a specific axis and coordinates.
std::vector< std::vector< int > > GetAxisRanges(std::vector< int > c) const
Get axis ranges for given coordinates.
TObjArray * GenerateListOfAxes()
Generate a list of axes as TObjArray.
bool AddBinningVariable(size_t id, std::vector< int > mins)
Add variable binning for a specific axis.
NBinning()
Default constructor.
virtual void Print(Option_t *option="") const
Print binning information.
AxisType GetAxisType(size_t i) const
Get axis type for a specific axis.
bool AddBinningViaBinWidths(size_t id, std::vector< std::vector< int >> widths)
Add binning via bin widths for a specific axis.
void Initialize()
Initialize the binning object.
bool SetCfg(const json &cfg)
Set configuration from JSON.
std::vector< std::string > fDefinitionNames
Binning definition names.
THnSparse * fContent
Content histogram.
void AddBinningDefinition(std::string name, std::map< std::string, std::vector< std::vector< int >>> binning, bool forceDefault=false)
Add a binning definition.
std::string fCurrentDefinitionName
Current definition name.
std::map< std::string, NBinningDef * > fDefinitions
Binning definitions.
Binning GetBinningType(size_t i) const
Get binning type for a specific axis.
void PrintContent(Option_t *option="") const
Print binning content.
bool GetAxisRangeInBase(size_t axisId, int &min, int &max, std::vector< int > c) const
Get axis range in base for a specific axis and coordinates.
std::vector< int > GetAxisBinning(size_t axisId, const std::vector< int > &c) const
Get binning for a specific axis and coordinates.
virtual ~NBinning()
Destructor.
NBinningPoint * fPoint
! Binning point object
char GetAxisTypeChar(size_t i) const
Get axis type as character for a specific axis.
void Reset()
Reset the binning object to initial state.
std::vector< std::vector< int > > GetCoordsRange(std::vector< int > c) const
Get coordinate ranges for given coordinates.
bool SetAxisType(size_t id, AxisType type)
Set axis type for a specific axis.
std::vector< TAxis * > GetAxesByType(AxisType type) const
Get axes by type.
void SetCurrentDefinitionName(const std::string &name)
Set current definition name.
THnSparse * fMap
Mapping histogram.
std::vector< Binning > fBinningTypes
Binning types.
bool AddBinning(size_t id, std::vector< int > binning, size_t n=1)
Add binning for a specific axis.
Long64_t FillAll(NBinningDef *def=nullptr)
Fill all bins according to definition.
Executes a function over all points in an N-dimensional space, optionally in parallel.
void Execute(const std::function< void(const std::vector< int > &coords)> &func)
Execute a function over all coordinates in the N-dimensional space.
static std::string FormatTime(long long seconds)
Format time in seconds to human-readable string.
static bool GetAxisRangeInBase(TAxis *a, int rebin, int rebin_start, int bin, int &min, int &max)
Get axis range in base for rebinned axis.
static void ProgressBar(int current, int total, std::string prefix="", std::string suffix="", int barWidth=50)
Display progress bar.
static std::string GetCoordsString(const std::vector< int > &coords, int index=-1, int width=0)
Get string representation of coordinates.
static void VectorToArray(std::vector< int > v1, Int_t *v2)
Convert vector to array.
static std::vector< int > ArrayToVector(Int_t *v1, int size)
Convert array to vector.