MaCh3  2.8.0
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 _noexcept_
 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 _noexcept_
 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< BinInfo > Bins
 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 Binnings. 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 241 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 301 of file SampleStructs.h.

301  {
302  if (TestedBins.empty()) return;
303 
304  const size_t ExtentDim = TestedBins[0].Extent.size();
305 
306  for (size_t i = 0; i < TestedBins.size(); ++i) {
307  for (size_t j = i + 1; j < TestedBins.size(); ++j) {
308  bool OverlapsInAllDims = true;
309 
310  for (size_t iDim = 0; iDim < ExtentDim; ++iDim) {
311  const double a_lo = TestedBins[i].Extent[iDim][0];
312  const double a_hi = TestedBins[i].Extent[iDim][1];
313  const double b_lo = TestedBins[j].Extent[iDim][0];
314  const double b_hi = TestedBins[j].Extent[iDim][1];
315 
316  // [low, high) overlap check
317  if (!(a_lo < b_hi && b_lo < a_hi)) {
318  OverlapsInAllDims = false;
319  break;
320  }
321  }
322 
323  if (OverlapsInAllDims) {
324  MACH3LOG_ERROR("Overlapping non-uniform bins detected: Bin {} and Bin {}", i, j);
325  for (size_t iDim = 0; iDim < ExtentDim; ++iDim) {
326  MACH3LOG_ERROR(" Dim {}: Bin {} [{}, {}), Bin {} [{}, {})",
327  iDim,
328  i, TestedBins[i].Extent[iDim][0], TestedBins[i].Extent[iDim][1],
329  j, TestedBins[j].Extent[iDim][0], TestedBins[j].Extent[iDim][1]);
330  }
331  throw MaCh3Exception(__FILE__, __LINE__);
332  }
333  }
334  }
335  }
#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 343 of file SampleStructs.h.

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

590  {
591  //DB Check to see if momentum shift has moved bins
592  //DB - First , check to see if the event is outside of the binning range and skip event if it is
593  if (KinVar < Bin_Edges[0] || KinVar >= Bin_Edges[N_Bins]) {
594  return M3::UnderOverFlowBin;
595  }
596  // KS: If NomBin is UnderOverFlowBin we must do binary search :(
597  if(NomBin > M3::UnderOverFlowBin) {
598  // KS: Get reference to avoid repeated indexing and help with performance
599  const BinShiftLookup& _restrict_ Bin = Bin_Lookup[NomBin];
600  const double lower = Bin.lower_binedge;
601  const double upper = Bin.upper_binedge;
602  const double lower_lower = Bin.lower_lower_binedge;
603  const double upper_upper = Bin.upper_upper_binedge;
604 
605  //DB - Second, check to see if the event is still in the nominal bin
606  if (KinVar < upper && KinVar >= lower) {
607  return NomBin;
608  }
609  //DB - Thirdly, check the adjacent bins first as Eb+CC+EScale shifts aren't likely to move an Erec more than 1bin width
610  //Shifted down one bin from the event bin at nominal
611  if (KinVar < lower && KinVar >= lower_lower) {
612  return NomBin-1;
613  }
614  //Shifted up one bin from the event bin at nominal
615  if (KinVar < upper_upper && KinVar >= upper) {
616  return NomBin+1;
617  }
618  }
619  //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
620  // KS: Perform binary search to find correct bin. We already checked if isn't outside of bounds
621  return static_cast<int>(std::distance(Bin_Edges.begin(), std::upper_bound(Bin_Edges.begin(), Bin_Edges.end(), KinVar)) - 1);
622  }
#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 574 of file SampleStructs.h.

574  {
575  return FindBin(Var, NomBin, AxisNBins[Dimension], BinEdges[Dimension], BinLookup[Dimension]);
576  }
int FindBin(const int Dimension, const double Var, const int NomBin) const _noexcept_
DB Find the relevant bin in the PDF for each event.
std::vector< std::vector< double > > BinEdges
Vector to hold N-axis bin-edges.
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 565 of file SampleStructs.h.

565  {
566  int BinNumber = 0;
567  for(size_t i = 0; i < BinIndices.size(); ++i) {
568  BinNumber += BinIndices[i]*Strides[i];
569  }
570  return BinNumber;
571  }
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 547 of file SampleStructs.h.

