diff --git a/neutrino_oscillations_corrections.ipynb b/neutrino_oscillations_corrections.ipynb index 22b4fb8..94ccfda 100644 --- a/neutrino_oscillations_corrections.ipynb +++ b/neutrino_oscillations_corrections.ipynb @@ -1,535 +1,533 @@ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Problem Set 6: solution" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Neutrino oscillations\n", "\n", "The flavour mixing matrix for the three neutrino families is\n", "\n", "\n", "$$\n", "\\begin{pmatrix}\n", " \\nu_{e} \\\\\n", " \\nu_{\\mu} \\\\\n", " \\nu_{\\tau}\n", "\\end{pmatrix}\n", "=\n", "\\begin{pmatrix}\n", " U_{e1} & U_{e2} & U_{e3} \\\\\n", " U_{\\mu1} & U_{\\mu2} & U_{\\mu3} \\\\\n", " U_{\\tau1} & U_{\\tau2} & U_{\\tau3}\n", "\\end{pmatrix}\n", "\\cdot\n", "\\begin{pmatrix}\n", " \\nu_{1} \\\\\n", " \\nu_{2} \\\\\n", " \\nu_{3}\n", "\\end{pmatrix}\n", "$$\n", "\n", "where $U$ is the PMNS matrix, which can be parametrised with 3 mixing angles $\\theta_{12}$, $\\theta_{13}$, $\\theta_{23}$ and a complex CP phase $\\delta$. Assuming $\\delta =0$, we can write\n", "\n", "$$\n", "U=\n", "\\begin{pmatrix}\n", " c_{12}c_{13} & s_{12}c_{13} & s_{13} \\\\\n", " -c_{12}s_{13}s_{23} - s_{12}c_{23} & -s_{12}s_{13}s_{23} + c_{12}c_{23} & c_{13}s_{23} \\\\\n", " -c_{12}s_{13}c_{23} + s_{12}s_{23} & -s_{12}s_{13}c_{23} - c_{12}s_{23} & c_{13}c_{23}\n", "\\end{pmatrix}\n", ".\n", "$$\n", "\n", "The probability of transition of a neutrino of flavour $\\alpha$ to $ \\beta$ is given by:\n", "\n", "\n", "$$\n", "\\mathcal{P}_{\\nu_{\\alpha} \\rightarrow \\nu_{\\beta}} (L, E) = \\delta_{\\alpha \\beta} - 4\\sum_{i=1}^{3}\\sum_{j=i+1}^{3} U_{\\alpha i} U_{\\beta i} U_{\\alpha j} U_{\\beta j} \\sin^2 \\bigg( \\frac{\\Delta m^2_{ij} L}{4E} \\bigg) \n", "$$\n", "\n", "********************************************************************************************************************\n", "#### Question 1: \n", "Derive the expression of the survival probability of an electronic neutrino, $\\mathcal{P}_{\\nu_e \\to \\nu_e}(L,E)$. Use $\\Delta m^2_{13} \\approx \\Delta m^2_{23}$ and compare with the result obtained in the problem set 4. \n", "\n", "#### Solution of question 1:\n", "$$\n", - "\\mathcal{P}_{\\nu_{e} \\rightarrow \\nu_{e}} (L, E) = 1 - \\cos^4(\\theta_{13}) \\sin^2(2 \\theta_{12}) \\sin^2 \\bigg( \\frac{\\Delta m^2_{12} L}{4E} \\bigg) - \\sin^2(2 \\theta_{13}) \\sin^2 \\bigg( \\frac{\\Delta m^2_{23} L}{4E} \\bigg)\n", + "\\mathcal{P}_{\\nu_{e} \\rightarrow \\nu_{e}} (L, E) \\approx 1 - \\cos^4(\\theta_{13}) \\sin^2(2 \\theta_{12}) \\sin^2 \\bigg( \\frac{\\Delta m^2_{12} L}{4E} \\bigg) - \\sin^2(2 \\theta_{13}) \\sin^2 \\bigg( \\frac{\\Delta m^2_{23} L}{4E} \\bigg)\n", "$$\n", "If $\\theta_{13} = 0$ we end up with the same expression as we got in problem set 4. We will now graphically compare the two expressions and see the effect of $\\theta_{13}$ on the oscillations in this notebook. \n", "********************************************************************************************************************\n", "\n", "The flavour mixing matrix is constructed using Numpy arrays through the PMNS function (see [utilities.py](https://github.com/marinang/Selected-topics-in-nuclear-and-particle-physics/blob/master/utilities.py) for details) which takes as input $\\theta_{12}$, $\\theta_{13}$ and $\\theta_{23}$. Currently we use $\\sin^2\\theta_{12} =$ 1/3, $\\theta_{13}$ = 0 and $\\sin^2\\theta_{23} =$ 1/2." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 0.81649658, 0.57735027, 0. ],\n", " [-0.40824829, 0.57735027, 0.70710678],\n", " [ 0.40824829, -0.57735027, 0.70710678]])" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "from utilities import PMNS\n", "\n", "\n", "t12 = np.arcsin((1/3)**0.5)\n", "t13 = np.arcsin(0.)\n", "t23 = np.arcsin(0.5**0.5)\n", "\n", "U = PMNS(t12, t13, t23)\n", "U" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "you can check that the matrix is unitary" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 1.00000000e+00, -2.01213401e-17, -4.39774161e-17],\n", " [-2.01213401e-17, 1.00000000e+00, -1.01465364e-17],\n", " [-4.39774161e-17, -1.01465364e-17, 1.00000000e+00]])" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "U.dot(np.conj(U.T))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The probability of the transition $\\nu_{a} \\rightarrow \\nu_{b}$ is computed with the function *posc* which takes as inputs the flavour of **a** and **b** (electron = 0, muon = 1, tau = 2) the mass differences between the mass eigenstates and values for L/E." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "from hepunits.constants import c_light, h_Planck, hbar\n", "from hepunits.units import GeV, km, eV, MeV\n", "\n", "\n", "# mass differences between mass eigenstates\n", "d21 = 7.37E-05 # in eV^2\n", "d32 = 2.54E-03\n", "d31 = d32 + d21\n", "\n", "dm2 = [d21, d31, d32]\n", "\n", "def prob_survival_exo4(d21, t12, LEratio):\n", " \"\"\"\n", " Gives the survival probability for nu(e) -> nu(e) in the two flavour mixing case\n", " L in km and E in GeV, and dm2 in eV^2\n", " \"\"\"\n", " \n", " return 1 - np.sin(2*t12)**2 * np.sin(1.27*d21 * LEratio)**2\n", "\n", "def posc(a, b, U, dm2, LEratio):\n", " \"\"\"\n", " Gives the oscillation probability for nu(a) -> nu(b)\n", " for PMNS matrix U, and L in km and E in GeV, and dm2 in eV^2\n", " \"\"\"\n", " \n", " LE = (LEratio * km) / (4 * hbar * c_light * GeV)\n", " \n", " s = 0\n", " for i in range(2):\n", " for j in range(i+1, 3): \n", " _dm2_ = dm2[i+j-1] * eV**2\n", " arg = _dm2_ * LE\n", " mxe = U[a,i]*U[b,i]*U[a,j]*U[b,j]\n", " s += -4*mxe*np.sin(arg)**2\n", " if a == b: s += 1.0\n", " return s" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "import matplotlib as mpl\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "mpl.rcParams[\"figure.figsize\"] = (10, 6)\n", "mpl.rcParams[\"legend.fontsize\"] = 14" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Plot of the survival probability of $\\nu_{e}$ produced of 3 MeV neutrinos in function of the distance (you can change and plot in function of the neutrino energy E, or L/E):" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "from utilities import plot_compare, interactive_plot" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "L = np.linspace(0.1, 150, 10000) #in Km\n", "E = 3 * (MeV / GeV) #in MeV" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "d743759c265b4da493c9a89a55411624", "version_major": 2, "version_minor": 0 }, "text/plain": [ "interactive(children=(FloatSlider(value=0.0, description='t13', max=0.2, step=0.001), Checkbox(value=False, de…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "interactive_plot(plot_compare(prob_survival_exo4, posc, xlabel=\"L [km]\", x=L), L, E)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What do you observe if you change the value of $\\theta_{13}$ (Don't hesitate also to play with the other parameters)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also plot the probability of oscillations of the electrons into other flavours in function of L/E: " ] }, { "cell_type": "code", "execution_count": 9, - "metadata": { - "scrolled": false - }, + "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "f8e750e5790a47f6b10ff95b2b2f0983", "version_major": 2, "version_minor": 0 }, "text/plain": [ "interactive(children=(FloatSlider(value=0.0, description='t13', max=0.2, step=0.001), Checkbox(value=False, de…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from utilities import plot_posc\n", "bounds = (0, 36000)\n", "LE = np.linspace(*bounds, 3600)\n", "interactive_plot(plot_posc(posc, bounds, \"L/E [km/GeV]\"), LE);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "********************************************************************************************************************\n", "#### Question 2:\n", "What can you say about $\\mathcal{P}_{\\nu_{e} \\rightarrow \\nu_{\\mu}}$ and $\\mathcal{P}_{\\nu_{e} \\rightarrow \\nu_{\\tau}}$ when $\\theta_{13}$ = 0 and $\\theta_{13}$ > 0 ?\n", "\n", "#### Solution of question 2:\n", "For $\\theta_{13}=0$, we obtain:\n", "\n", "$\n", "P_{\\nu_{e} \\to \\nu_{\\mu}} (L,E) = 4 c_{12}^2 s_{12}^2 c_{23}^2 \\sin^2 \\bigg( \\frac{\\Delta m_{12}^2 L}{4E} \\bigg)\n", "$\n", "\n", "$\n", "P_{\\nu_{e} \\to \\nu_{\\tau}} (L,E) = 4 c_{12}^2 s_{12}^2 s_{23}^2 \\sin^2 \\bigg( \\frac{\\Delta m_{12}^2 L}{4E} \\bigg)\n", "$\n", "\n", "With our choice of parameters ($\\theta_{23}=\\pi/4 \\to s_{23}=c_{23}=\\sqrt{2}/2$), this means that when $\\theta_{13}=0$, $P_{\\nu_{e} \\to \\nu_{\\mu}} = P_{\\nu_{e} \\to \\nu_{\\tau}}$ and when $\\theta_{13} > 0$, this is no longer the case.\n", "\n", "If we chose a different value for $\\theta_{23}$, then the two oscillation probabilities will be different, even when $\\theta_{13}=0$.\n", "********************************************************************************************************************" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "c57b06156d674073a18fbcc27b095c19", "version_major": 2, "version_minor": 0 }, "text/plain": [ "interactive(children=(FloatSlider(value=0.0, description='t13', max=0.2, step=0.001), Checkbox(value=True, des…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "bounds = (1000, 100000)\n", "LE = np.linspace(*bounds, 10000)\n", "interactive_plot(plot_posc(posc, bounds, \"L/E [km/GeV]\"), LE, log=True);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Effect of the resolution on L and E:\n", "\n", "in a real experiment E and L have a spread that can affect the detection of the oscillations. To take into account the resolutions on L/E the oscillation probability is convoluted with a Gaussian distribution of mean L/E and a width which is the resolution.\n", "By default we use a resolution L/E of 20%." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "def resolution(LE):\n", " #return 10e15\n", " return 0.2 * LE" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "def posc_conv(a, b, U, dm2, LEratio, resolution):\n", " \"\"\"\n", " Gives the oscillation probability for nu(a) -> nu(b)\n", " for PMNS matrix U, and L in km and E in GeV, and dm2 in eV^2\n", " \"\"\"\n", " \n", " LE = (LEratio * km) / (4 * hbar * c_light * GeV)\n", " sigma_LE = resolution(LE)\n", " \n", " s = 0\n", " for i in range(2):\n", " for j in range(i+1, 3):\n", " _dm2_ = dm2[i+j-1] * eV**2\n", " arg = _dm2_ * LE\n", " mxe = U[a,i]*U[b,i]*U[a,j]*U[b,j]\n", " s += -2 * mxe * ( 1 - np.cos(2 * arg) * np.exp(-2*_dm2_**2*sigma_LE**2) )\n", " if a == b: s += 1.0\n", " return s" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A new *posc_conv* function has been created which is the same as *posc* but takes an additionnal resolution function. We now plot on the same graph the $\\nu_{e}$ survival probability with and without the resolution (don't hesitate to play with other resolution models)." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "137f3c1824cb4ac28a300cb693b66e2b", "version_major": 2, "version_minor": 0 }, "text/plain": [ "interactive(children=(FloatSlider(value=0.0, description='t13', max=0.2, step=0.001), Checkbox(value=True, des…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from utilities import plot_posc_conv\n", "xbounds = (100, 200000)\n", "LE = np.linspace(*xbounds, 100000)\n", "interactive_plot(plot_posc_conv(posc, posc_conv, xbounds, \"L/E [km/GeV]\", resolution=resolution), LE, log=True);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Measurement of $\\theta_{13}$:\n", "\n", "The electronic neutrino survival probability oscillates on two different length scales. The short wavelenght component, which depends on $\\Delta m^2_{32}$, oscillates with an amplitude of $\\sin^2(2\\theta_{13})$ and the longer wavelenght component depends on $\\Delta m^2_{21}$. \n", "Knowing values of the mass eigenstates differences,\n", "\n", "$$\\Delta m^2_{21} = 7.53\\times 10^{-5} \\text{ eV}^2$$ \n", "$$\\Delta m^2_{32} = 2.51\\times 10^{-3} \\text{ eV}^2$$\n", "\n", "the measurements of the $\\nu_{e}$ survival pobability at distances $\\mathcal{O}(1)$ km are sensitive to $\\theta_{13}$ and measurements at distances of $\\mathcal{O}(100)$ km are sensitive to $\\theta_{12}$ and $\\theta_{13}$, as can be seen in the following plot." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "c946a766c3f04d2c97461e3b1bcc5671", "version_major": 2, "version_minor": 0 }, "text/plain": [ "interactive(children=(FloatSlider(value=0.0, description='t13', max=0.2, step=0.001), Checkbox(value=False, de…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "xbounds = (0, 150)\n", "L = np.linspace(*xbounds, 100000)\n", "E = 3 * (MeV / GeV)\n", "interactive_plot(plot_posc(posc, xbounds, \"L [km]\", x=L), L, E);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Daya Baya experiment was the first to observe a non zero value for $\\theta_{13}$ in 2000. It's a reactor experiment producing $\\bar{\\nu_{e}}$ for $\\beta$-decays of radioisotopes such as $^{235}$U, $^{238}$U, $^{239}$Pu and $^{241}$Pu, which are produced in nuclear fission. The mean energy of the reactor antineutrinos is about 3 MeV. \n", "The experiment consists of six detectors, two at a distance of 470 m from the reactors, one at 576 m (near detectors) and three at 1.65 km (far detector)." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "b6628e45e1ad42a99432764b601d77a3", "version_major": 2, "version_minor": 0 }, "text/plain": [ "interactive(children=(FloatSlider(value=0.16, description='t13', max=0.2, step=0.001), Checkbox(value=False, d…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "E = 3 * (MeV / GeV) # MeV\n", "xbounds = (0, 4)\n", "L = np.linspace(*xbounds, 1000) #Km\n", "interactive_plot(plot_posc_conv(posc, posc_conv, xbounds, \"L [km]\", resolution=lambda x: 0.2 * x, x=L,\n", " ybounds=(0.88, 1.025), t13=0.16, dayabay=True), L, E, log=False);" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.13" + "version": "3.8.10" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 }