Source code for gepard.dvmp

"""Deeply Virtual Meson Production (DVMP) observables."""
from __future__ import annotations

from math import pi
from typing import Dict
import numpy as np

from . import constants, data, model, qcd, theory, wilson


[docs] class DVMP(theory.Theory): """DVMP observables. Implements cross-section for electroproduction of meson. """
[docs] def _XGAMMA_DVMP_t_Approx(self, pt: data.DataPoint) -> float: """Partial (longitudinal) gamma* p -> V p cross section w.r.t. Mandelstam t. Args: pt: instance of DataPoint Returns: Cross-section differential in t. Approximate formula valid for small xB. """ # 4 * pi**2 * alpha_em * GeV2nb = 112175.5 res = 112175.5 * pt.xB**2 * ( self.m.ImH_V(pt)**2 + self.m.ReH_V(pt)**2) / pt.Q2**2 return res
_XGAMMA_DVMP_t = _XGAMMA_DVMP_t_Approx
[docs] class MellinBarnesTFF(model.ParameterModel): """DVMP Transition Form Factors modelled as Mellin-Barnes integral."""
[docs] def __init__(self, **kwargs): self.rdvmpr2 = kwargs.setdefault('rdvmpr2', 1) # ratio Q2/(DVMP renorm. scale sq.) self.wce_dvmp: Dict[float, np.ndarray] = {} # correction factors for NLO expressions # needed to be able to have some tests w.r.t. old wrong notebooks # 1. correction introduced below Eq. (20) of 1612.01937. Set # to zero to get agreement with older results self.corr_c1dvmp_one = 1 # 2. Prefactors to kill parts of NLO hard scattering amplitude # Set to zero to kill corresponding part. (For checking.) self.Q1_prefac = 1 self.PS1_prefac = 1 self.G1_prefac = 1 super().__init__(**kwargs)
[docs] def tff(self, xi: float, t: float, Q2: float, meson: str = 'rho0') -> np.ndarray: """Return array(ReH_V, ImH_V, ReE_V, ...) of DVMP transition FFs. Only vector mesons are implemented, thus _V. """ assert self.nf == 4 astrong = 2 * pi * qcd.as2pf(self.p, self.nf, Q2, self.asp[self.p], self.r20) try: wce_ar_dvmp = self.wce_dvmp[Q2] except KeyError: # calculate it wce_ar_dvmp = wilson.calc_wce_dvmp(self, Q2) # memorize it for future self.wce_dvmp[Q2] = wce_ar_dvmp # Evaluations depending on model parameters: wce_da = np.einsum('skgf,g->skf', wce_ar_dvmp, self.gegenbauers()) h_prerot = self.H(xi, t) if meson == 'rho0': frot = self.frot_rho0_4 FV = constants.F_rho0 elif meson == 'phi': frot = self.frot_phi_4 FV = constants.F_phi else: raise ValueError("{} unknown. Use 'rho0' or 'phi'".format(meson)) h = np.einsum('fa,ja->jf', frot, h_prerot) reh, imh = self._mellin_barnes_integral(xi, wce_da, h) return (constants.CF * FV * astrong / constants.NC / np.sqrt(Q2) * np.array([reh, imh, 0, 0, 0, 0, 0, 0]))
[docs] def ImH_V(self, pt: data.DataPoint) -> np.ndarray: """Return Im(TFF H) for kinematic point.""" if pt.process == 'gammastarp2rho0p': tffs = self.tff(pt.xi, pt.t, pt.Q2, 'rho0') elif pt.process == 'gammastarp2phip': tffs = self.tff(pt.xi, pt.t, pt.Q2, 'phi') return tffs[1]
[docs] def ReH_V(self, pt: data.DataPoint) -> np.ndarray: """Return Re(TFF H) for kinematic point.""" if pt.process == 'gammastarp2rho0p': tffs = self.tff(pt.xi, pt.t, pt.Q2, 'rho0') elif pt.process == 'gammastarp2phip': tffs = self.tff(pt.xi, pt.t, pt.Q2, 'phi') return tffs[0]