66 _x(
"x",
"Dependent", this,
x),
67 _coefList(
"coefList",
"List of coefficients", this),
68 _lowestOrder(lowestOrder)
72 coutE(InputArguments) <<
"RooExpPoly::ctor(" <<
GetName()
73 <<
") WARNING: lowestOrder must be >=0, setting value to 0" << std::endl;
79 coutE(InputArguments) <<
"RooExpPoly::ctor(" <<
GetName() <<
") ERROR: coefficient " << coef->GetName()
80 <<
" is not of type RooAbsReal" << std::endl;
92 _x(
"x", this, other._x),
93 _coefList(
"coefList", this, other._coefList),
94 _lowestOrder(other._lowestOrder)
108 std::vector<double> coefs;
118 for (
size_t i = 0; i < sz; ++i) {
119 retval += coefs[i] * xpow;
123 if (std::numeric_limits<double>::max_exponent < retval) {
124 coutE(InputArguments) <<
"RooExpPoly::evaluateLog(" <<
GetName() <<
") ERROR: exponent at " <<
x
125 <<
" larger than allowed maximum, result will be infinite! " << retval <<
" > "
139 double max = std::numeric_limits<double>::max_exponent / sz;
141 std::vector<double> coefs;
146 const double xmax =
x->getMax();
148 for (
size_t i = 0; i < sz; ++i) {
149 double thismax = max / xmaxpow;
167 const double val = exp(logval);
168 if (std::isinf(val)) {
169 coutE(InputArguments) <<
"RooExpPoly::evaluate(" <<
GetName()
170 <<
") ERROR: result of exponentiation is infinite! exponent was " << logval << std::endl;
199#define PI TMath::Pi()
202double deltaerf(
long double x1,
long double x2)
208 double y2 =
x1 > 0 ? erfc(
x1) : -erfc(-
x1);
209 double y1 =
x2 > 0 ? erfc(
x2) : -erfc(-
x2);
211 std::cout <<
"WARNING in calculation of analytical integral limited by numerical precision" << std::endl;
212 std::cout <<
"x: " <<
x1 <<
" , " <<
x2 << std::endl;
213 std::cout <<
"y: " <<
y1 <<
" , " <<
y2 << std::endl;
218double deltaerfi(
double x1,
double x2)
220 std::complex<double> u1 = {
x1, 0.};
221 std::complex<double> u2 = {
x2, 0.};
226 std::cout <<
"WARNING in calculation of analytical integral limited by numerical precision" << std::endl;
227 std::cout <<
"x: " <<
x1 <<
" , " <<
x2 << std::endl;
228 std::cout <<
"y: " <<
y1 <<
" , " <<
y2 << std::endl;
230 return y1.imag() -
y2.imag();
241 std::vector<double> coefs;
262 const double absa = std::abs(
a);
263 const double sqrta = std::sqrt(absa);
265 double d = ::deltaerf((-
b + 2 * absa *
xmax) / (2 * sqrta), (-
b + 2 * absa *
xmin) / (2 * sqrta));
266 double retval = exp(
b *
b / (4 * absa) +
c) * std::sqrt(
PI) *
d / (2 * sqrta);
269 double d = ::deltaerfi((
b + 2 * absa *
xmax) / (2 * sqrta), (
b + 2 * absa *
xmin) / (2 * sqrta));
270 double retval = exp(-
b *
b / (4 * absa) +
c) * std::sqrt(
PI) *
d / (2 * sqrta);
273 return 1. /
b * (std::exp(
b *
xmax) - exp(
b *
xmin)) * exp(
c);
286 std::stringstream ss;
295 ss << coef->GetName();
296 ss <<
"*pow(" <<
_x.
GetName() <<
"," << order <<
")";
Option_t Option_t TPoint TPoint const char x2
Option_t Option_t TPoint TPoint const char x1
Option_t Option_t TPoint TPoint const char y2
Option_t Option_t TPoint TPoint const char y1
Storage_t::size_type size() const
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...
const RooArgSet * nset() const
RooAbsReal is the common abstract base class for objects that represent a real value and implements f...
double getVal(const RooArgSet *normalisationSet=nullptr) const
Evaluate object.
bool matchArgs(const RooArgSet &allDeps, RooArgSet &numDeps, const RooArgProxy &a) const
Utility function for use in getAnalyticalIntegral().
RooArgList is a container object that can hold multiple RooAbsArg objects.
RooAbsArg * at(Int_t idx) const
Return object at given index, or nullptr if index is out of range.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
bool add(const RooAbsArg &var, bool valueServer, bool shapeServer, bool silent)
Overloaded RooCollection_t::add() method insert object into set and registers object as server to own...
RooExpPoly implements a polynomial PDF of the form.
double evaluate() const override
Evaluation.
double evaluateLog() const
std::string getFormulaExpression(bool expand) const
int lowestOrder() const
Return the order for the first coefficient in the list.
double analyticalIntegral(int code, const char *rangeName=nullptr) const override
Implements the actual analytical integral(s) advertised by getAnalyticalIntegral.
int getAnalyticalIntegral(RooArgSet &allVars, RooArgSet &analVars, const char *rangeName=nullptr) const override
Interface function getAnalyticalIntergral advertises the analytical integrals that are supported.
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...
RooAbsReal const & x() const
Get the x variable.
RooArgList const & coefList() const
Get the coefficient list.
static std::complex< double > faddeeva(std::complex< double > z)
evaluate Faddeeva function for complex argument
RooRealVar represents a 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)
Set maximum of name range to given value.
double max(const char *rname=nullptr) const
Query upper limit of range. This requires the payload to be RooAbsRealLValue or derived.
double min(const char *rname=nullptr) const
Query lower limit of range. This requires the payload to be RooAbsRealLValue or derived.
const char * GetName() const override
Returns name of object.