Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions flavio/data/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,9 @@ implementation:
Lambdab->Lambdall subleading effects at low q2: Lambdab->Lambdall deltaC7 polynomial
Lambdab->Lambdall subleading effects at high q2: Lambdab->Lambdall deltaC9 shift

# B->Vll angular coefficient amplitude
B->Vll amplitude formalism: Helicity Amplitudes

# set the PDF set used for different processes (at the moment only dileptons)
PDF set:
dileptons:
Expand Down
3 changes: 3 additions & 0 deletions flavio/data/parameters_metadata.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1128,6 +1128,9 @@ DeltaGamma/Gamma_B0:
DeltaGamma/Gamma_Bs:
tex: $\Delta \Gamma_s/\Gamma_s$
description: Relative decay width difference in the $B_s$ system
DeltaM/Gamma_Bs:
tex: $\Delta m_s/\Gamma_s$
description: Mass difference in the $B^0_s$ relative to the $B^0_s$ decay width

tau_Bc_SM:
tex: $\tau_{B_c}^\text{SM}$
Expand Down
1 change: 1 addition & 0 deletions flavio/data/parameters_uncorrelated.yml
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,7 @@ Gamma12_B0_a: 11.7(1.3)
# experimental decay width differences
DeltaGamma/Gamma_B0: -0.002(10) # HFAG Summer 2016
DeltaGamma/Gamma_Bs: 0.129(9) # HFAG Summer 2016
DeltaM/Gamma_Bs: 26.79(0.08) # HFAG Summer 2014 - https://arxiv.org/abs/1412.7515


# Meson lifetime bag parameters
Expand Down
197 changes: 197 additions & 0 deletions flavio/physics/bdecays/angular.py

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions flavio/physics/bdecays/bvll/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@
from . import lfv
from . import nonfactorizable
from . import subleading
from . import auxiliary_quantities
31 changes: 19 additions & 12 deletions flavio/physics/bdecays/bvll/amplitudes.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,20 +69,27 @@ def get_subleading(q2, wc_obj, par_dict, B, V, cp_conjugate):
else:
return {}

def helicity_amps(q2, ff, wc_obj, par, B, V, lep):
def helicity_amps(q2, ff, wc_obj, par, B, V, lep, corrections=True):
if q2 >= 8.7 and q2 < 14:
warnings.warn("The predictions in the region of narrow charmonium resonances are not meaningful")
return add_dict((
helicity_amps_ff(q2, ff, wc_obj, par, B, V, lep, cp_conjugate=False),
get_ss(q2, wc_obj, par, B, V, cp_conjugate=False),
get_subleading(q2, wc_obj, par, B, V, cp_conjugate=False)
))
if corrections:
return add_dict((
helicity_amps_ff(q2, ff, wc_obj, par, B, V, lep, cp_conjugate=False),
get_ss(q2, wc_obj, par, B, V, cp_conjugate=False),
get_subleading(q2, wc_obj, par, B, V, cp_conjugate=False)
))
return helicity_amps_ff(q2, ff, wc_obj, par, B, V, lep, cp_conjugate=False)

def helicity_amps_bar(q2, ff, wc_obj, par, B, V, lep):
def helicity_amps_bar(q2, ff, wc_obj, par, B, V, lep, corrections=True):
if q2 >= 8.7 and q2 < 14:
warnings.warn("The predictions in the region of narrow charmonium resonances are not meaningful")
return add_dict((
helicity_amps_ff(q2, ff, wc_obj, par, B, V, lep, cp_conjugate=True),
get_ss(q2, wc_obj, par, B, V, cp_conjugate=True),
get_subleading(q2, wc_obj, par, B, V, cp_conjugate=True)
))
if corrections:
return add_dict((
helicity_amps_ff(q2, ff, wc_obj, par, B, V, lep, cp_conjugate=True),
get_ss(q2, wc_obj, par, B, V, cp_conjugate=True),
get_subleading(q2, wc_obj, par, B, V, cp_conjugate=True)
))
return helicity_amps_ff(q2, ff, wc_obj, par, B, V, lep, cp_conjugate=True)

def get_coefficients(q2, ff, wc_obj, par, B, V, lep, ml, mB, mV, mb):
return AuxiliaryQuantity['B->Vll amplitude formalism'].prediction(par_dict=par, wc_obj=wc_obj, q2=q2, ff=ff, B=B, V=V, lep=lep, ml=ml, mB=mB, mV=mV, mb=mb)
252 changes: 252 additions & 0 deletions flavio/physics/bdecays/bvll/amplitudes_transversity.py

Large diffs are not rendered by default.

67 changes: 67 additions & 0 deletions flavio/physics/bdecays/bvll/auxiliary_quantities.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import cmath
from flavio.classes import AuxiliaryQuantity, Implementation
from .. import angular
from . import amplitudes
from ... import mesonmixing
from . import amplitudes_transversity


