MaCh3  2.4.2
Reference Guide
Public Member Functions | Public Attributes | List of all members
SampleBinningInfo Struct Reference

KS: Struct storing all information required for sample binning. More...

#include <Samples/SampleStructs.h>

Collaboration diagram for SampleBinningInfo:
[legend]

Public Member Functions

void InitUniform (const std::vector< std::vector< double >> &InputEdges)
 Initialise Uniform Binning. More...
 
void CheckBinsDoNotOverlap (const std::vector< BinInfo > &TestedBins) const
 Check that non-uniform bin extents do not overlap. More...
 
void CheckBinsHaveNoGaps (const std::vector< BinInfo > &TestedBins, const std::vector< double > &MinVal, const std::vector< double > &MaxVal, size_t ValidationBinsPerDim=100) const
 Check that non-uniform bins fully cover the bounding box (no gaps) More...
 
void InitialiseGridMapping ()
 Initialise Non-Uniform Binning. More...
 
void InitNonUniform (const std::vector< std::vector< std::vector< double >>> &InputBins)
 Initialise Non-Uniform Binning. More...
 
int GetBinSafe (const std::vector< int > &BinIndices) const
 Get linear bin index from ND bin indices with additional checks. More...
 
int GetBin (const std::vector< int > &BinIndices) const
 Convert N-dimensional bin indices to a linear bin index. More...
 
int FindBin (const int Dimension, const double Var, const int NomBin) const
 DB Find the relevant bin in the PDF for each event. More...
 
int FindBin (const double KinVar, const int NomBin, const int N_Bins, const std::vector< double > &Bin_Edges, const std::vector< BinShiftLookup > &Bin_Lookup) const
 DB Find the relevant bin in the PDF for each event. More...
 
void InitialiseLookUpSingleDimension (std::vector< BinShiftLookup > &Bin_Lookup, const std::vector< double > &Bin_Edges, const int TotBins)
 Initializes lookup arrays for efficient bin migration in a single dimension. More...
 
void InitialiseStrides (const int Dimension)
 Initialise stride factors for linear bin index calculation. More...
 
void InitialiseBinMigrationLookUp (const int Dimension)
 Initialise special lookup arrays allowing to more efficiently perform bin-migration These arrays store the lower and upper edges of each bin and their neighboring bins. More...
 

Public Attributes

std::vector< std::vector< double > > BinEdges
 Vector to hold N-axis bin-edges. More...
 
std::vector< int > AxisNBins
 Number of N-axis bins in the histogram used for likelihood calculation. More...
 
int nBins = M3::_BAD_INT_
 Number of total bins. More...
 
int GlobalOffset = M3::_BAD_INT_
 If you have binning for multiple samples and trying to define 1D vector let's. More...
 
std::vector< std::vector< BinShiftLookup > > BinLookup
 Bin lookups for all dimensions. More...
 
std::vector< int > Strides
 Stride factors for converting N-dimensional bin indices to a linear index. More...
 
bool Uniform = true
 Tells whether to use inform binning grid or non-uniform. More...
 
std::vector< BinInfoBins
 Bins used only for non-uniform. More...
 
std::vector< std::vector< int > > BinGridMapping
 This grid tells what bins are associated with with what BinEdges of Grid Binnins. More...
 

Detailed Description

KS: Struct storing all information required for sample binning.

This struct encapsulates the full binning definition for a single analysis sample. It stores the bin edges, number of bins per dimension, stride factors, and lookup tables required to efficiently map multi-dimensional kinematic variables to linear bin indices.

Author
Kamil Skwarczynski

Definition at line 232 of file SampleStructs.h.

Member Function Documentation

◆ CheckBinsDoNotOverlap()

void SampleBinningInfo::CheckBinsDoNotOverlap ( const std::vector< BinInfo > &  TestedBins) const
inline

Check that non-uniform bin extents do not overlap.

Definition at line 290 of file SampleStructs.h.

290  {
291  if (TestedBins.empty()) return;
292 
293  const size_t ExtentDim = TestedBins[0].Extent.size();
294 
295  for (size_t i = 0; i < TestedBins.size(); ++i) {
296  for (size_t j = i + 1; j < TestedBins.size(); ++j) {
297  bool OverlapsInAllDims = true;
298 
299  for (size_t iDim = 0; iDim < ExtentDim; ++iDim) {
300  const double a_lo = TestedBins[i].Extent[iDim][0];
301  const double a_hi = TestedBins[i].Extent[iDim][1];
302  const double b_lo = TestedBins[j].Extent[iDim][0];
303  const double b_hi = TestedBins[j].Extent[iDim][1];
304 
305  // [low, high) overlap check
306  if (!(a_lo < b_hi && b_lo < a_hi)) {
307  OverlapsInAllDims = false;
308  break;
309  }
310  }
311 
312  if (OverlapsInAllDims) {
313  MACH3LOG_ERROR("Overlapping non-uniform bins detected: Bin {} and Bin {}", i, j);
314  for (size_t iDim = 0; iDim < ExtentDim; ++iDim) {
315  MACH3LOG_ERROR(" Dim {}: Bin {} [{}, {}), Bin {} [{}, {})",
316  iDim,
317  i, TestedBins[i].Extent[iDim][0], TestedBins[i].Extent[iDim][1],
318  j, TestedBins[j].Extent[iDim][0], TestedBins[j].Extent[iDim][1]);
319  }
320  throw MaCh3Exception(__FILE__, __LINE__);
321  }
322  }
323  }
324  }
#define MACH3LOG_ERROR
Definition: MaCh3Logger.h:37
Custom exception class used throughout MaCh3.

◆ CheckBinsHaveNoGaps()

void SampleBinningInfo::CheckBinsHaveNoGaps ( const std::vector< BinInfo > &  TestedBins,
const std::vector< double > &  MinVal,
const std::vector< double > &  MaxVal,
size_t  ValidationBinsPerDim = 100 
) const
inline

Check that non-uniform bins fully cover the bounding box (no gaps)

The idea is:

  1. Build a Cartesian test grid from all bin edges (TestGridEdges)
  2. For every N-dimensional grid cell, test its midpoint
  3. If any midpoint is not inside at least one bin, a gap exists

Definition at line 332 of file SampleStructs.h.

335  {
336  bool gap_found = false;
337  if (TestedBins.empty()) return;
338  const size_t Dim = TestedBins[0].Extent.size();
339  if (MinVal.size() != Dim || MaxVal.size() != Dim) {
340  MACH3LOG_ERROR("MinVal/MaxVal size does not match dimension of bins");
341  throw MaCh3Exception(__FILE__, __LINE__);
342  }
343 
344  // Build a fine validation grid from the provided min/max
345  std::vector<std::vector<double>> TestGridEdges(Dim);
346  for (size_t d = 0; d < Dim; ++d) {
347  TestGridEdges[d].resize(ValidationBinsPerDim + 1);
348  const double width = (MaxVal[d] - MinVal[d]) / static_cast<double>(ValidationBinsPerDim);
349  for (size_t i = 0; i <= ValidationBinsPerDim; ++i)
350  TestGridEdges[d][i] = MinVal[d] + static_cast<double>(i) * width;
351  }
352  // Precompute midpoints of each test cell
353  std::vector<size_t> indices(Dim, 0);
354 
355  std::function<void(size_t)> scan = [&](size_t d) {
356  if (gap_found) return; // stop recursion
357 
358  // Base case: we have selected a cell in every dimension
359  if (d == Dim) {
360  std::vector<double> point(Dim);
361 
362  // Compute the midpoint of the current N-D grid cell
363  for (size_t i = 0; i < Dim; ++i) {
364  const double lo = TestGridEdges[i][indices[i]];
365  const double hi = TestGridEdges[i][indices[i] + 1];
366  point[i] = 0.5 * (lo + hi);
367  }
368 
369  // Check coverage
370  for (const auto& bin : TestedBins) {
371  if (bin.IsEventInside(point)) {
372  return; // covered
373  }
374  }
375 
376  // Not covered by any bin → gap
377  MACH3LOG_WARN("Gap detected in non-uniform binning at point [{:.2f}]", fmt::join(point, ", "));
378  gap_found = true;
379  return;
380  }
381 
382  for (size_t i = 0; i + 1 < TestGridEdges[d].size(); ++i) {
383  indices[d] = i;
384  scan(d + 1);
385  }
386  };
387  // Start recursion at dimension 0
388  scan(0);
389  }
#define MACH3LOG_WARN
Definition: MaCh3Logger.h:36

