Module flavio.physics.bdecays.bllgamma

Functions for the branching ratio of the leptonic decay $B_q\to\ell^+\ell^-\gamma$, where $q=d$ or $s$ and $\ell=e$, $\mu$ or $\tau$. The branching ratio is taken from hep-ph/0410146

Functions

def B10(s, par, B, ff, ff0, lep, wc)
Expand source code
def B10(s, par, B, ff, ff0, lep, wc):
    flavio.citations.register("Melikhov:2004mk")
    flavio.citations.register("Guadagnoli:2016erb")
    F1 = getF1(s, par, B, ff, ff0, lep, wc)
    F2 = getF2(s, par, B, ff, ff0, lep, wc)
    mlh = par['m_'+lep]/par['m_'+B]
    label = meson_quark[B]+lep+lep
    return (s + 4*mlh**2)*(F1 + F2) - 8*mlh**2*abs(wc['C10_'+label])**2*(ff['v']**2+ff['a']**2)
def B12(s, par, B, ff, ff0, lep, wc)
Expand source code
def B12(s, par, B, ff, ff0, lep, wc):
    flavio.citations.register("Melikhov:2004mk")
    flavio.citations.register("Guadagnoli:2016erb")
    F1 = getF1(s, par, B, ff, ff0, lep, wc)
    F2 = getF2(s, par, B, ff, ff0, lep, wc)
    return s*(F1+F2)
def B120(s, par, B, ff, ff0, lep, wc)
Expand source code
def B120(s, par, B, ff, ff0, lep, wc):
    flavio.citations.register("Melikhov:2004mk")
    flavio.citations.register("Guadagnoli:2016erb")
    scale = config['renormalization scale']['bllgamma']
    mb = running.get_mb(par, scale, nf_out=5)
    mbh = mb/par['m_'+B]
    mlh = par['m_'+lep]/par['m_'+B]
    bq = meson_quark[B]
    label = bq+lep+lep
    fftv, ffta = getfft(s, par, B, ff, ff0, lep, wc)
    return -16*mlh**2*(1-s)*(ff['v']*_Re(wc['C9_'+label]*_Co(wc['C10_'+label])) + 2*mbh/s*_Re(_Co(wc['C10_'+label])*fftv*wc['C7_'+bq]))
def bllg_dbrdq2(q2, wc_obj, par, B, lep)
Expand source code
def bllg_dbrdq2(q2, wc_obj, par, B, lep):
    if q2 >= 8.7 and q2 < 14 and lep != 'tau':
        warnings.warn("The predictions in the region of narrow charmonium resonances are not meaningful")
    if q2 >= 0.7 and q2 < 1.1:
        warnings.warn("Numerical integration in the region of phi, rho and omega resonances may be unreliable.")
    tauB = par['tau_'+B]
    ml = par['m_'+lep]
    mB = par['m_'+B]
    scale = config['renormalization scale']['bllgamma']
    ff = get_ff(q2, par, B)
    ff0 = get_ff(0, par, B)
    label = meson_quark[B]+lep+lep
    wc = wctot_dict(wc_obj, label, scale, par)
    if q2 <= 4*ml**2 or q2 > mB**2:
        return 0
    else:
        dBR = tauB * dGdsMN(q2/mB**2, par, B, ff, ff0, lep, wc)
        return dBR
def bllg_dbrdq2_func(B, lep)
Expand source code
def bllg_dbrdq2_func(B, lep):
    def fct(wc_obj, par, q2):
        return bllg_dbrdq2(q2, wc_obj, par, B, lep)
    return fct
def bllg_dbrdq2_int(q2min, q2max, wc_obj, par, B, lep, epsrel=0.005)
Expand source code
def bllg_dbrdq2_int(q2min, q2max, wc_obj, par, B, lep, epsrel=0.005):
    def obs(q2):
        return bllg_dbrdq2(q2, wc_obj, par, B, lep)
    return flavio.math.integrate.nintegrate(obs, q2min, q2max, epsrel=epsrel)/(q2max-q2min)
def bllg_dbrdq2_int_func(B, lep)
Expand source code
def bllg_dbrdq2_int_func(B, lep):
    def fct(wc_obj, par, q2min, q2max):
        return bllg_dbrdq2_int(q2min, q2max, wc_obj, par, B, lep)
    return fct
def dG12dsMN(s, par, B, ff, ff0, lep, wc)
Expand source code
def dG12dsMN(s, par, B, ff, ff0, lep, wc):
    flavio.citations.register("Melikhov:2004mk")
    mlh = par['m_'+lep]/par['m_'+B]
    pref = 4*prefactor(s, par, B, ff, lep, wc)*par['f_'+B]/par['m_'+B]*(1-s)
    return pref*atanh(sqrt(1-4*mlh**2/s))*B120(s, par, B, ff, ff0, lep, wc)
def dG1dsMN(s, par, B, ff, ff0, lep, wc)
Expand source code
def dG1dsMN(s, par, B, ff, ff0, lep, wc):
    flavio.citations.register("Melikhov:2004mk")
    mlh = par['m_'+lep]/par['m_'+B]
    pref = prefactor(s, par, B, ff, lep, wc)*(1-s)**3*sqrt(1-4*mlh**2/s)
    return pref*(B10(s, par, B, ff, ff0, lep, wc) + (s - 4*mlh**2)/(3*s)*B12(s, par, B, ff, ff0, lep, wc))