def angular_coefficients_helicity(wc_obj, par, q2, ff, B, V, lep, ml, mB, mV, mb, corrections=True):
"""
Returns the angular coefficients J, J_bar, J_h, J_s for the B->Vll decay
in the helicity amplitude formalism.
"""
h = amplitudes.helicity_amps(q2, ff, wc_obj, par, B, V, lep, corrections=corrections)
h_bar = amplitudes.helicity_amps_bar(q2, ff, wc_obj, par, B, V, lep, corrections=corrections)
J = angular.angularcoeffs_general_v(h, q2, mB, mV, mb, 0, ml, ml)
J_bar = angular.angularcoeffs_general_v(h_bar, q2, mB, mV, mb, 0, ml, ml)
h_tilde = h_bar.copy()
h_tilde[('pl', 'V')] = h_bar[('mi', 'V')]
h_tilde[('pl', 'A')] = h_bar[('mi', 'A')]
h_tilde[('mi', 'V')] = h_bar[('pl', 'V')]
h_tilde[('mi', 'A')] = h_bar[('pl', 'A')]
h_tilde['S'] = -h_bar['S']
q_over_p = mesonmixing.observables.q_over_p(wc_obj, par, B)
phi = cmath.phase(-q_over_p) # the phase of -q/p
J_h = angular.angularcoeffs_h_v(phi, h, h_tilde, q2, mB, mV, mb, 0, ml, ml)
J_s = angular.angularcoeffs_s_v(phi, h, h_tilde, q2, mB, mV, mb, 0, ml, ml)
return J, J_bar, J_h, J_s


def angular_coefficients_transversity(wc_obj, par, q2, ff, B, V, lep, ml, mB, mV, mb):
"""
Returns the angular coefficients J, J_bar, J_h, J_s for the B->Vll decay
in the transversity amplitude formalism.
"""
A = amplitudes_transversity.transversity_amps(q2, ff, wc_obj, par, B, V, lep)
A_bar = amplitudes_transversity.transversity_amps_bar(q2, ff, wc_obj, par, B, V, lep)
J = amplitudes_transversity.angularcoeffs_general_transversity(A, q2, ml)
J_bar = amplitudes_transversity.angularcoeffs_general_transversity(A_bar, q2, ml)
A_tilde = A_bar.copy()
A_tilde['perp_L'] = -1 * A_bar['perp_L']
A_tilde['perp_R'] = -1 * A_bar['perp_R']
A_tilde['S'] = -1 * A_bar['S'] # Table 3 of https://arxiv.org/pdf/1502.05509
q_over_p = mesonmixing.observables.q_over_p(wc_obj, par, B)
J_h: dict[str | int, float] = amplitudes_transversity.angularcoeffs_h_transversity(A, A_tilde, q2, ml, q_over_p)
J_s: dict[str | int, float] = amplitudes_transversity.angularcoeffs_s_transversity(A, A_tilde, q2, ml, q_over_p)
Comment on lines +45 to +46
Copy link

Copilot AI Mar 30, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This file uses PEP 604 union types (e.g. 'str | int') which is a SyntaxError on Python 3.9. The project declares requires-python >=3.9, so this will break imports. Use typing.Union[str, int] (or remove the annotation) instead.

Copilot uses AI. Check for mistakes.
return J, J_bar, J_h, J_s


quantity = 'B->Vll amplitude formalism'
a = AuxiliaryQuantity(name=quantity, arguments=['q2', 'ff', 'B', 'V', 'lep', 'ml', 'mB', 'mV', 'mb'])
a.set_description('J, J_bar, J_h, J_s coefficients for the B->Vll decay amplitude.')

iname = 'Helicity Amplitudes'
i = Implementation(name=iname, quantity=quantity,
function=lambda wc_obj, par, q2, ff, B, V, lep, ml, mB, mV, mb: angular_coefficients_helicity(wc_obj, par, q2, ff, B, V, lep, ml, mB, mV, mb, corrections=True))
i.set_description("Angular coefficients from the helicity amplitude formalism, including all corrections from subleading effects and QCDF.")

iname = 'Helicity Amplitudes (no corrections)'
i = Implementation(name=iname, quantity=quantity,
function=lambda wc_obj, par, q2, ff, B, V, lep, ml, mB, mV, mb: angular_coefficients_helicity(wc_obj, par, q2, ff, B, V, lep, ml, mB, mV, mb, corrections=False))
i.set_description("Angular coefficients from the helicity amplitude formalism, without corrections from subleading effects and QCDF.")

iname = 'Transversity Amplitudes (no corrections)'
i = Implementation(name=iname, quantity=quantity,
function=angular_coefficients_transversity)
i.set_description("Angular coefficients from the transversity amplitude formalism, without corrections from subleading effects and QCDF.")
Loading
Loading