|
99 | 99 | "from IPython.display import Markdown, Math\n", |
100 | 100 | "from matplotlib_inline.backend_inline import set_matplotlib_formats\n", |
101 | 101 | "\n", |
102 | | - "from ampform.dynamics.phasespace import BreakupMomentum\n", |
| 102 | + "from ampform.dynamics.phasespace import ChewMandelstamIntegral\n", |
103 | 103 | "from ampform.io import aslatex\n", |
| 104 | + "from ampform.kinematics.phasespace import BreakupMomentum\n", |
104 | 105 | "\n", |
105 | 106 | "\n", |
106 | 107 | "def display_doit(exprs: list[sp.Expr], deep: bool = False) -> Math:\n", |
|
365 | 366 | "S = X + 1j * Y\n", |
366 | 367 | "ϵi = 1e-7j\n", |
367 | 368 | "\n", |
368 | | - "parameters = {m1: 0.2, m2: 0.6}\n", |
369 | | - "thr_neg = (parameters[m1] - parameters[m2]) ** 2\n", |
370 | | - "thr_pos = (parameters[m1] + parameters[m2]) ** 2\n", |
| 369 | + "m1_val = 0.2\n", |
| 370 | + "m2_val = 0.6\n", |
| 371 | + "parameters = {m1: m1_val, m2: m2_val}\n", |
| 372 | + "thr_neg = (m1_val - m2_val) ** 2\n", |
| 373 | + "thr_pos = (m1_val + m2_val) ** 2\n", |
371 | 374 | "\n", |
372 | 375 | "fig, axes = plt.subplots(\n", |
373 | 376 | " dpi=200,\n", |
|
546 | 549 | "})" |
547 | 550 | ] |
548 | 551 | }, |
| 552 | + { |
| 553 | + "cell_type": "markdown", |
| 554 | + "metadata": {}, |
| 555 | + "source": [ |
| 556 | + "## Dispersion integral" |
| 557 | + ] |
| 558 | + }, |
| 559 | + { |
| 560 | + "cell_type": "markdown", |
| 561 | + "metadata": {}, |
| 562 | + "source": [ |
| 563 | + "To get an analytic phasespace factor for higher angular momenta, the one has to compute the dispersion integral. According to [PDG 2025, §50. Resonances, Eq. (50.45)](https://pdg.lbl.gov/2025/reviews/rpp2025-rev-resonances.pdf#page=16) the once-substracted dispersion integral is given by:\n", |
| 564 | + "\n", |
| 565 | + "$$\n", |
| 566 | + "\\Sigma_a(s+0 i)=\\frac{s-s_{\\mathrm{thr}_a}}{\\pi} \\int_{s_{\\mathrm{thr}_a}}^{\\infty} \\frac{\\rho_a\\left(s^{\\prime}\\right) n_a^2\\left(s^{\\prime}\\right)}{\\left(s^{\\prime}-s_{\\mathrm{thr}_a}\\right)\\left(s^{\\prime}-s-i 0\\right)} \\mathrm{d} s^{\\prime}\n", |
| 567 | + "$$" |
| 568 | + ] |
| 569 | + }, |
| 570 | + { |
| 571 | + "cell_type": "code", |
| 572 | + "execution_count": null, |
| 573 | + "metadata": {}, |
| 574 | + "outputs": [], |
| 575 | + "source": [ |
| 576 | + "L = sp.Symbol(\"L\", integer=True, nonnegative=True)\n", |
| 577 | + "integral_expr = ChewMandelstamIntegral(s, m1, m2, L)\n", |
| 578 | + "integral_expr.doit(deep=False)" |
| 579 | + ] |
| 580 | + }, |
| 581 | + { |
| 582 | + "cell_type": "code", |
| 583 | + "execution_count": null, |
| 584 | + "metadata": {}, |
| 585 | + "outputs": [], |
| 586 | + "source": [ |
| 587 | + "integral_s_wave_func = sp.lambdify(\n", |
| 588 | + " [s, m1, m2, integral_expr.epsilon],\n", |
| 589 | + " integral_expr.subs(L, 0).doit(),\n", |
| 590 | + ")\n", |
| 591 | + "integral_s_wave_func = np.vectorize(integral_s_wave_func)" |
| 592 | + ] |
| 593 | + }, |
| 594 | + { |
| 595 | + "cell_type": "code", |
| 596 | + "execution_count": null, |
| 597 | + "metadata": { |
| 598 | + "jupyter": { |
| 599 | + "source_hidden": true |
| 600 | + }, |
| 601 | + "mystnb": { |
| 602 | + "code_prompt_show": "Same definition for P-wave function" |
| 603 | + }, |
| 604 | + "tags": [ |
| 605 | + "hide-input" |
| 606 | + ] |
| 607 | + }, |
| 608 | + "outputs": [], |
| 609 | + "source": [ |
| 610 | + "integral_p_wave_func = sp.lambdify(\n", |
| 611 | + " [s, m1, m2, integral_expr.epsilon],\n", |
| 612 | + " integral_expr.subs(L, 1).doit(),\n", |
| 613 | + ")\n", |
| 614 | + "integral_p_wave_func = np.vectorize(integral_p_wave_func)" |
| 615 | + ] |
| 616 | + }, |
| 617 | + { |
| 618 | + "cell_type": "code", |
| 619 | + "execution_count": null, |
| 620 | + "metadata": { |
| 621 | + "jupyter": { |
| 622 | + "source_hidden": true |
| 623 | + }, |
| 624 | + "tags": [ |
| 625 | + "hide-input" |
| 626 | + ] |
| 627 | + }, |
| 628 | + "outputs": [], |
| 629 | + "source": [ |
| 630 | + "s_values = np.linspace(-0.15, 1.4, num=200)\n", |
| 631 | + "s_wave_values = integral_s_wave_func(s_values, m1_val, m2_val, epsilon=1e-5)\n", |
| 632 | + "p_wave_values = integral_p_wave_func(s_values, m1_val, m2_val, epsilon=1e-5)\n", |
| 633 | + "\n", |
| 634 | + "l_val = [0, 1]\n", |
| 635 | + "fig, axes = plt.subplots(figsize=(6, 7), nrows=2, sharex=True)\n", |
| 636 | + "fig.patch.set_facecolor(\"none\")\n", |
| 637 | + "ax1, ax2 = axes\n", |
| 638 | + "fig.suptitle(f\"Symbolic dispersion integrals for $m_1={m1_val:.2f}, m_2={m2_val:.2f}$\")\n", |
| 639 | + "for ax in axes:\n", |
| 640 | + " ax.axhline(0, linewidth=0.5, c=\"black\")\n", |
| 641 | + " ax.axvline(thr_pos, linestyle=\"--\", color=\"red\", alpha=0.7)\n", |
| 642 | + " ax.patch.set_facecolor(\"none\")\n", |
| 643 | + " ax.set_title(f\"$L = {l_val}$\")\n", |
| 644 | + " ax.set_ylabel(R\"$16\\pi \\; \\Sigma(s)$\")\n", |
| 645 | + "axes[-1].set_xlabel(\"$s$ (GeV$^2$)\")\n", |
| 646 | + "\n", |
| 647 | + "ax1.set_title(\"$S$-wave ($L=0$)\")\n", |
| 648 | + "ax1.plot(s_values, 16 * np.pi * s_wave_values.real, label=\"real\")\n", |
| 649 | + "ax1.plot(s_values, 16 * np.pi * s_wave_values.imag, label=\"imaginary\")\n", |
| 650 | + "\n", |
| 651 | + "ax2.set_title(\"$P$-wave ($L=1$)\")\n", |
| 652 | + "ax2.plot(s_values, 16 * np.pi * p_wave_values.real, label=\"real\")\n", |
| 653 | + "ax2.plot(s_values, 16 * np.pi * p_wave_values.imag, label=\"imaginary\")\n", |
| 654 | + "\n", |
| 655 | + "ax1.legend(framealpha=0)\n", |
| 656 | + "fig.tight_layout()\n", |
| 657 | + "plt.show()" |
| 658 | + ] |
| 659 | + }, |
549 | 660 | { |
550 | 661 | "cell_type": "markdown", |
551 | 662 | "metadata": {}, |
|
813 | 924 | "name": "python", |
814 | 925 | "nbconvert_exporter": "python", |
815 | 926 | "pygments_lexer": "ipython3", |
816 | | - "version": "3.13.9" |
| 927 | + "version": "3.13.11" |
817 | 928 | } |
818 | 929 | }, |
819 | 930 | "nbformat": 4, |
|
0 commit comments