◆ FindBin() [1/2]

int SampleBinningInfo::FindBin ( const double  KinVar,
const int  NomBin,
const int  N_Bins,
const std::vector< double > &  Bin_Edges,
const std::vector< BinShiftLookup > &  Bin_Lookup 
) const
inline

DB Find the relevant bin in the PDF for each event.

Parameters
KinVarThe value of the kinematic variable for the event.
NomBinThe nominal bin index where the event would fall without any shifts.
N_BinsThe total number of bins in this dimension.
Bin_EdgesVector of bin edge values (size = N_Bins + 1).
Bin_LookupVector of BinShiftLookup structs providing precomputed lower and upper edges for the nominal bin and its neighbors to efficiently handle shifted events

Definition at line 575 of file SampleStructs.h.

579  {
580  //DB Check to see if momentum shift has moved bins
581  //DB - First , check to see if the event is outside of the binning range and skip event if it is
582  if (KinVar < Bin_Edges[0] || KinVar >= Bin_Edges[N_Bins]) {
583  return M3::UnderOverFlowBin;
584  }
585  // KS: If NomBin is UnderOverFlowBin we must do binary search :(
586  if(NomBin > M3::UnderOverFlowBin) {
587  // KS: Get reference to avoid repeated indexing and help with performance
588  const BinShiftLookup& _restrict_ Bin = Bin_Lookup[NomBin];
589  const double lower = Bin.lower_binedge;
590  const double upper = Bin.upper_binedge;
591  const double lower_lower = Bin.lower_lower_binedge;
592  const double upper_upper = Bin.upper_upper_binedge;
593 
594  //DB - Second, check to see if the event is still in the nominal bin
595  if (KinVar < upper && KinVar >= lower) {
596  return NomBin;
597  }
598  //DB - Thirdly, check the adjacent bins first as Eb+CC+EScale shifts aren't likely to move an Erec more than 1bin width
599  //Shifted down one bin from the event bin at nominal
600  if (KinVar < lower && KinVar >= lower_lower) {
601  return NomBin-1;
602  }
603  //Shifted up one bin from the event bin at nominal
604  if (KinVar < upper_upper && KinVar >= upper) {
605  return NomBin+1;
606  }
607  }
608  //DB - If we end up in this loop, the event has been shifted outside of its nominal bin, but is still within the allowed binning range
609  // KS: Perform binary search to find correct bin. We already checked if isn't outside of bounds
610  return static_cast<int>(std::distance(Bin_Edges.begin(), std::upper_bound(Bin_Edges.begin(), Bin_Edges.end(), KinVar)) - 1);
611  }
#define _restrict_
KS: Using restrict limits the effects of pointer aliasing, aiding optimizations. While reading I foun...
Definition: Core.h:108
constexpr static const int UnderOverFlowBin
Mark bin which is overflow or underflow in MaCh3 binning.
Definition: Core.h:91
KS: Store bin lookups allowing to quickly find bin after migration.

◆ FindBin() [2/2]

int SampleBinningInfo::FindBin ( const int  Dimension,
const double  Var,
const int  NomBin 
) const
inline

DB Find the relevant bin in the PDF for each event.

Definition at line 563 of file SampleStructs.h.

563  {
564  return FindBin(Var, NomBin, AxisNBins[Dimension], BinEdges[Dimension], BinLookup[Dimension]);
565  }
std::vector< std::vector< double > > BinEdges
Vector to hold N-axis bin-edges.
int FindBin(const int Dimension, const double Var, const int NomBin) const
DB Find the relevant bin in the PDF for each event.
std::vector< int > AxisNBins
Number of N-axis bins in the histogram used for likelihood calculation.
std::vector< std::vector< BinShiftLookup > > BinLookup
Bin lookups for all dimensions.

◆ GetBin()

int SampleBinningInfo::GetBin ( const std::vector< int > &  BinIndices) const
inline

Convert N-dimensional bin indices to a linear bin index.

Parameters
BinIndicesVector of bin indices along each dimension

Mapping follows row-major order:

  • 1D: xBin
  • 2D: yBin * nXBins + xBin
  • 3D: zBin * nXBins * nYBins + yBin * nXBins + xBin

Definition at line 554 of file SampleStructs.h.

