Module flavio.physics.bdecays.lambdablambdall

Functions for exclusive $\Lambda_b\to \Lambda\ell^+\ell^-$ decays.

Functions

def AFBh_num(K)
Expand source code
def AFBh_num(K):
    return K['2ss'] + K['2cc']/2.
def AFBl_num(K)
Expand source code
def AFBl_num(K):
    return (3/2.) * K['1c']
def AFBlh_num(K)
Expand source code
def AFBlh_num(K):
    return (3/4.) * K['2c']
def FL_num(K)
Expand source code
def FL_num(K):
    return 2*K['1ss'] - K['1cc']
def K_num(K, i)
Expand source code
def K_num(K, i):
    return K[i]
def angular_coefficients(ta, alpha, Plb)
Expand source code
def angular_coefficients(ta, alpha, Plb):
    r"""Angular coefficients of $\Lambda_b\to \Lambda\ell^+\ell^-$ in terms of
    transversity amplitudes and decay parameter $\alpha$.

    See (3.29)-(3.32) of arXiv:1410.2115 for the unpolarised case,
    and (15)-(17) of arXiv:1710.00746 for the polarised one."""
    flavio.citations.register("Boer:2014kda")
    flavio.citations.register("Blake:2017une")

    K = {}

    # Most observables that have (1-beta^2) terms are independent or only
    # appear in more complex combinations of three or more observables.
    K['1ss'] = (abs(ta['perp1', 'R'])**2
                + abs(ta['perp1', 'L'])**2
                + abs(ta['para1', 'R'])**2
                + abs(ta['para1', 'L'])**2
                + 2.0 * abs(ta['perp0', 'R'])**2
                + 2.0 * abs(ta['perp0', 'L'])**2
                + 2.0 * abs(ta['para0', 'R'])**2
                + 2.0 * abs(ta['para0', 'L'])**2) / 4.0  # K1
    K['2ss'] = (ta['perp1', 'R'] * ta['para1', 'R'].conj()
                + ta['perp1', 'L'] * ta['para1', 'L'].conj()
                + 2.0 * ta['perp0', 'R'] * ta['para0', 'R'].conj()
                + 2.0 * ta['perp0', 'L'] * ta['para0', 'L'].conj()).real * alpha / 2.0  # K4
    K['2cc'] = (ta['perp1', 'R'] * ta['para1', 'R'].conj()
                + ta['perp1', 'L'] * ta['para1', 'L'].conj()).real * alpha  # K5
    K['11'] = - (ta['para1', 'R'] * ta['perp1', 'R'].conj()
                 + ta['para1', 'L'] * ta['perp1', 'L'].conj()
                 - 2.0 * ta['para0', 'R'] * ta['perp0', 'R'].conj()
                 - 2.0 * ta['para0', 'L'] * ta['perp0', 'L'].conj()).real * Plb / 2.0  # conjugated wrt to eos
    K['14'] = - (abs(ta['perp1', 'R'])**2
                 + abs(ta['perp1', 'L'])**2
                 + abs(ta['para1', 'R'])**2
                 + abs(ta['para1', 'L'])**2
                 - 2.0 * abs(ta['perp0', 'R'])**2
                 - 2.0 * abs(ta['perp0', 'L'])**2
                 - 2.0 * abs(ta['para0', 'R'])**2
                 - 2.0 * abs(ta['para0', 'L'])**2) * alpha * Plb / 4.0
    K['30'] = (ta['perp0', 'R'] * ta['para0', 'R'].conj()
               + ta['perp0', 'L'] * ta['para0', 'L'].conj()).imag * alpha * Plb
    K['32'] = (abs(ta['perp0', 'R'])**2
               + abs(ta['perp0', 'L'])**2
               - abs(ta['para0', 'R'])**2
               - abs(ta['para0', 'L'])**2) * alpha * Plb / 2.0
    K['33'] = (abs(ta['perp1', 'R'])**2
               + abs(ta['perp1', 'L'])**2
               - abs(ta['para1', 'R'])**2
               - abs(ta['para1', 'L'])**2) * alpha * Plb / 4.0

    # The observables pairs (K2, K15), (K6, K13), and (K3, K16) are not
    # independent. Note that K2 and K15 differ in the massive lepton case.
    K2K15 = (abs(ta['perp1', 'R'])**2
             + abs(ta['perp1', 'L'])**2
             + abs(ta['para1', 'R'])**2
             + abs(ta['para1', 'L'])**2) / 2.0
    K3K16 = - (ta['perp1', 'R'] * ta['para1', 'R'].conj()
               - ta['perp1', 'L'] * ta['para1', 'L'].conj()).real
    K6K13 = - (abs(ta['perp1', 'R'])**2 - abs(ta['perp1', 'L'])**2
               + abs(ta['para1', 'R'])**2 - abs(ta['para1', 'L'])**2) / 2.0

    K['1cc'] = K2K15
    K['15'] = - alpha * Plb * K2K15

    K['1c'] = K3K16
    K['16'] = - alpha * Plb * K3K16

    K['2c'] = alpha * K6K13
    K['13'] = - Plb * K6K13

    # Many of the observables appear in pairs where one is the real and the other
    # is the imaginary part of the same amplitude combination. Note that K12 has
    # additional terms when considering massive leptons while K34 does not change.
    K7K19 = (ta['perp1', 'R'] * ta['para0', 'R'].conj()
             - ta['para1', 'R'] * ta['perp0', 'R'].conj()
             + ta['perp1', 'L'] * ta['para0', 'L'].conj()
             - ta['para1', 'L'] * ta['perp0', 'L'].conj()) * alpha / sqrt(2.0)
    K8K20 = (ta['perp1', 'R'] * ta['perp0', 'R'].conj()
             - ta['para1', 'R'] * ta['para0', 'R'].conj()
             + ta['para1', 'L'] * ta['para0', 'L'].conj()
             - ta['perp1', 'L'] * ta['perp0', 'L'].conj()) * alpha / sqrt(2.0)
    K9K17 = (ta['perp1', 'R'] * ta['perp0', 'R'].conj()
             - ta['para1', 'R'] * ta['para0', 'R'].conj()
             + ta['perp1', 'L'] * ta['perp0', 'L'].conj()
             - ta['para1', 'L'] * ta['para0', 'L'].conj()) * alpha / sqrt(2.0)
    K10K18 = (ta['perp1', 'R'] * ta['para0', 'R'].conj()
              - ta['para1', 'R'] * ta['perp0', 'R'].conj()
              + ta['para1', 'L'] * ta['perp0', 'L'].conj()
              - ta['perp1', 'L'] * ta['para0', 'L'].conj()) * alpha / sqrt(2.0)
    K21K27 = (ta['para1', 'R'] * ta['para0', 'R'].conj()
              + ta['perp1', 'R'] * ta['perp0', 'R'].conj()
              + ta['para1', 'L'] * ta['para0', 'L'].conj()
              + ta['perp1', 'L'] * ta['perp0', 'L'].conj()) * Plb / sqrt(2.0)
    K22K28 = (ta['para1', 'R'] * ta['perp0', 'R'].conj()
              + ta['perp1', 'R'] * ta['para0', 'R'].conj()
              - ta['perp1', 'L'] * ta['para0', 'L'].conj()
              - ta['para1', 'L'] * ta['perp0', 'L'].conj()) * Plb / sqrt(2.0)
    K23K25 = (ta['para1', 'R'] * ta['perp0', 'R'].conj()
              + ta['perp1', 'R'] * ta['para0', 'R'].conj()
              + ta['para1', 'L'] * ta['perp0', 'L'].conj()
              + ta['perp1', 'L'] * ta['para0', 'L'].conj()) * Plb / sqrt(2.0)
    K24K26 = (ta['para1', 'R'] * ta['para0', 'R'].conj()
              + ta['perp1', 'R'] * ta['perp0', 'R'].conj()
              - ta['para1', 'L'] * ta['para0', 'L'].conj()
              - ta['perp1', 'L'] * ta['perp0', 'L'].conj()) * Plb / sqrt(2.0)

    K12K34 = (ta['perp1', 'R'] * ta['para1', 'R'].conj()
              + ta['perp1', 'L'] * ta['para1', 'L'].conj()) * Plb

    K['4sc'] = K7K19.real
    K['19'] = Plb * K7K19.imag

    K['4s'] = K8K20.real
    K['20'] = Plb * K8K20.imag

    K['3sc'] = K9K17.imag
    K['17'] = Plb * K9K17.real

    K['3s'] = K10K18.imag
    K['18'] = Plb * K10K18.real

    K['12'] = - K12K34.real
    K['34'] = alpha * K12K34.imag / 2.0

    K['21'] = K21K27.imag
    K['27'] = - alpha * K21K27.real

    K['22'] = - K22K28.imag
    K['28'] = alpha * K22K28.real

    K['23'] = - K23K25.real
    K['25'] = alpha * K23K25.imag

    K['24'] = K24K26.real
    K['26'] = - alpha * K24K26.imag

    # In the massless lepton limit some observabbles are zero
    K['29'] = 0.0
    K['31'] = 0.0

    return K

