File indexing completed on 2025-04-19 09:09:48
0001 #ifndef AMISIC_Tools_Lookup_Tables_H
0002 #define AMISIC_Tools_Lookup_Tables_H
0003
0004 #include <cstddef>
0005 #include <vector>
0006
0007 namespace AMISIC {
0008 struct axis_mode {
0009 enum code {
0010 linear = 1,
0011 log = 2
0012 };
0013 };
0014
0015 class axis {
0016 public:
0017 size_t m_nbins;
0018 double m_xmin, m_xmax, m_xstep;
0019 axis_mode::code m_mode;
0020 axis(const size_t & nbins,const double & xmin,const double & xmax,
0021 const axis_mode::code & mode=axis_mode::linear);
0022 axis(const axis & old)
0023 : axis(old.m_nbins, old.m_xmin, old.m_xmax, old.m_mode) {}
0024 ~axis() = default;
0025 double x(const size_t & bin) const;
0026 size_t bin(const double & x) const;
0027 };
0028
0029 class OneDim_Table {
0030 private:
0031 axis m_x;
0032 std::vector<double> m_values;
0033 public:
0034 explicit OneDim_Table(const axis & xbins);
0035 void Fill(const size_t & xbin,const double & value);
0036 double operator()(const double & x) const;
0037 inline double Value(const size_t & xbin) const { return m_values[xbin]; }
0038 inline size_t Size() const { return m_values.size(); }
0039 inline const axis & GetAxis() const { return m_x; }
0040 };
0041
0042 class TwoDim_Table {
0043 private:
0044 axis m_x, m_y;
0045 std::vector<std::vector<double> > m_values;
0046 public:
0047 TwoDim_Table(const axis & xbins,const axis & ybins);
0048 void Fill(const size_t & xbin,const size_t & ybin,const double & value);
0049 double operator()(const double & x,const double & y) const;
0050 double Value(const size_t & xbin,const size_t & ybin) const {
0051 return m_values[xbin][ybin];
0052 }
0053 };
0054 }
0055 #endif