// @(#)root/mathmore:$Id$
// Authors: B. List 29.4.2010

/**********************************************************************
*                                                                    *
* Copyright (c) 2004 ROOT Foundation,  CERN/PH-SFT                   *
*                                                                    *
* This library is free software; you can redistribute it and/or      *
* modify it under the terms of the GNU General Public License        *
* as published by the Free Software Foundation; either version 2     *
* of the License, or (at your option) any later version.             *
*                                                                    *
* This library is distributed in the hope that it will be useful,    *
* but WITHOUT ANY WARRANTY; without even the implied warranty of     *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   *
* General Public License for more details.                           *
*                                                                    *
* You should have received a copy of the GNU General Public License  *
* along with this library (see file COPYING); if not, write          *
* to the Free Software Foundation, Inc., 59 Temple Place, Suite      *
* 330, Boston, MA 02111-1307 USA, or contact the author.             *
*                                                                    *
**********************************************************************/

// Header file for class VavilovAccurate
//
// Created by: blist  at Thu Apr 29 11:19:00 2010
//
// Last update: Thu Apr 29 11:19:00 2010
//
#ifndef ROOT_Math_VavilovAccurate
#define ROOT_Math_VavilovAccurate

#include "Math/Vavilov.h"

namespace ROOT {
namespace Math {

//____________________________________________________________________________
/**
Class describing a Vavilov distribution.

The probability density function of the Vavilov distribution
as function of Landau's parameter is given by:
\f[ p(\lambda_L; \kappa, \beta^2) =
\frac{1}{2 \pi i}\int_{c-i\infty}^{c+i\infty} \phi(s) e^{\lambda_L s} ds\f]
where \f$\phi(s) = e^{C} e^{\psi(s)}\f$
with  \f$C = \kappa (1+\beta^2 \gamma )\f$
and \f$\psi(s)= s \ln \kappa + (s+\beta^2 \kappa) \cdot \left ( \int \limits_{0}^{1} \frac{1 - e^{\frac{-st}{\kappa}}}{t} \,d t- \gamma \right ) - \kappa \, e^{\frac{-s}{\kappa}}\f$.
\f$\gamma = 0.5772156649\dots\f$ is Euler's constant.

For the class VavilovAccurate,
Pdf returns the Vavilov distribution as function of Landau's parameter
\f$\lambda_L = \lambda_V/\kappa - \ln \kappa\f$,
which is the convention used in the CERNLIB routines, and in the tables
by S.M. Seltzer and M.J. Berger: Energy loss stragglin of protons and mesons:
Tabulation of the Vavilov distribution, pp 187-203
in: National Research Council (U.S.), Committee on Nuclear Science:
Studies in penetration of charged particles in matter,
Nucl. Sci. Series Report No. 39,
Washington (Nat. Akad. Sci.) 1964, 388 pp.
Available from

Therefore, for small values of \f$\kappa < 0.01\f$,
pdf approaches the Landau distribution.

For values \f$\kappa > 10\f$, the Gauss approximation should be used
with \f$\mu\f$ and \f$\sigma\f$ given by Vavilov::mean(kappa, beta2)
and sqrt(Vavilov::variance(kappa, beta2).

The original Vavilov pdf is obtained by
v.Pdf(lambdaV/kappa-log(kappa))/kappa.

For detailed description see
B. Schorr, Programs for the Landau and the Vavilov distributions and the corresponding random numbers,
<A HREF="http://dx.doi.org/10.1016/0010-4655(74)90091-5">Computer Phys. Comm. 7 (1974) 215-224</A>,
which has been implemented in
<A HREF="http://wwwasdoc.web.cern.ch/wwwasdoc/shortwrupsdir/g116/top.html">
CERNLIB (G116)</A>.

The class stores coefficients needed to calculate \f$p(\lambda; \kappa, \beta^2)\f$
for fixed values of \f$\kappa\f$ and \f$\beta^2\f$.
Changing these values is computationally expensive.

The parameter \f$\kappa\f$ should be in the range \f$0.01 \le \kappa \le 10\f$.
In contrast to the CERNLIB implementation, all values of \f$\kappa \ge 0.001\f$ may be used,
but may result in slower running and/or inaccurate results.

The parameter \f$\beta^2\f$ must be in the range \f$0 \le \beta^2 \le 1\f$.

Two parameters which are fixed in the CERNLIB implementation may be set by the user:
- epsilonPM corresponds to \f$\epsilon^+ = \epsilon^-\f$ in Eqs. (2.1) and (2.2) of Schorr's paper.
epsilonPM gives an estimate on the integral of the cummulative distribution function
outside the range \f$\lambda_{min} \le \lambda \le \lambda_{max}\f$
where the approximation is valid.
Thus, it determines the support of the approximation used here (called $T_0 - T_1$ in the paper).
Schorr recommends  \f$\epsilon^+ = \epsilon^- = 5\cdot 10^{-4}\f$.
The code from CERNLIB has been extended such that also smaller values are possible.

- epsilon corresponds to \f$\epsilon\f$ in Eq. (4.10) of Schorr's paper.
It determines the accuracy of the series expansion.
Schorr recommends  \f$\epsilon = 10^{-5}\f$.

For the quantile calculation, the algorithm given by Schorr is not used,
because it turns out to be very slow and still inaccurate.
Instead, an initial estimate is calculated based on a precalculated table,
which is subsequently improved by Newton iterations.

While the CERNLIB implementation calculates at most 156 terms in the series expansion
for the pdf and cdf calculation, this class calculates up to 500 terms, depending
on the values of epsilonPM and epsilon.

Average times on a Pentium Core2 Duo P8400 2.26GHz:
- 38us per call to SetKappaBeta2 or constructor
- 0.49us per call to Pdf, Cdf
- 8.2us per first call to Quantile after SetKappaBeta2 or constructor
- 0.83us per subsequent call to Quantile

Benno List, June 2010

@ingroup StatFunc
*/

class VavilovAccurate: public Vavilov {

public:

/**
Initialize an object to calculate the Vavilov distribution

@param kappa The parameter \f$\kappa\f$, which must be in the range \f$\kappa \ge 0.001 \f$
@param beta2 The parameter \f$\beta^2\f$, which must be in the range \f$0 \le \beta^2 \le 1 \f$
@param epsilonPM: \f$\epsilon^+ = \epsilon^-\f$ in Eqs. (2.1) and (2.2) of Schorr's paper; gives an estimate on the integral of the cummulative distribution function
outside the range \f$\lambda_{min} \le \lambda \le \lambda_{max}\f$
where the approximation is valid.
@param epsilon: \f$\epsilon\f$ in Eq. (4.10) of Schorr's paper; determines the accuracy of the series expansion.
*/

VavilovAccurate(double kappa=1, double beta2=1, double epsilonPM=5E-4, double epsilon=1E-5);

/**
Destructor
*/
virtual ~VavilovAccurate();

public:

/**
Evaluate the Vavilov probability density function

@param x The Landau parameter \f$x = \lambda_L\f$
*/
double Pdf (double x) const;

/**
Evaluate the Vavilov probability density function,
and set kappa and beta2, if necessary

@param x The Landau parameter \f$x = \lambda_L\f$
@param kappa The parameter \f$\kappa\f$, which must be in the range \f$\kappa \ge 0.001 \f$
@param beta2 The parameter \f$\beta^2\f$, which must be in the range \f$0 \le \beta^2 \le 1 \f$
*/
double Pdf (double x, double kappa, double beta2);

/**
Evaluate the Vavilov cummulative probability density function

@param x The Landau parameter \f$x = \lambda_L\f$
*/
double Cdf (double x) const;

/**
Evaluate the Vavilov cummulative probability density function,
and set kappa and beta2, if necessary

@param x The Landau parameter \f$x = \lambda_L\f$
@param kappa The parameter \f$\kappa\f$, which must be in the range \f$\kappa \ge 0.001 \f$
@param beta2 The parameter \f$\beta^2\f$, which must be in the range \f$0 \le \beta^2 \le 1 \f$
*/
double Cdf (double x, double kappa, double beta2);

/**
Evaluate the Vavilov complementary cummulative probability density function

@param x The Landau parameter \f$x = \lambda_L\f$
*/
double Cdf_c (double x) const;

/**
Evaluate the Vavilov complementary cummulative probability density function,
and set kappa and beta2, if necessary

@param x The Landau parameter \f$x = \lambda_L\f$
@param kappa The parameter \f$\kappa\f$, which must be in the range \f$\kappa \ge 0.001 \f$
@param beta2 The parameter \f$\beta^2\f$, which must be in the range \f$0 \le \beta^2 \le 1 \f$
*/
double Cdf_c (double x, double kappa, double beta2);

/**
Evaluate the inverse of the Vavilov cummulative probability density function

@param z The argument \f$z\f$, which must be in the range \f$0 \le z \le 1\f$
*/
double Quantile (double z) const;

/**
Evaluate the inverse of the Vavilov cummulative probability density function,
and set kappa and beta2, if necessary

@param z The argument \f$z\f$, which must be in the range \f$0 \le z \le 1\f$
@param kappa The parameter \f$\kappa\f$, which must be in the range \f$\kappa \ge 0.001 \f$
@param beta2 The parameter \f$\beta^2\f$, which must be in the range \f$0 \le \beta^2 \le 1 \f$
*/
double Quantile (double z, double kappa, double beta2);

/**
Evaluate the inverse of the complementary Vavilov cummulative probability density function

@param z The argument \f$z\f$, which must be in the range \f$0 \le z \le 1\f$
*/
double Quantile_c (double z) const;

/**
Evaluate the inverse of the complementary Vavilov cummulative probability density function,
and set kappa and beta2, if necessary

@param z The argument \f$z\f$, which must be in the range \f$0 \le z \le 1\f$
@param kappa The parameter \f$\kappa\f$, which must be in the range \f$\kappa \ge 0.001 \f$
@param beta2 The parameter \f$\beta^2\f$, which must be in the range \f$0 \le \beta^2 \le 1 \f$
*/
double Quantile_c (double z, double kappa, double beta2);

/**
Change \f$\kappa\f$ and \f$\beta^2\f$ and recalculate coefficients if necessary

@param kappa The parameter \f$\kappa\f$, which must be in the range \f$\kappa \ge 0.001 \f$
@param beta2 The parameter \f$\beta^2\f$, which must be in the range \f$0 \le \beta^2 \le 1 \f$
*/
virtual void SetKappaBeta2 (double kappa, double beta2);

/**
(Re)Initialize the object

@param kappa The parameter \f$\kappa\f$, which must be in the range \f$\kappa \ge 0.001 \f$
@param beta2 The parameter \f$\beta^2\f$, which must be in the range \f$0 \le \beta^2 \le 1 \f$
@param epsilonPM \f$\epsilon^+ = \epsilon^-\f$ in Eqs. (2.1) and (2.2) of Schorr's paper; gives an estimate on the integral of the cummulative distribution function
outside the range \f$\lambda_{min} \le \lambda \le \lambda_{max}\f$
where the approximation is valid.
@param epsilon \f$\epsilon\f$ in Eq. (4.10) of Schorr's paper; determines the accuracy of the series expansion.
*/
void Set(double kappa, double beta2, double epsilonPM=5E-4, double epsilon=1E-5);

/**
Return the minimum value of \f$\lambda\f$ for which \f$p(\lambda; \kappa, \beta^2)\f$
is nonzero in the current approximation
*/
virtual double GetLambdaMin() const;

/**
Return the maximum value of \f$\lambda\f$ for which \f$p(\lambda; \kappa, \beta^2)\f$
is nonzero in the current approximation
*/
virtual double GetLambdaMax() const;

/**
Return the current value of \f$\kappa\f$
*/
virtual double GetKappa()     const;

/**
Return the current value of \f$\beta^2\f$
*/
virtual double GetBeta2()     const;

/**
Return the value of \f$\lambda\f$ where the pdf is maximal
*/
virtual double Mode() const;

/**
Return the value of \f$\lambda\f$ where the pdf is maximal function,
and set kappa and beta2, if necessary

@param kappa The parameter \f$\kappa\f$, which must be in the range \f$\kappa \ge 0.001 \f$
@param beta2 The parameter \f$\beta^2\f$, which must be in the range \f$0 \le \beta^2 \le 1 \f$
*/
virtual double Mode(double kappa, double beta2);

/**
Return the current value of \f$\epsilon^+ = \epsilon^-\f$
*/

double GetEpsilonPM() const;

/**
Return the current value of \f$\epsilon\f$
*/
double GetEpsilon()   const;

/**
Return the number of terms used in the series expansion
*/
double GetNTerms()    const;

/**
Returns a static instance of class VavilovFast
*/
static VavilovAccurate *GetInstance();

/**
Returns a static instance of class VavilovFast,
and sets the values of kappa and beta2

@param kappa The parameter \f$\kappa\f$, which must be in the range \f$\kappa \ge 0.001 \f$
@param beta2 The parameter \f$\beta^2\f$, which must be in the range \f$0 \le \beta^2 \le 1 \f$
*/
static VavilovAccurate *GetInstance(double kappa, double beta2);

private:
enum{MAXTERMS=500};
double fH[8], fT0, fT1, fT, fOmega, fA_pdf[MAXTERMS+1], fB_pdf[MAXTERMS+1], fA_cdf[MAXTERMS+1], fB_cdf[MAXTERMS+1], fX0;
double fKappa, fBeta2;
double fEpsilonPM, fEpsilon;

mutable bool fQuantileInit;
mutable int fNQuant;
enum{kNquantMax=32};
mutable double fQuant[kNquantMax];
mutable double fLambda[kNquantMax];

void InitQuantile() const;

static VavilovAccurate *fgInstance;

double G116f1 (double x) const;
double G116f2 (double x) const;

int Rzero (double a, double b, double& x0,
double eps, int mxf, double (VavilovAccurate::*f)(double)const) const;
static double E1plLog (double x); // Calculates log(|x|)+E_1(x)

};

/**
The Vavilov probability density function

@param x The Landau parameter \f$x = \lambda_L\f$
@param kappa The parameter \f$\kappa\f$, which must be in the range \f$\kappa \ge 0.001 \f$
@param beta2 The parameter \f$\beta^2\f$, which must be in the range \f$0 \le \beta^2 \le 1 \f$

@ingroup PdfFunc
*/
double vavilov_accurate_pdf (double x, double kappa, double beta2);

/**
The Vavilov cummulative probability density function

@param x The Landau parameter \f$x = \lambda_L\f$
@param kappa The parameter \f$\kappa\f$, which must be in the range \f$\kappa \ge 0.001 \f$
@param beta2 The parameter \f$\beta^2\f$, which must be in the range \f$0 \le \beta^2 \le 1 \f$

@ingroup ProbFunc
*/
double vavilov_accurate_cdf (double x, double kappa, double beta2);

/**
The Vavilov complementary cummulative probability density function

@param x The Landau parameter \f$x = \lambda_L\f$
@param kappa The parameter \f$\kappa\f$, which must be in the range \f$\kappa \ge 0.001 \f$
@param beta2 The parameter \f$\beta^2\f$, which must be in the range \f$0 \le \beta^2 \le 1 \f$

@ingroup ProbFunc
*/
double vavilov_accurate_cdf_c (double x, double kappa, double beta2);

/**
The inverse of the Vavilov cummulative probability density function

@param z The argument \f$z\f$, which must be in the range \f$0 \le z \le 1\f$
@param kappa The parameter \f$\kappa\f$, which must be in the range \f$\kappa \ge 0.001 \f$
@param beta2 The parameter \f$\beta^2\f$, which must be in the range \f$0 \le \beta^2 \le 1 \f$

@ingroup QuantFunc
*/
double vavilov_accurate_quantile (double z, double kappa, double beta2);

/**
The inverse of the complementary Vavilov cummulative probability density function

@param z The argument \f$z\f$, which must be in the range \f$0 \le z \le 1\f$
@param kappa The parameter \f$\kappa\f$, which must be in the range \f$\kappa \ge 0.001 \f$
@param beta2 The parameter \f$\beta^2\f$, which must be in the range \f$0 \le \beta^2 \le 1 \f$

@ingroup QuantFunc
*/
double vavilov_accurate_quantile_c (double z, double kappa, double beta2);

} // namespace Math
} // namespace ROOT

