Source code for ekore.operator_matrix_elements.polarized.space_like.as2

r"""Contains the |NNLO| |OME| in the polarized case for the matching conditions in the |VFNS|.

The equations are given in :cite:`Bierenbaum:2022biv`.
As in the |NLO| |OME|, in the paper, an additional factor 2 can be found in front of the anomalous dimensions and factor (-1) for odd powers of L.
The anomalous dimensions and beta function with the addition 'hat' are defined as in the |NLO| case.
"""

import numba as nb
import numpy as np

from eko.constants import CA, CF, TR, zeta2, zeta3

from ....anomalous_dimensions.polarized.space_like.as1 import gamma_gq as gamma0_gq
from ....anomalous_dimensions.polarized.space_like.as1 import gamma_ns as gamma0_qq
from ....anomalous_dimensions.polarized.space_like.as1 import gamma_qg as gamma0_qg
from ....anomalous_dimensions.polarized.space_like.as2 import gamma_qg as gamma1_qg
from ....harmonics import cache as c

beta_0hat = -4 / 3 * TR
"""This is the lowest order beta function with the addition 'hat' defined as above."""


[docs] @nb.njit(cache=True) def A_qq_ns(n, cache, L): r"""Compute |NNLO| light-light non-singlet |OME| :math:`A_{qq,H}^{NS,(2)}`. Implements :eqref:`133` of :cite:`Bierenbaum:2022biv`. Parameters ---------- n : complex Mellin moment cache: numpy.ndarray Harmonic sum cache L : float :math:`\ln(\mu_F^2 / m_h^2)` Returns ------- complex |NNLO| light-light non-singlet |OME| :math:`A_{qq,H}^{NS,(2)}` """ S1 = c.get(c.S1, cache, n) S2 = c.get(c.S2, cache, n) S3 = c.get(c.S3, cache, n) gamma1_qqNS = ( -CF * TR * (4 / 3) * ( -8 * S2 + (40 / 3) * S1 - (3 * n**4 + 6 * n**3 + 47 * n**2 + 20 * n - 12) / (3 * n**2 * (n + 1) ** 2) ) ) aqqns = ( TR * CF * ( -(8 / 3) * S3 - (8 / 3) * zeta2 * S1 + (40 / 9) * S2 + 2 * zeta2 * ((3 * n**2 + 3 * n + 2) / (3 * n * (n + 1))) - (224 * S1 / 27) + ( 219 * n**6 + 657 * n**5 + 1193 * n**4 + 763 * n**3 - 40 * n**2 - 48 * n + 72 ) / (54 * n**3 * (n + 1) ** 3) ) ) a_qq_l0 = aqqns - 1 / 4 * 2 * beta_0hat * gamma0_qq(n, cache) * zeta2 a_qq_l1 = (1 / 2) * gamma1_qqNS a_qq_l2 = (1 / 4) * beta_0hat * 2 * gamma0_qq(n, cache) return a_qq_l2 * L**2 + a_qq_l1 * (-L) + a_qq_l0
[docs] @nb.njit(cache=True) def A_hq_ps(n, cache, L, nf): r"""Compute |NNLO| heavy-light pure-singlet |OME| :math:`A_{Hq}^{PS,(2)}`. Implements :eqref:`138` of :cite:`Bierenbaum:2022biv`. Parameters ---------- n : complex Mellin moment cache: numpy.ndarray Harmonic sum cache L : float :math:`\ln(\mu_F^2 / m_h^2)` nf : int Number of active flavors Returns ------- complex |NNLO| heavy-light pure-singlet |OME| :math:`A_{Hq}^{PS,(2)}` """ S2 = c.get(c.S2, cache, n) a_hq_ps_l = ( -4 * TR * CF * ((n + 2) / (n**2 * (n + 1) ** 2)) * ( (n - 1) * (2 * S2 + zeta2) - ((4 * n**3 - 4 * n**2 - 3 * n - 1) / (n**2 * (n + 1) ** 2)) ) ) # term that differentiates between M scheme and Larin scheme, # we are computing in M scheme hence the addition of this term z_qq_ps = -CF * TR * nf * ((8 * (2 + n) * (n**2 - n - 1)) / (n**3 * (n + 1) ** 3)) gamma1_ps_qqhat = (16 * CF * (2 + n) * (1 + 2 * n + n**3) * TR) / ( n**3 * ((1 + n) ** 3) ) a_hq_l0 = ( a_hq_ps_l + z_qq_ps + (zeta2 / 8) * (2 * gamma0_qg(n, nf=1)) * (2 * gamma0_gq(n)) ) a_hq_l1 = (1 / 2) * gamma1_ps_qqhat a_hq_l2 = -(1 / 8) * (2 * gamma0_qg(n, nf=1)) * (2 * gamma0_gq(n)) return a_hq_l2 * L**2 + a_hq_l1 * (-L) + a_hq_l0
[docs] @nb.njit(cache=True) def A_hg(n, cache, L): r"""Compute |NNLO| heavy-gluon |OME| :math:`A_{Hg}^{S,(2)}`. Implements :eqref:`111` of :cite:`Bierenbaum:2022biv`. Parameters ---------- n : complex Mellin moment cache: numpy.ndarray Harmonic sum cache L : float :math:`\ln(\mu_F^2 / m_h^2)` Returns ------- complex |NNLO| heavy-gluon |OME| :math:`A_{Hg}^{S,(2)}` """ S1 = c.get(c.S1, cache, n) S2 = c.get(c.S2, cache, n) S3 = c.get(c.S3, cache, n) Sm21 = c.get(c.Sm21, cache, n, is_singlet=False) S2h = c.get(c.S2h, cache, n) S3h = c.get(c.S3h, cache, n) S2ph = c.get(c.S2ph, cache, n) S3ph = c.get(c.S3ph, cache, n) a_hg = ( (1 / (6 * n**4 * (1 + n) ** 4 * (2 + n))) * TR * ( -2 * CF * ( 6 * ( 4 + 8 * n + 3 * n**2 - 2 * n**3 - 25 * n**4 + 60 * n**6 + 52 * n**7 + 12 * n**8 ) + (-1 + n) * n**2 * (1 + n) ** 2 * (2 + n) * (2 + 3 * n + 3 * n**2) * np.pi**2 + 12 * n**2 * (1 + n) ** 3 * (-36 - 22 * n - 2 * n**2 + n**3) * S1 + 12 * n**2 * (1 + n) ** 3 * (-2 + 3 * n + 3 * n**2) * S1**2 + 12 * n**2 * (1 + n) ** 2 * (2 + 33 * n + 43 * n**2 + 17 * n**3 + n**4) * S2 - 4 * (-1 + n) * n**3 * (1 + n) ** 3 * (2 + n) * (S1**3 + S1 * (np.pi**2 + 3 * S2) - 4 * S3) ) + CA * ( -24 * ( 4 + 12 * n + 33 * n**2 + 4 * n**3 + 29 * n**4 + 36 * n**5 + 22 * n**6 + 10 * n**7 + 2 * n**8 ) + 8 * (-1 + n) * n**2 * (1 + n) ** 2 * (2 + n) ** 2 * np.pi**2 + 24 * n**3 * (1 + n) * (2 - 10 * n - n**2 + 4 * n**3 + n**4) * S1 + 24 * n**3 * (1 + n) ** 2 * (5 + 4 * n + n**2) * S1**2 + 24 * n**2 * (1 + n) ** 2 * (-16 + 15 * n + 24 * n**2 + 7 * n**3) * S2 - 24 * (1 - n) * n**3 * (2 + n) * (4 + (1 + n) ** 2 * S2h - (1 + n) ** 2 * S2ph) + (1 - n) * n**3 * (2 + n) * ( -48 + 8 * (1 + n) ** 3 * S1**3 + 72 * (1 + n) ** 3 * S1 * S2 - 24 * (1 + n) * S1 * (4 + (1 + n) ** 2 * S2h - (1 + n) ** 2 * S2ph) + 64 * (1 + n) ** 3 * S3 + 6 * (1 + n) ** 3 * S3ph - 6 * (1 + n) ** 3 * (S3h - zeta3) + 18 * (1 + n) ** 3 * zeta3 - 12 * (1 + n) ** 3 * (8 * Sm21 + 5 * zeta3) ) ) ) ) # remove the nf dependence from # (2 * gamma0_gg(n, S1, nf) + 2 * beta_0(nf)) pgg0_beta0 = 8 * CA * (-(2 / (n + n**2)) + S1) a_hg_l0 = a_hg + (1 / 8) * 2 * gamma0_qg(n, nf=1) * ( pgg0_beta0 - 2 * gamma0_qq(n, cache) ) a_hg_l1 = 2 * gamma1_qg(n, nf=1, cache=cache) a_hg_l2 = ( (1 / 8) * 2 * gamma0_qg(n, nf=1) * (2 * gamma0_qq(n, cache) - pgg0_beta0 - 4 * beta_0hat) ) return a_hg_l2 * L**2 + a_hg_l1 * (-L) + a_hg_l0
[docs] @nb.njit(cache=True) def A_gq(n, cache, L): r"""Compute |NNLO| gluon-quark |OME| :math:`A_{gq,H}^{S,(2)}`. Implements :eqref:`174` of :cite:`Bierenbaum:2022biv`. Parameters ---------- n : complex Mellin moment cache: numpy.ndarray Harmonic sum cache L : float :math:`\ln(\mu_F^2 / m_h^2)` Returns ------- complex |NNLO| gluon-quark |OME| :math:`A_{gq,H}^{S,(2)}` """ S1 = c.get(c.S1, cache, n) S2 = c.get(c.S2, cache, n) gamma1_gq_hat = 2 * ( 16 * CF * TR * (2 + n) * ((2 + 5 * n) / (9 * n * (1 + n) ** 2) - S1 / (3 * n * (1 + n))) ) a_gq_l0 = ( CF * TR * ( (n + 2) * ( 8 * (22 + 41 * n + 28 * n**2) / (27 * n * (n + 1) ** 3) - 8 * (2 + 5 * n) / (9 * n * (n + 1) ** 2) * S1 + ((S1**2 + S2) * 4) / (3 * n * (n + 1)) ) ) ) # here there is minus sing missing in the paper, # passing from eq 172 to 174 a_gq_l1 = gamma1_gq_hat / 2 a_gq_l2 = beta_0hat * gamma0_gq(n) return a_gq_l2 * L**2 + a_gq_l1 * (-L) + a_gq_l0
[docs] @nb.njit(cache=True) def A_gg(n, cache, L): r"""Compute |NNLO| gluon-gluon |OME| :math:`A_{gg,H}^{S,(2)}`. Implements :eqref:`187` of :cite:`Bierenbaum:2022biv`. Parameters ---------- n : complex Mellin moment cache: numpy.ndarray Harmonic sum cache L : float :math:`\ln(\mu_F^2 / m_h^2)` Returns ------- complex |NNLO| gluon-gluon |OME| :math:`A_{gg,H}^{S,(2)}` """ S1 = c.get(c.S1, cache, n) ggg1_canf = ( -5 * S1 / 9 + (-3 + 13 * n + 16 * n**2 + 6 * n**3 + 3 * n**4) / (9 * n**2 * (1 + n) ** 2) ) * 4 ggg1_cfnf = (4 + 2 * n - 8 * n**2 + n**3 + 5 * n**4 + 3 * n**5 + n**6) / ( n**3 * (1 + n) ** 3 ) gamma1_gg_hat = 8 * TR * (CA * ggg1_canf + CF * ggg1_cfnf) a_gg_f = ( -15 * n**8 - 60 * n**7 - 82 * n**6 - 44 * n**5 - 15 * n**4 - 4 * n**2 - 12 * n - 8 ) / (n**4 * (1 + n) ** 4) a_gg_a = ( 2 * (15 * n**6 + 45 * n**5 + 374 * n**4 + 601 * n**3 + 161 * n**2 - 24 * n + 36) ) / (27 * n**3 * (1 + n) ** 3) - (4 * S1 * (47 + 56 * n) / (27 * (1 + n))) a_gg_l0 = TR * (CF * a_gg_f + CA * a_gg_a) # here there is minus sing missing in the paper, # passing from eq 177 to 185 a_gg_l1 = gamma1_gg_hat / 2 # remove the nf dependence from # (2 * gamma0_gg(n, S1, nf) + 2 * beta_0(nf)) pgg0_beta0 = 8 * CA * (-(2 / (n + n**2)) + S1) a_gg_l2 = (1 / 8) * ( 2 * beta_0hat * pgg0_beta0 + 2 * gamma0_gq(n) * 2 * gamma0_qg(n, nf=1) + 8 * beta_0hat**2 ) return a_gg_l2 * L**2 + a_gg_l1 * (-L) + a_gg_l0
[docs] @nb.njit(cache=True) def A_singlet(n, cache, L, nf): r"""Compute the |NNLO| singlet |OME|. .. math:: A^{S,(2)} = \left(\begin{array}{cc} A_{gg, H}^{S,(2)} & A_{gq, H}^{S,(2)} & 0 \\ 0 & A_{qq,H}^{NS,(2)} & 0\\ A_{hg}^{S,(2)} & A_{hq}^{PS,(2)} & 0\\ \end{array}\right) Parameters ---------- n : complex Mellin moment cache: numpy.ndarray Harmonic sum cache L : float :math:`\ln(\mu_F^2 / m_h^2)` nf : int Number of active flavors Returns ------- numpy.ndarray |NNLO| singlet |OME| :math:`A^{S,(2)}(N)` """ return np.array( [ [A_gg(n, cache, L), A_gq(n, cache, L), 0.0], [0.0, A_qq_ns(n, cache, L), 0.0], [A_hg(n, cache, L), A_hq_ps(n, cache, L, nf), 0.0], ], np.complex_, )
[docs] @nb.njit(cache=True) def A_ns(n, cache, L): r"""Compute the |NNLO| non-singlet |OME|. .. math:: A^{NS,(2)} = \left(\begin{array}{cc} A_{qq,H}^{NS,(2)} & 0 \\ 0 & 0 \\ \end{array}\right) Parameters ---------- n : complex Mellin moment cache: numpy.ndarray Harmonic sum cache L : float :math:`\ln(\mu_F^2 / m_h^2)` Returns ------- numpy.ndarray |NNLO| non-singlet |OME| :math:`A^{NS,(2)}` """ return np.array([[A_qq_ns(n, cache, L), 0.0], [0 + 0j, 0 + 0j]], np.complex_)