File indexing completed on 2026-09-19 09:42:10
0001 #ifndef YODA_BINESTIMATORS_H
0002 #define YODA_BINESTIMATORS_H
0003
0004 #include "YODA/Utils/fastlog.h"
0005 #include "YODA/Utils/MathUtils.h"
0006 #include <cstdlib>
0007
0008 namespace YODA {
0009
0010
0011
0012
0013
0014
0015 struct BinEstimator {
0016
0017
0018 virtual ~BinEstimator() {}
0019
0020
0021 size_t estindex(double x) const {
0022 if (_N == 0) return 0;
0023 const int i = _est(x);
0024 if (i < 0) return 0;
0025 const size_t i2 = (size_t) i;
0026 if (i2 >= _N) return _N+1;
0027 return i2 + 1;
0028 }
0029
0030
0031 size_t operator() (double x) const {
0032 return estindex(x);
0033 }
0034
0035 protected:
0036
0037
0038
0039 virtual int _est(double x) const = 0;
0040
0041
0042 size_t _N;
0043 };
0044
0045
0046
0047
0048
0049
0050 struct LinBinEstimator : public BinEstimator {
0051
0052
0053 LinBinEstimator(size_t nbins, double xlow, double xhigh) {
0054 _N = nbins;
0055 _c = xlow;
0056 _m = (double) nbins / (xhigh - xlow);
0057 }
0058
0059
0060 LinBinEstimator(const LinBinEstimator& other) {
0061 _N = other._N;
0062 _c = other._c;
0063 _m = other._m;
0064 }
0065
0066
0067 int _est(double x) const {
0068 int res = (int) floor(_m * (x - _c));
0069 return res;
0070 }
0071
0072 protected:
0073 double _c, _m;
0074 };
0075
0076
0077
0078
0079
0080
0081
0082
0083 class LogBinEstimator : public BinEstimator {
0084 public:
0085
0086
0087 LogBinEstimator(size_t nbins, double xlow, double xhigh) {
0088 _N = nbins;
0089 _c = Utils::fastlog2(xlow);
0090 _m = nbins / (Utils::fastlog2(xhigh) - _c);
0091 }
0092
0093
0094 int _est(double x) const {
0095 if (x <= 0.) return -1;
0096 int res = (int) floor(_m * (Utils::fastlog2(x) - _c));
0097 return res;
0098
0099 }
0100
0101 protected:
0102 double _c, _m;
0103 };
0104
0105
0106 }
0107
0108 #endif