File indexing completed on 2024-04-06 12:19:19
0001 #ifndef NPSTAT_CIRCULARMAPPER1D_HH_
0002 #define NPSTAT_CIRCULARMAPPER1D_HH_
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #include <cmath>
0015
0016 #include "JetMETCorrections/InterpolationTables/interface/LinearMapper1d.h"
0017
0018 namespace npstat {
0019
0020
0021
0022
0023 class CircularMapper1d {
0024 public:
0025 inline CircularMapper1d() : a_(1.0), b_(0.0), period_(2.0 * M_PI) {}
0026
0027 inline CircularMapper1d(const double ca, const double cb, const double cperiod)
0028 : a_(ca), b_(cb), period_(std::abs(cperiod)) {
0029 check();
0030 }
0031
0032 inline CircularMapper1d(const LinearMapper1d& mapper, const double cperiod)
0033 : a_(mapper.a()), b_(mapper.b()), period_(std::abs(cperiod)) {
0034 check();
0035 }
0036
0037 inline double operator()(const double& x) const {
0038 double value = a_ * x + b_;
0039 value -= period_ * floor(value / period_);
0040 if (value > period_ / 2.0)
0041 value -= period_;
0042 return value;
0043 }
0044
0045 inline double a() const { return a_; }
0046 inline double b() const { return b_; }
0047 inline double period() const { return period_; }
0048 inline LinearMapper1d linearMapper() const { return LinearMapper1d(a_, b_); }
0049
0050 private:
0051 inline void check() {
0052 if (!period_)
0053 throw npstat::NpstatInvalidArgument(
0054 "In npstat::CircularMapper1d constructor: "
0055 "invalid period argument (can not be 0)");
0056 }
0057
0058 double a_;
0059 double b_;
0060 double period_;
0061 };
0062 }
0063
0064 #endif