MaCh3  2.5.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
 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 251 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 311 of file SampleStructs.h.

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

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

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

584  {
585  return FindBin(Var, NomBin, AxisNBins[Dimension], BinEdges[Dimension], BinLookup[Dimension]);
586  }
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 575 of file SampleStructs.h.

575  {
576  int BinNumber = 0;
577  for(size_t i = 0; i < BinIndices.size(); ++i) {
578  BinNumber += BinIndices[i]*Strides[i];
579  }
580  return BinNumber;
581  }
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 557 of file SampleStructs.h.

557  {
558  for(int iDim = 0; iDim < static_cast<int>(BinIndices.size()); iDim++){
559  if (BinIndices[iDim] < 0 || BinIndices[iDim] >= AxisNBins[iDim]) {
560  MACH3LOG_ERROR("{}: Bin indices out of range: Dim = {}, Bin={}, max Ndim Bin={}",
561  __func__, iDim, BinIndices[iDim], AxisNBins[iDim]);
562  throw MaCh3Exception(__FILE__, __LINE__);
563  }
564  }
565  return GetBin(BinIndices);
566  }
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 687 of file SampleStructs.h.

687  {
688  BinLookup.resize(Dimension);
689  for (int i = 0; i < Dimension; ++i) {
691  }
692 
693  InitialiseStrides(Dimension);
694  }
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 413 of file SampleStructs.h.

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

638  {
639  Bin_Lookup.resize(TotBins);
640  //Set rw_pdf_bin and upper_binedge and lower_binedge for each skmc_base
641  for(int bin_i = 0; bin_i < TotBins; bin_i++){
642  double low_lower_edge = M3::_DEFAULT_RETURN_VAL_;
643  double low_edge = Bin_Edges[bin_i];
644  double upper_edge = Bin_Edges[bin_i+1];
645  double upper_upper_edge = M3::_DEFAULT_RETURN_VAL_;
646 
647  if (bin_i == 0) {
648  low_lower_edge = Bin_Edges[0];
649  } else {
650  low_lower_edge = Bin_Edges[bin_i-1];
651  }
652 
653  if (bin_i + 2 < TotBins) {
654  upper_upper_edge = Bin_Edges[bin_i + 2];
655  } else if (bin_i + 1 < TotBins) {
656  upper_upper_edge = Bin_Edges[bin_i + 1];
657  }
658 
659  Bin_Lookup[bin_i].lower_binedge = low_edge;
660  Bin_Lookup[bin_i].upper_binedge = upper_edge;
661  Bin_Lookup[bin_i].lower_lower_binedge = low_lower_edge;
662  Bin_Lookup[bin_i].upper_upper_binedge = upper_upper_edge;
663  }
664  }
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 675 of file SampleStructs.h.

675  {
676  Strides.resize(Dimension);
677  int stride = 1;
678  for (int i = 0; i < Dimension; ++i) {
679  Strides[i] = stride;
680  // Multiply stride by the number of bins in this axis
681  stride *= AxisNBins[i];
682  }
683  }

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

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

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

◆ BinEdges

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

Vector to hold N-axis bin-edges.

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

◆ BinLookup

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

Bin lookups for all dimensions.

Definition at line 263 of file SampleStructs.h.

◆ Bins

std::vector<BinInfo> SampleBinningInfo::Bins

Bins used only for non-uniform.

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

◆ nBins

int SampleBinningInfo::nBins = M3::_BAD_INT_

Number of total bins.

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

◆ Uniform

bool SampleBinningInfo::Uniform = true

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

Definition at line 267 of file SampleStructs.h.


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