Source code for ekomark.benchmark.external.pegasus_utils

"""|Pegasus| interface."""

import numpy as np

from eko import basis_rotation as br


[docs] def compute_pegasus_data(theory, operators, skip_pdfs, rotate_to_evolution_basis=False): """ Run Pegasus to compute operators. Parameters ---------- theory : dict theory card operators : dict operators card skip_pdfs : list list of pdfs (pid or name) to skip rotate_to_evolution_basis: bool rotate to evolution basis Returns ------- ref : dict output containing: target_xgrid, values """ import pegasus # pylint:disable=import-error,import-outside-toplevel target_xgrid = operators["interpolation_xgrid"] # init pegasus nf = theory["NfFF"] if theory["ModEv"] in ["EXA", "perturbative-exact"]: imodev = 1 elif theory["ModEv"] in ["EXP", "decompose-expanded", "perturbative-expanded"]: imodev = 2 elif theory["ModEv"] in ["ordered-truncated"]: imodev = 3 elif theory["ModEv"] in ["TRN"]: imodev = 4 # 4 is random - just not 1-3 else: raise ValueError(f"Method {theory['ModEv']} is not recognized. ") ivfns = 0 if theory["FNS"] == "FFNS" else 1 if theory["Q0"] != theory["Qref"]: raise ValueError("Initial scale Q0 must be equal to Qref in Pegasus.") if operators["polarized"]: pegasus.initpol(imodev, theory["PTO"], ivfns, nf, 1.0 / theory["XIF"] ** 2) pegasus.initpinp( theory["alphas"], theory["Qref"] ** 2, (theory["kcThr"] * theory["mc"]) ** 2, (theory["kbThr"] * theory["mb"]) ** 2, (theory["ktThr"] * theory["mt"]) ** 2, ) else: pegasus.initevol(imodev, theory["PTO"], ivfns, nf, 1.0 / theory["XIF"] ** 2) pegasus.initinp( theory["alphas"], theory["Qref"] ** 2, (theory["kcThr"] * theory["mc"]) ** 2, (theory["kbThr"] * theory["mb"]) ** 2, (theory["ktThr"] * theory["mt"]) ** 2, ) # better return always the flavor basis and then rotate # if rotate_to_evolution_basis: # ipstd = 0 # labels = list(br.evol_basis) # else: # ipstd = 1 # photon pdf is not in pagsus output labels = list(br.flavor_basis_pids) labels.remove(22) # swap u, d and ubar and dbar labels[4], labels[5] = labels[5], labels[4] labels[-6], labels[-5] = labels[-5], labels[-6] # run pegaus out_tabs = {} for mu in operators["mugrid"]: tab = {} for x in target_xgrid: # last two numbers are the min and max pid to calculate, # keep everthing for simplicity. xf, _ = pegasus.xparton(x, mu**2, -6, 6) temp = dict(zip(labels, xf)) for pid in labels: if pid in skip_pdfs: continue if pid not in tab: tab[pid] = [] tab[pid].append(temp[pid]) # rotate if needed if rotate_to_evolution_basis: qed = theory["QED"] > 0 if not qed: evol_basis = br.evol_basis rotate_flavor_to_evolution = br.rotate_flavor_to_evolution else: evol_basis = br.unified_evol_basis rotate_flavor_to_evolution = br.rotate_flavor_to_unified_evolution pdfs = np.array( [ tab[pid] if pid in tab else np.zeros(len(target_xgrid)) for pid in br.flavor_basis_pids ] ) evol_pdf = rotate_flavor_to_evolution @ pdfs tab = dict(zip(evol_basis, evol_pdf)) out_tabs[mu**2] = tab ref = {"target_xgrid": target_xgrid, "values": out_tabs} return ref