npstat is hosted by Hepforge, IPPP Durham
NPStat  5.10.0
JohnsonCurves.hh
Go to the documentation of this file.
1 #ifndef NPSTAT_JOHNSONCURVES_HH_
2 #define NPSTAT_JOHNSONCURVES_HH_
3 
4 /*!
5 // \file JohnsonCurves.hh
6 //
7 // \brief Johnson frequency curves
8 //
9 // The S_u distribution is rather easy to fit by moments, and the
10 // fitting procedure works well. The S_b is much harder to fit, and
11 // the implementation may be rough at the moment. It is, however,
12 // better than any previously published algorithm.
13 //
14 // Author: I. Volobouev
15 //
16 // April 2010
17 */
18 
20 
21 namespace npstat {
22  /** Johnson S_u (unbounded) curve */
24  {
25  public:
26  JohnsonSu(double location, double scale,
27  double skewness, double kurtosis);
28  inline virtual JohnsonSu* clone() const {return new JohnsonSu(*this);}
29 
30  inline virtual ~JohnsonSu() {}
31 
32  inline double skewness() const {return skew_;}
33  inline double kurtosis() const {return kurt_;}
34  inline bool isValid() const {return isValid_;}
35 
36  inline double getDelta() const {return delta_;}
37  inline double getLambda() const {return lambda_;}
38  inline double getGamma() const {return gamma_;}
39  inline double getXi() const {return xi_;}
40 
41  // Methods needed for I/O
42  inline virtual gs::ClassId classId() const {return gs::ClassId(*this);}
43  virtual bool write(std::ostream& os) const;
44 
45  static inline const char* classname()
46  {return "npstat::JohnsonSu";}
47  static inline unsigned version() {return 1;}
48  static JohnsonSu* read(const gs::ClassId& id, std::istream& in);
49 
50  protected:
51  virtual bool isEqual(const AbsDistribution1D&) const;
52 
53  private:
55 
56  JohnsonSu(double location, double scale,
57  const std::vector<double>& params);
58  inline static int nParameters() {return 2;}
59 
60  // The I/O helper constructor
61  inline JohnsonSu(double location, double scale)
63 
64  double unscaledDensity(double x) const;
65  double unscaledCdf(double x) const;
66  double unscaledExceedance(double x) const;
67  double unscaledQuantile(double x) const;
68 
69  void initialize();
70 
71  double skew_;
72  double kurt_;
73 
74  double delta_;
75  double lambda_;
76  double gamma_;
77  double xi_;
78 
79  bool isValid_;
80  };
81 
82  /** Johnson S_b (bounded) curve */
84  {
85  public:
86  JohnsonSb(double location, double scale,
87  double skewness, double kurtosis);
88  inline virtual JohnsonSb* clone() const {return new JohnsonSb(*this);}
89 
90  inline virtual ~JohnsonSb() {}
91 
92  inline double skewness() const {return skew_;}
93  inline double kurtosis() const {return kurt_;}
94  inline bool isValid() const {return isValid_;}
95 
96  inline double getDelta() const {return delta_;}
97  inline double getLambda() const {return lambda_;}
98  inline double getGamma() const {return gamma_;}
99  inline double getXi() const {return xi_;}
100 
101  static bool fitParameters(double skewness, double kurtosis,
102  double *gamma, double *delta,
103  double *lambda, double *xi);
104 
105  // Methods needed for I/O
106  inline virtual gs::ClassId classId() const {return gs::ClassId(*this);}
107  virtual bool write(std::ostream& os) const;
108 
109  static inline const char* classname()
110  {return "npstat::JohnsonSb";}
111  static inline unsigned version() {return 1;}
112  static JohnsonSb* read(const gs::ClassId& id, std::istream& in);
113 
114  protected:
115  virtual bool isEqual(const AbsDistribution1D&) const;
116 
117  private:
119 
120  JohnsonSb(double location, double scale,
121  const std::vector<double>& params);
122  inline static int nParameters() {return 2;}
123 
124  // The I/O helper constructor
125  inline JohnsonSb(double location, double scale)
127 
128  double unscaledDensity(double x) const;
129  double unscaledCdf(double x) const;
130  double unscaledExceedance(double x) const;
131  double unscaledQuantile(double x) const;
132 
133  double skew_;
134  double kurt_;
135 
136  double delta_;
137  double lambda_;
138  double gamma_;
139  double xi_;
140 
141  bool isValid_;
142  };
143 
144  /** This class selects an appropriate Johnson curve automatically */
146  {
147  public:
148  enum CurveType {
149  GAUSSIAN = 0,
150  LOGNORMAL,
151  SU,
152  SB,
153  INVALID
154  };
155 
156  // std::invalid_argument will be thrown if the combination
157  // of skewness and kurtosis arguments is impossible
158  JohnsonSystem(double location, double scale,
159  double skewness, double kurtosis);
160 
161  // A convenience constructor from cumulants. At least two
162  // cumulants must be provided. If less than four cumulants
163  // are provided, missing comulants will be assumed zero.
164  // If more than four cumulants are provided, extra cumulants
165  // will be ignored.
166  explicit JohnsonSystem(const std::vector<double>& cumulants);
167 
169  JohnsonSystem& operator=(const JohnsonSystem&);
170 
171  virtual ~JohnsonSystem();
172 
173  inline virtual JohnsonSystem* clone() const
174  {return new JohnsonSystem(*this);}
175 
176  inline double skewness() const {return skew_;}
177  inline double kurtosis() const {return kurt_;}
178  inline CurveType curveType() const {return curveType_;}
179  inline bool isValid() const {return !(curveType_ == INVALID);}
180 
181  static CurveType select(double skewness, double kurtosis);
182 
183  // Methods needed for I/O
184  inline virtual gs::ClassId classId() const {return gs::ClassId(*this);}
185  virtual bool write(std::ostream& os) const;
186 
187  static inline const char* classname()
188  {return "npstat::JohnsonSystem";}
189  static inline unsigned version() {return 1;}
190  static JohnsonSystem* read(const gs::ClassId& id, std::istream& in);
191 
192  protected:
193  virtual bool isEqual(const AbsDistribution1D&) const;
194 
195  private:
197 
198  JohnsonSystem(double location, double scale,
199  const std::vector<double>& params);
200  inline static int nParameters() {return 2;}
201 
202  // The I/O helper constructor
203  inline JohnsonSystem(double location, double scale)
205 
206  void initialize();
207 
208  inline double unscaledDensity(double x) const
209  {return fcn_->density(x);}
210  inline double unscaledCdf(double x) const
211  {return fcn_->cdf(x);}
212  inline double unscaledExceedance(double x) const
213  {return fcn_->exceedance(x);}
214  inline double unscaledQuantile(double x) const
215  {return fcn_->quantile(x);}
216 
218  double skew_;
219  double kurt_;
220  CurveType curveType_;
221  };
222 }
223 
224 #endif // NPSTAT_JOHNSONCURVES_HH_
Factories for 1-d distributions for use in interpretive language environments.
Definition: AbsDistribution1D.hh:165
double scale() const
Definition: AbsDistribution1D.hh:183
AbsScalableDistribution1D(const double location, const double scale)
Definition: AbsDistribution1D.hh:168
double density(const double x) const
Definition: AbsDistribution1D.hh:199
double exceedance(const double x) const
Definition: AbsDistribution1D.hh:205
double cdf(const double x) const
Definition: AbsDistribution1D.hh:202
double quantile(const double x) const
Definition: AbsDistribution1D.hh:208
double location() const
Definition: AbsDistribution1D.hh:180
Definition: JohnsonCurves.hh:84
virtual gs::ClassId classId() const
Definition: JohnsonCurves.hh:106
virtual bool isEqual(const AbsDistribution1D &) const
virtual JohnsonSb * clone() const
Definition: JohnsonCurves.hh:88
Definition: JohnsonCurves.hh:24
virtual bool isEqual(const AbsDistribution1D &) const
virtual JohnsonSu * clone() const
Definition: JohnsonCurves.hh:28
virtual gs::ClassId classId() const
Definition: JohnsonCurves.hh:42
Definition: JohnsonCurves.hh:146
virtual gs::ClassId classId() const
Definition: JohnsonCurves.hh:184
virtual JohnsonSystem * clone() const
Definition: JohnsonCurves.hh:173
virtual bool isEqual(const AbsDistribution1D &) const
Definition: Distribution1DFactory.hh:35
Definition: AbsArrayProjector.hh:14
Definition: AbsDistribution1D.hh:31