File indexing completed on 2025-04-19 09:10:15
0001 #ifndef SHRIMPS_Beam_Remnants_Continued_PDF_H
0002 #define SHRIMPS_Beam_Remnants_Continued_PDF_H
0003
0004 #include "PDF/Main/ISR_Handler.H"
0005 #include "ATOOLS/Phys/Flavour.H"
0006 #include "ATOOLS/Math/Function_Base.H"
0007 #include "ATOOLS/Org/CXXFLAGS.H"
0008 #include <list>
0009
0010 namespace SHRIMPS {
0011 class PDF_Kernel_Base : public ATOOLS::Function_Base {
0012 protected:
0013 PDF::PDF_Base * p_pdf;
0014 ATOOLS::Flavour m_bunch;
0015 std::list<ATOOLS::Flavour> * p_pdfpartons;
0016 double m_xmin,m_xmax,m_Q02;
0017 public:
0018 PDF_Kernel_Base(PDF::PDF_Base * pdf,
0019 const ATOOLS::Flavour & bunch,
0020 std::list<ATOOLS::Flavour> * pdfpartons,
0021 const double & Q02=-1.) :
0022 p_pdf(pdf), m_bunch(bunch), p_pdfpartons(pdfpartons),
0023 m_xmin(p_pdf->XMin()), m_xmax(p_pdf->XMax()),
0024 m_Q02(ATOOLS::Max(Q02,p_pdf->Q2Min())) { }
0025 virtual ~PDF_Kernel_Base() {}
0026 virtual double operator()(double x) = 0;
0027 };
0028
0029 class Continued_PDF {
0030 class Sea_Kernel : public PDF_Kernel_Base {
0031 public:
0032 Sea_Kernel(PDF::PDF_Base * pdf,
0033 const ATOOLS::Flavour & bunch,
0034 std::list<ATOOLS::Flavour> * pdfpartons,
0035 const double & Q02=-1.) :
0036 PDF_Kernel_Base(pdf,bunch,pdfpartons,Q02) {}
0037 double operator()(double x);
0038 };
0039 class Valence_Kernel : public PDF_Kernel_Base {
0040 public:
0041 Valence_Kernel(PDF::PDF_Base * pdf,
0042 const ATOOLS::Flavour & bunch,
0043 std::list<ATOOLS::Flavour> * pdfpartons,
0044 const double & Q02=-1.) :
0045 PDF_Kernel_Base(pdf,bunch,pdfpartons,Q02) {}
0046 double operator()(double x);
0047 };
0048
0049 private:
0050 PDF::PDF_Base * p_pdf;
0051 std::list<ATOOLS::Flavour> m_pdfpartons;
0052 ATOOLS::Flavour m_bunch;
0053 double m_x0,m_xmin,m_xmax,m_Q02,m_geta,m_glambda;
0054 double m_Vnorm,m_Snorm,m_gnorm;
0055 double m_x,m_Q2;
0056 std::map<ATOOLS::Flavour,double> m_xpdfmax;
0057 std::map<ATOOLS::Flavour,double> m_xmaxpdf;
0058
0059 void CalculateNorms();
0060 void Scan();
0061 void Test();
0062 double GluonAtZero(const double & x);
0063 public:
0064 Continued_PDF(PDF::PDF_Base * pdf,const ATOOLS::Flavour & bunch);
0065 ~Continued_PDF();
0066
0067 void Calculate(const double & x,const double & Q2);
0068 double AllPartons(const double & x,const double & Q2);
0069 double XPDF(const ATOOLS::Flavour & flav,const bool & defmax=false);
0070
0071 inline const std::list<ATOOLS::Flavour> & GetFlavours() const { return m_pdfpartons; }
0072 inline const double & XMin() const { return m_xmin; }
0073 inline const double & XMax() const { return m_xmax; }
0074 inline double Q2Min() const { return 0.; }
0075 inline const ATOOLS::Flavour & Bunch() const { return m_bunch; }
0076
0077
0078 inline double XPDFMax(const ATOOLS::Flavour & flav) {
0079 ATOOLS::Flavour flav1(flav);
0080 if (flav.IsDiQuark()) {
0081 flav1 = ATOOLS::Flavour(kf_u);
0082 if (m_bunch==ATOOLS::Flavour(kf_p_plus).Bar() && flav.IsAnti())
0083 flav1 = flav1.Bar();
0084 }
0085 std::map<ATOOLS::Flavour,double>::iterator found(m_xpdfmax.find(flav1));
0086 if (found==m_xpdfmax.end()) return -1.;
0087 return found->second;
0088 }
0089 inline double XMaxPDF(const ATOOLS::Flavour & flav) {
0090 ATOOLS::Flavour flav1(flav);
0091 if (flav.IsDiQuark()) {
0092 flav1 = ATOOLS::Flavour(kf_u);
0093 if (m_bunch==ATOOLS::Flavour(kf_p_plus).Bar() && flav.IsAnti())
0094 flav1 = flav1.Bar();
0095 }
0096 std::map<ATOOLS::Flavour,double>::iterator found(m_xmaxpdf.find(flav1));
0097 if (found==m_xmaxpdf.end()) return -1.;
0098 return found->second;
0099 }
0100 };
0101
0102 class Continued_PDF_Test : public ATOOLS::Function_Base {
0103 Continued_PDF * p_pdf;
0104 double m_Q2;
0105 public:
0106 Continued_PDF_Test(Continued_PDF * pdf) :
0107 p_pdf(pdf), m_Q2(0.) { }
0108 ~Continued_PDF_Test() {}
0109 double operator()(double x);
0110 inline void SetQ2(const double & Q2) { m_Q2 = Q2; }
0111 };
0112 }
0113
0114 #endif