Angular coefficients of $\Lambda_b\to \Lambda\ell^+\ell^-$ in terms of transversity amplitudes and decay parameter $\alpha$.

See (3.29)-(3.32) of arXiv:1410.2115 for the unpolarised case, and (15)-(17) of arXiv:1710.00746 for the polarised one.

def dGdq2(K)
Expand source code
def dGdq2(K):
    return 2*K['1ss'] + K['1cc']
def dbrdq2(q2, wc_obj, par, lep)
Expand source code
def dbrdq2(q2, wc_obj, par, lep):
    tauLb = par['tau_Lambdab']
    return tauLb * get_obs(dGdq2, q2, wc_obj, par, lep)
def dbrdq2_func(lep)
Expand source code
def dbrdq2_func(lep):
    def fct(wc_obj, par, q2):
        return dbrdq2(q2, wc_obj, par, lep)
    return fct
def dbrdq2_int(q2min, q2max, wc_obj, par, lep)
Expand source code
def dbrdq2_int(q2min, q2max, wc_obj, par, lep):
    def obs(q2):
        return dbrdq2(q2, wc_obj, par, lep)
    return flavio.math.integrate.nintegrate(obs, q2min, q2max)/(q2max-q2min)
def dbrdq2_int_func(lep)
Expand source code
def dbrdq2_int_func(lep):
    def fct(wc_obj, par, q2min, q2max):
        return dbrdq2_int(q2min, q2max, wc_obj, par, lep)
    return fct
