"""
This module contains the Toy PDF.
It is defined at the initial scale :math:`Q = sqrt(2) GeV`.
"""
[docs]
class toyPDFSet:
"""Fake PDF set"""
def __init__(self, name):
self.name = name
[docs]
class MockPDF:
"""Imitates a lhapdf.PDF"""
name = None
xpdf = {}
[docs]
def xfxQ2(self, pid, x, _Q2):
"""Get the PDF/FF xf(x) value at (x,q2) for the given PID.
Parameters
----------
Parameters
----------
pid : int
PDG parton ID.
x : float
Momentum fraction.
Q2 : float
Squared energy (renormalization) scale.
Returns
-------
float
The value of xf(x,q2).
"""
# Initialize PDFs to zero
if x > 1e0:
return 0.0
if pid not in self.xpdf:
return 0.0
return self.xpdf[pid](x)
[docs]
def xfxQ(self, pid, x, Q):
"""Get the PDF/FF xf(x) value at (x,q) for the given PID.
Parameters
----------
pid : int
PDG parton ID.
x : float
Momentum fraction.
Q : float
Energy (renormalization) scale.
Returns
-------
type
The value of xf(x,q).
"""
return self.xfxQ2(pid, x, Q * Q)
[docs]
def alphasQ(self, q):
"Return alpha_s at q"
return self.alphasQ2(q**2)
[docs]
def alphasQ2(self, _q2):
"Return alpha_s at q2"
return 0.35
[docs]
def set(self):
"Return the corresponding PDFSet"
return toyPDFSet(self.name)
[docs]
def hasFlavor(self, pid):
"""Contains a pdf for pid?"""
return pid in ([21, 22] + list(range(-6, 6 + 1)))
[docs]
class toyPDF_unpolarized(MockPDF):
"""ToyLH unpolarized implementation."""
def __init__(self):
N_uv = 5.107200e0
auv = 0.8e0
buv = 3e0
N_dv = 3.064320e0
adv = 0.8e0
bdv = 4e0
N_g = 1.7e0
ag = -0.1e0
bg = 5e0
N_db = 0.1939875e0
adb = -0.1e0
bdb = 6e0
fs = 0.2e0
xuv = lambda x: N_uv * x**auv * (1e0 - x) ** buv
xdv = lambda x: N_dv * x**adv * (1e0 - x) ** bdv
xg = lambda x: N_g * x**ag * (1e0 - x) ** bg
xdbar = lambda x: N_db * x**adb * (1e0 - x) ** bdb
xubar = lambda x: xdbar(x) * (1e0 - x)
xs = lambda x: fs * (xdbar(x) + xubar(x))
xsbar = xs
self.xpdf = {}
self.xpdf[3] = xs
self.xpdf[2] = lambda x: xuv(x) + xubar(x)
self.xpdf[1] = lambda x: xdv(x) + xdbar(x)
self.xpdf[21] = self.xpdf[0] = xg
self.xpdf[-1] = xdbar
self.xpdf[-2] = xubar
self.xpdf[-3] = xsbar
self.name = "ToyLH"
[docs]
class toyPDF_polarized(MockPDF):
"""ToyLH polarized implementation."""
def __init__(self):
N_uv = 1.3
auv = 0.7
buv = 3.0
N_dv = -0.5
adv = 0.7
bdv = 4.0
N_g = 1.5
ag = 0.5
bg = 5.0
N_db = -0.05
adb = 0.3
bdb = 7
fs = 0.5
xuv = lambda x: N_uv * x**auv * (1e0 - x) ** buv * (1 + 3 * x)
xdv = lambda x: N_dv * x**adv * (1e0 - x) ** bdv * (1 + 4 * x)
xg = lambda x: N_g * x**ag * (1e0 - x) ** bg
xdbar = lambda x: N_db * x**adb * (1e0 - x) ** bdb
xubar = xdbar
xs = lambda x: fs * xdbar(x)
xsbar = xs
self.xpdf = {}
self.xpdf[3] = xs
self.xpdf[2] = lambda x: xuv(x) + xubar(x)
self.xpdf[1] = lambda x: xdv(x) + xdbar(x)
self.xpdf[21] = self.xpdf[0] = xg
self.xpdf[-1] = xdbar
self.xpdf[-2] = xubar
self.xpdf[-3] = xsbar
self.name = "ToyLH_polarized"
[docs]
class toyFF_unpolarized(MockPDF):
"""ToyFF from 1501.00494, Eqn. 3.3 and 3.4"""
def __init__(self):
N_v = 1.00881
N_s = 17.6255
N_g = 438.189
xD_u = lambda x: x * N_v * x ** (-0.963) * (1 - x) ** 1.370
xD_ub = lambda x: x * N_s * x**0.718 * (1 - x) ** 6.266
xD_g = lambda x: x * N_g * x**1.943 * (1 - x) ** 8
self.xpdf = {}
self.xpdf[-3] = xD_ub
self.xpdf[-2] = xD_ub
self.xpdf[-1] = xD_u
self.xpdf[0] = xD_g
self.xpdf[1] = xD_ub
self.xpdf[2] = xD_u
self.xpdf[3] = xD_ub
self.xpdf[21] = self.xpdf[0]
self.name = "ToyFF_unpolarized"
[docs]
def mkPDF(setname, _member):
"""
Factory functions for making single PDF/FF members.
Create a new PDF/FF with the given PDF/FF set name and member ID.
Parameters
----------
setname : type
PDF/FF set name.
member : type
Member ID.
Returns
-------
toyPDF/FF
PDF/FF object.
"""
if setname == "ToyLH_polarized":
return toyPDF_polarized()
if setname == "ToyFF_unpolarized":
return toyFF_unpolarized()
return toyPDF_unpolarized()