17 SingleSample.
VarStr = Get<std::vector<std::string>>(Settings[
"VarStr"], __FILE__ , __LINE__);
21 bool Uniform = Get<bool>(Settings[
"Uniform"], __FILE__ , __LINE__);
22 if(Uniform ==
false) {
23 auto Bins = Get<std::vector<std::vector<std::vector<double>>>>(Settings[
"Bins"], __FILE__, __LINE__);
26 auto Bin_Edges = Get<std::vector<std::vector<double>>>(Settings[
"VarBins"], __FILE__ , __LINE__);
30 MACH3LOG_ERROR(
"Number of variables ({}) does not match number of bin edge sets ({}) in sample config '{}'",
43 const std::vector<const double*>& KinVar,
44 const std::vector<int>& NomBin)
const {
47 const int Dim =
static_cast<int>(KinVar.size());
51 for(
int i = 0; i < Dim; ++i) {
52 const double Var = *KinVar[i];
53 const int Bin = Binning.FindBin(i, Var, NomBin[i]);
57 GlobalBin += Bin * Binning.Strides[i];
61 GlobalBin +=
static_cast<int>(Binning.GlobalOffset);
64 const auto&
_restrict_ BinMapping = Binning.BinGridMapping[GlobalBin];
65 const size_t nNonUniBins = BinMapping.size();
66 for(
size_t iBin = 0; iBin < nNonUniBins; iBin++) {
67 const int BinNumber = BinMapping[iBin];
68 const auto&
_restrict_ NonUniBin = Binning.Bins[BinNumber];
69 if(NonUniBin.IsEventInside(KinVar)){
70 return BinNumber + Binning.GlobalOffset;
73 MACH3LOG_DEBUG(
"Didn't find any bin so returning UnderOverFlowBin");
81 const double Var)
const {
85 const auto& edges = info.
BinEdges[iDim];
88 if (Var < edges.front() || Var >= edges.back()) {
91 return static_cast<int>(std::distance(edges.begin(), std::upper_bound(edges.begin(), edges.end(), Var)) - 1);
120 return static_cast<int>(
SampleBinning[Sample+1].GlobalOffset);
133 int GlobalOffsetCounter = 0;
134 for(
size_t iSample = 0; iSample <
SampleBinning.size(); iSample++){
147 if(!Binning.Uniform) {
148 MACH3LOG_ERROR(
"When using Non-Uniform binning for sample {} please use One bin instead of Axis bins", iSample);
161 if (SampleBin < 0 || SampleBin >=
static_cast<int>(Binning.nBins)) {
162 MACH3LOG_ERROR(
"Requested bin {} is out of range for sample {}", SampleBin, iSample);
167 if(Binning.Uniform) {
168 int Dim =
static_cast<int>(Binning.Strides.size());
169 std::vector<int> Bins(Dim, 0);
170 int Remaining = SampleBin;
183 for (
int i = 0; i < Dim; ++i) {
184 const int nBinsDim =
static_cast<int>(Binning.BinEdges[i].size()) - 1;
185 Bins[i] = Remaining % nBinsDim;
186 Remaining /= nBinsDim;
189 for (
int i = 0; i < Dim; ++i) {
190 if (i > 0) BinName +=
", ";
191 const double min = Binning.BinEdges[i].at(Bins[i]);
192 const double max = Binning.BinEdges[i].at(Bins[i] + 1);
193 BinName += fmt::format(
"Dim{} ({:g}, {:g})", i, min, max);
196 const BinInfo& bin = Binning.Bins[SampleBin];
197 const int Dim =
static_cast<int>(bin.
Extent.size());
199 for (
int i = 0; i < Dim; ++i) {
200 if (i > 0) BinName +=
", ";
201 const double min = bin.
Extent[i][0];
202 const double max = bin.
Extent[i][1];
203 BinName += fmt::format(
"Dim{} ({:g}, {:g})", i, min, max);
221 if(!Binning.Uniform) {
222 MACH3LOG_ERROR(
"When using Non-Uniform binning for sample {} please use global bin instead of {}", iSample, __func__);
225 return static_cast<int>(Binning.AxisNBins.at(iDim));
233 return Binning.Uniform;
240 if(!Binning.Uniform) {
243 MACH3LOG_ERROR(
"{} for sample {} will not work becasue binnin is unfiorm", __func__, iSample);
#define _restrict_
KS: Using restrict limits the effects of pointer aliasing, aiding optimizations. While reading I foun...
int GetSampleFromGlobalBin(const std::vector< SampleBinningInfo > &BinningInfo, const int GlobalBin)
Get the sample index corresponding to a global bin number.
int GetLocalBinFromGlobalBin(const std::vector< SampleBinningInfo > &BinningInfo, const int GlobalBin)
Get the local (sample) bin index from a global bin number.
const std::vector< BinInfo > GetNonUniformBins(const int iSample) const
Return NonUnifomr bins to for example check extent etc.
void SetGlobalBinNumbers()
Sets the GlobalOffset for each SampleBinningInfo to enable linearization of multiple 2D binning sampl...
int GetSampleStartBin(const int iSample) const
Get bin number corresponding to where given sample starts.
BinningHandler()
Constructor.
std::vector< SampleBinningInfo > SampleBinning
Binning info for individual sample.
int FindGlobalBin(const int iSample, const std::vector< const double * > &KinVar, const std::vector< int > &NomBin) const
Find Global bin including.
void SetupSampleBinning(const YAML::Node &Settings, SampleInfo &SingleSample)
Function to setup the binning of your sample histograms and the underlying arrays that get handled in...
int GetBinSafe(const int iSample, const std::vector< int > &Bins) const
Get gloabl bin based on sample, and dimension of each sample without any safety checks.
int GetNBins() const
Get total number of bins over all samples/kinematic bins etc.
std::string GetBinName(const int GlobalBin) const
Get fancy name for a given bin, to help match it with global properties.
int FindNominalBin(const int iSample, const int iDim, const double Var) const
Find the nominal bin for a given variable in a given sample and dimension.
int GetGlobalBinSafe(const int iSample, const std::vector< int > &Bins) const
Get gloabl bin based on sample, and dimension of each sample with additional checks.
bool IsUniform(const int iSample) const
Tells whether given sample is using unform binning.
int GetSampleEndBin(const int iSample) const
Get bin number corresponding to where given sample ends.
int TotalNumberOfBins
Total number of bins.
int GetNAxisBins(const int iSample, const int iDim) const
Get Number of N-axis bins for a given sample.
Custom exception class used throughout MaCh3.
constexpr static const int UnderOverFlowBin
Mark bin which is overflow or underflow in MaCh3 binning.
KS: This hold bin extents in N-Dimensions allowing to check if Bin falls into.
std::vector< std::array< double, 2 > > Extent
KS: Struct storing all information required for sample binning.
void InitUniform(const std::vector< std::vector< double >> &InputEdges)
Initialise Uniform Binning.
void InitNonUniform(const std::vector< std::vector< std::vector< double >>> &InputBins)
Initialise Non-Uniform Binning.
std::vector< std::vector< double > > BinEdges
Vector to hold N-axis bin-edges.
KS: Store info about MC sample.
int nDimensions
Keep track of the dimensions of the sample binning.
std::vector< std::string > VarStr
the strings associated with the variables used for the binning e.g. "RecoNeutrinoEnergy"
std::string SampleTitle
the name of this sample e.g."muon-like"