Module flavio.physics.quarkonium.Vllgamma

$V\to ll^\prime\gamma$ branching ratio

Functions

def F_A(y)
Expand source code
def F_A(y):
    mu=y**2
    if mu==0:
        return 2./9
    return (8.-45*mu+36*mu**2+mu**3+6*(mu-6)*mu**2*np.log(mu))/36
def F_PA(y)
Expand source code
def F_PA(y):
    if y==0:
        return 0.
    mu=y**2
    return y*(1.+4*mu-5*mu**2+2*mu*(2+mu)*np.log(mu))/2.
def F_S(y)
Expand source code
def F_S(y):
    mu=y**2
    if mu==0:
        return 1./12
    return (1-6*mu+3*mu**2*(1-2*np.log(mu))+2*mu**3)/12.
def Fhat_P(y)
Expand source code
def Fhat_P(y):
    mu=y**2
    if mu==0:
        return 0.
    return mu*(-8+8*mu**2-mu**3 - 12*mu*np.log(mu))/12.
def Fhat_S(y)
Expand source code
def Fhat_S(y):
    mu=y**2
    if mu==0:
        return 1./12
    return Fhat_P(y) + 1./12
def Ftilde_PA(y)
Expand source code
def Ftilde_PA(y):
    if y==0:
        return 0.
    mu=y**2
    return y*(1.+9*mu-9*mu**2-mu**3+6*mu*(1+mu)*np.log(mu))/3.
def Ftilde_S(y)
Expand source code
def Ftilde_S(y):
    mu=y**2
    if mu==0:
        return 1./40
    return (3.-30.*mu-20.*mu**2+60.*mu**3-15*mu**4+2*mu**5-60.*mu**2*np.log(mu))/120.
def Vllgamma_br(wc_obj, par, V, Q, l1, l2, CeFFij, CeFFji, CeFFtildeij, CeFFtildeji)
Expand source code
def Vllgamma_br(wc_obj, par,V,Q, l1,l2,CeFFij,CeFFji,CeFFtildeij,CeFFtildeji):
    r"""Branching ratio for the lepton-flavour violating leptonic decay J/psi-> l l' \gamma"""
    #####branching ratio obtained from 2207.10913#####
    flavio.citations.register("Calibbi:2022ddo")
    # renormalization scale
    scale = flavio.config['renormalization scale'][V]
    alphaem = running.get_alpha_e(par, scale)
    mV = par['m_'+V]   
    tauV = par['tau_'+V]  
    ml1 = par['m_'+l1]
    ml2 = par['m_'+l2]

    VL,VR,TL,TR,SR,SL,PR,PL,AR,AL,StildeR,StildeL,PtildeR,PtildeL = getWC_lfv(wc_obj,par,V,Q,l1,l2,CeFFij,CeFFji,CeFFtildeij,CeFFtildeji)
 
    AV=np.abs(AL)**2+np.abs(AR)**2
    SP=np.abs(SL)**2+np.abs(PL)**2+np.abs(SR)**2+np.abs(PR)**2
    SPtilde=np.abs(StildeL)**2+ np.abs(PtildeL)**2 +np.abs(StildeR)**2  +np.abs(PtildeR)**2
    SStilde= (SL*StildeL.conjugate() + SR*StildeR.conjugate()).real
    PPtilde= (PL*PtildeL.conjugate() + PR*PtildeR.conjugate()).imag

   
    if ml1<ml2:
        y=ml2/mV
        I_AP=-(AL*PR.conjugate()+AR*PL.conjugate()).real
        I_APtilde=-(AL*PtildeR.conjugate()+AR*PtildeL.conjugate()).imag
    elif ml2<ml1:
        y=ml1/mV
        I_AP=(AL*PL.conjugate()+AR*PR.conjugate()).real
        I_APtilde=(AL*PtildeL.conjugate()+AR*PtildeR.conjugate()).imag
    else:
        print("The case of non-hierarchical masses is not implemented.")

    prefactor=alphaem*Q**2*tauV*mV/(192*np.pi**2)
    
    return prefactor*(AV * F_A(y) + SP*F_S(y) + I_AP*F_PA(y) + SPtilde *Ftilde_S(y) + SStilde * Fhat_S(y) + PPtilde * Fhat_P(y) +I_APtilde * Ftilde_PA(y))

Branching ratio for the lepton-flavour violating leptonic decay J/psi-> l l' \gamma

def Vllgamma_br_comb_func(V, Q, l1, l2)
Expand source code
def Vllgamma_br_comb_func(V, Q, l1, l2):
    def fct(wc_obj, par,CeFFij=0,CeFFji=0,CeFFtildeij=0,CeFFtildeji=0):
        return Vllgamma_br(wc_obj, par, V, Q, l1, l2,CeFFij,CeFFji,CeFFtildeij,CeFFtildeji)+ Vllgamma_br(wc_obj, par, V, Q, l2, l1,CeFFij,CeFFji,CeFFtildeij,CeFFtildeji)
    return fct
