Source code for eko.evolution_operator.matching_condition

"""Defines the matching conditions for the |VFNS| evolution."""

from .. import basis_rotation as br
from .. import member


[docs] class MatchingCondition(member.OperatorBase): """ Matching conditions for |PDF| at threshold. The continuation of the (formally) heavy non-singlet distributions with either the full singlet :math:`S` or the full valence :math:`V` is considered "trivial". Instead at |NNLO| additional terms ("non-trivial") enter. """
[docs] @classmethod def split_ad_to_evol_map( cls, op_members, nf, q2_thr, intrinsic_range, qed, ): """ Create the instance from the |OME|. Parameters ---------- op_members : eko.operator_matrix_element.OperatorMatrixElement.op_members Attribute of :class:`~eko.operator_matrix_element.OperatorMatrixElement` containing the |OME| nf : int number of active flavors *below* the threshold q2_thr: float threshold value intrinsic_range : list list of intrinsic quark pids qed : bool activate qed """ m = { "S.S": op_members[(100, 100)], "S.g": op_members[(100, 21)], "g.S": op_members[(21, 100)], "g.g": op_members[(21, 21)], "V.V": op_members[(200, 200)], } # add elements which are already active if not qed: for f in range(2, nf + 1): n = f**2 - 1 m[f"V{n}.V{n}"] = m["V.V"] m[f"T{n}.T{n}"] = m["V.V"] else: m.update( { "Sdelta.Sdelta": op_members[(200, 200)], "Vdelta.Vdelta": op_members[(200, 200)], "ph.ph": member.OpMember.id_like(op_members[(200, 200)]).copy(), } ) names = {3: "d3", 4: "u3", 5: "d8", 6: "u8"} for k in range(3, nf + 1): m[f"V{names[k]}.V{names[k]}"] = m["V.V"] m[f"T{names[k]}.T{names[k]}"] = m["V.V"] # activate the next heavy quark hq = br.quark_names[nf] m.update( { # f"{hq}-.V": op_members[(br.matching_hminus_pid, 200)], f"{hq}+.S": op_members[(br.matching_hplus_pid, 100)], f"{hq}+.g": op_members[(br.matching_hplus_pid, 21)], } ) # intrinsic matching if len(intrinsic_range) != 0: op_id = member.OpMember.id_like(op_members[(200, 200)]) for intr_fl in intrinsic_range: ihq = br.quark_names[intr_fl - 1] # find name if intr_fl > nf + 1: # keep the higher quarks as they are m[f"{ihq}+.{ihq}+"] = op_id.copy() m[f"{ihq}-.{ihq}-"] = op_id.copy() elif intr_fl == nf + 1: # match the missing contribution from h+ and h- m.update( { f"{ihq}+.{ihq}+": op_members[ (br.matching_hplus_pid, br.matching_hplus_pid) ], f"S.{ihq}+": op_members[(100, br.matching_hplus_pid)], f"g.{ihq}+": op_members[(21, br.matching_hplus_pid)], f"{ihq}-.{ihq}-": op_members[ (br.matching_hminus_pid, br.matching_hminus_pid) ], # f"V.{ihq}-": op_members[(200, br.matching_hminus_pid)], } ) return cls.promote_names(m, q2_thr)