14#ifndef RooFit_Detail_MathFuncs_h
15#define RooFit_Detail_MathFuncs_h
32 if (
n < 0 || k < 0 ||
n < k)
37 int k1 = std::min(k,
n - k);
40 for (
double i =
k1; i > 1.; --i) {
55 }
else if (degree == 0) {
57 }
else if (degree == 1) {
60 double a1 = coefs[1] -
a0;
63 }
else if (degree == 2) {
66 double a1 = 2 * (coefs[1] -
a0);
67 double a2 = coefs[2] -
a1 -
a0;
74 double result = coefs[0] * s;
75 for (
int i = 1; i < degree; i++) {
79 result += t * coefs[degree];
87 const double arg =
x - mean;
88 const double sig =
sigma;
89 return std::exp(-0.5 * arg * arg / (sig * sig));
95 for (std::size_t i = 0; i <
nFactors; ++i) {
102inline double ratio(
double numerator,
double denominator)
104 return numerator / denominator;
107inline double bifurGauss(
double x,
double mean,
double sigmaL,
double sigmaR)
128template <
bool pdfMode = false>
132 for (
int i =
nCoeffs - 2; i >= 0; i--) {
153 for (
unsigned int i = 0;
nCoeffs != i; ++i) {
175 for (
unsigned int i = 0; i <
compSize; i++) {
181inline unsigned int uniformBinNumber(
double low,
double high,
double val,
unsigned int numBins,
double coef)
183 double binWidth = (high - low) / numBins;
184 return coef * (val >= high ? numBins - 1 : std::abs((val - low) / binWidth));
190 double const *it = std::lower_bound(boundaries, end,
x);
192 while (boundaries != it && (end == it || end == it + 1 ||
x < *it)) {
195 return it - boundaries;
203 return coef * std::max(0, tmp);
206inline double interpolate1d(
double low,
double high,
double val,
unsigned int numBins,
double const *vals)
208 double binWidth = (high - low) / numBins;
209 int idx = val >= high ? numBins - 1 : std::abs((val - low) / binWidth);
212 double central = low + (idx + 0.5) * binWidth;
213 if (val > low + 0.5 * binWidth && val < high - 0.5 * binWidth) {
216 slope = vals[idx] - vals[idx - 1];
218 slope = vals[idx + 1] - vals[idx];
220 return vals[idx] +
slope * (val - central) / binWidth;
233 }
else if (
x == 0.0) {
234 return std::exp(-par);
237 return std::exp(out);
251 }
else if (code == 1) {
254 return res * (std::pow(high / nominal, +
paramVal) - 1);
256 return res * (std::pow(low / nominal, -
paramVal) - 1);
258 }
else if (code == 2) {
260 double a = 0.5 * (high + low) - nominal;
261 double b = 0.5 * (high - low);
264 return (2 *
a +
b) * (
paramVal - 1) + high - nominal;
266 return -1 * (2 *
a -
b) * (
paramVal + 1) + low - nominal;
274 }
else if (code == 4 || code == 6) {
283 mod =
x * (high - nominal);
285 mod =
x * (nominal - low);
294 mod =
x * (S + t * A * (15 + t * t * (-10 + t * t * 3)));
303 }
else if (code == 5) {
318 double logHi = std::log(high);
319 double logLo = std::log(low);
336 double x0Sq = x0 * x0;
338 double a = 1. / (8 * x0) * (15 *
A0 - 7 * x0 *
S1 + x0 * x0 *
A2);
339 double b = 1. / (8 *
x0Sq) * (-24 + 24 *
S0 - 9 * x0 *
A1 + x0 * x0 *
S2);
340 double c = 1. / (4 *
x0Sq * x0) * (-5 *
A0 + 5 * x0 *
S1 - x0 * x0 *
A2);
341 double d = 1. / (4 *
x0Sq *
x0Sq) * (12 - 12 *
S0 + 7 * x0 *
A1 - x0 * x0 *
S2);
342 double e = 1. / (8 *
x0Sq *
x0Sq * x0) * (+3 *
A0 - 3 * x0 *
S1 + x0 * x0 *
A2);
349 return res * (
mod - 1.0);
355inline double flexibleInterp(
unsigned int code,
double const *params,
unsigned int n,
double const *low,
358 double total = nominal;
359 for (std::size_t i = 0; i <
n; ++i) {
394 if (std::abs(pdf) < 1
e-10 && std::abs(weight) < 1
e-10) {
398 return pdf - weight - weight * (std::log(pdf) - std::log(weight));
402 return -weight * std::log(pdf);
410 for (
unsigned int i = 1; i <
n; ++i) {
419 double t = (
m - m0) /
sigma;
426 return std::exp(-0.5 * t * t);
432 return a * std::pow(
r / (
b - t),
n);
444 return std::erf(arg);
498 }
else if (
xMin > mean) {
515template <
bool pdfMode = false>
522 for (
int i =
nCoeffs - 2; i >= 0; i--) {
528 max = max * std::pow(
xMax, 1 + lowestOrder);
529 min = min * std::pow(
xMin, 1 + lowestOrder);
537#if defined(FP_FAST_FMA)
538 return std::fma(
x,
y, z);
541#if defined(__clang__)
542#pragma STDC FP_CONTRACT ON
587 for (
unsigned int i = 1;
iend != i; ++i) {
618 return std::exp(-2.0 * mu);
629 const double delta = 100.0 * std::sqrt(mu);
639 const unsigned int ixMax = std::min(
integrandMax + 1, (
double)std::numeric_limits<unsigned int>::max());
657 const double ix = 1 +
x;
664 const double root2 = std::sqrt(2.);
666 double ln_k = std::abs(std::log(k));
674 const double root2 = std::sqrt(2.);
686 const double sqrt2 = 1.4142135624;
691 if (std::abs(
n - 1.0) < 1.0e-05)
694 double sig = std::abs(
sigma);
696 double tmin = (
mMin - m0) / sig;
697 double tmax = (
mMax - m0) / sig;
715 result +=
a * std::pow(
r,
n - 1) * sig * (std::log(
b - tmin) - std::log(
b - tmax));
717 result +=
a * sig / (1.0 -
n) * (std::pow(
r / (
b - tmin),
n - 1.0) - std::pow(
r / (
b - tmax),
n - 1.0));
726 term1 =
a * std::pow(
r,
n - 1) * sig * (std::log(
b - tmin) - std::log(
r));
728 term1 =
a * sig / (1.0 -
n) * (std::pow(
r / (
b - tmin),
n - 1.0) - 1.0);
749 for (
int i = 0; i <= degree; ++i) {
754 for (
int j = i;
j <= degree; ++
j) {
772 for (
int i = 0; i <
n; ++i) {
773 for (
int j = 0;
j <
n; ++
j) {
777 return std::exp(-0.5 *
result);
787 for (std::size_t i = 0; i < nBins; ++i) {
788 double a = boundaries[i];
789 double b = boundaries[i + 1];
790 out += coefs[i] * std::max(0.0, std::min(
b,
xmax) - std::max(
a,
xmin));
800namespace custom_derivatives {
810template <
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 stepFunctionIntegral(double xmin, double xmax, std::size_t nBins, double const *boundaries, double const *coefs)
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 chebychevIntegral(double const *coeffs, unsigned int nCoeffs, double xMin, double xMax, double xMinFull, double xMaxFull)
double bifurGaussIntegral(double xMin, double xMax, double mean, double sigmaL, double sigmaR)
double cbShape(double m, double m0, double sigma, double alpha, double n)
double polynomial(double const *coeffs, int nCoeffs, int lowestOrder, double x)
In pdfMode, a coefficient for the constant term of 1.0 is implied if lowestOrder > 0.
double recursiveFraction(double *a, unsigned int n)
unsigned int binNumber(double x, double coef, double const *boundaries, unsigned int nBoundaries, int nbins, int blo)
double constraintSum(double const *comp, unsigned int compSize)
double cbShapeIntegral(double mMin, double mMax, double m0, double sigma, double alpha, double n)
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 landau(double x, double mu, double sigma)
double gaussian(double x, double mean, double sigma)
Function to evaluate an un-normalized RooGaussian.
double product(double const *factors, std::size_t nFactors)
double chebychev(double *coeffs, unsigned int nCoeffs, double x_in, double xMin, double xMax)
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 flexibleInterpSingle(unsigned int code, double low, double high, double boundary, double nominal, double paramVal, double res)
double multipdf(int idx, double const *pdfs)
unsigned int rawBinNumber(double x, double const *boundaries, std::size_t nBoundaries)
double interpolate1d(double low, double high, double val, unsigned int numBins, double const *vals)
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 polynomialIntegral(double const *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 bernsteinIntegral(double xlo, double xhi, double xmin, double xmax, double *coefs, int nCoefs)
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 multiVarGaussian(int n, const double *x, const double *mu, const double *covI)
double nll(double pdf, double weight, int binnedL, int doBinOffset)
double bernstein(double x, double xmin, double xmax, double *coefs, int nCoefs)
The caller needs to make sure that there is at least one coefficient.
double efficiency(double effFuncVal, int catIndex, int sigCatIndex)
double flexibleInterp(unsigned int code, double const *params, unsigned int n, double const *low, double const *high, double boundary, double nominal, int doCutoff)
double exponentialIntegral(double xMin, double xMax, double constant)
The namespace RooFit contains mostly switches that change the behaviour of functions of PDFs (or othe...
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](http://en.wikipedia.org/wiki/NaN#Signaling_NaN).
constexpr Double_t TwoPi()
void binNumber_pullback(Types...)
static uint64_t sum(uint64_t i)