554  {
555  int BinNumber = 0;
556  for(size_t i = 0; i < BinIndices.size(); ++i) {
557  BinNumber += BinIndices[i]*Strides[i];
558  }
559  return BinNumber;
560  }
std::vector< int > Strides
Stride factors for converting N-dimensional bin indices to a linear index.

◆ GetBinSafe()

int SampleBinningInfo::GetBinSafe ( const std::vector< int > &  BinIndices) const
inline

Get linear bin index from ND bin indices with additional checks.

Parameters
BinIndicesVector of bin indices along each dimension
Warning
this performs additional checks so do not use in parts of code used during fit

Definition at line 536 of file SampleStructs.h.

536  {
537  for(int iDim = 0; iDim < static_cast<int>(BinIndices.size()); iDim++){
538  if (BinIndices[iDim] < 0 || BinIndices[iDim] >= AxisNBins[iDim]) {
539  MACH3LOG_ERROR("{}: Bin indices out of range: Dim = {}, Bin={}, max Ndim Bin={}",
540  __func__, iDim, BinIndices[iDim], AxisNBins[iDim]);
541  throw MaCh3Exception(__FILE__, __LINE__);
542  }
543  }
544  return GetBin(BinIndices);
545  }
int GetBin(const std::vector< int > &BinIndices) const
Convert N-dimensional bin indices to a linear bin index.

◆ InitialiseBinMigrationLookUp()

void SampleBinningInfo::InitialiseBinMigrationLookUp ( const int  Dimension)
inline

Initialise special lookup arrays allowing to more efficiently perform bin-migration These arrays store the lower and upper edges of each bin and their neighboring bins.

Definition at line 666 of file SampleStructs.h.

666  {
667  BinLookup.resize(Dimension);
668  for (int i = 0; i < Dimension; ++i) {
670  }
671 
672  InitialiseStrides(Dimension);
673  }
void InitialiseLookUpSingleDimension(std::vector< BinShiftLookup > &Bin_Lookup, const std::vector< double > &Bin_Edges, const int TotBins)
Initializes lookup arrays for efficient bin migration in a single dimension.
void InitialiseStrides(const int Dimension)
Initialise stride factors for linear bin index calculation.

◆ InitialiseGridMapping()

void SampleBinningInfo::InitialiseGridMapping ( )
inline

Initialise Non-Uniform Binning.

Definition at line 392 of file SampleStructs.h.

392  {
393  const size_t Dim = BinEdges.size();
394 
395  // Compute total number of "mega bins"
396  int NGridBins = 1;
397  for (size_t d = 0; d < Dim; ++d) {
398  NGridBins *= AxisNBins[d];
399  }
400  BinGridMapping.resize(NGridBins);
401 
402  // Helper: convert linear index to multi-dimensional index
403  std::vector<int> MultiIndex(Dim, 0);
404 
405  std::function<void(size_t, int)> scan;
406  scan = [&](size_t d, int LinearIndex) {
407  if (d == Dim) {
408  // Compute the edges of the current mega-bin
409  std::vector<std::array<double, 2>> CellEdges(Dim);
410  for (size_t i = 0; i < Dim; ++i) {
411  CellEdges[i][0] = BinEdges[i][MultiIndex[i]];
412  CellEdges[i][1] = BinEdges[i][MultiIndex[i] + 1];
413  }
414 
415  // Check overlap with all non-uniform bins
416  for (size_t iBin = 0; iBin < Bins.size(); ++iBin) {
417  auto& bin = Bins[iBin];
418  bool overlap = true;
419  for (size_t i = 0; i < Dim; ++i) {
420  const double a_lo = bin.Extent[i][0];
421  const double a_hi = bin.Extent[i][1];
422  const double b_lo = CellEdges[i][0];
423  const double b_hi = CellEdges[i][1];
424  if (!(a_hi > b_lo && a_lo < b_hi)) { // overlap condition
425  overlap = false;
426  break;
427  }
428  }
429  if (overlap) {
430  BinGridMapping[LinearIndex].push_back(static_cast<int>(iBin));
431 
432  // Debug statement: show both small bin extent AND mega-bin edges
433  std::vector<std::string> bin_extent_str(Dim);
434  std::vector<std::string> mega_edges_str(Dim);
435 
436  for (size_t i = 0; i < Dim; ++i) {
437  bin_extent_str[i] = fmt::format("[{:.3f}, {:.3f}]", bin.Extent[i][0], bin.Extent[i][1]);
438  mega_edges_str[i] = fmt::format("[{:.3f}, {:.3f}]", CellEdges[i][0], CellEdges[i][1]);
439  }
440 
441  MACH3LOG_DEBUG("MegaBin {} (multi-index [{}], edges {}) assigned Bin {} with extents {}",
442  LinearIndex, fmt::join(MultiIndex, ","), fmt::join(mega_edges_str, ", "),
443  iBin, fmt::join(bin_extent_str, ", "));
444  }
445  }
446  return;
447  }
448 
449  // Loop over all bins along this dimension
450  for (int i = 0; i < AxisNBins[d]; ++i) {
451  MultiIndex[d] = i;
452  int NewLinearIndex = LinearIndex;
453  if (d > 0) {
454  int stride = 1;
455  for (size_t s = 0; s < d; ++s) stride *= AxisNBins[s];
456  NewLinearIndex += i * stride;
457  } else {
458  NewLinearIndex = i;
459  }
460  scan(d + 1, NewLinearIndex);
461  }
462  };
463  // Start the recursive scan over all dimensions, beginning at dimension 0 with linear index 0
464  scan(0, 0);
465  }
#define MACH3LOG_DEBUG
Definition: MaCh3Logger.h:34
std::vector< BinInfo > Bins
Bins used only for non-uniform.
std::vector< std::vector< int > > BinGridMapping
This grid tells what bins are associated with with what BinEdges of Grid Binnins.

