"""LHAPDF info file utilities."""
import copy
import math
from typing import Any, Dict
import numpy as np
from eko import couplings
from eko.io.runcards import OperatorCard, TheoryCard
from .genpdf import load
from .utils import regroup_evolgrid
[docs]
def build(
theory_card: TheoryCard,
operators_card: OperatorCard,
num_members: int,
info_update: dict,
) -> dict:
"""Generate a lhapdf info file.
Parameters
----------
theory_card :
theory card
operators_card :
operators card
num_members :
number of pdf set members
info_update :
additional info to update
Returns
-------
dict
info file in lhapdf format
"""
template_info = copy.deepcopy(load.template_info)
template_info["SetDesc"] = (
"Evolved PDF from " + str(operators_card.init[0]) + " GeV"
)
template_info["Authors"] = ""
template_info["FlavorScheme"] = "variable"
template_info.update(info_update)
template_info["NumFlavors"] = max(nf for _, nf in operators_card.mugrid)
template_info["Flavors"] = [-6, -5, -4, -3, -2, -1, 1, 2, 3, 4, 5, 6, 21, 22]
# TODO actually point to input grid
template_info["XMin"] = float(operators_card.xgrid.raw[0])
template_info["XMax"] = float(operators_card.xgrid.raw[-1])
template_info["NumMembers"] = num_members
template_info["OrderQCD"] = theory_card.order[0] - 1
template_info["QMin"] = round(math.sqrt(operators_card.mu2grid[0]), 4)
template_info["QMax"] = round(math.sqrt(operators_card.mu2grid[-1]), 4)
template_info["MZ"] = theory_card.couplings.ref[0]
template_info["MUp"] = 0.0
template_info["MDown"] = 0.0
template_info["MStrange"] = 0.0
template_info["MCharm"] = theory_card.heavy.masses.c.value
template_info["MBottom"] = theory_card.heavy.masses.b.value
template_info["MTop"] = theory_card.heavy.masses.t.value
# dump alphas
template_info.update(build_alphas(theory_card, operators_card))
return template_info
[docs]
def build_alphas(
theory_card: TheoryCard,
operators_card: OperatorCard,
) -> dict:
"""Generate a couplings section of lhapdf info file.
Parameters
----------
theory_card : dict
theory card
operators_card : dict
operators card
Returns
-------
dict
info file section in lhapdf format
"""
# start with meta stuff
template_info: Dict[str, Any] = {}
template_info["AlphaS_MZ"] = theory_card.couplings.alphas
template_info["AlphaS_OrderQCD"] = theory_card.order[0] - 1
# prepare
evolgrid = regroup_evolgrid(operators_card.mugrid)
evmod = couplings.couplings_mod_ev(operators_card.configs.evolution_method)
quark_masses = [(x.value) ** 2 for x in theory_card.heavy.masses]
sc = couplings.Couplings(
theory_card.couplings,
theory_card.order,
evmod,
quark_masses,
hqm_scheme=theory_card.heavy.masses_scheme,
thresholds_ratios=np.power(list(iter(theory_card.heavy.matching_ratios)), 2.0),
)
# add actual values
alphas_values = []
alphas_qs = []
for nf, mus in evolgrid.items():
for mu in mus:
alphas_values.append(float(4.0 * np.pi * sc.a_s(mu * mu, nf_to=nf)))
alphas_qs.append(mu)
template_info["AlphaS_Vals"] = alphas_values
template_info["AlphaS_Qs"] = alphas_qs
return template_info