PDFxTMDLib  1.0.0
GenericPDF.h
Go to the documentation of this file.
1 #pragma once
16 #include <algorithm>
17 #include <array>
18 #include <iostream>
19 #include <stdexcept>
20 #include <string>
21 #include <type_traits>
22 #include <vector>
23 
24 namespace PDFxTMD
25 {
26 struct TMDPDFTag
27 {
28 };
30 {
31 };
32 
48 // Type trait to get default implementations based on tag
49 template <typename Tag> struct DefaultPDFImplementations;
50 
51 // Specialization for TMDPDFTag
53 {
57 };
58 
59 // Specialization for CollinearPDFTag
61 {
65 };
66 
67 template <typename Tag, typename Reader = typename DefaultPDFImplementations<Tag>::Reader,
68  typename Interpolator = typename DefaultPDFImplementations<Tag>::Interpolator,
69  typename Extrapolator = typename DefaultPDFImplementations<Tag>::Extrapolator>
71 {
72  public:
73  GenericPDF(const std::string &pdfName, int setNumber)
74  : m_pdfName(pdfName), m_setNumber(setNumber)
75  {
76  loadStandardInfo();
77  loadData();
78  }
79  ~GenericPDF() = default;
87  double pdf(PartonFlavor flavor, double x, double mu2) const
88  {
89  if constexpr (std::is_same_v<Tag, CollinearPDFTag>)
90  {
91  if (isInRange(m_reader, x, mu2))
92  return m_interpolator.interpolate(flavor, x, mu2);
93  return m_extrapolator.extrapolate(flavor, x, mu2);
94  }
95  else
96  {
97  throw std::logic_error(
98  "pdf(PartonFlavor, double, double) is not supported for this tag.");
99  }
100  }
113  void pdf(double x, double mu2, std::array<double, DEFAULT_TOTAL_PDFS> &output) const
114  {
115  if constexpr (std::is_same_v<Tag, CollinearPDFTag>)
116  {
117  if (isInRange(m_reader, x, mu2))
118  return m_interpolator.interpolate(x, mu2, output);
119  return m_extrapolator.extrapolate(x, mu2, output);
120  }
121  else
122  {
123  throw std::logic_error("pdf(double, double, std::array<double, DEFAULT_TOTAL_PDFS>&) "
124  "is not supported for this tag.");
125  }
126  }
127  GenericPDF(GenericPDF &&other) noexcept
128  : m_pdfName(std::move(other.m_pdfName)), m_setNumber(other.m_setNumber),
129  m_reader(std::move(other.m_reader)), m_interpolator(std::move(other.m_interpolator)),
130  m_extrapolator(std::move(other.m_extrapolator)), m_stdInfo(std::move(other.m_stdInfo))
131  {
132  m_interpolator.initialize(&m_reader);
133  if constexpr (std::is_base_of_v<IcAdvancedPDFExtrapolator<Extrapolator>, Extrapolator>)
134  {
135  m_extrapolator.setInterpolator(&m_interpolator);
136  }
137  }
138  GenericPDF &operator=(GenericPDF &&other) noexcept
139  {
140  if (this == &other)
141  {
142  return *this;
143  }
144  m_pdfName = std::move(other.m_pdfName);
145  m_setNumber = other.m_setNumber;
146  m_reader = std::move(other.m_reader);
147  m_interpolator = std::move(other.m_interpolator);
148  m_extrapolator = std::move(other.m_extrapolator);
149  m_stdInfo = std::move(other.m_stdInfo);
150 
151  // Re-initialize internal dependencies
152  m_interpolator.initialize(&m_reader);
153  if constexpr (std::is_base_of_v<IcAdvancedPDFExtrapolator<Extrapolator>, Extrapolator>)
154  {
155  m_extrapolator.setInterpolator(&m_interpolator);
156  }
157  return *this;
158  }
159 
160  GenericPDF(const GenericPDF &other)
161  : m_pdfName(other.m_pdfName), m_setNumber(other.m_setNumber), m_reader(other.m_reader),
162  m_interpolator(other.m_interpolator), m_extrapolator(other.m_extrapolator),
163  m_stdInfo(other.m_stdInfo)
164  {
165  m_interpolator.initialize(&m_reader);
166  if constexpr (std::is_base_of_v<IcAdvancedPDFExtrapolator<Extrapolator>, Extrapolator>)
167  {
168  m_extrapolator.setInterpolator(&m_interpolator);
169  }
170  }
172  {
173  if (this == &other)
174  {
175  return *this;
176  }
177  m_pdfName = other.m_pdfName;
178  m_setNumber = other.m_setNumber;
179  m_reader = other.m_reader;
180  m_interpolator = other.m_interpolator;
181  m_extrapolator = other.m_extrapolator;
182  m_stdInfo = other.m_stdInfo;
183 
184  // Re-initialize internal dependencies
185  m_interpolator.initialize(&m_reader);
186  if constexpr (std::is_base_of_v<IcAdvancedPDFExtrapolator<Extrapolator>, Extrapolator>)
187  {
188  m_extrapolator.setInterpolator(&m_interpolator);
189  }
190  return *this;
191  }
199  double tmd(PartonFlavor flavor, double x, double kt2, double mu2)
200  {
201  if constexpr (std::is_same_v<Tag, TMDPDFTag>)
202  {
203  if (isInRange(m_reader, x, kt2, mu2))
204  return m_interpolator.interpolate(flavor, x, kt2, mu2);
205 
206  return m_extrapolator.extrapolate(flavor, x, kt2, mu2);
207  }
208  else
209  {
210  throw std::logic_error(
211  "pdf(double, double, std::array<double, 13>&) is not supported for this tag.");
212  }
213  }
226  void tmd(double x, double kt2, double mu2, std::array<double, DEFAULT_TOTAL_PDFS> &output)
227  {
228  if constexpr (std::is_same_v<Tag, TMDPDFTag>)
229  {
230  isInRange(m_reader, x, kt2, mu2) ? m_interpolator.interpolate(x, kt2, mu2, output)
231  : m_extrapolator.extrapolate(x, kt2, mu2, output);
232  }
233  else
234  {
235  throw std::logic_error(
236  "pdf(double, double, std::array<double, 13>&) is not supported for this tag.");
237  }
238  }
245  {
246  return m_stdInfo;
247  }
248 
249  private:
250  void loadStandardInfo()
251  {
252  auto infoPathPair = StandardInfoFilePath(m_pdfName);
253  if (infoPathPair.second != ErrorType::None)
254  throw FileLoadException("Unable to find info file of PDF set " + m_pdfName);
255  if constexpr (std::is_same_v<Tag, TMDPDFTag>)
256  {
257  auto pdfStandardInfo = YamlStandardPDFInfoReader(*infoPathPair.first);
258  if (pdfStandardInfo.second != ErrorType::None)
259  throw InvalidFormatException("Invalid standard info file " + *infoPathPair.first);
260  m_stdInfo = *pdfStandardInfo.first;
261  }
262  else if constexpr (std::is_same_v<Tag, CollinearPDFTag>)
263  {
264  auto pdfStandardInfo = YamlStandardPDFInfoReader(*infoPathPair.first);
265  if (pdfStandardInfo.second != ErrorType::None)
266  throw InvalidFormatException("Invalid standard info file " + *infoPathPair.first);
267  m_stdInfo = *pdfStandardInfo.first;
268  }
269  else
270  {
271  static_assert(!std::is_same_v<Tag, Tag>, "Unsupported Tag");
272  }
273  }
274  void loadData()
275  {
276  m_reader.read(m_pdfName, m_setNumber);
277  m_interpolator.initialize(&m_reader);
278  if constexpr (std::is_same_v<Tag, CollinearPDFTag>)
279  {
280  if constexpr (std::is_base_of_v<IcAdvancedPDFExtrapolator<Extrapolator>, Extrapolator>)
281  {
282  m_extrapolator.setInterpolator(&m_interpolator);
283  }
284  }
285  }
286  std::string m_pdfName;
287  int m_setNumber;
288  Reader m_reader;
289  Interpolator m_interpolator;
290  Extrapolator m_extrapolator;
291  YamlStandardTMDInfo m_stdInfo;
292 };
293 
294 // Convenient type aliases for common use cases
297 
298 } // namespace PDFxTMD
Definition: CContinuationExtrapolator.h:18
Definition: CDefaultLHAPDFFileReader.h:10
Definition: CLHAPDFBicubicInterpolator.h:12
Definition: Exception.h:23
Definition: GenericPDF.h:71
double tmd(PartonFlavor flavor, double x, double kt2, double mu2)
Evaluates the TMD PDF value for a specific parton flavor.
Definition: GenericPDF.h:199
void pdf(double x, double mu2, std::array< double, DEFAULT_TOTAL_PDFS > &output) const
Evaluate the array of Collinear PDF values for {tbar, bbar, cbar, sbar, ubar, dbar,...
Definition: GenericPDF.h:113
void tmd(double x, double kt2, double mu2, std::array< double, DEFAULT_TOTAL_PDFS > &output)
Evaluates the vector of TMD PDF values for {tbar, bbar, cbar, sbar, ubar, dbar, g,...
Definition: GenericPDF.h:226
GenericPDF(const GenericPDF &other)
Definition: GenericPDF.h:160
GenericPDF(const std::string &pdfName, int setNumber)
Definition: GenericPDF.h:73
GenericPDF(GenericPDF &&other) noexcept
Definition: GenericPDF.h:127
YamlStandardTMDInfo getStdPDFInfo() const
Retrieves the standard PDF info.
Definition: GenericPDF.h:244
GenericPDF & operator=(GenericPDF &&other) noexcept
Definition: GenericPDF.h:138
GenericPDF & operator=(const GenericPDF &other)
Definition: GenericPDF.h:171
double pdf(PartonFlavor flavor, double x, double mu2) const
Retrieves the collinear PDF value for a specific parton flavor.
Definition: GenericPDF.h:87
Definition: IExtrapolator.h:39
Definition: Exception.h:48
Definition: TDefaultLHAPDF_TMDReader.h:10
Definition: TTrilinearInterpolator.h:16
Definition: TZeroExtrapolator.h:10
Definition: AllFlavorsShape.h:14
std::pair< std::optional< YamlStandardTMDInfo >, ErrorType > YamlStandardPDFInfoReader(const std::string &yamlInfoPath)
bool isInRange(const Reader &reader, double x, double mu2)
Definition: PDFUtils.h:23
PartonFlavor
Definition: PartonUtils.h:58
std::pair< std::optional< std::string >, ErrorType > StandardInfoFilePath(const std::string &pdfSetName)
int mu2
Definition: pdfset_tutorial.py:14
int kt2
Definition: pdfset_tutorial.py:15
Definition: GenericPDF.h:30
Tag types for PDF implementations.
Definition: GenericPDF.h:49
Definition: GenericPDF.h:27
Definition: YamlStandardPDFInfo.h:26