7 #ifndef LHAPDF_KnotArray_H
8 #define LHAPDF_KnotArray_H
10 #include "LHAPDF/Exceptions.h"
11 #include "LHAPDF/Utils.h"
19 size_t indexbelow(
double value,
const std::vector<double>& knots) {
20 size_t i = upper_bound(knots.begin(), knots.end(), value) - knots.begin();
21 if (i == knots.size()) i -= 1;
27 int findPidInPids(
int pid,
const std::vector<int>& pids) {
28 std::vector<int>::const_iterator it = std::find(pids.begin(), pids.end(), pid);
32 return std::distance(pids.begin(), it);
49 size_t size()
const {
return _shape.back(); }
52 size_t xsize()
const {
return _shape[0]; }
55 size_t q2size()
const {
return _shape[1]; }
58 bool empty()
const {
return _grid.empty(); }
61 size_t ixbelow(
double x)
const {
return indexbelow(x, _xs); }
64 size_t iq2below(
double q2)
const {
return indexbelow(q2, _q2s); }
67 double xf(
int ix,
int iq2,
int ipid)
const {
68 return _grid[ix*_shape[2]*_shape[1] + iq2*_shape[2] + ipid];
72 const double&
coeff(
int ix,
int iq2,
int pid,
int in)
const {
73 return _coeffs[ix*(_shape[1])*_shape[2]*4 + iq2*_shape[2]*4 + pid*4 + in];
79 double xs(
int id)
const {
return _xs[id]; }
81 double logxs(
int id)
const {
return _logxs[id]; }
83 double q2s(
int id)
const {
return _q2s[id]; }
85 double logq2s(
int id)
const {
return _logq2s[id]; }
87 size_t shape(
int id)
const {
return _shape[id]; }
91 if (x < _xs.front())
return false;
92 if (x > _xs.back())
return false;
98 if (q2 < _q2s.front())
return false;
99 if (q2 > _q2s.back())
return false;
103 inline int get_pid(
int id)
const {
107 if (-6 <=
id &&
id <= 6)
return _lookup[
id + 6];
108 else if (
id == 21)
return _lookup[0 + 6];
109 else if (
id == 22)
return _lookup[13];
110 else return findPidInPids(
id, _pids);
113 bool has_pid(
int id)
const {
114 return get_pid(
id) != -1;
117 void initPidLookup();
122 const std::vector<double>&
xs()
const {
return _xs; }
124 const std::vector<double>& logxs()
const {
return _logxs; }
126 const std::vector<double>& q2s()
const {
return _q2s; }
128 const std::vector<double>& logq2s()
const {
return _logq2s; }
133 std::vector<double>& setGrid() {
return _grid; }
135 std::vector<double>& setxknots() {
return _xs; }
137 std::vector<double>& setq2knots() {
return _q2s; }
139 std::vector<size_t>& setShape(){
return _shape; }
141 std::vector<int>& setPids() {
return _pids; }
145 std::vector<size_t> _shape;
148 std::vector<double> _grid;
151 std::vector<double> _coeffs;
154 std::vector<int> _pids;
155 std::vector<int> _lookup;
158 std::vector<double> _xs;
159 std::vector<double> _q2s;
160 std::vector<double> _logxs;
161 std::vector<double> _logq2s;
177 AlphaSArray(
const std::vector<double>& q2knots,
const std::vector<double>& as)
190 const std::vector<double>&
q2s()
const {
return _q2s; }
203 size_t i = upper_bound(
q2s().begin(),
q2s().end(), q2) -
q2s().begin();
204 if (i ==
q2s().size()) i -= 1;
218 if (i ==
logq2s().size()) i -= 1;
230 const std::vector<double>&
alphas()
const {
return _as; }
int lookUpPid(int id) const
accessor to the internal 'lookup table' for the pid's
Definition: KnotArray.h:77
bool inRangeQ2(double q2) const
check if value within the boundaries of q2knots
Definition: KnotArray.h:97
const std::vector< double > & q2s() const
Q2 knot vector accessor.
Definition: KnotArray.h:190
Internal storage class for alpha_s interpolation grids.
Definition: KnotArray.h:167
std::vector< double > _q2s
List of Q2 knots.
Definition: KnotArray.h:269
bool inRangeX(double x) const
check if value within the boundaries of xknots
Definition: KnotArray.h:90
std::vector< double > _logq2s
List of log(Q2) knots.
Definition: KnotArray.h:271
size_t size() const
How many flavours are stored in the grid stored.
Definition: KnotArray.h:49
Internal storage class for PDF data point grids.
Definition: KnotArray.h:45
size_t xsize() const
How many x knots are there.
Definition: KnotArray.h:52
size_t ilogq2below(double logq2) const
Definition: KnotArray.h:212
Error for general AlphaS computation problems.
Definition: Exceptions.h:94
size_t iq2below(double q2) const
Definition: KnotArray.h:198
const std::vector< double > & xs() const
Const accessors to the internal data container.
Definition: KnotArray.h:122
bool empty() const
Is this container empty?
Definition: KnotArray.h:58
size_t iq2below(double q2) const
find the largest grid index below given q2, such that q2knots[index] < q2
Definition: KnotArray.h:64
Error for general PDF grid problems.
Definition: Exceptions.h:30
void _syncq2s()
Synchronise the log(Q2) array from the Q2 one.
Definition: KnotArray.h:263
std::vector< double > & setCoeffs()
Non const accessors for programmatic filling.
Definition: KnotArray.h:131
std::string to_str(const T &val)
Make a string representation of val.
Definition: Utils.h:61
size_t q2size() const
How many q2 knots are there.
Definition: KnotArray.h:55
size_t ixbelow(double x) const
find the largest grid index below given x, such that xknots[index] < x
Definition: KnotArray.h:61
double ddlogq_central(size_t i) const
Central (avg of forward and backward) derivative w.r.t. logQ2.
Definition: KnotArray.h:253
const std::vector< double > & logq2s() const
log(Q2) knot vector accessor
Definition: KnotArray.h:193
double ddlogq_backward(size_t i) const
Backward derivative w.r.t. logQ2.
Definition: KnotArray.h:248
double xf(int ix, int iq2, int ipid) const
convenient accessor to the grid values
Definition: KnotArray.h:67
std::vector< double > _as
List of alpha_s values across the knot array.
Definition: KnotArray.h:273
const double & coeff(int ix, int iq2, int pid, int in) const
convenient accessor to the polynomial coefficients, returns reference rather than value...
Definition: KnotArray.h:72
AlphaSArray()
Default constructor just for std::map insertability.
Definition: KnotArray.h:174
const std::vector< double > & alphas() const
alpha_s value accessor (const)
Definition: KnotArray.h:230
double ddlogq_forward(size_t i) const
Forward derivative w.r.t. logQ2.
Definition: KnotArray.h:243
AlphaSArray(const std::vector< double > &q2knots, const std::vector< double > &as)
Constructor from Q2 knot values and alpha_s values.
Definition: KnotArray.h:177