547  {
548  for(int iDim = 0; iDim < static_cast<int>(BinIndices.size()); iDim++){
549  if (BinIndices[iDim] < 0 || BinIndices[iDim] >= AxisNBins[iDim]) {
550  MACH3LOG_ERROR("{}: Bin indices out of range: Dim = {}, Bin={}, max Ndim Bin={}",
551  __func__, iDim, BinIndices[iDim], AxisNBins[iDim]);
552  throw MaCh3Exception(__FILE__, __LINE__);
553  }
554  }
555  return GetBin(BinIndices);
556  }
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 677 of file SampleStructs.h.

677  {
678  BinLookup.resize(Dimension);
679  for (int i = 0; i < Dimension; ++i) {
681  }
682 
683  InitialiseStrides(Dimension);
684  }
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 403 of file SampleStructs.h.

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

◆ 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 628 of file SampleStructs.h.

628  {
629  Bin_Lookup.resize(TotBins);
630  //Set rw_pdf_bin and upper_binedge and lower_binedge for each skmc_base
631  for(int bin_i = 0; bin_i < TotBins; bin_i++){
632  double low_lower_edge = M3::_DEFAULT_RETURN_VAL_;
633  double low_edge = Bin_Edges[bin_i];
634  double upper_edge = Bin_Edges[bin_i+1];
635  double upper_upper_edge = M3::_DEFAULT_RETURN_VAL_;
636 
637  if (bin_i == 0) {
638  low_lower_edge = Bin_Edges[0];
639  } else {
640  low_lower_edge = Bin_Edges[bin_i-1];
641  }
642 
643  if (bin_i + 2 < TotBins) {
644  upper_upper_edge = Bin_Edges[bin_i + 2];
645  } else if (bin_i + 1 < TotBins) {
646  upper_upper_edge = Bin_Edges[bin_i + 1];
647  }
648 
649  Bin_Lookup[bin_i].lower_binedge = low_edge;
650  Bin_Lookup[bin_i].upper_binedge = upper_edge;
651  Bin_Lookup[bin_i].lower_lower_binedge = low_lower_edge;
652  Bin_Lookup[bin_i].upper_upper_binedge = upper_upper_edge;
653  }
654  }
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 665 of file SampleStructs.h.

665  {
666  Strides.resize(Dimension);
667  int stride = 1;
668  for (int i = 0; i < Dimension; ++i) {
669  Strides[i] = stride;
670  // Multiply stride by the number of bins in this axis
671  stride *= AxisNBins[i];
672  }
673  }

◆ 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 479 of file SampleStructs.h.

