flavio.physics.bdecays.bvll.qcdf_interpolate module
Functions for interpolated version of the QCDF spectator scattering corrections.
Rationale for this is that a) The QCDF corrections are very small, in fact smaller than hadronic uncertainties for most observables (except maybe isospin asymmetries) b) They are very costly computing-wise as they involve numerical integrals over light-cone distribution amplitudes.
Interpolating them leads to a drastic speed-up at the cost of some (unnecessary) precision.
"""Functions for interpolated version of the QCDF spectator scattering corrections. Rationale for this is that a) The QCDF corrections are very small, in fact smaller than hadronic uncertainties for most observables (except maybe isospin asymmetries) b) They are very costly computing-wise as they involve numerical integrals over light-cone distribution amplitudes. Interpolating them leads to a drastic speed-up at the cost of some (unnecessary) precision. """ import flavio import numpy as np import pkgutil import pkg_resources import scipy.interpolate import math import warnings q2_arr = np.arange(0 + 1e-6, 9 + 1e-6, 0.1) data = np.load(pkg_resources.resource_filename('flavio.physics', 'data/qcdf_interpolate/qcdf_interpolate.npz')) interpolating_function_dict = {} for process, hel_amps in data.items(): interpolating_function_dict[process] = {} interpolating_function_dict[process] = scipy.interpolate.interp1d(q2_arr, hel_amps.view(float), axis=0) def helicity_amps_qcdf(q2, par, B, V, cp_conjugate=False, contribution='all'): if q2 > 6: warnings.warn("The QCDF corrections should not be trusted for q2 above 6 GeV^2") # ml = par['m_'+lep] # if lep == 'tau' or q2 < 4*ml**2 or q2 > 9: # return {('0' ,'V'): 0, ('pl' ,'V'): 0, ('mi' ,'V'): 0} process = B + '->' + V # e.g. B0->K*0mumu if cp_conjugate: array_name = process + ' CP conjugate ' + contribution else: array_name = process + ' ' + contribution ha = {} ha_arr = interpolating_function_dict[array_name](q2).view(complex) # dividing the q^2 poles back in ha[('pl','V')] = ha_arr[0] / q2 ha[('mi','V')] = ha_arr[1] / q2 ha[('0','V')] = ha_arr[2] / math.sqrt(q2) return ha
Module variables
var data
var hel_amps
var interpolating_function_dict
var process
var q2_arr
Functions
def helicity_amps_qcdf(
q2, par, B, V, cp_conjugate=False, contribution='all')
def helicity_amps_qcdf(q2, par, B, V, cp_conjugate=False, contribution='all'): if q2 > 6: warnings.warn("The QCDF corrections should not be trusted for q2 above 6 GeV^2") # ml = par['m_'+lep] # if lep == 'tau' or q2 < 4*ml**2 or q2 > 9: # return {('0' ,'V'): 0, ('pl' ,'V'): 0, ('mi' ,'V'): 0} process = B + '->' + V # e.g. B0->K*0mumu if cp_conjugate: array_name = process + ' CP conjugate ' + contribution else: array_name = process + ' ' + contribution ha = {} ha_arr = interpolating_function_dict[array_name](q2).view(complex) # dividing the q^2 poles back in ha[('pl','V')] = ha_arr[0] / q2 ha[('mi','V')] = ha_arr[1] / q2 ha[('0','V')] = ha_arr[2] / math.sqrt(q2) return ha