Parton Distributions

The parton distributions file contains the PDF class. PDF is the base class, from which specific PDF classes are derived.

The choice of which PDF to use is made by settings in the Pythia class, see here. These settings also allow to access all the proton PDF's available in the LHAPDF library [Wha05,Buc15]. Thus there is no need for a normal user to study the PDF class. The structure must only be understood when interfacing new PDF's, e.g. ones not yet found in LHAPDF.

The PDF base class

PDF defines the interface that all PDF classes should respect. The constructor requires the incoming beam species to be given: even if used for a proton PDF, one needs to know whether the beam is actually an antiproton. This is one of the reasons why Pythia always defines two PDF objects in an event, one for each beam.

Once a PDF object has been constructed, call it pdf, the main method is pdf.xf( id, x, Q2), which returns x*f_id(x, Q2), properly taking into account whether the beam is an antiparticle or not.

Whenever the xf member is called with a new flavour, x or Q^2, the xfUpdate member is called to do the actual updating. This routine may either update that particular flavour or all flavours at this (x, Q^2) point. (In the latter case the saved id value idSav should be set to 9.) The choice is to be made by the producer of a given set, based on what he/she deems most effective, given that sometimes only one flavour need be evaluated, and about equally often all flavours are needed at the same x and Q^2. Anyway, the latest value is always kept in memory. This is the other reason why Pythia has one separate PDF object for each beam, so that values at different x can be kept in memory.

Two further public methods are xfVal( id, x, Q2) and xfSea( id, x, Q2). These are simple variants whereby the quark distributions can be subdivided into a valence and a sea part. If these are not directly accessible in the parametrization, one can make the simplified choices u_sea = ubar_sea, u_val = u_tot - u_sea, and correspondingly for d. (Positivity will always be guaranteed at output.) The xfUpdate method should also take care of updating this information.

A method setExtrapolate(bool) allows you to switch between freezing parametrizations at the low-x boundary (false) or extrapolate them outside the boundary (true). This method works both for LHAPDF 5, LHAPDF6 and modern internal PDFs. (For some older PDFs the behaviour implemented by the original authors is maintained.) In either case the PDFs are frozen at Q_min and Q_max. (And also at x_max, but this is irrelevant when x_max = 1.)

With insideBounds(double x, double Q2) you can probe whether an (x, Q^2) pair falls inside the fit region or not. The alphaS(double Q2) method returns the alpha_s of the PDF at the given Q^2 scale, while mQuarkPDF(int id) returns the quark masses used to set flavour thresholds. Currently these three methods are only implemented for LHAPDF6.

Derived classes

There is only one pure virtual method, xfUpdate, that therefore must be implemented in any derived class. A reasonable number of such classes come with the program:

For protons:

The current default is NNPDF 2.3.

For charged pions:

For Pomerons (used to describe diffraction):

For photons:

For charged leptons (e, mu, tau) and the proton:

For neutrinos:

There is another method, isSetup(), that returns the base-class boolean variable isSet. This variable is initially true, but could be set false if the setup procedure of a PDF failed, e.g. if the user has chosen an unknown PDF set.

The MRST/MSTW, CTEQ/CT, NNPDF and H1 PDF routines are based on the interpolation in (x, Q) grids. The grid files are stored in the xmldoc subdirectory, like settings and particle data. Only PDF sets that will be used are read in during the initialization stage. Just as input streams can be used to initialize the settings and particle data, so can the individual PDFs be constructed. See the header files for explicit constructor descriptions.