{ "cells": [ { "cell_type": "markdown", "id": "b8622a6a", "metadata": {}, "source": [ "# Working with different units\n", "\n", "You can use a variety of different unit conventions in `ParticlePhaseSpace`. There are a number of unit sets pre programmed, and it's also easy to create your own.\n", "\n", "## Available units\n", "\n", "First let's look at what units are currently available:" ] }, { "cell_type": "code", "execution_count": 1, "id": "befe1d7f", "metadata": { "execution": { "iopub.execute_input": "2023-04-13T05:33:12.149178Z", "iopub.status.busy": "2023-04-13T05:33:12.148769Z", "iopub.status.idle": "2023-04-13T05:33:13.206968Z", "shell.execute_reply": "2023-04-13T05:33:13.206005Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Available Unit Sets\n", "=================\n", "cm_MeV:\n", "=================\n", "Length: cm,\n", "Energy: MeV,\n", "Momentum: MeV/c\n", "Velocity: m/s\n", "Mass: MeV/c^2\n", "\n", "=================\n", "m_eV:\n", "=================\n", "Length: m,\n", "Energy: eV,\n", "Momentum: eV/c\n", "Velocity: m/s\n", "Mass: eV/c^2\n", "\n", "=================\n", "mm_MeV:\n", "=================\n", "Length: mm,\n", "Energy: MeV,\n", "Momentum: MeV/c\n", "Velocity: m/s\n", "Mass: MeV/c^2\n", "\n", "=================\n", "p2_sat_UHI:\n", "=================\n", "Length: um,\n", "Energy: MeV,\n", "Momentum: MeV/c\n", "Velocity: m/s\n", "Mass: MeV/c^2\n", "\n", "=================\n", "um_keV:\n", "=================\n", "Length: um,\n", "Energy: keV,\n", "Momentum: keV/c\n", "Velocity: m/s\n", "Mass: keV/c^2\n", "\n" ] } ], "source": [ "import sys\n", "from pathlib import Path\n", "sys.path.append('../') # not necessary when the library is installed\n", "from ParticlePhaseSpace import ParticlePhaseSpaceUnits\n", "from ParticlePhaseSpace import DataLoaders\n", "from ParticlePhaseSpace import PhaseSpace\n", "\n", "\n", "available_units = ParticlePhaseSpaceUnits()\n", "print(available_units)" ] }, { "cell_type": "markdown", "id": "d31be745", "metadata": {}, "source": [ "From these available units sets, you can pick the one you want like this:" ] }, { "cell_type": "code", "execution_count": 2, "id": "20a75e81", "metadata": { "execution": { "iopub.execute_input": "2023-04-13T05:33:13.210828Z", "iopub.status.busy": "2023-04-13T05:33:13.210489Z", "iopub.status.idle": "2023-04-13T05:33:13.215012Z", "shell.execute_reply": "2023-04-13T05:33:13.214139Z" } }, "outputs": [], "source": [ "my_units = available_units('mm_MeV')\n", "my_units = available_units.mm_MeV # equivalalent" ] }, { "cell_type": "markdown", "id": "c81e8f5e", "metadata": {}, "source": [ "You can also easily define new units sets, but we will come to that later.\n", "\n", "## Setting units at data read in\n", "\n", "By default, `DataLoaders` use `mm_MeV` as the unit set. If you are reading in data with different untis, you just have to pass a unit set:" ] }, { "cell_type": "code", "execution_count": 3, "id": "56d965e9", "metadata": { "execution": { "iopub.execute_input": "2023-04-13T05:33:13.218490Z", "iopub.status.busy": "2023-04-13T05:33:13.218237Z", "iopub.status.idle": "2023-04-13T05:33:13.393206Z", "shell.execute_reply": "2023-04-13T05:33:13.392161Z" } }, "outputs": [], "source": [ "different_units = available_units('um_keV')\n", "test_data_loc = Path(r'../tests/test_data/coll_PhaseSpace_xAng_0.00_yAng_0.00_angular_error_0.0.phsp').absolute()\n", "ps_data = DataLoaders.Load_TopasData(test_data_loc, units=different_units)" ] }, { "cell_type": "code", "execution_count": 4, "id": "271e0a4e", "metadata": { "execution": { "iopub.execute_input": "2023-04-13T05:33:13.397227Z", "iopub.status.busy": "2023-04-13T05:33:13.396920Z", "iopub.status.idle": "2023-04-13T05:33:13.415115Z", "shell.execute_reply": "2023-04-13T05:33:13.414358Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
particle type [pdg_code]x [um]y [um]z [um]weightparticle idtime [ps]px [keV/c]py [keV/c]pz [keV/c]
022-0.971177-0.817280396.00.0100-0.008856-0.010509-3.184060
122-0.9161980.839298396.00.0110-0.0038940.008249-1.560114
222-5.25890211.318420396.00.0120-0.1930610.377104-1.219742
32215.326971-25.628899396.00.01300.102889-0.362594-1.414843
422-0.241948-0.401026396.00.0140-0.000192-0.001470-0.209232
\n", "
" ], "text/plain": [ " particle type [pdg_code] x [um] y [um] z [um] weight \\\n", "0 22 -0.971177 -0.817280 396.0 0.01 \n", "1 22 -0.916198 0.839298 396.0 0.01 \n", "2 22 -5.258902 11.318420 396.0 0.01 \n", "3 22 15.326971 -25.628899 396.0 0.01 \n", "4 22 -0.241948 -0.401026 396.0 0.01 \n", "\n", " particle id time [ps] px [keV/c] py [keV/c] pz [keV/c] \n", "0 0 0 -0.008856 -0.010509 -3.184060 \n", "1 1 0 -0.003894 0.008249 -1.560114 \n", "2 2 0 -0.193061 0.377104 -1.219742 \n", "3 3 0 0.102889 -0.362594 -1.414843 \n", "4 4 0 -0.000192 -0.001470 -0.209232 " ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ps_data.data.head()" ] }, { "cell_type": "markdown", "id": "dfaeea09", "metadata": {}, "source": [ "Note that this step does not convert any of the numbers in the data; it simply defines what units these numbers represent. When we pass the `DataLoader` to `PhaseSpace`, the units are preserved:" ] }, { "cell_type": "code", "execution_count": 5, "id": "f0170d69", "metadata": { "execution": { "iopub.execute_input": "2023-04-13T05:33:13.418985Z", "iopub.status.busy": "2023-04-13T05:33:13.418698Z", "iopub.status.idle": "2023-04-13T05:33:13.444187Z", "shell.execute_reply": "2023-04-13T05:33:13.443147Z" } }, "outputs": [ { "data": { "text/plain": [ "um_keV:\n", "=================\n", "Length: um,\n", "Energy: keV,\n", "Momentum: keV/c\n", "Velocity: m/s\n", "Mass: keV/c^2" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "PS = PhaseSpace(ps_data)\n", "PS.get_units()" ] }, { "cell_type": "code", "execution_count": 6, "id": "2cf5b1e8", "metadata": { "execution": { "iopub.execute_input": "2023-04-13T05:33:13.448098Z", "iopub.status.busy": "2023-04-13T05:33:13.447710Z", "iopub.status.idle": "2023-04-13T05:33:13.461882Z", "shell.execute_reply": "2023-04-13T05:33:13.460994Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
particle type [pdg_code]x [um]y [um]z [um]weightparticle idtime [ps]px [keV/c]py [keV/c]pz [keV/c]
022-0.971177-0.817280396.00.0100-0.008856-0.010509-3.184060
122-0.9161980.839298396.00.0110-0.0038940.008249-1.560114
222-5.25890211.318420396.00.0120-0.1930610.377104-1.219742
32215.326971-25.628899396.00.01300.102889-0.362594-1.414843
422-0.241948-0.401026396.00.0140-0.000192-0.001470-0.209232
\n", "
" ], "text/plain": [ " particle type [pdg_code] x [um] y [um] z [um] weight \\\n", "0 22 -0.971177 -0.817280 396.0 0.01 \n", "1 22 -0.916198 0.839298 396.0 0.01 \n", "2 22 -5.258902 11.318420 396.0 0.01 \n", "3 22 15.326971 -25.628899 396.0 0.01 \n", "4 22 -0.241948 -0.401026 396.0 0.01 \n", "\n", " particle id time [ps] px [keV/c] py [keV/c] pz [keV/c] \n", "0 0 0 -0.008856 -0.010509 -3.184060 \n", "1 1 0 -0.003894 0.008249 -1.560114 \n", "2 2 0 -0.193061 0.377104 -1.219742 \n", "3 3 0 0.102889 -0.362594 -1.414843 \n", "4 4 0 -0.000192 -0.001470 -0.209232 " ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "PS.ps_data.head()" ] }, { "cell_type": "markdown", "id": "7aa18e28", "metadata": {}, "source": [ "## Changing units after read in\n", "\n", "Let'read in the data again, this time with the correct unit set (`mm_MeV`):" ] }, { "cell_type": "code", "execution_count": 7, "id": "37d03d48", "metadata": { "execution": { "iopub.execute_input": "2023-04-13T05:33:13.465401Z", "iopub.status.busy": "2023-04-13T05:33:13.465157Z", "iopub.status.idle": "2023-04-13T05:33:13.628842Z", "shell.execute_reply": "2023-04-13T05:33:13.627796Z" } }, "outputs": [ { "data": { "text/plain": [ "mm_MeV:\n", "=================\n", "Length: mm,\n", "Energy: MeV,\n", "Momentum: MeV/c\n", "Velocity: m/s\n", "Mass: MeV/c^2" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ps_data = DataLoaders.Load_TopasData(test_data_loc)\n", "PS = PhaseSpace(ps_data)\n", "PS.get_units()" ] }, { "cell_type": "markdown", "id": "f3fdb0a3", "metadata": {}, "source": [ "We can now change the units using the `set_units` method:" ] }, { "cell_type": "code", "execution_count": 8, "id": "b25584ff", "metadata": { "execution": { "iopub.execute_input": "2023-04-13T05:33:13.632790Z", "iopub.status.busy": "2023-04-13T05:33:13.632513Z", "iopub.status.idle": "2023-04-13T05:33:13.650298Z", "shell.execute_reply": "2023-04-13T05:33:13.649373Z" } }, "outputs": [ { "data": { "text/plain": [ "um_keV:\n", "=================\n", "Length: um,\n", "Energy: keV,\n", "Momentum: keV/c\n", "Velocity: m/s\n", "Mass: keV/c^2" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "PS.set_units(different_units)\n", "PS.get_units()" ] }, { "cell_type": "code", "execution_count": 9, "id": "6a2e0cd7", "metadata": { "execution": { "iopub.execute_input": "2023-04-13T05:33:13.653878Z", "iopub.status.busy": "2023-04-13T05:33:13.653615Z", "iopub.status.idle": "2023-04-13T05:33:13.668202Z", "shell.execute_reply": "2023-04-13T05:33:13.667262Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
particle type [pdg_code]x [um]y [um]z [um]weightparticle idtime [ps]px [keV/c]py [keV/c]pz [keV/c]
022-971.176758-817.280090396000.00.0100.0-8.855738-10.508804-3184.060481
122-916.197754839.297668396000.00.0110.0-3.8944358.249210-1560.114059
222-5258.90136711318.419922396000.00.0120.0-193.061367377.103855-1219.741850
32215326.970703-25628.898438396000.00.0130.0102.888760-362.594239-1414.843426
422-241.947769-401.025604396000.00.0140.0-0.191501-1.469658-209.231939
\n", "
" ], "text/plain": [ " particle type [pdg_code] x [um] y [um] z [um] weight \\\n", "0 22 -971.176758 -817.280090 396000.0 0.01 \n", "1 22 -916.197754 839.297668 396000.0 0.01 \n", "2 22 -5258.901367 11318.419922 396000.0 0.01 \n", "3 22 15326.970703 -25628.898438 396000.0 0.01 \n", "4 22 -241.947769 -401.025604 396000.0 0.01 \n", "\n", " particle id time [ps] px [keV/c] py [keV/c] pz [keV/c] \n", "0 0 0.0 -8.855738 -10.508804 -3184.060481 \n", "1 1 0.0 -3.894435 8.249210 -1560.114059 \n", "2 2 0.0 -193.061367 377.103855 -1219.741850 \n", "3 3 0.0 102.888760 -362.594239 -1414.843426 \n", "4 4 0.0 -0.191501 -1.469658 -209.231939 " ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "PS.ps_data.head()" ] }, { "cell_type": "markdown", "id": "4e8a7b90", "metadata": {}, "source": [ "Note that this time, the actual values in the data **have** changed. Also note that all labels in graphs are automaticall updated, e.g.:" ] }, { "cell_type": "code", "execution_count": 10, "id": "78f4b114", "metadata": { "execution": { "iopub.execute_input": "2023-04-13T05:33:13.671830Z", "iopub.status.busy": "2023-04-13T05:33:13.671543Z", "iopub.status.idle": "2023-04-13T05:33:14.498558Z", "shell.execute_reply": "2023-04-13T05:33:14.497799Z" } }, "outputs": [ { "data": { "image/png": "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ZmambfsjR46of//+qlOnjvz9/dW6dWutXbtWkv2p2PT0dCUnJysnJ0cWi0UWi0VpaWmSpKioKM2aNUvDhg1TUFCQRo8eLUlavXq1WrduLV9fX0VFRemZZ56xqz0qKkpPPvmk7r33XgUGBioiIkKvvvqqbf2FCxeUkpKisLAw1apVS5GRkZo9e3Zldqckgh0AAHCjZcuWqWbNmtqxY4eee+45Pfvss1qyZIkkKSkpSV9//bXWrFmjbdu2yTAM9evXT4WFhZKk+++/XwUFBdq6dat2796tuXPnKiAgoMQxunXrpgULFigoKEjHjx/X8ePH9eCDD9rWz5s3T+3bt9e3336r6dOn65tvvtHdd9+t//3f/9Xu3buVlpam6dOna+nSpXb7feaZZ9S5c2d9++23GjdunMaOHat9+/ZJkp5//nmtWbNGq1at0r59+/T2228rKiqqcjrxdzgVCwAA3CY8PFzz58+XxWJRixYttHv3bs2fP1/x8fFas2aNMjIy1K1bN0nS22+/rfDwcH344Ye66667dPToUQ0YMEBt27aVJDVp0sThMXx8fBQcHCyLxeLw9Owtt9yiyZMn297fc889uvXWWzV9+nRJUvPmzbVnzx49/fTTSkpKsrXr16+fxo27dPp5ypQpmj9/vjZv3qwWLVro6NGjiomJUffu3WWxWBQZGemS/roaRuwAAIDb3HTTTbJYLLb3N998szIzM7Vnzx7VrFlTN954o21dvXr11KJFC/3www+SpPHjx+vxxx9XbGysUlNT9e9//9upGjp37mz3/ocfflBsbKzdstjYWGVmZqqoqMi2rF27drY/F4fGU6dOSbo02rhr1y61aNFC48eP1/r1652qrbwIdgAAoFoaOXKkDh06pKFDh2r37t3q3LmzFi5cWO79+Pv7O3V8b29vu/cWi0VWq1WS1KlTJ2VlZWnWrFn67bffdPfdd+vOO+906jjlQbADAABu8+WXX9q93759u2JiYnT99dfr4sWLdut//fVX7du3T9dff71tWXh4uO677z69//77mjx5shYvXuzwOD4+PnajbVfSqlUrZWRk2C3LyMhQ8+bNVaNGjbJ+NAUFBWngwIFavHixVq5cqdWrV+s///lPmbd3BtfYAQAAtzl69KgmTZqkMWPGaOfOnVq4cKGeeeYZxcTE6Pbbb9eoUaP0yiuvKDAwUFOnTlWjRo10++23S5ImTJig2267Tc2bN9fp06e1efNmtWrVyuFxoqKilJeXp08//VTt27dX7dq1Vbt2bYdtJ0+erC5dumjWrFkaOHCgtm3bpkWLFunFF8s+fcyzzz6rsLAwdezYUV5eXnrvvffUoEGDSp9LjxE7AADgNsOGDdNvv/2mrl276v7779df//pX25Qjb7zxhm644Qb96U9/0s033yzDMLR27VrbKdCioiLdf//9atWqlfr27avmzZuXGr66deum++67TwMHDlT9+vX11FNPlVpTp06dtGrVKq1YsUJt2rTRjBkzNHPmTLsbJ64mMDBQTz31lDp37qwuXbro8OHDWrt2rby8Kjd6WYziyWLglNzcXAUHBysnJ0dBQUHuLkfzN+x3aruJfZq7uBIAQFU4f/68srKyFB0drVq1arm7nHKJj49Xhw4dtGDBAneX4nZX+h7LkzU8bsTu2LFjWrBggRISEhQREWGbOXrAgAElzsMXy83N1aRJkxQZGWmbSPChhx5SXl6ew/ZWq1ULFy5U27Zt5efnp/r162vQoEE6dOhQZX40AACASuVxwW7hwoWaOHGiDh06pISEBE2ePFndu3fXP/7xD3Xr1k0rV660a5+fn6+4uDjNnz9fLVu21MSJE9WiRQvNmzdPt9xyi86fP1/iGGPGjNH48eNlGIbGjx+vvn376v3331eXLl3sZrQGAACoTjzu5omuXbsqPT1dcXFxdss/++wz3XrrrRo7dqzuuOMO+fr6SpKeeuop7dq1S1OmTNGcOXNs7adOnaq5c+dq/vz5mjZtmm355s2btWTJEvXs2VMbNmywPQ9u8ODB6tevn1JSUrRu3boq+KQAAFzb0tPT3V2C6XjciN1f/vKXEqFOknr06KFevXrp9OnT2r17tyTJMAwtWbJEAQEBttmhi02fPl0BAQG2x5IUK74NetasWXYP+b3tttsUHx+v9evX6+jRo67+WAAAAJXO44LdlRTfBVOz5qWBxszMTP3000+KjY0tMbmgv7+/YmNjdejQIWVnZ9uWp6en29ZdLjExUZK0ZcuWyvoIAAAAlabaBLujR49q48aNCgsLsz0Trvh6uJiYGIfbFC8vbpefn6/jx48rOjra4QSDl7d3pKCgQLm5uXYvAADcjUkuqjdXfX/VItgVFhZq6NChKigo0Ny5c22hLCcnR5IUHBzscLviW4KL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ZMkSBQQEaPr06Xbrpk+frhdeeEFLliyxC3aLFy+WJM2aNcsW6iTptttuU3x8vNavX6+jR48qIiLC6foBAADcoczB7sYbb7zi+l9++UWPPfaYFi9erAsXLqh79+6aO3duhQu8kszMTP30009KTEws8Ugzf39/xcbGat26dcrOzlZ4eLgkKT093bbucomJiUpPT9eWLVs0dOjQSq0dAADA1Sp888S5c+c0c+ZMNW3aVC+88IJiYmL0j3/8Q1u3btXNN9/sihpLlZmZKUmlXhNXvLy4XX5+vo4fP67o6GjVqFHjqu0dKSgoUG5urt0LAADAEzgd7IqKivTiiy+qadOmSktLU3BwsF577TV999136t+/vytrLFVOTo4kKTg42OH6oKAgu3blbe/I7NmzFRwcbHsVjwQCAAC4m1PB7r333tP111+vBx54QAUFBZozZ47279+v5ORkeXl55AwqLjNt2jTl5OTYXtnZ2e4uCQAAQFI5rrGTLl2fNmXKFH399dfy8fHR5MmT9cgjjygkJKSSyruy4pG30kbYik+TFrcrb3tHfH195evr61zBAAAAlajMwe62227T+vXr5eXlpeHDh2vmzJlq3LhxZdZ2VVe7Ju7ya/D8/f0VFhamrKwsFRUVlbjO7mrX7AEAAHiyMge7devWyWKxKCIiQidOnNDo0aOvuo3FYtHHH39coQKvJCYmRg0bNlRGRoby8/Pt7ozNz89XRkaGoqOj7a6Di4uL04oVK5SRkaGePXva7a94/rrLlwMAAFQH5ToVaxiGsrKylJWVVab2FovFqaLKymKxaOTIkZo5c6ZmzZplN0HxrFmzlJeXp0ceecRum9GjR2vFihWaPn263QTFn3zyidLT05WQkKDIyMhKrRtXxtMoAABwjsUwDKMsDa/0WK8rcSYkLVmyRJ9//rkkaffu3dq5c6diY2PVrFkzSVL37t01cuRISZdG5mJjY/Xdd98pISFBnTp10s6dO7V+/Xp16dJFW7ZskZ+fn93+R40aZXuk2B//+EcdP35cK1euVEBAgLZt26bmzcseInJzcxUcHKycnBzbXbVVxVEAMiuCHQDgWlWerFHmYFeVkpKStGzZslLXDx8+3O4RZzk5OUpLS9Pq1at14sQJhYWF6a677lJqaqoCAwNLbG+1WrVo0SK9+uqrOnDggAICAtS7d2898cQTatq0ablq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V4fb+vr6ytfX125ZSEhIpdR5uaCgII/9S2dm9Lv70PfuQ9+7B/3uPp7e91cbqSvmVcl1eKS4uDhJ0vr160usW7dunV0bAACA6uKaDHa33nqrmjRponfeeUe7du2yLc/JydGTTz4pHx8fDRs2zH0FAgAAOOGaPBVbs2ZNLVmyRImJierZs6fdI8WOHDmiefPmKSoqyt1l2vj6+io1NbXEKWBULvrdfeh796Hv3YN+dx+z9b3FKMu9sya1Y8cOpaam6osvvlBhYaHatm2rSZMmaeDAge4uDQAAoNyu6WAHAABgJtfkNXYAAABmRLADAAAwCYKdB/vqq6/Ur18/hYSEyN/fXzfddJNWrVrl7rI8zrFjx7RgwQIlJCQoIiJCPj4+atCggQYMGKAvv/zS4Ta5ubmaNGmSIiMj5evrq6ioKD300EPKy3P8CCWr1aqFCxeqbdu28vPzU/369TVo0CAdOnSo1LrWrVunuLg4BQYGKigoSL169dKnn37qks/syebOnSuLxSKLxaLt27eXWE/fu9YHH3ygPn36qF69eqpVq5aio6M1aNAgZWdn27Wj313HMAy9//776tWrl8LCwlS7dm21aNFCY8aMcdg/9H35LF++XGPGjFHnzp3l6+sri8WipUuXltreE/t3//79uvvuuxUaGio/Pz+1b99eL730UpkeCVZhBjzSpk2bDG9vbyMwMNAYNWqUMWnSJCMyMtKQZMybN8/d5XmUKVOmGJKMpk2bGiNGjDCmTp1qDBgwwKhRo4bh5eVlrFixwq59Xl6e0aFDB0OSkZCQYEyZMsVISEgwJBldunQxfvvttxLHGDlypCHJaN26tfHwww8bQ4YMMXx8fIy6desa+/fvL9H+rbfeMiQZ9evXN1JSUoyUlBSjfv36hsViMd57771K6wt32717t+Hr62v4+/sbkoxt27bZrafvXcdqtRqjR4+2/d0fN26cMWXKFGPo0KFGRESE8dlnn9na0u+uNWnSJEOSERYWZtx3333Gww8/bCQmJhoWi8UIDAw0du/ebWtL35df8c+60NBQ25/feOMNh209sX+///57Izg42PDx8TGGDBliPPzww0br1q0NSUZKSkqF++dqCHYeqLCw0GjatKnh6+trfPvtt7blZ86cMZo3b274+PgYhw8fdl+BHmb16tVGenp6ieVbt241vL29jTp16hjnz5+3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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "PS.plot.energy_hist_1D()" ] }, { "cell_type": "markdown", "id": "5dad84b7", "metadata": {}, "source": [ "Whenever you use the `set_units` method, the data will be reset using the `reset_phase_space` method. This means the data is reduced to only the [required columns](https://bwheelz36.github.io/ParticlePhaseSpace/phase_space_format.html), so that any other quantities must be recalculated following a unit change\n", "\n", "## Defining new unit sets\n", "\n", "If the unit set you want to work with is not already listed in the `available_units` above, you can easily create new unit sets.\n", "The **highly** advised way to do this is to add your new unit set to the `__init__` method of `ParticlePhaseSpace.__unit_config__.ParticlePhaseSpaceUnits` by copying then updating the definition of the existing unit_sets. This is because unit sets defined in this way are subject to automatic testing to ensure for instance consistency between dimensionless quantities. However, if you really want you can also do it manually as below. Note that this is not the preferred method but it will work!" ] }, { "cell_type": "code", "execution_count": 11, "id": "b05adbdb", "metadata": { "execution": { "iopub.execute_input": "2023-04-13T05:33:14.502710Z", "iopub.status.busy": "2023-04-13T05:33:14.502144Z", "iopub.status.idle": "2023-04-13T05:33:14.508013Z", "shell.execute_reply": "2023-04-13T05:33:14.507261Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "cm_keV:\n", "=================\n", "Length: cm,\n", "Energy: keV,\n", "Momentum: keV/c\n", "Velocity: kmph\n", "Mass: keV/c^2\n" ] } ], "source": [ "from ParticlePhaseSpace.__unit_config__ import UnitSet, _unit\n", "cm_keV = UnitSet(label='cm_keV',\n", " length_units=_unit('cm', 1e-1),\n", " energy_units=_unit('keV', 1e3),\n", " momentum_units=_unit('keV/c', 1e3),\n", " time_units=_unit('ns', 1e-3),\n", " mass_units=_unit('keV/c^2', 1e3),\n", " velocity_units=_unit('kmph', 1/3.6))\n", "print(cm_keV)" ] }, { "cell_type": "markdown", "id": "7cf344e7", "metadata": {}, "source": [ "- In a `UnitSet`, the `label` tag is the name of the UnitSet and is mainly used internally to compare unit sets.\n", "- every other quantity is a `_unit` - each `_unit` comprises a label and a conversion factor. the label is self explanatory. THe conversion factor is the converion which would be needed to convert that quantity to the default unit set of `mm_MeV`. For example, the cm to mm conversion is defined as:" ] }, { "cell_type": "code", "execution_count": 12, "id": "2516705a", "metadata": { "execution": { "iopub.execute_input": "2023-04-13T05:33:14.511630Z", "iopub.status.busy": "2023-04-13T05:33:14.510935Z", "iopub.status.idle": "2023-04-13T05:33:14.514691Z", "shell.execute_reply": "2023-04-13T05:33:14.513996Z" } }, "outputs": [], "source": [ "value_in_mm = 1\n", "value_in_cm = .1\n", "cm_conversion = value_in_cm/value_in_mm" ] }, { "cell_type": "markdown", "id": "902000bc", "metadata": {}, "source": [ "> Be very careful about defining unit sets that don't match the conventions of the existing unit sets. The units will defintely work as long as you are changing the **value** of a given unit type, but not if you completely change the type of unit. E.g., defining mass in kg instead of some form of eV/c^2 will not work without substantialy edits to the code." ] }, { "cell_type": "code", "execution_count": null, "id": "a2ac0dd6", "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.5" } }, "nbformat": 4, "nbformat_minor": 5 }