23 template <
typename CPDFApproachT>
24 explicit ICPDF(CPDFApproachT pdfApproach)
25 : pimpl_(new OwningModel<CPDFApproachT>(std::move(pdfApproach)),
26 [](void *pdfApproachBytes) {
27 using Model = OwningModel<CPDFApproachT>;
28 auto *
const model =
static_cast<Model *
>(pdfApproachBytes);
32 [](
void *pdfApproachBytes,
PartonFlavor flavor,
double x,
double mu2) ->
double {
33 using Model = OwningModel<CPDFApproachT>;
34 auto *
const model =
static_cast<Model *
>(pdfApproachBytes);
35 return model->pdf(flavor, x,
mu2);
37 pdfOperation1_([](
void *pdfApproachBytes,
double x,
double mu2,
38 std::array<double, 13> &output) ->
void {
39 using Model = OwningModel<CPDFApproachT>;
40 auto *
const model =
static_cast<Model *
>(pdfApproachBytes);
41 return model->pdf(x,
mu2, output);
43 clone_([](
void *pdfApproachBytes) ->
void * {
44 using Model = OwningModel<CPDFApproachT>;
45 auto *
const model =
static_cast<Model *
>(pdfApproachBytes);
46 return new Model(*model);
63 return pdfOperation_(pimpl_.get(), parton, x,
mu2);
77 void pdf(
double x,
double mu2, std::array<double, 13> &output)
const
79 pdfOperation1_(pimpl_.get(), x,
mu2, output);
89 : pimpl_(other.clone_(other.pimpl_.get()), other.pimpl_.get_deleter()),
90 clone_(other.clone_), pdfOperation_(other.pdfOperation_),
91 pdfOperation1_(other.pdfOperation1_)
108 swap(pimpl_, copy.pimpl_);
109 swap(clone_, copy.clone_);
110 swap(pdfOperation_, copy.pdfOperation_);
111 swap(pdfOperation1_, copy.pdfOperation1_);
120 template <
typename CPDFApproachT>
struct OwningModel
122 OwningModel(CPDFApproachT pdfApproach) : pdfApproach_(std::move(pdfApproach))
128 return pdfApproach_.pdf(flavor, x,
mu2);
130 void pdf(
double x,
double mu2, std::array<double, 13> &output)
132 return pdfApproach_.pdf(x,
mu2, output);
134 CPDFApproachT pdfApproach_;
137 using DestroyOperation = void(
void *);
138 using CloneOperation =
void *(
void *);
139 using CPDFOperation = double(
void *,
PartonFlavor,
double,
double);
140 using CPDFOperation1 = void(
void *,
double,
double, std::array<double, 13> &);
142 std::unique_ptr<void, DestroyOperation *> pimpl_;
143 CloneOperation *clone_{
nullptr};
144 CPDFOperation *pdfOperation_{
nullptr};
145 CPDFOperation1 *pdfOperation1_{
nullptr};
Interface for Collinear Parton Distribution Functions (CPDFs).
Definition: ICPDF.h:21
ICPDF(ICPDF &&other) noexcept=default
ICPDF(const ICPDF &other)
Copy constructor for ICPDF objects.
Definition: ICPDF.h:88
ICPDF & operator=(ICPDF const &other)
Assignment operator for ICPDF objects.
Definition: ICPDF.h:104
double pdf(PartonFlavor parton, double x, double mu2) const
Evaluate the CPDF for a specific flavor.
Definition: ICPDF.h:61
ICPDF & operator=(ICPDF &&other)=default
ICPDF(CPDFApproachT pdfApproach)
Definition: ICPDF.h:24
void pdf(double x, double mu2, std::array< double, 13 > &output) const
Evaluate the array of Collinear PDF values for {tbar, bbar, cbar, sbar, ubar, dbar,...
Definition: ICPDF.h:77
Definition: AllFlavorsShape.h:14
PartonFlavor
Definition: PartonUtils.h:58
int mu2
Definition: pdfset_tutorial.py:14