66from typing import TYPE_CHECKING , Any
77
88import sympy as sp
9+ from ampform .dynamics import EnergyDependentWidth
910from ampform .dynamics .form_factor import FormFactor
10- from ampform .dynamics .phasespace import BreakupMomentum
11- from ampform .sympy import unevaluated
11+ from ampform .dynamics .phasespace import (
12+ BreakupMomentum ,
13+ PhaseSpaceFactor ,
14+ PhaseSpaceFactorProtocol ,
15+ )
16+ from ampform .sympy import argument , unevaluated
1217
1318if TYPE_CHECKING :
1419 from sympy .printing .latex import LatexPrinter
@@ -23,13 +28,14 @@ class RelativisticBreitWigner(sp.Expr):
2328 m2 : Any
2429 angular_momentum : Any
2530 meson_radius : Any
31+ phsp_factor : PhaseSpaceFactorProtocol = argument ( # type:ignore[assignment]
32+ default = PhaseSpaceFactor , sympify = False
33+ )
2634 _latex_repr_ = (
2735 R"\mathcal{{R}}_{{{angular_momentum}}}\left({s}, {mass0}, {gamma0}\right)"
2836 )
2937
3038 def evaluate (self ):
31- from ampform .dynamics import EnergyDependentWidth # noqa: PLC0415
32-
3339 s , m0 , w0 , m1 , m2 , angular_momentum , meson_radius = self .args
3440 width = EnergyDependentWidth (
3541 s = s ,
@@ -39,6 +45,7 @@ def evaluate(self):
3945 m_b = m2 ,
4046 angular_momentum = angular_momentum ,
4147 meson_radius = meson_radius ,
48+ phsp_factor = self .phsp_factor ,
4249 name = Rf"\Gamma_{{{ sp .latex (angular_momentum )} }}" ,
4350 )
4451 return (m0 * w0 ) / (m0 ** 2 - s - width * m0 * sp .I )
@@ -57,6 +64,9 @@ class BreitWignerMinL(sp.Expr):
5764 l_prod : Any
5865 R_dec : Any
5966 R_prod : Any
67+ phsp_factor : PhaseSpaceFactorProtocol = argument ( # type:ignore[assignment]
68+ default = PhaseSpaceFactor , sympify = False
69+ )
6070 _latex_repr_ = R"\mathcal{{R}}^\mathrm{{BW}}_{{{l_dec},{l_prod}}}\left({s}\right)"
6171
6272 def evaluate (self ): # noqa: PLR0914
@@ -65,7 +75,7 @@ def evaluate(self): # noqa: PLR0914
6575 ff0_prod = FormFactor (m_top ** 2 , m0 , m_spec , l_prod , R_prod )
6676 ff_dec = FormFactor (s , m1 , m2 , l_dec , R_dec )
6777 ff0_dec = FormFactor (m0 ** 2 , m1 , m2 , l_dec , R_dec )
68- width = EnergyDependentWidth (s , m0 , Γ0 , m1 , m2 , l_dec , R_dec )
78+ width = EnergyDependentWidth (s , m0 , Γ0 , m1 , m2 , l_dec , R_dec , self . phsp_factor )
6979 return sp .Mul (
7080 ff_prod / ff0_prod ,
7181 1 / (m0 ** 2 - s - sp .I * m0 * width ),
@@ -117,37 +127,6 @@ def evaluate(self):
117127 return 1 / (m0 ** 2 - s - sp .I * m0 * Γ )
118128
119129
120- @unevaluated
121- class EnergyDependentWidth (sp .Expr ):
122- s : Any
123- m0 : Any
124- Γ0 : Any
125- m1 : Any
126- m2 : Any
127- L : Any
128- R : Any
129-
130- def evaluate (self ):
131- s , m0 , Γ0 , m1 , m2 , L , R = self .args
132- ff = FormFactor (s , m1 , m2 , L , R ) ** 2
133- ff0 = FormFactor (m0 ** 2 , m1 , m2 , L , R ) ** 2
134- return sp .Mul (
135- Γ0 ,
136- m0 / sp .sqrt (s ),
137- ff / ff0 ,
138- evaluate = False ,
139- )
140-
141- def _latex_repr_ (self , printer : LatexPrinter ) -> str :
142- s = printer ._print (self .s ) # pyright:ignore[reportPrivateUsage]
143- if self .L == 0 :
144- if self .m1 == 0 and self .m2 == 0 :
145- return printer ._print (self .Γ0 ) # pyright:ignore[reportPrivateUsage]
146- return Rf"\Gamma\left({ s } \right)"
147- L = printer ._print (self .L ) # pyright:ignore[reportPrivateUsage]
148- return Rf"\Gamma_{{{ L } }}\left({ s } \right)"
149-
150-
151130@unevaluated
152131class MultichannelBreitWigner (sp .Expr ):
153132 s : Any
@@ -194,6 +173,9 @@ class BreitWigner(sp.Expr):
194173 m2 : Any = 0
195174 angular_momentum : Any = 0
196175 meson_radius : Any = 1
176+ phsp_factor : PhaseSpaceFactorProtocol = argument ( # type:ignore[assignment]
177+ default = PhaseSpaceFactor , sympify = False
178+ )
197179
198180 def evaluate (self ):
199181 width = self .energy_dependent_width ()
@@ -206,7 +188,7 @@ def energy_dependent_width(self) -> sp.Expr:
206188 s , m0 , Γ0 , m1 , m2 , L , d = self .args
207189 if L == 0 and m1 == 0 and m2 == 0 :
208190 return Γ0 # type:ignore[return-value]
209- return EnergyDependentWidth (s , m0 , Γ0 , m1 , m2 , L , d )
191+ return EnergyDependentWidth (s , m0 , Γ0 , m1 , m2 , L , d , self . phsp_factor )
210192
211193 def _latex_repr_ (self , printer : LatexPrinter , * args ) -> str :
212194 s = printer ._print (self .s )
0 commit comments