From 90df646ed571c413c0b3f446fe55651ee43b7dce Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Thu, 16 May 2024 15:03:32 +0200 Subject: [PATCH 1/4] MAINT: create separate `form_factor` submodule --- docs/_extend_docstrings.py | 2 +- src/ampform/dynamics/__init__.py | 112 +-------------------------- src/ampform/dynamics/form_factor.py | 116 ++++++++++++++++++++++++++++ tests/dynamics/test_deprecated.py | 7 +- tests/dynamics/test_dynamics.py | 2 +- 5 files changed, 123 insertions(+), 116 deletions(-) create mode 100644 src/ampform/dynamics/form_factor.py diff --git a/docs/_extend_docstrings.py b/docs/_extend_docstrings.py index a8a89dcf6..d1ca67da4 100644 --- a/docs/_extend_docstrings.py +++ b/docs/_extend_docstrings.py @@ -63,7 +63,7 @@ def extend_docstrings() -> None: def extend_BlattWeisskopfSquared() -> None: - from ampform.dynamics import BlattWeisskopfSquared + from ampform.dynamics.form_factor import BlattWeisskopfSquared z = sp.Symbol("z", real=True) L = sp.Symbol("L", integer=True) diff --git a/src/ampform/dynamics/__init__.py b/src/ampform/dynamics/__init__.py index 9a708c0d1..09bfb9d56 100644 --- a/src/ampform/dynamics/__init__.py +++ b/src/ampform/dynamics/__init__.py @@ -3,14 +3,14 @@ .. seealso:: :doc:`/usage/dynamics` and :doc:`/usage/dynamics/analytic-continuation` """ -# cspell:ignore asner mhash from __future__ import annotations -from typing import TYPE_CHECKING, Any, ClassVar +from typing import TYPE_CHECKING, Any import sympy as sp # pyright: reportUnusedImport=false +from ampform.dynamics.form_factor import BlattWeisskopfSquared from ampform.dynamics.phasespace import ( BreakupMomentumSquared, EqualMassPhaseSpaceFactor, # noqa: F401 @@ -27,115 +27,9 @@ from sympy.printing.latex import LatexPrinter -@unevaluated -class BlattWeisskopfSquared(sp.Expr): - # cspell:ignore pychyGekoppeltePartialwellenanalyseAnnihilationen - r"""Blatt-Weisskopf function :math:`B_L^2(z)`, up to :math:`L \leq 8`. - - Args: - z: Argument of the Blatt-Weisskopf function :math:`B_L^2(z)`. A usual - choice is :math:`z = (d q)^2` with :math:`d` the impact parameter and - :math:`q` the breakup-momentum (see `.BreakupMomentumSquared`). - - angular_momentum: Angular momentum :math:`L` of the decaying particle. - - Note that equal powers of :math:`z` appear in the nominator and the denominator, - while some sources have nominator :math:`1`, instead of :math:`z^L`. Compare for - instance Equation (50.27) in :pdg-review:`2021; Resonances; p.9`. - - Each of these cases for :math:`L` has been taken from - :cite:`pychyGekoppeltePartialwellenanalyseAnnihilationen2016`, p.59, - :cite:`chungPartialWaveAnalysis1995`, p.415, and - :cite:`chungFormulasAngularMomentumBarrier2015`. For a good overview of where to use - these Blatt-Weisskopf functions, see :cite:`asnerDalitzPlotAnalysis2006`. - - See also :ref:`usage/dynamics:Form factor`. - """ - - z: Any - angular_momentum: Any - _latex_repr_ = R"B_{{{angular_momentum}}}^2\left({z}\right)" - - max_angular_momentum: ClassVar[int | None] = None - """Limit the maximum allowed angular momentum :math:`L`. - - This improves performance when :math:`L` is a `~sympy.core.symbol.Symbol` and you - are note interested in higher angular momenta. - """ - - def evaluate(self) -> sp.Expr: - z: sp.Expr = self.args[0] # type: ignore[assignment] - angular_momentum: sp.Expr = self.args[1] # type: ignore[assignment] - cases: dict[int, sp.Expr] = { - 0: sp.S.One, - 1: 2 * z / (z + 1), - 2: 13 * z**2 / ((z - 3) * (z - 3) + 9 * z), - 3: 277 * z**3 / (z * (z - 15) * (z - 15) + 9 * (2 * z - 5) * (2 * z - 5)), - 4: ( - 12746 - * z**4 - / ( - (z**2 - 45 * z + 105) * (z**2 - 45 * z + 105) - + 25 * z * (2 * z - 21) * (2 * z - 21) - ) - ), - 5: ( - 998881 - * z**5 - / (z**5 + 15 * z**4 + 315 * z**3 + 6300 * z**2 + 99225 * z + 893025) - ), - 6: ( - 118394977 - * z**6 - / ( - z**6 - + 21 * z**5 - + 630 * z**4 - + 18900 * z**3 - + 496125 * z**2 - + 9823275 * z - + 108056025 - ) - ), - 7: ( - 19727003738 - * z**7 - / ( - z**7 - + 28 * z**6 - + 1134 * z**5 - + 47250 * z**4 - + 1819125 * z**3 - + 58939650 * z**2 - + 1404728325 * z - + 18261468225 - ) - ), - 8: ( - 4392846440677 - * z**8 - / ( - z**8 - + 36 * z**7 - + 1890 * z**6 - + 103950 * z**5 - + 5457375 * z**4 - + 255405150 * z**3 - + 9833098275 * z**2 - + 273922023375 * z - + 4108830350625 - ) - ), - } - return sp.Piecewise(*[ - (expression, sp.Eq(angular_momentum, value)) - for value, expression in cases.items() - if self.max_angular_momentum is None or value <= self.max_angular_momentum - ]) - - @unevaluated class EnergyDependentWidth(sp.Expr): + # cspell:ignore asner r"""Mass-dependent width, coupled to the pole position of the resonance. See Equation (50.28) in :pdg-review:`2021; Resonances; p.9` and diff --git a/src/ampform/dynamics/form_factor.py b/src/ampform/dynamics/form_factor.py new file mode 100644 index 000000000..51b80c3b9 --- /dev/null +++ b/src/ampform/dynamics/form_factor.py @@ -0,0 +1,116 @@ +"""Implementations of the form factor, or barrier factor.""" + +from __future__ import annotations + +from typing import Any, ClassVar + +import sympy as sp + +from ampform.sympy import unevaluated + + +@unevaluated +class BlattWeisskopfSquared(sp.Expr): + # cspell:ignore asner pychyGekoppeltePartialwellenanalyseAnnihilationen + r"""Blatt-Weisskopf function :math:`B_L^2(z)`, up to :math:`L \leq 8`. + + Args: + z: Argument of the Blatt-Weisskopf function :math:`B_L^2(z)`. A usual + choice is :math:`z = (d q)^2` with :math:`d` the impact parameter and + :math:`q` the breakup-momentum (see `.BreakupMomentumSquared`). + + angular_momentum: Angular momentum :math:`L` of the decaying particle. + + Note that equal powers of :math:`z` appear in the nominator and the denominator, + while some sources have nominator :math:`1`, instead of :math:`z^L`. Compare for + instance Equation (50.27) in :pdg-review:`2021; Resonances; p.9`. + + Each of these cases for :math:`L` has been taken from + :cite:`pychyGekoppeltePartialwellenanalyseAnnihilationen2016`, p.59, + :cite:`chungPartialWaveAnalysis1995`, p.415, and + :cite:`chungFormulasAngularMomentumBarrier2015`. For a good overview of where to use + these Blatt-Weisskopf functions, see :cite:`asnerDalitzPlotAnalysis2006`. + + See also :ref:`usage/dynamics:Form factor`. + """ + + z: Any + angular_momentum: Any + _latex_repr_ = R"B_{{{angular_momentum}}}^2\left({z}\right)" + + max_angular_momentum: ClassVar[int | None] = None + """Limit the maximum allowed angular momentum :math:`L`. + + This improves performance when :math:`L` is a `~sympy.core.symbol.Symbol` and you + are note interested in higher angular momenta. + """ + + def evaluate(self) -> sp.Expr: + z: sp.Expr = self.args[0] # type: ignore[assignment] + angular_momentum: sp.Expr = self.args[1] # type: ignore[assignment] + cases: dict[int, sp.Expr] = { + 0: sp.S.One, + 1: 2 * z / (z + 1), + 2: 13 * z**2 / ((z - 3) * (z - 3) + 9 * z), + 3: 277 * z**3 / (z * (z - 15) * (z - 15) + 9 * (2 * z - 5) * (2 * z - 5)), + 4: ( + 12746 + * z**4 + / ( + (z**2 - 45 * z + 105) * (z**2 - 45 * z + 105) + + 25 * z * (2 * z - 21) * (2 * z - 21) + ) + ), + 5: ( + 998881 + * z**5 + / (z**5 + 15 * z**4 + 315 * z**3 + 6300 * z**2 + 99225 * z + 893025) + ), + 6: ( + 118394977 + * z**6 + / ( + z**6 + + 21 * z**5 + + 630 * z**4 + + 18900 * z**3 + + 496125 * z**2 + + 9823275 * z + + 108056025 + ) + ), + 7: ( + 19727003738 + * z**7 + / ( + z**7 + + 28 * z**6 + + 1134 * z**5 + + 47250 * z**4 + + 1819125 * z**3 + + 58939650 * z**2 + + 1404728325 * z + + 18261468225 + ) + ), + 8: ( + 4392846440677 + * z**8 + / ( + z**8 + + 36 * z**7 + + 1890 * z**6 + + 103950 * z**5 + + 5457375 * z**4 + + 255405150 * z**3 + + 9833098275 * z**2 + + 273922023375 * z + + 4108830350625 + ) + ), + } + return sp.Piecewise(*[ + (expression, sp.Eq(angular_momentum, value)) + for value, expression in cases.items() + if self.max_angular_momentum is None or value <= self.max_angular_momentum + ]) diff --git a/tests/dynamics/test_deprecated.py b/tests/dynamics/test_deprecated.py index 93dc5a2ac..0315b30f6 100644 --- a/tests/dynamics/test_deprecated.py +++ b/tests/dynamics/test_deprecated.py @@ -2,11 +2,8 @@ import sympy as sp -from ampform.dynamics import ( - BlattWeisskopfSquared, - EnergyDependentWidth, - EqualMassPhaseSpaceFactor, -) +from ampform.dynamics import EnergyDependentWidth, EqualMassPhaseSpaceFactor +from ampform.dynamics.form_factor import BlattWeisskopfSquared from ampform.sympy import UnevaluatedExpression diff --git a/tests/dynamics/test_dynamics.py b/tests/dynamics/test_dynamics.py index fff816996..3ad8f561e 100644 --- a/tests/dynamics/test_dynamics.py +++ b/tests/dynamics/test_dynamics.py @@ -6,13 +6,13 @@ import sympy as sp from ampform.dynamics import ( - BlattWeisskopfSquared, EnergyDependentWidth, EqualMassPhaseSpaceFactor, PhaseSpaceFactor, PhaseSpaceFactorSWave, relativistic_breit_wigner_with_ff, ) +from ampform.dynamics.form_factor import BlattWeisskopfSquared if TYPE_CHECKING: from qrules import ParticleCollection From dd82fa64d2161305f4e388c54dda404b24d2d603 Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Thu, 16 May 2024 15:03:33 +0200 Subject: [PATCH 2/4] MAINT: update Zotero Better Bibtex style --- docs/bibliography.bib | 78 +++++++++++------------- docs/usage.ipynb | 2 +- docs/usage/dynamics/k-matrix.ipynb | 42 ++++++------- docs/usage/helicity/spin-alignment.ipynb | 4 +- src/ampform/helicity/__init__.py | 2 +- src/ampform/helicity/align/axisangle.py | 29 +++++---- src/ampform/helicity/align/dpd.py | 4 +- src/ampform/helicity/decay.py | 15 +++-- src/ampform/kinematics/angles.py | 20 +++--- 9 files changed, 94 insertions(+), 102 deletions(-) diff --git a/docs/bibliography.bib b/docs/bibliography.bib index 942e1f600..a90cc0681 100755 --- a/docs/bibliography.bib +++ b/docs/bibliography.bib @@ -1,4 +1,3 @@ - @article{aitchisonMatrixFormalismOverlapping1972, title = {The đŸ-Matrix Formalism for Overlapping Resonances}, author = {Aitchison, I.J.R.}, @@ -16,7 +15,7 @@ @article{aitchisonMatrixFormalismOverlapping1972 @incollection{asnerDalitzPlotAnalysis2006, title = {Dalitz {{Plot Analysis Formalism}}}, booktitle = {Review of {{Particle Physics}}: {{Volume I Reviews}}}, - author = {Asner, D. M. and Hagiwara, K. and Hikasa, K. and Nakamura, K. and Sumino, Y. and Takahashi, F. and Tanaka, J. and Agashe, K. and Aielli, G. and Amsler, C. and Antonelli, M. and Asner, D. M. and Baer, H. and Banerjee, Sw. and Barnett, R. M. and Basaglia, T. and Bauer, C. W. and Beatty, J. J. and Belousov, V. I. and Beringer, J. and Bethke, S. and Bettini, A. and Bichsel, H. and Biebel, O. and Black, K. M. and Blucher, E. and Buchmuller, O. and Burkert, V. and Bychkov, M. A. and Cahn, R. N. and Carena, M. and Ceccucci, A. and Cerri, A. and Chakraborty, D. and Chen, M.-C. and Chivukula, R. S. and Cowan, G. and Dahl, O. and D’Ambrosio, G. and Damour, T. and {de Florian}, D. and {de GouvĂȘa}, A. and DeGrand, T. and {de Jong}, P. and Dissertori, G. and Dobrescu, B. A. and D’Onofrio, M. and Doser, M. and Drees, M. and Dreiner, H. K. and Dwyer, D. A. and Eerola, P. and Eidelman, S. and Ellis, J. and Erler, J. and Ezhela, V. V. and Fetscher, W. and Fields, B. D. and Firestone, R. and Foster, B. and Freitas, A. and Gallagher, H. and Garren, L. and Gerber, H.-J. and Gerbier, G. and Gershon, T. and Gershtein, Y. and Gherghetta, T. and Godizov, A. A. and Goodman, M. and Grab, C. and Gritsan, A. V. and Grojean, C. and Groom, D. E. and GrĂŒnewald, M. and Gurtu, A. and Gutsche, T. and Haber, H. E. and Hanhart, C. and Hashimoto, S. and Hayato, Y. and Hayes, K. G. and Hebecker, A. and Heinemeyer, S. and Heltsley, B. and {HernĂĄndez-Rey}, J. J. and Hisano, J. and Höcker, A. and Holder, J. and Holtkamp, A. and Hyodo, T. and Irwin, K. D. and Johnson, K. F. and Kado, M. and Karliner, M. and Katz, U. F. and Klein, S. R. and Klempt, E. and Kowalewski, R. V. and Krauss, F. and Kreps, M. and Krusche, B. and Kuyanov, Yu. V. and Kwon, Y. and Lahav, O. and Laiho, J. and Lesgourgues, J. and Liddle, A. and Ligeti, Z. and Lin, C.-J. and Lippmann, C. and Liss, T. M. and Littenberg, L. and Lugovsky, K. S. and Lugovsky, S. B. and Lusiani, A. and Makida, Y. and Maltoni, F. and Mannel, T. and Manohar, A. V. and Marciano, W. J. and Martin, A. D. and Masoni, A. and Matthews, J. and Meißner, U.-G. and Milstead, D. and Mitchell, R. E. and Mönig, K. and Molaro, P. and Moortgat, F. and Moskovic, M. and Murayama, H. and Narain, M. and Nason, P. and Navas, S. and Neubert, M. and Nevski, P. and Nir, Y. and Olive, K. A. and Pagan Griso, S. and Parsons, J. and Patrignani, C. and Peacock, J. A. and Pennington, M. and Petcov, S. T. and Petrov, V. A. and Pianori, E. and Piepke, A. and Pomarol, A. and Quadt, A. and Rademacker, J. and Raffelt, G. and Ratcliff, B. N. and Richardson, P. and Ringwald, A. and Roesler, S. and Rolli, S. and Romaniouk, A. and Rosenberg, L. J. and Rosner, J. L. and Rybka, G. and Ryutin, R. A. and Sachrajda, C. T. and Sakai, Y. and Salam, G. P. and Sarkar, S. and Sauli, F. and Schneider, O. and Scholberg, K. and Schwartz, A. J. and Scott, D. and Sharma, V. and Sharpe, S. R. and Shutt, T. and Silari, M. and Sjöstrand, T. and Skands, P. and Skwarnicki, T. and Smith, J. G. and Smoot, G. F. and Spanier, S. and Spieler, H. and Spiering, C. and Stahl, A. and Stone, S. L. and Sumiyoshi, T. and Syphers, M. J. and Terashi, K. and Terning, J. and Thoma, U. and Thorne, R. S. and Tiator, L. and Titov, M. and Tkachenko, N. P. and Törnqvist, N. A. and Tovey, D. R. and Valencia, G. and {Van de Water}, R. and Varelas, N. and Venanzoni, G. and Verde, L. and Vincter, M. G. and Vogel, P. and Vogt, A. and Wakely, S. P. and Walkowiak, W. and Walter, C. W. and Wands, D. and Ward, D. R. and Wascko, M. O. and Weiglein, G. and Weinberg, D. H. and Weinberg, E. J. and White, M. and Wiencke, L. R. and Willocq, S. and Wohl, C. G. and Womersley, J. and Woody, C. L. and Workman, R. L. and Yao, W.-M. and Zeller, G. P. and Zenin, O. V. and Zhu, R.-Y. and Zhu, S.-L. and Zimmermann, F. and Zyla, P. A. and Anderson, J. and Fuller, L. and Lugovsky, V. S. and Schaffner, P. and {Particle Data Group}}, + author = {Asner, D. M. and Hagiwara, K. and Hikasa, K. and Nakamura, K. and Sumino, Y. and Takahashi, F. and Tanaka, J. and Agashe, K. and Aielli, G. and Amsler, C. and Antonelli, M. and Asner, D. M. and Baer, H. and Banerjee, {\relax Sw}. and Barnett, R. M. and Basaglia, T. and Bauer, C. W. and Beatty, J. J. and Belousov, V. I. and Beringer, J. and Bethke, S. and Bettini, A. and Bichsel, H. and Biebel, O. and Black, K. M. and Blucher, E. and Buchmuller, O. and Burkert, V. and Bychkov, M. A. and Cahn, R. N. and Carena, M. and Ceccucci, A. and Cerri, A. and Chakraborty, D. and Chen, M.-C. and Chivukula, R. S. and Cowan, G. and Dahl, O. and D’Ambrosio, G. and Damour, T. and {de Florian}, D. and {de GouvĂȘa}, A. and DeGrand, T. and {de Jong}, P. and Dissertori, G. and Dobrescu, B. A. and D’Onofrio, M. and Doser, M. and Drees, M. and Dreiner, H. K. and Dwyer, D. A. and Eerola, P. and Eidelman, S. and Ellis, J. and Erler, J. and Ezhela, V. V. and Fetscher, W. and Fields, B. D. and Firestone, R. and Foster, B. and Freitas, A. and Gallagher, H. and Garren, L. and Gerber, H.-J. and Gerbier, G. and Gershon, T. and Gershtein, Y. and Gherghetta, T. and Godizov, A. A. and Goodman, M. and Grab, C. and Gritsan, A. V. and Grojean, C. and Groom, D. E. and GrĂŒnewald, M. and Gurtu, A. and Gutsche, T. and Haber, H. E. and Hanhart, C. and Hashimoto, S. and Hayato, Y. and Hayes, K. G. and Hebecker, A. and Heinemeyer, S. and Heltsley, B. and {HernĂĄndez-Rey}, J. J. and Hisano, J. and Höcker, A. and Holder, J. and Holtkamp, A. and Hyodo, T. and Irwin, K. D. and Johnson, K. F. and Kado, M. and Karliner, M. and Katz, U. F. and Klein, S. R. and Klempt, E. and Kowalewski, R. V. and Krauss, F. and Kreps, M. and Krusche, B. and Kuyanov, {\relax Yu}. V. and Kwon, Y. and Lahav, O. and Laiho, J. and Lesgourgues, J. and Liddle, A. and Ligeti, Z. and Lin, C.-J. and Lippmann, C. and Liss, T. M. and Littenberg, L. and Lugovsky, K. S. and Lugovsky, S. B. and Lusiani, A. and Makida, Y. and Maltoni, F. and Mannel, T. and Manohar, A. V. and Marciano, W. J. and Martin, A. D. and Masoni, A. and Matthews, J. and Meißner, U.-G. and Milstead, D. and Mitchell, R. E. and Mönig, K. and Molaro, P. and Moortgat, F. and Moskovic, M. and Murayama, H. and Narain, M. and Nason, P. and Navas, S. and Neubert, M. and Nevski, P. and Nir, Y. and Olive, K. A. and Pagan Griso, S. and Parsons, J. and Patrignani, C. and Peacock, J. A. and Pennington, M. and Petcov, S. T. and Petrov, V. A. and Pianori, E. and Piepke, A. and Pomarol, A. and Quadt, A. and Rademacker, J. and Raffelt, G. and Ratcliff, B. N. and Richardson, P. and Ringwald, A. and Roesler, S. and Rolli, S. and Romaniouk, A. and Rosenberg, L. J. and Rosner, J. L. and Rybka, G. and Ryutin, R. A. and Sachrajda, C. T. and Sakai, Y. and Salam, G. P. and Sarkar, S. and Sauli, F. and Schneider, O. and Scholberg, K. and Schwartz, A. J. and Scott, D. and Sharma, V. and Sharpe, S. R. and Shutt, T. and Silari, M. and Sjöstrand, T. and Skands, P. and Skwarnicki, T. and Smith, J. G. and Smoot, G. F. and Spanier, S. and Spieler, H. and Spiering, C. and Stahl, A. and Stone, S. L. and Sumiyoshi, T. and Syphers, M. J. and Terashi, K. and Terning, J. and Thoma, U. and Thorne, R. S. and Tiator, L. and Titov, M. and Tkachenko, N. P. and Törnqvist, N. A. and Tovey, D. R. and Valencia, G. and {Van de Water}, R. and Varelas, N. and Venanzoni, G. and Verde, L. and Vincter, M. G. and Vogel, P. and Vogt, A. and Wakely, S. P. and Walkowiak, W. and Walter, C. W. and Wands, D. and Ward, D. R. and Wascko, M. O. and Weiglein, G. and Weinberg, D. H. and Weinberg, E. J. and White, M. and Wiencke, L. R. and Willocq, S. and Wohl, C. G. and Womersley, J. and Woody, C. L. and Workman, R. L. and Yao, W.-M. and Zeller, G. P. and Zenin, O. V. and Zhu, R.-Y. and Zhu, S.-L. and Zimmermann, F. and Zyla, P. A. and Anderson, J. and Fuller, L. and Lugovsky, V. S. and Schaffner, P. and {Particle Data Group}}, year = {2006}, month = jan, issn = {2050-3911}, @@ -26,7 +25,7 @@ @incollection{asnerDalitzPlotAnalysis2006 @article{aubertDalitzPlotAnalysis2005, title = {Dalitz Plot Analysis of đ·â° → đŸâ° đŸâș đŸâ»}, - author = {Aubert, B. and Barate, R. and Boutigny, D. and Couderc, F. and Karyotakis, Y. and Lees, J. P. and Poireau, V. and Tisserand, V. and Zghiche, A. and Grauges, E. and Palano, A. and Pappagallo, M. and Pompili, A. and Chen, J. C. and Qi, N. D. and Rong, G. and Wang, P. and Zhu, Y. S. and Eigen, G. and Ofte, I. and Stugu, B. and Abrams, G. S. and Battaglia, M. and Breon, A. B. and Brown, D. N. and {Button-Shafer}, J. and Cahn, R. N. and Charles, E. and Day, C. T. and Gill, M. S. and Gritsan, A. V. and Groysman, Y. and Jacobsen, R. G. and Kadel, R. W. and Kadyk, J. and Kerth, L. T. and Kolomensky, Yu. G. and Kukartsev, G. and Lynch, G. and Mir, L. M. and Oddone, P. J. and Orimoto, T. J. and Pripstein, M. and Roe, N. A. and Ronan, M. T. and Wenzel, W. A. and Barrett, M. and Ford, K. E. and Harrison, T. J. and Hart, A. J. and Hawkes, C. M. and Morgan, S. E. and Watson, A. T. and Fritsch, M. and Goetzen, K. and Held, T. and Koch, H. and Lewandowski, B. and Pelizaeus, M. and Peters, K. and Schroeder, T. and Steinke, M. and Boyd, J. T. and Burke, J. P. and Chevalier, N. and Cottingham, W. N. and Kelly, M. P. and {Cuhadar-Donszelmann}, T. and Fulsom, B. G. and Hearty, C. and Knecht, N. S. and Mattison, T. S. and McKenna, J. A. and Khan, A. and Kyberd, P. and Saleem, M. and Teodorescu, L. and Blinov, A. E. and Blinov, V. E. and Bukin, A. D. and Druzhinin, V. P. and Golubev, V. B. and Kravchenko, E. A. and Onuchin, A. P. and Serednyakov, S. I. and Skovpen, Yu. I. and Solodov, E. P. and Yushkov, A. N. and Best, D. and Bondioli, M. and Bruinsma, M. and Chao, M. and Eschrich, I. and Kirkby, D. and Lankford, A. J. and Mandelkern, M. and Mommsen, R. K. and Roethel, W. and Stoker, D. P. and Buchanan, C. and Hartfiel, B. L. and Weinstein, A. J. R. and Foulkes, S. D. and Gary, J. W. and Long, O. and Shen, B. C. and Wang, K. and Zhang, L. and {del Re}, D. and Hadavand, H. K. and Hill, E. J. and MacFarlane, D. B. and Paar, H. P. and Rahatlou, S. and Sharma, V. and Berryhill, J. W. and Campagnari, C. and Cunha, A. and Dahmes, B. and Hong, T. M. and Mazur, M. A. and Richman, J. D. and Verkerke, W. and Beck, T. W. and Eisner, A. M. and Flacco, C. J. and Heusch, C. A. and Kroseberg, J. and Lockman, W. S. and Nesom, G. and Schalk, T. and Schumm, B. A. and Seiden, A. and Spradlin, P. and Williams, D. C. and Wilson, M. G. and Albert, J. and Chen, E. and {Dubois-Felsmann}, G. P. and Dvoretskii, A. and Hitlin, D. G. and Narsky, I. and Piatenko, T. and Porter, F. C. and Ryd, A. and Samuel, A. and Andreassen, R. and Jayatilleke, S. and Mancinelli, G. and Meadows, B. T. and Sokoloff, M. D. and Blanc, F. and Bloom, P. and Chen, S. and Ford, W. T. and Nauenberg, U. and Olivas, A. and Rankin, P. and Ruddick, W. O. and Smith, J. G. and Ulmer, K. A. and Wagner, S. R. and Zhang, J. and Chen, A. and Eckhart, E. A. and Soffer, A. and Toki, W. H. and Wilson, R. J. and Zeng, Q. and Altenburg, D. and Feltresi, E. and Hauke, A. and Spaan, B. and Brandt, T. and Brose, J. and Dickopp, M. and Klose, V. and Lacker, H. M. and Nogowski, R. and Otto, S. and Petzold, A. and Schott, G. and Schubert, J. and Schubert, K. R. and Schwierz, R. and Sundermann, J. E. and Bernard, D. and Bonneaud, G. R. and Grenier, P. and Schrenk, S. and Thiebaux, Ch. and Vasileiadis, G. and Verderi, M. and Bard, D. J. and Clark, P. J. and Gradl, W. and Muheim, F. and Playfer, S. and Xie, Y. and Andreotti, M. and Azzolini, V. and Bettoni, D. and Bozzi, C. and Calabrese, R. and Cibinetto, G. and Luppi, E. and Negrini, M. and Piemontese, L. and Anulli, F. and {Baldini-Ferroli}, R. and Calcaterra, A. and {de Sangro}, R. and Finocchiaro, G. and Patteri, P. and Peruzzi, I. M. and Piccolo, M. and Zallo, A. and Buzzo, A. and Capra, R. and Contri, R. and Vetere, M. Lo and Macri, M. and Monge, M. R. and Passaggio, S. and Patrignani, C. and Robutti, E. and Santroni, A. and Tosi, S. and Bailey, S. and Brandenburg, G. and Chaisanguanthum, K. S. and Morii, M. and Won, E. and Wu, J. and Dubitzky, R. S. and Langenegger, U. and Marks, J. and Schenk, S. and Uwer, U. and Bhimji, W. and Bowerman, D. A. and Dauncey, P. D. and Egede, U. and Flack, R. L. and Gaillard, J. R. and Morton, G. W. and Nash, J. A. and Nikolich, M. B. and Taylor, G. P. and Vazquez, W. P. and Charles, M. J. and Mader, W. F. and Mallik, U. and Mohapatra, A. K. and Cochran, J. and Crawley, H. B. and Eyges, V. and Meyer, W. T. and Prell, S. and Rosenberg, E. I. and Rubin, A. E. and Yi, J. and Arnaud, N. and Davier, M. and Giroux, X. and Grosdidier, G. and Höcker, A. and Diberder, F. Le and Lepeltier, V. and Lutz, A. M. and Oyanguren, A. and Petersen, T. C. and Pierini, M. and Plaszczynski, S. and Rodier, S. and Roudeau, P. and Schune, M. H. and Stocchi, A. and Wormser, G. and Cheng, C. H. and Lange, D. J. and Simani, M. C. and Wright, D. M. and Bevan, A. J. and Chavez, C. A. and Coleman, J. P. and Forster, I. J. and Fry, J. R. and Gabathuler, E. and Gamet, R. and George, K. A. and Hutchcroft, D. E. and Parry, R. J. and Payne, D. J. and Schofield, K. C. and Touramanis, C. and Cormack, C. M. and Lodovico, F. Di and Sacco, R. and Brown, C. L. and Cowan, G. and Flaecher, H. U. and Green, M. G. and Hopkins, D. A. and Jackson, P. S. and McMahon, T. R. and Ricciardi, S. and Salvatore, F. and Brown, D. and Davis, C. L. and Allison, J. and Barlow, N. R. and Barlow, R. J. and Hodgkinson, M. C. and Lafferty, G. D. and Naisbit, M. T. and Williams, J. C. and Chen, C. and Farbin, A. and Hulsbergen, W. D. and Jawahery, A. and Kovalskyi, D. and Lae, C. K. and Lillard, V. and Roberts, D. A. and Simi, G. and Blaylock, G. and Dallapiccola, C. and Hertzbach, S. S. and Kofler, R. and Koptchev, V. B. and Li, X. and Moore, T. B. and Saremi, S. and Staengle, H. and Willocq, S. and Cowan, R. and Koeneke, K. and Sciolla, G. and Sekula, S. J. and Spitznagel, M. and Taylor, F. and Yamamoto, R. K. and Kim, H. and Patel, P. M. and Robertson, S. H. and Lazzaro, A. and Lombardo, V. and Palombo, F. and Bauer, J. M. and Cremaldi, L. and Eschenburg, V. and Godang, R. and Kroeger, R. and Reidy, J. and Sanders, D. A. and Summers, D. J. and Zhao, H. W. and Brunet, S. and CĂŽtĂ©, D. and Taras, P. and Viaud, B. and Nicholson, H. and Cavallo, N. and Nardo, G. De and Fabozzi, F. and Gatto, C. and Lista, L. and Monorchio, D. and Paolucci, P. and Piccolo, D. and Sciacca, C. and Baak, M. and Bulten, H. and Raven, G. and Snoek, H. L. and Wilden, L. and Jessop, C. P. and LoSecco, J. M. and Allmendinger, T. and Benelli, G. and Gan, K. K. and Honscheid, K. and Hufnagel, D. and Jackson, P. D. and Kagan, H. and Kass, R. and Pulliam, T. and Rahimi, A. M. and {Ter-Antonyan}, R. and Wong, Q. K. and Brau, J. and Frey, R. and Igonkina, O. and Lu, M. and Potter, C. T. and Sinev, N. B. and Strom, D. and Strube, J. and Torrence, E. and Dorigo, A. and Galeazzi, F. and Margoni, M. and Morandin, M. and Posocco, M. and Rotondo, M. and Simonetto, F. and Stroili, R. and Voci, C. and Benayoun, M. and Briand, H. and Chauveau, J. and David, P. and Buono, L. Del and {de la VaissiĂšre}, Ch. and Hamon, O. and John, M. J. J. and Leruste, Ph. and MalclĂšs, J. and Ocariz, J. and Roos, L. and Therin, G. and Behera, P. K. and Gladney, L. and Guo, Q. H. and Panetta, J. and Biasini, M. and Covarelli, R. and Pacetti, S. and Pioppi, M. and Angelini, C. and Batignani, G. and Bettarini, S. and Bucci, F. and Calderini, G. and Carpinelli, M. and Cenci, R. and Forti, F. and Giorgi, M. A. and Lusiani, A. and Marchiori, G. and Morganti, M. and Neri, N. and Paoloni, E. and Rama, M. and Rizzo, G. and Walsh, J. and Haire, M. and Judd, D. and Wagoner, D. E. and Biesiada, J. and Danielson, N. and Elmer, P. and Lau, Y. P. and Lu, C. and Olsen, J. and Smith, A. J. S. and Telnov, A. V. and Bellini, F. and Cavoto, G. and D’Orazio, A. and Di Marco, E. and Faccini, R. and Ferrarotto, F. and Ferroni, F. and Gaspero, M. and Li Gioi, L. and Mazzoni, M. A. and Morganti, S. and Piredda, G. and Polci, F. and Tehrani, F. Safai and Voena, C. and Schröder, H. and Wagner, G. and Waldi, R. and Adye, T. and De Groot, N. and Franek, B. and Gopal, G. P. and Olaiya, E. O. and Wilson, F. F. and Aleksan, R. and Emery, S. and Gaidot, A. and Ganzhur, S. F. and Giraud, P.-F. and Graziani, G. and {de Monchenault}, G. Hamel and Kozanecki, W. and Legendre, M. and London, G. W. and Mayer, B. and Vasseur, G. and YĂšche, Ch. and Zito, M. and Purohit, M. V. and Weidemann, A. W. and Wilson, J. R. and Yumiceva, F. X. and Abe, T. and Allen, M. T. and Aston, D. and Bartoldus, R. and Berger, N. and Boyarski, A. M. and Buchmueller, O. L. and Claus, R. and Convery, M. R. and Cristinziani, M. and Dingfelder, J. C. and Dong, D. and Dorfan, J. and Dujmic, D. and Dunwoodie, W. and Fan, S. and Field, R. C. and Glanzman, T. and Gowdy, S. J. and Hadig, T. and Halyo, V. and Hast, C. and Hryn’ova, T. and Innes, W. R. and Kelsey, M. H. and Kim, P. and Kocian, M. L. and Leith, D. W. G. S. and Libby, J. and Luitz, S. and Luth, V. and Lynch, H. L. and Marsiske, H. and Messner, R. and Muller, D. R. and O’Grady, C. P. and Ozcan, V. E. and Perazzo, A. and Perl, M. and Ratcliff, B. N. and Roodman, A. and Salnikov, A. A. and Schindler, R. H. and Schwiening, J. and Snyder, A. and Stelzer, J. and Su, D. and Sullivan, M. K. and Suzuki, K. and Swain, S. and Thompson, J. M. and Va’vra, J. and Weaver, M. and Wisniewski, W. J. and Wittgen, M. and Wright, D. H. and Yarritu, A. K. and Yi, K. and Young, C. C. and Burchat, P. R. and Edwards, A. J. and Majewski, S. A. and Petersen, B. A. and Roat, C. and Ahmed, M. and Ahmed, S. and Alam, M. S. and Ernst, J. A. and Saeed, M. A. and Wappler, F. R. and Zain, S. B. and Bugg, W. and Krishnamurthy, M. and Spanier, S. M. and Eckmann, R. and Ritchie, J. L. and Satpathy, A. and Schwitters, R. F. and Izen, J. M. and Kitayama, I. and Lou, X. C. and Ye, S. and Bianchi, F. and Bona, M. and Gallo, F. and Gamba, D. and Bomben, M. and Bosisio, L. and Cartaro, C. and Cossutti, F. and Ricca, G. Della and Dittongo, S. and Grancagnolo, S. and Lanceri, L. and Vitale, L. and {Martinez-Vidal}, F. and Panvini, R. S. and Banerjee, Sw. and Bhuyan, B. and Brown, C. M. and Fortin, D. and Hamano, K. and Kowalewski, R. and Roney, J. M. and Sobie, R. J. and Back, J. J. and Harrison, P. F. and Latham, T. E. and Mohanty, G. B. and Band, H. R. and Chen, X. and Cheng, B. and Dasu, S. and Datta, M. and Eichenbaum, A. M. and Flood, K. T. and Graham, M. and Hollar, J. J. and Johnson, J. R. and Kutter, P. E. and Li, H. and Liu, R. and Mellado, B. and Mihalyi, A. and Pan, Y. and Prepost, R. and Tan, P. and {von Wimmersperg-Toeller}, J. H. and Wu, S. L. and Yu, Z. and Neal, H.}, + author = {Aubert, B. and Barate, R. and Boutigny, D. and Couderc, F. and Karyotakis, Y. and Lees, J. P. and Poireau, V. and Tisserand, V. and Zghiche, A. and Grauges, E. and Palano, A. and Pappagallo, M. and Pompili, A. and Chen, J. C. and Qi, N. D. and Rong, G. and Wang, P. and Zhu, Y. S. and Eigen, G. and Ofte, I. and Stugu, B. and Abrams, G. S. and Battaglia, M. and Breon, A. B. and Brown, D. N. and {Button-Shafer}, J. and Cahn, R. N. and Charles, E. and Day, C. T. and Gill, M. S. and Gritsan, A. V. and Groysman, Y. and Jacobsen, R. G. and Kadel, R. W. and Kadyk, J. and Kerth, L. T. and Kolomensky, {\relax Yu}. G. and Kukartsev, G. and Lynch, G. and Mir, L. M. and Oddone, P. J. and Orimoto, T. J. and Pripstein, M. and Roe, N. A. and Ronan, M. T. and Wenzel, W. A. and Barrett, M. and Ford, K. E. and Harrison, T. J. and Hart, A. J. and Hawkes, C. M. and Morgan, S. E. and Watson, A. T. and Fritsch, M. and Goetzen, K. and Held, T. and Koch, H. and Lewandowski, B. and Pelizaeus, M. and Peters, K. and Schroeder, T. and Steinke, M. and Boyd, J. T. and Burke, J. P. and Chevalier, N. and Cottingham, W. N. and Kelly, M. P. and {Cuhadar-Donszelmann}, T. and Fulsom, B. G. and Hearty, C. and Knecht, N. S. and Mattison, T. S. and McKenna, J. A. and Khan, A. and Kyberd, P. and Saleem, M. and Teodorescu, L. and Blinov, A. E. and Blinov, V. E. and Bukin, A. D. and Druzhinin, V. P. and Golubev, V. B. and Kravchenko, E. A. and Onuchin, A. P. and Serednyakov, S. I. and Skovpen, {\relax Yu}. I. and Solodov, E. P. and Yushkov, A. N. and Best, D. and Bondioli, M. and Bruinsma, M. and Chao, M. and Eschrich, I. and Kirkby, D. and Lankford, A. J. and Mandelkern, M. and Mommsen, R. K. and Roethel, W. and Stoker, D. P. and Buchanan, C. and Hartfiel, B. L. and Weinstein, A. J. R. and Foulkes, S. D. and Gary, J. W. and Long, O. and Shen, B. C. and Wang, K. and Zhang, L. and {del Re}, D. and Hadavand, H. K. and Hill, E. J. and MacFarlane, D. B. and Paar, H. P. and Rahatlou, S. and Sharma, V. and Berryhill, J. W. and Campagnari, C. and Cunha, A. and Dahmes, B. and Hong, T. M. and Mazur, M. A. and Richman, J. D. and Verkerke, W. and Beck, T. W. and Eisner, A. M. and Flacco, C. J. and Heusch, C. A. and Kroseberg, J. and Lockman, W. S. and Nesom, G. and Schalk, T. and Schumm, B. A. and Seiden, A. and Spradlin, P. and Williams, D. C. and Wilson, M. G. and Albert, J. and Chen, E. and {Dubois-Felsmann}, G. P. and Dvoretskii, A. and Hitlin, D. G. and Narsky, I. and Piatenko, T. and Porter, F. C. and Ryd, A. and Samuel, A. and Andreassen, R. and Jayatilleke, S. and Mancinelli, G. and Meadows, B. T. and Sokoloff, M. D. and Blanc, F. and Bloom, P. and Chen, S. and Ford, W. T. and Nauenberg, U. and Olivas, A. and Rankin, P. and Ruddick, W. O. and Smith, J. G. and Ulmer, K. A. and Wagner, S. R. and Zhang, J. and Chen, A. and Eckhart, E. A. and Soffer, A. and Toki, W. H. and Wilson, R. J. and Zeng, Q. and Altenburg, D. and Feltresi, E. and Hauke, A. and Spaan, B. and Brandt, T. and Brose, J. and Dickopp, M. and Klose, V. and Lacker, H. M. and Nogowski, R. and Otto, S. and Petzold, A. and Schott, G. and Schubert, J. and Schubert, K. R. and Schwierz, R. and Sundermann, J. E. and Bernard, D. and Bonneaud, G. R. and Grenier, P. and Schrenk, S. and Thiebaux, {\relax Ch}. and Vasileiadis, G. and Verderi, M. and Bard, D. J. and Clark, P. J. and Gradl, W. and Muheim, F. and Playfer, S. and Xie, Y. and Andreotti, M. and Azzolini, V. and Bettoni, D. and Bozzi, C. and Calabrese, R. and Cibinetto, G. and Luppi, E. and Negrini, M. and Piemontese, L. and Anulli, F. and {Baldini-Ferroli}, R. and Calcaterra, A. and {de Sangro}, R. and Finocchiaro, G. and Patteri, P. and Peruzzi, I. M. and Piccolo, M. and Zallo, A. and Buzzo, A. and Capra, R. and Contri, R. and Vetere, M. Lo and Macri, M. and Monge, M. R. and Passaggio, S. and Patrignani, C. and Robutti, E. and Santroni, A. and Tosi, S. and Bailey, S. and Brandenburg, G. and Chaisanguanthum, K. S. and Morii, M. and Won, E. and Wu, J. and Dubitzky, R. S. and Langenegger, U. and Marks, J. and Schenk, S. and Uwer, U. and Bhimji, W. and Bowerman, D. A. and Dauncey, P. D. and Egede, U. and Flack, R. L. and Gaillard, J. R. and Morton, G. W. and Nash, J. A. and Nikolich, M. B. and Taylor, G. P. and Vazquez, W. P. and Charles, M. J. and Mader, W. F. and Mallik, U. and Mohapatra, A. K. and Cochran, J. and Crawley, H. B. and Eyges, V. and Meyer, W. T. and Prell, S. and Rosenberg, E. I. and Rubin, A. E. and Yi, J. and Arnaud, N. and Davier, M. and Giroux, X. and Grosdidier, G. and Höcker, A. and Diberder, F. Le and Lepeltier, V. and Lutz, A. M. and Oyanguren, A. and Petersen, T. C. and Pierini, M. and Plaszczynski, S. and Rodier, S. and Roudeau, P. and Schune, M. H. and Stocchi, A. and Wormser, G. and Cheng, C. H. and Lange, D. J. and Simani, M. C. and Wright, D. M. and Bevan, A. J. and Chavez, C. A. and Coleman, J. P. and Forster, I. J. and Fry, J. R. and Gabathuler, E. and Gamet, R. and George, K. A. and Hutchcroft, D. E. and Parry, R. J. and Payne, D. J. and Schofield, K. C. and Touramanis, C. and Cormack, C. M. and Lodovico, F. Di and Sacco, R. and Brown, C. L. and Cowan, G. and Flaecher, H. U. and Green, M. G. and Hopkins, D. A. and Jackson, P. S. and McMahon, T. R. and Ricciardi, S. and Salvatore, F. and Brown, D. and Davis, C. L. and Allison, J. and Barlow, N. R. and Barlow, R. J. and Hodgkinson, M. C. and Lafferty, G. D. and Naisbit, M. T. and Williams, J. C. and Chen, C. and Farbin, A. and Hulsbergen, W. D. and Jawahery, A. and Kovalskyi, D. and Lae, C. K. and Lillard, V. and Roberts, D. A. and Simi, G. and Blaylock, G. and Dallapiccola, C. and Hertzbach, S. S. and Kofler, R. and Koptchev, V. B. and Li, X. and Moore, T. B. and Saremi, S. and Staengle, H. and Willocq, S. and Cowan, R. and Koeneke, K. and Sciolla, G. and Sekula, S. J. and Spitznagel, M. and Taylor, F. and Yamamoto, R. K. and Kim, H. and Patel, P. M. and Robertson, S. H. and Lazzaro, A. and Lombardo, V. and Palombo, F. and Bauer, J. M. and Cremaldi, L. and Eschenburg, V. and Godang, R. and Kroeger, R. and Reidy, J. and Sanders, D. A. and Summers, D. J. and Zhao, H. W. and Brunet, S. and CĂŽtĂ©, D. and Taras, P. and Viaud, B. and Nicholson, H. and Cavallo, N. and Nardo, G. De and Fabozzi, F. and Gatto, C. and Lista, L. and Monorchio, D. and Paolucci, P. and Piccolo, D. and Sciacca, C. and Baak, M. and Bulten, H. and Raven, G. and Snoek, H. L. and Wilden, L. and Jessop, C. P. and LoSecco, J. M. and Allmendinger, T. and Benelli, G. and Gan, K. K. and Honscheid, K. and Hufnagel, D. and Jackson, P. D. and Kagan, H. and Kass, R. and Pulliam, T. and Rahimi, A. M. and {Ter-Antonyan}, R. and Wong, Q. K. and Brau, J. and Frey, R. and Igonkina, O. and Lu, M. and Potter, C. T. and Sinev, N. B. and Strom, D. and Strube, J. and Torrence, E. and Dorigo, A. and Galeazzi, F. and Margoni, M. and Morandin, M. and Posocco, M. and Rotondo, M. and Simonetto, F. and Stroili, R. and Voci, C. and Benayoun, M. and Briand, H. and Chauveau, J. and David, P. and Buono, L. Del and {de la VaissiĂšre}, {\relax Ch}. and Hamon, O. and John, M. J. J. and Leruste, {\relax Ph}. and MalclĂšs, J. and Ocariz, J. and Roos, L. and Therin, G. and Behera, P. K. and Gladney, L. and Guo, Q. H. and Panetta, J. and Biasini, M. and Covarelli, R. and Pacetti, S. and Pioppi, M. and Angelini, C. and Batignani, G. and Bettarini, S. and Bucci, F. and Calderini, G. and Carpinelli, M. and Cenci, R. and Forti, F. and Giorgi, M. A. and Lusiani, A. and Marchiori, G. and Morganti, M. and Neri, N. and Paoloni, E. and Rama, M. and Rizzo, G. and Walsh, J. and Haire, M. and Judd, D. and Wagoner, D. E. and Biesiada, J. and Danielson, N. and Elmer, P. and Lau, Y. P. and Lu, C. and Olsen, J. and Smith, A. J. S. and Telnov, A. V. and Bellini, F. and Cavoto, G. and D’Orazio, A. and Di Marco, E. and Faccini, R. and Ferrarotto, F. and Ferroni, F. and Gaspero, M. and Li Gioi, L. and Mazzoni, M. A. and Morganti, S. and Piredda, G. and Polci, F. and Tehrani, F. Safai and Voena, C. and Schröder, H. and Wagner, G. and Waldi, R. and Adye, T. and De Groot, N. and Franek, B. and Gopal, G. P. and Olaiya, E. O. and Wilson, F. F. and Aleksan, R. and Emery, S. and Gaidot, A. and Ganzhur, S. F. and Giraud, P.-F. and Graziani, G. and {de Monchenault}, G. Hamel and Kozanecki, W. and Legendre, M. and London, G. W. and Mayer, B. and Vasseur, G. and YĂšche, {\relax Ch}. and Zito, M. and Purohit, M. V. and Weidemann, A. W. and Wilson, J. R. and Yumiceva, F. X. and Abe, T. and Allen, M. T. and Aston, D. and Bartoldus, R. and Berger, N. and Boyarski, A. M. and Buchmueller, O. L. and Claus, R. and Convery, M. R. and Cristinziani, M. and Dingfelder, J. C. and Dong, D. and Dorfan, J. and Dujmic, D. and Dunwoodie, W. and Fan, S. and Field, R. C. and Glanzman, T. and Gowdy, S. J. and Hadig, T. and Halyo, V. and Hast, C. and Hryn’ova, T. and Innes, W. R. and Kelsey, M. H. and Kim, P. and Kocian, M. L. and Leith, D. W. G. S. and Libby, J. and Luitz, S. and Luth, V. and Lynch, H. L. and Marsiske, H. and Messner, R. and Muller, D. R. and O’Grady, C. P. and Ozcan, V. E. and Perazzo, A. and Perl, M. and Ratcliff, B. N. and Roodman, A. and Salnikov, A. A. and Schindler, R. H. and Schwiening, J. and Snyder, A. and Stelzer, J. and Su, D. and Sullivan, M. K. and Suzuki, K. and Swain, S. and Thompson, J. M. and Va’vra, J. and Weaver, M. and Wisniewski, W. J. and Wittgen, M. and Wright, D. H. and Yarritu, A. K. and Yi, K. and Young, C. C. and Burchat, P. R. and Edwards, A. J. and Majewski, S. A. and Petersen, B. A. and Roat, C. and Ahmed, M. and Ahmed, S. and Alam, M. S. and Ernst, J. A. and Saeed, M. A. and Wappler, F. R. and Zain, S. B. and Bugg, W. and Krishnamurthy, M. and Spanier, S. M. and Eckmann, R. and Ritchie, J. L. and Satpathy, A. and Schwitters, R. F. and Izen, J. M. and Kitayama, I. and Lou, X. C. and Ye, S. and Bianchi, F. and Bona, M. and Gallo, F. and Gamba, D. and Bomben, M. and Bosisio, L. and Cartaro, C. and Cossutti, F. and Ricca, G. Della and Dittongo, S. and Grancagnolo, S. and Lanceri, L. and Vitale, L. and {Martinez-Vidal}, F. and Panvini, R. S. and Banerjee, {\relax Sw}. and Bhuyan, B. and Brown, C. M. and Fortin, D. and Hamano, K. and Kowalewski, R. and Roney, J. M. and Sobie, R. J. and Back, J. J. and Harrison, P. F. and Latham, T. E. and Mohanty, G. B. and Band, H. R. and Chen, X. and Cheng, B. and Dasu, S. and Datta, M. and Eichenbaum, A. M. and Flood, K. T. and Graham, M. and Hollar, J. J. and Johnson, J. R. and Kutter, P. E. and Li, H. and Liu, R. and Mellado, B. and Mihalyi, A. and Pan, Y. and Prepost, R. and Tan, P. and {von Wimmersperg-Toeller}, J. H. and Wu, S. L. and Yu, Z. and Neal, H.}, year = {2005}, month = sep, journal = {Physical Review D}, @@ -42,8 +41,8 @@ @book{bycklingParticleKinematics1973 title = {Particle {{Kinematics}}}, author = {Byckling, Eero and Kajantie, Keijo}, year = {1973}, - publisher = {{Wiley}}, - address = {{London, New York}}, + publisher = {Wiley}, + address = {London, New York}, isbn = {978-0-471-12885-4}, lccn = {QC794.6.K5 B95} } @@ -62,16 +61,7 @@ @article{cahnMystery9801986 url = {https://linkinghub.elsevier.com/retrieve/pii/0550321386901008} } -@techreport{chungFormulasAngularMomentumBarrier2015, - title = {Formulas for {{Angular-Momentum Barrier Factors}} ({{Version II}})}, - author = {Chung, Suh-Urk}, - year = {2015}, - month = mar, - institution = {{Brookhaven National Laboratory}}, - url = {https://physique.cuso.ch/fileadmin/physique/document/2015_chung_brfactor1.pdf} -} - -@article{chungPartialWaveAnalysis1995, +@article{Chung:1995dx, title = {{Partial wave analysis in đŸ-matrix formalism}}, author = {Chung, Suh-Urk and Brose, J. and Hackmann, R. and Klempt, E. and Spanier, S. and Strassburger, C.}, year = {1995}, @@ -85,6 +75,15 @@ @article{chungPartialWaveAnalysis1995 url = {http://doi.wiley.com/10.1002/andp.19955070504} } +@techreport{chungFormulasAngularMomentumBarrier2015, + title = {Formulas for {{Angular-Momentum Barrier Factors}} ({{Version II}})}, + author = {Chung, Suh-Urk}, + year = {2015}, + month = mar, + institution = {Brookhaven National Laboratory}, + url = {https://physique.cuso.ch/fileadmin/physique/document/2015_chung_brfactor1.pdf} +} + @misc{chungPrimerKmatrixFormalism1995, title = {A {{Primer}} on {{K-matrix Formalism}} — {{Version VII}}}, author = {Chung, Suh-Urk}, @@ -99,7 +98,7 @@ @techreport{chungSpinFormalismsUpdated2014 year = {2014}, month = jul, pages = {BNL--76975-2006-IR, 890945}, - institution = {{Brookhaven National Laboratory}}, + institution = {Brookhaven National Laboratory}, url = {https://suchung.web.cern.ch/spinfm1.pdf} } @@ -117,7 +116,7 @@ @article{flatteCoupledchannelAnalysisPi1976 url = {https://linkinghub.elsevier.com/retrieve/pii/0370269376906547} } -@article{jacobGeneralTheoryCollisions1959, +@article{Jacob:1959at, title = {On the General Theory of Collisions for Particles with Spin}, author = {Jacob, M. and Wick, G.C.}, year = {1959}, @@ -131,6 +130,21 @@ @article{jacobGeneralTheoryCollisions1959 url = {https://linkinghub.elsevier.com/retrieve/pii/000349165990051X} } +@article{JPAC:2019ufm, + title = {Dalitz-Plot Decomposition for Three-Body Decays}, + author = {Mikhasenko, M. and Albaladejo, M. and Bibrzycki, Ɓ. and {Fernandez-Ramirez}, C. and Mathieu, V. and Mitchell, S. and Pappagallo, M. and Pilloni, A. and Winney, D. and Skwarnicki, T. and Szczepaniak, A. P.}, + year = {2020}, + month = feb, + journal = {Physical Review D: Particles and Fields}, + volume = {101}, + number = {3}, + pages = {034033}, + issn = {2470-0010, 2470-0029}, + doi = {10.1103/PhysRevD.101.034033}, + url = {https://journals.aps.org/prd/abstract/10.1103/PhysRevD.101.034033}, + archiveprefix = {arxiv} +} + @misc{kutschkeAngularDistributionCookbook1996, title = {An {{Angular Distribution Cookbook}}}, author = {Kutschke, Rob}, @@ -139,7 +153,7 @@ @misc{kutschkeAngularDistributionCookbook1996 url = {https://home.fnal.gov/~kutschke/Angdist/angdist.ps} } -@article{marangottoHelicityAmplitudesGeneric2020, +@article{Marangotto:2019ucc, title = {Helicity {{Amplitudes}} for {{Generic Multibody Particle Decays Featuring Multiple Decay Chains}}}, author = {Marangotto, Daniele}, editor = {Vagnozzi, Sunny}, @@ -150,15 +164,16 @@ @article{marangottoHelicityAmplitudesGeneric2020 pages = {1--15}, issn = {1687-7365, 1687-7357}, doi = {10.1155/2020/6674595}, - url = {https://www.hindawi.com/journals/ahep/2020/6674595/} + url = {https://www.hindawi.com/journals/ahep/2020/6674595/}, + archiveprefix = {arxiv} } @book{martinElementaryParticleTheory1970, title = {Elementary {{Particle Theory}}}, author = {Martin, Alan D. and Spearman, T. D.}, year = {1970}, - publisher = {{North-Holland Pub. Co}}, - address = {{Amsterdam}}, + publisher = {North-Holland Pub. Co}, + address = {Amsterdam}, isbn = {978-0-7204-0157-8}, lccn = {QC721 .M298} } @@ -168,27 +183,10 @@ @misc{meyerMatrixTutorial2008 author = {Meyer, Curtis A.}, year = {2008}, month = oct, - address = {{Munich, Germany}}, + address = {Munich, Germany}, url = {http://www.curtismeyer.com/talks/PWA_Munich_KMatrix.pdf} } -@article{mikhasenkoDalitzplotDecompositionThreebody2020, - title = {Dalitz-Plot Decomposition for Three-Body Decays}, - author = {Mikhasenko, M. and Albaladejo, M. and Bibrzycki, Ɓ. and {Fernandez-Ramirez}, C. and Mathieu, V. and Mitchell, S. and Pappagallo, M. and Pilloni, A. and Winney, D. and Skwarnicki, T. and Szczepaniak, A. P.}, - year = {2020}, - month = feb, - journal = {Physical Review D}, - volume = {101}, - number = {3}, - eprint = {1910.04566}, - eprinttype = {arxiv}, - pages = {034033}, - issn = {2470-0010, 2470-0029}, - doi = {10.1103/PhysRevD.101.034033}, - url = {https://journals.aps.org/prd/abstract/10.1103/PhysRevD.101.034033}, - archiveprefix = {arXiv} -} - @phdthesis{pychyGekoppeltePartialwellenanalyseAnnihilationen2016, title = {{Gekoppelte Partialwellenanalyse von đ‘Ì…đ‘-Annihilationen im Fluge in die EndzustĂ€nde đŸâșđŸâ»đœ‹â°, 𝜋⁰𝜋⁰𝜂 und 𝜋⁰𝜂𝜂}}, author = {Pychy, Julian}, @@ -205,5 +203,3 @@ @misc{richmanExperimenterGuideHelicity1984 month = jun, url = {https://inspirehep.net/literature/202987} } - - diff --git a/docs/usage.ipynb b/docs/usage.ipynb index 918ccd40a..4fe601cc9 100644 --- a/docs/usage.ipynb +++ b/docs/usage.ipynb @@ -253,7 +253,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "In case of multiple decay topologies, AmpForm also takes care of {doc}`spin alignment ` with {cite}`marangottoHelicityAmplitudesGeneric2020`!" + "In case of multiple decay topologies, AmpForm also takes care of {doc}`spin alignment ` with {cite}`Marangotto:2019ucc`!" ] }, { diff --git a/docs/usage/dynamics/k-matrix.ipynb b/docs/usage/dynamics/k-matrix.ipynb index dc6e642fa..c22fb243b 100644 --- a/docs/usage/dynamics/k-matrix.ipynb +++ b/docs/usage/dynamics/k-matrix.ipynb @@ -74,9 +74,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "While {mod}`ampform` does not yet provide a generic way to formulate an amplitude model with $\\boldsymbol{K}$-matrix dynamics, the (experimental) {mod}`.kmatrix` module makes it fairly simple to produce a symbolic expression for a parameterized $\\boldsymbol{K}$-matrix with an arbitrary number of poles and channels and play around with it interactively. For more info on the $\\boldsymbol{K}$-matrix, see the classic paper by Chung {cite}`chungPartialWaveAnalysis1995`, {pdg-review}`2021; Resonances`, or this instructive presentation {cite}`meyerMatrixTutorial2008`.\n", + "While {mod}`ampform` does not yet provide a generic way to formulate an amplitude model with $\\boldsymbol{K}$-matrix dynamics, the (experimental) {mod}`.kmatrix` module makes it fairly simple to produce a symbolic expression for a parameterized $\\boldsymbol{K}$-matrix with an arbitrary number of poles and channels and play around with it interactively. For more info on the $\\boldsymbol{K}$-matrix, see the classic paper by Chung {cite}`Chung:1995dx`, {pdg-review}`2021; Resonances`, or this instructive presentation {cite}`meyerMatrixTutorial2008`.\n", "\n", - "Section {ref}`usage/dynamics/k-matrix:Physics` summarizes {cite}`chungPartialWaveAnalysis1995`, so that the {mod}`.kmatrix` module can reference to the equations. It also points out some subtleties and deviations.\n", + "Section {ref}`usage/dynamics/k-matrix:Physics` summarizes {cite}`Chung:1995dx`, so that the {mod}`.kmatrix` module can reference to the equations. It also points out some subtleties and deviations.\n", "\n", ":::{note}\n", "\n", @@ -220,7 +220,7 @@ "In amplitude analysis, the main aim is to express the differential cross section $\\frac{d\\sigma}{d\\Omega}$, that is, the intensity distribution in each spherical direction $\\Omega=(\\phi,\\theta)$ as we can observe in experiments. This differential cross section can be expressed in terms of the **scattering amplitude** $A$:\n", "\n", "```{margin}\n", - "{cite}`chungPartialWaveAnalysis1995` Eq. (1)\n", + "{cite}`Chung:1995dx` Eq. (1)\n", "```\n", "\n", "$$\n", @@ -230,7 +230,7 @@ "We can now further express $A$ in terms of **partial wave amplitudes** by expanding it in terms of its angular momentum components:[^spin-formalisms]\n", "\n", "```{margin}\n", - "{cite}`chungPartialWaveAnalysis1995` Eq. (2)\n", + "{cite}`Chung:1995dx` Eq. (2)\n", "```\n", "\n", "$$\n", @@ -261,14 +261,14 @@ "The dynamical part $\\boldsymbol{T}$ is usually called the **transition operator**. It describes the interacting part of the more general **scattering operator** $\\boldsymbol{S}$, which describes the (complex) amplitude $\\langle f|\\boldsymbol{S}|i\\rangle$ of an initial state $|i\\rangle$ transitioning to a final state $|f\\rangle$. The scattering operator describes both the non-interacting amplitude and the transition amplitude, so it relates to the transition operator as:\n", "\n", "```{margin}\n", - "{cite}`chungPartialWaveAnalysis1995` Eq. (10)\n", + "{cite}`Chung:1995dx` Eq. (10)\n", "```\n", "\n", "$$\n", "\\boldsymbol{S} = \\boldsymbol{I} + 2i\\boldsymbol{T}\n", "$$ (S in terms of T)\n", "\n", - "with $\\boldsymbol{I}$ the identity operator. Just like in {cite}`chungPartialWaveAnalysis1995`, we use a factor 2, while other authors choose $\\boldsymbol{S} = \\boldsymbol{I} + i\\boldsymbol{T}$. In that case, one would have to multiply Eq. {eq}`partial-wave-expansion` by a factor $\\frac{1}{2}$." + "with $\\boldsymbol{I}$ the identity operator. Just like in {cite}`Chung:1995dx`, we use a factor 2, while other authors choose $\\boldsymbol{S} = \\boldsymbol{I} + i\\boldsymbol{T}$. In that case, one would have to multiply Eq. {eq}`partial-wave-expansion` by a factor $\\frac{1}{2}$." ] }, { @@ -285,7 +285,7 @@ "Knowing the origin of the $\\boldsymbol{T}$-matrix, there is an important restriction that we need to comply with when we further formulate a {ref}`parametrization `: **unitarity**. This means that $\\boldsymbol{S}$ should conserve probability, namely $\\boldsymbol{S}^\\dagger\\boldsymbol{S} = \\boldsymbol{I}$. Luckily, there is a trick that makes this easier. If we express $\\boldsymbol{S}$ in terms of an operator $\\boldsymbol{K}$ by applying a [Cayley transformation](https://en.wikipedia.org/wiki/Cayley_transform):\n", "\n", "```{margin}\n", - "{cite}`chungPartialWaveAnalysis1995` Eq. (20)\n", + "{cite}`Chung:1995dx` Eq. (20)\n", "```\n", "\n", "$$\n", @@ -295,7 +295,7 @@ "_unitarity is conserved if $\\boldsymbol{K}$ is real_. With some matrix jumbling, we can derive that the $\\boldsymbol{T}$-matrix can be expressed in terms of $\\boldsymbol{K}$ as follows:\n", "\n", "```{margin}\n", - "{cite}`chungPartialWaveAnalysis1995` Eq. (19);\n", + "{cite}`Chung:1995dx` Eq. (19);\n", "compare with {eq}`T-hat-in-terms-of-K-hat`\n", "```\n", "\n", @@ -324,7 +324,7 @@ "The description so far did not take Lorentz-invariance into account. For this, we first need to define a **two-body phase space matrix** $\\boldsymbol{\\rho}$:\n", "\n", "```{margin}\n", - "{cite}`chungPartialWaveAnalysis1995` Eq. (36)\n", + "{cite}`Chung:1995dx` Eq. (36)\n", "```\n", "\n", "$$\n", @@ -338,7 +338,7 @@ "with $\\rho_i$ given by {eq}`PhaseSpaceFactor` in {class}`.PhaseSpaceFactor` for the final state masses $m_{a,i}, m_{b,i}$. The **Lorentz-invariant amplitude $\\boldsymbol{\\hat{T}}$** and corresponding Lorentz-invariant $\\boldsymbol{\\hat{K}}$-matrix can then be computed from $\\boldsymbol{T}$ and $\\boldsymbol{K}$ with:[^rho-dagger]\n", "\n", "```{margin}\n", - "{cite}`chungPartialWaveAnalysis1995` Eqs. (34) and (47)\n", + "{cite}`Chung:1995dx` Eqs. (34) and (47)\n", "```\n", "\n", "$$\n", @@ -353,7 +353,7 @@ "With these definitions, we can deduce that:\n", "\n", "```{margin}\n", - "{cite}`chungPartialWaveAnalysis1995` Eq. (51);\n", + "{cite}`Chung:1995dx` Eq. (51);\n", "compare with {eq}`T-in-terms-of-K`\n", "```\n", "\n", @@ -417,7 +417,7 @@ "One approach by {cite}`aitchisonMatrixFormalismOverlapping1972` is to transform $\\boldsymbol{T}$ into $F$ (and its relativistic form $\\hat{F}$) through the **production amplitude $P$-vector**:\n", "\n", "```{margin}\n", - "{cite}`chungPartialWaveAnalysis1995` Eqs. (114) and (115)\n", + "{cite}`Chung:1995dx` Eqs. (114) and (115)\n", "```\n", "\n", "$$\n", @@ -436,7 +436,7 @@ "Another approach by {cite}`cahnMystery9801986` further approximates this by defining a **$Q$-vector**:\n", "\n", "```{margin}\n", - "{cite}`chungPartialWaveAnalysis1995` Eq. (124)\n", + "{cite}`Chung:1995dx` Eq. (124)\n", "```\n", "\n", "$$\n", @@ -447,7 +447,7 @@ "that _is taken to be constant_ (just some 'fitting' parameters). The $F$-vector can then be expressed as:\n", "\n", "```{margin}\n", - "{cite}`chungPartialWaveAnalysis1995` Eq. (125)\n", + "{cite}`Chung:1995dx` Eq. (125)\n", "```\n", "\n", "$$\n", @@ -459,7 +459,7 @@ "Note that for all these vectors, we have:\n", "\n", "```{margin}\n", - "{cite}`chungPartialWaveAnalysis1995` Eqs. (116) and (124)\n", + "{cite}`Chung:1995dx` Eqs. (116) and (124)\n", "```\n", "\n", "$$\n", @@ -487,7 +487,7 @@ "[^complex-conjugate-parametrization]: Eqs. (51) and (52) in {cite}`chungPrimerKmatrixFormalism1995` take a complex conjugate of one of the residue functions and one of the phase space factors.\n", "\n", "```{margin}\n", - "{cite}`chungPartialWaveAnalysis1995` Eqs. (73) and (74)\n", + "{cite}`Chung:1995dx` Eqs. (73) and (74)\n", "```\n", "\n", "$$\n", @@ -500,7 +500,7 @@ "with $c_{ij}, \\hat{c}_{ij}$ some optional background characterization and $g_{R,i}$ the **residue functions**. The residue functions are often further expressed as:\n", "\n", "```{margin}\n", - "{cite}`chungPartialWaveAnalysis1995` Eqs. (75-78)\n", + "{cite}`Chung:1995dx` Eqs. (75-78)\n", "```\n", "\n", "$$\n", @@ -512,7 +512,7 @@ "\n", "with $\\gamma_{R,i}$ some _real_ constants and $\\Gamma^0_{R,i}$ the **partial width** of each pole. In the Lorentz-invariant form, the fixed width $\\Gamma^0$ is replaced by an \"energy dependent\" {class}`.EnergyDependentWidth` $\\Gamma(s)$.[^phase-space-factor-normalization] The **width** for each pole can be computed as $\\Gamma^0_R = \\sum_i\\Gamma^0_{R,i}$.\n", "\n", - "[^phase-space-factor-normalization]: Unlike Eq. (77) in {cite}`chungPartialWaveAnalysis1995`, AmpForm defines {class}`.EnergyDependentWidth` as in {pdg-review}`2021; Resonances; p.6`, Eq. (50.28). The difference is that the phase space factor denoted by $\\rho_i$ in Eq. (77) in {cite}`chungPartialWaveAnalysis1995` is divided by the phase space factor at the pole position $m_R$. So in AmpForm, the choice is $\\rho_i \\to \\frac{\\rho_i(s)}{\\rho_i(m_R)}$." + "[^phase-space-factor-normalization]: Unlike Eq. (77) in {cite}`Chung:1995dx`, AmpForm defines {class}`.EnergyDependentWidth` as in {pdg-review}`2021; Resonances; p.6`, Eq. (50.28). The difference is that the phase space factor denoted by $\\rho_i$ in Eq. (77) in {cite}`Chung:1995dx` is divided by the phase space factor at the pole position $m_R$. So in AmpForm, the choice is $\\rho_i \\to \\frac{\\rho_i(s)}{\\rho_i(m_R)}$." ] }, { @@ -522,7 +522,7 @@ "The production vector $P$ is commonly parameterized as:[^damping-factor-P-parametrization]\n", "\n", "```{margin}\n", - "{cite}`chungPartialWaveAnalysis1995` Eqs. (118-119) and (122)\n", + "{cite}`Chung:1995dx` Eqs. (118-119) and (122)\n", "```\n", "\n", "$$\n", @@ -541,7 +541,7 @@ "[^damping-factor-P-parametrization]: Just as with [^phase-space-factor-normalization], we have smuggled a bit in the last equation in order to be able to reproduce Equation (50.23) in {pdg-review}`2021; Resonances; p.9` in the case $n=1,n_R=1$, on which {func}`.relativistic_breit_wigner_with_ff` is based.\n", "\n", "```{margin}\n", - "{cite}`chungPartialWaveAnalysis1995` Eq. (121)\n", + "{cite}`Chung:1995dx` Eq. (121)\n", "```\n", "\n", "$$\n", @@ -1449,7 +1449,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "[^pole-vs-resonance]: See {pdg-review}`2021; Resonances`, Section 50.1, for a discussion about what poles and resonances are. See also the intro to Section 5 in {cite}`chungPartialWaveAnalysis1995`." + "[^pole-vs-resonance]: See {pdg-review}`2021; Resonances`, Section 50.1, for a discussion about what poles and resonances are. See also the intro to Section 5 in {cite}`Chung:1995dx`." ] }, { diff --git a/docs/usage/helicity/spin-alignment.ipynb b/docs/usage/helicity/spin-alignment.ipynb index 93068a556..5f38d1519 100644 --- a/docs/usage/helicity/spin-alignment.ipynb +++ b/docs/usage/helicity/spin-alignment.ipynb @@ -213,7 +213,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "One way of aligning the spins of each sub-system, is Dalitz-Plot Decomposition (DPD) {cite}`mikhasenkoDalitzplotDecompositionThreebody2020`. DPD **can only be used for three-body decays**, but results in a quite condense amplitude model expression.\n", + "One way of aligning the spins of each sub-system, is Dalitz-Plot Decomposition (DPD) {cite}`Marangotto:2019ucc`. DPD **can only be used for three-body decays**, but results in a quite condense amplitude model expression.\n", "\n", "We can select DPD alignment as follows:\n", "\n", @@ -341,7 +341,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The second spin alignment method is the 'axis-angle method' {cite}`marangottoHelicityAmplitudesGeneric2020`. This method results in much larger expressions and is therefore much less efficient, but theoretically it **can handle $n$-body final states**. It can be selected as follows:" + "The second spin alignment method is the 'axis-angle method' {cite}`Marangotto:2019ucc`. This method results in much larger expressions and is therefore much less efficient, but theoretically it **can handle $n$-body final states**. It can be selected as follows:" ] }, { diff --git a/src/ampform/helicity/__init__.py b/src/ampform/helicity/__init__.py index d31e4b83e..74fc08945 100644 --- a/src/ampform/helicity/__init__.py +++ b/src/ampform/helicity/__init__.py @@ -884,7 +884,7 @@ def formulate_isobar_wigner_d(transition: StateTransition, node_id: int) -> sp.E Wigner-:math:`D` functions in a *sequential* two-body decay. Note that this source chose :math:`\Omega=(\phi,\theta,-\phi)` as argument to the (conjugated) Wigner-:math:`D` function, just like the original paper by Jacob & Wick - :cite:`jacobGeneralTheoryCollisions1959`, Eq. (24). See p.119-120 and p.199 in + :cite:`Jacob:1959at`, Eq. (24). See p.119-120 and p.199 in :cite:`martinElementaryParticleTheory1970` for the two conventions, :math:`\gamma=0` versus :math:`\gamma=-\phi`. diff --git a/src/ampform/helicity/align/axisangle.py b/src/ampform/helicity/align/axisangle.py index 383b26cb1..8c45c96b3 100644 --- a/src/ampform/helicity/align/axisangle.py +++ b/src/ampform/helicity/align/axisangle.py @@ -1,6 +1,6 @@ """Spin alignment with the "axis-angle" method. -See :cite:`marangottoHelicityAmplitudesGeneric2020` and `Wigner rotations +See :cite:`Marangotto:2019ucc` and `Wigner rotations `_. """ @@ -45,7 +45,7 @@ class AxisAngleAlignment(SpinAlignment): """Alignment amplitudes with the "axis-angle" method. - See :cite:`marangottoHelicityAmplitudesGeneric2020` and `Wigner rotations + See :cite:`Marangotto:2019ucc` and `Wigner rotations `_. """ @@ -90,11 +90,11 @@ def formulate_axis_angle_alignment(transition: StateTransition) -> PoolSum: """Generate all Wigner-:math:`D` combinations for a spin alignment sum. Generate all Wigner-:math:`D` function combinations that appear in - :cite:`marangottoHelicityAmplitudesGeneric2020`, Eq.(45), but for a generic - multibody decay. Each element in the returned `list` is a `tuple` of - Wigner-:math:`D` functions that appear in the summation, for a specific set of - helicities were are summing over. To generate the full sum, make a multiply the - Wigner-:math:`D` functions in each `tuple` and sum over all these products. + :cite:`Marangotto:2019ucc`, Eq.(45), but for a generic multibody decay. Each element + in the returned `list` is a `tuple` of Wigner-:math:`D` functions that appear in the + summation, for a specific set of helicities were are summing over. To generate the + full sum, make a multiply the Wigner-:math:`D` functions in each `tuple` and sum + over all these products. """ rotations = PoolSum(1) for rotated_state_id in transition.final_states: @@ -108,10 +108,10 @@ def formulate_rotation_chain( ) -> PoolSum: """Formulate the spin alignment sum for a specific chain. - See Eq.(45) from :cite:`marangottoHelicityAmplitudesGeneric2020`. The chain consists - of a series of helicity rotations (see :func:`formulate_helicity_rotation_chain`) - plus a Wigner rotation (see :func:`.formulate_wigner_rotation`) in case there is - more than one helicity rotation. + See Eq.(45) from :cite:`Marangotto:2019ucc`. The chain consists of a series of + helicity rotations (see :func:`formulate_helicity_rotation_chain`) plus a Wigner + rotation (see :func:`.formulate_wigner_rotation`) in case there is more than one + helicity rotation. """ helicity_symbol = create_spin_projection_symbol(rotated_state_id) helicity_rotations = formulate_helicity_rotation_chain( @@ -192,7 +192,7 @@ def formulate_wigner_rotation( A **Wigner rotation** is the 'average' rotation that results form a chain of Lorentz boosts to a new reference frame with regard to a direct boost. See - :cite:`marangottoHelicityAmplitudesGeneric2020`, p.6, especially Eq.(36). + :cite:`Marangotto:2019ucc`, p.6, especially Eq.(36). Args: transition: The `~qrules.topology.Transition` in which you @@ -246,11 +246,10 @@ def formulate_helicity_rotation( R(\alpha,\beta,\gamma)\left|s,m\right\rangle = \sum^s_{m'=-s} D^s_{m',m}\left(\alpha,\beta,\gamma\right) \left|s,m'\right\rangle - See :cite:`marangottoHelicityAmplitudesGeneric2020`, Eq.(B.5). + See :cite:`Marangotto:2019ucc`, Eq.(B.5). This function gives the summation over these Wigner-:math:`D` functions and can be - used for spin alignment following :cite:`marangottoHelicityAmplitudesGeneric2020`, - Eq.(45). + used for spin alignment following :cite:`Marangotto:2019ucc`, Eq.(45). Args: spin_magnitude: Spin magnitude :math:`s` of spin state that is being diff --git a/src/ampform/helicity/align/dpd.py b/src/ampform/helicity/align/dpd.py index 1b93fc92c..061e959cc 100644 --- a/src/ampform/helicity/align/dpd.py +++ b/src/ampform/helicity/align/dpd.py @@ -1,6 +1,6 @@ """Spin alignment with Dalitz-Plot Decomposition. -See :cite:`mikhasenkoDalitzplotDecompositionThreebody2020`. +See :cite:`Marangotto:2019ucc`. """ from __future__ import annotations @@ -46,7 +46,7 @@ class DalitzPlotDecomposition(SpinAlignment): """Alignment amplitudes with the "axis-angle" method. - See :cite:`marangottoHelicityAmplitudesGeneric2020` and `Wigner rotations + See :cite:`Marangotto:2019ucc` and `Wigner rotations `_. """ diff --git a/src/ampform/helicity/decay.py b/src/ampform/helicity/decay.py index 11c76cd7c..606df2889 100644 --- a/src/ampform/helicity/decay.py +++ b/src/ampform/helicity/decay.py @@ -152,14 +152,13 @@ def is_opposite_helicity_state(topology: Topology, state_id: int) -> bool: The Wigner-:math:`D` function for a two-particle state treats one helicity with a negative sign. This sign originates from Eq.(13) in - :cite:`jacobGeneralTheoryCollisions1959` (see also Eq.(6) in - :cite:`marangottoHelicityAmplitudesGeneric2020`). Following - :cite:`marangottoHelicityAmplitudesGeneric2020`, we call the state that gets this - minus sign the **"opposite helicity" state**. The other state is called **helicity - state**. The choice of (opposite) helicity state affects not only the sign in the - Wigner-:math:`D` function, but also the choice of angles: the argument of the - Wigner-:math:`D` function returned by :func:`.formulate_isobar_wigner_d` are the - angles of the helicity state. + :cite:`Jacob:1959at` (see also Eq.(6) in + :cite:`Marangotto:2019ucc`). Following :cite:`Marangotto:2019ucc`, we call the state + that gets this minus sign the **"opposite helicity" state**. The other state is + called **helicity state**. The choice of (opposite) helicity state affects not only + the sign in the Wigner-:math:`D` function, but also the choice of angles: the + argument of the Wigner-:math:`D` function returned by + :func:`.formulate_isobar_wigner_d` are the angles of the helicity state. """ sibling_id = get_sibling_state_id(topology, state_id) state_fs_ids = determine_attached_final_state(topology, state_id) diff --git a/src/ampform/kinematics/angles.py b/src/ampform/kinematics/angles.py index debb3580f..f2b65bf45 100644 --- a/src/ampform/kinematics/angles.py +++ b/src/ampform/kinematics/angles.py @@ -169,9 +169,9 @@ def compute_wigner_angles( ) -> dict[sp.Symbol, sp.Expr]: """Create an `~sympy.core.expr.Expr` for each angle in a Wigner rotation. - Implementation of (B.2-4) in :cite:`marangottoHelicityAmplitudesGeneric2020`, with - :math:`x'_z` etc. taken from the result of :func:`compute_wigner_rotation_matrix`. - See also `Wigner rotations `_. + Implementation of (B.2-4) in :cite:`Marangotto:2019ucc`, with :math:`x'_z` etc. + taken from the result of :func:`compute_wigner_rotation_matrix`. See also `Wigner + rotations `_. """ wigner_rotation_matrix = compute_wigner_rotation_matrix(topology, momenta, state_id) x_z = ArraySlice(wigner_rotation_matrix, (slice(None), 1, 3)) @@ -195,8 +195,8 @@ def compute_wigner_rotation_matrix( ) -> MatrixMultiplication: """Compute a Wigner rotation matrix. - Implementation of Eq. (36) in :cite:`marangottoHelicityAmplitudesGeneric2020`. See - also `Wigner rotations `_. + Implementation of Eq. (36) in :cite:`Marangotto:2019ucc`. See also `Wigner rotations + `_. """ momentum = momenta[state_id] inverted_direct_boost = BoostMatrix(NegativeMomentum(momentum)) @@ -209,12 +209,10 @@ def formulate_scattering_angle( ) -> tuple[sp.Symbol, sp.acos]: r"""Formulate the scattering angle in the rest frame of the resonance. - Compute the :math:`\theta_{ij}` scattering angle as formulated in `Eq (A1) - in the DPD paper - `_ - :cite:`mikhasenkoDalitzplotDecompositionThreebody2020`. The angle is that - between particle :math:`i` and spectator particle :math:`k` in the rest - frame of the isobar resonance :math:`(ij)`. + Compute the :math:`\theta_{ij}` scattering angle as formulated in `Eq (A1) in the + DPD paper `_ + :cite:`Marangotto:2019ucc`. The angle is that between particle :math:`i` and + spectator particle :math:`k` in the rest frame of the isobar resonance :math:`(ij)`. """ if not {state_id, sibling_id} <= {1, 2, 3}: msg = "Child IDs need to be one of 1, 2, 3" From 125d6e67861c79207a0543c624e2f578f9dcc780 Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Thu, 16 May 2024 15:03:34 +0200 Subject: [PATCH 3/4] DOC: switch to author-year citation style --- .cspell.json | 1 + docs/_extend_docstrings.py | 24 ++++- docs/bibliography.bib | 23 +++-- docs/conf.py | 1 + src/ampform/dynamics/form_factor.py | 134 +++++++++++----------------- 5 files changed, 87 insertions(+), 96 deletions(-) diff --git a/.cspell.json b/.cspell.json index a49073f36..03f4f2aaf 100644 --- a/.cspell.json +++ b/.cspell.json @@ -244,6 +244,7 @@ "hankel", "helicities", "helicity", + "Hippel", "htmlcov", "imap", "ipynb", diff --git a/docs/_extend_docstrings.py b/docs/_extend_docstrings.py index d1ca67da4..b87a48746 100644 --- a/docs/_extend_docstrings.py +++ b/docs/_extend_docstrings.py @@ -63,12 +63,19 @@ def extend_docstrings() -> None: def extend_BlattWeisskopfSquared() -> None: - from ampform.dynamics.form_factor import BlattWeisskopfSquared + from ampform.dynamics.form_factor import BlattWeisskopfSquared, SphericalHankel1 - z = sp.Symbol("z", real=True) - L = sp.Symbol("L", integer=True) + z = sp.Symbol("z", nonnegative=True, real=True) + L = sp.Symbol("L", integer=True, nonnegative=True) expr = BlattWeisskopfSquared(z, angular_momentum=L) - _append_latex_doit_definition(expr, deep=True, full_width=True) + h1lz = SphericalHankel1(L, z) + _append_latex_doit_definition(expr) + _append_to_docstring( + BlattWeisskopfSquared, + f"""\n + where :math:`{sp.latex(h1lz)}` is defined by :eq:`SphericalHankel1`. + """, + ) def extend_BoostMatrix() -> None: @@ -472,6 +479,15 @@ def extend_RotationZMatrix() -> None: ) +def extend_SphericalHankel1() -> None: + from ampform.dynamics.form_factor import SphericalHankel1 + + z = sp.Symbol("z", nonnegative=True, real=True) + ell = sp.Symbol(R"\ell", integer=True, nonnegative=True) + expr = SphericalHankel1(ell, z) + _append_latex_doit_definition(expr) + + def extend_Theta() -> None: from ampform.kinematics.angles import Theta diff --git a/docs/bibliography.bib b/docs/bibliography.bib index a90cc0681..3dedfd45c 100755 --- a/docs/bibliography.bib +++ b/docs/bibliography.bib @@ -187,15 +187,6 @@ @misc{meyerMatrixTutorial2008 url = {http://www.curtismeyer.com/talks/PWA_Munich_KMatrix.pdf} } -@phdthesis{pychyGekoppeltePartialwellenanalyseAnnihilationen2016, - title = {{Gekoppelte Partialwellenanalyse von đ‘Ì…đ‘-Annihilationen im Fluge in die EndzustĂ€nde đŸâșđŸâ»đœ‹â°, 𝜋⁰𝜋⁰𝜂 und 𝜋⁰𝜂𝜂}}, - author = {Pychy, Julian}, - year = {2016}, - month = apr, - url = {https://hss-opus.ub.ruhr-uni-bochum.de/opus4/frontdoor/deliver/index/docId/4943/file/diss.pdf}, - school = {Ruhr-UniversitĂ€t Bochum} -} - @misc{richmanExperimenterGuideHelicity1984, title = {An {{Experimenter}}'s {{Guide}} to the {{Helicity Formalism}}}, author = {Richman, Jeffrey D.}, @@ -203,3 +194,17 @@ @misc{richmanExperimenterGuideHelicity1984 month = jun, url = {https://inspirehep.net/literature/202987} } + +@article{VonHippel:1972fg, + title = {Centrifugal-{{Barrier Effects}} in {{Resonance Partial Decay Widths}}, {{Shapes}}, and {{Production Amplitudes}}}, + author = {{von Hippel}, Frank and Quigg, C.}, + year = {1972}, + month = feb, + journal = {Physical Review D}, + volume = {5}, + number = {3}, + pages = {624--638}, + issn = {0556-2821}, + doi = {10.1103/PhysRevD.5.624}, + url = {https://link.aps.org/doi/10.1103/PhysRevD.5.624} +} diff --git a/docs/conf.py b/docs/conf.py index a54b72725..36bfc41bc 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -109,6 +109,7 @@ autosectionlabel_prefix_document = True bibtex_bibfiles = ["bibliography.bib"] bibtex_default_style = "unsrt_et_al" +bibtex_reference_style = "author_year" codeautolink_concat_default = True codeautolink_global_preface = """ import numpy diff --git a/src/ampform/dynamics/form_factor.py b/src/ampform/dynamics/form_factor.py index 51b80c3b9..d17af8a8d 100644 --- a/src/ampform/dynamics/form_factor.py +++ b/src/ampform/dynamics/form_factor.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing import Any, ClassVar +from typing import Any import sympy as sp @@ -11,8 +11,7 @@ @unevaluated class BlattWeisskopfSquared(sp.Expr): - # cspell:ignore asner pychyGekoppeltePartialwellenanalyseAnnihilationen - r"""Blatt-Weisskopf function :math:`B_L^2(z)`, up to :math:`L \leq 8`. + r"""Normalized Blatt-Weisskopf function :math:`B_L^2(z)`, with :math:`B_L^2(1)=1`. Args: z: Argument of the Blatt-Weisskopf function :math:`B_L^2(z)`. A usual @@ -22,95 +21,64 @@ class BlattWeisskopfSquared(sp.Expr): angular_momentum: Angular momentum :math:`L` of the decaying particle. Note that equal powers of :math:`z` appear in the nominator and the denominator, - while some sources have nominator :math:`1`, instead of :math:`z^L`. Compare for - instance Equation (50.27) in :pdg-review:`2021; Resonances; p.9`. + while some sources define an *non-normalized* form factor :math:`F_L` with :math:`1` + in the nominator, instead of :math:`z^L`. See for instance Equation (50.27) in + :pdg-review:`2021; Resonances; p.9`. We normalize the form factor such that + :math:`B_L^2(1)=1` and that :math:`B_L^2` is unitless no matter what :math:`z` is. - Each of these cases for :math:`L` has been taken from - :cite:`pychyGekoppeltePartialwellenanalyseAnnihilationen2016`, p.59, - :cite:`chungPartialWaveAnalysis1995`, p.415, and - :cite:`chungFormulasAngularMomentumBarrier2015`. For a good overview of where to use - these Blatt-Weisskopf functions, see :cite:`asnerDalitzPlotAnalysis2006`. + .. seealso:: :ref:`usage/dynamics:Form factor`, :doc:`TR-029`, + and :cite:`chungFormulasAngularMomentumBarrier2015`. - See also :ref:`usage/dynamics:Form factor`. + With this, the implementation becomes """ z: Any angular_momentum: Any _latex_repr_ = R"B_{{{angular_momentum}}}^2\left({z}\right)" - max_angular_momentum: ClassVar[int | None] = None - """Limit the maximum allowed angular momentum :math:`L`. + def evaluate(self) -> sp.Expr: + z, angular_momentum = self.args + return ( + sp.Abs(SphericalHankel1(angular_momentum, 1)) ** 2 + / sp.Abs(SphericalHankel1(angular_momentum, sp.sqrt(z))) ** 2 + / z + ) + + +@unevaluated(implement_doit=False) +class SphericalHankel1(sp.Expr): + r"""Spherical Hankel function of the first kind for real-valued :math:`z`. + + See :cite:`VonHippel:1972fg`, Equation (A12), and :doc:`TR-029` + for more info. `This page + `_ + explains the difference with the *general* Hankel function of the first kind, + :math:`H_\ell^{(1)}`. - This improves performance when :math:`L` is a `~sympy.core.symbol.Symbol` and you - are note interested in higher angular momenta. + This expression class assumes that :math:`z` is real and evaluates to the following + series: """ + l: Any # noqa: E741 + z: Any + _latex_repr_ = R"h_{{{l}}}^{{(1)}}\left({z}\right)" + + def doit(self, deep: bool = True, **kwargs): + expr = self.evaluate() + if deep and isinstance(self.l, sp.Integer): + return expr.doit() + return expr + def evaluate(self) -> sp.Expr: - z: sp.Expr = self.args[0] # type: ignore[assignment] - angular_momentum: sp.Expr = self.args[1] # type: ignore[assignment] - cases: dict[int, sp.Expr] = { - 0: sp.S.One, - 1: 2 * z / (z + 1), - 2: 13 * z**2 / ((z - 3) * (z - 3) + 9 * z), - 3: 277 * z**3 / (z * (z - 15) * (z - 15) + 9 * (2 * z - 5) * (2 * z - 5)), - 4: ( - 12746 - * z**4 - / ( - (z**2 - 45 * z + 105) * (z**2 - 45 * z + 105) - + 25 * z * (2 * z - 21) * (2 * z - 21) - ) - ), - 5: ( - 998881 - * z**5 - / (z**5 + 15 * z**4 + 315 * z**3 + 6300 * z**2 + 99225 * z + 893025) - ), - 6: ( - 118394977 - * z**6 - / ( - z**6 - + 21 * z**5 - + 630 * z**4 - + 18900 * z**3 - + 496125 * z**2 - + 9823275 * z - + 108056025 - ) - ), - 7: ( - 19727003738 - * z**7 - / ( - z**7 - + 28 * z**6 - + 1134 * z**5 - + 47250 * z**4 - + 1819125 * z**3 - + 58939650 * z**2 - + 1404728325 * z - + 18261468225 - ) - ), - 8: ( - 4392846440677 - * z**8 - / ( - z**8 - + 36 * z**7 - + 1890 * z**6 - + 103950 * z**5 - + 5457375 * z**4 - + 255405150 * z**3 - + 9833098275 * z**2 - + 273922023375 * z - + 4108830350625 - ) - ), - } - return sp.Piecewise(*[ - (expression, sp.Eq(angular_momentum, value)) - for value, expression in cases.items() - if self.max_angular_momentum is None or value <= self.max_angular_momentum - ]) + l, z = self.args # noqa: E741 + k = sp.Dummy("k", integer=True, nonnegative=True) + return ( + (-sp.I) ** (1 + l) # type:ignore[operator] + * (sp.exp(z * sp.I) / z) + * sp.Sum( + sp.factorial(l + k) + / (sp.factorial(l - k) * sp.factorial(k)) + * (sp.I / (2 * z)) ** k, # type:ignore[operator] + (k, 0, l), + ) + ) From 3baaaa980783262b4feb625fa94ba6a2c35d47c5 Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Thu, 16 May 2024 15:03:35 +0200 Subject: [PATCH 4/4] FEAT: simplify Hankel polynomial internally --- docs/usage/dynamics.ipynb | 22 +++++++++------ src/ampform/dynamics/form_factor.py | 42 ++++++++++++++++++++--------- tests/dynamics/test_dynamics.py | 20 +------------- 3 files changed, 45 insertions(+), 39 deletions(-) diff --git a/docs/usage/dynamics.ipynb b/docs/usage/dynamics.ipynb index 2f3a957e7..629aaa20d 100644 --- a/docs/usage/dynamics.ipynb +++ b/docs/usage/dynamics.ipynb @@ -148,7 +148,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "AmpForm uses Blatt-Weisskopf functions $B_L$ as _barrier factors_ (also called _form factors_, see {class}`.BlattWeisskopfSquared`):" + "AmpForm uses Blatt-Weisskopf functions $B_L$ as _barrier factors_ (also called _form factors_, see {class}`.BlattWeisskopfSquared` and **[TR-029](https://compwa.github.io/report/029)**):" ] }, { @@ -161,8 +161,8 @@ "source": [ "from ampform.dynamics import BlattWeisskopfSquared\n", "\n", - "L = sp.Symbol(\"L\", integer=True)\n", - "z = sp.Symbol(\"z\", real=True)\n", + "L = sp.Symbol(\"L\", integer=True, nonnegative=True)\n", + "z = sp.Symbol(\"z\", nonnegative=True, real=True)\n", "ff2 = BlattWeisskopfSquared(z, L)" ] }, @@ -183,9 +183,15 @@ }, "outputs": [], "source": [ + "from ampform.dynamics.form_factor import SphericalHankel1\n", "from ampform.io import aslatex\n", "\n", - "Math(aslatex({ff2: ff2.doit()}))" + "ell = sp.Symbol(R\"\\ell\", integer=True, nonnegative=True)\n", + "exprs = [\n", + " BlattWeisskopfSquared(z, L),\n", + " SphericalHankel1(ell, z),\n", + "]\n", + "Math(aslatex({e: e.doit(deep=False) for e in exprs}))" ] }, { @@ -205,7 +211,7 @@ "source": [ "from ampform.dynamics import BreakupMomentumSquared\n", "\n", - "m, m_a, m_b, d = sp.symbols(\"m, m_a, m_b, d\")\n", + "m, m_a, m_b, d = sp.symbols(\"m, m_a, m_b, d\", nonnegative=True)\n", "s = m**2\n", "q_squared = BreakupMomentumSquared(s, m_a, m_b)\n", "ff2 = BlattWeisskopfSquared(q_squared * d**2, angular_momentum=L)" @@ -243,7 +249,7 @@ "source": [ "plot_domain = np.linspace(0.01, 4, 500)\n", "sliders.set_ranges(\n", - " L=(0, 8),\n", + " L=(0, 10),\n", " m_a=(0, 2, 200),\n", " m_b=(0, 2, 200),\n", " d=(0, 5),\n", @@ -359,7 +365,7 @@ "source": [ "from ampform.dynamics import relativistic_breit_wigner\n", "\n", - "m, m0, w0 = sp.symbols(\"m, m0, Gamma0\")\n", + "m, m0, w0 = sp.symbols(\"m, m0, Gamma0\", nonnegative=True)\n", "rel_bw = relativistic_breit_wigner(s=m**2, mass0=m0, gamma0=w0)\n", "rel_bw" ] @@ -537,7 +543,7 @@ "sliders.set_ranges(\n", " m0=(0, 4, 200),\n", " Gamma0=(0, 1, 100),\n", - " L=(0, 8),\n", + " L=(0, 10),\n", " m_a=(0, 2, 200),\n", " m_b=(0, 2, 200),\n", " d=(0, 5),\n", diff --git a/src/ampform/dynamics/form_factor.py b/src/ampform/dynamics/form_factor.py index d17af8a8d..e54b0b6ce 100644 --- a/src/ampform/dynamics/form_factor.py +++ b/src/ampform/dynamics/form_factor.py @@ -2,6 +2,7 @@ from __future__ import annotations +from functools import lru_cache from typing import Any import sympy as sp @@ -37,15 +38,19 @@ class BlattWeisskopfSquared(sp.Expr): _latex_repr_ = R"B_{{{angular_momentum}}}^2\left({z}\right)" def evaluate(self) -> sp.Expr: - z, angular_momentum = self.args - return ( - sp.Abs(SphericalHankel1(angular_momentum, 1)) ** 2 - / sp.Abs(SphericalHankel1(angular_momentum, sp.sqrt(z))) ** 2 + ell = self.angular_momentum + z = sp.Dummy("z", nonnegative=True, real=True) + expr = ( + sp.Abs(SphericalHankel1(ell, 1)) ** 2 + / sp.Abs(SphericalHankel1(ell, sp.sqrt(z))) ** 2 / z ) + if not ell.free_symbols: + expr = expr.doit().simplify() + return expr.xreplace({z: self.z}) -@unevaluated(implement_doit=False) +@unevaluated class SphericalHankel1(sp.Expr): r"""Spherical Hankel function of the first kind for real-valued :math:`z`. @@ -63,22 +68,35 @@ class SphericalHankel1(sp.Expr): z: Any _latex_repr_ = R"h_{{{l}}}^{{(1)}}\left({z}\right)" - def doit(self, deep: bool = True, **kwargs): - expr = self.evaluate() - if deep and isinstance(self.l, sp.Integer): - return expr.doit() - return expr - def evaluate(self) -> sp.Expr: l, z = self.args # noqa: E741 k = sp.Dummy("k", integer=True, nonnegative=True) return ( (-sp.I) ** (1 + l) # type:ignore[operator] * (sp.exp(z * sp.I) / z) - * sp.Sum( + * _SymbolicSum( sp.factorial(l + k) / (sp.factorial(l - k) * sp.factorial(k)) * (sp.I / (2 * z)) ** k, # type:ignore[operator] (k, 0, l), ) ) + + +class _SymbolicSum(sp.Sum): + """See [TR-029](https://compwa.github.io/report/029.html) for why this class is needed.""" + + def doit(self, deep: bool = True, **kwargs) -> sp.Expr: + if _get_indices(self): + expression = self.args[0] + indices = self.args[1:] + return _SymbolicSum(expression.doit(deep=deep, **kwargs), *indices) + return super().doit(deep=deep, **kwargs) + + +@lru_cache(maxsize=None) +def _get_indices(expr: sp.Sum) -> set[sp.Basic]: + free_symbols = set() + for index in expr.args[1:]: + free_symbols.update(index.free_symbols) + return {s for s in free_symbols if not isinstance(s, sp.Dummy)} diff --git a/tests/dynamics/test_dynamics.py b/tests/dynamics/test_dynamics.py index 3ad8f561e..3473c6f33 100644 --- a/tests/dynamics/test_dynamics.py +++ b/tests/dynamics/test_dynamics.py @@ -21,7 +21,7 @@ class TestBlattWeisskopfSquared: - def test_max_angular_momentum(self): + def test_factorials(self): z = sp.Symbol("z") angular_momentum = sp.Symbol("L", integer=True) form_factor = BlattWeisskopfSquared(z, angular_momentum) @@ -29,24 +29,6 @@ def test_max_angular_momentum(self): factor, z_power, _ = form_factor_9.args assert factor == 4392846440677 assert z_power == z**8 - assert BlattWeisskopfSquared.max_angular_momentum is None - BlattWeisskopfSquared.max_angular_momentum = 1 - assert form_factor.evaluate() == sp.Piecewise( - (1, sp.Eq(angular_momentum, 0)), - (2 * z / (z + 1), sp.Eq(angular_momentum, 1)), - ) - BlattWeisskopfSquared.max_angular_momentum = None - - def test_unevaluated_expression(self): - z = sp.Symbol("z") - ff1 = BlattWeisskopfSquared(z, angular_momentum=1) - ff2 = BlattWeisskopfSquared(z, angular_momentum=2) - assert ff1.max_angular_momentum is None - assert ff2.max_angular_momentum is None - BlattWeisskopfSquared.max_angular_momentum = 3 - assert ff1.max_angular_momentum is 3 # noqa: F632 - assert ff2.max_angular_momentum is 3 # noqa: F632 - BlattWeisskopfSquared.max_angular_momentum = None class TestEnergyDependentWidth: