Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Time Like Splitting Functions #232

Merged
merged 45 commits into from
Apr 5, 2023
Merged
Show file tree
Hide file tree
Changes from 33 commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
902ca4b
clean slate
t7phy Mar 15, 2023
ff9dd6d
as1
t7phy Mar 15, 2023
c17e676
as2
t7phy Mar 15, 2023
3628dae
refs
t7phy Mar 15, 2023
1b6c72b
as3
t7phy Mar 15, 2023
51b1be5
init
t7phy Mar 15, 2023
3217f3a
print time-like during computation
t7phy Mar 15, 2023
e9a1141
lhapdf benchmarks
t7phy Mar 15, 2023
d129b56
test_init NA
t7phy Mar 15, 2023
241f052
bench specs
t7phy Mar 16, 2023
d05f541
Fix FF benchmark op cards
felixhekhorn Mar 24, 2023
863ff8b
bench
t7phy Mar 25, 2023
a0bcd13
minor changes
t7phy Mar 25, 2023
116689a
as2.singlet correction
t7phy Mar 25, 2023
0ff1a53
remove unused var
t7phy Mar 25, 2023
9d88c3f
remove unused var
t7phy Mar 25, 2023
faa76c1
remove unused var
t7phy Mar 25, 2023
a83b89f
tests evo_oper init
t7phy Mar 27, 2023
9cfede2
removed commented test blocks
t7phy Mar 27, 2023
86fb579
Merge branch 'master' into tlu_ad_v2
felixhekhorn Mar 27, 2023
9ceb2e5
as2 fixes and benchmark updated to exact
t7phy Mar 27, 2023
370c540
few suggestions implemented
t7phy Mar 28, 2023
e501b9d
few suggestions implemented 2
t7phy Mar 28, 2023
a774d77
TL docs
t7phy Mar 29, 2023
f926ba0
Merge branch 'master' into tlu_ad_v2
felixhekhorn Apr 3, 2023
38f4978
Update FF doc
felixhekhorn Apr 3, 2023
3dc1963
test as1
t7phy Apr 3, 2023
8ce9bb4
test as2
t7phy Apr 3, 2023
f41d602
test as3
t7phy Apr 3, 2023
dfceede
test init
t7phy Apr 3, 2023
efe50bf
ad citations
t7phy Apr 3, 2023
8b50c67
q2 to mu
t7phy Apr 3, 2023
2a93ed6
tests edits
t7phy Apr 4, 2023
d1baa74
move testing and benchmark info to docs
t7phy Apr 5, 2023
2278f9e
add comments to tests
t7phy Apr 5, 2023
d315044
comment to docstrings
t7phy Apr 5, 2023
80be9b6
word replacement
t7phy Apr 5, 2023
99847d5
suggested fixes
t7phy Apr 5, 2023
f248b78
fix MELA abbreviation
t7phy Apr 5, 2023
7e325cf
Merge branch 'master' into tlu_ad_v2
felixhekhorn Apr 5, 2023
193afc8
Fix left-over mu2grid in lhapdf_utils
felixhekhorn Apr 5, 2023
b8d8ab5
Appease a bit pre-commit
felixhekhorn Apr 5, 2023
6d90ae5
More pre-commit fixes
felixhekhorn Apr 5, 2023
316fecc
Normalize abbr list in docs
felixhekhorn Apr 5, 2023
c6ae8b5
Fix some whitespace
felixhekhorn Apr 5, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
149 changes: 149 additions & 0 deletions benchmarks/FF_LHAPDF_bench.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
"""Benchmark FFs from LHAPDF"""

from banana import register

from eko import interpolation
from ekomark.benchmark.runner import Runner

register(__file__)

base_operator = {"ev_op_iterations": 10, "backward_inversion": "exact"}

base_theory = {
"Qref": 91.1876,
"mc": 1.51,
"mb": 4.92,
"mt": 172.5,
"kcThr": 1.0,
"kbThr": 1.0,
"ktThr": 1.0,
"alphas": 0.118000,
"alphaqed": 0.007496,
"FNS": "ZM-VFNS",
"ModEv": "EXA",
# "ModEv": "TRN",
}

FF_sets_lo = [
"NNFF10_PIm_lo",
"NNFF10_PIp_lo",
"NNFF10_PIsum_lo",
"NNFF10_KAm_lo",
"NNFF10_KAp_lo",
"NNFF10_KAsum_lo",
"NNFF10_PRm_lo",
"NNFF10_PRp_lo",
"NNFF10_PRsum_lo",
]
FF_sets_nlo = [
"NNFF10_PIm_nlo",
"NNFF10_PIp_nlo",
"NNFF10_PIsum_nlo",
"NNFF10_KAm_nlo",
"NNFF10_KAp_nlo",
"NNFF10_KAsum_nlo",
"NNFF10_PRm_nlo",
"NNFF10_PRp_nlo",
"NNFF10_PRsum_nlo",
"MAPFF10NLOPIm",
felixhekhorn marked this conversation as resolved.
Show resolved Hide resolved
"MAPFF10NLOPIp",
"MAPFF10NLOPIsum",
"MAPFF10NLOKAm",
"MAPFF10NLOKAp",
"MAPFF10NLOKAsum",
]
FF_sets_nnlo = [
"NNFF10_PIm_nnlo",
"NNFF10_PIp_nnlo",
"NNFF10_PIsum_nnlo",
"NNFF10_KAm_nnlo",
"NNFF10_KAp_nnlo",
"NNFF10_KAsum_nnlo",
"NNFF10_PRm_nnlo",
"NNFF10_PRp_nnlo",
"NNFF10_PRsum_nnlo",
"MAPFF10NNLOPIm",
"MAPFF10NNLOPIp",
"MAPFF10NNLOPIsum",
"MAPFF10NNLOKAm",
"MAPFF10NNLOKAp",
"MAPFF10NNLOKAsum",
]


class BenchmarkFF(Runner):
external = "LHAPDF"
rotate_to_evolution_basis = True

def skip_pdfs(self, _theory):
return [
-6,
6,
22,
"ph",
"T35",
"V35",
]

def benchmark_lo(self, ff_index, Q0=10, mugrid=(100,)):
theory_card = {
**base_theory,
"PTO": 0,
"QED": 0,
"Q0": Q0,
"MaxNfPdf": 5,
"MaxNfAs": 5,
}

operator_card = {
**base_operator,
"mugrid": list(mugrid),
"time_like": True,
"interpolation_xgrid": interpolation.lambertgrid(100, 0.01),
}

self.run([theory_card], [operator_card], [FF_sets_lo[ff_index]])

def benchmark_nlo(self, ff_index, Q0=10, mugrid=(100,)):
theory_card = {
**base_theory,
"PTO": 1,
"QED": 0,
"Q0": Q0,
"MaxNfPdf": 5,
"MaxNfAs": 5,
}

operator_card = {
**base_operator,
"mugrid": list(mugrid),
"time_like": True,
"interpolation_xgrid": interpolation.lambertgrid(100, 0.01),
}

self.run([theory_card], [operator_card], [FF_sets_nlo[ff_index]])

def benchmark_nnlo(self, ff_index, Q0=10, mugrid=(100,)):
theory_card = {
**base_theory,
"PTO": 2,
"QED": 0,
"Q0": Q0,
"MaxNfPdf": 5,
"MaxNfAs": 5,
}

operator_card = {
**base_operator,
"mugrid": list(mugrid),
"time_like": True,
"interpolation_xgrid": interpolation.lambertgrid(100, 0.01),
}

self.run([theory_card], [operator_card], [FF_sets_nnlo[ff_index]])


if __name__ == "__main__":
# BenchmarkFF().benchmark_lo(7)
BenchmarkFF().benchmark_nlo(10)
# BenchmarkFF().benchmark_nnlo(10)
1 change: 1 addition & 0 deletions doc/source/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ EKO is ...
theory/DGLAP
theory/N3LO_ad
theory/Matching
theory/TimeLike
theory/MHOU