def get_ff(q2, par)
Expand source code
def get_ff(q2, par):
    ff_aux = AuxiliaryQuantity['Lambdab->Lambda form factor']
    return ff_aux.prediction(par_dict=par, wc_obj=None, q2=q2)
def get_obs(function, q2, wc_obj, par, lep)
Expand source code
def get_obs(function, q2, wc_obj, par, lep):
    ml = par['m_'+lep]
    mLb = par['m_Lambdab']
    mL = par['m_Lambda']
    if q2 < 4*ml**2 or q2 > (mLb-mL)**2:
        return 0
    ta = get_transverity_amps(q2, wc_obj, par, lep, cp_conjugate=False)
    alpha = par['Lambda->ppi alpha_-']
    pLb = par['Lambdab polarisation']
    K = angular_coefficients(ta, alpha, pLb)
    return function(K)
def get_subleading(q2, wc_obj, par_dict, cp_conjugate)
Expand source code
def get_subleading(q2, wc_obj, par_dict, cp_conjugate):
    if q2 <= 9:
        sub_name = 'Lambdab->Lambdall subleading effects at low q2'
        return AuxiliaryQuantity[sub_name].prediction(par_dict=par_dict, wc_obj=wc_obj, q2=q2, cp_conjugate=cp_conjugate)
    elif q2 > 14:
        sub_name = 'Lambdab->Lambdall subleading effects at high q2'
        return AuxiliaryQuantity[sub_name].prediction(par_dict=par_dict, wc_obj=wc_obj, q2=q2, cp_conjugate=cp_conjugate)
    else:
        return {}
