{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/me-manu/gammaALPs/blob/master/docs/tutorials/mixing_ICM_structured_field.ipynb)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Example to calculate photon-ALP oscillations from NGC 1275 in a cavity field" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This notebook demonstrates how to calculate the photon-ALP transition probability for NGC 1275, the central AGN of the Perseus cluster. The assumed B-field environments are the same as in https://arxiv.org/abs/1908.03084, and include the cluster field and the magnetic field of the Milky Way. Electron density model parameters taken from https://iopscience.iop.org/article/10.1086/374923/fulltext/57155.text.html.\n", "\n", "Note that in order to obtain the field used in 1908.03084, you have to set $\\theta$ to 225° instead of 45° (adding 180°). This effectively inverts the sign of all field components. While this change of $\\theta$ and the sign is irrelevant for the conversion probability, it changes the field along the line of sight and inverts the sign of the RM, as well." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you haven't installed `gammaALPs` already, you can do so using `pip`. Just uncomment the line below:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "#!pip install gammaALPs" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from gammaALPs.core import Source, ALP, ModuleList\n", "from gammaALPs.base import environs, transfer\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import matplotlib.gridspec as gridspec\n", "from ebltable.tau_from_model import OptDepth" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Set the ALP" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Initialize an ALP object, that stores the ALP mass $m$ (in neV) and the coupling $g$ (in $10^{-11}\\mathrm{GeV}^{-1}$)." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "m, g = 2, 100\n", "alp = ALP(m,g)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Set the source" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Set the source properties (redshift and sky coordinates) in the ```Source``` containier" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "ngc1275 = Source(z = 0.017559, ra = '03h19m48.1s', dec = '+41d30m42s')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Init the module list" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Initialize the list of transfer modules that will store the different magnetic field environments. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Energies are supplied in GeV as ```numpy.ndarray```" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "logEMeV = np.linspace(0.46709351, 6.53207135, num=183, endpoint=True)\n", "EGeV = np.power(10, logEMeV - 3.)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now initialize the initial photon polarization. Since we are dealing with a gamma-ray source, no ALPs are initially present in the beam (third diagonal element is zero). The polarization density matrix is normalized such that its trace is equal to one, $\\mathrm{Tr}(\\rho_\\mathrm{in}) = 1$." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "pin = np.diag((1.,1.,0.)) * 0.5" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Add modules:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we add propagation modules for the cluster, the EBL, and the Galactic magnetic field; run the module. Repeat for only the ICM field." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "\u001b[0;36menvirons.py:\u001b[0;35m 578\u001b[0;0m --- \u001b[1;36mINFO\u001b[1;0m: Using inputted chi\n", "\u001b[0;36menvirons.py:\u001b[0;35m1196\u001b[0;0m --- \u001b[1;36mINFO\u001b[1;0m: Using inputted chi\n", "\u001b[0;36m core.py:\u001b[0;35m 658\u001b[0;0m --- \u001b[1;36mINFO\u001b[1;0m: Running Module 0: \n", "\u001b[0;36m core.py:\u001b[0;35m 658\u001b[0;0m --- \u001b[1;36mINFO\u001b[1;0m: Running Module 2: \n", "/Users/mey/Python/gammaALPs/gammaALPs/base/transfer.py:799: UserWarning: Not all values of linear polarization are real values!\n", " warnings.warn(\"Not all values of linear polarization are real values!\")\n", "/Users/mey/Python/gammaALPs/gammaALPs/base/transfer.py:802: UserWarning: Not all values of circular polarization are real values!\n", " warnings.warn(\"Not all values of circular polarization are real values!\")\n", "\u001b[0;36menvirons.py:\u001b[0;35m 578\u001b[0;0m --- \u001b[1;36m\u001b[1;36mINFO\u001b[1;0m\u001b[1;0m: Using inputted chi\n", "\u001b[0;36m core.py:\u001b[0;35m 658\u001b[0;0m --- \u001b[1;36m\u001b[1;36mINFO\u001b[1;0m\u001b[1;0m: Running Module 0: \n" ] } ], "source": [ "alp = ALP(m, g)\n", "ml = ModuleList(alp, ngc1275, pin = pin, EGeV = EGeV)\n", "ml.add_propagation(\"ICMStructured\", \n", " 0, # position of module counted from the source. \n", " B0 = 8.3, # rms of B field\n", " R = 93,\n", " theta = 225,\n", " theta_rad=False,\n", " pa=147,\n", " pa_rad=False,\n", " n0 = 3.9e-2, # normalization of electron density\n", " n2 = 4.05e-3, # second normalization of electron density, see Churazov et al. 2003, Eq. 4\n", " r_abell = 500., # extension of the cluster\n", " r_core = 80., # electron density parameter, see Churazov et al. 2003, Eq. 4\n", " r_core2 = 280., # electron density parameter, see Churazov et al. 2003, Eq. 4\n", " beta = 1.2, # electron density parameter, see Churazov et al. 2003, Eq. 4\n", " beta2= 0.58, # electron density parameter, see Churazov et al. 2003, Eq. 4\n", " eta = 0 # scaling of B-field with electron denstiy\n", " )\n", "ml.add_propagation(\"EBL\",1, eblmodel = 'dominguez') # EBL attenuation comes second, after beam has left cluster\n", "ml.add_propagation(\"GMF\",2, model = 'pshirkov', model_sym = 'BSS') # finally, the beam enters the Milky Way Field\n", "px, py, pa = ml.run()\n", "\n", "\n", "\n", "# again with only structured field\n", "\n", "ml2 = ModuleList(alp, ngc1275, pin = pin, EGeV = EGeV)\n", "ml2.add_propagation(\"ICMStructured\", \n", " 0, # position of module counted from the source. \n", " B0 = 8.3, # rms of B field\n", " R = 93,\n", " theta = 225,\n", " theta_rad=False,\n", " pa=147,\n", " pa_rad=False,\n", " n0 = 3.9e-2, # normalization of electron density\n", " n2 = 4.05e-3, # second normalization of electron density, see Churazov et al. 2003, Eq. 4\n", " r_abell = 500., # extension of the cluster\n", " r_core = 80., # electron density parameter, see Churazov et al. 2003, Eq. 4\n", " r_core2 = 280., # electron density parameter, see Churazov et al. 2003, Eq. 4\n", " beta = 1.2, # electron density parameter, see Churazov et al. 2003, Eq. 4\n", " beta2= 0.58, # electron density parameter, see Churazov et al. 2003, Eq. 4\n", " eta = 0 # scaling of B-field with electron denstiy\n", " )\n", "px2, py2, pa2 = ml2.run()\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Plot the output " ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(EGeV, px[0] + py[0], label='ICM + EBL + GMF')\n", "plt.plot(EGeV, px2[0] + py2[0], label='ICM')\n", "plt.xscale('log')\n", "plt.yscale('linear')\n", "plt.ylim(0.4, 1.05)\n", "plt.xlim(3e-2, 1e2)\n", "plt.xlabel('Energy (GeV)')\n", "plt.ylabel('Photon survival probability')\n", "plt.legend(loc = 0, fontsize = 'medium')\n", "\n", "plt.annotate(r'$m_a = {0:.1f}\\,\\mathrm{{neV}}, g_{{a\\gamma}} = {1:.1f} \\times 10^{{-11}}\\,\\mathrm{{GeV}}^{{-1}}$'.format(ml.alp.m,ml.alp.g),\n", " xy = (0.95,0.1), size = 'x-large', xycoords = 'axes fraction', ha = 'right')\n", "\n", "plt.subplots_adjust(left = 0.2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Plot the B fields\n", "\n", "Plot r vs B field components of structured field." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "name": "stdout", "output_type": "stream", "text": [ "Error in callback (for post_execute):\n" ] }, { "ename": "ValueError", "evalue": "\nr [\\SI{}{\\kilo\\parsec}]\n ^\nParseFatalException: Unknown symbol: \\SI, found '\\' (at char 3), (line:1, col:4)", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/pyplot.py:197\u001b[0m, in \u001b[0;36m_draw_all_if_interactive\u001b[0;34m()\u001b[0m\n\u001b[1;32m 195\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_draw_all_if_interactive\u001b[39m() \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 196\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m matplotlib\u001b[38;5;241m.\u001b[39mis_interactive():\n\u001b[0;32m--> 197\u001b[0m \u001b[43mdraw_all\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/_pylab_helpers.py:132\u001b[0m, in \u001b[0;36mGcf.draw_all\u001b[0;34m(cls, force)\u001b[0m\n\u001b[1;32m 130\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m manager \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mcls\u001b[39m\u001b[38;5;241m.\u001b[39mget_all_fig_managers():\n\u001b[1;32m 131\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m force \u001b[38;5;129;01mor\u001b[39;00m manager\u001b[38;5;241m.\u001b[39mcanvas\u001b[38;5;241m.\u001b[39mfigure\u001b[38;5;241m.\u001b[39mstale:\n\u001b[0;32m--> 132\u001b[0m \u001b[43mmanager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcanvas\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdraw_idle\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/backend_bases.py:1893\u001b[0m, in \u001b[0;36mFigureCanvasBase.draw_idle\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1891\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_is_idle_drawing:\n\u001b[1;32m 1892\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_idle_draw_cntx():\n\u001b[0;32m-> 1893\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/backends/backend_agg.py:388\u001b[0m, in \u001b[0;36mFigureCanvasAgg.draw\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 385\u001b[0m \u001b[38;5;66;03m# Acquire a lock on the shared font cache.\u001b[39;00m\n\u001b[1;32m 386\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtoolbar\u001b[38;5;241m.\u001b[39m_wait_cursor_for_draw_cm() \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtoolbar\n\u001b[1;32m 387\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m nullcontext()):\n\u001b[0;32m--> 388\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfigure\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 389\u001b[0m \u001b[38;5;66;03m# A GUI class may be need to update a window using this draw, so\u001b[39;00m\n\u001b[1;32m 390\u001b[0m \u001b[38;5;66;03m# don't forget to call the superclass.\u001b[39;00m\n\u001b[1;32m 391\u001b[0m \u001b[38;5;28msuper\u001b[39m()\u001b[38;5;241m.\u001b[39mdraw()\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/artist.py:95\u001b[0m, in \u001b[0;36m_finalize_rasterization..draw_wrapper\u001b[0;34m(artist, renderer, *args, **kwargs)\u001b[0m\n\u001b[1;32m 93\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(draw)\n\u001b[1;32m 94\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mdraw_wrapper\u001b[39m(artist, renderer, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[0;32m---> 95\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43martist\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 96\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m renderer\u001b[38;5;241m.\u001b[39m_rasterizing:\n\u001b[1;32m 97\u001b[0m renderer\u001b[38;5;241m.\u001b[39mstop_rasterizing()\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/artist.py:72\u001b[0m, in \u001b[0;36mallow_rasterization..draw_wrapper\u001b[0;34m(artist, renderer)\u001b[0m\n\u001b[1;32m 69\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 70\u001b[0m renderer\u001b[38;5;241m.\u001b[39mstart_filter()\n\u001b[0;32m---> 72\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43martist\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 73\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[1;32m 74\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/figure.py:3154\u001b[0m, in \u001b[0;36mFigure.draw\u001b[0;34m(self, renderer)\u001b[0m\n\u001b[1;32m 3151\u001b[0m \u001b[38;5;66;03m# ValueError can occur when resizing a window.\u001b[39;00m\n\u001b[1;32m 3153\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpatch\u001b[38;5;241m.\u001b[39mdraw(renderer)\n\u001b[0;32m-> 3154\u001b[0m \u001b[43mmimage\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_draw_list_compositing_images\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 3155\u001b[0m \u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43martists\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msuppressComposite\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 3157\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m sfig \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msubfigs:\n\u001b[1;32m 3158\u001b[0m sfig\u001b[38;5;241m.\u001b[39mdraw(renderer)\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/image.py:132\u001b[0m, in \u001b[0;36m_draw_list_compositing_images\u001b[0;34m(renderer, parent, artists, suppress_composite)\u001b[0m\n\u001b[1;32m 130\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m not_composite \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m has_images:\n\u001b[1;32m 131\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m a \u001b[38;5;129;01min\u001b[39;00m artists:\n\u001b[0;32m--> 132\u001b[0m \u001b[43ma\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 133\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 134\u001b[0m \u001b[38;5;66;03m# Composite any adjacent images together\u001b[39;00m\n\u001b[1;32m 135\u001b[0m image_group \u001b[38;5;241m=\u001b[39m []\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/artist.py:72\u001b[0m, in \u001b[0;36mallow_rasterization..draw_wrapper\u001b[0;34m(artist, renderer)\u001b[0m\n\u001b[1;32m 69\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 70\u001b[0m renderer\u001b[38;5;241m.\u001b[39mstart_filter()\n\u001b[0;32m---> 72\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43martist\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 73\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[1;32m 74\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/axes/_base.py:3070\u001b[0m, in \u001b[0;36m_AxesBase.draw\u001b[0;34m(self, renderer)\u001b[0m\n\u001b[1;32m 3067\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artists_rasterized:\n\u001b[1;32m 3068\u001b[0m _draw_rasterized(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfigure, artists_rasterized, renderer)\n\u001b[0;32m-> 3070\u001b[0m \u001b[43mmimage\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_draw_list_compositing_images\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 3071\u001b[0m \u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43martists\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfigure\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msuppressComposite\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 3073\u001b[0m renderer\u001b[38;5;241m.\u001b[39mclose_group(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124maxes\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 3074\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstale \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/image.py:132\u001b[0m, in \u001b[0;36m_draw_list_compositing_images\u001b[0;34m(renderer, parent, artists, suppress_composite)\u001b[0m\n\u001b[1;32m 130\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m not_composite \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m has_images:\n\u001b[1;32m 131\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m a \u001b[38;5;129;01min\u001b[39;00m artists:\n\u001b[0;32m--> 132\u001b[0m \u001b[43ma\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 133\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 134\u001b[0m \u001b[38;5;66;03m# Composite any adjacent images together\u001b[39;00m\n\u001b[1;32m 135\u001b[0m image_group \u001b[38;5;241m=\u001b[39m []\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/artist.py:72\u001b[0m, in \u001b[0;36mallow_rasterization..draw_wrapper\u001b[0;34m(artist, renderer)\u001b[0m\n\u001b[1;32m 69\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 70\u001b[0m renderer\u001b[38;5;241m.\u001b[39mstart_filter()\n\u001b[0;32m---> 72\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43martist\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 73\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[1;32m 74\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/axis.py:1395\u001b[0m, in \u001b[0;36mAxis.draw\u001b[0;34m(self, renderer, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1393\u001b[0m \u001b[38;5;66;03m# Shift label away from axes to avoid overlapping ticklabels.\u001b[39;00m\n\u001b[1;32m 1394\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_update_label_position(renderer)\n\u001b[0;32m-> 1395\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mlabel\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1397\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_update_offset_text_position(tlb1, tlb2)\n\u001b[1;32m 1398\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moffsetText\u001b[38;5;241m.\u001b[39mset_text(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmajor\u001b[38;5;241m.\u001b[39mformatter\u001b[38;5;241m.\u001b[39mget_offset())\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/artist.py:72\u001b[0m, in \u001b[0;36mallow_rasterization..draw_wrapper\u001b[0;34m(artist, renderer)\u001b[0m\n\u001b[1;32m 69\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 70\u001b[0m renderer\u001b[38;5;241m.\u001b[39mstart_filter()\n\u001b[0;32m---> 72\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43martist\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 73\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[1;32m 74\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/text.py:748\u001b[0m, in \u001b[0;36mText.draw\u001b[0;34m(self, renderer)\u001b[0m\n\u001b[1;32m 745\u001b[0m renderer\u001b[38;5;241m.\u001b[39mopen_group(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtext\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mget_gid())\n\u001b[1;32m 747\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_cm_set(text\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_wrapped_text()):\n\u001b[0;32m--> 748\u001b[0m bbox, info, descent \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_get_layout\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 749\u001b[0m trans \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mget_transform()\n\u001b[1;32m 751\u001b[0m \u001b[38;5;66;03m# don't use self.get_position here, which refers to text\u001b[39;00m\n\u001b[1;32m 752\u001b[0m \u001b[38;5;66;03m# position in Text:\u001b[39;00m\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/text.py:381\u001b[0m, in \u001b[0;36mText._get_layout\u001b[0;34m(self, renderer)\u001b[0m\n\u001b[1;32m 379\u001b[0m clean_line, ismath \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_preprocess_math(line)\n\u001b[1;32m 380\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m clean_line:\n\u001b[0;32m--> 381\u001b[0m w, h, d \u001b[38;5;241m=\u001b[39m \u001b[43m_get_text_metrics_with_cache\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 382\u001b[0m \u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mclean_line\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_fontproperties\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 383\u001b[0m \u001b[43m \u001b[49m\u001b[43mismath\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mismath\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdpi\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfigure\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdpi\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 384\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 385\u001b[0m w \u001b[38;5;241m=\u001b[39m h \u001b[38;5;241m=\u001b[39m d \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0\u001b[39m\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/text.py:69\u001b[0m, in \u001b[0;36m_get_text_metrics_with_cache\u001b[0;34m(renderer, text, fontprop, ismath, dpi)\u001b[0m\n\u001b[1;32m 66\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Call ``renderer.get_text_width_height_descent``, caching the results.\"\"\"\u001b[39;00m\n\u001b[1;32m 67\u001b[0m \u001b[38;5;66;03m# Cached based on a copy of fontprop so that later in-place mutations of\u001b[39;00m\n\u001b[1;32m 68\u001b[0m \u001b[38;5;66;03m# the passed-in argument do not mess up the cache.\u001b[39;00m\n\u001b[0;32m---> 69\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_get_text_metrics_with_cache_impl\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 70\u001b[0m \u001b[43m \u001b[49m\u001b[43mweakref\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mref\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtext\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfontprop\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcopy\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mismath\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdpi\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/text.py:77\u001b[0m, in \u001b[0;36m_get_text_metrics_with_cache_impl\u001b[0;34m(renderer_ref, text, fontprop, ismath, dpi)\u001b[0m\n\u001b[1;32m 73\u001b[0m \u001b[38;5;129m@functools\u001b[39m\u001b[38;5;241m.\u001b[39mlru_cache(\u001b[38;5;241m4096\u001b[39m)\n\u001b[1;32m 74\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_get_text_metrics_with_cache_impl\u001b[39m(\n\u001b[1;32m 75\u001b[0m renderer_ref, text, fontprop, ismath, dpi):\n\u001b[1;32m 76\u001b[0m \u001b[38;5;66;03m# dpi is unused, but participates in cache invalidation (via the renderer).\u001b[39;00m\n\u001b[0;32m---> 77\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mrenderer_ref\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_text_width_height_descent\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtext\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfontprop\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mismath\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/backends/backend_agg.py:217\u001b[0m, in \u001b[0;36mRendererAgg.get_text_width_height_descent\u001b[0;34m(self, s, prop, ismath)\u001b[0m\n\u001b[1;32m 213\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28msuper\u001b[39m()\u001b[38;5;241m.\u001b[39mget_text_width_height_descent(s, prop, ismath)\n\u001b[1;32m 215\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ismath:\n\u001b[1;32m 216\u001b[0m ox, oy, width, height, descent, font_image \u001b[38;5;241m=\u001b[39m \\\n\u001b[0;32m--> 217\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmathtext_parser\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mparse\u001b[49m\u001b[43m(\u001b[49m\u001b[43ms\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdpi\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mprop\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 218\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m width, height, descent\n\u001b[1;32m 220\u001b[0m font \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_prepare_font(prop)\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/mathtext.py:79\u001b[0m, in \u001b[0;36mMathTextParser.parse\u001b[0;34m(self, s, dpi, prop, antialiased)\u001b[0m\n\u001b[1;32m 77\u001b[0m prop \u001b[38;5;241m=\u001b[39m prop\u001b[38;5;241m.\u001b[39mcopy() \u001b[38;5;28;01mif\u001b[39;00m prop \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 78\u001b[0m antialiased \u001b[38;5;241m=\u001b[39m mpl\u001b[38;5;241m.\u001b[39m_val_or_rc(antialiased, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtext.antialiased\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m---> 79\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_parse_cached\u001b[49m\u001b[43m(\u001b[49m\u001b[43ms\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdpi\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mprop\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mantialiased\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/mathtext.py:100\u001b[0m, in \u001b[0;36mMathTextParser._parse_cached\u001b[0;34m(self, s, dpi, prop, antialiased)\u001b[0m\n\u001b[1;32m 97\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_parser \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m: \u001b[38;5;66;03m# Cache the parser globally.\u001b[39;00m\n\u001b[1;32m 98\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__class__\u001b[39m\u001b[38;5;241m.\u001b[39m_parser \u001b[38;5;241m=\u001b[39m _mathtext\u001b[38;5;241m.\u001b[39mParser()\n\u001b[0;32m--> 100\u001b[0m box \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_parser\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mparse\u001b[49m\u001b[43m(\u001b[49m\u001b[43ms\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfontset\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfontsize\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdpi\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 101\u001b[0m output \u001b[38;5;241m=\u001b[39m _mathtext\u001b[38;5;241m.\u001b[39mship(box)\n\u001b[1;32m 102\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_output_type \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mvector\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/_mathtext.py:2165\u001b[0m, in \u001b[0;36mParser.parse\u001b[0;34m(self, s, fonts_object, fontsize, dpi)\u001b[0m\n\u001b[1;32m 2162\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_expression\u001b[38;5;241m.\u001b[39mparseString(s)\n\u001b[1;32m 2163\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m ParseBaseException \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[1;32m 2164\u001b[0m \u001b[38;5;66;03m# explain becomes a plain method on pyparsing 3 (err.explain(0)).\u001b[39;00m\n\u001b[0;32m-> 2165\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m+\u001b[39m ParseException\u001b[38;5;241m.\u001b[39mexplain(err, \u001b[38;5;241m0\u001b[39m)) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 2166\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_state_stack \u001b[38;5;241m=\u001b[39m []\n\u001b[1;32m 2167\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_in_subscript_or_superscript \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n", "\u001b[0;31mValueError\u001b[0m: \nr [\\SI{}{\\kilo\\parsec}]\n ^\nParseFatalException: Unknown symbol: \\SI, found '\\' (at char 3), (line:1, col:4)" ] }, { "ename": "ValueError", "evalue": "\nr [\\SI{}{\\kilo\\parsec}]\n ^\nParseFatalException: Unknown symbol: \\SI, found '\\' (at char 3), (line:1, col:4)", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/IPython/core/formatters.py:340\u001b[0m, in \u001b[0;36mBaseFormatter.__call__\u001b[0;34m(self, obj)\u001b[0m\n\u001b[1;32m 338\u001b[0m \u001b[38;5;28;01mpass\u001b[39;00m\n\u001b[1;32m 339\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 340\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mprinter\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobj\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 341\u001b[0m \u001b[38;5;66;03m# Finally look for special method names\u001b[39;00m\n\u001b[1;32m 342\u001b[0m method \u001b[38;5;241m=\u001b[39m get_real_method(obj, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mprint_method)\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/IPython/core/pylabtools.py:152\u001b[0m, in \u001b[0;36mprint_figure\u001b[0;34m(fig, fmt, bbox_inches, base64, **kwargs)\u001b[0m\n\u001b[1;32m 149\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mmatplotlib\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mbackend_bases\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m FigureCanvasBase\n\u001b[1;32m 150\u001b[0m FigureCanvasBase(fig)\n\u001b[0;32m--> 152\u001b[0m \u001b[43mfig\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcanvas\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mprint_figure\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbytes_io\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkw\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 153\u001b[0m data \u001b[38;5;241m=\u001b[39m bytes_io\u001b[38;5;241m.\u001b[39mgetvalue()\n\u001b[1;32m 154\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m fmt \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124msvg\u001b[39m\u001b[38;5;124m'\u001b[39m:\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/backend_bases.py:2158\u001b[0m, in \u001b[0;36mFigureCanvasBase.print_figure\u001b[0;34m(self, filename, dpi, facecolor, edgecolor, orientation, format, bbox_inches, pad_inches, bbox_extra_artists, backend, **kwargs)\u001b[0m\n\u001b[1;32m 2155\u001b[0m \u001b[38;5;66;03m# we do this instead of `self.figure.draw_without_rendering`\u001b[39;00m\n\u001b[1;32m 2156\u001b[0m \u001b[38;5;66;03m# so that we can inject the orientation\u001b[39;00m\n\u001b[1;32m 2157\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mgetattr\u001b[39m(renderer, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m_draw_disabled\u001b[39m\u001b[38;5;124m\"\u001b[39m, nullcontext)():\n\u001b[0;32m-> 2158\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfigure\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2159\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m bbox_inches:\n\u001b[1;32m 2160\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m bbox_inches \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtight\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/artist.py:95\u001b[0m, in \u001b[0;36m_finalize_rasterization..draw_wrapper\u001b[0;34m(artist, renderer, *args, **kwargs)\u001b[0m\n\u001b[1;32m 93\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(draw)\n\u001b[1;32m 94\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mdraw_wrapper\u001b[39m(artist, renderer, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[0;32m---> 95\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43martist\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 96\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m renderer\u001b[38;5;241m.\u001b[39m_rasterizing:\n\u001b[1;32m 97\u001b[0m renderer\u001b[38;5;241m.\u001b[39mstop_rasterizing()\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/artist.py:72\u001b[0m, in \u001b[0;36mallow_rasterization..draw_wrapper\u001b[0;34m(artist, renderer)\u001b[0m\n\u001b[1;32m 69\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 70\u001b[0m renderer\u001b[38;5;241m.\u001b[39mstart_filter()\n\u001b[0;32m---> 72\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43martist\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 73\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[1;32m 74\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/figure.py:3154\u001b[0m, in \u001b[0;36mFigure.draw\u001b[0;34m(self, renderer)\u001b[0m\n\u001b[1;32m 3151\u001b[0m \u001b[38;5;66;03m# ValueError can occur when resizing a window.\u001b[39;00m\n\u001b[1;32m 3153\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpatch\u001b[38;5;241m.\u001b[39mdraw(renderer)\n\u001b[0;32m-> 3154\u001b[0m \u001b[43mmimage\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_draw_list_compositing_images\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 3155\u001b[0m \u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43martists\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msuppressComposite\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 3157\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m sfig \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msubfigs:\n\u001b[1;32m 3158\u001b[0m sfig\u001b[38;5;241m.\u001b[39mdraw(renderer)\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/image.py:132\u001b[0m, in \u001b[0;36m_draw_list_compositing_images\u001b[0;34m(renderer, parent, artists, suppress_composite)\u001b[0m\n\u001b[1;32m 130\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m not_composite \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m has_images:\n\u001b[1;32m 131\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m a \u001b[38;5;129;01min\u001b[39;00m artists:\n\u001b[0;32m--> 132\u001b[0m \u001b[43ma\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 133\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 134\u001b[0m \u001b[38;5;66;03m# Composite any adjacent images together\u001b[39;00m\n\u001b[1;32m 135\u001b[0m image_group \u001b[38;5;241m=\u001b[39m []\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/artist.py:72\u001b[0m, in \u001b[0;36mallow_rasterization..draw_wrapper\u001b[0;34m(artist, renderer)\u001b[0m\n\u001b[1;32m 69\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 70\u001b[0m renderer\u001b[38;5;241m.\u001b[39mstart_filter()\n\u001b[0;32m---> 72\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43martist\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 73\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[1;32m 74\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/axes/_base.py:3070\u001b[0m, in \u001b[0;36m_AxesBase.draw\u001b[0;34m(self, renderer)\u001b[0m\n\u001b[1;32m 3067\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artists_rasterized:\n\u001b[1;32m 3068\u001b[0m _draw_rasterized(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfigure, artists_rasterized, renderer)\n\u001b[0;32m-> 3070\u001b[0m \u001b[43mmimage\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_draw_list_compositing_images\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 3071\u001b[0m \u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43martists\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfigure\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msuppressComposite\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 3073\u001b[0m renderer\u001b[38;5;241m.\u001b[39mclose_group(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124maxes\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 3074\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstale \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/image.py:132\u001b[0m, in \u001b[0;36m_draw_list_compositing_images\u001b[0;34m(renderer, parent, artists, suppress_composite)\u001b[0m\n\u001b[1;32m 130\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m not_composite \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m has_images:\n\u001b[1;32m 131\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m a \u001b[38;5;129;01min\u001b[39;00m artists:\n\u001b[0;32m--> 132\u001b[0m \u001b[43ma\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 133\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 134\u001b[0m \u001b[38;5;66;03m# Composite any adjacent images together\u001b[39;00m\n\u001b[1;32m 135\u001b[0m image_group \u001b[38;5;241m=\u001b[39m []\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/artist.py:72\u001b[0m, in \u001b[0;36mallow_rasterization..draw_wrapper\u001b[0;34m(artist, renderer)\u001b[0m\n\u001b[1;32m 69\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 70\u001b[0m renderer\u001b[38;5;241m.\u001b[39mstart_filter()\n\u001b[0;32m---> 72\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43martist\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 73\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[1;32m 74\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/axis.py:1395\u001b[0m, in \u001b[0;36mAxis.draw\u001b[0;34m(self, renderer, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1393\u001b[0m \u001b[38;5;66;03m# Shift label away from axes to avoid overlapping ticklabels.\u001b[39;00m\n\u001b[1;32m 1394\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_update_label_position(renderer)\n\u001b[0;32m-> 1395\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mlabel\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1397\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_update_offset_text_position(tlb1, tlb2)\n\u001b[1;32m 1398\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moffsetText\u001b[38;5;241m.\u001b[39mset_text(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmajor\u001b[38;5;241m.\u001b[39mformatter\u001b[38;5;241m.\u001b[39mget_offset())\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/artist.py:72\u001b[0m, in \u001b[0;36mallow_rasterization..draw_wrapper\u001b[0;34m(artist, renderer)\u001b[0m\n\u001b[1;32m 69\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 70\u001b[0m renderer\u001b[38;5;241m.\u001b[39mstart_filter()\n\u001b[0;32m---> 72\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43martist\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 73\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[1;32m 74\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/text.py:748\u001b[0m, in \u001b[0;36mText.draw\u001b[0;34m(self, renderer)\u001b[0m\n\u001b[1;32m 745\u001b[0m renderer\u001b[38;5;241m.\u001b[39mopen_group(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtext\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mget_gid())\n\u001b[1;32m 747\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_cm_set(text\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_wrapped_text()):\n\u001b[0;32m--> 748\u001b[0m bbox, info, descent \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_get_layout\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 749\u001b[0m trans \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mget_transform()\n\u001b[1;32m 751\u001b[0m \u001b[38;5;66;03m# don't use self.get_position here, which refers to text\u001b[39;00m\n\u001b[1;32m 752\u001b[0m \u001b[38;5;66;03m# position in Text:\u001b[39;00m\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/text.py:381\u001b[0m, in \u001b[0;36mText._get_layout\u001b[0;34m(self, renderer)\u001b[0m\n\u001b[1;32m 379\u001b[0m clean_line, ismath \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_preprocess_math(line)\n\u001b[1;32m 380\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m clean_line:\n\u001b[0;32m--> 381\u001b[0m w, h, d \u001b[38;5;241m=\u001b[39m \u001b[43m_get_text_metrics_with_cache\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 382\u001b[0m \u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mclean_line\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_fontproperties\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 383\u001b[0m \u001b[43m \u001b[49m\u001b[43mismath\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mismath\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdpi\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfigure\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdpi\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 384\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 385\u001b[0m w \u001b[38;5;241m=\u001b[39m h \u001b[38;5;241m=\u001b[39m d \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0\u001b[39m\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/text.py:69\u001b[0m, in \u001b[0;36m_get_text_metrics_with_cache\u001b[0;34m(renderer, text, fontprop, ismath, dpi)\u001b[0m\n\u001b[1;32m 66\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Call ``renderer.get_text_width_height_descent``, caching the results.\"\"\"\u001b[39;00m\n\u001b[1;32m 67\u001b[0m \u001b[38;5;66;03m# Cached based on a copy of fontprop so that later in-place mutations of\u001b[39;00m\n\u001b[1;32m 68\u001b[0m \u001b[38;5;66;03m# the passed-in argument do not mess up the cache.\u001b[39;00m\n\u001b[0;32m---> 69\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_get_text_metrics_with_cache_impl\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 70\u001b[0m \u001b[43m \u001b[49m\u001b[43mweakref\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mref\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtext\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfontprop\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcopy\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mismath\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdpi\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/text.py:77\u001b[0m, in \u001b[0;36m_get_text_metrics_with_cache_impl\u001b[0;34m(renderer_ref, text, fontprop, ismath, dpi)\u001b[0m\n\u001b[1;32m 73\u001b[0m \u001b[38;5;129m@functools\u001b[39m\u001b[38;5;241m.\u001b[39mlru_cache(\u001b[38;5;241m4096\u001b[39m)\n\u001b[1;32m 74\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_get_text_metrics_with_cache_impl\u001b[39m(\n\u001b[1;32m 75\u001b[0m renderer_ref, text, fontprop, ismath, dpi):\n\u001b[1;32m 76\u001b[0m \u001b[38;5;66;03m# dpi is unused, but participates in cache invalidation (via the renderer).\u001b[39;00m\n\u001b[0;32m---> 77\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mrenderer_ref\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_text_width_height_descent\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtext\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfontprop\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mismath\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/backends/backend_agg.py:217\u001b[0m, in \u001b[0;36mRendererAgg.get_text_width_height_descent\u001b[0;34m(self, s, prop, ismath)\u001b[0m\n\u001b[1;32m 213\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28msuper\u001b[39m()\u001b[38;5;241m.\u001b[39mget_text_width_height_descent(s, prop, ismath)\n\u001b[1;32m 215\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ismath:\n\u001b[1;32m 216\u001b[0m ox, oy, width, height, descent, font_image \u001b[38;5;241m=\u001b[39m \\\n\u001b[0;32m--> 217\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmathtext_parser\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mparse\u001b[49m\u001b[43m(\u001b[49m\u001b[43ms\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdpi\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mprop\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 218\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m width, height, descent\n\u001b[1;32m 220\u001b[0m font \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_prepare_font(prop)\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/mathtext.py:79\u001b[0m, in \u001b[0;36mMathTextParser.parse\u001b[0;34m(self, s, dpi, prop, antialiased)\u001b[0m\n\u001b[1;32m 77\u001b[0m prop \u001b[38;5;241m=\u001b[39m prop\u001b[38;5;241m.\u001b[39mcopy() \u001b[38;5;28;01mif\u001b[39;00m prop \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 78\u001b[0m antialiased \u001b[38;5;241m=\u001b[39m mpl\u001b[38;5;241m.\u001b[39m_val_or_rc(antialiased, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtext.antialiased\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m---> 79\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_parse_cached\u001b[49m\u001b[43m(\u001b[49m\u001b[43ms\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdpi\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mprop\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mantialiased\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/mathtext.py:100\u001b[0m, in \u001b[0;36mMathTextParser._parse_cached\u001b[0;34m(self, s, dpi, prop, antialiased)\u001b[0m\n\u001b[1;32m 97\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_parser \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m: \u001b[38;5;66;03m# Cache the parser globally.\u001b[39;00m\n\u001b[1;32m 98\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__class__\u001b[39m\u001b[38;5;241m.\u001b[39m_parser \u001b[38;5;241m=\u001b[39m _mathtext\u001b[38;5;241m.\u001b[39mParser()\n\u001b[0;32m--> 100\u001b[0m box \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_parser\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mparse\u001b[49m\u001b[43m(\u001b[49m\u001b[43ms\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfontset\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfontsize\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdpi\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 101\u001b[0m output \u001b[38;5;241m=\u001b[39m _mathtext\u001b[38;5;241m.\u001b[39mship(box)\n\u001b[1;32m 102\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_output_type \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mvector\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n", "File \u001b[0;32m~/Python/miniconda3/envs/gammaALPs-0.4/lib/python3.9/site-packages/matplotlib/_mathtext.py:2165\u001b[0m, in \u001b[0;36mParser.parse\u001b[0;34m(self, s, fonts_object, fontsize, dpi)\u001b[0m\n\u001b[1;32m 2162\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_expression\u001b[38;5;241m.\u001b[39mparseString(s)\n\u001b[1;32m 2163\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m ParseBaseException \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[1;32m 2164\u001b[0m \u001b[38;5;66;03m# explain becomes a plain method on pyparsing 3 (err.explain(0)).\u001b[39;00m\n\u001b[0;32m-> 2165\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m+\u001b[39m ParseException\u001b[38;5;241m.\u001b[39mexplain(err, \u001b[38;5;241m0\u001b[39m)) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 2166\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_state_stack \u001b[38;5;241m=\u001b[39m []\n\u001b[1;32m 2167\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_in_subscript_or_superscript \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n", "\u001b[0;31mValueError\u001b[0m: \nr [\\SI{}{\\kilo\\parsec}]\n ^\nParseFatalException: Unknown symbol: \\SI, found '\\' (at char 3), (line:1, col:4)" ] }, { "data": { "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "r = ml.modules[0].r\n", "b_r = ml.modules[0]._Bfield_model.b_r\n", "b_theta = ml.modules[0]._Bfield_model.b_theta\n", "b_phi = ml.modules[0]._Bfield_model.b_phi\n", "plt.plot(r, b_r, label='$B_r$')\n", "plt.plot(r, b_theta, label=r'$B_\\theta$')\n", "plt.plot(r, b_phi, label=r'$B_\\phi$')\n", "plt.xlabel(r'$r [\\SI{}{\\kilo\\parsec}]$')\n", "plt.ylabel(r'$B [\\SI{}{\\micro\\gauss}]$')\n", "plt.legend()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Plot electron density\n", "\n", "We plot the electron density. Further, nel is used for calculating the RM at a later point." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 0, '$r$ (kpc)')" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "nel = ml.modules[0]._nelicm(r) # in cm^-3\n", "plt.plot(r, nel)\n", "plt.yscale('log')\n", "plt.xscale('log')\n", "plt.ylabel('$n_\\mathrm{el}$ (cm$^{-3}$)')\n", "plt.xlabel('$r$ (kpc)')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Visualisation of the magnetic field\n", "\n", "We can further plot a field line to illustrate that the field really is structured, opposed to a gaussian turbulence field.\n", "\n", "For this, we use the equation determining a single field line\n", "$\\newcommand{\\vert}{|}\\newcommand{\\vect}{\\mathbf}\\vect{x}_{i+1} = \\vect{x}_{i} + \\frac{\\vect{B}(\\vect{x}_i)}{\\left \\vert \\vect{B}(\\vect{x}_i) \\right \\vert} \\Delta s$\n", "for a small $\\Delta s$.\n" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib as mpl\n", "from scipy.spatial.transform import Rotation as R\n", "from mpl_toolkits.mplot3d import Axes3D\n", "from matplotlib.collections import LineCollection\n", "from matplotlib.colors import ListedColormap, BoundaryNorm" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Functions and constants\n", "\n", "In the following block, we define the neccessary functions (field components etc.), some constants and transformations of coordinates and vector fields to be used." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "def field_line(x_0, steps, ds):\n", " x = np.zeros((steps, 3))\n", " x[0] = x_0\n", " for i in range(steps-1):\n", " x[i+1] = integrate(x[i], ds)\n", " return x\n", "\n", "def integrate(x_prev, ds):\n", " '''Returns next point along field line, given some starting point x_prev and a small increment ds'''\n", " r, theta, phi = cart_to_sphere(x_prev[0], x_prev[1], x_prev[2])\n", " B_sph = B_sphere(r, theta, phi)\n", " B_cart = np.matmul(trafo(r, theta, phi), B_sph.transpose()).transpose()\n", " norm = np.linalg.norm(B_cart)\n", " x_new = x_prev + B_cart / norm * ds\n", " return x_new\n", "\n", "\n", "def cart_to_sphere(x, y, z):\n", " '''Coordinate transformation from cartesian to spherical.'''\n", " r = np.sqrt(x**2 + y**2 + z**2)\n", " theta = np.arccos(z / r)\n", " phi = np.arctan2(y, x)\n", " return r, theta, phi\n", "\n", "def sphere_to_cart(r, theta, phi):\n", " '''Coordinate transformation from spherical to cartesian'''\n", " x = r * np.sin(theta) * np.cos(phi)\n", " y = r * np.sin(theta) * np.sin(phi)\n", " z = r * np.cos(theta)\n", " return x, y, z\n", "\n", "\n", "def trafo(r, theta, phi):\n", " '''Returns trafo used for vector fields, i.e. Field A cartesian = S * Field A spherical. S is returned'''\n", " mat = np.array([[np.sin(theta) * np.cos(phi), np.cos(theta) * np.cos(phi), -np.sin(phi)],\n", " [np.sin(theta) * np.sin(phi), np.cos(theta) * np.sin(phi), np.cos(phi)],\n", " [np.cos(theta), -np.sin(theta), 0]])\n", " return mat\n", "\n", "\n", "'''Constants used for field definitions'''\n", "alpha = 5.7634591968\n", "c = 1\n", "F_0 = c * (alpha * np.cos(alpha) - np.sin(alpha)) * alpha**2\n", "\n", "\n", "def b_r(r, theta):\n", " val = 2 * np.cos(theta) * f(r) / r**2\n", " return val\n", " \n", "\n", "def b_theta(r, theta):\n", " val = - np.sin(theta) * f_prime(r) / r\n", " return val\n", "\n", "\n", "def b_phi(r, theta):\n", " val = alpha * np.sin(theta) * f(r) / r\n", " return val\n", "\n", "\n", "def f(r):\n", " return c * (alpha * np.cos(alpha * r) - np.sin(alpha * r) / r) \\\n", " - F_0 * r**2 / alpha**2\n", "\n", "\n", "def f_prime(r):\n", " return c * ( - alpha**2 * np.sin(alpha * r) \\\n", " - alpha * np.cos(alpha * r) / r \\\n", " + np.sin(alpha * r) / r**2) \\\n", " - 2 * F_0 * r / alpha**2\n", "\n", "def B_sphere(r, theta, phi):\n", " return np.array([[b_r(r, theta), b_theta(r, theta), b_phi(r, theta)]])\n", "\n", "\n", "def norm(r):\n", " return np.sqrt(r[:, :, :, 0]**2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Plotting the field line\n", "We plot an \"interactive\" field line, in the sense that you can rotate it around in space!\n", "\n", "Because pyplot lacks a proper function for coloured 3D plots, we use instead a scatter with some colormap." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "/* global mpl */\n", "window.mpl = {};\n", "\n", "mpl.get_websocket_type = function () {\n", " if (typeof WebSocket !== 'undefined') {\n", " return WebSocket;\n", " } else if (typeof MozWebSocket !== 'undefined') {\n", " return MozWebSocket;\n", " } else {\n", " alert(\n", " 'Your browser does not have WebSocket support. ' +\n", " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", " 'Firefox 4 and 5 are also supported but you ' +\n", " 'have to enable WebSockets in about:config.'\n", " );\n", " }\n", "};\n", "\n", "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n", " this.id = figure_id;\n", "\n", " this.ws = websocket;\n", "\n", " this.supports_binary = this.ws.binaryType !== undefined;\n", "\n", " if (!this.supports_binary) {\n", " var warnings = document.getElementById('mpl-warnings');\n", " if (warnings) {\n", " warnings.style.display = 'block';\n", " warnings.textContent =\n", " 'This browser does not support binary websocket messages. ' +\n", " 'Performance may be slow.';\n", " }\n", " }\n", "\n", " this.imageObj = new Image();\n", "\n", " this.context = undefined;\n", " this.message = undefined;\n", " this.canvas = undefined;\n", " this.rubberband_canvas = undefined;\n", " this.rubberband_context = undefined;\n", " this.format_dropdown = undefined;\n", "\n", " this.image_mode = 'full';\n", "\n", " this.root = document.createElement('div');\n", " this.root.setAttribute('style', 'display: inline-block');\n", " this._root_extra_style(this.root);\n", "\n", " parent_element.appendChild(this.root);\n", "\n", " this._init_header(this);\n", " this._init_canvas(this);\n", " this._init_toolbar(this);\n", "\n", " var fig = this;\n", "\n", " this.waiting = false;\n", "\n", " this.ws.onopen = function () {\n", " fig.send_message('supports_binary', { value: fig.supports_binary });\n", " fig.send_message('send_image_mode', {});\n", " if (fig.ratio !== 1) {\n", " fig.send_message('set_device_pixel_ratio', {\n", " device_pixel_ratio: fig.ratio,\n", " });\n", " }\n", " fig.send_message('refresh', {});\n", " };\n", "\n", " this.imageObj.onload = function () {\n", " if (fig.image_mode === 'full') {\n", " // Full images could contain transparency (where diff images\n", " // almost always do), so we need to clear the canvas so that\n", " // there is no ghosting.\n", " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", " }\n", " fig.context.drawImage(fig.imageObj, 0, 0);\n", " };\n", "\n", " this.imageObj.onunload = function () {\n", " fig.ws.close();\n", " };\n", "\n", " this.ws.onmessage = this._make_on_message_function(this);\n", "\n", " this.ondownload = ondownload;\n", "};\n", "\n", "mpl.figure.prototype._init_header = function () {\n", " var titlebar = document.createElement('div');\n", " titlebar.classList =\n", " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n", " var titletext = document.createElement('div');\n", " titletext.classList = 'ui-dialog-title';\n", " titletext.setAttribute(\n", " 'style',\n", " 'width: 100%; text-align: center; padding: 3px;'\n", " );\n", " titlebar.appendChild(titletext);\n", " this.root.appendChild(titlebar);\n", " this.header = titletext;\n", "};\n", "\n", "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n", "\n", "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n", "\n", "mpl.figure.prototype._init_canvas = function () {\n", " var fig = this;\n", "\n", " var canvas_div = (this.canvas_div = document.createElement('div'));\n", " canvas_div.setAttribute('tabindex', '0');\n", " canvas_div.setAttribute(\n", " 'style',\n", " 'border: 1px solid #ddd;' +\n", " 'box-sizing: content-box;' +\n", " 'clear: both;' +\n", " 'min-height: 1px;' +\n", " 'min-width: 1px;' +\n", " 'outline: 0;' +\n", " 'overflow: hidden;' +\n", " 'position: relative;' +\n", " 'resize: both;' +\n", " 'z-index: 2;'\n", " );\n", "\n", " function on_keyboard_event_closure(name) {\n", " return function (event) {\n", " return fig.key_event(event, name);\n", " };\n", " }\n", "\n", " canvas_div.addEventListener(\n", " 'keydown',\n", " on_keyboard_event_closure('key_press')\n", " );\n", " canvas_div.addEventListener(\n", " 'keyup',\n", " on_keyboard_event_closure('key_release')\n", " );\n", "\n", " this._canvas_extra_style(canvas_div);\n", " this.root.appendChild(canvas_div);\n", "\n", " var canvas = (this.canvas = document.createElement('canvas'));\n", " canvas.classList.add('mpl-canvas');\n", " canvas.setAttribute(\n", " 'style',\n", " 'box-sizing: content-box;' +\n", " 'pointer-events: none;' +\n", " 'position: relative;' +\n", " 'z-index: 0;'\n", " );\n", "\n", " this.context = canvas.getContext('2d');\n", "\n", " var backingStore =\n", " this.context.backingStorePixelRatio ||\n", " this.context.webkitBackingStorePixelRatio ||\n", " this.context.mozBackingStorePixelRatio ||\n", " this.context.msBackingStorePixelRatio ||\n", " this.context.oBackingStorePixelRatio ||\n", " this.context.backingStorePixelRatio ||\n", " 1;\n", "\n", " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n", "\n", " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n", " 'canvas'\n", " ));\n", " rubberband_canvas.setAttribute(\n", " 'style',\n", " 'box-sizing: content-box;' +\n", " 'left: 0;' +\n", " 'pointer-events: none;' +\n", " 'position: absolute;' +\n", " 'top: 0;' +\n", " 'z-index: 1;'\n", " );\n", "\n", " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n", " if (this.ResizeObserver === undefined) {\n", " if (window.ResizeObserver !== undefined) {\n", " this.ResizeObserver = window.ResizeObserver;\n", " } else {\n", " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n", " this.ResizeObserver = obs.ResizeObserver;\n", " }\n", " }\n", "\n", " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n", " var nentries = entries.length;\n", " for (var i = 0; i < nentries; i++) {\n", " var entry = entries[i];\n", " var width, height;\n", " if (entry.contentBoxSize) {\n", " if (entry.contentBoxSize instanceof Array) {\n", " // Chrome 84 implements new version of spec.\n", " width = entry.contentBoxSize[0].inlineSize;\n", " height = entry.contentBoxSize[0].blockSize;\n", " } else {\n", " // Firefox implements old version of spec.\n", " width = entry.contentBoxSize.inlineSize;\n", " height = entry.contentBoxSize.blockSize;\n", " }\n", " } else {\n", " // Chrome <84 implements even older version of spec.\n", " width = entry.contentRect.width;\n", " height = entry.contentRect.height;\n", " }\n", "\n", " // Keep the size of the canvas and rubber band canvas in sync with\n", " // the canvas container.\n", " if (entry.devicePixelContentBoxSize) {\n", " // Chrome 84 implements new version of spec.\n", " canvas.setAttribute(\n", " 'width',\n", " entry.devicePixelContentBoxSize[0].inlineSize\n", " );\n", " canvas.setAttribute(\n", " 'height',\n", " entry.devicePixelContentBoxSize[0].blockSize\n", " );\n", " } else {\n", " canvas.setAttribute('width', width * fig.ratio);\n", " canvas.setAttribute('height', height * fig.ratio);\n", " }\n", " /* This rescales the canvas back to display pixels, so that it\n", " * appears correct on HiDPI screens. */\n", " canvas.style.width = width + 'px';\n", " canvas.style.height = height + 'px';\n", "\n", " rubberband_canvas.setAttribute('width', width);\n", " rubberband_canvas.setAttribute('height', height);\n", "\n", " // And update the size in Python. We ignore the initial 0/0 size\n", " // that occurs as the element is placed into the DOM, which should\n", " // otherwise not happen due to the minimum size styling.\n", " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n", " fig.request_resize(width, height);\n", " }\n", " }\n", " });\n", " this.resizeObserverInstance.observe(canvas_div);\n", "\n", " function on_mouse_event_closure(name) {\n", " /* User Agent sniffing is bad, but WebKit is busted:\n", " * https://bugs.webkit.org/show_bug.cgi?id=144526\n", " * https://bugs.webkit.org/show_bug.cgi?id=181818\n", " * The worst that happens here is that they get an extra browser\n", " * selection when dragging, if this check fails to catch them.\n", " */\n", " var UA = navigator.userAgent;\n", " var isWebKit = /AppleWebKit/.test(UA) && !/Chrome/.test(UA);\n", " if(isWebKit) {\n", " return function (event) {\n", " /* This prevents the web browser from automatically changing to\n", " * the text insertion cursor when the button is pressed. We\n", " * want to control all of the cursor setting manually through\n", " * the 'cursor' event from matplotlib */\n", " event.preventDefault()\n", " return fig.mouse_event(event, name);\n", " };\n", " } else {\n", " return function (event) {\n", " return fig.mouse_event(event, name);\n", " };\n", " }\n", " }\n", "\n", " canvas_div.addEventListener(\n", " 'mousedown',\n", " on_mouse_event_closure('button_press')\n", " );\n", " canvas_div.addEventListener(\n", " 'mouseup',\n", " on_mouse_event_closure('button_release')\n", " );\n", " canvas_div.addEventListener(\n", " 'dblclick',\n", " on_mouse_event_closure('dblclick')\n", " );\n", " // Throttle sequential mouse events to 1 every 20ms.\n", " canvas_div.addEventListener(\n", " 'mousemove',\n", " on_mouse_event_closure('motion_notify')\n", " );\n", "\n", " canvas_div.addEventListener(\n", " 'mouseenter',\n", " on_mouse_event_closure('figure_enter')\n", " );\n", " canvas_div.addEventListener(\n", " 'mouseleave',\n", " on_mouse_event_closure('figure_leave')\n", " );\n", "\n", " canvas_div.addEventListener('wheel', function (event) {\n", " if (event.deltaY < 0) {\n", " event.step = 1;\n", " } else {\n", " event.step = -1;\n", " }\n", " on_mouse_event_closure('scroll')(event);\n", " });\n", "\n", " canvas_div.appendChild(canvas);\n", " canvas_div.appendChild(rubberband_canvas);\n", "\n", " this.rubberband_context = rubberband_canvas.getContext('2d');\n", " this.rubberband_context.strokeStyle = '#000000';\n", "\n", " this._resize_canvas = function (width, height, forward) {\n", " if (forward) {\n", " canvas_div.style.width = width + 'px';\n", " canvas_div.style.height = height + 'px';\n", " }\n", " };\n", "\n", " // Disable right mouse context menu.\n", " canvas_div.addEventListener('contextmenu', function (_e) {\n", " event.preventDefault();\n", " return false;\n", " });\n", "\n", " function set_focus() {\n", " canvas.focus();\n", " canvas_div.focus();\n", " }\n", "\n", " window.setTimeout(set_focus, 100);\n", "};\n", "\n", "mpl.figure.prototype._init_toolbar = function () {\n", " var fig = this;\n", "\n", " var toolbar = document.createElement('div');\n", " toolbar.classList = 'mpl-toolbar';\n", " this.root.appendChild(toolbar);\n", "\n", " function on_click_closure(name) {\n", " return function (_event) {\n", " return fig.toolbar_button_onclick(name);\n", " };\n", " }\n", "\n", " function on_mouseover_closure(tooltip) {\n", " return function (event) {\n", " if (!event.currentTarget.disabled) {\n", " return fig.toolbar_button_onmouseover(tooltip);\n", " }\n", " };\n", " }\n", "\n", " fig.buttons = {};\n", " var buttonGroup = document.createElement('div');\n", " buttonGroup.classList = 'mpl-button-group';\n", " for (var toolbar_ind in mpl.toolbar_items) {\n", " var name = mpl.toolbar_items[toolbar_ind][0];\n", " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", " var image = mpl.toolbar_items[toolbar_ind][2];\n", " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", "\n", " if (!name) {\n", " /* Instead of a spacer, we start a new button group. */\n", " if (buttonGroup.hasChildNodes()) {\n", " toolbar.appendChild(buttonGroup);\n", " }\n", " buttonGroup = document.createElement('div');\n", " buttonGroup.classList = 'mpl-button-group';\n", " continue;\n", " }\n", "\n", " var button = (fig.buttons[name] = document.createElement('button'));\n", " button.classList = 'mpl-widget';\n", " button.setAttribute('role', 'button');\n", " button.setAttribute('aria-disabled', 'false');\n", " button.addEventListener('click', on_click_closure(method_name));\n", " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", "\n", " var icon_img = document.createElement('img');\n", " icon_img.src = '_images/' + image + '.png';\n", " icon_img.srcset = '_images/' + image + '_large.png 2x';\n", " icon_img.alt = tooltip;\n", " button.appendChild(icon_img);\n", "\n", " buttonGroup.appendChild(button);\n", " }\n", "\n", " if (buttonGroup.hasChildNodes()) {\n", " toolbar.appendChild(buttonGroup);\n", " }\n", "\n", " var fmt_picker = document.createElement('select');\n", " fmt_picker.classList = 'mpl-widget';\n", " toolbar.appendChild(fmt_picker);\n", " this.format_dropdown = fmt_picker;\n", "\n", " for (var ind in mpl.extensions) {\n", " var fmt = mpl.extensions[ind];\n", " var option = document.createElement('option');\n", " option.selected = fmt === mpl.default_extension;\n", " option.innerHTML = fmt;\n", " fmt_picker.appendChild(option);\n", " }\n", "\n", " var status_bar = document.createElement('span');\n", " status_bar.classList = 'mpl-message';\n", " toolbar.appendChild(status_bar);\n", " this.message = status_bar;\n", "};\n", "\n", "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n", " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", " // which will in turn request a refresh of the image.\n", " this.send_message('resize', { width: x_pixels, height: y_pixels });\n", "};\n", "\n", "mpl.figure.prototype.send_message = function (type, properties) {\n", " properties['type'] = type;\n", " properties['figure_id'] = this.id;\n", " this.ws.send(JSON.stringify(properties));\n", "};\n", "\n", "mpl.figure.prototype.send_draw_message = function () {\n", " if (!this.waiting) {\n", " this.waiting = true;\n", " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n", " }\n", "};\n", "\n", "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", " var format_dropdown = fig.format_dropdown;\n", " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", " fig.ondownload(fig, format);\n", "};\n", "\n", "mpl.figure.prototype.handle_resize = function (fig, msg) {\n", " var size = msg['size'];\n", " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n", " fig._resize_canvas(size[0], size[1], msg['forward']);\n", " fig.send_message('refresh', {});\n", " }\n", "};\n", "\n", "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n", " var x0 = msg['x0'] / fig.ratio;\n", " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n", " var x1 = msg['x1'] / fig.ratio;\n", " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n", " x0 = Math.floor(x0) + 0.5;\n", " y0 = Math.floor(y0) + 0.5;\n", " x1 = Math.floor(x1) + 0.5;\n", " y1 = Math.floor(y1) + 0.5;\n", " var min_x = Math.min(x0, x1);\n", " var min_y = Math.min(y0, y1);\n", " var width = Math.abs(x1 - x0);\n", " var height = Math.abs(y1 - y0);\n", "\n", " fig.rubberband_context.clearRect(\n", " 0,\n", " 0,\n", " fig.canvas.width / fig.ratio,\n", " fig.canvas.height / fig.ratio\n", " );\n", "\n", " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", "};\n", "\n", "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n", " // Updates the figure title.\n", " fig.header.textContent = msg['label'];\n", "};\n", "\n", "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n", " fig.canvas_div.style.cursor = msg['cursor'];\n", "};\n", "\n", "mpl.figure.prototype.handle_message = function (fig, msg) {\n", " fig.message.textContent = msg['message'];\n", "};\n", "\n", "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n", " // Request the server to send over a new figure.\n", " fig.send_draw_message();\n", "};\n", "\n", "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n", " fig.image_mode = msg['mode'];\n", "};\n", "\n", "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n", " for (var key in msg) {\n", " if (!(key in fig.buttons)) {\n", " continue;\n", " }\n", " fig.buttons[key].disabled = !msg[key];\n", " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n", " }\n", "};\n", "\n", "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n", " if (msg['mode'] === 'PAN') {\n", " fig.buttons['Pan'].classList.add('active');\n", " fig.buttons['Zoom'].classList.remove('active');\n", " } else if (msg['mode'] === 'ZOOM') {\n", " fig.buttons['Pan'].classList.remove('active');\n", " fig.buttons['Zoom'].classList.add('active');\n", " } else {\n", " fig.buttons['Pan'].classList.remove('active');\n", " fig.buttons['Zoom'].classList.remove('active');\n", " }\n", "};\n", "\n", "mpl.figure.prototype.updated_canvas_event = function () {\n", " // Called whenever the canvas gets updated.\n", " this.send_message('ack', {});\n", "};\n", "\n", "// A function to construct a web socket function for onmessage handling.\n", "// Called in the figure constructor.\n", "mpl.figure.prototype._make_on_message_function = function (fig) {\n", " return function socket_on_message(evt) {\n", " if (evt.data instanceof Blob) {\n", " var img = evt.data;\n", " if (img.type !== 'image/png') {\n", " /* FIXME: We get \"Resource interpreted as Image but\n", " * transferred with MIME type text/plain:\" errors on\n", " * Chrome. But how to set the MIME type? It doesn't seem\n", " * to be part of the websocket stream */\n", " img.type = 'image/png';\n", " }\n", "\n", " /* Free the memory for the previous frames */\n", " if (fig.imageObj.src) {\n", " (window.URL || window.webkitURL).revokeObjectURL(\n", " fig.imageObj.src\n", " );\n", " }\n", "\n", " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", " img\n", " );\n", " fig.updated_canvas_event();\n", " fig.waiting = false;\n", " return;\n", " } else if (\n", " typeof evt.data === 'string' &&\n", " evt.data.slice(0, 21) === 'data:image/png;base64'\n", " ) {\n", " fig.imageObj.src = evt.data;\n", " fig.updated_canvas_event();\n", " fig.waiting = false;\n", " return;\n", " }\n", "\n", " var msg = JSON.parse(evt.data);\n", " var msg_type = msg['type'];\n", "\n", " // Call the \"handle_{type}\" callback, which takes\n", " // the figure and JSON message as its only arguments.\n", " try {\n", " var callback = fig['handle_' + msg_type];\n", " } catch (e) {\n", " console.log(\n", " \"No handler for the '\" + msg_type + \"' message type: \",\n", " msg\n", " );\n", " return;\n", " }\n", "\n", " if (callback) {\n", " try {\n", " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", " callback(fig, msg);\n", " } catch (e) {\n", " console.log(\n", " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n", " e,\n", " e.stack,\n", " msg\n", " );\n", " }\n", " }\n", " };\n", "};\n", "\n", "function getModifiers(event) {\n", " var mods = [];\n", " if (event.ctrlKey) {\n", " mods.push('ctrl');\n", " }\n", " if (event.altKey) {\n", " mods.push('alt');\n", " }\n", " if (event.shiftKey) {\n", " mods.push('shift');\n", " }\n", " if (event.metaKey) {\n", " mods.push('meta');\n", " }\n", " return mods;\n", "}\n", "\n", "/*\n", " * return a copy of an object with only non-object keys\n", " * we need this to avoid circular references\n", " * https://stackoverflow.com/a/24161582/3208463\n", " */\n", "function simpleKeys(original) {\n", " return Object.keys(original).reduce(function (obj, key) {\n", " if (typeof original[key] !== 'object') {\n", " obj[key] = original[key];\n", " }\n", " return obj;\n", " }, {});\n", "}\n", "\n", "mpl.figure.prototype.mouse_event = function (event, name) {\n", " if (name === 'button_press') {\n", " this.canvas.focus();\n", " this.canvas_div.focus();\n", " }\n", "\n", " // from https://stackoverflow.com/q/1114465\n", " var boundingRect = this.canvas.getBoundingClientRect();\n", " var x = (event.clientX - boundingRect.left) * this.ratio;\n", " var y = (event.clientY - boundingRect.top) * this.ratio;\n", "\n", " this.send_message(name, {\n", " x: x,\n", " y: y,\n", " button: event.button,\n", " step: event.step,\n", " modifiers: getModifiers(event),\n", " guiEvent: simpleKeys(event),\n", " });\n", "\n", " return false;\n", "};\n", "\n", "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n", " // Handle any extra behaviour associated with a key event\n", "};\n", "\n", "mpl.figure.prototype.key_event = function (event, name) {\n", " // Prevent repeat events\n", " if (name === 'key_press') {\n", " if (event.key === this._key) {\n", " return;\n", " } else {\n", " this._key = event.key;\n", " }\n", " }\n", " if (name === 'key_release') {\n", " this._key = null;\n", " }\n", "\n", " var value = '';\n", " if (event.ctrlKey && event.key !== 'Control') {\n", " value += 'ctrl+';\n", " }\n", " else if (event.altKey && event.key !== 'Alt') {\n", " value += 'alt+';\n", " }\n", " else if (event.shiftKey && event.key !== 'Shift') {\n", " value += 'shift+';\n", " }\n", "\n", " value += 'k' + event.key;\n", "\n", " this._key_event_extra(event, name);\n", "\n", " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n", " return false;\n", "};\n", "\n", "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n", " if (name === 'download') {\n", " this.handle_save(this, null);\n", " } else {\n", " this.send_message('toolbar_button', { name: name });\n", " }\n", "};\n", "\n", "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n", " this.message.textContent = tooltip;\n", "};\n", "\n", "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n", "// prettier-ignore\n", "var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n", "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o\", \"download\"]];\n", "\n", "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\", \"webp\"];\n", "\n", "mpl.default_extension = \"png\";/* global mpl */\n", "\n", "var comm_websocket_adapter = function (comm) {\n", " // Create a \"websocket\"-like object which calls the given IPython comm\n", " // object with the appropriate methods. Currently this is a non binary\n", " // socket, so there is still some room for performance tuning.\n", " var ws = {};\n", "\n", " ws.binaryType = comm.kernel.ws.binaryType;\n", " ws.readyState = comm.kernel.ws.readyState;\n", " function updateReadyState(_event) {\n", " if (comm.kernel.ws) {\n", " ws.readyState = comm.kernel.ws.readyState;\n", " } else {\n", " ws.readyState = 3; // Closed state.\n", " }\n", " }\n", " comm.kernel.ws.addEventListener('open', updateReadyState);\n", " comm.kernel.ws.addEventListener('close', updateReadyState);\n", " comm.kernel.ws.addEventListener('error', updateReadyState);\n", "\n", " ws.close = function () {\n", " comm.close();\n", " };\n", " ws.send = function (m) {\n", " //console.log('sending', m);\n", " comm.send(m);\n", " };\n", " // Register the callback with on_msg.\n", " comm.on_msg(function (msg) {\n", " //console.log('receiving', msg['content']['data'], msg);\n", " var data = msg['content']['data'];\n", " if (data['blob'] !== undefined) {\n", " data = {\n", " data: new Blob(msg['buffers'], { type: data['blob'] }),\n", " };\n", " }\n", " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", " ws.onmessage(data);\n", " });\n", " return ws;\n", "};\n", "\n", "mpl.mpl_figure_comm = function (comm, msg) {\n", " // This is the function which gets called when the mpl process\n", " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", "\n", " var id = msg.content.data.id;\n", " // Get hold of the div created by the display call when the Comm\n", " // socket was opened in Python.\n", " var element = document.getElementById(id);\n", " var ws_proxy = comm_websocket_adapter(comm);\n", "\n", " function ondownload(figure, _format) {\n", " window.open(figure.canvas.toDataURL());\n", " }\n", "\n", " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n", "\n", " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", " // web socket which is closed, not our websocket->open comm proxy.\n", " ws_proxy.onopen();\n", "\n", " fig.parent_element = element;\n", " fig.cell_info = mpl.find_output_cell(\"
\");\n", " if (!fig.cell_info) {\n", " console.error('Failed to find cell for figure', id, fig);\n", " return;\n", " }\n", " fig.cell_info[0].output_area.element.on(\n", " 'cleared',\n", " { fig: fig },\n", " fig._remove_fig_handler\n", " );\n", "};\n", "\n", "mpl.figure.prototype.handle_close = function (fig, msg) {\n", " var width = fig.canvas.width / fig.ratio;\n", " fig.cell_info[0].output_area.element.off(\n", " 'cleared',\n", " fig._remove_fig_handler\n", " );\n", " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n", "\n", " // Update the output cell to use the data from the current canvas.\n", " fig.push_to_output();\n", " var dataURL = fig.canvas.toDataURL();\n", " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", " // the notebook keyboard shortcuts fail.\n", " IPython.keyboard_manager.enable();\n", " fig.parent_element.innerHTML =\n", " '';\n", " fig.close_ws(fig, msg);\n", "};\n", "\n", "mpl.figure.prototype.close_ws = function (fig, msg) {\n", " fig.send_message('closing', msg);\n", " // fig.ws.close()\n", "};\n", "\n", "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n", " // Turn the data on the canvas into data in the output cell.\n", " var width = this.canvas.width / this.ratio;\n", " var dataURL = this.canvas.toDataURL();\n", " this.cell_info[1]['text/html'] =\n", " '';\n", "};\n", "\n", "mpl.figure.prototype.updated_canvas_event = function () {\n", " // Tell IPython that the notebook contents must change.\n", " IPython.notebook.set_dirty(true);\n", " this.send_message('ack', {});\n", " var fig = this;\n", " // Wait a second, then push the new image to the DOM so\n", " // that it is saved nicely (might be nice to debounce this).\n", " setTimeout(function () {\n", " fig.push_to_output();\n", " }, 1000);\n", "};\n", "\n", "mpl.figure.prototype._init_toolbar = function () {\n", " var fig = this;\n", "\n", " var toolbar = document.createElement('div');\n", " toolbar.classList = 'btn-toolbar';\n", " this.root.appendChild(toolbar);\n", "\n", " function on_click_closure(name) {\n", " return function (_event) {\n", " return fig.toolbar_button_onclick(name);\n", " };\n", " }\n", "\n", " function on_mouseover_closure(tooltip) {\n", " return function (event) {\n", " if (!event.currentTarget.disabled) {\n", " return fig.toolbar_button_onmouseover(tooltip);\n", " }\n", " };\n", " }\n", "\n", " fig.buttons = {};\n", " var buttonGroup = document.createElement('div');\n", " buttonGroup.classList = 'btn-group';\n", " var button;\n", " for (var toolbar_ind in mpl.toolbar_items) {\n", " var name = mpl.toolbar_items[toolbar_ind][0];\n", " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", " var image = mpl.toolbar_items[toolbar_ind][2];\n", " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", "\n", " if (!name) {\n", " /* Instead of a spacer, we start a new button group. */\n", " if (buttonGroup.hasChildNodes()) {\n", " toolbar.appendChild(buttonGroup);\n", " }\n", " buttonGroup = document.createElement('div');\n", " buttonGroup.classList = 'btn-group';\n", " continue;\n", " }\n", "\n", " button = fig.buttons[name] = document.createElement('button');\n", " button.classList = 'btn btn-default';\n", " button.href = '#';\n", " button.title = name;\n", " button.innerHTML = '';\n", " button.addEventListener('click', on_click_closure(method_name));\n", " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", " buttonGroup.appendChild(button);\n", " }\n", "\n", " if (buttonGroup.hasChildNodes()) {\n", " toolbar.appendChild(buttonGroup);\n", " }\n", "\n", " // Add the status bar.\n", " var status_bar = document.createElement('span');\n", " status_bar.classList = 'mpl-message pull-right';\n", " toolbar.appendChild(status_bar);\n", " this.message = status_bar;\n", "\n", " // Add the close button to the window.\n", " var buttongrp = document.createElement('div');\n", " buttongrp.classList = 'btn-group inline pull-right';\n", " button = document.createElement('button');\n", " button.classList = 'btn btn-mini btn-primary';\n", " button.href = '#';\n", " button.title = 'Stop Interaction';\n", " button.innerHTML = '';\n", " button.addEventListener('click', function (_evt) {\n", " fig.handle_close(fig, {});\n", " });\n", " button.addEventListener(\n", " 'mouseover',\n", " on_mouseover_closure('Stop Interaction')\n", " );\n", " buttongrp.appendChild(button);\n", " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n", " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n", "};\n", "\n", "mpl.figure.prototype._remove_fig_handler = function (event) {\n", " var fig = event.data.fig;\n", " if (event.target !== this) {\n", " // Ignore bubbled events from children.\n", " return;\n", " }\n", " fig.close_ws(fig, {});\n", "};\n", "\n", "mpl.figure.prototype._root_extra_style = function (el) {\n", " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n", "};\n", "\n", "mpl.figure.prototype._canvas_extra_style = function (el) {\n", " // this is important to make the div 'focusable\n", " el.setAttribute('tabindex', 0);\n", " // reach out to IPython and tell the keyboard manager to turn it's self\n", " // off when our div gets focus\n", "\n", " // location in version 3\n", " if (IPython.notebook.keyboard_manager) {\n", " IPython.notebook.keyboard_manager.register_events(el);\n", " } else {\n", " // location in version 2\n", " IPython.keyboard_manager.register_events(el);\n", " }\n", "};\n", "\n", "mpl.figure.prototype._key_event_extra = function (event, _name) {\n", " // Check for shift+enter\n", " if (event.shiftKey && event.which === 13) {\n", " this.canvas_div.blur();\n", " // select the cell after this one\n", " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", " IPython.notebook.select(index + 1);\n", " }\n", "};\n", "\n", "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", " fig.ondownload(fig, null);\n", "};\n", "\n", "mpl.find_output_cell = function (html_output) {\n", " // Return the cell and output element which can be found *uniquely* in the notebook.\n", " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", " // IPython event is triggered only after the cells have been serialised, which for\n", " // our purposes (turning an active figure into a static one), is too late.\n", " var cells = IPython.notebook.get_cells();\n", " var ncells = cells.length;\n", " for (var i = 0; i < ncells; i++) {\n", " var cell = cells[i];\n", " if (cell.cell_type === 'code') {\n", " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n", " var data = cell.output_area.outputs[j];\n", " if (data.data) {\n", " // IPython >= 3 moved mimebundle to data attribute of output\n", " data = data.data;\n", " }\n", " if (data['text/html'] === html_output) {\n", " return [cell, data, j];\n", " }\n", " }\n", " }\n", " }\n", "};\n", "\n", "// Register the function which deals with the matplotlib target/channel.\n", "// The kernel may be null if the page has been refreshed.\n", "if (IPython.notebook.kernel !== null) {\n", " IPython.notebook.kernel.comm_manager.register_target(\n", " 'matplotlib',\n", " mpl.mpl_figure_comm\n", " );\n", "}\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "ename": "TypeError", "evalue": "gca() got an unexpected keyword argument 'projection'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[14], line 5\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[38;5;66;03m# so that we can have an interactive plot!\u001b[39;00m\n\u001b[1;32m 4\u001b[0m fig \u001b[38;5;241m=\u001b[39m plt\u001b[38;5;241m.\u001b[39mfigure()\n\u001b[0;32m----> 5\u001b[0m ax \u001b[38;5;241m=\u001b[39m \u001b[43mfig\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgca\u001b[49m\u001b[43m(\u001b[49m\u001b[43mprojection\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43m3d\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 6\u001b[0m ax\u001b[38;5;241m.\u001b[39mset_xlabel(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m$x$\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 7\u001b[0m ax\u001b[38;5;241m.\u001b[39mset_ylabel(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m$y$\u001b[39m\u001b[38;5;124m'\u001b[39m)\n", "\u001b[0;31mTypeError\u001b[0m: gca() got an unexpected keyword argument 'projection'" ] } ], "source": [ "%matplotlib notebook \n", "# so that we can have an interactive plot!\n", "\n", "fig = plt.figure()\n", "ax = fig.gca(projection='3d')\n", "ax.set_xlabel('$x$')\n", "ax.set_ylabel('$y$')\n", "ax.set_zlabel('$z$')\n", "\n", "\n", "# start a field line at r=0.2, theta=pi / 2 (on the equator), phi=0\n", "# choose some stepsize ds=0.001 and integrate 100000 steps\n", "\n", "ds = 0.001\n", "steps = 100000\n", "\n", "#if you want to plot multiple field lines, change this for loop\n", "for phi in np.linspace(0, 2 * np.pi, num=1):\n", " x_0 = sphere_to_cart(0.2, np.pi / 2, phi)\n", " x = field_line(x_0, steps, ds)\n", " #print(x)\n", " #plot only every 10th point to save memory and time\n", " line = ax.scatter(x[::10, 0], x[::10, 1], x[::10, 2],\n", " c=np.linalg.norm(x[::10], axis=-1),\n", " cmap=plt.get_cmap('viridis'),\n", " s=1, marker='.')\n", "cbar = fig.colorbar(line, ax=ax, label='$r$')\n", "ax.set_xticks((-0.5, 0, 0.5))\n", "ax.set_yticks((-0.5, 0, 0.5))\n", "ax.set_zticks((-0.4, 0, 0.4))\n", "ax.view_init(elev=25, azim=-107)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Calculate rotation measure\n", "\n", "Faraday RM can be calculated via a method of the structured field model, arguments areelectron density evaluated at r = structured_field.r in cm^-3" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "ml.modules[0].Bfield_model.rotation_measure(nel) # in rad * m^-2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Taylor et al. (2006) found RM values between 6500 and 7500 rad m^-2" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.18" } }, "nbformat": 4, "nbformat_minor": 4 }