From 7a1afa1bf65e31291583ac36108943bf0c9b72fc Mon Sep 17 00:00:00 2001 From: Remco de Boer <29308176+redeboer@users.noreply.github.com> Date: Mon, 24 Jan 2022 15:39:30 +0100 Subject: [PATCH] docs: illustrate usage of Wigner-D combinations --- .cspell.json | 3 + docs/usage/helicity/spin-alignment.ipynb | 317 ++++++++++++++++++++++- 2 files changed, 319 insertions(+), 1 deletion(-) diff --git a/.cspell.json b/.cspell.json index d992902d2..040310cb3 100644 --- a/.cspell.json +++ b/.cspell.json @@ -145,6 +145,7 @@ "compwa", "conds", "coolwarm", + "darkgreen", "displaystyle", "dlink", "doctest", @@ -164,6 +165,7 @@ "figsize", "filterwarnings", "flatte", + "fontcolor", "fromdict", "gellmann", "genindex", @@ -219,6 +221,7 @@ "numpycode", "pandoc", "pcolormesh", + "penwidth", "permalinks", "phsp", "pids", diff --git a/docs/usage/helicity/spin-alignment.ipynb b/docs/usage/helicity/spin-alignment.ipynb index 38f6515e7..edf5477f1 100644 --- a/docs/usage/helicity/spin-alignment.ipynb +++ b/docs/usage/helicity/spin-alignment.ipynb @@ -256,7 +256,322 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "In what follows, we follow {cite}`marangottoHelicityAmplitudesGeneric2020` to align all amplitudes in the different topologies back to the initial state reference frame $A$, so that they can be correctly summed up. Specifically, we want to formulate a new, correctly aligned amplitude $\\mathcal{A}^{A\\to 0,1,\\dots}_{m_A,m_0,m_1,\\dots}$ from the original amplitudes $\\mathcal{A}^{A\\to R,S,i,...\\to 0,1,\\dots}_{\\lambda_A,\\lambda_0,\\lambda_1,\\dots}$ by applying Eq.(45) and Eq.(47) for generic, multi-body decays." + "In what follows, we follow {cite}`marangottoHelicityAmplitudesGeneric2020` to align all amplitudes in the different topologies back to the initial state reference frame $A$, so that they can be correctly summed up. Specifically, we want to formulate a new, correctly aligned amplitude $\\mathcal{A}^{A\\to 0,1,\\dots}_{m_A,m_0,m_1,\\dots}$ from the original amplitudes $\\mathcal{A}^{A\\to R,S,i,...\\to 0,1,\\dots}_{\\lambda_A,\\lambda_0,\\lambda_1,\\dots}$ by applying Eq.(45) and Eq.(47) for generic, multi-body decays.\n", + "\n", + "In the following, we test the implementation with 1-to-3 body decays, just as in {cite}`marangottoHelicityAmplitudesGeneric2020`. We choose final state `0` as **reference state** and use the notation from {func}`.get_boost_chain_suffix` to indicate resonances $R,S,U$:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "jupyter": { + "source_hidden": true + }, + "tags": [ + "hide-input" + ] + }, + "outputs": [], + "source": [ + "dot1 = \"\"\"\n", + "digraph {\n", + " rankdir=LR;\n", + " edge [arrowhead=none];\n", + " node [shape=none, width=0];\n", + " 0 [shape=none, fontcolor=orange];\n", + " 1 [shape=none, fontcolor=darkgreen];\n", + " 2 [shape=none, fontcolor=blue];\n", + " A [shape=none];\n", + " { rank=same A };\n", + " { rank=same 0, 1, 2 };\n", + " N0 [label=\"\"];\n", + " N1 [label=\"\"];\n", + " A -> N0 [penwidth=3];\n", + " N0 -> N1 [label=\"R = 01\", penwidth=3, fontcolor=red];\n", + " N1 -> 0 [penwidth=3];\n", + " N0 -> 2;\n", + " N1 -> 1;\n", + "}\n", + "\"\"\"\n", + "dot2 = \"\"\"\n", + "digraph {\n", + " rankdir=LR;\n", + " edge [arrowhead=none];\n", + " node [shape=none, width=0];\n", + " 0 [shape=none, label=0, fontcolor=orange];\n", + " 1 [shape=none, label=1, fontcolor=darkgreen];\n", + " 2 [shape=none, label=2, fontcolor=blue];\n", + " A [shape=none, label=A];\n", + " { rank=same A };\n", + " { rank=same 0, 1, 2 };\n", + " N0 [label=\"\"];\n", + " N1 [label=\"\"];\n", + " A -> N0 [penwidth=3];\n", + " N0 -> N1 [label=\"S = 02\", penwidth=3, fontcolor=violet];\n", + " N1 -> 0 [penwidth=3];\n", + " N0 -> 1;\n", + " N1 -> 2;\n", + "}\n", + "\"\"\"\n", + "display(*map(graphviz.Source, [dot1, dot2]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Rewriting and recoloring Equations (45) and (46) from {cite}`marangottoHelicityAmplitudesGeneric2020`:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "\\begin{eqnarray}\n", + "\\mathcal{A}^{A \\to {\\color{red}R},2 \\to 0,1,2}_{m_A,m_0,m_1,m_2}\n", + "&=&\n", + " \\sum_{\\lambda_0^{01},\\mu_0^{01},\\nu_0^{01}}\n", + " {\\color{orange}{D^{s_0}_{m_0,\\nu_0^{01}}}}\\!\\left({\\color{orange}{\\alpha_0^{01}, \\beta_0^{01}, \\gamma_0^{01}}}\\right)\n", + " {\\color{orange}{D^{s_0}_{\\nu_0^{01},\\mu_0^{01}}}}\\!\\left({\\color{red}{\\phi_{_{01}}, \\theta_{_{01}}}}, 0\\right)\n", + " {\\color{orange}{D^{s_0}_{\\mu_0^{01},\\lambda_0^{01}}}}\\!\\left({\\color{orange}{\\phi_0^{01}, \\theta_0^{01}}}\\right) \\\\\n", + "&\\times&\n", + " \\sum_{\\lambda_1^{01},\\mu_1^{01},\\nu_1^{01}}\n", + " {\\color{green}{D^{s_1}_{m_1,\\nu_1^{01}}}}\\!\\left({\\color{green}{\\alpha_1^{01}, \\beta_1^{01}, \\gamma_1^{01}}}\\right)\n", + " {\\color{green}{D^{s_1}_{\\nu_1^{01},\\mu_1^{01}}}}\\!\\left({\\color{red}{\\phi_{_{01}}, \\theta_{_{01}}}}, 0\\right)\n", + " {\\color{green}{D^{s_1}_{\\mu_1^{01},\\lambda_1^{01}}}}\\!\\left({\\color{orange}{\\phi_0^{01}, \\theta_0^{01}}}\\right) \\\\\n", + "&\\times&\n", + " \\sum_{\\lambda_2^{01}}\n", + " {\\color{blue}{D^{s_2}_{m_2,\\lambda_2^{01}}}}\\!\\left({\\color{red}{\\phi_{_{01}}, \\theta_{_{01}}}}, 0\\right) \\\\\n", + "&\\times&\n", + " \\mathcal{A}^{A \\to {\\color{red}R},2 \\to 0,1,2}_{m_A,\\lambda_0^{01},\\bar\\lambda_1^{01},\\bar\\lambda_2^{01}}\n", + "\\end{eqnarray}\n", + "$$\n", + "\n", + "$$\n", + "\\begin{eqnarray}\n", + "\\mathcal{A}^{A \\to {\\color{violet}S},1 \\to 0,1,2}_{m_A,m_0,m_1,m_2}\n", + "&=&\n", + " \\sum_{\\lambda_0^{02},\\mu_0^{02},\\nu_0^{02}}\n", + " {\\color{orange}{D^{s_0}_{m_0,\\nu_0^{02}}}}\\!\\left({\\color{orange}{\\alpha_0^{02}, \\beta_0^{02}, \\gamma_0^{02}}}\\right)\n", + " {\\color{orange}{D^{s_0}_{\\nu_0^{02}},\\mu_0^{02}}}\\!\\left({\\color{violet}{\\phi_{_{02}}, \\theta_{_{02}}}}, 0\\right)\n", + " {\\color{orange}{D^{s_0}_{\\mu_0^{02}},\\lambda_0^{02}}}\\!\\left({\\color{orange}{\\phi_0^{02}, \\theta_0^{02}}}\\right) \\\\\n", + "&\\times&\n", + " \\sum_{\\lambda_1^{02}}\n", + " {\\color{green}{D^{s_1}_{m_1,\\lambda_1^{02}}}}\\!\\left({\\color{violet}{\\phi_{_{02}}, \\theta_{_{02}}}}, 0\\right) \\\\\n", + "&\\times&\n", + " \\sum_{\\lambda_2^{02},\\mu_2^{02},\\nu_2^{02}}\n", + " {\\color{blue}{D^{s_2}_{m_2,\\nu_2^{02}}}}\\!\\left({\\color{blue}{\\alpha_2^{02}, \\beta_2^{02}, \\gamma_2^{02}}}\\right)\n", + " {\\color{blue}{D^{s_2}_{\\nu_2^{02},\\mu_2^{02}}}}\\!\\left({\\color{violet}{\\phi_{_{02}}, \\theta_{_{02}}}}, 0\\right)\n", + " {\\color{blue}{D^{s_2}_{\\mu_2^{02},\\lambda_2^{02}}}}\\!\\left({\\color{orange}{\\phi_0^{02}, \\theta_0^{02}}}\\right) \\\\\n", + "&\\times&\n", + " \\mathcal{A}^{A \\to {\\color{violet}S},2 \\to 0,1,2}_{m_A,\\lambda_0^{02},\\bar\\lambda_1^{02},\\bar\\lambda_2^{02}}\n", + "\\end{eqnarray}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + ":::{note}\n", + "\n", + "What should the alignment summation in $\\mathcal{A}^{A \\to {\\color{turquoise}U},0 \\to 0,1,2}_{m_A,m_0,m_1,m_2}$ look like?\n", + "\n", + ":::" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "jupyter": { + "source_hidden": true + }, + "tags": [ + "hide-input" + ] + }, + "outputs": [], + "source": [ + "dot3 = \"\"\"\n", + "digraph {\n", + " rankdir=LR;\n", + " edge [arrowhead=none];\n", + " node [shape=none, width=0];\n", + " 0 [shape=none, label=0, fontcolor=orange];\n", + " 1 [shape=none, label=1, fontcolor=darkgreen];\n", + " 2 [shape=none, label=2, fontcolor=blue];\n", + " A [shape=none, label=A];\n", + " { rank=same A };\n", + " { rank=same 0, 1, 2 };\n", + " N0 [label=\"\"];\n", + " N1 [label=\"\"];\n", + " A -> N0 [penwidth=3];\n", + " N0 -> N1 [label=\"U = 12\", fontcolor=turquoise];\n", + " N0 -> 0 [penwidth=3];\n", + " N1 -> 1;\n", + " N1 -> 2;\n", + "}\n", + "\"\"\"\n", + "graphviz.Source(dot3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### $J/\\psi \\to K^0 \\Sigma^+ \\bar{p}$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "jupyter": { + "source_hidden": true + }, + "tags": [ + "hide-cell" + ] + }, + "outputs": [], + "source": [ + "from ampform.helicity import (\n", + " collect_helicity_rotation_chain,\n", + " collect_rotation_chain,\n", + " create_alignment_summation_combinations,\n", + ")\n", + "\n", + "\n", + "def show_all_spin_matrices(transition, collector, reference_state_id) -> None:\n", + " for i in transition.final_states:\n", + " state = transition.states[i]\n", + " particle_name = state.particle.latex\n", + " s = sp.Rational(state.particle.spin)\n", + " m = sp.Rational(state.spin_projection)\n", + " display(\n", + " Math(\n", + " fR\"|s_{i},m_{i}\\rangle=|{s},{m}\\rangle \\quad ({particle_name})\"\n", + " )\n", + " )\n", + " helicity_rotations = collector(transition, i, reference_state_id)\n", + " if len(helicity_rotations) == 0:\n", + " continue\n", + " if len(helicity_rotations) == 1:\n", + " helicity_rotations = helicity_rotations[0]\n", + " display(sp.Array(helicity_rotations))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We pick one transition and want to formulate the Wigner-$D$ functions that appear in Eq.(45). The first attempt is to use {func}`.collect_helicity_rotation_chain` to generate all Wigner-$D$ **helicity rotations** (see {func}`.formulate_helicity_rotation`) for each final state. These helicity rotations \"undo\" all rotations that came from each Lorentz boosts when boosting from initial state $J/\\psi$ to **reference state** `0`:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "jupyter": { + "source_hidden": true + }, + "tags": [ + "hide-input" + ] + }, + "outputs": [], + "source": [ + "transition = full_reaction.transitions[-1]\n", + "show_transition(transition)\n", + "show_all_spin_matrices(\n", + " transition,\n", + " collect_helicity_rotation_chain,\n", + " reference_state_id=0,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The function {func}`.collect_rotation_chain` goes one step further. It adds a **Wigner rotation** (see {func}`.formulate_wigner_rotation`) to the generated list of helicity rotation Wigner-$D$ functions in case there are resonances in between the initial state and rotated final state. If there are no resonances in between, only helicity matrices for the resonances before the reference state are taken." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "jupyter": { + "source_hidden": true + }, + "tags": [ + "hide-input" + ] + }, + "outputs": [], + "source": [ + "show_transition(transition)\n", + "show_all_spin_matrices(\n", + " transition,\n", + " collect_rotation_chain,\n", + " reference_state_id=0,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The combinations above are the Wigner-$D$ functions that appear in the summation of Eq.(45), for different values of the helicities over which we sum. To create all sum combinations, we can use {func}`.create_alignment_summation_combinations`. Multiplying and adding these combinations gives the actual sum of Eq.(45):" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "combinations = create_alignment_summation_combinations(\n", + " transition, reference_state_id=0\n", + ")\n", + "alignment_summation = sp.Add(*[sp.Mul(*combi) for combi in combinations])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "jupyter": { + "source_hidden": true + }, + "tags": [ + "hide-input", + "full-width" + ] + }, + "outputs": [], + "source": [ + "Math(sp.multiline_latex(sp.Symbol(\"\"), alignment_summation))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "jupyter": { + "source_hidden": true + }, + "tags": [ + "hide-input", + "full-width" + ] + }, + "outputs": [], + "source": [ + "Math(sp.multiline_latex(sp.Symbol(\"\"), alignment_summation.doit()))" ] } ],