diff --git a/.github/workflows/test_examples.yml b/.github/workflows/test_examples.yml index 67d49fd4c..62ae5a09a 100644 --- a/.github/workflows/test_examples.yml +++ b/.github/workflows/test_examples.yml @@ -67,6 +67,8 @@ jobs: [ "$file" = "MHD_modelsipynb.py" ] || [ "$file" = "density_grid_samplingipynb.py" ] || [ "$file" = "lensing_crv4ipynb.py" ] || + [ "$file" = "interrupt_candidateVectoripynb.py" ] || + [ "$file" = "interrupt_sourceipynb.py" ] || [ "$file" = "lensing_mapsv4ipynb.py" ]; then echo "skip file $file" else diff --git a/doc/index.rst b/doc/index.rst index f398dca5b..b989cd1c5 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -31,6 +31,7 @@ Contents pages/acceleration.rst pages/extending_crpropa.rst pages/example_notebooks/propagation_comparison/Propagation_Comparison_CK_BP.ipynb + pages/interrupting-simulations.rst pages/AdditionalResources.rst diff --git a/doc/pages/example_notebooks/interrupting_simulations/interrupt_candidateVector.ipynb b/doc/pages/example_notebooks/interrupting_simulations/interrupt_candidateVector.ipynb new file mode 100644 index 000000000..bd6f3b447 --- /dev/null +++ b/doc/pages/example_notebooks/interrupting_simulations/interrupt_candidateVector.ipynb @@ -0,0 +1,396 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# interrupting and continuing of a simulation with a candidate Vector\n", + "\n", + "In this example the simulation uses a `candidateVector`, a predefined set of candidates, as source. The test simulation is a simple 1D propagation of particles in the energy range of $10^{17} eV$ to $10^{21} eV$. The candidates are order in energy, for an easier overview of the state of the simulation. No other propagation effects are considered. \n", + "\n", + "Two sets of simulation, one full simulation and one which is interrupted and continued, are compared. The candidate ID will be used as continues number to check, that all candidates are reaching the final observer and nothing is lost. " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from crpropa import * \n", + "import numpy as np \n", + "import os \n", + "from multiprocessing import cpu_count" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## simulation setup\n", + "\n", + "The candidate energies are the same for both simulation cases (with / without interrupting). " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# create candidate vector with increasing energies\n", + "lg_E_min = 17\n", + "lg_E_max = 21\n", + "lgE = np.random.uniform(lg_E_min, lg_E_max, 100_000)\n", + "lgE.sort()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def init_candidate_vector():\n", + " \"\"\" initilize the candidate vector. Has to be done before every simulation. \"\"\"\n", + " cv = CandidateVector()\n", + " for i, _e in enumerate(lgE): \n", + " c = Candidate(i, 10**_e * eV, Vector3d(1 * Gpc, 0, 0), Vector3d(-1, 0, 0)) \n", + " cv.push_back(CandidateRefPtr(c))\n", + " return cv" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### full simulation (no interruption)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "crpropa::ModuleList: Number of Threads: 12\n", + "Run ModuleList\n", + " Started Thu Sep 5 12:28:34 2024 : [\u001b[1;32m Finished \u001b[0m] 100% Needed: 00:00:48 - Finished at Thu Sep 5 12:29:22 2024\n", + "\r" + ] + } + ], + "source": [ + "# general setup \n", + "def get_sim(filename):\n", + " \"\"\" returns a modulelist to ensure running the same modules in each case \"\"\"\n", + " \n", + " sim = ModuleList() \n", + " sim.add(SimplePropagation(1 * kpc, 10 * kpc)) # choose small steps to ensure long simulations \n", + "\n", + " obs = Observer() \n", + " obs.add(Observer1D())\n", + " out = TextOutput(filename) \n", + " obs.onDetection(out) \n", + " sim.add(obs)\n", + "\n", + " sim.setShowProgress(True)\n", + " return sim, out\n", + "\n", + "os.makedirs(\"cand_vector\", exist_ok=True)\n", + "sim, out = get_sim(\"cand_vector/full.txt\") \n", + "cv = init_candidate_vector()\n", + "sim.run(cv)\n", + "out.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### simulation with interruption\n", + "\n", + "This simulation is interrupted after some time. This process has to be done manually." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "crpropa::ModuleList: Number of Threads: 12\n", + "Run ModuleList\n", + " Started Thu Sep 5 12:29:26 2024 : [====> ] 41% Finish in: 00:00:28 \r" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "crpropa::ModuleList: Signal 2 (SIGINT/SIGTERM) received\n", + "############################################################################\n", + "#\tInterrupted CRPropa simulation \n", + "# in total 58477 Candidates have not been started.\n", + "# the indicies of the vector haven been written to to output file. \n", + "############################################################################\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[5], line 8\u001b[0m\n\u001b[1;32m 6\u001b[0m sim\u001b[38;5;241m.\u001b[39msetShowProgress(\u001b[38;5;28;01mTrue\u001b[39;00m) \n\u001b[1;32m 7\u001b[0m cv \u001b[38;5;241m=\u001b[39m init_candidate_vector()\n\u001b[0;32m----> 8\u001b[0m sim\u001b[38;5;241m.\u001b[39mrun(cv)\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "sim, out = get_sim(\"cand_vector/interrupted.txt\")\n", + "\n", + "out_interrupt = TextOutput(\"cand_vector/on_interruption.txt\")\n", + "sim.setInterruptAction(out_interrupt)\n", + "\n", + "sim.setShowProgress(True) \n", + "cv = init_candidate_vector()\n", + "sim.run(cv)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "out.close() # closing the output file to avoid data loss " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### reloading and reruning the simulation" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "number of indices read from file: 58477\n" + ] + } + ], + "source": [ + "# load candidates from interrupted simulation \n", + "\n", + "file = \"cand_vector/on_interruption.txt\"\n", + "pc = ParticleCollector() \n", + "pc.load(file)\n", + "\n", + "# expected size of particles should be equal to the number of cores \n", + "assert pc.size() <= cpu_count() , f\"the number of loaded particles ({pc.size()}) must be lower or equal to the number of cores ({cpu_count()})\"\n", + "\n", + "# load indicies of not started candidates\n", + "with open(file, \"r\") as f: \n", + " line = f.readlines()[-1]\n", + " indices = np.array(line.strip(\"\\n\").split(\"\\t\")[1:-1], dtype= int)\n", + "\n", + "print(\"number of indices read from file:\", len(indices))" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "# create a new candidate vector with the missing particles \n", + "cv_new = pc.getContainer()\n", + "cv = init_candidate_vector()\n", + "for i, c in enumerate(cv): \n", + " if i in indices: \n", + " # accept candidates which were not started\n", + " cv_new.push_back(c)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "crpropa::ModuleList: Number of Threads: 12\n", + "Run ModuleList\n", + " Started Thu Sep 5 12:30:00 2024 : [\u001b[1;32m Finished \u001b[0m] 100% Needed: 00:00:30 - Finished at Thu Sep 5 12:30:30 2024\n", + "\r" + ] + } + ], + "source": [ + "# run the simulation with the missing candidates \n", + "sim, out = get_sim(\"cand_vector/continued.txt\")\n", + "sim.run(cv_new)\n", + "out.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## read data from different simulations\n", + "\n", + "The data from both simulation sets are loaded and compared" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd \n", + "import matplotlib.pyplot as plt \n", + "\n", + "def read_crp(filename): \n", + " \"\"\" read a crpropa output file \"\"\"\n", + " \n", + " with open(filename) as f: \n", + " names = f.readline().strip(\"\\n\").split(\"\\t\")[1:]\n", + " \n", + " return pd.read_csv(filename, names = names, delimiter = \"\\t\", comment=\"#\")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "the splited simulation has the length of 41518 and 58482\n" + ] + } + ], + "source": [ + "df_full = read_crp(\"cand_vector/full.txt\")\n", + "df_first_half = read_crp(\"cand_vector/interrupted.txt\")\n", + "df_second_half = read_crp(\"cand_vector/continued.txt\")\n", + "print(f\"the splited simulation has the length of {len(df_first_half)} and {len(df_second_half)}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### check ID number of particles \n", + "\n", + "Checking that both simulation outputs contain all particles. The particle ID is the number of the particles in the orignial candidate vector." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "id_list_full = list(df_full.ID)\n", + "id_list_full.sort() \n", + "assert np.all(id_list_full == np.arange(100_000))" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "id_list_continued = list(df_first_half.ID) + list(df_second_half.ID)\n", + "id_list_continued.sort() \n", + "assert np.all(id_list_continued == np.arange(100_000))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### energy distribution of the arriving particles" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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Y4caNmyoiy66SJMmTVLLli2PG/MXX3yhCy+8MKzYAQAAANQeEUuqNm/erP79++vXX3/VOeeco927dyszM1MjR47U1q1btWbNGvl8Pg0bNkxJSUlhn2/SpEl6//33q7RPfn6+Bg8erBUrVqh58+YaPny4tm3bpunTp2vu3LlasWKF2rdvX+H+f/nLX7Rjxw7dfvvt4YYPAABQZzkdTl3Q9oKisktq2z9YYTDdv67x+r1yN1xaVB4su85OiljUTz75pLKzszV9+nTdcMMNGj16tDIzM/X6669Lkn744Qf97ne/08aNG7VixYqwz3fWWWepe/fu6t27t3r37q127dqpoKDguDGuWLFCZ511lhYsWKDExERJ0tSpU3XPPfdozJgxWrJkSbn7rly5UhMmTNDDDz+s0047Lez4AQAA6qoYZ4ymDppasmH0POuCgaV8pk+xTecXlR+xOJrqM8wI3ca6devWql+/vr755htJ0ujRo/Wvf/2r1DC/rKwstW/fXqNGjdJf/vKXSJw2JDY2VgUFBRUO/yssLFSTJk106NAhrVmzRqeffnqp+h49emj9+vX68ssv1atXr1J127ZtU79+/ZSamqr//Oc/Mgwj7Hi7desmSdqwYUPYxwIAAADs6EButga9c7YkacmI5UqOr2dZLOH8Po9YH+vPP/+srl27hp673W5JwSF3xZKSkjRo0CDNnTs3UqettGXLlunQoUPq0KFDmYRKkq666ipJwRX/jpSVlaWhQ4eqXbt2mjFjRkQSKgAAAAC1R8SG/zVs2LDU8LuGDRtKkrZv364uXbqUavvzzz9H6rSVVnxvqTPOOKPc+uLt69evD20rLCzUFVdcodzcXH3yySeKi4ur8nmLM96jbdmyRR06dKjy8QAAAOwu15urvm/0lSStHLFY8X/pE6wY+7XkSbAwMqB6ItZTlZKSou3bt4ee9+zZU6Zp6j//+U9o2/79+7VkyRK1adMmUqettB07dkiSWrVqVW598fYjX8Ptt9+upUuX6pFHHlFmZqZWrFihFStW6Kuvvqr5gAEAAOqK3APBB2BTEeupGjJkiJ588klt375dbdu21WWXXaZGjRrpiSee0MaNG9WyZUu99957OnTokO68885InbbSDh8+LEmKj48vtz4hIXhVJDs7O7Rt0aJFCgQC+t3vfleqbdu2bbVt27ZKnbeiMZkV9WAB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FkdSffHx8Tr55JOtDsNyvA8AUMf5C6Q3rg6WH/yJpAq2xPA/2ErxULLFixdLklJSUmQYRql5T+3atavwZq3RmL+zfPlypaWlqW3btoqJiVGzZs3Up08fTZgwQYcPHz5uLEcOl1u9erUuvvhiJSUlqWHDhrr66qtDCWVOTo7uv/9+tWvXTrGxsTr11FM1c+bMMvG89tprMgxDjz/+eLnxDho0SIZhaNu2bcd9baZp6s0339TIkSPVuXNnJSQkqF69eurTp49eeuklBQKBUu3btWuniRMnSpJGjx4d+rc68t/rWP8mPp9PL7zwgnr16qXExEQlJiaqT58+evnll+X3+4/5WmbPnq1+/fopISFBDRs21LXXXht67wAAACKJSwGwlZ49e+qGG27QRx99pL179+rKK69UYmKiJKlZs2YWRyfNmTNHaWlpMk1Tffr00dlnn62srCxt3rxZzzzzjG699dZQvMezcuVK3XrrrTr11FN14YUXas2aNXrnnXe0bt06rVq1ShdccIG2b9+u1NRU7d+/X0uXLtXVV1+t+fPn68ILL6yR11dQUKBRo0YpOTlZXbt21RlnnKEDBw5o+fLluuOOO7Rq1apSc6euuuoqLVq0SOvWrdM555yjjh07huqO9+/l9/s1fPhwffjhhzrppJN0wQUXyDRNffLJJ7r99tu1cOFCzZw5Uw5H2WtDL730kqZOnaoBAwbokksu0cqVK/XWW29p9erVWrduneLi7HtzQQAAcOIhqbIx0zSV5y17tf5EFud2VtiLVBlpaWlKS0vToEGDtHfvXj377LNRWaGusp599lkFAgHNnDlTV155Zam6L774QsnJyZU+1l//+le9/PLLuvXWWyVJXq9Xl1xyiRYtWqSzzz5bzZo109atW5WQkCBJ+uc//6kbb7xRTz31VI0lVS6XS7NmzdLQoUPldpes0LRv3z5dcsklmjFjhsaMGaPU1FRJwffj8ccf17p163TjjTdWqYcwIyNDH374obp166aPP/5YTZs2lSTt3r1b5557rmbNmqWXXnpJd955Z5l9X3zxRX322Wc666yzJEm5ubm64IILtHz5cr355psaM2ZMGO8CAKCqPE6Pnh34bKgMFDMkBQqTQmW7IqmysTyvX10f/a/VYVTJxicuVLyn9n7s9u3bJ0k6//zzy9T17t27Ssfq379/KKGSJLfbrd//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h0N/+9vfdNJJJ4W2nXnmmbr44os1d+5cffnll6GlyGfOnKl9+/YpNTVVo0ePDrU3DEOTJk3S66+/rp07dx73vTtaVWKQpIsvvrjMMWJiYpSRkaFXX31V77//vh599NEqxwEAqMNMU/LmBsvueInh4LAh5lTBdnr16iVJuuOOO7RkyRL5fL4K2y5YsECSdMUVV5RbP2DAAEnSqlWrJEk+n09LliyRJN18883HjeWzzz6TJF199dVyu8ved+P6668v1e5Ibdu2VZcuXcps79y5sySVmhtWvP/IkSPLtHe73dUeQleVGIrt2rVLf/3rXzV27FiNGTNG6enpuu222+TxeLR58+ZqxQEAqMO8udJTLYKP4uQKsBl6qmqBlaMqXqjA6XCWer7k6iUVtnUYpXPsj678qNJtZ6fNrnBxhUgvQHDffffp888/15IlS3TuuecqMTFRZ511loYOHar09HTVr18/1Hbbtm2SpJYtWx7zmPv375ckHThwQHl5eWrYsKEaNGhw3Fh++inYO9euXbty64u379q1q0xdq1atyt2nXr16kqSCgoIy52nbtu0xz1NVVYlBkqZOnaoJEybI6/VW63wAAAC1EUlVLRDvjre8bZwrrtJtw3XSSSfpk08+0bJlyzRnzhwtWbJEn3zyiRYuXKjJkyfrs88+U6dOnSRJgUBw2dYbbrjhmMfs27fiIZThOFZC6XBY31FclRhWrFihe+65R/Xr19fzzz+vQYMGqVmzZoqJiZEktWjRotyeLQAAgNqOpAq2ZBiG+vfvr/79+0uSfv75Z40dO1ZvvvmmHnroIb399tuSgj0xW7Zs0Z///GclJycf97iNGjVSXFycDh48qKysLCUlJR2zfYsWLSRJ27dvL7e+sj1lx1O8mmFF56loeyTNmjVLkvTHP/6xTJKal5enPXv21HgMAAB7cjlcuqbLNaFyhQpzJcMpuWOjFBkQGdZfKgcioEmTJnr88cclBe9hVeyCCy6QVJIQHI/T6QwtzPD3v//9uO2L52S988478vvLLgP673//u1S76irevzhZPJLP59O7774b1vEr45dfgouWlDdk8J133qlw+CcAAB6nRw/3e1gP93tYHqen4obPdpRmHX9OM2qPGGeMDv9wvw7/cL9inDFWh1NtJFWwnb/+9a/KzMwss/3DDz+UJLVu3Tq07Z577lFcXJzuvfde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ztHf//53y+KipwqV8t///leXXHJJKKGSpBEjRmjz5s3aunWrhZEBgD0UJ1QAgOo7MqGSgt+tp556qjIzMy2KqCgOS8+OiFi9erWefvppXXHFFWrVqpUMw5BhGMfdLy8vT48++qg6d+6s2NhYtWjRQmPGjNGuXbvKtP3+++918sknl9pW/Py7776LzAsBAItE43sUAGo7K75L/X6/vvjiC3Xs2DESL6HaXJaeHRExadIkvf/++1XaJz8/X4MHD9aKFSvUvHlzDR8+XNu2bdP06dM1d+5crVixQu3btw+1/+WXX5SUlFTqGA0aNAjVAYCdReN7FABqOyu+S//yl79ox44duv3228MNPyz0VNUCZ511lh555BF98MEH2r17t2JiYo67z5NPPqkVK1borLPO0vfff6///Oc/Wrlypf785z9r3759GjNmTBQiB4ATA9+jABC+aH+Xrly5UhMmTNDDDz+s0047LZIvpcpYqKIWio2NVUFBgSr6py0sLFSTJk106NAhrVmzRqeffnqp+h49emj9+vX68ssv1atXL0lSkyZNdM8992j8+PGhdnv27FHz5s314Ycf6uKLL665FwQAUVYT36NHYqEKAHVBTX6Xbtu2Tf369VNqaqr+85//VGqYYU2ip6oOWrZsmQ4dOqQOHTqU+fBK0lVXXSVJmjNnTmhb586d9e2335ZqV/y8S5cuNRgtAJx4qvM9CgAorbrfpVlZWRo6dKjatWunGTNmWJ5QSSRVdVLxOv5nnHFGufXF29evXx/aduGFF+rDDz9UXl5eaNvMmTPVqVMn5gwAqHOq8z0KACitOt+lhYWFuuKKK5Sbm6v3339fcXFxNR9oJbBQRR20Y8cOSVKrVq3KrS/evn379tC2W2+9VdOmTdPVV1+tsWPH6quvvtLf/vY3vfrqqzUfMACcYKrzPbpv3z4tXbpUkpSbm6tvv/1WM2fOVEJCAkOoAdRJ1fkuvf3227V06VK98soryszMDC2lHhMTU25vV7SQVNVBhw8flqRS95w6UkJCgiQpOzs7tK1x48ZauHCh7rzzTg0dOlRNmzbV1KlTdf3119d8wABwgqnO9+iGDRs0YsSI0PN3331X7777rtq2batt27bVXLAAcIKqznfpokWLFAgE9Lvf/a5UW6u/S0mqUGk9e/bU559/bnUYAGBLgwYNqnCyNgCgck7Ui1DM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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "e_bins = np.logspace(-1, 3, 101) # in EeV as default output unit \n", + "dE = np.diff(e_bins) \n", + "\n", + "dNdE_full = np.histogram(df_full.E, bins = e_bins)[0] \n", + "dNdE_first = np.histogram(df_first_half.E, e_bins)[0] \n", + "dNdE_second = np.histogram(df_second_half.E, e_bins)[0]\n", + "assert np.all(dNdE_full == (dNdE_first + dNdE_second))\n", + "\n", + "plt.figure(dpi = 150) \n", + "plt.stairs(dNdE_full, label = \"full simulation\")\n", + "plt.stairs(dNdE_first, label = \"first half\", ls = \"--\")\n", + "plt.stairs(dNdE_second, label = \"second half\", ls = \"--\")\n", + "plt.loglog()\n", + "plt.legend()\n", + "plt.ylabel(\"# particles\")\n", + "plt.xlabel(\"Energy [GeV]\")\n", + "plt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "CRP_Interrupt", + "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.12.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/doc/pages/example_notebooks/interrupting_simulations/interrupt_source.ipynb b/doc/pages/example_notebooks/interrupting_simulations/interrupt_source.ipynb new file mode 100644 index 000000000..079967089 --- /dev/null +++ b/doc/pages/example_notebooks/interrupting_simulations/interrupt_source.ipynb @@ -0,0 +1,355 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# interrupting and continuing of a simulation with a source\n", + "\n", + "In this example the simulation uses a `sourceInterface` and allows for the production of secondaries.\n", + "\n", + "The source emmits a limited number of photons ($n = 100$) with an energy $E = 100 \\, \\mathrm{TeV}$ at a distance of $D = 50 \\, \\mathrm{Mpc}$. The photons are propagated in 1D to the observer, taking interactions with the CMB and EBL into account. \n", + "\n", + "The interrupted simulation contains three different parts: (1) the candidates arriving at the observer before the simulation is interrupted, (2) the candidates which are in the simulation at the point of interruption and (3) the particles which have not been started before the interruption. In the case of secondaries the number of particles which are contained in the simulation is much larger than the number of cores. \n", + "\n", + "In the end, the SED of the arriving photons is compared. Small differences between the full and the interrupted simulation are expected due to the Monte-Carlo nature of the interactions. " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from crpropa import * \n", + "import pandas as pd \n", + "import numpy as np \n", + "import matplotlib.pyplot as plt \n", + "import os " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def read_crp(file): \n", + " with open(file, \"r\") as f: \n", + " names = f.readline().strip(\"\\n\").split(\"\\t\")[1:]\n", + " \n", + " return pd.read_csv(file, delimiter=\"\\t\", comment =\"#\", names = names)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## full simulation" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "crpropa::ModuleList: Number of Threads: 12\n", + "Run ModuleList\n", + " Started Thu Sep 5 14:07:59 2024 : [\u001b[1;32m Finished \u001b[0m] 100% Needed: 00:01:39 - Finished at Thu Sep 5 14:09:38 2024\n", + "\r" + ] + } + ], + "source": [ + "n_sim = int(100)\n", + "\n", + "def get_sim(file):\n", + " sim = ModuleList() \n", + " sim.add(SimplePropagation())\n", + "\n", + " # add EM interactions \n", + " photon_fields = [CMB(), IRB_Gilmore12()]\n", + " for field in photon_fields:\n", + " sim.add(EMInverseComptonScattering(field, True)) # allow photons\n", + " sim.add(EMPairProduction(field, True)) # allow electrons \n", + " sim.add(EMDoublePairProduction(field, True))\n", + " sim.add(EMTripletPairProduction(field, True))\n", + "\n", + " sim.add(MinimumEnergy(10 * GeV))\n", + "\n", + " sub_dir = \"cascade/\"\n", + " os.makedirs(sub_dir, exist_ok=True)\n", + " out = TextOutput(f\"{sub_dir}/{file}\")\n", + " out.setEnergyScale(TeV)\n", + " obs = Observer() \n", + " obs.add(Observer1D())\n", + " obs.add(ObserverInactiveVeto())\n", + " obs.onDetection(out)\n", + " sim.add(obs) \n", + "\n", + " source = Source() \n", + " source.add(SourceParticleType(22))\n", + " source.add(SourcePosition(Vector3d(50 * Mpc, 0, 0)))\n", + " source.add(SourceEnergy(100 * TeV))\n", + "\n", + " sim.setShowProgress(True)\n", + " return source, sim, out\n", + "\n", + "source, sim, out = get_sim(\"full.txt\")\n", + "sim.run(source, n_sim)\n", + "out.close()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# load data \n", + "df_full = read_crp(\"cascade/full.txt\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## interrupted simulation" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "crpropa::ModuleList: Number of Threads: 12\n", + "Run ModuleList\n", + " Started Thu Sep 5 14:09:39 2024 : [===> ] 30% Finish in: 00:01:07 \r" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "crpropa::ModuleList: Signal 2 (SIGINT/SIGTERM) received\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Started Thu Sep 5 14:09:39 2024 : [===> ] 31% Finish in: 00:01:11 \r" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "############################################################################\n", + "# Interrupted CRPropa simulation \n", + "# Number of not started candidates from source: 69\n", + "############################################################################\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[5], line 6\u001b[0m\n\u001b[1;32m 3\u001b[0m interrupt_out \u001b[38;5;241m=\u001b[39m TextOutput(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcascade/on_interrupt.txt\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 4\u001b[0m sim\u001b[38;5;241m.\u001b[39msetInterruptAction(interrupt_out)\n\u001b[0;32m----> 6\u001b[0m sim\u001b[38;5;241m.\u001b[39mrun(source, n_sim)\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "source, sim, out = get_sim(\"interrupt_1.txt\")\n", + "\n", + "interrupt_out = TextOutput(f\"cascade/on_interrupt.txt\")\n", + "sim.setInterruptAction(interrupt_out)\n", + "\n", + "sim.run(source, n_sim)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# close datafile to avoid data loss\n", + "out.close()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "df_1 = read_crp(f\"cascade/interrupt_1.txt\") # at state of interruption" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "crpropa::ModuleList: Number of Threads: 12\n", + "Run ModuleList\n", + " Started Thu Sep 5 14:10:30 2024 : [\u001b[1;32m Finished \u001b[0m] 100% Needed: 00:01:08 - Finished at Thu Sep 5 14:11:38 2024\n", + "\r" + ] + } + ], + "source": [ + "n_missing = 69 # taken from output -> will be different on each try\n", + "\n", + "source, sim, out = get_sim(\"interrupt_2.txt\")\n", + "sim.run(source, n_missing) # use modulelist and source as previously defined\n", + "out.close()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "df_2 = read_crp(f\"cascade/interrupt_2.txt\")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "number of loaded particles: 5690\n", + "crpropa::ModuleList: Number of Threads: 12\n", + "Run ModuleList\n", + " Started Thu Sep 5 14:11:38 2024 : [\u001b[1;32m Finished \u001b[0m] 100% Needed: 00:00:00 - Finished at Thu Sep 5 14:11:38 2024\n", + "\r" + ] + } + ], + "source": [ + "# close outputfile before reading \n", + "interrupt_out.close()\n", + "\n", + "pc = ParticleCollector()\n", + "pc.load(\"cascade/on_interrupt.txt\")\n", + "\n", + "print(\"number of loaded particles:\", pc.size())\n", + "\n", + "# run simulation with missing particles\n", + "source, sim, out = get_sim(\"interrupt_3.txt\")\n", + "sim.run(pc.getContainer())\n", + "out.close()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "try:\n", + " df_3 = read_crp(\"cascade/interrupt_3.txt\")\n", + "except: \n", + " # it can happen that all particles from the interruption time are cascaded to lower energies than the minimum energy\n", + " # in this case the dataset will be empty\n", + " print(\"no data from interrupt_3.txt\")\n", + " df_3 = pd.DataFrame({\"E\":[], \"ID\":[]})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## show spectrum at earth" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA5IAAALgCAYAAADm7EhsAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAABcSAAAXEgFnn9JSAADkbElEQVR4nOzdd3hT5dsH8G9WZ7rooC0UWlqgrFKgRRBkyXAgS9woBUVFFP05oIrK8lXAAaKC4sQFKhsUZINCoVSW7DJKWQVa6J5pzvtHTGjapM05SZO0/X6uqxf05IwnaXJy7vM8z33LBEEQQERERERERGQhuaMbQERERERERHULA0kiIiIiIiIShYEkERERERERicJAkoiIiIiIiERhIElERERERESiMJAkIiIiIiIiURhIEhERERERkSgMJImIiIiIiEgUBpJEREREREQkCgNJIiIiIiIiEoWBJBEREREREYmidHQDaosgCBAEwdHNICIiIiIicgoymQwymcwm+6pXgWR5eTmysrKQl5eH0tJSRzeHiIiIiIjIqbi4uMDLywv+/v5QKBSS9yMT6km3XXl5OdLT01FcXOzophARERERETk1Nzc3NGvWTHIwWW96JLOyslBcXAyFQoHGjRvD09MTcjmngBIREREREQGAVqtFQUEBrl69iuLiYmRlZSEoKEjSvupNIJmXlwcAaNy4MXx8fBzcGiIiIiIiIucil8sNsdLly5eRl5cnOZCsF112giAY5kR6eno6uDVERERERETOSx8zlZaWSk5QWm8CST0OZyUiIiIiIjKvYszUoANJIiIiIiIish8GkkRERERERCQKA0kiIiIiIiIShYEkERERERERicJAsgGYP38+2rVrB1dXV8hkMvTp00fyvqZNmwaZTIbvvvvOaHlCQgJkMhm2b99uVVtN2b59O2QyGRISEmy+byIiqlvMfQ+JkZaWZvX3IZE9WHMNtHPnTshkMnz22WdGy2vzmo1qX3h4OGQymdGyAwcOQCaTYc6cOXZtCwPJem7FihV48cUXceXKFQwZMgSjR4/GXXfd5ehmEZHenoVA9oWa18u+oFu3AbHXTSRHXFTVRiBTX4KjPn36QCaTIS0tzdFNoXqsNj4vznTjWxAEvPrqq2jatCmeeuqpWjtOQ/+82uLGli106tQJQ4YMwXvvvYcbN27Y7bhKux2JHGLVqlUA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WhQUFBhiJi8vL8n7qhdZWwGgvLwc6enpKC4udnRTiIiIiIiInJqbmxuaNWsGhUIhaft6E0gCumAyKysLeXl5KC0tdXRziIiIiIiInIqLiwu8vLzg7+8vOYgE6lkgWZEgCKinT42IiIiIiEg0mUwmeU5klX3V10CSiIiIiIiIagez0RAREREREZEoDCSJiIiIiIhIFAaSREREREREJAoDSSIiIiIiIhKFgSQRERERERGJwkCSiIiIiIiIRGEgSURERERERKIoHd0AMi04OBgFBQVo1qyZo5tCRERERNTgpaenw9PTExkZGY5uilNgj6STKigoQFlZmaObQUREREREAMrKylBQUODoZjgN9kg6KX1P5NGjRx3cEiIiIiIiateunaOb4FTYI0lERERERESiMJAkIiIiIiIiURhIEhERERERkSgMJImIiIiIiEgUJttxItnZ2cjOzgagywqlUCgc2yAiIiIiIiIT2CPpRObNm4eIiAhEREQgNTUVWVlZjm4SERERERFRFTJBEARHN4J0KvZIDhw4EAqFAsePH3dso4iIiIiIyFD+g+X5dDi01Yn4+vrC19cXAKBSqRzbGCIiIiIiIjM4tJWIiIiIiIhEYSBJREREREREojCQJCIiIiIiIlEYSBIREREREZEoDCSJiIiIiIhIFAaSREREREREJAoDSSIiIiIiIhKFgSQRERERERGJonR0A4iIiIjqisyiTKxIXYGUjBQUaArgqfREfHA8hrccjgD3AEc3j4jIbhhIEhEREdWgWFOMWcmzsPrMami0GqPHkq4kYcGhBRgWNQyJXRPhqnB1UCuJiOyHgSQRERFRNYo1xRi/eTxSrqaYXUej1WDZqWVIy0nDwv4L4aZ0MzxWV3ox60o7icg5yARBEBzdCKqqXbt2AICjR486uCVEREQN27Td07A8dbnF649sNRJTu0+tthcTAJRypVP0YtaVdhI5Gq/PjTHZDhEREZEZmUWZWH1mtahtVp1ehUt5lzB+83gsT11uMjgDbvViPrvpWRRrim3RXNH0va3O3k4icj4MJImIiIjMWJG6wmyAZY5Gq8ErO16pdihsRSlXUzB732wpzbParORZdaKdROR8OEeSiIiIGhxL5wOmZFgWZFV2LOuYqPVXnV6FCbET7DoXUWpvq73bSUTOiYEkERERNRhis68WaAokHUeAuBQUGq0G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73vfU2Jiot5++21JFyqS+fn5On78uKZOnapRo0Zp7dq16t27t1asWBHOUAAAAAAABgnrrK1Tp05VVVVVu20//elPNXbsWL355puqq6vTddddp8cff1zZ2dnhDMUSXC6XXC6XJKm5uZl1JAEAAABEpbAmkv488MADeuCBB8y4dFQrKCjQs88+633cv39/E6MBAAAAgK6x4n0Uyc/PV0VFhSoqKpSdna3U1FSzQwIAAACATkypSKJrDodDDodDkpSQkGBuMAAAAADgh6EVydraWp05cyakc5w5c0a1tbUGRQQAAAAAMJqhiWT//v312GOPhXSOvLw8paenGxQRAAAAAMBohiaSHo9HHo/HkPMAAAAAAKKT4WMkd+/erblz54b0fAAAAABA9DI8kfz888/1+eefh3QOm81mUDQAAAAAAKMZmkgWFRUZeToAAAAAQBQyNJGcOHGikacDAAAAAEQh1pGMIi6XSy6XS5LU3NysuLg4cwMCAAAAgC4YOmsrQlNQUKCsrCxlZWWprKxMTqfT7JAAAAAAoBMSySiSn5+viooKVVRUKDs7W6mpqWaHBAAAAACd0LU1ijgcDjkcDklSQkKCucEAAAAAgB9UJAEAAAAAQTE0kWxoaDDydAAAAACAKGRoItmvXz899dRTRp4SAAAAABBlDE0kW1tbVVNT0+W+xYsXq7i42MjLAQAAAABMELHJdv7lX/5FX375pcaNG9dp3/r16+V0OvX0009HKhwAAAAAQDdFxWQ7H374oRYvXmx2GAAAAACASxAViSQAAAAAwDpIJAEAAAAAQSGRBAAAAAAExfBE0ul06uTJk0afFgAAAAAQJQyftbWwsFBXXnmlUlJSdMMNN2j48OEaPny40ZeJSS6XSy6XS5LU3NysuLg4cwMCAAAAgC4Ymkg+/vjjKikp0aFDh+R0OrV7927t3r1bNptNNptNGzdu1HvvvadRo0Zp5MiR3h9cUFBQoGeffdb7uH///iZGAwAAAABds3k8Hk84TvzFF1/o4MGDOnTokPffo0ePqu1yNput03NaW1vDEYpl+FYk77rrLsXFxemTTz4xNygAAAAELTU1VbW1tZKkP/7xj7rppptMjgihysnJkSSVlpaaHEl0MLxra5trr71W1157raZNm+bd1tDQoJKSknYJ5scff6yzZ892mVj2NA6HQw6HQ5KUkJBgbjAA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AAAAAEEhkQQAAAAABIVEEgAAAAAQFBJJGOK1117T1KlTlZGRob59++qOO+7Q7t27zQ4L8OuPf/yjZs+eraFDh8pms2nx4sVmhwTo4MGDuv3223X55ZcrKytLa9asMTskwC8+R2E1tFeNRSIJQxQUFCgtLU1r167V66+/rmuuuUbf+MY3dOjQIbNDA7r0/vvva8+ePbrtttvUt29fs8MBVFNTozvvvFPJyckqLCzUo48+qvz8fL300ktmhwZ0ic9RWA3tVWPZPB6Px+wgYH1Op1Opqanex263WzfeeKMmTJig9evXmxgZ0DW32y27/cJ3aZmZmZo5c6aWL19uclToyZYtW6Z///d/V2VlpXr37i1JevTRR/Xuu+/qyJEjJkcHdMbnKKyG9qqxqEjCEL5vSkmy2+362te+poqKCpMiAgJra/wA0eKtt97St7/9bW8SKUn333+/ysrKdPToURMjA7rG5yishvaqsfgEsJj9+/fr+eef17333qsBAwbIZrPJZrNd9Hlnz57VM888o+uuu06JiYm6+uqrNXfuXP35z38OS5ytra3at2+fhg4dGpbzwzqscs8CgUTiPj5y5IiGDRvWblvb488++8yYXwQ9Bp+9sBoz7lnaqyHywFLuuecej6ROP4GcPXvWM378eI8kT0ZGhmf69Omem2++2SPJ079/f095ebnhcRYUFHji4uI8JSUlhp8b1mKFe3bQoEGe//f//p+h50RsicR9HB8f7/mP//iPTueQ5HnllVcM/50Q2yL92cvnKEJlRnuB9mpo4sObpsJot9xyi0aMGKGxY8dq7NixyszM1Llz5wI+Z/ny5dqzZ49uueUWvf322+rTp48kadWqVXriiSc0d+5c/f73v/ce73K59NVXXwU8Z+/evTVw4MAu9xUXF+vHP/6xFi9erBtvvDG4XxAxxwr3LHAxkbiPASNxz8JqIn3P0l41gNmZLELTq1evgN/WnDt3ztO3b1+PJM+BAwc67R8xYoRHkuePf/yjd9t//Md/dPmNkO/PxIkTu7xeRUWF58orr/Tcf//9HrfbHfLvh9gTbfesx8M36QheOO7j/v37e55//vl2x1VVVXkkef77v//buODRI4XjnvXF5yiMFs57lvaqMRgjGePef/99nTp1SkOGDNHo0aM77b/vvvskSdu3b/due+SRR+TxeAL+dPXtjsvl0tSpU5WZmakNGzZcUr92oKNI3rNAuHTnPr7uuuv06aeftjuu7fH1118fxmiB7t2zgJm6e8/SXjUOiWSMa1sXZ8yYMV3ub9teUlIS0nXOnz+ve++9V2fOnNHWrVt1+eWXh3Q+9FyRumeBcOrOfXz33Xfrv//7v3X27Fnvti1btig7O1uDBw8OY7QAn72wnu7cs7RXjcUYyRh3/PhxSdKAAQO63N+2/dixYyFd59FHH9WuXbv0i1/8QhUVFd5plHv16tXlt0SAP5G6Z2tqarRr1y5J0pkzZ/Tpp59qy5YtSkpK0l/91V+FdG6gO/fxI488on/7t3/T9OnTlZ+frz/96U9at26dXnzxxfAHjB6vO/csn6MwU3fuWdqrxiKRjHENDQ2S1G5dMl9JSUmSpNOnT4d0nXfffVdut1t/93d/1277oEGDVFlZGdK50bNE6p4tLS3V/fff7338xhtv6I033uCehSG6cx/3799f77zzjubPn6+pU6fqyiuv1KpVqzRr1qzwB4werzv3LJ+jMFN37lnaq8YikYQhePPBaiZNmiSPx2N2GEA7o0aN0u7du80OA7gkfI7CamivGosxkjGubRrkM2fOdLm/sbFRknTFFVdELCYgEO5ZxALuY1gN9yyshnvWfCSSMa5t3bwTJ050ub9t+6BBgyIWExAI9yxiAfcxrIZ7FlbDPWs+EskYN3LkSEnSgQMHutzftn3EiBERiwkIhHsWsYD7GFbDPQur4Z41H4lkjJswYYL69u2r8vJyHTx4sNP+LVu2SJKmTZsW4ciArnHPIhZwH8NquGdhNdyz5iORjHGXXXaZ5s+fL0nKy8vz9heXpFWrVqmkpEQTJ07UTTfdZFaIQDvcs4gF3MewGu5ZWA33rPlsHqbbspQdO3Zo2bJl3sd79+6Vx+PRuHHjvNuWLFmiqVOneh83NTVp0qRJKi4uVkZGhm6//XYdO3ZMxcXF6t+/v/bs2cNi1wgb7lnEAu5jWA33LKyGe9aCPLCUX/3qVx5JAX9+9atfdXremTNnPEuWLPEMGTLEc9lll3muuuoqz5w5czxffPFF5H8J9Cjcs4gF3MewGu5ZWA33rPVQkQQAAAAABIUxkgAAAACAoJBIAgAAAACCQiIJAAAAAAgKiSQAAAAAICgkkgAAAACAoJBIAgAAAACCQiIJAAAAAAgKiSQAAAAAICgkkgAAAACAoJBIAgAAAACCQiIJAAAAAAgKiSQAAAAAICgkkgAAAACAoJBIAgAAAACCQiIJAAAAAAgKiSQAIGbk5+fLZrMF/ImLi1N9fX3I1/r973/f6dwnT56UpIvG0PEnMzMz6Ot///vfl81m07Jlyy567N69e2Wz2XTllVeqpaXFu93hcLSL49e//nXQcQAAeqZ4swMAAMAohw4dkiTl5uYqNTW1y2PS0tKUnJxs2DWHDBmi2267TZKUmJgoSXrooYc6Hbd7926Vl5dr5MiRGjVqVKeYgjVr1iy9+uqreuWVV7RkyZKAx7788suSpAcffFDx8f/3p//73/++zpw5o4MHD3pfOwAALgWJJAAgZrQlQ7/85S915ZVXRuSat912W6dKXleVvTlz5qi8vFx//dd/raVLl4Z83bvuuktXXnmlPvvsM+3bt09jx47t8riWlhZt3rxZ0oXk09fPfvYzSdLSpUtJJAEAQaFrKwAgJhw/flx1dXVKSUmJWBJppri4OD344IOS/q/i2JW3335b1dXVuuGGG3TTTTdFKjwAQIwjkQQAxISDBw9Kkm644QZzAwnRF198ofnz52vIkCFKTExUSkqKcnNz9cEHH3Q6dubMmZKkzZs3q7W1tcvzvfLKK+2OBQDACCSSAICY0NY1c/jw4SZH0n0ffvihRo4cqbVr1yohIUFTp07V1772Nb311lu64447vF1U29x000264YYb9L//+7965513Op2vsbFRW7dulc1m09/8zd9E6tcAAPQAJJIAgJjQVpG0aiJZX1+v733ve6qvr9fLL7+sTz/9VG+88Ybee+89ffjhh0pOTtbf//3fq6ampt3z2sY9dtW99b/+67/U2NioO+64Q4MGDYrI7wEA6BlIJAEAMaGtIrlgwQK/y2z84z/+o8lR+vfiiy+qqqpK+fn5naqHX//617VkyRI1NDR0Shj/5m/+RjabTW+++aYaGxvb7Ws7lm6tAACjMWsrAMDyTp8+raNHj8pms2n27Nl+j5s2bVoEowrO22+/LUm69957u9x/++23S7qwJqSvgQMH6o477tCuXbv05ptvepPQ//3f/9Xvfvc7JSYm6v777w9j5ACAnohEEgBgeSUlJfJ4PMrKyupy6Q0rqKyslCRNmDAh4HEnT57stG3WrFnatWuXXn75ZW8i+eqrr6q1tVX33nuv+vbta3i8AICejUQSAGB5beMjR40adcnPGT9+vE6fPq3f/e53uuqqq7zbN27cqMcff1yff/650tLSDI7UP7fbLUm67777lJSU5Pe4YcOGddp23333af78+Xr33XdVXV2t9PR0b7fWjmtHAgBgBBJJAIDltY2PHDly5CU/Z/ny5brnnnv0X//1X3r00UclSU1NTVq8eLGefvrpiCaRkjRgwAB99tln+vGPfxz0eo99+/bVd77zHb322mt69dVXdffdd2v//v1KS0vTt771rTBFDADoyZhsBwBgeW0VyWASyW9+85uaNGmSPvnkE++2goIC2Ww2/ehHPzI6xIu68847JUm/+c1vuvX8tgl1XnnlFe/akTNmzFBCQoIxAQIA4INEEgBgaa2trfr4448lBZdISlJ2draOHDki6cLYw+eff17//M//rMTERMPjvJiHH35Y6enpWrFihdavX+/t6tqmpaVFb731lvd37ehb3/qW0tLStG/fPv385z+XRLdWAED40LUVAGBpR44c0dmzZyVJzz77rN/jxo8fr0ceeaTdtuzsbG3dulWS9JOf/ERDhgzptPRGpDgcDm3dulXTpk3Tww8/rOXLl+trX/ua+vXrp6+++koHDhyQy+XSb37zG33ta1/r9PyEhAQ98MADWrNmjU6ePKns7GyNGzfOhN8EANATkEgCACytbXykJG3YsMHvcdnZ2V1uO378uEpLS/Xzn/9cv/3tb2Wz2cIS56UYP368PvroI61evVo7duzQrl27JEkZGRmaOHGivvvd7+qb3/ym3+fPmjVLa9askcTakQCA8CKRBABY2gMPPKAHHnigW8/Nzs6W2+3WzJkzddddd2nKlCkGR/d/fv3rX1/S0iRXXXWV/vVf/1X/+q//GvQ1br75Znk8nm5EBwBAcEgkAQA91sCBA3XZZZfpo48+8k5QE6zdu3drzpw5kqQ1a9aoT58+BkYYXo8++qjOnDnjnawIAIBLRSIJAOix4uLiNHDgQN12220aPnx4t85RXl6u8vJySdLKlSstlUhu2rRJp06dMjsMAIAFkUgCAHosj8ejqqqqgOMO/Zk0aZLlu5G6XC6zQwAAWBTLfwAAeqzy8nI1NjbqxhtvNDsUAAAshUQSANBjffTRR4qPj9ewYcPMDgUAAEuxeazeLwcAAAAAEFFUJAEAAAAAQSGRBAAAAAAEhUQSAAAAABAUEkkAAAAAQFBIJAEAAAAAQSGRBAAAAAAEhUQSAAAAABAUEkkAAAAAQFBIJAEAAAAAQSGRBAAAAAAEhUQSAAAAABAUEkkAAAAAQFBIJAEAAAAAQSGRBAAAAAAEhUQSAAAAABAUEkkAAAAAQFD+P2B1do5WOu7BAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "e_bins = np.logspace(-2, 2, 51)\n", + "dE = np.diff(e_bins)\n", + "e_mid = 0.5 * (e_bins[1:] + e_bins[:-1])\n", + "\n", + "get_dnde = lambda df: np.histogram(df[df.ID == 22].E, bins = e_bins)[0]/dE \n", + "\n", + "dNdE_full = get_dnde(df_full)\n", + "dNdE_1 = get_dnde(df_1)\n", + "dNdE_2 = get_dnde(df_2)\n", + "dNdE_3 = get_dnde(df_3) \n", + "\n", + "plt.figure(dpi = 150)\n", + "plt.scatter(e_mid, e_mid**2 * dNdE_full, label = \"full sim\", color = \"tab:green\") \n", + "plt.plot(e_mid, e_mid**2 * dNdE_1, label = \"finished particles\", marker =\"s\", ls = \"\", fillstyle=\"none\")\n", + "plt.plot(e_mid, e_mid**2 * dNdE_2, label = \"not startet particles\", marker =\"x\", ls = \"\", )\n", + "plt.plot(e_mid, e_mid**2 * dNdE_3, label = \"on the fly particles\", fillstyle=\"none\", ls = \"\",marker =\"d\", color = \"tab:red\")\n", + "\n", + "plt.plot(e_mid, e_mid**2 * (dNdE_1 + dNdE_2 + dNdE_3), label =\"total (interrupted)\", color =\"k\")\n", + "\n", + "\n", + "plt.loglog() \n", + "plt.xlabel(r\"$E_\\gamma$ [TeV]\")\n", + "plt.ylabel(r\"$E^2 \\, dN/dE$ [a.u.]\")\n", + "plt.legend(loc = \"lower center\", ncol = 3, bbox_to_anchor=(0.5, 1.))\n", + "plt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "CRP_Interrupt", + "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.12.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/doc/pages/interrupting-simulations.rst b/doc/pages/interrupting-simulations.rst new file mode 100644 index 000000000..88b62c4cb --- /dev/null +++ b/doc/pages/interrupting-simulations.rst @@ -0,0 +1,22 @@ +Interrupting simulations on runtime +------------------------------------------------ + +CRPropa simulations can be interrupted on runtime with the `SIGTERM` or `SIGINT` signals. +If the user defines an output for the interruption (called `InterruptAction`) all candidates which are currently in the simulation will be passed to this output. +In the error stream the user will see a message denoting the number of candidates which have not been started yet. +If the simulation was run with a `candidateVector` as source, the indices of the candidates which have not been started yet will be printed or written to the file. +For a simulation with a source interface, a restart with the missing number of candidates will be sufficient to continue the simulation. + +.. toctree:: + :caption: Using a candidateVector as source + :maxdepth: 1 + + example_notebooks/interrupting_simulations/interrupt_candidateVector.ipynb + +.. toctree:: + :caption: Using a source interface + :maxdepth: 1 + + example_notebooks/interrupting_simulations/interrupt_source.ipynb + + diff --git a/include/crpropa/ModuleList.h b/include/crpropa/ModuleList.h index 38fdf7658..cf44dfbbb 100644 --- a/include/crpropa/ModuleList.h +++ b/include/crpropa/ModuleList.h @@ -4,6 +4,7 @@ #include "crpropa/Candidate.h" #include "crpropa/Module.h" #include "crpropa/Source.h" +#include "crpropa/module/Output.h" #include #include @@ -47,9 +48,15 @@ class ModuleList: public Module { iterator end(); const_iterator end() const; + void setInterruptAction(Output* action); + void dumpCandidate(Candidate* cand) const; + private: module_list_t modules; bool showProgress; + Output* interruptAction; + bool haveInterruptAction = false; + std::vector notFinished; // list with not finished numbers of candidates }; /** diff --git a/include/crpropa/module/Output.h b/include/crpropa/module/Output.h index 76b28fc6e..5341a7bfe 100644 --- a/include/crpropa/module/Output.h +++ b/include/crpropa/module/Output.h @@ -52,16 +52,18 @@ namespace crpropa { They can be easily customised by enabling/disabling specific columns. */ class Output: public Module { -protected: - double lengthScale, energyScale; - std::bitset<64> fields; - +public: struct Property { std::string name; std::string comment; Variant defaultValue; }; + +protected: + double lengthScale, energyScale; + std::bitset<64> fields; + std::vector properties; bool oneDimensional; @@ -163,6 +165,18 @@ class Output: public Module { size_t size() const; void process(Candidate *) const; + + /** + * write the indices of not started candidates into the output file. + * Used for interrupting the simulation + * @param indices list of not started indices + */ + virtual void dumpIndexList(std::vector indices) { + std::cout << "indices:\t"; + for (int i = 0; i < indices.size(); i++) + std::cout << indices[i] << ", "; + std::cout << "\n"; + }; }; /** @}*/ diff --git a/include/crpropa/module/TextOutput.h b/include/crpropa/module/TextOutput.h index 817fc1c0f..0c21caf43 100644 --- a/include/crpropa/module/TextOutput.h +++ b/include/crpropa/module/TextOutput.h @@ -71,6 +71,8 @@ class TextOutput: public Output { */ static void load(const std::string &filename, ParticleCollector *collector); std::string getDescription() const; + + void dumpIndexList(std::vector indicies); }; /** @}*/ diff --git a/python/2_headers.i b/python/2_headers.i index d34665838..2db4540bb 100644 --- a/python/2_headers.i +++ b/python/2_headers.i @@ -279,6 +279,11 @@ %feature("director") crpropa::AbstractCondition; %include "crpropa/Module.h" +%template(OutputRefPtr) crpropa::ref_ptr; +%feature("director") crpropa::Output; +%ignore crpropa::Output::dumpIndexList(std::vector); +%include "crpropa/module/Output.h" + %implicitconv crpropa::ref_ptr; %template(MagneticFieldRefPtr) crpropa::ref_ptr; %feature("director") crpropa::MagneticField; @@ -394,8 +399,6 @@ } } - -%include "crpropa/module/Output.h" %include "crpropa/module/DiffusionSDE.h" %include "crpropa/module/TextOutput.h" %include "crpropa/module/HDF5Output.h" diff --git a/src/ModuleList.cpp.in b/src/ModuleList.cpp.in index c28cfd99c..3d96f6416 100644 --- a/src/ModuleList.cpp.in +++ b/src/ModuleList.cpp.in @@ -8,6 +8,7 @@ #include #include +#include #ifndef sighandler_t typedef void (*sighandler_t)(int); #endif @@ -87,6 +88,10 @@ void ModuleList::run(Candidate* candidate, bool recursive, bool secondariesFirst run(candidate->secondaries[i], recursive, secondariesFirst); } } + + // dump candidae and secondaries if interrupted. + if (candidate->isActive() && (g_cancel_signal_flag != 0)) + dumpCandidate(candidate); } void ModuleList::run(ref_ptr candidate, bool recursive, bool secondariesFirst) { @@ -114,8 +119,11 @@ void ModuleList::run(const candidate_vector_t *candidates, bool recursive, bool #pragma omp parallel for schedule(OMP_SCHEDULE) for (size_t i = 0; i < count; i++) { - if (g_cancel_signal_flag != 0) + if (g_cancel_signal_flag != 0) { +#pragma omp critical(interrupt_write) + notFinished.push_back(i); continue; + } try { run(candidates->operator[](i), recursive); @@ -132,8 +140,18 @@ void ModuleList::run(const candidate_vector_t *candidates, bool recursive, bool ::signal(SIGINT, old_sigint_handler); ::signal(SIGTERM, old_sigterm_handler); // Propagate signal to old handler. - if (g_cancel_signal_flag > 0) + if (g_cancel_signal_flag > 0) { raise(g_cancel_signal_flag); + std::cerr << "############################################################################\n"; + std::cerr << "# Interrupted CRPropa simulation \n"; + std::cerr << "# A total of " << notFinished.size() << " candidates have not been started.\n"; + std::cerr << "# the indicies of the vector haven been written to to output file. \n"; + std::cerr << "############################################################################\n"; + + // dump list to output file + std::sort(notFinished.begin(), notFinished.end()); + interruptAction->dumpIndexList(notFinished); + } } void ModuleList::run(SourceInterface *source, size_t count, bool recursive, bool secondariesFirst) { @@ -156,8 +174,11 @@ void ModuleList::run(SourceInterface *source, size_t count, bool recursive, bool #pragma omp parallel for schedule(OMP_SCHEDULE) for (size_t i = 0; i < count; i++) { - if (g_cancel_signal_flag !=0) + if (g_cancel_signal_flag !=0) { +#pragma omp critical(interrupt_write) + notFinished.push_back(i); continue; + } ref_ptr candidate; @@ -189,8 +210,13 @@ void ModuleList::run(SourceInterface *source, size_t count, bool recursive, bool ::signal(SIGINT, old_signal_handler); ::signal(SIGTERM, old_sigterm_handler); // Propagate signal to old handler. - if (g_cancel_signal_flag > 0) + if (g_cancel_signal_flag > 0) { raise(g_cancel_signal_flag); + std::cerr << "############################################################################\n"; + std::cerr << "# Interrupted CRPropa simulation \n"; + std::cerr << "# Number of not started candidates from source: " << notFinished.size() << "\n"; + std::cerr << "############################################################################\n"; + } } ModuleList::iterator ModuleList::begin() { @@ -222,6 +248,27 @@ void ModuleList::showModules() const { std::cout << getDescription(); } +void ModuleList::setInterruptAction(Output* action) { + interruptAction = action; + haveInterruptAction = true; +} + +void ModuleList::dumpCandidate(Candidate *cand) const { + if (!haveInterruptAction) + return; + + if (cand->isActive()) + interruptAction->process(cand); + else + KISS_LOG_WARNING << "ModuleList::dumpCandidate is called with a non active candidate. This should not happen for the interrupt action. Please check candidate with serieal number " + << cand->getSerialNumber() << std::endl; + + for (int i = 0; i < cand->secondaries.size(); i++) { + if (cand->secondaries[i]) + dumpCandidate(cand->secondaries[i]); + } +} + ModuleListRunner::ModuleListRunner(ModuleList *mlist) : mlist(mlist) { } diff --git a/src/module/TextOutput.cpp b/src/module/TextOutput.cpp index e979c85dc..2dda875da 100644 --- a/src/module/TextOutput.cpp +++ b/src/module/TextOutput.cpp @@ -7,6 +7,7 @@ #include "kiss/string.h" +#include #include #include #include @@ -378,4 +379,17 @@ void TextOutput::gzip() { #endif } +void TextOutput::dumpIndexList(std::vector indices) { +#pragma omp critical(FileOutput) + { + std::stringstream ss; + ss << "#" << "\t"; + for (int i = 0; i < indices.size(); i++) + ss << indices[i] << "\t"; + + const std::string cstr = ss.str(); + out-> write(cstr.c_str(), cstr.length()); + } +} + } // namespace crpropa