16 Equidistant(
const double start,
const double stop,
const unsigned int nBins) :
20 fStep((stop-start)/nBins),
30 {
return (0 <= i && i <
int(
fNBins)) ?
fStep : std::numeric_limits<double>::infinity(); }
43 return -std::numeric_limits<double>::infinity();
45 return std::numeric_limits<double>::infinity();
57 template<
typename DataType>
61 const std::function<
double(
const DataType&)>&
norm) :
71 const std::function<double(const DataType&)>
fNorm;
75 template<
class BinType,
class DiscretizationType>
76 class Bin :
public DiscretizationType {
78 Bin(
const DiscretizationType& dis,
const BinType& init = BinType()) :
79 DiscretizationType(dis),
80 fBins(dis.GetNBins(), init),
89 template<
class DataType>
90 BinType&
operator()(
const DataType& x) {
return (*
this)[this->GetBinIndex(x)]; }
92 template<
class DataType>
93 const BinType&
operator()(
const DataType& x)
const {
return (*
this)[this->GetBinIndex(x)]; }
100 if (i >=
int(
fBins.size()))
111 if (i >=
fBins.size())
118 template<
class DataType>
119 void Apply(
const DataType& x) { (*this)(x)(x); }
121 template<
class DataType,
class Indexer>
122 void Apply(
const DataType& x, Indexer indexer) { (*this)(indexer(x))(x); }
124 template<
typename DataType>
126 Apply(
const std::vector<DataType>& vec)
128 for (
const DataType& x : vec)
132 template<
typename DataType,
class Indexer>
134 Apply(
const std::vector<DataType>& vec, Indexer indexer)
136 for (
const DataType& x : vec)
140 template<
typename DataType,
class Indexer,
class Unpack>
142 Apply(
const std::vector<DataType>& vec, Indexer indexer, Unpack unpack)
144 for (
const DataType& x : vec)
145 Apply(unpack(x), indexer);
162 BinType&
At(
const int i) {
return fBins.at(i); }
163 const BinType&
At(
const int i)
const {
return fBins.at(i); }
166 const BinType&
At(
const int i)
const {
return fBins[i]; }
constexpr double Interpolate(const double dx, const double dy, const double x)
const BinType & operator()(const DataType &x) const
const BinType & GetUnderflow() const
EquidistantInNorm(const double start, const double stop, const unsigned int nBins, const std::function< double(const DataType &)> &norm)
void Apply(const DataType &x)
double GetBinWidth(const int i) const
const BinType & operator[](const int i) const
bool IsRegularIndex(const int i) const
std::vector< BinType > fBins
BinType & operator()(const DataType &x)
const BinType & At(const int i) const
Equidistant(const double start, const double stop, const unsigned int nBins)
Bin(const DiscretizationType &dis, const BinType &init=BinType())
BinType & operator[](const int i)
int GetUnnormalizedBinIndex(const double x) const
void Apply(const std::vector< DataType > &vec, Indexer indexer, Unpack unpack)
unsigned int GetNBins() const
int GetBinIndex(const double x) const
const std::function< double(const DataType &)> fNorm
void Apply(const DataType &x, Indexer indexer)
void Apply(const std::vector< DataType > &vec)
double GetBinLowerEdge(const int i) const
double GetBinCenter(const int i) const
double GetBinUpperEdge(const int i) const
std::vector< BinType > & GetAllBins()
void Apply(const std::vector< DataType > &vec, Indexer indexer)
const std::vector< BinType > & GetAllBins() const
BinType & At(const int i)
const BinType & GetOverflow() const
int GetBinIndex(const DataType &x) const