14#ifndef RooFit_Detail_MathFuncs_h
15#define RooFit_Detail_MathFuncs_h
31 if (
n < 0 || k < 0 ||
n < k)
36 int k1 = std::min(k,
n - k);
39 for (
double i =
k1; i > 1.; --i) {
46template <
typename DoubleArray>
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));
92template <
typename DoubleArray>
96 for (std::size_t i = 0; i <
nFactors; ++i) {
103inline double ratio(
double numerator,
double denominator)
105 return numerator / denominator;
108inline double bifurGauss(
double x,
double mean,
double sigmaL,
double sigmaR)
129template <
bool pdfMode = false,
typename DoubleArray>
133 for (
int i =
nCoeffs - 2; i >= 0; i--) {
140template <
typename DoubleArray>
155 for (
unsigned int i = 0;
nCoeffs != i; ++i) {
165template <
typename DoubleArray>
176template <
typename DoubleArray>
181 #pragma clad checkpoint loop
183 for (
unsigned int i = 0; i <
compSize; i++) {
189inline unsigned int uniformBinNumber(
double low,
double high,
double val,
unsigned int numBins,
double coef)
191 double binWidth = (high - low) / numBins;
192 return coef * (val >= high ? numBins - 1 : std::abs((val - low) / binWidth));
195template <
typename DoubleArray>
201 while (boundaries != it && (end == it || end == it + 1 ||
x < *it)) {
204 return it - boundaries;
207template <
typename DoubleArray>
212 return coef * std::max(0, tmp);
215template <
typename DoubleArray>
218 double binWidth = (high - low) / numBins;
219 int idx = val >= high ? numBins - 1 : std::abs((val - low) / binWidth);
222 double central = low + (idx + 0.5) * binWidth;
223 if (val > low + 0.5 * binWidth && val < high - 0.5 * binWidth) {
226 slope = vals[idx] - vals[idx - 1];
228 slope = vals[idx + 1] - vals[idx];
230 return vals[idx] +
slope * (val - central) / binWidth;
243 }
else if (
x == 0.0) {
244 return std::exp(-par);
247 return std::exp(out);
261 }
else if (code == 1) {
264 return res * (std::pow(high / nominal, +
paramVal) - 1);
266 return res * (std::pow(low / nominal, -
paramVal) - 1);
268 }
else if (code == 2) {
270 double a = 0.5 * (high + low) - nominal;
271 double b = 0.5 * (high - low);
274 return (2 *
a +
b) * (
paramVal - 1) + high - nominal;
276 return -1 * (2 *
a -
b) * (
paramVal + 1) + low - nominal;
284 }
else if (code == 4 || code == 6) {
293 mod =
x * (high - nominal);
295 mod =
x * (nominal - low);
304 mod =
x * (S + t * A * (15 + t * t * (-10 + t * t * 3)));
313 }
else if (code == 5) {
328 double logHi = std::log(high);
329 double logLo = std::log(low);
346 double x0Sq = x0 * x0;
348 double a = 1. / (8 * x0) * (15 *
A0 - 7 * x0 *
S1 + x0 * x0 *
A2);
349 double b = 1. / (8 *
x0Sq) * (-24 + 24 *
S0 - 9 * x0 *
A1 + x0 * x0 *
S2);
350 double c = 1. / (4 *
x0Sq * x0) * (-5 *
A0 + 5 * x0 *
S1 - x0 * x0 *
A2);
351 double d = 1. / (4 *
x0Sq *
x0Sq) * (12 - 12 *
S0 + 7 * x0 *
A1 - x0 * x0 *
S2);
352 double e = 1. / (8 *
x0Sq *
x0Sq * x0) * (+3 *
A0 - 3 * x0 *
S1 + x0 * x0 *
A2);
359 return res * (
mod - 1.0);
365template <
typename ParamsArray,
typename DoubleArray>
369 double total = nominal;
371 #pragma clad checkpoint loop
373 for (std::size_t i = 0; i <
n; ++i) {
408 if (std::abs(pdf) < 1
e-10 && std::abs(weight) < 1
e-10) {
412 return pdf - weight - weight * (std::log(pdf) - std::log(weight));
416 return -weight * std::log(pdf);
420template <
typename DoubleArray>
425 for (
unsigned int i = 1; i <
n; ++i) {
434 double t = (
m - m0) /
sigma;
441 return std::exp(-0.5 * t * t);
447 return a * std::pow(
r / (
b - t),
n);
459 return std::erf(arg);
513 }
else if (
xMin > mean) {
530template <
bool pdfMode = false,
typename DoubleArray>
537 for (
int i =
nCoeffs - 2; i >= 0; i--) {
543 max = max * std::pow(
xMax, 1 + lowestOrder);
544 min = min * std::pow(
xMin, 1 + lowestOrder);
552#if defined(FP_FAST_FMA)
553 return std::fma(
x,
y, z);
556#if defined(__clang__)
557#pragma STDC FP_CONTRACT ON
563template <
typename DoubleArray>
603 for (
unsigned int i = 1;
iend != i; ++i) {
634 return std::exp(-2.0 * mu);
645 const double delta = 100.0 * std::sqrt(mu);
655 const unsigned int ixMax = std::min(
integrandMax + 1, (
double)std::numeric_limits<unsigned int>::max());
673 const double ix = 1 +
x;
680 const double root2 = std::sqrt(2.);
682 double ln_k = std::abs(std::log(k));
690 const double root2 = std::sqrt(2.);
702 const double sqrt2 = 1.4142135624;
707 if (std::abs(
n - 1.0) < 1.0e-05)
710 double sig = std::abs(
sigma);
712 double tmin = (
mMin - m0) / sig;
713 double tmax = (
mMax - m0) / sig;
736 result +=
a * sig / (1.0 -
n) * (std::pow(
r / (
b - tmin),
n - 1.0) - std::pow(
r / (
b - tmax),
n - 1.0));
746 double log_r = std::log(
r);
747 term1 =
a * std::pow(
r,
n - 1) * sig *
750 term1 =
a * sig / (1.0 -
n) * (std::pow(
r / (
b - tmin),
n - 1.0) - 1.0);
763template <
typename DoubleArray>
772 for (
int i = 0; i <= degree; ++i) {
777 for (
int j = i;
j <= degree; ++
j) {
790template <
typename DoubleArray>
796 for (
int i = 0; i <
n; ++i) {
797 for (
int j = 0;
j <
n; ++
j) {
801 return std::exp(-0.5 *
result);
807template <
typename DoubleArray>
811 for (std::size_t i = 0; i < nBins; ++i) {
812 double a = boundaries[i];
813 double b = boundaries[i + 1];
814 out += coefs[i] * std::max(0.0, std::min(
b,
xmax) - std::max(
a,
xmin));
829template <
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 multiVarGaussian(int n, DoubleArray x, DoubleArray mu, DoubleArray covI)
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 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 chebychev(DoubleArray coeffs, unsigned int nCoeffs, double x_in, double xMin, double xMax)
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 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](http://en.wikipedia.org/wiki/NaN#Signaling_NaN).
constexpr Double_t TwoPi()
void binNumber_pullback(Types...)
static uint64_t sum(uint64_t i)