Source code for yadism.coefficient_functions.splitting_functions

import numpy as np
from eko import basis_rotation as br
from eko import beta

from . import lo, nlo

raw_labels = [lo.raw_labels, nlo.raw_labels]


[docs] def empty_gluon(matrices, nf): return { (21, 100): np.zeros_like(matrices["P_qq_0", nf]), (21, 21): np.zeros_like(matrices["P_qq_0", nf]), }
[docs] def joint_lo(fnc, matrices, nf, add_gluonic=True): d = { (br.non_singlet_pids_map["ns+"], 0): fnc("P_qq_0", matrices, nf), (br.non_singlet_pids_map["ns-"], 0): fnc("P_qq_0", matrices, nf), (br.non_singlet_pids_map["nsV"], 0): fnc("P_qq_0", matrices, nf), (100, 100): fnc("P_qq_0", matrices, nf), (100, 21): fnc("P_qg_0", matrices, nf), } if add_gluonic: d[(21, 100)] = fnc("P_gq_0", matrices, nf) d[(21, 21)] = fnc("P_gg_0", matrices, nf) else: d.update(empty_gluon(matrices, nf)) return d
[docs] def c110(lab, matrices, nf): return matrices[lab, nf]
[docs] def c211(lab, matrices, nf): # add -beta0 * identity # where identity is both in interpolation and channel space beta0 = beta.beta_qcd_as2(nf) * np.eye(matrices[lab, nf].shape[0]) if lab in ["P_gq_0", "P_qg_0"]: beta0 = np.zeros_like(matrices[lab, nf]) return matrices[lab, nf] - beta0
[docs] def c220ns(matrices, nf): return c220((("P_qq_0^2",), "P_qq_0"), matrices, nf)
[docs] def c220(labs, matrices, nf): return 0.5 * ( sum(matrices[lab, nf] for lab in labs[0]) - beta.beta_qcd_as2(nf) * matrices[labs[1], nf] )
[docs] def sector_mapping(order, matrices, nf): smap = {} if order >= 1: smap.update({(1, 1, 0): joint_lo(c110, matrices, nf, add_gluonic=False)}) if order >= 2: smap.update( { (2, 1, 0): { (br.non_singlet_pids_map["ns+"], 0): matrices["P_nsp_1", nf], (br.non_singlet_pids_map["ns-"], 0): matrices["P_nsm_1", nf], (br.non_singlet_pids_map["nsV"], 0): matrices["P_nsm_1", nf], (100, 100): matrices["P_qq_1", nf], (100, 21): matrices["P_qg_1", nf], **empty_gluon(matrices, nf), }, (2, 1, 1): joint_lo(c211, matrices, nf), (2, 2, 0): { (br.non_singlet_pids_map["ns+"], 0): c220ns(matrices, nf), (br.non_singlet_pids_map["ns-"], 0): c220ns(matrices, nf), (br.non_singlet_pids_map["nsV"], 0): c220ns(matrices, nf), (100, 100): c220( (("P_qq_0^2", "P_qg_0P_gq_0"), "P_qq_0"), matrices, nf ), (100, 21): c220( (("P_qq_0P_qg_0", "P_qg_0P_gg_0"), "P_qg_0"), matrices, nf ), **empty_gluon(matrices, nf), }, } ) # TODO: _N3LO_ add NNLO splitting functions and scale variations return smap