zzz-refs
Expand Down
68 changes: 67 additions & 1 deletion doc/source/refs.bib
Original file line number Diff line number Diff line change
Expand Up @@ -827,4 +827,70 @@ @article{Moch:2014sna
volume = "889",
pages = "351--400",
year = "2014"
}
}

@article{Mitov:2006wy,
author = "Mitov, Alexander and Moch, Sven-Olaf",
title = "{QCD Corrections to Semi-Inclusive Hadron Production in Electron-Positron Annihilation at Two Loops}",
eprint = "hep-ph/0604160",
archivePrefix = "arXiv",
reportNumber = "DESY-06-043",
doi = "10.1016/j.nuclphysb.2006.05.018",
journal = "Nucl. Phys. B",
volume = "751",
pages = "18--52",
year = "2006"
}

@article{Gluck:1992zx,
author = "Gluck, M. and Reya, E. and Vogt, A.",
title = "{Parton fragmentation into photons beyond the leading order}",
reportNumber = "DO-TH-92-23",
doi = "10.1103/PhysRevD.51.1427",
journal = "Phys. Rev. D",
volume = "48",
pages = "116",
year = "1993",
note = "[Erratum: Phys.Rev.D 51, 1427 (1995)]"
}

@article{Mitov:2006ic,
author = "Mitov, A. and Moch, S. and Vogt, A.",
title = "{Next-to-Next-to-Leading Order Evolution of Non-Singlet Fragmentation Functions}",
eprint = "hep-ph/0604053",
archivePrefix = "arXiv",
reportNumber = "DESY-06-036, DCPT-06-40, IPPP-06-20",
doi = "10.1016/j.physletb.2006.05.005",
journal = "Phys. Lett. B",
volume = "638",
pages = "61--67",
year = "2006"
}

@article{Moch:2007tx,
author = "Moch, S. and Vogt, A.",
title = "{On third-order timelike splitting functions and top-mediated Higgs decay into hadrons}",
eprint = "0709.3899",
archivePrefix = "arXiv",
primaryClass = "hep-ph",
reportNumber = "DESY-07-155, SFB-CPP-07-53, LTH-758",
doi = "10.1016/j.physletb.2007.10.069",
journal = "Phys. Lett. B",
volume = "659",
pages = "290--296",
year = "2008"
}

@article{Almasy:2011eq,
author = "Almasy, A. A. and Moch, S. and Vogt, A.",
title = "{On the Next-to-Next-to-Leading Order Evolution of Flavour-Singlet Fragmentation Functions}",
eprint = "1107.2263",
archivePrefix = "arXiv",
primaryClass = "hep-ph",
reportNumber = "LTH-916, DESY-11-108, SFB-CPP-11-33, LPN11-34",
doi = "10.1016/j.nuclphysb.2011.08.028",
journal = "Nucl. Phys. B",
volume = "854",
pages = "133--152",
year = "2012"
}
3 changes: 3 additions & 0 deletions doc/source/shared/abbreviations.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
.. |PDF| replace::
:abbr:`PDF (Parton Distribution Function(s))`

.. |FF| replace::
:abbr:`FF (Fragmentation Function(s))`

.. FNS

.. |FNS| replace::
Expand Down
23 changes: 23 additions & 0 deletions doc/source/theory/TimeLike.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
Time-Like Evolution
===================

Due to confinement in |QCD| we can not observe partons, such as quarks and gluons,
directly in particle collider experiments.
Instead, stable hadrons are detected which originate from parton interactions.

The fragmentation functions (|FF|) encode the information
on the probability for a hadron carrying a specified momentum fraction to 'fragment'
from a given parton. These functions are non-perturbative and usually require a global |QCD|
analysis of experimental data involving different processes for their reliable
determination. This makes the |FF| similar to |PDF| as both rely
on similar factorization theorems and, thus, on similar |RGE|.
In practice, the relevant Feynman diagrams can indeed be related by a crossing
symmetry which in turn means certain Mandelstam variables become for |FF|
time-like instead of space-like.
The relevant setting in the operator card is thus called ``time_like = True``.

