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,
false);
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() > 0) {
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;
540 if (nBinsFilled % (refreshRate) == 0 && nBinsFilled != nTotalBins)
545 executor.
Execute(binning_task);
549 auto end_par = std::chrono::high_resolution_clock::now();
550 std::chrono::duration<double, std::milli> par_duration = end_par - start_par;
552 NLogInfo(
"NBinning::FillAll: Filled %lld bins in %s s", nTotalBins,
566 if (
fAxes.size() == 0) {
567 NLogError(
"AddBinning: No axes defined !!!");
571 if (id <= 0 || id >
fAxes.size()) {
572 NLogError(
"AddBinning: Invalid binning id %d",
id);
576 binning.insert(binning.begin(),
id);
577 Int_t * point =
new Int_t[
fMap->GetNdimensions()];
579 if (binning.size() == 2) {
584 for (
size_t i = 0; i < n; i++) {
585 NLogTrace(
"Adding binning %d: %d %d %d %d", i, point[0], point[1], point[2], point[3]);
586 fMap->SetBinContent(point, 1);
598 if (id <= 0 || id >
fAxes.size()) {
599 NLogError(
"AddBinningVariable: Invalid binning id %d",
id);
604 for (
size_t i = 1; i < mins.size(); i++) {
606 if (mins[i] < 1 || mins[i] >
fAxes[
id - 1]->GetNbins() + 1) {
611 int rebin = mins[i] - mins[i - 1];
613 NLogError(
"AddBinningVariable: Invalid binning value rebin=%d", rebin);
617 int rebin_start = mins[i - 1] % rebin;
618 int bin = mins[i] / rebin;
640 std::vector<int> mins;
643 for (
auto & w : widths) {
644 TAxis * axis =
fAxes[
id - 1];
646 int nWidths = w.size() > 1 ? w[1] : axis->GetNbins() / width;
649 for (
int iWidth = 0; iWidth < nWidths; iWidth++) {
650 if (mins[mins.size() - 1] > axis->GetNbins()) {
654 mins.push_back(mins[mins.size() - 1] + width);
659 NLogTrace(
"NBinning::AddBinningViaBinWidths: Adding binning via bin widths: %s",
667 std::vector<std::vector<int>> coordsRange;
668 std::vector<int> ids;
669 std::vector<int> mins;
670 std::vector<int> maxs;
674 for (
size_t iAxis = 0; iAxis <
fAxes.size(); iAxis++) {
692 NLogError(
"NBinning::GetCoordsRange: Unknown binning type %d",
fBinningTypes[iAxis]);
700 NLogDebug(
"Axis %d: %s [%d,%d]", iAxis,
fAxes[iAxis]->GetName(), min, max);
701 ids.push_back(iAxis);
706 coordsRange.push_back(ids);
707 coordsRange.push_back(mins);
708 coordsRange.push_back(maxs);
715 NLogError(
"Invalid binning type %d", i);
717 return Binning::kUndefined;
726 std::vector<std::vector<int>> axisRanges;
730 for (
size_t iAxis = 0; iAxis <
fAxes.size(); iAxis++) {
747 NLogError(
"[NBinning::GetAxisRanges] Unknown binning type [%d]",
fBinningTypes[iAxis]);
755 NLogTrace(
"Axis %d: %s [%d,%d]", iAxis,
fAxes[iAxis]->GetName(), min, max);
756 axisRanges.push_back({(int)iAxis, min, max});
766 std::vector<int> binning;
769 for (
size_t iAxis = 0; iAxis <
fAxes.size(); iAxis++) {
774 if (iAxis == axisId) {
775 binning.push_back(1);
776 binning.push_back(1);
777 binning.push_back(c[index]);
783 if (iAxis == axisId) {
784 binning.push_back(c[index]);
785 binning.push_back(c[index + 1]);
786 binning.push_back(c[index + 2]);
792 if (iAxis == axisId) {
793 binning.push_back(c[index]);
794 binning.push_back(1);
795 binning.push_back(1);
801 NLogError(
"[NBinning::GetAxisBinning] Unknown binning type [%d]",
fBinningTypes[iAxis]);
818 min =
fAxes[axisId]->GetBinLowEdge(minBin);
819 max =
fAxes[axisId]->GetBinUpEdge(maxBin);
828 if (axisId >=
fAxes.size()) {
829 NLogError(
"Invalid axis id %d", axisId);
837 Bool_t isValid =
false;
858 TObjArray * axesArray =
new TObjArray();
861 for (
size_t i = 0; i <
fAxes.size(); i++) {
862 TAxis * axis = (TAxis *)
fAxes[i];
863 TAxis * axisNew = (TAxis *)axis->Clone();
865 std::string name = axis->GetName();
866 NLogTrace(
"NBinning::GetListOfAxes(): Binning '%s': %d", name.c_str(), axis->GetNbins());
868 auto bins = std::make_unique<double[]>(axis->GetNbins() + 1);
872 bins[count++] = axis->GetBinLowEdge(1);
875 std::map<std::string, std::vector<std::vector<int>>> definition = def->
GetDefinition();
876 for (
auto & v : definition.at(name)) {
879 int n = v.size() > 1 ? v[1] : axis->GetNbins() / v[0];
880 for (
int i = 0; i < n; i++) {
882 bins[count++] = axis->GetBinLowEdge(iBin);
886 for (
int i = 0; i < count; i++) {
887 NLogTrace(
" %s: %d %f", axis->GetName(), i + 1, bins[i]);
889 axisNew->Set(count - 1, bins.get());
890 axesArray->Add(axisNew);
901 if (axisId >=
fAxes.size()) {
902 NLogError(
"Invalid axis id %d", axisId);
915 NLogError(
"Invalid axis type %d", i);
916 return AxisType::kUndefined;
923 NLogError(
"Invalid axis type %d", i);
927 case AxisType::kFixed:
return 'F';
928 case AxisType::kVariable:
return 'V';
929 case AxisType::kUndefined:
939 std::vector<int> ids;
940 for (
size_t i = 0; i <
fAxes.size(); i++) {
942 NLogTrace(
"Axis %d: %s type=%d", i,
fAxes[i]->GetName(),
fAxisTypes[i]);
946 NLogTrace(
"Axis %d: %s type=%d [not selected]", i,
fAxes[i]->GetName(),
fAxisTypes[i]);
957 std::vector<TAxis *> axes;
958 for (
size_t i = 0; i <
fAxes.size(); i++) {
960 NLogTrace(
"Axis %d: %s type=%d", i,
fAxes[i]->GetName(),
fAxisTypes[i]);
961 axes.push_back(
fAxes[i]);
964 NLogTrace(
"Axis %d: %s type=%d [not selected]", i,
fAxes[i]->GetName(),
fAxisTypes[i]);
975 std::vector<int> ids;
976 for (
auto & name : names) {
977 for (
size_t i = 0; i <
fAxes.size(); i++) {
978 if (
fAxes[i]->GetName() == name) {
979 NLogTrace(
"Axis %d: %s type=%d", i,
fAxes[i]->GetName(),
fAxisTypes[i]);
993 std::vector<std::string> names;
994 for (
size_t i = 0; i <
fAxes.size(); i++) {
996 NLogTrace(
"Axis %d: %s type=%d", i,
fAxes[i]->GetName(),
fAxisTypes[i]);
997 names.push_back(
fAxes[i]->GetName());
1001 NLogTrace(
"Axis %d: %s type=%d [not selected]", i,
fAxes[i]->GetName(),
fAxisTypes[i]);
1011 std::vector<std::string> names;
1012 for (
auto &
id : ids) {
1014 if (id < 0 || id >= (
int)
fAxes.size()) {
1015 NLogError(
"Invalid axis id %d",
id);
1018 NLogTrace(
"Axis %d: %s type=%d",
id,
fAxes[
id]->GetName(),
fAxisTypes[
id]);
1019 names.push_back(
fAxes[
id]->GetName());
1045 NLogError(
"NBinning::GetDefinition: Definition '%s' not found", name.c_str());
1048 NLogTrace(
"NBinning::GetDefinition: Using definition '%s'", name.c_str());
1060 NLogError(
"Binning definition '%s' already exists", name.c_str());
1064 NLogInfo(
"NBinning::AddBinningDefinition: Adding binning definition '%s'", name.c_str());
1071 for (
size_t i = 0; i <
fAxes.size(); i++) {
1072 TAxis * axis =
fAxes[i];
1073 std::string axisName = axis->GetName();
1078 if (!binning[axisName].empty()) {
1081 if (axis->IsAlphanumeric() && (binning[axisName].size() != 1 || binning[axisName][0][0] != 1)) {
1082 NLogError(
"NBinning::AddBinningDefinition: Axis '%s' is alphanumeric and is binning provided in definition "
1083 "'%s'. Exiting ...",
1084 axisName.c_str(), name.c_str());
1097 if (axis->IsAlphanumeric()) {
1098 NLogError(
"NBinning::AddBinningDefinition: Axis '%s' is alphanumeric and no binning provided in definition "
1099 "'%s'. Exiting ...",
1100 axisName.c_str(), name.c_str());
1104 AddBinning(i + 1, {axis->GetNbins(), 1, 1}, 1);
1113 Long64_t nFilled =
FillAll(def);
1115 NLogTrace(
"NBinning::AddBinningDefinition: Filled %lld bins for definition '%s'", nFilled,
1124 NLogTrace(
"Added binning definition '%s' [not default]", name.c_str());
1149 if (def ==
nullptr) {
1150 NLogError(
"NBinning::FillPoint: Definition '%s' not found", binning.c_str());
1158 Long64_t linBin = def->
GetId(
id);
1160 NLogError(
"NBinning::GetPoint: Invalid linear bin %lld for id=%d in definition '%s'", linBin,
id, binning.c_str());
1163 if (linBin >=
fContent->GetNbins()) {
1164 NLogError(
"NBinning::GetPoint: Linear bin %lld out of range [0,%lld) for id=%d in definition '%s'", linBin,
1165 fContent->GetNbins(),
id, binning.c_str());
1194 NLogInfo(
"Binning definition name='' set to first available definition '%s'",
fCurrentDefinitionName.c_str());
1198 NLogError(
"Binning definition name='' and no definitions are available !!! Ignorred ...");
1204 NLogError(
"Binning definition '%s' not found", name.c_str());
1210 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.