1 #ifndef _utl_Histogram_h_
2 #define _utl_Histogram_h_
4 #include <utl/ErrorLogger.h>
5 #include <utl/AugerException.h>
7 #include <boost/type_traits.hpp>
27 typedef typename boost::add_reference<const_type>::type
type;
37 EqualBinning(
const size_t nBins,
const double start,
const double stop)
71 template<
typename T = double,
72 template<
typename>
class ContainerPolicy = boost::add_const>
105 GetBinIndexUnchecked(
const double x)
148 template<
typename T = double,
150 template<
typename>
class ContainerPolicy =
identity>
167 : BinningPolicy(nBins, start, stop),
173 : BinningPolicy(dataBins.size(), start, stop),
179 : BinningPolicy(binEdges),
185 : BinningPolicy(binEdges),
188 if (binEdges.size()-1 != dataBins.size()) {
189 std::ostringstream err;
190 err <<
"Initializing Histogram with number of bin edges "
191 << binEdges.size() <<
" but number of bins "
192 << dataBins.size() <<
'!';
199 GetBinIndex(
const double x)
202 if (BinningPolicy::IsUnderflow(x))
204 else if (BinningPolicy::IsOverflow(x))
207 return BinningPolicy::GetBinIndexUnchecked(x);
225 {
return double(
GetBin(i)) / BinningPolicy::GetBinSize(i); }
228 {
return BinningPolicy::GetBinLowerEdge(bin) +
229 0.5*BinningPolicy::GetBinSize(bin); }
245 const size_t n = BinningPolicy::GetNBins();
246 for (
size_t i = 1; i <
n; ++i)
270 for (
size_t bin = 0; bin < BinningPolicy::GetNBins(); ++bin) {
274 clnc -=
c * std::log(
c);
277 return (n > 0) ? clnc / n + std::log(n) : 0;
284 const auto n = BinningPolicy::GetNBins();
286 density.reserve(n + 1);
288 for (
size_t i = 1; i < n - 2; ++i) {
292 density.push_back((1/3.)*(value1 + value2 + value3));
294 density.push_back(0);
295 density.push_back(0);
300 GetDensityErrorVector()
303 const auto n = BinningPolicy::GetNBins();
305 densityError.reserve(n + 1);
307 for (
size_t i = 1; i < n - 2; ++i) {
308 const double value1 =
GetBinAverage(i - 1) / BinningPolicy::GetBinSize(i - 1);
309 const double value2 =
GetBinAverage(i) / BinningPolicy::GetBinSize(i);
310 const double value3 =
GetBinAverage(i + 1) / BinningPolicy::GetBinSize(i + 1);
311 densityError.push_back((1/3.)*
sqrt(value1 + value2 + value3));
313 densityError.push_back(0);
314 densityError.push_back(0);
322 if (BinningPolicy::IsUnderflow(x))
324 if (BinningPolicy::IsOverflow(x))
326 return fBinContainer[BinningPolicy::GetBinIndexUnchecked(x)];
338 template<
typename BinEdgesT,
typename BinT =
double>
341 VariableBinning<BinEdgesT, boost::add_const>,
351 const std::vector<BinT>&
data)
359 template<
typename BinEdgesT,
typename BinT =
double>
362 VariableBinning<BinEdgesT, add_const_reference>,
372 const std::vector<BinT>&
data)
380 template<
typename BinT>
384 add_const_reference> {
388 const std::vector<BinT>&
data)
395 template<
typename BinEdgesT,
typename BinT>
398 VariableBinning<BinEdgesT, add_const_reference>,
399 add_const_reference> {
402 const std::vector<BinT>&
data)
void SetBin(const size_t i, const BinType value)
const BinLowerEdgesType fBinLowerEdges
ContainerPolicy< std::vector< T > >::type BinContainerType
boost::add_reference< BinLowerEdgesType >::type BinLowerEdgesRefType
VariableBinning(ConstBinLowerEdgesRefType edges)
bool IsOverflow(const double x) const
VariableBinHistogram(const std::vector< BinEdgesT > &edges, const std::vector< BinT > &data)
bool IsUnderflow(const double x) const
size_t GetBinIndexUnchecked(const double x) const
double GetBinSize(const size_t) const
const double & ConstBinLowerEdgesRefType
bool IsUnderflow(const double x) const
Histogram(const size_t nBins, const BinEdgeType start, const BinEdgeType stop)
bool IsOverflow(const double x) const
equal binning policy for Histogram
Histogram(ConstBinLowerEdgesRefType binEdges)
BinContainerType fBinContainer
BinLowerEdgesRefType GetBinLowerEdges()
BinningPolicy::BinEdgeType BinEdgeType
std::vector< double > density
double GetBinAverage(const size_t i) const
add_const_reference< BinLowerEdgesType >::type ConstBinLowerEdgesRefType
boost::add_reference< const_type >::type type
void Fill(const double x)
Exception for reporting variable out of valid range.
EqualBinning(const size_t nBins, const double start, const double stop)
const BinType & GetBin(const size_t i) const
SharedBinHistogram(const std::vector< BinEdgesT > &edges, const std::vector< BinT > &data)
Histogram(ConstBinLowerEdgesRefType binEdges, ConstBinContainerRefType dataBins)
BinEdgeType GetBinUpperEdge(const size_t bin) const
BinType & GetDataBin(const double x)
double GetBinUpperEdge(const size_t bin) const
VariableBinHistogramWrap(const std::vector< BinEdgesT > &edges, const std::vector< BinT > &data)
BinEdgeType GetBinSize(const size_t bin) const
policy for the variable bin boundaries in Histogram
const BinType & GetUnderflow() const
boost::add_const< T >::type const_type
ConstBinContainerRefType GetBins() const
ConstBinLowerEdgesRefType GetBinLowerEdges() const
std::vector< double > densityError
void Fill(const double x, const BinType weight)
double GetBinLowerEdge(const size_t bin) const
BinEdgeType GetStart() const
add_const_reference< BinContainerType >::type ConstBinContainerRefType
Histogram(const BinEdgeType start, const BinEdgeType stop, ConstBinContainerRefType dataBins)
VariableBinHistogram(const std::vector< BinEdgesT > &edges)
BinEdgeType GetStop() const
BinningPolicy::ConstBinLowerEdgesRefType ConstBinLowerEdgesRefType
boost::add_reference< BinContainerType >::type BinContainerRefType
const BinType & GetOverflow() const
BinEdgeType GetBinLowerEdge(const size_t bin) const
#define ERROR(message)
Macro for logging error messages.
ContainerPolicy< std::vector< BinEdgeType > >::type BinLowerEdgesType
double GetBinCenter(const size_t bin) const
SharedBinHistogram(const std::vector< BinEdgesT > &edges)
HistogramWrap(const EqualBinning::BinEdgeType start, const EqualBinning::BinEdgeType stop, const std::vector< BinT > &data)