npstat is hosted by Hepforge, IPPP Durham
NPStat  5.10.0
AbsUnbinnedGOFTest1D.hh
Go to the documentation of this file.
1 #ifndef NPSTAT_ABSUNBINNEDGOFTEST1D_HH_
2 #define NPSTAT_ABSUNBINNEDGOFTEST1D_HH_
3 
4 /*!
5 // \file AbsUnbinnedGOFTest1D.hh
6 //
7 // \brief Interface definition for goodness-of-fit tests for 1-d distributions
8 //
9 // Author: I. Volobouev
10 //
11 // November 2020
12 */
13 
14 #include <vector>
15 #include <stdexcept>
16 #include <string>
17 
21 
22 namespace npstat {
24  {
25  public:
26  inline explicit AbsUnbinnedGOFTest1D(const AbsDistribution1D& d)
27  : distro_(d.clone()) {}
28 
30  : distro_(r.distro_->clone()) {}
31 
32  inline AbsUnbinnedGOFTest1D& operator=(const AbsUnbinnedGOFTest1D& r)
33  {
34  if (this != &r)
35  {
36  delete distro_;
37  distro_ = 0;
38  distro_ = r.distro_->clone();
39  }
40  return *this;
41  }
42 
43  inline virtual ~AbsUnbinnedGOFTest1D() {delete distro_;}
44 
45  inline const AbsDistribution1D& getNull() const {return *distro_;}
46 
47  virtual std::string shortName() const=0;
48 
49  virtual double testStatistic(
50  const double* data, unsigned long sz,
51  bool isDataSorted) const=0;
52 
53  virtual double testStatistic(
54  const float* data, unsigned long sz,
55  bool isDataSorted) const=0;
56 
57  inline virtual double analyticPValue(
58  double /* stat */, unsigned long /* sz */) const
59  {
60  throw std::runtime_error(
61  "In npstat::AbsUnbinnedGOFTest1D::analyticPValue: "
62  "this function is not implemented by the derived class");
63  }
64  inline virtual bool hasAnalyticPValue() const {return false;}
65 
66  /** This is the inverse function to "analyticPValue" */
67  virtual double inverseExceedance(double pvalue, unsigned long sz,
68  double smin, double smax) const;
69 
70  inline void simulateStatistic(
71  AbsRandomGenerator& g, unsigned long sz,
72  unsigned nPseudo, std::vector<double>* stats) const
73  {
74  simulateAltStatistic(*distro_, g, sz, nPseudo, stats);
75  }
76 
77  // The following method should sort the returned statistic values
78  // in the increasing order
79  virtual void simulateAltStatistic(
80  const AbsDistribution1D& alternative,
81  AbsRandomGenerator& g, unsigned long sz,
82  unsigned nPseudo, std::vector<double>* stats) const;
83 
84  protected:
85  AbsDistribution1D* distro_;
86 
87 #ifdef SWIG
88  public:
89  inline std::vector<double> simulateStatistic2(
90  AbsRandomGenerator& g, const unsigned long sz,
91  const unsigned nPseudo) const
92  {
93  std::vector<double> tmp;
94  simulateStatistic(g, sz, nPseudo, &tmp);
95  return tmp;
96  }
97 
98  inline std::vector<double> simulateAltStatistic2(
99  const AbsDistribution1D& alternative,
100  AbsRandomGenerator& g, const unsigned long sz,
101  const unsigned nPseudo) const
102  {
103  std::vector<double> tmp;
104  simulateAltStatistic(alternative, g, sz, nPseudo, &tmp);
105  return tmp;
106  }
107 #endif // SWIG
108  };
109 
110 
111  class GOFTest1DPVFunctor : public Functor1<double, double>
112  {
113  public:
114  inline GOFTest1DPVFunctor(const AbsUnbinnedGOFTest1D& goftest,
115  const unsigned long sz)
116  : goftest_(goftest), sz_(sz) {}
117 
118  inline virtual ~GOFTest1DPVFunctor() {}
119 
120  inline virtual double operator()(const double& a) const
121  {return goftest_.analyticPValue(a, sz_);}
122 
123  private:
124  const AbsUnbinnedGOFTest1D& goftest_;
125  unsigned long sz_;
126  };
127 }
128 
129 #endif // NPSTAT_ABSUNBINNEDGOFTEST1D_HH_
Interface definition for 1-d continuous statistical distributions.
Interface definition for pseudo- and quasi-random number generators.
Interface definitions and concrete simple functors for a variety of functor-based calculations.
Definition: AbsUnbinnedGOFTest1D.hh:24
virtual double inverseExceedance(double pvalue, unsigned long sz, double smin, double smax) const
Definition: AbsUnbinnedGOFTest1D.hh:112
Definition: AbsArrayProjector.hh:14
Definition: AbsDistribution1D.hh:31
virtual AbsDistribution1D * clone() const =0
Definition: AbsRandomGenerator.hh:27
Definition: SimpleFunctors.hh:58