14#ifndef RooFit_Detail_MathFuncs_h
15#define RooFit_Detail_MathFuncs_h
34 if (
n < 0 || k < 0 ||
n < k)
39 int k1 = std::min(k,
n - k);
42 for (
double i =
k1; i > 1.; --i) {
49template <
typename DoubleArray>
58 }
else if (degree == 0) {
60 }
else if (degree == 1) {
63 double a1 = coefs[1] -
a0;
66 }
else if (degree == 2) {
69 double a1 = 2 * (coefs[1] -
a0);
70 double a2 = coefs[2] -
a1 -
a0;
77 double result = coefs[0] * s;
78 for (
int i = 1; i < degree; i++) {
82 result += t * coefs[degree];
90 const double arg =
x - mean;
91 const double sig =
sigma;
92 return std::exp(-0.5 * arg * arg / (sig * sig));
95template <
typename DoubleArray>
99 for (std::size_t i = 0; i <
nFactors; ++i) {
106inline double ratio(
double numerator,
double denominator)
108 return numerator / denominator;
111inline double bifurGauss(
double x,
double mean,
double sigmaL,
double sigmaR)
132template <
bool pdfMode = false,
typename DoubleArray>
136 for (
int i =
nCoeffs - 2; i >= 0; i--) {
143template <
typename DoubleArray>
158 for (
unsigned int i = 0;
nCoeffs != i; ++i) {
168template <
typename DoubleArray>
179template <
typename DoubleArray>
183#if defined(__CLING__) && defined(R__HAS_CLAD)
184#pragma clad checkpoint loop
186 for (
unsigned int i = 0; i <
compSize; i++) {
192inline unsigned int uniformBinNumber(
double low,
double high,
double val,
unsigned int numBins,
double coef)
194 double binWidth = (high - low) / numBins;
195 return coef * (val >= high ? numBins - 1 : std::abs((val - low) / binWidth));
198template <
typename DoubleArray>
204 while (boundaries != it && (end == it || end == it + 1 ||
x < *it)) {
207 return it - boundaries;
210template <
typename DoubleArray>
215 return coef * std::max(0,
tmp);
218template <
typename DoubleArray>
221 double binWidth = (high - low) / numBins;
222 int idx = val >= high ? numBins - 1 : std::abs((val - low) / binWidth);
225 double central = low + (idx + 0.5) * binWidth;
226 if (val > low + 0.5 * binWidth && val < high - 0.5 * binWidth) {
229 slope = vals[idx] - vals[idx - 1];
231 slope = vals[idx + 1] - vals[idx];
233 return vals[idx] +
slope * (val - central) / binWidth;
246 }
else if (
x == 0.0) {
247 return std::exp(-par);
250 return std::exp(out);
264 }
else if (code == 1) {
267 return res * (std::pow(high / nominal, +
paramVal) - 1);
269 return res * (std::pow(low / nominal, -
paramVal) - 1);
271 }
else if (code == 2) {
273 double a = 0.5 * (high + low) - nominal;
274 double b = 0.5 * (high - low);
277 return (2 *
a +
b) * (
paramVal - 1) + high - nominal;
279 return -1 * (2 *
a -
b) * (
paramVal + 1) + low - nominal;
287 }
else if (code == 4 || code == 6) {
296 mod =
x * (high - nominal);
298 mod =
x * (nominal - low);
307 mod =
x * (S + t * A * (15 + t * t * (-10 + t * t * 3)));
316 }
else if (code == 5) {
331 double logHi = std::log(high);
332 double logLo = std::log(low);
349 double x0Sq = x0 * x0;
351 double a = 1. / (8 * x0) * (15 *
A0 - 7 * x0 *
S1 + x0 * x0 *
A2);
352 double b = 1. / (8 *
x0Sq) * (-24 + 24 *
S0 - 9 * x0 *
A1 + x0 * x0 *
S2);
353 double c = 1. / (4 *
x0Sq * x0) * (-5 *
A0 + 5 * x0 *
S1 - x0 * x0 *
A2);
354 double d = 1. / (4 *
x0Sq *
x0Sq) * (12 - 12 *
S0 + 7 * x0 *
A1 - x0 * x0 *
S2);
355 double e = 1. / (8 *
x0Sq *
x0Sq * x0) * (+3 *
A0 - 3 * x0 *
S1 + x0 * x0 *
A2);
362 return res * (
mod - 1.0);
368template <
typename ParamsArray,
typename DoubleArray>
372 double total = nominal;
373 for (std::size_t i = 0; i <
n; ++i) {
408 if (mu == 0.0 && weight == 0.0) {
412 return std::numeric_limits<double>::quiet_NaN();
414 const double diff = mu - weight;
422 if (
sigma2 == 0.0 && mu == 0.0 && weight == 0.0) {
426 return std::numeric_limits<double>::quiet_NaN();
428 const double diff = mu - weight;
437 const double diff = mu - weight;
439 const double sigma2 = err * err;
440 if (
sigma2 == 0.0 && mu == 0.0 && weight == 0.0) {
444 return std::numeric_limits<double>::quiet_NaN();
455 if (std::abs(pdf) < 1
e-10 && std::abs(weight) < 1
e-10) {
459 return pdf - weight - weight * (std::log(pdf) - std::log(weight));
463 return -weight * std::log(pdf);
467template <
typename DoubleArray>
472 for (
unsigned int i = 1; i <
n; ++i) {
481 double t = (
m - m0) /
sigma;
488 return std::exp(-0.5 * t * t);
494 return a * std::pow(
r / (
b - t),
n);
506 return std::erf(arg);
560 }
else if (
xMin > mean) {
577template <
bool pdfMode = false,
typename DoubleArray>
584 for (
int i =
nCoeffs - 2; i >= 0; i--) {
590 max = max * std::pow(
xMax, 1 + lowestOrder);
591 min = min * std::pow(
xMin, 1 + lowestOrder);
599#if defined(FP_FAST_FMA)
600 return std::fma(
x,
y, z);
603#if defined(__clang__)
604#pragma STDC FP_CONTRACT ON
610template <
typename DoubleArray>
650 for (
unsigned int i = 1;
iend != i; ++i) {
681 return std::exp(-2.0 * mu);
692 const double delta = 100.0 * std::sqrt(mu);
702 const unsigned int ixMax = std::min(
integrandMax + 1, (
double)std::numeric_limits<unsigned int>::max());
720 const double ix = 1 +
x;
727 const double root2 = std::sqrt(2.);
729 double ln_k = std::abs(std::log(k));
737 const double root2 = std::sqrt(2.);
749 const double sqrt2 = 1.4142135624;
754 if (std::abs(
n - 1.0) < 1.0e-05)
757 double sig = std::abs(
sigma);
759 double tmin = (
mMin - m0) / sig;
760 double tmax = (
mMax - m0) / sig;
783 result +=
a * sig / (1.0 -
n) * (std::pow(
r / (
b - tmin),
n - 1.0) - std::pow(
r / (
b - tmax),
n - 1.0));
793 double log_r = std::log(
r);
794 term1 =
a * std::pow(
r,
n - 1) * sig *
797 term1 =
a * sig / (1.0 -
n) * (std::pow(
r / (
b - tmin),
n - 1.0) - 1.0);
810template <
typename DoubleArray>
819 for (
int i = 0; i <= degree; ++i) {
824 for (
int j = i;
j <= degree; ++
j) {
837template <
typename XArray,
typename MuArray,
typename CovArray>
843 for (
int i = 0; i <
n; ++i) {
844 for (
int j = 0;
j <
n; ++
j) {
848 return std::exp(-0.5 *
result);
854template <
typename DoubleArray>
858 for (std::size_t i = 0; i < nBins; ++i) {
859 double a = boundaries[i];
860 double b = boundaries[i + 1];
861 out += coefs[i] * std::max(0.0, std::min(
b,
xmax) - std::max(
a,
xmin));
876template <
class... Types>
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
static unsigned int total
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t result
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
double lognormal_pdf(double x, double m, double s, double x0=0)
Probability density function of the lognormal distribution.
double landau_pdf(double x, double xi=1, double x0=0)
Probability density function of the Landau distribution:
double inc_gamma_c(double a, double x)
Calculates the normalized (regularized) upper incomplete gamma function (upper integral)
double inc_gamma(double a, double x)
Calculates the normalized (regularized) lower incomplete gamma function (lower integral)
double polynomialIntegral(DoubleArray coeffs, int nCoeffs, int lowestOrder, double xMin, double xMax)
In pdfMode, a coefficient for the constant term of 1.0 is implied if lowestOrder > 0.
double logNormalIntegral(double xMin, double xMax, double m0, double k)
double gaussianIntegral(double xMin, double xMax, double mean, double sigma)
Function to calculate the integral of an un-normalized RooGaussian over x.
double flexibleInterp(unsigned int code, ParamsArray params, unsigned int n, DoubleArray low, DoubleArray high, double boundary, double nominal, int doCutoff)
double bifurGaussIntegral(double xMin, double xMax, double mean, double sigmaL, double sigmaR)
double bernstein(double x, double xmin, double xmax, DoubleArray coefs, int nCoefs)
The caller needs to make sure that there is at least one coefficient.
double constraintSum(DoubleArray comp, unsigned int compSize)
double cbShape(double m, double m0, double sigma, double alpha, double n)
double multipdf(int idx, DoubleArray pdfs)
double chebychevIntegral(DoubleArray coeffs, unsigned int nCoeffs, double xMin, double xMax, double xMinFull, double xMaxFull)
double recursiveFraction(DoubleArray a, unsigned int n)
double cbShapeIntegral(double mMin, double mMax, double m0, double sigma, double alpha, double n)
double polynomial(DoubleArray coeffs, int nCoeffs, int lowestOrder, double x)
In pdfMode, a coefficient for the constant term of 1.0 is implied if lowestOrder > 0.
double fast_fma(double x, double y, double z) noexcept
use fast FMA if available, fall back to normal arithmetic if not
double logNormalIntegralStandard(double xMin, double xMax, double mu, double sigma)
double interpolate1d(double low, double high, double val, unsigned int numBins, DoubleArray vals)
double landau(double x, double mu, double sigma)
double gaussian(double x, double mean, double sigma)
Function to evaluate an un-normalized RooGaussian.
double poisson(double x, double par)
double binomial(int n, int k)
Calculates the binomial coefficient n over k.
unsigned int uniformBinNumber(double low, double high, double val, unsigned int numBins, double coef)
double multiVarGaussian(int n, XArray x, MuArray mu, CovArray covI)
double flexibleInterpSingle(unsigned int code, double low, double high, double boundary, double nominal, double paramVal, double res)
double bernsteinIntegral(double xlo, double xhi, double xmin, double xmax, DoubleArray coefs, int nCoefs)
double chi2Asymmetric(double mu, double weight, double errLo, double errHi)
Chi-squared contribution of one bin with asymmetric (Poisson-style) data errors.
double chebychev(DoubleArray coeffs, unsigned int nCoeffs, double x_in, double xMin, double xMax)
double chi2Expected(double mu, double weight)
Chi-squared contribution of one bin with "expected" errors: .
double product(DoubleArray factors, std::size_t nFactors)
unsigned int rawBinNumber(double x, DoubleArray boundaries, std::size_t nBoundaries)
unsigned int binNumber(double x, double coef, DoubleArray boundaries, unsigned int nBoundaries, int nbins, int blo)
double chi2Symmetric(double mu, double weight, double sigma2)
Chi-squared contribution of one bin with a user-supplied symmetric error squared (e....
double logNormalStandard(double x, double sigma, double mu)
double bifurGauss(double x, double mean, double sigmaL, double sigmaR)
double ratio(double numerator, double denominator)
double approxErf(double arg)
double effProd(double eff, double pdf)
double poissonIntegral(int code, double mu, double x, double integrandMin, double integrandMax, unsigned int protectNegative)
double logNormal(double x, double k, double m0)
double stepFunctionIntegral(double xmin, double xmax, std::size_t nBins, DoubleArray boundaries, DoubleArray coefs)
double nll(double pdf, double weight, int binnedL, int doBinOffset)
double efficiency(double effFuncVal, int catIndex, int sigCatIndex)
double exponentialIntegral(double xMin, double xMax, double constant)
Double_t QuietNaN()
Returns a quiet NaN as defined by IEEE 754.
constexpr Double_t Sqrt2()
Double_t LnGamma(Double_t z)
Computation of ln[gamma(z)] for all z.
Double_t SignalingNaN()
Returns a signaling NaN as defined by IEEE 754.
constexpr Double_t TwoPi()
void binNumber_pullback(Types...)
static uint64_t sum(uint64_t i)