PDFxTMDLib 2.0.0
Loading...
Searching...
No Matches
GenericPDF.h
Go to the documentation of this file.
1#pragma once
2#include "PDFxTMDLib/Common/ConfigWrapper.h"
3#include "PDFxTMDLib/Common/Exception.h"
4#include "PDFxTMDLib/Common/PDFUtils.h"
5#include "PDFxTMDLib/Common/PartonUtils.h"
6#include "PDFxTMDLib/Implementation/Extrapolator/Collinear/DPD/CDPDZeroExtrapolator.h"
7#include "PDFxTMDLib/Implementation/Extrapolator/Collinear/SPDF/CContinuationExtrapolator.h"
8#include "PDFxTMDLib/Implementation/Extrapolator/TMD/SPDF/TZeroExtrapolator.h"
9#include "PDFxTMDLib/Implementation/Interpolator/Collinear/DPD/CPDFxTMDDPDInterpolator.h"
10#include "PDFxTMDLib/Implementation/Interpolator/Collinear/SPDF/CLHAPDFBicubicInterpolator.h"
11#include "PDFxTMDLib/Implementation/Interpolator/TMD/SPDF/TTrilinearInterpolator.h"
12#include "PDFxTMDLib/Implementation/Reader/Collinear/DPD/CDefaultDPDReader.h"
13#include "PDFxTMDLib/Implementation/Reader/Collinear/SPDF/CDefaultLHAPDFFileReader.h"
14#include "PDFxTMDLib/Implementation/Reader/TMD/SPDF/TDefaultLHAPDF_TMDReader.h"
19#include <PDFxTMDLib/Common/YamlMetaInfo/YamlStandardPDFInfo.h>
20#include <algorithm>
21#include <array>
22#include <iostream>
23#include <stdexcept>
24#include <string>
25#include <type_traits>
26#include <vector>
27
28namespace PDFxTMD
29{
31{
32};
34{
35};
37{
38};
39
55// Type trait to get default implementations based on tag
56template <typename Tag> struct DefaultPDFImplementations;
57
58// Specialization for TMDPDFTag
60{
61 using Reader = TDefaultLHAPDF_TMDReader;
62 using Interpolator = TTrilinearInterpolator<Reader>;
63 using Extrapolator = TZeroExtrapolator;
64};
65
66// Specialization for CollinearPDFTag
68{
69 using Reader = CDefaultLHAPDFFileReader;
70 using Interpolator = CLHAPDFBicubicInterpolator<Reader>;
71 using Extrapolator = CContinuationExtrapolator<CLHAPDFBicubicInterpolator<Reader>>;
72};
73
75{
76 using Reader = CDefaultDPDReader;
77 using Interpolator = CPDFxTMDDPDInterpolator<Reader>;
78 using Extrapolator = CDPDZeroExtrapolator;
79};
80
81template <typename Tag, typename Reader = typename DefaultPDFImplementations<Tag>::Reader,
82 typename Interpolator = typename DefaultPDFImplementations<Tag>::Interpolator,
83 typename Extrapolator = typename DefaultPDFImplementations<Tag>::Extrapolator>
85{
86 public:
87 GenericPDF(const std::string &pdfName, int setNumber)
88 : m_pdfName(pdfName), m_setNumber(setNumber)
89 {
90 loadStandardInfo();
91 loadData();
92 }
93 ~GenericPDF() = default;
101 double pdf(PartonFlavor flavor, double x, double mu2) const
102 {
103 if constexpr (std::is_same_v<Tag, CollinearPDFTag>)
104 {
105 if (isInRange(m_reader, x, mu2))
106 return m_interpolator.interpolate(flavor, x, mu2);
107 return m_extrapolator.extrapolate(flavor, x, mu2);
108 }
109 else
110 {
111 throw std::logic_error(
112 "pdf(PartonFlavor, double, double) is not supported for this tag.");
113 }
114 }
127 void pdf(double x, double mu2, std::array<double, DEFAULT_TOTAL_PDFS> &output) const
128 {
129 if constexpr (std::is_same_v<Tag, CollinearPDFTag>)
130 {
131 if (isInRange(m_reader, x, mu2))
132 return m_interpolator.interpolate(x, mu2, output);
133 return m_extrapolator.extrapolate(x, mu2, output);
134 }
135 else
136 {
137 throw std::logic_error("pdf(double, double, std::array<double, DEFAULT_TOTAL_PDFS>&) "
138 "is not supported for this tag.");
139 }
140 }
141 GenericPDF(GenericPDF &&other) noexcept
142 : m_pdfName(std::move(other.m_pdfName)), m_setNumber(other.m_setNumber),
143 m_reader(std::move(other.m_reader)), m_interpolator(std::move(other.m_interpolator)),
144 m_extrapolator(std::move(other.m_extrapolator)), m_stdInfo(std::move(other.m_stdInfo))
145 {
146 m_interpolator.initialize(&m_reader);
147 if constexpr (std::is_base_of_v<IcAdvancedPDFExtrapolator<Extrapolator>, Extrapolator>)
148 {
149 m_extrapolator.setInterpolator(&m_interpolator);
150 }
151 }
152 GenericPDF &operator=(GenericPDF &&other) noexcept
153 {
154 if (this == &other)
155 {
156 return *this;
157 }
158 m_pdfName = std::move(other.m_pdfName);
159 m_setNumber = other.m_setNumber;
160 m_reader = std::move(other.m_reader);
161 m_interpolator = std::move(other.m_interpolator);
162 m_extrapolator = std::move(other.m_extrapolator);
163 m_stdInfo = std::move(other.m_stdInfo);
164
165 // Re-initialize internal dependencies
166 m_interpolator.initialize(&m_reader);
167 if constexpr (std::is_base_of_v<IcAdvancedPDFExtrapolator<Extrapolator>, Extrapolator>)
168 {
169 m_extrapolator.setInterpolator(&m_interpolator);
170 }
171 return *this;
172 }
173
174 GenericPDF(const GenericPDF &other)
175 : m_pdfName(other.m_pdfName), m_setNumber(other.m_setNumber), m_reader(other.m_reader),
176 m_interpolator(other.m_interpolator), m_extrapolator(other.m_extrapolator),
177 m_stdInfo(other.m_stdInfo)
178 {
179 m_interpolator.initialize(&m_reader);
180 if constexpr (std::is_base_of_v<IcAdvancedPDFExtrapolator<Extrapolator>, Extrapolator>)
181 {
182 m_extrapolator.setInterpolator(&m_interpolator);
183 }
184 }
186 {
187 if (this == &other)
188 {
189 return *this;
190 }
191 m_pdfName = other.m_pdfName;
192 m_setNumber = other.m_setNumber;
193 m_reader = other.m_reader;
194 m_interpolator = other.m_interpolator;
195 m_extrapolator = other.m_extrapolator;
196 m_stdInfo = other.m_stdInfo;
197
198 // Re-initialize internal dependencies
199 m_interpolator.initialize(&m_reader);
200 if constexpr (std::is_base_of_v<IcAdvancedPDFExtrapolator<Extrapolator>, Extrapolator>)
201 {
202 m_extrapolator.setInterpolator(&m_interpolator);
203 }
204 return *this;
205 }
213 double tmd(PartonFlavor flavor, double x, double kt2, double mu2)
214 {
215 if constexpr (std::is_same_v<Tag, TMDPDFTag>)
216 {
217 if (isInRange(m_reader, x, kt2, mu2))
218 return m_interpolator.interpolate(flavor, x, kt2, mu2);
219
220 return m_extrapolator.extrapolate(flavor, x, kt2, mu2);
221 }
222 else
223 {
224 throw std::logic_error(
225 "pdf(double, double, std::array<double, 13>&) is not supported for this tag.");
226 }
227 }
240 void tmd(double x, double kt2, double mu2, std::array<double, DEFAULT_TOTAL_PDFS> &output)
241 {
242 if constexpr (std::is_same_v<Tag, TMDPDFTag>)
243 {
244 isInRange(m_reader, x, kt2, mu2) ? m_interpolator.interpolate(x, kt2, mu2, output)
245 : m_extrapolator.extrapolate(x, kt2, mu2, output);
246 }
247 else
248 {
249 throw std::logic_error(
250 "pdf(double, double, std::array<double, 13>&) is not supported for this tag.");
251 }
252 }
263 double dpd(PartonFlavor flavor1, PartonFlavor flavor2, double x1, double mu1_2, double x2,
264 double mu2_2)
265 {
266 if constexpr (std::is_same_v<Tag, CollinearDPDTag>)
267 {
268 // note: my current interpolator supports the case where x is larger than the greatest x
269 // in the grid. it should be handeled later.But is enough for most of the analysis.
270 // because x > 0.97.. has zero contriution in most cases
271 if (isInRange(m_reader, x1, mu1_2) && isInRange(m_reader, x2, mu2_2))
272 return m_interpolator.interpolate(flavor1, flavor2, x1, mu1_2, x2, mu2_2);
273 return m_extrapolator.extrapolate(flavor1, flavor2, x1, mu1_2, x2, mu2_2);
274 }
275 else
276 {
277 throw std::logic_error(
278 "pdf(PartonFlavor, double, double) is not supported for this tag.");
279 }
280 }
286 YamlStandardTMDInfo getStdPDFInfo() const
287 {
288 return m_stdInfo;
289 }
290
291 private:
292 void loadStandardInfo()
293 {
294 auto infoPathPair = StandardInfoFilePath(m_pdfName);
295 if (infoPathPair.second != ErrorType::None)
296 throw FileLoadException("Unable to find info file of PDF set " + m_pdfName);
297 if constexpr (std::is_same_v<Tag, TMDPDFTag> || std::is_same_v<Tag, CollinearPDFTag> ||
298 std::is_same_v<Tag, CollinearDPDTag>)
299 {
300 auto pdfStandardInfo = YamlStandardPDFInfoReader(*infoPathPair.first);
301 if (pdfStandardInfo.second != ErrorType::None)
302 throw InvalidFormatException("Invalid standard info file " + *infoPathPair.first);
303 m_stdInfo = *pdfStandardInfo.first;
304 }
305 else
306 {
307 static_assert(!std::is_same_v<Tag, Tag>, "Unsupported Tag");
308 }
309 }
310 void loadData()
311 {
312 m_reader.read(m_pdfName, m_setNumber);
313 m_interpolator.initialize(&m_reader);
314 if constexpr (std::is_same_v<Tag, CollinearPDFTag>)
315 {
316 if constexpr (std::is_base_of_v<IcAdvancedPDFExtrapolator<Extrapolator>, Extrapolator>)
317 {
318 m_extrapolator.setInterpolator(&m_interpolator);
319 }
320 }
321 }
322 std::string m_pdfName;
323 int m_setNumber;
324 Reader m_reader;
325 Interpolator m_interpolator;
326 Extrapolator m_extrapolator;
327 YamlStandardTMDInfo m_stdInfo;
328};
329
330// Convenient type aliases for common use cases
334
335} // namespace PDFxTMD
Definition GenericPDF.h:85
GenericPDF & operator=(const GenericPDF &other)
Definition GenericPDF.h:185
double tmd(PartonFlavor flavor, double x, double kt2, double mu2)
Evaluates the TMD PDF value for a specific parton flavor.
Definition GenericPDF.h:213
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:127
GenericPDF & operator=(GenericPDF &&other) noexcept
Definition GenericPDF.h:152
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:240
GenericPDF(const GenericPDF &other)
Definition GenericPDF.h:174
double dpd(PartonFlavor flavor1, PartonFlavor flavor2, double x1, double mu1_2, double x2, double mu2_2)
Evaluate a collinear double-parton distribution.
Definition GenericPDF.h:263
GenericPDF(const std::string &pdfName, int setNumber)
Definition GenericPDF.h:87
GenericPDF(GenericPDF &&other) noexcept
Definition GenericPDF.h:141
YamlStandardTMDInfo getStdPDFInfo() const
Retrieves the standard PDF info.
Definition GenericPDF.h:286
double pdf(PartonFlavor flavor, double x, double mu2) const
Retrieves the collinear PDF value for a specific parton flavor.
Definition GenericPDF.h:101
Definition Factory.h:9
Definition GenericPDF.h:37
Definition GenericPDF.h:34
CDPDZeroExtrapolator Extrapolator
Definition GenericPDF.h:78
CDefaultDPDReader Reader
Definition GenericPDF.h:76
CPDFxTMDDPDInterpolator< Reader > Interpolator
Definition GenericPDF.h:77
CContinuationExtrapolator< CLHAPDFBicubicInterpolator< Reader > > Extrapolator
Definition GenericPDF.h:71
CDefaultLHAPDFFileReader Reader
Definition GenericPDF.h:69
CLHAPDFBicubicInterpolator< Reader > Interpolator
Definition GenericPDF.h:70
TDefaultLHAPDF_TMDReader Reader
Definition GenericPDF.h:61
TTrilinearInterpolator< Reader > Interpolator
Definition GenericPDF.h:62
TZeroExtrapolator Extrapolator
Definition GenericPDF.h:63
Tag types for PDF implementations.
Definition GenericPDF.h:56
Definition GenericPDF.h:31