42 inline double a(
int p,
int l,
int m) {
45 return p%2==0 ?
r : -
r ;
48 void throwIfNoMathMore() {
49#ifndef R__HAS_MATHMORE
50 throw std::runtime_error(
"RooLegendre needs functions from MathMore. It is not available in this root build.");
54 void checkCoeffs(
int m1,
int l1,
int m2,
int l2) {
55 if (m1 < 0 || m2 < 0) {
56 throw std::invalid_argument(
"RooLegendre: m coefficients need to be >= 0.");
58 if (l1 < m1 || l2 < m2) {
59 throw std::invalid_argument(
"RooLegendre: m coefficients need to be smaller than corresponding l.");
67 _l1(1),_m1(1),_l2(0),_m2(0)
78 , _ctheta(
"ctheta",
"ctheta", this, ctheta)
79 , _l1(
l),_m1(
m),_l2(0),_m2(0)
90 , _ctheta(
"ctheta",
"ctheta", this, ctheta)
91 , _l1(l1),_m1(m1),_l2(l2),_m2(m2)
102 , _ctheta(
"ctheta", this, other._ctheta)
103 , _l1(other._l1), _m1(other._m1)
104 , _l2(other._l2), _m2(other._m2)
113#ifdef R__HAS_MATHMORE
115 double ctheta = std::max(-1., std::min((
double)
_ctheta, +1.));
132void compute(
size_t batchSize,
const int l1,
const int m1,
const int l2,
const int m2,
133 double * __restrict
output,
134 double const * __restrict TH)
136#ifdef R__HAS_MATHMORE
137 double legendre1=1.0, legendreMinus1=1.0;
147 for (
size_t i=0; i<batchSize; i++) {
149 output[i] = legendreMinus1;
150 }
else if (TH[i] >= 1.0) {
173 size_t batchSize = cthetaData.
size();
185 return range == 0 || strlen(range) == 0
186 ? std::fabs(
x.min() + 1.) < 1.e-8 && std::fabs(
x.max() - 1.) < 1.e-8
187 : std::fabs(
x.min(range) + 1.) < 1.e-8 && std::fabs(
x.max(range) - 1.) < 1.e-8;
218 for (
int p1=0; 2*p1 <=
_l1-
_m1 ;++p1) {
220 for (
int p2=0; 2*p2 <=
_l2-
_m2 ; ++p2) {
234 if (
_m1==0&&
_m2==0)
return 1;
236 if (
_l1<3&&
_l2<3)
return 1;
241 inline double maxSingle(
int i,
int j) {
249 static const double m2[3] = { 3,3 };
double pow(double, double)
typedef void((*Func_t)())
RooAbsReal is the common abstract base class for objects that represent a real value and implements f...
virtual RooSpan< const double > getValues(RooBatchCompute::RunContext &evalData, const RooArgSet *normSet=nullptr) const
by this change, please consult the release notes for ROOT 6.24 for guidance on how to make this trans...
Bool_t matchArgs(const RooArgSet &allDeps, RooArgSet &numDeps, const RooArgProxy &a) const
Utility function for use in getAnalyticalIntegral().
RooArgSet is a container object that can hold multiple RooAbsArg objects.
Compute the associated Legendre polynomials using ROOT::Math::assoc_legendre().
virtual Int_t getAnalyticalIntegral(RooArgSet &allVars, RooArgSet &analVars, const char *rangeName=0) const
Interface function getAnalyticalIntergral advertises the analytical integrals that are supported.
Double_t evaluate() const
Note: P_0^0 = 1, so P_l^m = P_l^m P_0^0.
virtual Double_t analyticalIntegral(Int_t code, const char *rangeName=0) const
this was verified to match mathematica for l1 in [0,2], m1 in [0,l1], l2 in [l1,4],...
virtual Double_t maxVal(Int_t code) const
Return maximum value for set of observables identified by code assigned in getMaxVal.
virtual Int_t getMaxVal(const RooArgSet &vars) const
Advertise capability to determine maximum value of function for given set of observables.
RooSpan< double > evaluateSpan(RooBatchCompute::RunContext &evalData, const RooArgSet *normSet) const
Evaluate this object for a batch/span of data points.
A simple container to hold a batch of data values.
constexpr std::span< T >::pointer data() const
constexpr std::span< T >::index_type size() const noexcept
double assoc_legendre(unsigned l, unsigned m, double x)
Computes the associated Legendre polynomials.
double legendre(unsigned l, unsigned m, double x)
Double_t Factorial(Int_t i)
Compute factorial(n).
Double_t Gamma(Double_t z)
Computation of gamma(z) for all z.
This struct enables passing computation data around between elements of a computation graph.
RooSpan< double > makeBatch(const RooAbsReal *owner, std::size_t size)
Create a writable batch.
static void output(int code)