◆ InitialiseLookUpSingleDimension()

void SampleBinningInfo::InitialiseLookUpSingleDimension ( std::vector< BinShiftLookup > &  Bin_Lookup,
const std::vector< double > &  Bin_Edges,
const int  TotBins 
)
inline

Initializes lookup arrays for efficient bin migration in a single dimension.

Parameters
Bin_LookupReference to the BinShiftLookup struct to be initialized.
Bin_EdgesVector of bin edges defining the bin boundaries.
TotBinsNumber of bins in the dimension.

Definition at line 617 of file SampleStructs.h.

617  {
618  Bin_Lookup.resize(TotBins);
619  //Set rw_pdf_bin and upper_binedge and lower_binedge for each skmc_base
620  for(int bin_i = 0; bin_i < TotBins; bin_i++){
621  double low_lower_edge = M3::_DEFAULT_RETURN_VAL_;
622  double low_edge = Bin_Edges[bin_i];
623  double upper_edge = Bin_Edges[bin_i+1];
624  double upper_upper_edge = M3::_DEFAULT_RETURN_VAL_;
625 
626  if (bin_i == 0) {
627  low_lower_edge = Bin_Edges[0];
628  } else {
629  low_lower_edge = Bin_Edges[bin_i-1];
630  }
631 
632  if (bin_i + 2 < TotBins) {
633  upper_upper_edge = Bin_Edges[bin_i + 2];
634  } else if (bin_i + 1 < TotBins) {
635  upper_upper_edge = Bin_Edges[bin_i + 1];
636  }
637 
638  Bin_Lookup[bin_i].lower_binedge = low_edge;
639  Bin_Lookup[bin_i].upper_binedge = upper_edge;
640  Bin_Lookup[bin_i].lower_lower_binedge = low_lower_edge;
641  Bin_Lookup[bin_i].upper_upper_binedge = upper_upper_edge;
642  }
643  }
constexpr static const double _DEFAULT_RETURN_VAL_
Definition: Core.h:56

◆ InitialiseStrides()

void SampleBinningInfo::InitialiseStrides ( const int  Dimension)
inline

Initialise stride factors for linear bin index calculation.

Strides define how N-dimensional bin indices are converted into a single linear bin index using row-major ordering.

For example:

  • 1D: stride[0] = 1
  • 2D: stride[1] = nXBins
  • 3D: stride[2] = nXBins * nYBins

Definition at line 654 of file SampleStructs.h.

654  {
655  Strides.resize(Dimension);
656  int stride = 1;
657  for (int i = 0; i < Dimension; ++i) {
658  Strides[i] = stride;
659  // Multiply stride by the number of bins in this axis
660  stride *= AxisNBins[i];
661  }
662  }