def dG2dsMN(s, par, B, ff, ff0, lep, wc)
Expand source code
def dG2dsMN(s, par, B, ff, ff0, lep, wc):
    flavio.citations.register("Melikhov:2004mk")
    mlh = par['m_'+lep]/par['m_'+B]
    bq = meson_quark[B]
    label = bq+lep+lep
    pref = 16*prefactor(s, par, B, ff, lep, wc)*(par['f_'+B]/par['m_'+B]*abs(wc['C10_'+label])*mlh)**2/(1-s)
    return pref*(-8*sqrt(s-4*mlh**2)*sqrt(s)+4*atanh(sqrt(1-4*mlh**2/s))*(1+s-mlh**2*(1-s)**2))
def dGdsMN(s, par, B, ff, ff0, lep, wc)
Expand source code
def dGdsMN(s, par, B, ff, ff0, lep, wc):
    return dG1dsMN(s, par, B, ff, ff0, lep, wc) + dG2dsMN(s, par, B, ff, ff0, lep, wc) + dG12dsMN(s, par, B, ff, ff0, lep, wc)
def getF1(s, par, B, ff, ff0, lep, wc)
Expand source code
def getF1(s, par, B, ff, ff0, lep, wc):
    flavio.citations.register("Melikhov:2004mk")
    scale = config['renormalization scale']['bllgamma']
    mb = running.get_mb(par, scale, nf_out=5)
    mbh = mb/par['m_'+B]
    bq = meson_quark[B]
    label = bq+lep+lep
    fftv, ffta = getfft(s, par, B, ff, ff0, lep, wc)
    return (abs(wc['C9_'+label])**2 + abs(wc['C10_'+label])**2)*ff['v']**2 + 4*mbh**2/s**2*abs(wc['C7_'+bq]*fftv)**2 + 4*mbh/s*ff['v']*_Re(wc['C7_'+bq]*ffta*_Co(wc['C9_'+label]))
def getF2(s, par, B, ff, ff0, lep, wc)
Expand source code
def getF2(s, par, B, ff, ff0, lep, wc):
    flavio.citations.register("Melikhov:2004mk")
    scale = config['renormalization scale']['bllgamma']
    mb = running.get_mb(par, scale, nf_out=5)
    mbh = mb/par['m_'+B]
    bq = meson_quark[B]
    label = bq+lep+lep
    fftv, ffta = getfft(s, par, B, ff, ff0, lep, wc)
    return (abs(wc['C9_'+label])**2 + abs(wc['C10_'+label])**2)*ff['a']**2 + 4*mbh**2/s**2*abs(wc['C7_'+bq]*ffta)**2 + 4*mbh/s*ff['a']*_Re(wc['C7_'+bq]*ffta*_Co(wc['C9_'+label]))
def get_ff(q2, par, B)
Expand source code
def get_ff(q2, par, B):
    return AuxiliaryQuantity['B->gamma form factor'].prediction(par_dict=par, wc_obj=None, q2=q2, B=B)
def getfft(s, par, B, ff, ff0, lep, wc)
Expand source code
def getfft(s, par, B, ff, ff0, lep, wc):
    scale = config['renormalization scale']['bllgamma']
    mb = running.get_mb(par, scale, nf_out=5)
    bq = meson_quark[B]
    a1 = -wc['C1_'+bq]-wc['C2_'+bq]/3 #minus sign comes from WC sign convention
    fftv = ff['tv']+ff0['tv']+16/3*a1/wc['C7_'+bq]*par['f_'+B]/mb
    ffta = ff['ta']+ff0['ta']

    #Add light meson resonances
    resonances = {'Bs': ['phi'], 'B0': ['rho0', 'omega']}
    flavio.citations.register("Kozachuk:2017mdk")
    fVtofVemfactors = {'phi': -1/3, 'rho0': 1/sqrt(2), 'omega': 1/(3*sqrt(2))} # Given in Sec. 8.A.3 of 1712.07926
    #We use the general B->rho and B->omega parameters, hence the isotopic factors
    resgV = {('Bs','phi'): -par['Bs->phi BSZ a0_T1'],
             ('B0','rho0'): 1/sqrt(2)*par['B->rho BSZ a0_T1'],
             ('B0','omega'): -1/sqrt(2)*par['B->omega BSZ a0_T1'],}
    for V in resonances[B]:
        gV = resgV[(B, V)]
        fV = fVtofVemfactors[V]*par['f_'+V]
        fftv -= 2*fV*gV*par['m_'+B]**2*s/par['m_'+V]/(par['m_'+B]**2*s-par['m_'+V]**2+1j*par['m_'+V]/par['tau_'+V])
        ffta -= 2*fV*gV*par['m_'+B]**2*s/par['m_'+V]/(par['m_'+B]**2*s-par['m_'+V]**2+1j*par['m_'+V]/par['tau_'+V])

    return (fftv, ffta)
def prefactor(s, par, B, ff, lep, wc)
Expand source code
def prefactor(s, par, B, ff, lep, wc):
    GF = par['GF']
    scale = config['renormalization scale']['bllgamma']
    alphaem = running.get_alpha(par, scale)['alpha_e']
    bq = meson_quark[B]
    xi_t = ckm.xi('t',bq)(par)
    return GF**2/(2**10*pi**4)*abs(xi_t)**2*alphaem**3*par['m_'+B]**5