Back to home page

EIC code displayed by LXR

 
 

    


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