◆ InitNonUniform()

void SampleBinningInfo::InitNonUniform ( const std::vector< std::vector< std::vector< double >>> &  InputBins)
inline

Initialise Non-Uniform Binning.

Todo:
KS: Now we create "Large Bins" automatically, in future we can expand to add more user control

prepare special histograms used for event migration

Lastly GridMap

Definition at line 468 of file SampleStructs.h.

468  {
469  Uniform = false;
470  nBins = 0;
471  Bins.resize(InputBins.size());
472 
473  size_t ExtentDim = InputBins[0].size();
474  if (ExtentDim == 1) {
475  MACH3LOG_ERROR("Trying to initialise Non-Uniform binning for single dimension, this is silly...");
476  throw MaCh3Exception(__FILE__, __LINE__);
477  }
478  for(size_t iBin = 0; iBin < InputBins.size(); iBin++) {
479  const auto& NewExtent = InputBins[iBin];
480  if (NewExtent.size() != ExtentDim) {
481  MACH3LOG_ERROR("Dimension of Bin {} is {}, while others have {}", iBin, NewExtent.size(), ExtentDim);
482  throw MaCh3Exception(__FILE__, __LINE__);
483  }
484 
485  BinInfo NewBin;
486  for (const auto& extent : NewExtent) {
487  if (extent.size() != 2) {
488  MACH3LOG_ERROR("Extent size is not 2 for Bin {}", iBin);
489  throw MaCh3Exception(__FILE__, __LINE__);
490  }
491  NewBin.Extent.push_back({extent[0], extent[1]});
492  MACH3LOG_DEBUG("Adding extent for Bin {} Dim {}: [{:.2f}, {:.2f}]",
493  iBin, NewBin.Extent.size()-1, NewBin.Extent.back()[0], NewBin.Extent.back()[1]);
494  }
495  Bins[iBin] = std::move(NewBin);
496  nBins++;
497  }
498  // Ensure we do not have weird overlaps
501  constexpr int BinsPerDimension = 10;
502  // Now we create huge map, which will allow to easily find non uniform bins
503  BinEdges.resize(ExtentDim);
504  AxisNBins.resize(ExtentDim);
505  std::vector<double> MinVal(ExtentDim), MaxVal(ExtentDim);
506  for (size_t iDim = 0; iDim < ExtentDim; iDim++) {
507  MinVal[iDim] = std::numeric_limits<double>::max();
508  MaxVal[iDim] = std::numeric_limits<double>::lowest();
509 
510  // Find min and max for this dimension
511  for (const auto& bin : Bins) {
512  MinVal[iDim] = std::min(MinVal[iDim], bin.Extent[iDim][0]);
513  MaxVal[iDim] = std::max(MaxVal[iDim], bin.Extent[iDim][1]);
514  }
515 
516  MACH3LOG_DEBUG("Mapping binning: Dim {} Min = {:.2f}, Max = {:.2f}", iDim, MinVal[iDim], MaxVal[iDim]);
517  BinEdges[iDim].resize(BinsPerDimension + 1);
518  double BinWidth = (MaxVal[iDim] - MinVal[iDim]) / static_cast<double>(BinsPerDimension);
519  for (size_t iEdge = 0; iEdge <= BinsPerDimension; iEdge++) {
520  BinEdges[iDim][iEdge] = MinVal[iDim] + static_cast<double>(iEdge) * BinWidth;
521  }
522  AxisNBins[iDim] = BinsPerDimension;
523  MACH3LOG_DEBUG("Mapping binning: Dim {} BinEdges = [{:.2f}]", iDim, fmt::join(BinEdges[iDim], ", "));
524  }
525  CheckBinsHaveNoGaps(Bins, MinVal, MaxVal, 200);
526  GlobalOffset = 0;
528  InitialiseBinMigrationLookUp(static_cast<int>(BinEdges.size()));
531  }
KS: This hold bin extents in N-Dimensions allowing to check if Bin falls into.
std::vector< std::array< double, 2 > > Extent
int GlobalOffset
If you have binning for multiple samples and trying to define 1D vector let's.
void InitialiseBinMigrationLookUp(const int Dimension)
Initialise special lookup arrays allowing to more efficiently perform bin-migration These arrays stor...
void InitialiseGridMapping()
Initialise Non-Uniform Binning.
void CheckBinsDoNotOverlap(const std::vector< BinInfo > &TestedBins) const
Check that non-uniform bin extents do not overlap.
bool Uniform
Tells whether to use inform binning grid or non-uniform.
int nBins
Number of total bins.
void CheckBinsHaveNoGaps(const std::vector< BinInfo > &TestedBins, const std::vector< double > &MinVal, const std::vector< double > &MaxVal, size_t ValidationBinsPerDim=100) const
Check that non-uniform bins fully cover the bounding box (no gaps)