479  {
480  Uniform = false;
481  nBins = 0;
482  Bins.resize(InputBins.size());
483 
484  size_t ExtentDim = InputBins[0].size();
485  if (ExtentDim == 1) {
486  MACH3LOG_ERROR("Trying to initialise Non-Uniform binning for single dimension, this is silly...");
487  throw MaCh3Exception(__FILE__, __LINE__);
488  }
489  for(size_t iBin = 0; iBin < InputBins.size(); iBin++) {
490  const auto& NewExtent = InputBins[iBin];
491  if (NewExtent.size() != ExtentDim) {
492  MACH3LOG_ERROR("Dimension of Bin {} is {}, while others have {}", iBin, NewExtent.size(), ExtentDim);
493  throw MaCh3Exception(__FILE__, __LINE__);
494  }
495 
496  BinInfo NewBin;
497  for (const auto& extent : NewExtent) {
498  if (extent.size() != 2) {
499  MACH3LOG_ERROR("Extent size is not 2 for Bin {}", iBin);
500  throw MaCh3Exception(__FILE__, __LINE__);
501  }
502  NewBin.Extent.push_back({extent[0], extent[1]});
503  MACH3LOG_DEBUG("Adding extent for Bin {} Dim {}: [{:.2f}, {:.2f}]",
504  iBin, NewBin.Extent.size()-1, NewBin.Extent.back()[0], NewBin.Extent.back()[1]);
505  }
506  Bins[iBin] = std::move(NewBin);
507  nBins++;
508  }
509  // Ensure we do not have weird overlaps
512  constexpr int BinsPerDimension = 10;
513  // Now we create huge map, which will allow to easily find non uniform bins
514  BinEdges.resize(ExtentDim);
515  AxisNBins.resize(ExtentDim);
516  std::vector<double> MinVal(ExtentDim), MaxVal(ExtentDim);
517  for (size_t iDim = 0; iDim < ExtentDim; iDim++) {
518  MinVal[iDim] = std::numeric_limits<double>::max();
519  MaxVal[iDim] = std::numeric_limits<double>::lowest();
520 
521  // Find min and max for this dimension
522  for (const auto& bin : Bins) {
523  MinVal[iDim] = std::min(MinVal[iDim], bin.Extent[iDim][0]);
524  MaxVal[iDim] = std::max(MaxVal[iDim], bin.Extent[iDim][1]);
525  }
526 
527  MACH3LOG_DEBUG("Mapping binning: Dim {} Min = {:.2f}, Max = {:.2f}", iDim, MinVal[iDim], MaxVal[iDim]);
528  BinEdges[iDim].resize(BinsPerDimension + 1);
529  double BinWidth = (MaxVal[iDim] - MinVal[iDim]) / static_cast<double>(BinsPerDimension);
530  for (size_t iEdge = 0; iEdge <= BinsPerDimension; iEdge++) {
531  BinEdges[iDim][iEdge] = MinVal[iDim] + static_cast<double>(iEdge) * BinWidth;
532  }
533  AxisNBins[iDim] = BinsPerDimension;
534  MACH3LOG_DEBUG("Mapping binning: Dim {} BinEdges = [{:.2f}]", iDim, fmt::join(BinEdges[iDim], ", "));
535  }
536  CheckBinsHaveNoGaps(Bins, MinVal, MaxVal, 200);
537  GlobalOffset = 0;
539  InitialiseBinMigrationLookUp(static_cast<int>(BinEdges.size()));
542  }
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.

The outer vector loops over dimensions and the inner vector specifies

Lastly prepare special histograms used for event migration

Definition at line 266 of file SampleStructs.h.

266  {
267  BinEdges = InputEdges;
268  Uniform = true;
269  AxisNBins.resize(BinEdges.size());
270 
271  nBins = 1;
272  for(size_t iDim = 0; iDim < BinEdges.size(); iDim++)
273  {
274  const auto& Edges = BinEdges[iDim];
275  if (!std::is_sorted(Edges.begin(), Edges.end())) {
276  MACH3LOG_ERROR("Bin edges for Dim {} must be in increasing order in sample config. Bin edges passed: [{}]",
277  iDim, fmt::join(Edges, ", "));
278  throw MaCh3Exception(__FILE__, __LINE__);
279  }
280 
281  //Sanity check that some binning has been specified
282  if(BinEdges[iDim].size() == 0){
283  MACH3LOG_ERROR("No binning specified for Dim {} of sample binning, please add some binning to the sample config", iDim);
284  MACH3LOG_ERROR("Please ensure BinEdges are correctly configured for all dimensions");
285  throw MaCh3Exception(__FILE__, __LINE__);
286  }
287 
288  // Set the number of bins for this dimension
289  AxisNBins[iDim] = static_cast<int>(BinEdges[iDim].size()) - 1;
290  // Update total number of bins
291  nBins *= AxisNBins[iDim];
292 
293  MACH3LOG_INFO("{}-Dim Binning: [{:.2f}]", iDim, fmt::join(BinEdges[iDim], ", "));
294  }
295  GlobalOffset = 0;
297  InitialiseBinMigrationLookUp(static_cast<int>(BinEdges.size()));
298  }
#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 246 of file SampleStructs.h.

◆ BinEdges

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

Vector to hold N-axis bin-edges.

Definition at line 244 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 Binnings.

Definition at line 261 of file SampleStructs.h.

◆ BinLookup

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

Bin lookups for all dimensions.

Definition at line 253 of file SampleStructs.h.

◆ Bins

std::vector<BinInfo> SampleBinningInfo::Bins

Bins used only for non-uniform.

Definition at line 259 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 251 of file SampleStructs.h.

◆ nBins

int SampleBinningInfo::nBins = M3::_BAD_INT_

Number of total bins.

Definition at line 249 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 255 of file SampleStructs.h.

◆ Uniform

bool SampleBinningInfo::Uniform = true

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

Definition at line 257 of file SampleStructs.h.


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