Skip to content

Commit

Permalink
docs: illustrate usage of Wigner-D combinations
Browse files Browse the repository at this point in the history
  • Loading branch information
redeboer committed Jan 24, 2022
1 parent 902133f commit 7a1afa1
Show file tree
Hide file tree
Showing 2 changed files with 319 additions and 1 deletion.
3 changes: 3 additions & 0 deletions .cspell.json
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@
"compwa",
"conds",
"coolwarm",
"darkgreen",
"displaystyle",
"dlink",
"doctest",
Expand All @@ -164,6 +165,7 @@
"figsize",
"filterwarnings",
"flatte",
"fontcolor",
"fromdict",
"gellmann",
"genindex",
Expand Down Expand Up @@ -219,6 +221,7 @@
"numpycode",
"pandoc",
"pcolormesh",
"penwidth",
"permalinks",
"phsp",
"pids",
Expand Down
317 changes: 316 additions & 1 deletion docs/usage/helicity/spin-alignment.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -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()))"
]
}
],
Expand Down

0 comments on commit 7a1afa1

Please sign in to comment.