We implement the time-like |DGLAP| anomalous dimensions up to |NNLO| in :class:`~ekore.anomalous_dimensions.unpolarized.time_like`.
The implementation for the |LO| and |NLO| splitting functions is based on :cite:`Mitov:2006wy, Gluck:1992zx` and the implementation for
the |NNLO| splitting functions is based on :cite:`Mitov:2006ic, Moch:2007tx, Almasy:2011eq`.
Supplying new anomalous dimensions and new matching conditions is the only change required for the eko program (e.g. the
solution strategies are unaffected).
1 change: 1 addition & 0 deletions src/eko/evolution_operator/grid.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ def __init__(
logger.warning("Evolution: In LO we use the exact solution always!")

logger.info(dict(polarized=configs.polarized))
logger.info(dict(time_like=configs.time_like))

self.config = config
self.q2_grid = mu2grid
Expand Down
77 changes: 65 additions & 12 deletions src/ekore/anomalous_dimensions/unpolarized/time_like/__init__.py
Original file line number Diff line number Diff line change
@@ -1,21 +1,74 @@
r"""The unpolarized, time-like Altarelli-Parisi splitting kernels.
"""The unpolarized time-like Altarelli-Parisi splitting kernels."""

Normalization is given by
import numba as nb
import numpy as np

.. math::
\mathbf{P}(x) = \sum\limits_{j=0} a_s^{j+1} \mathbf P^{(j)}(x)
from . import as1, as2, as3

with :math:`a_s = \frac{\alpha_S(\mu^2)}{4\pi}`.
"""

import numba as nb
@nb.njit(cache=True)
def gamma_ns(order, mode, n, nf):
r"""Compute the tower of the non-singlet anomalous dimensions.

Parameters
----------
order : tuple(int,int)
perturbative orders
mode : 10201 | 10101 | 10200
sector identifier
n : complex
Mellin variable
nf : int
Number of active flavors

@nb.njit(cache=True)
def gamma_ns(_order, _mode, _n, _nf):
raise NotImplementedError("Polarised is not yet implemented")
Returns
-------
numpy.ndarray
non-singlet anomalous dimensions

"""
gamma_ns = np.zeros(order[0], np.complex_)
gamma_ns[0] = as1.gamma_ns(n)
if order[0] >= 2:
if mode == 10101:
gamma_ns_1 = as2.gamma_nsp(n, nf)
elif mode in [10201, 10200]:
gamma_ns_1 = as2.gamma_nsm(n, nf)
gamma_ns[1] = gamma_ns_1
if order[0] >= 3:
if mode == 10101:
gamma_ns_2 = as3.gamma_nsp(n, nf)
elif mode == 10201:
gamma_ns_2 = as3.gamma_nsm(n, nf)
elif mode == 10200:
gamma_ns_2 = as3.gamma_nsv(n, nf)
gamma_ns[2] = gamma_ns_2
return gamma_ns


@nb.njit(cache=True)
def gamma_singlet(_order, _n, _nf):
raise NotImplementedError("Polarised is not yet implemented")
def gamma_singlet(order, n, nf):
r"""Compute the tower of the singlet anomalous dimensions' matrices.

Parameters
----------
order : tuple(int,int)
perturbative orders
n : complex
Mellin variable
nf : int
Number of active flavors

Returns
-------
numpy.ndarray
singlet anomalous dimensions matrices

"""
gamma_s = np.zeros((order[0], 2, 2), np.complex_)
gamma_s[0] = as1.gamma_singlet(n, nf)
if order[0] >= 2:
gamma_s[1] = as2.gamma_singlet(n, nf)
if order[0] >= 3:
gamma_s[2] = as3.gamma_singlet(n, nf)
return gamma_s
Loading