def get_transverity_amps(q2, wc_obj, par, lep, cp_conjugate)
Expand source code
def get_transverity_amps(q2, wc_obj, par, lep, cp_conjugate):
    if q2 >= 8.7 and q2 < 14:
        warnings.warn("The predictions in the region of narrow charmonium resonances are not meaningful")
    return add_dict((
        get_transverity_amps_ff(q2, wc_obj, par, lep, cp_conjugate),
        get_subleading(q2, wc_obj, par, cp_conjugate)
        ))
def get_transverity_amps_ff(q2, wc_obj, par_dict, lep, cp_conjugate)
Expand source code
def get_transverity_amps_ff(q2, wc_obj, par_dict, lep, cp_conjugate):
    par = par_dict.copy()
    if cp_conjugate:
        par = conjugate_par(par)
    scale = flavio.config['renormalization scale']['lambdab']
    mLb = par['m_Lambdab']
    mL = par['m_Lambda']
    mb = flavio.physics.running.running.get_mb(par, scale)
    ff = get_ff(q2, par)
    wc = flavio.physics.bdecays.wilsoncoefficients.wctot_dict(wc_obj, 'bs' + lep + lep, scale, par)
    wc_eff = flavio.physics.bdecays.wilsoncoefficients.get_wceff(q2, wc, par, 'Lambdab', 'Lambda', lep, scale)
    ha = helicity_amps(q2, mLb, mL, ff)
    N = prefactor(q2, par, scale)
    ta_ff = transverity_amps(ha, q2, mLb, mL, mb, 0, wc_eff, N)
    return ta_ff
def helicity_amps(q2, mLb, mL, ff)
Expand source code
def helicity_amps(q2, mLb, mL, ff):
    r"""$\Lambda_b\to \Lambda\ell^+\ell^-$ helicity amplitudes.

    See (3.12)-(3.15) of arXiv:1410.2115."""
    sp = (mLb + mL)**2 - q2
    sm = (mLb - mL)**2 - q2
    H = {}
    H['0V++'] = ff['fV0'] * (mLb + mL)/sqrt(q2) * sqrt(sm)
    H['+V-+'] = -ff['fVperp'] * sqrt(2*sm)
    H['0A++'] = ff['fA0'] * (mLb - mL)/sqrt(q2) * sqrt(sp)
    H['+A-+'] = -ff['fAperp'] * sqrt(2*sp)
    H['0T++'] = -ff['fT0'] * sqrt(q2) * sqrt(sm)
    H['+T-+'] = ff['fTperp'] * (mLb + mL) * sqrt(2*sm)
    H['0T5++'] = ff['fT50'] * sqrt(q2) * sqrt(sp)
    H['+T5-+'] = -ff['fT5perp'] * (mLb - mL) * sqrt(2*sp)
    H['0V--'] = H['0V++']
    H['+V+-'] = H['+V-+']
    H['0A--'] = -H['0A++']
    H['+A+-'] = -H['+A-+']
    H['0T--'] = H['0T++']
    H['+T+-'] = H['+T-+']
    H['0T5--'] = -H['0T5++']
    H['+T5+-'] = -H['+T5-+']
    return H

$\Lambda_b\to \Lambda\ell^+\ell^-$ helicity amplitudes.

See (3.12)-(3.15) of arXiv:1410.2115.

def obs_int(function, q2min, q2max, wc_obj, par, lep)
Expand source code
def obs_int(function, q2min, q2max, wc_obj, par, lep):
    def obs(q2):
        return get_obs(function, q2, wc_obj, par, lep)
    return flavio.math.integrate.nintegrate(obs, q2min, q2max)
