16#ifndef LEGENDRE_NDIM_POLYNOMINAL_H_
17#define LEGENDRE_NDIM_POLYNOMINAL_H_
20#include "Math/IParamFunction.h"
25#include <boost/math/special_functions/legendre.hpp>
44 : fOrder(p.
size() - 1), fParams(p) {}
54 const
double*
Parameters() const final {
return &fParams.front(); }
58 fParams = std::vector<double>(p, p +
NPar());
61 unsigned int NPar() const final {
return fParams.size(); }
62 unsigned int NOrder()
const {
return fOrder; }
73 double DoEvalPar(
double x,
const double* p)
const final
76 for (
unsigned int iOrder{0}; iOrder <= fOrder; ++iOrder) {
77 sum += p[iOrder] * boost::math::legendre_p(iOrder,
x);
82 double DoEvalParSingle(
int i,
double x,
const double* p)
const
84 return p[
i] * boost::math::legendre_p(
i,
x);
87 unsigned int fOrder{0};
88 std::vector<double> fParams;
106 : fOrder(p.
size() - 1), fParams(p) {}
109 fParams = std::vector<double>(
NPar());
110 for (
unsigned int iOrder{0}; iOrder <= fOrder; ++iOrder) {
111 for (
unsigned int jOrder{0}; jOrder <= iOrder; ++jOrder) {
112 fParams[getFlatIdx(iOrder, jOrder)] = p(iOrder, jOrder);
118 double operator()(const
double*
x)
const
132 const double*
Parameters() const final {
return &fParams.front(); }
136 fParams = std::vector<double>(p, p +
NPar());
139 unsigned int NPar() const final
141 return fOrder * (fOrder + 1) / 2 + fOrder + 1;
143 unsigned int NDim() const final {
return 2; }
144 unsigned int NOrder()
const {
return fOrder; }
148 TMatrixD
m(fOrder + 1, fOrder + 1);
149 for (
unsigned int iOrder{0}; iOrder <= fOrder; ++iOrder) {
150 for (
unsigned int jOrder{0}; jOrder <= iOrder; ++jOrder) {
151 m(iOrder, jOrder) = fParams[getFlatIdx(iOrder, jOrder)];
169 double DoEvalPar(
const double*
x,
const double* p)
const final
172 for (
unsigned int iOrder{0}; iOrder <= fOrder; ++iOrder) {
173 for (
unsigned int jOrder{0}; jOrder <= iOrder; ++jOrder) {
174 sum += DoEvalParSingle(iOrder, jOrder,
x, p);
180 double DoEvalPar(
double x,
double y)
const
183 for (
unsigned int iOrder{0}; iOrder <= fOrder; ++iOrder) {
184 for (
unsigned int jOrder{0}; jOrder <= iOrder; ++jOrder) {
191 double DoEvalParSingle(
int i,
int j,
const double*
x,
const double* p)
const
193 return DoEvalParSingle(
i,
j,
x[0],
x[1], p);
196 double DoEvalParSingle(
int i,
int j,
double x,
double y,
197 const double* p)
const
199 return p[getFlatIdx(
i,
j)] * boost::math::legendre_p(
j,
x) *
200 boost::math::legendre_p(
i -
j,
y);
203 inline int getFlatIdx(
int i,
int j)
const {
return i * (
i + 1) / 2 +
j; }
205 unsigned int fOrder{0};
206 std::vector<double> fParams;
virtual void SetParameters(const double *p) final
unsigned int NPar() const final
~Legendre1DPolynominal() final=default
unsigned int NOrder() const
double operator()(int i, double x) const
double operator()(double x) const
ROOT::Math::IBaseFunctionOneDim * Clone() const final
Legendre1DPolynominal(Legendre1DPolynominal &&)=delete
Legendre1DPolynominal(const Legendre1DPolynominal &)=default
TObject * Clone(const char *name) const final
Legendre1DPolynominal & operator=(Legendre1DPolynominal &&)=delete
Legendre1DPolynominal(const std::vector< double > p)
const double * Parameters() const final
Legendre1DPolynominal & operator=(const Legendre1DPolynominal &)=default
Legendre1DPolynominal(unsigned int order)
Legendre1DPolynominal()=default
double operator()(double x, double y) const
Legendre2DPolynominal()=default
Legendre2DPolynominal(const TMatrixD &p)
void SetParameters(const double *p) final
unsigned int NDim() const final
Legendre2DPolynominal(const std::vector< double > &p)
unsigned int NPar() const final
TMatrixD getCoefficients() const
double operator()(int i, int j, const double *x) const
~Legendre2DPolynominal() final=default
double operator()(int i, int j, double x, double y) const
ROOT::Math::IBaseFunctionMultiDim * Clone() const final
Legendre2DPolynominal(unsigned int order)
unsigned int NOrder() const
void printCoefficients() const
TObject * Clone(const char *name) const final
const double * Parameters() const final
float sum(float s, o2::dcs::DataPointValue v)
GLuint const GLchar * name