6 #include <utl/ErrorLogger.h>
59 ERROR(
"x less than 0 in function IncompleteGammaPSeries()");
62 ERROR(
"Invalid arguments in function IncompleteGammaP()");
65 const double eps = 1e-12;
70 for (
int n = 1; n <= 100; ++n) {
74 if (fabs(del) < fabs(sum)*eps)
75 return sum*exp(-x + a*log(x) - lnga);
77 ERROR(
"Too many iterations in function IncompleteGammaPSeries()");
94 if (x < 0 || a <= 0) {
95 ERROR(
"Invalid arguments in function IncompleteGammaP()");
100 const int maxIt = 100;
101 const double eps = 3e-7;
102 const double fpMin = 1e-30;
104 double b = x + 1 -
a;
105 double c = 1 / fpMin;
109 for (i = 1; i <= maxIt; ++i) {
110 double an = -i * (i-
a);
121 if (fabs(del - 1) <
eps)
125 ERROR(
"Too many iterations in function IncompleteGammaPCF()");
128 return h*exp(-x + a*log(x) - lnga);
143 BetaCF(
const double a,
const double b,
const double x)
145 const int maxIt = 100;
146 const double eps = 3e-7;
147 const double fpMin = 1e-30;
149 const double qab = a +
b;
150 const double qap = a + 1;
151 const double qam = a - 1;
153 double d = 1 - qab*x/qap;
160 for (m = 1; m <= maxIt; ++
m) {
163 const double aa1 = m * (b-
m) * x / ((qam+m2) * (a+
m2));
173 const double aa2 = -(a+
m) * (qab+m) * x / ((a+
m2) * (qap+m2));
181 const double del = d*
c;
183 if (fabs(del - 1) <
eps)
187 ERROR(
"Too many iterations in BetaCF()");
212 ERROR(
"Bad x in routine incompleteBeta");
219 if (x < (a+1)/(a+b+2))
221 return bt *
BetaCF(a, b, x) /
a;
224 return 1 - bt *
BetaCF(b, a, 1-x) /
b;
231 double& thetaError,
double& phiError,
double& thetaPhiCorrelation)
236 boost::tie(u, v, w) = u_v_w;
240 boost::tie(sigmaU2, sigmaUV, sigmaV2) = sigma_u2_uv_v2;
242 const double u2 = u*u;
243 const double uv = u*v;
244 const double v2 = v*v;
245 const double duvsigmaUV = 2*uv*sigmaUV;
246 const double u2pv2 = u2 + v2;
248 thetaError =
sqrt((u2*sigmaU2 + v2*sigmaV2 + duvsigmaUV) / u2pv2) / w;
249 phiError =
sqrt(v2*sigmaU2 + u2*sigmaV2 - duvsigmaUV) / u2pv2;
250 thetaPhiCorrelation =
251 (-u*v*sigmaU2 + (u2-v2)*sigmaUV + u*v*sigmaV2) / (w*
pow(u2pv2, 1.5)*thetaError*phiError);
double IncompleteGammaPCF(const double a, const double x)
Continued Fraction for incomplete gamma function Q(a, x)
double IncompleteGammaPSeries(const double a, const double x)
logarithm of Gamma function
boost::tuple< double, double, double > Triple
Coordinate triple for easy getting or setting of coordinates.
double pow(const double x, const unsigned int i)
double IncompleteBeta(const double a, const double b, const double x)
Incomplete Beta function.
void PropagateAxisErrors(const Vector::Triple &u_v_w, const Vector::Triple &sigma_u2_uv_v2, double &thetaError, double &phiError, double &thetaPhiCorrelation)
double LogGamma(const double x)
double BetaCF(const double a, const double b, const double x)
BetaCF.
#define ERROR(message)
Macro for logging error messages.