def obs_int_ratio_func(func_num, func_den, lep)
Expand source code
def obs_int_ratio_func(func_num, func_den, lep):
    def fct(wc_obj, par, q2min, q2max):
        num = obs_int(func_num, q2min, q2max, wc_obj, par, lep)
        if num == 0:
            return 0
        denom = obs_int(func_den, q2min, q2max, wc_obj, par, lep)
        return num/denom
    return fct
def obs_ratio_func(func_num, func_den, lep)
Expand source code
def obs_ratio_func(func_num, func_den, lep):
    def fct(wc_obj, par, q2):
        num = get_obs(func_num, q2, wc_obj, par, lep)
        if num == 0:
            return 0
        denom = get_obs(func_den, q2, wc_obj, par, lep)
        return num/denom
    return fct
def prefactor(q2, par, scale)
Expand source code
def prefactor(q2, par, scale):
    xi_t = flavio.physics.ckm.xi('t','bs')(par)
    alphaem = flavio.physics.running.running.get_alpha(par, scale)['alpha_e']
    mLb = par['m_Lambdab']
    mL = par['m_Lambda']
    la_K = flavio.physics.bdecays.common.lambda_K(mLb**2, mL**2, q2)
    return par['GF'] * xi_t * alphaem * sqrt(q2) * la_K**(1/4.) / sqrt(3 * 2 * mLb**3 * pi**5) / 32.
def transverity_amps(ha, q2, mLb, mL, mqh, mql, wc, prefactor)
Expand source code
def transverity_amps(ha, q2, mLb, mL, mqh, mql, wc, prefactor):
    r"""Transversity amplitudes for $\Lambda_b\to \Lambda\ell^+\ell^-$.

    See (3.16) of arXiv:1410.2115."""
    C910Lpl = (wc['v'] - wc['a']) + (wc['vp'] - wc['ap'])
    C910Rpl = (wc['v'] + wc['a']) + (wc['vp'] + wc['ap'])
    C910Lmi = (wc['v'] - wc['a']) - (wc['vp'] - wc['ap'])
    C910Rmi = (wc['v'] + wc['a']) - (wc['vp'] + wc['ap'])
    A = {}
    A['perp1', 'L'] = +sqrt(2)*( C910Lpl *ha['+V-+']
                                 - 2*mqh*(wc['7']+wc['7p'])/q2 * ha['+T-+'] )
    A['perp1', 'R'] = +sqrt(2)*( C910Rpl *ha['+V-+']
                                 - 2*mqh*(wc['7']+wc['7p'])/q2 * ha['+T-+'] )
    A['para1', 'L'] = -sqrt(2)*( C910Lmi *ha['+A-+']
                                 + 2*mqh*(wc['7']-wc['7p'])/q2 * ha['+T5-+'] )
    A['para1', 'R'] = -sqrt(2)*( C910Rmi *ha['+A-+']
                                 + 2*mqh*(wc['7']-wc['7p'])/q2 * ha['+T5-+'] )
    A['perp0', 'L'] = +sqrt(2)*( C910Lpl *ha['0V++']
                                 - 2*mqh*(wc['7']+wc['7p'])/q2 * ha['0T++'] )
    A['perp0', 'R'] = +sqrt(2)*( C910Rpl *ha['0V++']
                                 - 2*mqh*(wc['7']+wc['7p'])/q2 * ha['0T++'] )
    A['para0', 'L'] = -sqrt(2)*( C910Lmi *ha['0A++']
                                 + 2*mqh*(wc['7']-wc['7p'])/q2 * ha['0T5++'] )
    A['para0', 'R'] = -sqrt(2)*( C910Rmi *ha['0A++']
                                 + 2*mqh*(wc['7']-wc['7p'])/q2 * ha['0T5++'] )
    return {k: prefactor*v for k, v in A.items()}

Transversity amplitudes for $\Lambda_b\to \Lambda\ell^+\ell^-$.

See (3.16) of arXiv:1410.2115.