1 #include "NBinningDef.h"
4 #include "NDimensionalExecutor.h"
16 : TObject(), fBinning(binning), fName(name), fDefinition(definition)
31 if (binning ==
nullptr) {
36 std::vector<TAxis *> axes = binning->
GetAxes();
37 for (
size_t i = 0; i < axes.size(); i++) {
38 TAxis * axis = axes[i];
39 std::string axisName = axis->GetName();
48 int dims = axes.size();
49 Int_t * nbins =
new Int_t[dims];
50 Double_t * xmin =
new Double_t[dims];
51 Double_t * xmax =
new Double_t[dims];
54 TObjArray * cAxes =
new TObjArray();
57 for (
int i = 0; i < dims; i++) {
58 TAxis * axis = (TAxis *)axes[i];
59 TAxis * axisNew = (TAxis *)axis->Clone();
61 std::string name = axis->GetName();
62 NLogTrace(
"NBinningDef: Binning '%s': %d", name.c_str(), axis->GetNbins());
64 auto bins = std::make_unique<double[]>(axis->GetNbins() + 1);
67 bins[count++] = axis->GetBinLowEdge(1);
70 std::map<std::string, std::vector<std::vector<int>>> definition =
GetDefinition();
71 for (
auto & v : definition.at(name)) {
74 int n = v.size() > 1 ? v[1] : axis->GetNbins() / v[0];
75 for (
int i = 0; i < n; i++) {
77 if (iBin > axis->GetNbins()) {
80 bins[count++] = axis->GetBinUpEdge(iBin);
87 axisNew->Set(count - 1, bins.get());
91 for (
int i = 0; i < cAxes->GetEntries(); i++) {
92 TAxis * axis = (TAxis *)cAxes->At(i);
93 nbins[i] = axis->GetNbins();
95 xmax[i] = axis->GetNbins();
97 fContent =
new THnSparseL(
"content",
"content", dims, nbins, xmin, xmax);
100 for (
int i = 0; i < cAxes->GetEntries(); i++) {
101 TAxis * axis = (TAxis *)cAxes->At(i);
102 TAxis * axisContent =
fContent->GetAxis(i);
103 axisContent->SetName(axis->GetName());
104 axisContent->SetTitle(axis->GetTitle());
105 if (axis->IsVariableBinSize()) {
106 axisContent->Set(
fContent->GetAxis(i)->GetNbins(), axis->GetXbins()->GetArray());
109 axisContent->Set(axis->GetNbins(), axis->GetXmin(), axis->GetXmax());
112 if (axes[i]->IsAlphanumeric()) {
113 for (
int b = 1; b <= axis->GetNbins(); b++) {
114 NLogTrace(
"NBinningDef::NBinningDef: Setting bin label for axis '%s' bin %d: '%s'", axis->GetName(), b,
115 axis->GetBinLabel(b));
116 axisContent->SetBinLabel(b, axes[i]->GetBinLabel(b));
124 NLogError(
"NBinningPoint::GetTitle: Axis %d is nullptr !!!", i);
129 for (
int i = 0; i < cAxes->GetEntries(); i++) {
130 TAxis * axis = (TAxis *)cAxes->At(i);
151 NLogInfo(
"NBinningDef: name='%s' %zu axes with %zu entries : %s",
fName.c_str(),
fDefinition.size(),
fIds.size(),
165 TString opt = option;
167 if (opt.Contains(
"A")) {
169 for (
int i = 0; i <
fContent->GetNdimensions(); i++) {
170 std::string name =
fContent->GetAxis(i)->GetName();
171 NLogInfo(
" [%d] name='%s' title='%s' nbins=%d min=%.3f max=%.3f base: nbins=%d", i,
185 if (index >=
fIds.size()) {
186 NLogError(
"NBinningDef::GetId: Index %d is out of range [0, %zu)", index,
fIds.size());
199 Int_t * c =
new Int_t[
fContent->GetNdimensions()];
200 auto task = [
this, c](
const std::vector<int> & coords) {
201 NLogTrace(
"NBinningDef::RefreshIdsFromContent: Processing coordinates %s",
NUtils::GetCoordsString(coords).c_str());
203 for (
int i = 0; i <
fContent->GetNdimensions(); i++) {
207 Long64_t
id =
fContent->GetBinContent(c);
209 NLogTrace(
"NBinningDef::RefreshIdsFromContent: -> Bin content: %lld",
id - 1);
210 fIds.push_back(
id - 1);
214 std::vector<int> mins(
fContent->GetNdimensions(), 1);
215 std::vector<int> maxs(
fContent->GetNdimensions());
216 for (
int i = 0; i <
fContent->GetNdimensions(); i++) {
217 TAxis * axis =
fContent->GetAxis(i);
218 NLogTrace(
"NBinningDef::RefreshIdsFromContent: Axis %d: name='%s' title='%s' nbins=%d min=%.3f max=%.3f", i,
219 axis->GetName(), axis->GetTitle(), axis->GetNbins(), axis->GetXmin(), axis->GetXmax());
220 maxs[i] = axis->GetNbins();
235 NLogTrace(
"NBinningDef::RefreshContentfomIds: Refreshing content from %zu IDs: %s",
fIds.size(),
241 for (
size_t i = 0; i <
fIds.size(); ++i) {
246 Int_t * c =
new Int_t[
fContent->GetNdimensions()];
247 std::vector<Long64_t> newIds;
249 auto task = [
this, &newIds, c](
const std::vector<int> & coords) {
250 NLogTrace(
"NBinningDef::RefreshContentfomIds: Processing coordinates %s",
NUtils::GetCoordsString(coords).c_str());
252 for (
int i = 0; i <
fContent->GetNdimensions(); i++) {
256 Long64_t
id =
fContent->GetBinContent(c);
262 NLogTrace(
"NBinningDef::RefreshContentfomIds: -> Bin content: %lld",
id - 1);
263 fIds.push_back(
id - 1);
267 std::vector<int> mins(
fContent->GetNdimensions(), 1);
268 std::vector<int> maxs(
fContent->GetNdimensions());
269 for (
int i = 0; i <
fContent->GetNdimensions(); i++) {
270 TAxis * axis =
fContent->GetAxis(i);
271 NLogTrace(
"NBinningDef::RefreshContentfomIds: Axis %d: name='%s' title='%s' nbins=%d min=%.3f max=%.3f", i,
272 axis->GetName(), axis->GetTitle(), axis->GetNbins(), axis->GetXmin(), axis->GetXmax());
273 maxs[i] = axis->GetNbins();
Defines binning mapping and content for NDMSPC histograms.
std::vector< int > fVariableAxes
List of variable axes indices in the content histogram.
void SetAxisDefinition(std::string axisName, const std::vector< std::vector< int >> &d)
Set axis definition for a specific axis.
std::map< std::string, std::vector< std::vector< int > > > GetDefinition() const
Get the binning mapping definition.
NBinning * fBinning
Pointer to the parent binning.
virtual void Print(Option_t *option="") const
Print binning definition information.
virtual ~NBinningDef()
Destructor.
std::string fName
Name of the binning definition.
void RefreshIdsFromContent()
Refresh bin IDs from content histogram.
std::vector< Long64_t > fIds
List of IDs for the binning definition.
std::map< std::string, std::vector< std::vector< int > > > fDefinition
Binning mapping definition.
Long64_t GetId(size_t index) const
Get bin ID at specified index.
void RefreshContentFromIds()
Refresh content histogram from bin IDs.
NBinningDef(std::string name="default", std::map< std::string, std::vector< std::vector< int >>> definition={}, NBinning *binning=nullptr)
Constructor.
THnSparse * fContent
Template histogram for the binning definition.
Int_t * GetStorageCoords() const
Get pointer to storage coordinates array.
bool SetPointContentFromLinearIndex(Long64_t linBin, bool checkBinningDef=false)
Set point content from linear index.
NBinning object for managing multi-dimensional binning and axis definitions.
NBinningPoint * GetPoint()
Get the current binning point.
std::vector< TAxis * > GetAxes() const
Get vector of axis pointers.
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 GetCoordsString(const std::vector< int > &coords, int index=-1, int width=0)
Get string representation of coordinates.