#endif /* ROOT_Math_VavilovAccurate */

VavilovAccurate.h:1
VavilovAccurate.h:2
VavilovAccurate.h:3
VavilovAccurate.h:4
VavilovAccurate.h:5
VavilovAccurate.h:6
VavilovAccurate.h:7
VavilovAccurate.h:8
VavilovAccurate.h:9
VavilovAccurate.h:10
VavilovAccurate.h:11
VavilovAccurate.h:12
VavilovAccurate.h:13
VavilovAccurate.h:14
VavilovAccurate.h:15
VavilovAccurate.h:16
VavilovAccurate.h:17
VavilovAccurate.h:18
VavilovAccurate.h:19
VavilovAccurate.h:20
VavilovAccurate.h:21
VavilovAccurate.h:22
VavilovAccurate.h:23
VavilovAccurate.h:24
VavilovAccurate.h:25
VavilovAccurate.h:26
VavilovAccurate.h:27
VavilovAccurate.h:28
VavilovAccurate.h:29
VavilovAccurate.h:30
VavilovAccurate.h:31
VavilovAccurate.h:32
VavilovAccurate.h:33
VavilovAccurate.h:34
VavilovAccurate.h:35
VavilovAccurate.h:36
VavilovAccurate.h:37
VavilovAccurate.h:38
VavilovAccurate.h:39
VavilovAccurate.h:40
VavilovAccurate.h:41
VavilovAccurate.h:42
VavilovAccurate.h:43
VavilovAccurate.h:44
VavilovAccurate.h:45
VavilovAccurate.h:46
VavilovAccurate.h:47
VavilovAccurate.h:48
VavilovAccurate.h:49
VavilovAccurate.h:50
VavilovAccurate.h:51
VavilovAccurate.h:52
VavilovAccurate.h:53
VavilovAccurate.h:54
VavilovAccurate.h:55
VavilovAccurate.h:56
VavilovAccurate.h:57
VavilovAccurate.h:58
VavilovAccurate.h:59
VavilovAccurate.h:60
VavilovAccurate.h:61
VavilovAccurate.h:62
VavilovAccurate.h:63
VavilovAccurate.h:64
VavilovAccurate.h:65
VavilovAccurate.h:66
VavilovAccurate.h:67
VavilovAccurate.h:68
VavilovAccurate.h:69
VavilovAccurate.h:70
VavilovAccurate.h:71
VavilovAccurate.h:72
VavilovAccurate.h:73
VavilovAccurate.h:74
VavilovAccurate.h:75
VavilovAccurate.h:76
VavilovAccurate.h:77
VavilovAccurate.h:78
VavilovAccurate.h:79
VavilovAccurate.h:80
VavilovAccurate.h:81
VavilovAccurate.h:82
VavilovAccurate.h:83
VavilovAccurate.h:84
VavilovAccurate.h:85
VavilovAccurate.h:86
VavilovAccurate.h:87
VavilovAccurate.h:88
VavilovAccurate.h:89
VavilovAccurate.h:90
VavilovAccurate.h:91
VavilovAccurate.h:92
VavilovAccurate.h:93
VavilovAccurate.h:94
VavilovAccurate.h:95
VavilovAccurate.h:96
VavilovAccurate.h:97
VavilovAccurate.h:98
VavilovAccurate.h:99
VavilovAccurate.h:100
VavilovAccurate.h:101
VavilovAccurate.h:102
VavilovAccurate.h:103
VavilovAccurate.h:104
VavilovAccurate.h:105
VavilovAccurate.h:106
VavilovAccurate.h:107
VavilovAccurate.h:108
VavilovAccurate.h:109
VavilovAccurate.h:110
VavilovAccurate.h:111
VavilovAccurate.h:112
VavilovAccurate.h:113
VavilovAccurate.h:114
VavilovAccurate.h:115
VavilovAccurate.h:116
VavilovAccurate.h:117
VavilovAccurate.h:118
VavilovAccurate.h:119
VavilovAccurate.h:120
VavilovAccurate.h:121
VavilovAccurate.h:122
VavilovAccurate.h:123
VavilovAccurate.h:124
VavilovAccurate.h:125
VavilovAccurate.h:126
VavilovAccurate.h:127
VavilovAccurate.h:128
VavilovAccurate.h:129
VavilovAccurate.h:130
VavilovAccurate.h:131
VavilovAccurate.h:132
VavilovAccurate.h:133
VavilovAccurate.h:134
VavilovAccurate.h:135
VavilovAccurate.h:136
VavilovAccurate.h:137
VavilovAccurate.h:138
VavilovAccurate.h:139
VavilovAccurate.h:140
VavilovAccurate.h:141
VavilovAccurate.h:142
VavilovAccurate.h:143
VavilovAccurate.h:144
VavilovAccurate.h:145
VavilovAccurate.h:146
VavilovAccurate.h:147
VavilovAccurate.h:148
VavilovAccurate.h:149
VavilovAccurate.h:150
VavilovAccurate.h:151
VavilovAccurate.h:152
VavilovAccurate.h:153
VavilovAccurate.h:154
VavilovAccurate.h:155
VavilovAccurate.h:156
VavilovAccurate.h:157
VavilovAccurate.h:158
VavilovAccurate.h:159
VavilovAccurate.h:160
VavilovAccurate.h:161
VavilovAccurate.h:162
VavilovAccurate.h:163
VavilovAccurate.h:164
VavilovAccurate.h:165
VavilovAccurate.h:166
VavilovAccurate.h:167
VavilovAccurate.h:168
VavilovAccurate.h:169
VavilovAccurate.h:170
VavilovAccurate.h:171
VavilovAccurate.h:172
VavilovAccurate.h:173
VavilovAccurate.h:174
VavilovAccurate.h:175
VavilovAccurate.h:176
VavilovAccurate.h:177
VavilovAccurate.h:178
VavilovAccurate.h:179
VavilovAccurate.h:180
VavilovAccurate.h:181
VavilovAccurate.h:182
VavilovAccurate.h:183
VavilovAccurate.h:184
VavilovAccurate.h:185
VavilovAccurate.h:186
VavilovAccurate.h:187
VavilovAccurate.h:188
VavilovAccurate.h:189
VavilovAccurate.h:190
VavilovAccurate.h:191
VavilovAccurate.h:192
VavilovAccurate.h:193
VavilovAccurate.h:194
VavilovAccurate.h:195
VavilovAccurate.h:196
VavilovAccurate.h:197
VavilovAccurate.h:198
VavilovAccurate.h:199
VavilovAccurate.h:200
VavilovAccurate.h:201
VavilovAccurate.h:202
VavilovAccurate.h:203
VavilovAccurate.h:204
VavilovAccurate.h:205
VavilovAccurate.h:206
VavilovAccurate.h:207
VavilovAccurate.h:208
VavilovAccurate.h:209
VavilovAccurate.h:210
VavilovAccurate.h:211
VavilovAccurate.h:212
VavilovAccurate.h:213
VavilovAccurate.h:214
VavilovAccurate.h:215
VavilovAccurate.h:216
VavilovAccurate.h:217
VavilovAccurate.h:218
VavilovAccurate.h:219
VavilovAccurate.h:220
VavilovAccurate.h:221
VavilovAccurate.h:222
VavilovAccurate.h:223
VavilovAccurate.h:224
VavilovAccurate.h:225
VavilovAccurate.h:226
VavilovAccurate.h:227
VavilovAccurate.h:228
VavilovAccurate.h:229
VavilovAccurate.h:230
VavilovAccurate.h:231
VavilovAccurate.h:232
VavilovAccurate.h:233
VavilovAccurate.h:234
VavilovAccurate.h:235
VavilovAccurate.h:236
VavilovAccurate.h:237
VavilovAccurate.h:238
VavilovAccurate.h:239
VavilovAccurate.h:240
VavilovAccurate.h:241
VavilovAccurate.h:242
VavilovAccurate.h:243
VavilovAccurate.h:244
VavilovAccurate.h:245
VavilovAccurate.h:246
VavilovAccurate.h:247
VavilovAccurate.h:248
VavilovAccurate.h:249
VavilovAccurate.h:250
VavilovAccurate.h:251
VavilovAccurate.h:252
VavilovAccurate.h:253
VavilovAccurate.h:254
VavilovAccurate.h:255
VavilovAccurate.h:256
VavilovAccurate.h:257
VavilovAccurate.h:258
VavilovAccurate.h:259
VavilovAccurate.h:260
VavilovAccurate.h:261
VavilovAccurate.h:262
VavilovAccurate.h:263
VavilovAccurate.h:264
VavilovAccurate.h:265
VavilovAccurate.h:266
VavilovAccurate.h:267
VavilovAccurate.h:268
VavilovAccurate.h:269
VavilovAccurate.h:270
VavilovAccurate.h:271
VavilovAccurate.h:272
VavilovAccurate.h:273
VavilovAccurate.h:274
VavilovAccurate.h:275
VavilovAccurate.h:276
VavilovAccurate.h:277
VavilovAccurate.h:278
VavilovAccurate.h:279
VavilovAccurate.h:280
VavilovAccurate.h:281
VavilovAccurate.h:282
VavilovAccurate.h:283
VavilovAccurate.h:284
VavilovAccurate.h:285
VavilovAccurate.h:286
VavilovAccurate.h:287
VavilovAccurate.h:288
VavilovAccurate.h:289
VavilovAccurate.h:290
VavilovAccurate.h:291
VavilovAccurate.h:292
VavilovAccurate.h:293
VavilovAccurate.h:294
VavilovAccurate.h:295
VavilovAccurate.h:296
VavilovAccurate.h:297
VavilovAccurate.h:298
VavilovAccurate.h:299
VavilovAccurate.h:300
VavilovAccurate.h:301
VavilovAccurate.h:302
VavilovAccurate.h:303
VavilovAccurate.h:304
VavilovAccurate.h:305
VavilovAccurate.h:306
VavilovAccurate.h:307
VavilovAccurate.h:308
VavilovAccurate.h:309
VavilovAccurate.h:310
VavilovAccurate.h:311
VavilovAccurate.h:312
VavilovAccurate.h:313
VavilovAccurate.h:314
VavilovAccurate.h:315
VavilovAccurate.h:316
VavilovAccurate.h:317
VavilovAccurate.h:318
VavilovAccurate.h:319
VavilovAccurate.h:320
VavilovAccurate.h:321
VavilovAccurate.h:322
VavilovAccurate.h:323
VavilovAccurate.h:324
VavilovAccurate.h:325
VavilovAccurate.h:326
VavilovAccurate.h:327
VavilovAccurate.h:328
VavilovAccurate.h:329
VavilovAccurate.h:330
VavilovAccurate.h:331
VavilovAccurate.h:332
VavilovAccurate.h:333
VavilovAccurate.h:334
VavilovAccurate.h:335
VavilovAccurate.h:336
VavilovAccurate.h:337
VavilovAccurate.h:338
VavilovAccurate.h:339
VavilovAccurate.h:340
VavilovAccurate.h:341
VavilovAccurate.h:342
VavilovAccurate.h:343
VavilovAccurate.h:344
VavilovAccurate.h:345
VavilovAccurate.h:346
VavilovAccurate.h:347
VavilovAccurate.h:348
VavilovAccurate.h:349
VavilovAccurate.h:350
VavilovAccurate.h:351
VavilovAccurate.h:352
VavilovAccurate.h:353
VavilovAccurate.h:354
VavilovAccurate.h:355
VavilovAccurate.h:356
VavilovAccurate.h:357
VavilovAccurate.h:358
VavilovAccurate.h:359
VavilovAccurate.h:360
VavilovAccurate.h:361
VavilovAccurate.h:362
VavilovAccurate.h:363
VavilovAccurate.h:364
VavilovAccurate.h:365
VavilovAccurate.h:366
VavilovAccurate.h:367
VavilovAccurate.h:368
VavilovAccurate.h:369
VavilovAccurate.h:370
VavilovAccurate.h:371
VavilovAccurate.h:372
VavilovAccurate.h:373
VavilovAccurate.h:374
VavilovAccurate.h:375
VavilovAccurate.h:376
VavilovAccurate.h:377
VavilovAccurate.h:378
VavilovAccurate.h:379
VavilovAccurate.h:380
VavilovAccurate.h:381
VavilovAccurate.h:382
VavilovAccurate.h:383
VavilovAccurate.h:384
VavilovAccurate.h:385
VavilovAccurate.h:386
VavilovAccurate.h:387
VavilovAccurate.h:388
VavilovAccurate.h:389
VavilovAccurate.h:390
VavilovAccurate.h:391
VavilovAccurate.h:392
VavilovAccurate.h:393
VavilovAccurate.h:394
VavilovAccurate.h:395
VavilovAccurate.h:396
VavilovAccurate.h:397
VavilovAccurate.h:398
VavilovAccurate.h:399
VavilovAccurate.h:400
VavilovAccurate.h:401
VavilovAccurate.h:402
VavilovAccurate.h:403
VavilovAccurate.h:404
VavilovAccurate.h:405
VavilovAccurate.h:406
VavilovAccurate.h:407
VavilovAccurate.h:408
VavilovAccurate.h:409
VavilovAccurate.h:410
VavilovAccurate.h:411
VavilovAccurate.h:412
VavilovAccurate.h:413
VavilovAccurate.h:414