15 template <
typename Interpolator>
22 m_interpolator = interpolator;
24 void extrapolate(
double x,
double q2, std::array<double, DEFAULT_TOTAL_PDFS> &output)
const
31 auto *reader = m_interpolator->getReader();
34 const size_t nxknots = xVals_.size();
36 const size_t nq2knots = q2Vals_.size();
39 const double xMin = xVals_.at(0);
40 const double xMin1 = xVals_.at(1);
41 const double xMax = xVals_.at(nxknots - 1);
43 const double q2Min = q2Vals_.at(0);
44 const double q2Max1 = q2Vals_.at(nq2knots - 2);
45 const double q2Max = q2Vals_.at(nq2knots - 1);
47 double fxMin = 0, fxMin1 = 0, fq2Max = 0, fq2Max1 = 0, fq2Min = 0, fq2Min1 = 0, xpdf = 0,
52 if (x < xMin && (q2 >= q2Min && q2 <= q2Max))
55 fxMin = m_interpolator->interpolate(flavor, xMin, q2);
56 fxMin1 = m_interpolator->interpolate(flavor, xMin1, q2);
60 else if ((x >= xMin && x <= xMax) && q2 > q2Max)
63 fq2Max = m_interpolator->interpolate(flavor, x, q2Max);
64 fq2Max1 = m_interpolator->interpolate(flavor, x, q2Max1);
68 else if (x < xMin && q2 > q2Max)
71 fq2Max = m_interpolator->interpolate(flavor, xMin, q2Max);
72 fq2Max1 = m_interpolator->interpolate(flavor, xMin, q2Max1);
75 fq2Max = m_interpolator->interpolate(flavor, xMin1, q2Max);
77 m_interpolator->interpolate(flavor, xMin1, q2Max1);
83 else if (q2 < q2Min && x <= xMax)
91 fxMin = m_interpolator->interpolate(flavor, xMin, q2Min);
93 m_interpolator->interpolate(flavor, xMin1, q2Min);
96 fxMin = m_interpolator->interpolate(flavor, xMin,
98 fxMin1 = m_interpolator->interpolate(flavor, xMin1,
107 fq2Min = m_interpolator->interpolate(flavor, x, q2Min);
108 fq2Min1 = m_interpolator->interpolate(flavor, x,
120 if (abs(fq2Min) >= 1e-5)
125 anom = std::max(-2.5, (fq2Min1 - fq2Min) / fq2Min / 0.01);
133 xpdf = fq2Min * std::pow(q2 / q2Min, anom * q2 / q2Min + 1.0 - q2 / q2Min);
137 std::ostringstream oss;
138 oss <<
"Error in LHAPDF::ContinuationExtrapolator, x > "
139 "xMax (last x knot): ";
140 oss << std::scientific << x <<
" > " << xMax;
141 throw std::runtime_error(oss.str());
144 throw std::runtime_error(
"We shouldn't be able to get here!");
156 auto *reader = m_interpolator->getReader();
159 const size_t nxknots = xVals_.size();
161 const size_t nq2knots = q2Vals_.size();
163 const double xMin = xVals_.at(0);
164 const double xMin1 = xVals_.at(1);
165 const double xMax = xVals_.at(nxknots - 1);
167 const double q2Min = q2Vals_.at(0);
168 const double q2Max1 = q2Vals_.at(nq2knots - 2);
169 const double q2Max = q2Vals_.at(nq2knots - 1);
171 double fxMin, fxMin1, fq2Max, fq2Max1, fq2Min, fq2Min1, xpdf, anom;
173 if (x < xMin && (q2 >= q2Min && q2 <= q2Max))
176 fxMin = m_interpolator->interpolate(flavor, xMin, q2);
177 fxMin1 = m_interpolator->interpolate(flavor, xMin1, q2);
181 else if ((x >= xMin && x <= xMax) && q2 > q2Max)
184 fq2Max = m_interpolator->interpolate(flavor, x, q2Max);
185 fq2Max1 = m_interpolator->interpolate(flavor, x, q2Max1);
189 else if (x < xMin && q2 > q2Max)
192 fq2Max = m_interpolator->interpolate(flavor, xMin, q2Max);
193 fq2Max1 = m_interpolator->interpolate(flavor, xMin, q2Max1);
196 fq2Max = m_interpolator->interpolate(flavor, xMin1, q2Max);
197 fq2Max1 = m_interpolator->interpolate(flavor, xMin1, q2Max1);
203 else if (q2 < q2Min && x <= xMax)
211 fxMin = m_interpolator->interpolate(flavor, xMin, q2Min);
212 fxMin1 = m_interpolator->interpolate(flavor, xMin1, q2Min);
215 fxMin = m_interpolator->interpolate(flavor, xMin,
217 fxMin1 = m_interpolator->interpolate(flavor, xMin1,
226 fq2Min = m_interpolator->interpolate(flavor, x, q2Min);
227 fq2Min1 = m_interpolator->interpolate(flavor, x,
239 if (abs(fq2Min) >= 1e-5)
244 anom = std::max(-2.5, (fq2Min1 - fq2Min) / fq2Min / 0.01);
252 xpdf = fq2Min * std::pow(q2 / q2Min, anom * q2 / q2Min + 1.0 - q2 / q2Min);
256 std::ostringstream oss;
257 oss <<
"Error in LHAPDF::ContinuationExtrapolator, x > "
258 "xMax (last x knot): ";
259 oss << std::scientific << x <<
" > " << xMax;
260 throw std::runtime_error(oss.str());
263 throw std::runtime_error(
"We shouldn't be able to get here!");
269 const Interpolator *m_interpolator =
nullptr;
#define DEFAULT_TOTAL_PDFS
Definition: PartonUtils.h:17
Definition: AllFlavorsShape.h:14
PartonFlavor
Definition: PartonUtils.h:58
double _extrapolateLinear(double x, double xl, double xh, double yl, double yh)
constexpr std::array< PartonFlavor, DEFAULT_TOTAL_PDFS > standardPartonFlavors
Definition: PartonUtils.h:80