◆ InitUniform()

void SampleBinningInfo::InitUniform ( const std::vector< std::vector< double >> &  InputEdges)
inline

Initialise Uniform Binning.

Lastly prepare special histograms used for event migration

Definition at line 255 of file SampleStructs.h.

255  {
256  BinEdges = InputEdges;
257  Uniform = true;
258  AxisNBins.resize(BinEdges.size());
259 
260  nBins = 1;
261  for(size_t iDim = 0; iDim < BinEdges.size(); iDim++)
262  {
263  const auto& Edges = BinEdges[iDim];
264  if (!std::is_sorted(Edges.begin(), Edges.end())) {
265  MACH3LOG_ERROR("VarBins for Dim {} must be in increasing order in sample config, VarBins: [{}]",
266  iDim, fmt::join(Edges, ", "));
267  throw MaCh3Exception(__FILE__, __LINE__);
268  }
269 
270  //Sanity check that some binning has been specified
271  if(BinEdges[iDim].size() == 0){
272  MACH3LOG_ERROR("No binning specified for Dim {} of sample binning, please add some binning to the sample config", iDim);
273  MACH3LOG_ERROR("Please ensure BinEdges are correctly configured for all dimensions");
274  throw MaCh3Exception(__FILE__, __LINE__);
275  }
276 
277  // Set the number of bins for this dimension
278  AxisNBins[iDim] = static_cast<int>(BinEdges[iDim].size()) - 1;
279  // Update total number of bins
280  nBins *= AxisNBins[iDim];
281 
282  MACH3LOG_INFO("{}-Dim Binning: [{:.2f}]", iDim, fmt::join(BinEdges[iDim], ", "));
283  }
284  GlobalOffset = 0;
286  InitialiseBinMigrationLookUp(static_cast<int>(BinEdges.size()));
287  }
#define MACH3LOG_INFO
Definition: MaCh3Logger.h:35

Member Data Documentation

◆ AxisNBins

std::vector<int> SampleBinningInfo::AxisNBins

Number of N-axis bins in the histogram used for likelihood calculation.

Definition at line 237 of file SampleStructs.h.

◆ BinEdges

std::vector<std::vector<double> > SampleBinningInfo::BinEdges

Vector to hold N-axis bin-edges.

Definition at line 235 of file SampleStructs.h.

◆ BinGridMapping

std::vector<std::vector<int> > SampleBinningInfo::BinGridMapping

This grid tells what bins are associated with with what BinEdges of Grid Binnins.

Definition at line 252 of file SampleStructs.h.

◆ BinLookup

std::vector<std::vector<BinShiftLookup> > SampleBinningInfo::BinLookup

Bin lookups for all dimensions.

Definition at line 244 of file SampleStructs.h.

◆ Bins

std::vector<BinInfo> SampleBinningInfo::Bins

Bins used only for non-uniform.

Definition at line 250 of file SampleStructs.h.

◆ GlobalOffset

int SampleBinningInfo::GlobalOffset = M3::_BAD_INT_

If you have binning for multiple samples and trying to define 1D vector let's.

Definition at line 242 of file SampleStructs.h.

◆ nBins

int SampleBinningInfo::nBins = M3::_BAD_INT_

Number of total bins.

Definition at line 240 of file SampleStructs.h.

◆ Strides

std::vector<int> SampleBinningInfo::Strides

Stride factors for converting N-dimensional bin indices to a linear index.

Definition at line 246 of file SampleStructs.h.

◆ Uniform

bool SampleBinningInfo::Uniform = true

Tells whether to use inform binning grid or non-uniform.

Definition at line 248 of file SampleStructs.h.


The documentation for this struct was generated from the following file: