Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-08-06 09:38:28

0001 // -*- C++ -*-
0002 #ifndef ThePEG_NuclearPhotonPDF_H
0003 #define ThePEG_NuclearPhotonPDF_H
0004 //
0005 // This is the declaration of the NuclearPhotonPDF class.
0006 //
0007 
0008 #include "ThePEG/PDF/PDFBase.h"
0009 #include "ThePEG/Utilities/Maths.h"
0010 
0011 namespace ThePEG {
0012 
0013 /**
0014  * The NuclearPhotonPDF class implements the PDF for the radiation of a photon from a heavy ion.
0015  *
0016  * @see \ref NuclearPhotonPDFInterfaces "The interfaces"
0017  * defined for NuclearPhotonPDF.
0018  */
0019 class NuclearPhotonPDF: public PDFBase {
0020 
0021 public:
0022 
0023   /**
0024    * The default constructor.
0025    */
0026   NuclearPhotonPDF();
0027 
0028 public:
0029 
0030   /** @name Virtual functions to be overridden by sub-classes. */
0031   //@{
0032   /**
0033    * Return true if this PDF can handle the extraction of partons from
0034    * the given \a particle.
0035    */
0036   virtual bool canHandleParticle(tcPDPtr particle) const;
0037 
0038   /**
0039    * Return the partons which this PDF may extract from the given
0040    * \a particle.
0041    */
0042   virtual cPDVector partons(tcPDPtr particle) const;
0043 
0044   /**
0045    * The density. Return the pdf for the given \a parton inside the
0046    * given \a particle for the virtuality \a partonScale and
0047    * logarithmic momentum fraction \a l \f$(l=\log(1/x)\f$. The \a
0048    * particle is assumed to have a virtuality \a particleScale.
0049    */
0050   virtual double xfl(tcPDPtr particle, tcPDPtr parton, Energy2 partonScale,
0051              double l, Energy2 particleScale = 0.0*GeV2) const;
0052 
0053   /**
0054    * The valence density. Return the pdf for the given cvalence \a
0055    * parton inside the given \a particle for the virtuality \a
0056    * partonScale and logarithmic momentum fraction \a l
0057    * \f$(l=\log(1/x)\f$. The \a particle is assumed to have a
0058    * virtuality \a particleScale. If not overidden by a sub class this
0059    * will return zero.
0060    */
0061   virtual double xfvl(tcPDPtr particle, tcPDPtr parton, Energy2 partonScale,
0062              double l, Energy2 particleScale = 0.0*GeV2) const;
0063 
0064   /**
0065    * Generate scale (as a fraction of the maximum scale). If the PDF
0066    * contains strange peaks which can be difficult to handle, this
0067    * function may be overwritten to return an appropriate scale
0068    * \f$Q^2/Q^2_{\max}\f$ for a \a z uniformly distributed in
0069    * ]0,1[. Also the jacobobian of the \f$Q^2/Q^2_{\max}\rightarrow
0070    * z\f$ variable transformation must multiply the \a jacobian
0071    * argument. The default version will simply use the function
0072    * \f$Q^2/Q^2_{\max} = (Q^2_{\max}/Q^2_{\min})^(z-1)\f$ or, if
0073    * \f$Q^2_{\min}\f$ is zero, \f$Q^2/Q^2_{\max} = z\f$ (where the
0074    * limits are set by \a cut).
0075    */
0076   
0077   virtual double flattenScale(tcPDPtr particle, tcPDPtr parton,
0078                    const PDFCuts & cut, double l, double z,
0079                    double & jacobian) const;
0080 
0081   
0082   /**
0083    * Generate a momentum fraction. If the PDF contains strange peaks
0084    * which can be difficult to handle, this function may be
0085    * overwritten to return an appropriate \f$l=\log(1/x)\f$ for a \a z
0086    * uniformly distributed in ]0,1[. Also the jacobobian of the
0087    * \f$l\rightarrow z\f$ variable transformation must in the function
0088    * multiply the \a jacobian argument. The default version will
0089    * simply use the function \f$l(z) = l_{\min} +
0090    * z*(l_{\max}-l_{\min})\f$ (where the limits are set by \a cut).
0091    */
0092   virtual double flattenL(tcPDPtr particle, tcPDPtr parton, const PDFCuts &cut,
0093               double z, double & jacobian) const;
0094   //@}
0095 
0096 
0097 public:
0098 
0099   /** @name Functions used by the persistent I/O system. */
0100   //@{
0101   /**
0102    * Function used to write out object persistently.
0103    * @param os the persistent output stream written to.
0104    */
0105   void persistentOutput(PersistentOStream & os) const;
0106 
0107   /**
0108    * Function used to read in object persistently.
0109    * @param is the persistent input stream read from.
0110    * @param version the version number of the object when written.
0111    */
0112   void persistentInput(PersistentIStream & is, int version);
0113   //@}
0114 
0115   /**
0116    * The standard Init function used to initialize the interfaces.
0117    * Called exactly once for each class by the class description system
0118    * before the main function starts or
0119    * when this class is dynamically loaded.
0120    */
0121   static void Init();
0122 
0123 protected:
0124 
0125   /**
0126    *  Extract the mass and atomic number for the nuclear PDG code
0127    */
0128   pair<int,int> massAndZ(long pid) const {
0129     pair<int,int> output;
0130     output.first  = (abs(pid)%10000)/10;
0131     output.second = (abs(pid)%10000000)/10000;
0132     return output;
0133   }
0134 
0135   /**
0136    *  Dipole form factor
0137    */
0138   double dipoleFormFactor(Energy2 q2) const {
0139     return Math::powi((1 + q2/q02_),-2);
0140   }
0141 
0142   /**
0143    *  Convolution of hard sphere and Yukaw for heavy nuclei
0144    */
0145   double heavyFormFactor(Energy2 q2, Length R) const {
0146     double Rq = sqrt(q2)*R/hbarc;
0147     return 3./pow(Rq,3)*(sin(Rq)-Rq*cos(Rq))/(1.+sqr(yukawaRange_/hbarc)*q2);
0148   }
0149   
0150 protected:
0151 
0152   /** @name Clone Methods. */
0153   //@{
0154   /**
0155    * Make a simple clone of this object.
0156    * @return a pointer to the new object.
0157    */
0158   virtual IBPtr clone() const;
0159 
0160   /** Make a clone of this object, possibly modifying the cloned object
0161    * to make it sane.
0162    * @return a pointer to the new object.
0163    */
0164   virtual IBPtr fullclone() const;
0165   //@}
0166 
0167 private:
0168 
0169   /**
0170    * The assignment operator is private and must never be called.
0171    * In fact, it should not even be implemented.
0172    */
0173   NuclearPhotonPDF & operator=(const NuclearPhotonPDF &) = delete;
0174   
0175 private:
0176 
0177   /**
0178    *  Minimum \f$Q^2\f$ for the photon
0179    */
0180   Energy2 q2Min_;
0181 
0182   /**
0183    *  Maximum \f$Q^2\f$ for the photon
0184    */
0185   Energy2 q2Max_;
0186 
0187   /**
0188    *  Range of the Yukawa potential
0189    */
0190   Length yukawaRange_;
0191 
0192   /**
0193    *  Prefactor for the nucleur radius \f$R_A=aA^{\frac13}\f$
0194    */
0195   Length aFact_;
0196 
0197   /**
0198    *  Fitted scale \f$Q{_0}{^2}=0.71GeV^2\f$ for the dipole form factor
0199    */
0200   Energy2 q02_;
0201   
0202 };
0203 
0204 }
0205 
0206 #endif /* ThePEG_NuclearPhotonPDF_H */