67 _x(
"x",
"Dependent", this,
x),
68 _coefList(
"coefList",
"List of coefficients", this),
73 coutE(InputArguments) <<
"RooLegacyExpPoly::ctor(" <<
GetName()
74 <<
") WARNING: lowestOrder must be >=0, setting value to 0" << std::endl;
86 _x(
"x", this, other.
_x),
102 std::vector<double> coefs;
112 for (
size_t i = 0; i < sz; ++i) {
113 retval += coefs[i] * xpow;
117 if (std::numeric_limits<double>::max_exponent < retval) {
118 coutE(InputArguments) <<
"RooLegacyExpPoly::evaluateLog(" <<
GetName() <<
") ERROR: exponent at " <<
x
119 <<
" larger than allowed maximum, result will be infinite! " << retval <<
" > "
131 std::vector<std::span<const double>> vars;
133 vars.push_back(ctx.
at(
_x));
135 std::vector<double> coefVals;
137 vars.push_back(ctx.
at(coef));
140 std::array<double, 2> args{
static_cast<double>(
_lowestOrder),
static_cast<double>(
_coefList.size())};
152 double max = std::numeric_limits<double>::max_exponent / sz;
154 std::vector<double> coefs;
159 const double xmax =
x->getMax();
161 for (
size_t i = 0; i < sz; ++i) {
162 double thismax = max / xmaxpow;
180 const double val = std::exp(logval);
181 if (std::isinf(val)) {
182 coutE(InputArguments) <<
"RooLegacyExpPoly::evaluate(" <<
GetName()
183 <<
") ERROR: result of exponentiation is infinite! exponent was " << logval << std::endl;
212#define PI TMath::Pi()
215double deltaerf(
long double x1,
long double x2)
221 double y2 = x1 > 0 ? erfc(x1) : -erfc(-x1);
222 double y1 = x2 > 0 ? erfc(x2) : -erfc(-x2);
224 std::cout <<
"WARNING in calculation of analytical integral limited by numerical precision" << std::endl;
225 std::cout <<
"x: " << x1 <<
" , " << x2 << std::endl;
226 std::cout <<
"y: " << y1 <<
" , " << y2 << std::endl;
231double deltaerfi(
double x1,
double x2)
233 std::complex<double> u1 = {x1, 0.};
234 std::complex<double> u2 = {x2, 0.};
239 std::cout <<
"WARNING in calculation of analytical integral limited by numerical precision" << std::endl;
240 std::cout <<
"x: " << x1 <<
" , " << x2 << std::endl;
241 std::cout <<
"y: " << y1 <<
" , " << y2 << std::endl;
243 return y1.imag() - y2.imag();
249 const double xmin =
_x.min(rangeName);
250 const double xmax =
_x.max(rangeName);
255 std::vector<double> coefs;
276 const double absa = std::abs(
a);
277 const double sqrta = std::sqrt(absa);
279 double d = ::deltaerf((-
b + 2 * absa *
xmax) / (2 * sqrta), (-
b + 2 * absa *
xmin) / (2 * sqrta));
280 double retval = exp(
b *
b / (4 * absa) +
c) * std::sqrt(
PI) *
d / (2 * sqrta);
283 double d = ::deltaerfi((
b + 2 * absa *
xmax) / (2 * sqrta), (
b + 2 * absa *
xmin) / (2 * sqrta));
284 double retval = exp(-
b *
b / (4 * absa) +
c) * std::sqrt(
PI) *
d / (2 * sqrta);
287 return 1. /
b * (std::exp(
b *
xmax) - exp(
b *
xmin)) * exp(
c);
300 std::stringstream ss;
307 ss << (static_cast<RooAbsReal *>(coef))->
getVal();
309 ss << coef->GetName();
311 ss <<
"*pow(" <<
_x.GetName() <<
"," << order <<
")";
RooAbsArg()
Default constructor.
RooAbsPdf()
Default constructor.
virtual double getLogVal(const RooArgSet *set=nullptr) const
Return the log of the current value with given normalization An error message is printed if the argum...
double getVal(const RooArgSet *normalisationSet=nullptr) const
Evaluate object.
bool matchArgs(const RooArgSet &allDeps, RooArgSet &analDeps, const RooArgProxy &a, const Proxies &... proxies) const
RooArgList is a container object that can hold multiple RooAbsArg objects.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
std::span< const double > at(RooAbsArg const *arg, RooAbsArg const *caller=nullptr)
std::span< double > output()
RooBatchCompute::Config config(RooAbsArg const *arg) const
int getAnalyticalIntegral(RooArgSet &allVars, RooArgSet &analVars, const char *rangeName=nullptr) const override
Interface function getAnalyticalIntergral advertises the analytical integrals that are supported.
double evaluateLog() const
RooArgList const & coefList() const
Get the coefficient list.
RooAbsReal const & x() const
Get the x variable.
double getLogVal(const RooArgSet *nset) const override
Return the log of the current value with given normalization An error message is printed if the argum...
std::string getFormulaExpression(bool expand) const
double evaluate() const override
Evaluation.
void doEval(RooFit::EvalContext &) const override
Compute multiple values of ExpPoly distribution.
double analyticalIntegral(int code, const char *rangeName=nullptr) const override
Implements the actual analytical integral(s) advertised by getAnalyticalIntegral.
int lowestOrder() const
Return the order for the first coefficient in the list.
static std::complex< double > faddeeva(std::complex< double > z)
evaluate Faddeeva function for complex argument
Variable that can be changed from the outside.
void setVal(double value) override
Set value of variable to 'value'.
void setMax(const char *name, double value, bool shared=true)
Set maximum of name range to given value.
const char * GetName() const override
Returns name of object.
void compute(Config cfg, Computer comp, std::span< double > output, VarSpan vars, ArgSpan extraArgs={})