def Vllgamma_br_func(V, Q, l1, l2)
Expand source code
def Vllgamma_br_func(V, Q, l1, l2):
    def fct(wc_obj, par,CeFFij=0,CeFFji=0,CeFFtildeij=0,CeFFtildeji=0):
        return Vllgamma_br(wc_obj, par, V, Q, l1, l2,CeFFij,CeFFji,CeFFtildeij,CeFFtildeji)
    return fct
def Vllgamma_ratio_comb_func(V, Q, l1, l2)
Expand source code
def Vllgamma_ratio_comb_func(V, Q, l1, l2):
    def fct(wc_obj, par,CeFFij=0,CeFFji=0,CeFFtildeij=0,CeFFtildeji=0):
        BRee=Vll_br(wc_obj,par,V,Q,'e','e')
        return (Vllgamma_br(wc_obj, par, V, Q, l1, l2,CeFFij,CeFFji,CeFFtildeij,CeFFtildeji)+ Vllgamma_br(wc_obj, par, V, Q, l2, l1,CeFFij,CeFFji,CeFFtildeij,CeFFtildeji))/BRee
    return fct
def Vllgamma_ratio_func(V, Q, l1, l2)
Expand source code
def Vllgamma_ratio_func(V, Q, l1, l2):
    def fct(wc_obj, par,CeFFij=0,CeFFji=0,CeFFtildeij=0,CeFFtildeji=0):
        BRee=Vll_br(wc_obj,par,V,Q,'e','e')
        return Vllgamma_br(wc_obj, par, V, Q, l1, l2,CeFFij,CeFFji,CeFFtildeij,CeFFtildeji)/BRee
    return fct
def getWC_lfv(wc_obj, par, V, Q, l1, l2, CeFFij, CeFFji, CeFFtildeij, CeFFtildeji)
Expand source code
def getWC_lfv(wc_obj,par,V,Q,l1,l2,CeFFij,CeFFji,CeFFtildeij,CeFFtildeji):
    # renormalization scale
    scale = flavio.config['renormalization scale'][V]
    # Wilson coefficients
    wc = wc_obj.get_wc(wc_sector[(l1,l2)], scale, par)

    alphaem = running.get_alpha_e(par, scale)
    ee=np.sqrt(4.*np.pi*alphaem) 

    mV = par['m_'+V]   
    fV=par['f_'+V] 
    fV_T=par['fT_'+V]
    qq=meson_quark[V]
    # for emu and taue the name of the Wilson coefficient sector agrees with the ordering of leptons in the vector bilinear
    # This is not the case for mutau. Thus distinguish between the two cases here.
    if wc_sector[(l1,l2)]=="mutau":
        ll="taumu"
    else:
        ll=wc_sector[(l1,l2)]
    VR=fV*mV*(wc['CVRR_'+ll+qq] + wc['CVLR_'+qq+ll]) 
    VL=fV*mV*(wc['CVLL_'+ll+qq] + wc['CVLR_'+ll+qq]) 
    TR=fV_T*mV*wc['CTRR_'+l1+l2+qq] - ee*Q *fV*wc['Cgamma_'+l2+l1] 
    TL=(fV_T*mV*wc['CTRR_'+l2+l1+qq] - ee*Q *fV*wc['Cgamma_'+l1+l2]).conjugate()
    SR=2.*mV*fV*(wc['CSRR_'+l1+l2+qq]+wc['CSRL_'+l1+l2+qq])
    SL=2.*mV*fV*(wc['CSRL_'+l2+l1+qq]+wc['CSRR_'+l2+l1+qq]).conjugate()   
    PR=2.*mV*fV*(wc['CSRR_'+l1+l2+qq]-wc['CSRL_'+l1+l2+qq])
    PL=2.*mV*fV*(wc['CSRL_'+l2+l1+qq]-wc['CSRR_'+l2+l1+qq]).conjugate()   
    AR=2.*fV*mV*(wc['CVLR_'+qq+ll]- wc['CVRR_'+ll+qq]) 
    AL=2.*fV*mV*(wc['CVLL_'+ll+qq] - wc['CVLR_'+ll+qq]) 

    StildeR=4*mV**2*fV*CeFFij
    StildeL=4*mV**2*fV*CeFFji.conjugate()
    PtildeR=4*mV**2*fV*CeFFtildeij
    PtildeL=4*mV**2*fV*CeFFtildeji.conjugate()

    if ll==l2+l1: 
    # As we use ll instead of l1+l2 or l2+l1 above when constructing the effective parameters, we have to complex conjugate it, in case indices are reversed.
    # This is not necessary for the others, because there we explicitly defined the flavour indices.
        VL=VL.conjugate()
        VR=VR.conjugate()
        AL=AL.conjugate()
        AR=AR.conjugate()
    return VL,VR,TL,TR,SR,SL,PR,PL,AR,AL,StildeR,StildeL,PtildeR,PtildeL