Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
809a263
Add Bs meson oscillation frequency to paramters
schmitse Aug 13, 2025
3576eef
Add angular s coefficients for Bs -> phi ll. Following Zwicky arXiv:1…
schmitse Aug 13, 2025
1b8cbd9
Add more time-integrated and new time-dependent angular observables.
schmitse Aug 13, 2025
3c92293
Add transversity amplitude formalism for Bs -> V ll.
schmitse Aug 13, 2025
3ccd821
Add AuxiliaryQuantity for B->Vll amplitudes.
schmitse Aug 14, 2025
0a4059a
clean up in amplitudes_transversity.py
schmitse Aug 14, 2025
7e9d874
remove unused function from amplitudes_transversity.py
schmitse Aug 14, 2025
0d8a93b
add unittest comparing transversity and helicity amplitudes.
schmitse Aug 14, 2025
f666665
remove type hints for compatibility with python 3.9
schmitse Aug 14, 2025
1f77d09
fix test cases of test_bvll
schmitse Aug 14, 2025
10f9cf2
move Bs -> phi mumu tests into flavio/physics/bdecays/bvll/
schmitse Aug 14, 2025
be875d7
rename misleading variable "e^{i phi_s}" from previous name q/p.
schmitse Aug 18, 2025
11aeddf
Denominator observable for the angular observables now is not unity a…
schmitse Aug 21, 2025
85b2d4b
Fix optimised angular J observables
schmitse Aug 21, 2025
a3d81bf
Correct denominator implementations for optimised Q and M observables.
schmitse Aug 21, 2025
dfed226
Add Optimised primed observables without integration.
schmitse Aug 21, 2025
f7cb0c4
Update description and symbol for optimised angular Bs observables
schmitse Sep 2, 2025
70ba73d
Merge branch 'master' into schmitse_phimumu
peterstangl Feb 3, 2026
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

Copilot AI Mar 30, 2026

Copy link

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