From f48a175bce6e496fe557bb655ebd258265a21e95 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Wed, 5 Aug 2026 11:33:23 -0400 Subject: [PATCH 01/52] Update ccsn.py --- python/snewpy/models/ccsn.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/python/snewpy/models/ccsn.py b/python/snewpy/models/ccsn.py index 253bf1b5a..86f42844f 100644 --- a/python/snewpy/models/ccsn.py +++ b/python/snewpy/models/ccsn.py @@ -41,7 +41,17 @@ class method to get a list of all valid combinations and filter it: from snewpy.models.registry_model import all_models from textwrap import dedent - +@RegistryModel() +class PUSH(loaders.PUSH): + """Model from the PUSH collaboration + """ + def __init__(self: + self.metadata["EOS"] = "LS220" + # neutrino data is in two files + efilename = 'luminosity.d' + xfilename = 'mutau_luminosity.d' + return super().__init__(efilename,xfilename,self.metadata) + @RegistryModel() class Fischer_2020(loaders.Fischer_2020): """Model based on simulations from `Fischer et al. (2020) ` From 1faf7475a636a84e170bf996913664131619db7a Mon Sep 17 00:00:00 2001 From: jpkneller Date: Wed, 5 Aug 2026 12:07:02 -0400 Subject: [PATCH 02/52] Update ccsn_loaders.py --- python/snewpy/models/ccsn_loaders.py | 43 ++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/python/snewpy/models/ccsn_loaders.py b/python/snewpy/models/ccsn_loaders.py index f52ee9eec..515c02b5c 100644 --- a/python/snewpy/models/ccsn_loaders.py +++ b/python/snewpy/models/ccsn_loaders.py @@ -1069,3 +1069,46 @@ def __init__(self, filename, metadata={}): tf.close() super().__init__(simtab, metadata) + +class PUSH(PinchedModel): + """Model from the PUSH collaboration + """ + + def __init__(self, efilename, xfilename, metadata={}): + """ + Parameters + ---------- + efilename : str + Absolute or relative path to model data for electron flavor neutrinos. + xfilename : str + Absolute or relative path to model data for mutau flavor neutrinos + """ + + edatafile = self.request_file(efilename) + edata = np.genfromtxt(edatafile) + + xdatafile = self.request_file(xfilename) + xdata = np.genfromtxt(xdatafile) + + simtab['TIME'] = edata[:, 0] + + simtab['L_NU_E'] = edata[:, 4] << u.erg/u.s + simtab['L_NU_E_BAR'] = edata[:, 5] << u.erg/u.s + simtab['L_NU_X'] = xdata[:, 2] << u.erg/u.s + + simtab['E_NU_E'] = edata[:, 6] << u.MeV + simtab['E_NU_E_BAR'] = edata[:, 7] << u.MeV + simtab['E_NU_X'] = xdata[:, 3] << u.MeV + + simtab['ALPHA_NU_E'] = np.array(len(simtab['TIME']),3) + simtab['ALPHA_NU_E_BAR'] = simtab['ALPHA_NU_E'] + simtab['ALPHA_NU_X'] = simtab['ALPHA_NU_E'] + + simtab['L_NU_X'] /= 4.0 + + # prevent negative lums + simtab['L_NU_E'][simtab['L_NU_E'] < 0] = 1 + simtab['L_NU_E_BAR'][simtab['L_NU_E_BAR'] < 0] = 1 + simtab['L_NU_X'][simtab['L_NU_X'] < 0] = 1 + + super().__init__(simtab, metadata) From a61be1d00c83de7412e436b4e2f9037562c126fb Mon Sep 17 00:00:00 2001 From: jpkneller Date: Wed, 5 Aug 2026 13:41:03 -0400 Subject: [PATCH 03/52] Update ccsn.py --- python/snewpy/models/ccsn.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/snewpy/models/ccsn.py b/python/snewpy/models/ccsn.py index 86f42844f..b80024299 100644 --- a/python/snewpy/models/ccsn.py +++ b/python/snewpy/models/ccsn.py @@ -45,7 +45,7 @@ class method to get a list of all valid combinations and filter it: class PUSH(loaders.PUSH): """Model from the PUSH collaboration """ - def __init__(self: + def __init__(self): self.metadata["EOS"] = "LS220" # neutrino data is in two files efilename = 'luminosity.d' From d4b829da685e6a222c642b0e178c4251ab0e15d4 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Wed, 5 Aug 2026 13:45:14 -0400 Subject: [PATCH 04/52] Update ccsn_loaders.py --- python/snewpy/models/ccsn_loaders.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/snewpy/models/ccsn_loaders.py b/python/snewpy/models/ccsn_loaders.py index 515c02b5c..6830bdce3 100644 --- a/python/snewpy/models/ccsn_loaders.py +++ b/python/snewpy/models/ccsn_loaders.py @@ -1100,7 +1100,7 @@ def __init__(self, efilename, xfilename, metadata={}): simtab['E_NU_E_BAR'] = edata[:, 7] << u.MeV simtab['E_NU_X'] = xdata[:, 3] << u.MeV - simtab['ALPHA_NU_E'] = np.array(len(simtab['TIME']),3) + simtab['ALPHA_NU_E'] = np.full(len(simtab['TIME']),3) simtab['ALPHA_NU_E_BAR'] = simtab['ALPHA_NU_E'] simtab['ALPHA_NU_X'] = simtab['ALPHA_NU_E'] From 94e5c51f20750946a26a5e9428883c0a32747c0c Mon Sep 17 00:00:00 2001 From: jpkneller Date: Wed, 5 Aug 2026 13:52:11 -0400 Subject: [PATCH 05/52] Update ccsn_loaders.py --- python/snewpy/models/ccsn_loaders.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/python/snewpy/models/ccsn_loaders.py b/python/snewpy/models/ccsn_loaders.py index 6830bdce3..61b4ccd43 100644 --- a/python/snewpy/models/ccsn_loaders.py +++ b/python/snewpy/models/ccsn_loaders.py @@ -1084,11 +1084,11 @@ def __init__(self, efilename, xfilename, metadata={}): Absolute or relative path to model data for mutau flavor neutrinos """ - edatafile = self.request_file(efilename) - edata = np.genfromtxt(edatafile) + #edatafile = self.request_file(efilename) + edata = np.genfromtxt(efilename) - xdatafile = self.request_file(xfilename) - xdata = np.genfromtxt(xdatafile) + #xdatafile = self.request_file(xfilename) + xdata = np.genfromtxt(xfilename) simtab['TIME'] = edata[:, 0] From 79d4e6212faf49faf002ccc9b798a026422284e0 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Wed, 5 Aug 2026 13:56:39 -0400 Subject: [PATCH 06/52] Update ccsn_loaders.py --- python/snewpy/models/ccsn_loaders.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/python/snewpy/models/ccsn_loaders.py b/python/snewpy/models/ccsn_loaders.py index 61b4ccd43..2764b0b16 100644 --- a/python/snewpy/models/ccsn_loaders.py +++ b/python/snewpy/models/ccsn_loaders.py @@ -1089,6 +1089,8 @@ def __init__(self, efilename, xfilename, metadata={}): #xdatafile = self.request_file(xfilename) xdata = np.genfromtxt(xfilename) + + simtab = Table() simtab['TIME'] = edata[:, 0] From b2c7a9f1139026f422b3e2b8315e5a2d42e93c3a Mon Sep 17 00:00:00 2001 From: jpkneller Date: Wed, 5 Aug 2026 13:58:26 -0400 Subject: [PATCH 07/52] Update ccsn_loaders.py --- python/snewpy/models/ccsn_loaders.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/python/snewpy/models/ccsn_loaders.py b/python/snewpy/models/ccsn_loaders.py index 2764b0b16..487af82f2 100644 --- a/python/snewpy/models/ccsn_loaders.py +++ b/python/snewpy/models/ccsn_loaders.py @@ -1094,12 +1094,12 @@ def __init__(self, efilename, xfilename, metadata={}): simtab['TIME'] = edata[:, 0] - simtab['L_NU_E'] = edata[:, 4] << u.erg/u.s - simtab['L_NU_E_BAR'] = edata[:, 5] << u.erg/u.s + simtab['L_NU_E'] = edata[:, 3] << u.erg/u.s + simtab['L_NU_E_BAR'] = edata[:, 4] << u.erg/u.s simtab['L_NU_X'] = xdata[:, 2] << u.erg/u.s - simtab['E_NU_E'] = edata[:, 6] << u.MeV - simtab['E_NU_E_BAR'] = edata[:, 7] << u.MeV + simtab['E_NU_E'] = edata[:, 5] << u.MeV + simtab['E_NU_E_BAR'] = edata[:, 6] << u.MeV simtab['E_NU_X'] = xdata[:, 3] << u.MeV simtab['ALPHA_NU_E'] = np.full(len(simtab['TIME']),3) From e924acb448acd5116909eb66607b55804fcde1fb Mon Sep 17 00:00:00 2001 From: jpkneller Date: Sat, 8 Aug 2026 12:04:59 -0400 Subject: [PATCH 08/52] Update flux.py --- python/snewpy/flux.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/python/snewpy/flux.py b/python/snewpy/flux.py index 53ce54331..9ccc1f098 100644 --- a/python/snewpy/flux.py +++ b/python/snewpy/flux.py @@ -390,7 +390,26 @@ def _load_quantity(name): return cls(data=array, **{name:_load_quantity(name) for name in ['time','energy','flavor']}, integrable_axes=f['_integrable_axes']) - + + def __add__(self,other:'Container'): + # Overload the + operator. + # Don't compare the flavors, only that they have the same number + if self.__class__==other.__class__ and \ + self.unit == other.unit and \ + self.flavor_scheme==other.flavor_scheme and \ + len(self.flavor)==len(other.flavor) and \ + all([np.allclose(self.axes[ax], other.axes[ax]) for ax in list(Axes)[1:]]): + array = self.array+other.array + axes = list(self.axes) + return Container(array,*axes) + else: + return NotImplemented + + def __radd__(self,other): + if other == 0: + return self + return self.__add__(other) + def __eq__(self, other:'Container')->bool: "Check if two Containers are equal" result = self.__class__==other.__class__ and \ From 57117aab8605300a67bf74c64d32a2a585179d3b Mon Sep 17 00:00:00 2001 From: jpkneller Date: Sat, 8 Aug 2026 12:07:43 -0400 Subject: [PATCH 09/52] Add files via upload --- doc/source/nb/dev/PUSH.ipynb | 541 +++++++++++++++++++++++++++++++++++ 1 file changed, 541 insertions(+) create mode 100644 doc/source/nb/dev/PUSH.ipynb diff --git a/doc/source/nb/dev/PUSH.ipynb b/doc/source/nb/dev/PUSH.ipynb new file mode 100644 index 000000000..0ac5be638 --- /dev/null +++ b/doc/source/nb/dev/PUSH.ipynb @@ -0,0 +1,541 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0015656d", + "metadata": {}, + "source": [ + "# Looking at PUSH data and running it through a detector" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "0107cb95-e9f6-497f-a99f-6116a86ead8a", + "metadata": {}, + "outputs": [], + "source": [ + "import astropy.units as u\n", + "import numpy as np\n", + "\n", + "from snewpy.models import ccsn, ccsn_loaders\n", + "from snewpy.flavor_transformation import AdiabaticMSW\n", + "from snewpy.neutrino import MixingParameters\n", + "from snewpy.models.base import PinchedModel, SupernovaModel" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "b8b559b2-4311-4582-9cf2-fe999807e49c", + "metadata": {}, + "outputs": [], + "source": [ + "class PUSH(PinchedModel):\n", + " \"\"\"Model from the PUSH collaboration\n", + " \"\"\"\n", + "\n", + " def __init__(self, efilename, xfilename, metadata={}):\n", + " \"\"\"\n", + " Parameters\n", + " ----------\n", + " efilename : str\n", + " Absolute or relative path to model data for electron flavor neutrinos.\n", + " xfilename : str\n", + " Absolute or relative path to model data for mutau flavor neutrinos \n", + " \"\"\"\n", + "\n", + " #edatafile = self.request_file(efilename)\n", + " edata = np.genfromtxt(efilename)\n", + " \n", + " #xdatafile = self.request_file(xfilename) \n", + " xdata = np.genfromtxt(xfilename)\n", + "\n", + " simtab = Table()\n", + " \n", + " simtab['TIME'] = edata[:, 0]\n", + "\n", + " simtab['L_NU_E'] = edata[:, 3] << u.erg/u.s\n", + " simtab['L_NU_E_BAR'] = edata[:, 4] << u.erg/u.s\n", + " simtab['L_NU_X'] = xdata[:, 2] << u.erg/u.s\n", + "\n", + " simtab['E_NU_E'] = edata[:, 5] << u.MeV\n", + " simtab['E_NU_E_BAR'] = edata[:, 6] << u.MeV\n", + " simtab['E_NU_X'] = xdata[:, 3] << u.MeV\n", + "\n", + " simtab['ALPHA_NU_E'] = np.full(len(simtab['TIME']),3)\n", + " simtab['ALPHA_NU_E_BAR'] = simtab['ALPHA_NU_E']\n", + " simtab['ALPHA_NU_X'] = simtab['ALPHA_NU_E']\n", + "\n", + " simtab['L_NU_X'] /= 4.0\n", + "\n", + " # prevent negative lums\n", + " simtab['L_NU_E'][simtab['L_NU_E'] < 0] = 1\n", + " simtab['L_NU_E_BAR'][simtab['L_NU_E_BAR'] < 0] = 1\n", + " simtab['L_NU_X'][simtab['L_NU_X'] < 0] = 1\n", + "\n", + " super().__init__(simtab, metadata)\n" + ] + }, + { + "cell_type": "markdown", + "id": "08c9a2f6-d0d4-4071-817d-71b9d7001d00", + "metadata": {}, + "source": [ + "## Some plotting functions" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "3ee6ab13-fa76-4889-85af-7c07446b7866", + "metadata": {}, + "outputs": [], + "source": [ + "import pylab as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "86744938-3d21-48c6-9f92-78c477eb61b2", + "metadata": {}, + "outputs": [], + "source": [ + "def plot_quantity(x:u.Quantity, y:u.Quantity, xlabel=None, ylabel=None, **kwargs):\n", + " \"\"\"Plot the X vs Y array, with given axis labels, adding units\"\"\"\n", + "\n", + " #just in case we are passed bare np.arrays iwthout units\n", + " x = u.Quantity(x)\n", + " y = u.Quantity(y)\n", + " \n", + " if(len(x)==len(y)):\n", + " plt.plot(x.value,y.value,**kwargs)\n", + " else:\n", + " plt.stairs(edges=x.value,values=y.value,**kwargs)\n", + " if xlabel is not None:\n", + " if(not x.unit.is_unity()):\n", + " xlabel+=', '+x.unit._repr_latex_()\n", + " plt.xlabel(xlabel)\n", + " if ylabel is not None:\n", + " if(not y.unit.is_unity()):\n", + " ylabel+=', '+y.unit._repr_latex_()\n", + " plt.ylabel(ylabel)\n", + " \n", + "def plot_rate(rate, axis:str='time', **kwargs):\n", + " if axis=='time':\n", + " x = rate.time.to('s')\n", + " y = rate.integrate_or_sum('energy').array.squeeze()\n", + " elif axis=='energy':\n", + " x = rate.energy.to('MeV')\n", + " y = rate.integrate_or_sum('time').array.squeeze()\n", + " else: \n", + " raise ValueError(f'axis=\"{axis}\" should be one of \"time\",\"energy\"')\n", + " plot_quantity(x,y,xlabel=axis.capitalize(), ylabel='Event rate', **kwargs)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "6ef1506c-fb97-408d-b7d2-8f1df89d2b9d", + "metadata": {}, + "outputs": [], + "source": [ + "#a helper function to calculate total rate\n", + "from snewpy.flux import Container\n", + "def sum_rates(rates:list):\n", + " res = sum([rate.array for rate in rates])\n", + " rate = rates[0]#take first as an instance\n", + " return Container(res,rate.flavor, rate.time, rate.energy, integrable_axes=rate._integrable_axes)" + ] + }, + { + "cell_type": "markdown", + "id": "8d149305-a0e6-412c-975d-6607d08a2ed6", + "metadata": {}, + "source": [ + "## Create the neutrino flux at Earth from the model" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "54dbcde6-4aac-4f96-9dbe-ced31225919a", + "metadata": {}, + "outputs": [], + "source": [ + "from astropy.table import Table, join\n", + "\n", + "# prepare the neutrino flux from the model\n", + "model = PUSH(\"luminosity.d\",\"mutau_luminosity.d\") # SN model\n", + "transformation = AdiabaticMSW(MixingParameters('NORMAL')) # Desired flavor transformation\n", + "\n", + "times = model.get_time()\n", + "energies = np.linspace(0,60,601)<" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "t = 50*u.ms\n", + "\n", + "ispec = model.get_initial_spectra(t, energies)\n", + "ospec_nmo = model.get_transformed_spectra(t, energies, transformation)\n", + "\n", + "fig, axes = plt.subplots(1,2, figsize=(12,5), sharex=True, sharey=True, tight_layout=True)\n", + "\n", + "for i, spec in enumerate([ispec, ospec_nmo]):\n", + " ax = axes[i]\n", + " plt.sca(ax)\n", + " spec.plot('energy')\n", + " \n", + " ax.set(title='Initial Spectra: $t = ${:.1f}'.format(t) if i==0 else 'Oscillated Spectra: $t = ${:.1f}'.format(t))\n", + " ax.grid()\n", + " ax.legend(loc='upper right', ncol=2, fontsize=16)\n", + "\n", + "ax = axes[0]\n", + "ax.set(ylabel=r'flux, MeV')\n", + "\n", + "fig.tight_layout();" + ] + }, + { + "cell_type": "markdown", + "id": "abc382c2-f06a-4a52-a829-07947991ec62", + "metadata": {}, + "source": [ + "## Using a detector config from SNOwGLoBES" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "0e7889dd-f442-4841-819b-ce7e31cd9a85", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using snowglobes_data module ...\n" + ] + } + ], + "source": [ + "from snewpy.rate_calculator import RateCalculator\n", + "\n", + "#load the RateCalculator object\n", + "rc = RateCalculator()" + ] + }, + { + "cell_type": "markdown", + "id": "6990252e-ab7f-4f6f-ad80-e86dd3c7794b", + "metadata": {}, + "source": [ + "### List available detectors" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "312c67d9-2556-4932-88b9-20ae7d042405", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['wc100kt30prct',\n", + " 'wc100kt15prct',\n", + " 'ar40kt',\n", + " 'scint20kt',\n", + " 'halo1',\n", + " 'halo2',\n", + " 'novaND',\n", + " 'novaFD',\n", + " 'wc100kt30prct_he',\n", + " 'ar40kt_he',\n", + " 'icecube',\n", + " 'km3net',\n", + " 'ds20',\n", + " 'argo',\n", + " 'lz',\n", + " 'xent',\n", + " 'pandax']" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#list available detectors\n", + "list(rc.detectors)" + ] + }, + { + "cell_type": "markdown", + "id": "389865fa-25e9-430a-9736-365a299fc7f9", + "metadata": {}, + "source": [ + "### Read the detector you need" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "c565f89f-e855-47b1-a591-da1561dd0bf5", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=ibd. Using 100% efficiency\n", + " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", + "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nue_e. Using 100% efficiency\n", + " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", + "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nuebar_e. Using 100% efficiency\n", + " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", + "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=numu_e. Using 100% efficiency\n", + " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", + "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=numubar_e. Using 100% efficiency\n", + " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", + "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nutau_e. Using 100% efficiency\n", + " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", + "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nutaubar_e. Using 100% efficiency\n", + " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", + "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nue_C12. Using 100% efficiency\n", + " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", + "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nuebar_C12. Using 100% efficiency\n", + " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", + "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nc_nue_C12. Using 100% efficiency\n", + " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", + "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nc_nuebar_C12. Using 100% efficiency\n", + " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", + "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nc_numu_C12. Using 100% efficiency\n", + " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", + "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nc_numubar_C12. Using 100% efficiency\n", + " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", + "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nc_nutau_C12. Using 100% efficiency\n", + " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", + "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nc_nutaubar_C12. Using 100% efficiency\n", + " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", + "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nue_C13. Using 100% efficiency\n", + " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", + "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nc_nue_C13. Using 100% efficiency\n", + " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", + "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nc_numu_C13. Using 100% efficiency\n", + " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", + "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nc_nutau_C13. Using 100% efficiency\n", + " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", + "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nc_nuebar_C13. Using 100% efficiency\n", + " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", + "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nc_numubar_C13. Using 100% efficiency\n", + " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", + "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nc_nutaubar_C13. Using 100% efficiency\n", + " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n" + ] + }, + { + "data": { + "text/plain": [ + "Detector(name=\"scint20kt\", mass=20.0 kt, channels=['ibd', 'nue_e', 'nuebar_e', 'numu_e', 'numubar_e', 'nutau_e', 'nutaubar_e', 'nue_C12', 'nuebar_C12', 'nc_nue_C12', 'nc_nuebar_C12', 'nc_numu_C12', 'nc_numubar_C12', 'nc_nutau_C12', 'nc_nutaubar_C12', 'nue_C13', 'nc_nue_C13', 'nc_numu_C13', 'nc_nutau_C13', 'nc_nuebar_C13', 'nc_numubar_C13', 'nc_nutaubar_C13'])" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#read the detector\n", + "det = rc.read_detector('scint20kt')\n", + "det" + ] + }, + { + "cell_type": "markdown", + "id": "8bfeb5a5-946b-4155-a72d-4adffdbf9b78", + "metadata": {}, + "source": [ + "### Inspecting the detector" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "a88a95fd-0e24-43e3-8205-41ac030a8632", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'ibd': DetectionChannel (flavor=NU_E_BAR, smearing=True, weight=0.1429),\n", + " 'nue_e': DetectionChannel (flavor=NU_E, smearing=True, weight=0.5716),\n", + " 'nuebar_e': DetectionChannel (flavor=NU_E_BAR, smearing=True, weight=0.5716),\n", + " 'numu_e': DetectionChannel (flavor=NU_MU, smearing=True, weight=0.5716),\n", + " 'numubar_e': DetectionChannel (flavor=NU_MU_BAR, smearing=True, weight=0.5716),\n", + " 'nutau_e': DetectionChannel (flavor=NU_TAU, smearing=True, weight=0.5716),\n", + " 'nutaubar_e': DetectionChannel (flavor=NU_TAU_BAR, smearing=True, weight=0.5716),\n", + " 'nue_C12': DetectionChannel (flavor=NU_E, smearing=True, weight=0.07066404999999999),\n", + " 'nuebar_C12': DetectionChannel (flavor=NU_E_BAR, smearing=True, weight=0.07066404999999999),\n", + " 'nc_nue_C12': DetectionChannel (flavor=NU_E, smearing=True, weight=0.07066404999999999),\n", + " 'nc_nuebar_C12': DetectionChannel (flavor=NU_E_BAR, smearing=True, weight=0.07066404999999999),\n", + " 'nc_numu_C12': DetectionChannel (flavor=NU_MU, smearing=True, weight=0.07066404999999999),\n", + " 'nc_numubar_C12': DetectionChannel (flavor=NU_MU_BAR, smearing=True, weight=0.07066404999999999),\n", + " 'nc_nutau_C12': DetectionChannel (flavor=NU_TAU, smearing=True, weight=0.07066404999999999),\n", + " 'nc_nutaubar_C12': DetectionChannel (flavor=NU_TAU_BAR, smearing=True, weight=0.07066404999999999),\n", + " 'nue_C13': DetectionChannel (flavor=NU_E, smearing=True, weight=0.00078595),\n", + " 'nc_nue_C13': DetectionChannel (flavor=NU_E, smearing=True, weight=0.00078595),\n", + " 'nc_numu_C13': DetectionChannel (flavor=NU_MU, smearing=True, weight=0.00078595),\n", + " 'nc_nutau_C13': DetectionChannel (flavor=NU_TAU, smearing=True, weight=0.00078595),\n", + " 'nc_nuebar_C13': DetectionChannel (flavor=NU_E_BAR, smearing=True, weight=0.00078595),\n", + " 'nc_numubar_C13': DetectionChannel (flavor=NU_MU_BAR, smearing=True, weight=0.00078595),\n", + " 'nc_nutaubar_C13': DetectionChannel (flavor=NU_TAU_BAR, smearing=True, weight=0.00078595)}" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#list all the channels\n", + "det.channels" + ] + }, + { + "cell_type": "markdown", + "id": "11bfb80a-cef7-446f-83b7-eaa97b20c0d6", + "metadata": {}, + "source": [ + "### Running the rate calculation" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "948ca075-66eb-449b-b310-a9e599d1e2e9", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:353: RuntimeWarning: divide by zero encountered in log\n", + " return np.interp(np.log(E)/np.log(10), xp, yp, left=0, right=0)*E*1e-38 <" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "rates = det.run(fluence)\n", + "plot_rate(sum_rates(list(rates.values())), axis='energy', label='Total', lw=2, color='k')\n", + "for chan,rate in rates.items():\n", + " plot_rate(rate, axis='energy', label=chan)\n", + "#plt.yscale('log')\n", + "#plt.ylim(1e-2)\n", + "plt.legend(ncols=3)\n", + "plt.ylabel(f'Events per {rate.energy.diff()[0]< 1\u001b[0m events \u001b[38;5;241m=\u001b[39m rc\u001b[38;5;241m.\u001b[39mrun(fluence, det, detector_effects\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m) \n\u001b[0;32m 2\u001b[0m events_smeared \u001b[38;5;241m=\u001b[39m rc\u001b[38;5;241m.\u001b[39mrun(fluence, det, detector_effects\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[0;32m 4\u001b[0m \u001b[38;5;66;03m# Compute number of events in all interaction channels\u001b[39;00m\n", + "File \u001b[1;32mC:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:428\u001b[0m, in \u001b[0;36mRateCalculator.run\u001b[1;34m(self, flux, detector, material, detector_effects)\u001b[0m\n\u001b[0;32m 403\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21mrun\u001b[39m(\u001b[38;5;28mself\u001b[39m, flux:Container, detector:\u001b[38;5;28mstr\u001b[39m, material:\u001b[38;5;28mstr\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, detector_effects:\u001b[38;5;28mbool\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m)\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m\u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Container]:\n\u001b[0;32m 404\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Run the rate calculation for the given detector. \u001b[39;00m\n\u001b[0;32m 405\u001b[0m \u001b[38;5;124;03m \u001b[39;00m\n\u001b[0;32m 406\u001b[0m \u001b[38;5;124;03m Parameters\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 426\u001b[0m \u001b[38;5;124;03m A dictionary with interaction rates (as instances of :class:`snewpy.flux.Container`) for each channel.\u001b[39;00m\n\u001b[0;32m 427\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[1;32m--> 428\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mread_detector(detector,material)\u001b[38;5;241m.\u001b[39mrun(flux, detector_effects\u001b[38;5;241m=\u001b[39mdetector_effects)\n", + "File \u001b[1;32mC:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:372\u001b[0m, in \u001b[0;36mRateCalculator.read_detector\u001b[1;34m(self, name, material)\u001b[0m\n\u001b[0;32m 356\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21mread_detector\u001b[39m(\u001b[38;5;28mself\u001b[39m, name:\u001b[38;5;28mstr\u001b[39m, material:\u001b[38;5;28mstr\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m)\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39mDetector:\n\u001b[0;32m 357\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Read the detector configuration from the SNOwGLoBES\u001b[39;00m\n\u001b[0;32m 358\u001b[0m \n\u001b[0;32m 359\u001b[0m \u001b[38;5;124;03m Parameters\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 370\u001b[0m \u001b[38;5;124;03m an object with the detector configuration.\u001b[39;00m\n\u001b[0;32m 371\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[1;32m--> 372\u001b[0m material \u001b[38;5;241m=\u001b[39m material \u001b[38;5;129;01mor\u001b[39;00m guess_material(name)\n\u001b[0;32m 373\u001b[0m channels \u001b[38;5;241m=\u001b[39m {}\n\u001b[0;32m 374\u001b[0m bins \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbinning[material]\n", + "File \u001b[1;32mC:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\snowglobes_interface.py:24\u001b[0m, in \u001b[0;36mguess_material\u001b[1;34m(detector)\u001b[0m\n\u001b[0;32m 23\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21mguess_material\u001b[39m(detector):\n\u001b[1;32m---> 24\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m detector\u001b[38;5;241m.\u001b[39mstartswith((\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mwc\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mice\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mkm3net\u001b[39m\u001b[38;5;124m'\u001b[39m)):\n\u001b[0;32m 25\u001b[0m mat \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mwater\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[0;32m 26\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m detector\u001b[38;5;241m.\u001b[39mstartswith(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124md2O\u001b[39m\u001b[38;5;124m'\u001b[39m):\n", + "\u001b[1;31mAttributeError\u001b[0m: 'Detector' object has no attribute 'startswith'" + ] + } + ], + "source": [ + "events = rc.run(fluence, det, detector_effects=False) \n", + "events_smeared = rc.run(fluence, det, detector_effects=True)\n", + " \n", + "# Compute number of events in all interaction channels\n", + "total_events = sum([chan.integrate_or_sum('energy').array.squeeze().value for chan in events.values()]) \n", + "total_events_smeared = sum([chan.integrate_or_sum('energy').array.squeeze().value for chan in events_smeared.values()])\n", + "\n", + "print(\"Total events in detector (with smearing):\" , total_events_smeared)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a86f58fe-1146-4913-a5d9-6028de24745f", + "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.13.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 8e5652cadb528747f7a116e3137f5251d16f757f Mon Sep 17 00:00:00 2001 From: jpkneller Date: Sat, 8 Aug 2026 12:08:11 -0400 Subject: [PATCH 10/52] Add files via upload --- doc/scripts/PUSH_demo.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 doc/scripts/PUSH_demo.py diff --git a/doc/scripts/PUSH_demo.py b/doc/scripts/PUSH_demo.py new file mode 100644 index 000000000..edd14ccb3 --- /dev/null +++ b/doc/scripts/PUSH_demo.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python +from snewpy.rate_calculator import RateCalculator +from snewpy.models import ccsn, ccsn_loaders +from snewpy.flavor_transformation import AdiabaticMSW +from snewpy.neutrino import MixingParameters + +import astropy.units as u +import numpy as np + +path = "~/.astropy/cache/snewpy/models/PUSH/" + +model = ccsn_loaders.PUSH("luminosity.d","mutau_luminosity.d") # SN model +transformation = AdiabaticMSW(MixingParameters('NORMAL')) # Desired flavor transformation + +# Now, do the main work: +print("Generating fluence files ...") +times = model.get_time() +energies = np.linspace(0,100,501)< Date: Sat, 8 Aug 2026 12:09:59 -0400 Subject: [PATCH 11/52] Update PUSH_demo.py --- doc/scripts/PUSH_demo.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/doc/scripts/PUSH_demo.py b/doc/scripts/PUSH_demo.py index edd14ccb3..aa08a17d0 100644 --- a/doc/scripts/PUSH_demo.py +++ b/doc/scripts/PUSH_demo.py @@ -12,16 +12,13 @@ model = ccsn_loaders.PUSH("luminosity.d","mutau_luminosity.d") # SN model transformation = AdiabaticMSW(MixingParameters('NORMAL')) # Desired flavor transformation -# Now, do the main work: -print("Generating fluence files ...") times = model.get_time() energies = np.linspace(0,100,501)< Date: Sat, 8 Aug 2026 12:11:17 -0400 Subject: [PATCH 12/52] Update PUSH.ipynb --- doc/source/nb/dev/PUSH.ipynb | 53 ------------------------------------ 1 file changed, 53 deletions(-) diff --git a/doc/source/nb/dev/PUSH.ipynb b/doc/source/nb/dev/PUSH.ipynb index 0ac5be638..2d0bda9c6 100644 --- a/doc/source/nb/dev/PUSH.ipynb +++ b/doc/source/nb/dev/PUSH.ipynb @@ -24,59 +24,6 @@ "from snewpy.models.base import PinchedModel, SupernovaModel" ] }, - { - "cell_type": "code", - "execution_count": 2, - "id": "b8b559b2-4311-4582-9cf2-fe999807e49c", - "metadata": {}, - "outputs": [], - "source": [ - "class PUSH(PinchedModel):\n", - " \"\"\"Model from the PUSH collaboration\n", - " \"\"\"\n", - "\n", - " def __init__(self, efilename, xfilename, metadata={}):\n", - " \"\"\"\n", - " Parameters\n", - " ----------\n", - " efilename : str\n", - " Absolute or relative path to model data for electron flavor neutrinos.\n", - " xfilename : str\n", - " Absolute or relative path to model data for mutau flavor neutrinos \n", - " \"\"\"\n", - "\n", - " #edatafile = self.request_file(efilename)\n", - " edata = np.genfromtxt(efilename)\n", - " \n", - " #xdatafile = self.request_file(xfilename) \n", - " xdata = np.genfromtxt(xfilename)\n", - "\n", - " simtab = Table()\n", - " \n", - " simtab['TIME'] = edata[:, 0]\n", - "\n", - " simtab['L_NU_E'] = edata[:, 3] << u.erg/u.s\n", - " simtab['L_NU_E_BAR'] = edata[:, 4] << u.erg/u.s\n", - " simtab['L_NU_X'] = xdata[:, 2] << u.erg/u.s\n", - "\n", - " simtab['E_NU_E'] = edata[:, 5] << u.MeV\n", - " simtab['E_NU_E_BAR'] = edata[:, 6] << u.MeV\n", - " simtab['E_NU_X'] = xdata[:, 3] << u.MeV\n", - "\n", - " simtab['ALPHA_NU_E'] = np.full(len(simtab['TIME']),3)\n", - " simtab['ALPHA_NU_E_BAR'] = simtab['ALPHA_NU_E']\n", - " simtab['ALPHA_NU_X'] = simtab['ALPHA_NU_E']\n", - "\n", - " simtab['L_NU_X'] /= 4.0\n", - "\n", - " # prevent negative lums\n", - " simtab['L_NU_E'][simtab['L_NU_E'] < 0] = 1\n", - " simtab['L_NU_E_BAR'][simtab['L_NU_E_BAR'] < 0] = 1\n", - " simtab['L_NU_X'][simtab['L_NU_X'] < 0] = 1\n", - "\n", - " super().__init__(simtab, metadata)\n" - ] - }, { "cell_type": "markdown", "id": "08c9a2f6-d0d4-4071-817d-71b9d7001d00", From 5f5b54d5fb0eafc715f26ef7a19a99780d55e015 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 11 Aug 2026 13:53:05 -0400 Subject: [PATCH 13/52] Update ccsn_loaders.py --- python/snewpy/models/ccsn_loaders.py | 89 ++++++++++++++-------------- 1 file changed, 46 insertions(+), 43 deletions(-) diff --git a/python/snewpy/models/ccsn_loaders.py b/python/snewpy/models/ccsn_loaders.py index 487af82f2..f831e4741 100644 --- a/python/snewpy/models/ccsn_loaders.py +++ b/python/snewpy/models/ccsn_loaders.py @@ -88,6 +88,52 @@ def __init__(self, filename, eos='LS220', metadata={}): } super().__init__(simtab, metadata) + +class PUSHArchiveModel(PinchedModel): + """Subclass that reads models in the format used + by the PUSH collaboration + """ + + def __init__(self, efilename, xfilename, metadata={}): + """ + Parameters + ---------- + efilename : str + Absolute or relative path to model data for electron flavor neutrinos. + xfilename : str + Absolute or relative path to model data for mutau flavor neutrinos + """ + + #edatafile = self.request_file(efilename) + edata = np.genfromtxt(efilename) + + #xdatafile = self.request_file(xfilename) + xdata = np.genfromtxt(xfilename) + + simtab = Table() + + simtab['TIME'] = edata[:, 0] + + simtab['L_NU_E'] = edata[:, 3] << u.erg/u.s + simtab['L_NU_E_BAR'] = edata[:, 4] << u.erg/u.s + simtab['L_NU_X'] = xdata[:, 2] << u.erg/u.s + + simtab['E_NU_E'] = edata[:, 5] << u.MeV + simtab['E_NU_E_BAR'] = edata[:, 6] << u.MeV + simtab['E_NU_X'] = xdata[:, 3] << u.MeV + + simtab['ALPHA_NU_E'] = np.full(len(simtab['TIME']),3) + simtab['ALPHA_NU_E_BAR'] = simtab['ALPHA_NU_E'] + simtab['ALPHA_NU_X'] = simtab['ALPHA_NU_E'] + + # prevent negative lums + simtab['L_NU_E'][simtab['L_NU_E'] < 0] = 1 + simtab['L_NU_E_BAR'][simtab['L_NU_E_BAR'] < 0] = 1 + simtab['L_NU_X'][simtab['L_NU_X'] < 0] = 1 + + super().__init__(simtab, metadata) + + class Nakazato_2013(PinchedModel): def __init__(self, filename, metadata={}): """Model initialization. @@ -1070,47 +1116,4 @@ def __init__(self, filename, metadata={}): super().__init__(simtab, metadata) -class PUSH(PinchedModel): - """Model from the PUSH collaboration - """ - - def __init__(self, efilename, xfilename, metadata={}): - """ - Parameters - ---------- - efilename : str - Absolute or relative path to model data for electron flavor neutrinos. - xfilename : str - Absolute or relative path to model data for mutau flavor neutrinos - """ - - #edatafile = self.request_file(efilename) - edata = np.genfromtxt(efilename) - - #xdatafile = self.request_file(xfilename) - xdata = np.genfromtxt(xfilename) - - simtab = Table() - - simtab['TIME'] = edata[:, 0] - - simtab['L_NU_E'] = edata[:, 3] << u.erg/u.s - simtab['L_NU_E_BAR'] = edata[:, 4] << u.erg/u.s - simtab['L_NU_X'] = xdata[:, 2] << u.erg/u.s - simtab['E_NU_E'] = edata[:, 5] << u.MeV - simtab['E_NU_E_BAR'] = edata[:, 6] << u.MeV - simtab['E_NU_X'] = xdata[:, 3] << u.MeV - - simtab['ALPHA_NU_E'] = np.full(len(simtab['TIME']),3) - simtab['ALPHA_NU_E_BAR'] = simtab['ALPHA_NU_E'] - simtab['ALPHA_NU_X'] = simtab['ALPHA_NU_E'] - - simtab['L_NU_X'] /= 4.0 - - # prevent negative lums - simtab['L_NU_E'][simtab['L_NU_E'] < 0] = 1 - simtab['L_NU_E_BAR'][simtab['L_NU_E_BAR'] < 0] = 1 - simtab['L_NU_X'][simtab['L_NU_X'] < 0] = 1 - - super().__init__(simtab, metadata) From b04e63f759b04105d69db9d516a4675ddafe45e6 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 11 Aug 2026 14:08:19 -0400 Subject: [PATCH 14/52] Update ccsn.py --- python/snewpy/models/ccsn.py | 54 +++++++++++++++--------------------- 1 file changed, 23 insertions(+), 31 deletions(-) diff --git a/python/snewpy/models/ccsn.py b/python/snewpy/models/ccsn.py index b80024299..552957bf1 100644 --- a/python/snewpy/models/ccsn.py +++ b/python/snewpy/models/ccsn.py @@ -41,16 +41,30 @@ class method to get a list of all valid combinations and filter it: from snewpy.models.registry_model import all_models from textwrap import dedent -@RegistryModel() -class PUSH(loaders.PUSH): - """Model from the PUSH collaboration +@RegistryModel( + progenitor_mass= [11.2, 27.] * u.Msun, + eos = ['SFHo'], + callibration = ['cal1', 'cal2'] +) +class Ebinger_2018(loaders.PUSHArchiveModel): + """Model from the PUSH collaboration described in Ebinger et al. """ - def __init__(self): - self.metadata["EOS"] = "LS220" - # neutrino data is in two files - efilename = 'luminosity.d' - xfilename = 'mutau_luminosity.d' - return super().__init__(efilename,xfilename,self.metadata) + def __init__(self, progenitor_mass:u.Quantity), eos:str='SFHo', callibration:str) + filename = f's{progenitor_mass.value:3.1f}._{eos}_{calibration}_Ebinger_luminosity.h' + return super().__init__(filename, self.metadata) + +@RegistryModel( + progenitor_mass= [11.2, 27.] * u.Msun, + eos = ['SFHo'], + callibration = ['cal1'] +) +class Curtis_2019(loaders.PUSHArchiveModel): + """Model from the PUSH collaboration described in Curtis et al. + """ + def __init__(self, progenitor_mass:u.Quantity, eos:str='SFHo', callibration:str): + filename = f's{progenitor_mass.value:3.1f}._{eos}_{calibration}_Curtis_luminosity.h' + return super().__init__(filename, self.metadata) + @RegistryModel() class Fischer_2020(loaders.Fischer_2020): @@ -67,7 +81,6 @@ def __init__(self): revival_time = [0, 100, 200, 300] * u.ms, metallicity = [0.02, 0.004], eos = ['LS220', 'shen', 'togashi'], - _param_validator = lambda p: (p['revival_time'] == 0 * u.ms and p['progenitor_mass'] == 30 * u.Msun and p['metallicity'] == 0.004) or \ (p['revival_time'] != 0 * u.ms and p['eos'] == 'shen' @@ -545,25 +558,4 @@ def get_fluence(self, t): return fluence -class Analytic3Species(PinchedModel): - """An analytical model calculating spectra given total luminosity, - average energy, and rms or pinch, for each species. - """ - - param = "There are no input files available for this class. Use `doc/scripts/Analytic.py` in the SNEWPY GitHub repo to create a custom input file." - - def get_param_combinations(cls): - print(cls.param) - return [] - - def __init__(self, filename): - """ - Parameters - ---------- - filename : str - Absolute or relative path to file with model data. - """ - simtab = Table.read(filename,format='ascii') - self.filename = filename - super().__init__(simtab, metadata={}) From 844220630c0bcbe2170acddae264296af8caa6e0 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 11 Aug 2026 14:10:30 -0400 Subject: [PATCH 15/52] Update ccsn_loaders.py --- python/snewpy/models/ccsn_loaders.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/python/snewpy/models/ccsn_loaders.py b/python/snewpy/models/ccsn_loaders.py index f831e4741..f2ff57570 100644 --- a/python/snewpy/models/ccsn_loaders.py +++ b/python/snewpy/models/ccsn_loaders.py @@ -1117,3 +1117,25 @@ def __init__(self, filename, metadata={}): super().__init__(simtab, metadata) +class PinchedModel(base.PinchedModel): + """An analytical model calculating spectra given total luminosity, + average energy, and rms or pinch, for each species. + """ + + param = "There are no input files available for this class. Use `doc/scripts/Analytic.py` in the SNEWPY GitHub repo to create a custom input file." + + def get_param_combinations(cls): + print(cls.param) + return [] + + def __init__(self, filename): + """ + Parameters + ---------- + filename : str + Absolute or relative path to file with model data. + """ + + simtab = Table.read(filename,format='ascii') + self.filename = filename + super().__init__(simtab, metadata={}) From 07a13b549f4af357231dfdb782ea756745468756 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 11 Aug 2026 14:15:41 -0400 Subject: [PATCH 16/52] Update ccsn_loaders.py --- python/snewpy/models/ccsn_loaders.py | 33 ++++++++++++++-------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/python/snewpy/models/ccsn_loaders.py b/python/snewpy/models/ccsn_loaders.py index f2ff57570..aa9fc3971 100644 --- a/python/snewpy/models/ccsn_loaders.py +++ b/python/snewpy/models/ccsn_loaders.py @@ -19,14 +19,14 @@ import numpy as np from scipy.special import gamma, lpmv +import snewpy.models.base from snewpy.flux import Spectrum -from snewpy.models.base import PinchedModel, SupernovaModel from snewpy.flavor import ThreeFlavor from snewpy import _model_downloader import multiprocessing -class GarchingArchiveModel(PinchedModel): +class GarchingArchiveModel(base.PinchedModel): """Subclass that reads models in the format used in the `Garching Supernova Archive `_.""" def __init__(self, filename, eos='LS220', metadata={}): @@ -89,7 +89,7 @@ def __init__(self, filename, eos='LS220', metadata={}): super().__init__(simtab, metadata) -class PUSHArchiveModel(PinchedModel): +class PUSHArchiveModel(base.PinchedModel): """Subclass that reads models in the format used by the PUSH collaboration """ @@ -134,7 +134,7 @@ def __init__(self, efilename, xfilename, metadata={}): super().__init__(simtab, metadata) -class Nakazato_2013(PinchedModel): +class Nakazato_2013(base.PinchedModel): def __init__(self, filename, metadata={}): """Model initialization. @@ -177,7 +177,7 @@ class Walk_2019(GarchingArchiveModel): pass -class OConnor_2013(PinchedModel): +class OConnor_2013(base.PinchedModel): """Model based on the black hole formation simulation in `O'Connor & Ott (2013) `_. """ @@ -209,7 +209,7 @@ def __init__(self, filename, metadata={}): super().__init__(simtab, metadata) -class OConnor_2015(PinchedModel): +class OConnor_2015(base.PinchedModel): """Model based on the black hole formation simulation in `O'Connor (2015) `_. """ @@ -255,7 +255,7 @@ def __init__(self, filename, metadata={}): class Zha_2021(OConnor_2015): pass -class Warren_2020(PinchedModel): +class Warren_2020(base.PinchedModel): def __init__(self, filename, metadata={}): """ Parameters @@ -301,7 +301,7 @@ def __init__(self, filename, metadata={}): super().__init__(simtab, metadata) -class Kuroda_2020(PinchedModel): +class Kuroda_2020(base.PinchedModel): def __init__(self, filename, metadata={}): """ Parameters @@ -328,7 +328,7 @@ def __init__(self, filename, metadata={}): super().__init__(simtab, metadata) -class Fornax_2019(SupernovaModel): +class Fornax_2019(base.SupernovaModel): def __init__(self, filename, metadata={}, cache_flux=False): """ Parameters @@ -703,7 +703,7 @@ def _get_initial_spectra_dict(self, t, E, theta, phi, flavors=ThreeFlavor, inter return initial_spectra -class Fornax_2021(SupernovaModel): +class Fornax_2021(base.SupernovaModel): def __init__(self, filename, metadata={}): """ Parameters @@ -923,7 +923,7 @@ def __init__(self, filename, metadata={}): self.luminosity[flavor] = np.sum(dLdE*dE, axis=1) * factor * 1e50 * u.erg/u.s -class Mori_2023(PinchedModel): +class Mori_2023(base.PinchedModel): def __init__(self, filename, metadata={}): """ Parameters @@ -971,7 +971,7 @@ def __init__(self, filename, metadata={}): super().__init__(simtab, metadata) -class Takata_2025(PinchedModel): +class Takata_2025(base.PinchedModel): def __init__(self, filename, metadata={}): """ Parameters @@ -1017,7 +1017,7 @@ def __init__(self, filename, metadata={}): super().__init__(simtab, metadata) -class Bugli_2021(PinchedModel): +class Bugli_2021(base.PinchedModel): """Model based on `Buggli (2021) `_. """ @@ -1048,7 +1048,7 @@ def __init__(self, filename, metadata={}): super().__init__(simtab, metadata) -class Fischer_2020(PinchedModel): +class Fischer_2020(base.PinchedModel): def __init__(self, filename, metadata={}): """ Parameters @@ -1118,8 +1118,9 @@ def __init__(self, filename, metadata={}): class PinchedModel(base.PinchedModel): - """An analytical model calculating spectra given total luminosity, - average energy, and rms or pinch, for each species. + """This is the loader version of base.PinchedModel i.e. it reads the data + for the PinchedModel from a file. The format of the file is that made by + the `doc/scripts/Analytic.py` script """ param = "There are no input files available for this class. Use `doc/scripts/Analytic.py` in the SNEWPY GitHub repo to create a custom input file." From 52b64d80da4507357d6c53cd03ce731dd460cacc Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 11 Aug 2026 14:25:43 -0400 Subject: [PATCH 17/52] Update ccsn_loaders.py --- python/snewpy/models/ccsn_loaders.py | 42 +++++++++++++++------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/python/snewpy/models/ccsn_loaders.py b/python/snewpy/models/ccsn_loaders.py index aa9fc3971..be404af07 100644 --- a/python/snewpy/models/ccsn_loaders.py +++ b/python/snewpy/models/ccsn_loaders.py @@ -94,39 +94,41 @@ class PUSHArchiveModel(base.PinchedModel): by the PUSH collaboration """ - def __init__(self, efilename, xfilename, metadata={}): + def __init__(self, filename, metadata={}): """ Parameters ---------- - efilename : str - Absolute or relative path to model data for electron flavor neutrinos. - xfilename : str - Absolute or relative path to model data for mutau flavor neutrinos + filename : str + Absolute or relative path to model data """ - - #edatafile = self.request_file(efilename) - edata = np.genfromtxt(efilename) - - #xdatafile = self.request_file(xfilename) - xdata = np.genfromtxt(xfilename) + datafile = self.request_file(filename) + f = h5py.File(datafile, 'r') simtab = Table() - - simtab['TIME'] = edata[:, 0] - simtab['L_NU_E'] = edata[:, 3] << u.erg/u.s - simtab['L_NU_E_BAR'] = edata[:, 4] << u.erg/u.s - simtab['L_NU_X'] = xdata[:, 2] << u.erg/u.s + simtab['TIME'] = f['nue_data']['lum'][:, 0] + + simtab['L_NU_E'] = f['nue_data']['lum'][:, 1] << u.erg/u.s + simtab['L_NU_E_BAR'] = f['nuae_data']['lum'][:, 1] << u.erg/u.s + simtab['L_NU_X'] = f['nux_data']['lum'][:, 1] << u.erg/u.s + + simtab['E_NU_E'] = f['nue_data']['avg_energy'][:, 1] << u.MeV + simtab['E_NU_E_BAR'] = f['nuae_data']['avg_energy'][:, 1] << u.MeV + simtab['E_NU_X'] = f['nux_data']['avg_energy'][:, 1] << u.MeV - simtab['E_NU_E'] = edata[:, 5] << u.MeV - simtab['E_NU_E_BAR'] = edata[:, 6] << u.MeV - simtab['E_NU_X'] = xdata[:, 3] << u.MeV + #simtab['L_NU_E'] = edata[:, 3] << u.erg/u.s + #simtab['L_NU_E_BAR'] = edata[:, 4] << u.erg/u.s + #simtab['L_NU_X'] = xdata[:, 2] << u.erg/u.s + #simtab['E_NU_E'] = edata[:, 5] << u.MeV + #simtab['E_NU_E_BAR'] = edata[:, 6] << u.MeV + #simtab['E_NU_X'] = xdata[:, 3] << u.MeV + simtab['ALPHA_NU_E'] = np.full(len(simtab['TIME']),3) simtab['ALPHA_NU_E_BAR'] = simtab['ALPHA_NU_E'] simtab['ALPHA_NU_X'] = simtab['ALPHA_NU_E'] - # prevent negative lums + # prevent negative luminosities simtab['L_NU_E'][simtab['L_NU_E'] < 0] = 1 simtab['L_NU_E_BAR'][simtab['L_NU_E_BAR'] < 0] = 1 simtab['L_NU_X'][simtab['L_NU_X'] < 0] = 1 From 57027cf84b72fcb50557a63d72eb9c81a1fd4359 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 11 Aug 2026 14:26:40 -0400 Subject: [PATCH 18/52] Update ccsn.py --- python/snewpy/models/ccsn.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/python/snewpy/models/ccsn.py b/python/snewpy/models/ccsn.py index 552957bf1..0ee80f407 100644 --- a/python/snewpy/models/ccsn.py +++ b/python/snewpy/models/ccsn.py @@ -44,25 +44,25 @@ class method to get a list of all valid combinations and filter it: @RegistryModel( progenitor_mass= [11.2, 27.] * u.Msun, eos = ['SFHo'], - callibration = ['cal1', 'cal2'] + callibration = ['calI', 'calII'] ) class Ebinger_2018(loaders.PUSHArchiveModel): """Model from the PUSH collaboration described in Ebinger et al. """ def __init__(self, progenitor_mass:u.Quantity), eos:str='SFHo', callibration:str) - filename = f's{progenitor_mass.value:3.1f}._{eos}_{calibration}_Ebinger_luminosity.h' + filename = f's{progenitor_mass.value:3.1f}._{eos}_{calibration}_Ebinger_luminosity.h5' return super().__init__(filename, self.metadata) @RegistryModel( progenitor_mass= [11.2, 27.] * u.Msun, eos = ['SFHo'], - callibration = ['cal1'] + callibration = ['calI', 'calII'] ) class Curtis_2019(loaders.PUSHArchiveModel): """Model from the PUSH collaboration described in Curtis et al. """ def __init__(self, progenitor_mass:u.Quantity, eos:str='SFHo', callibration:str): - filename = f's{progenitor_mass.value:3.1f}._{eos}_{calibration}_Curtis_luminosity.h' + filename = f's{progenitor_mass.value:3.1f}._{eos}_{calibration}_Curtis_luminosity.h5' return super().__init__(filename, self.metadata) From 3f73bcbcc69d5bc43923ac5c94e58c8d1ce46ad5 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 11 Aug 2026 14:51:03 -0400 Subject: [PATCH 19/52] Update ccsn_loaders.py --- python/snewpy/models/ccsn_loaders.py | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/python/snewpy/models/ccsn_loaders.py b/python/snewpy/models/ccsn_loaders.py index be404af07..e769a0ec5 100644 --- a/python/snewpy/models/ccsn_loaders.py +++ b/python/snewpy/models/ccsn_loaders.py @@ -106,23 +106,15 @@ def __init__(self, filename, metadata={}): simtab = Table() - simtab['TIME'] = f['nue_data']['lum'][:, 0] + simtab['TIME'] = f['times'] * u.s - simtab['L_NU_E'] = f['nue_data']['lum'][:, 1] << u.erg/u.s - simtab['L_NU_E_BAR'] = f['nuae_data']['lum'][:, 1] << u.erg/u.s - simtab['L_NU_X'] = f['nux_data']['lum'][:, 1] << u.erg/u.s + simtab['L_NU_E'] = f['data']['lum_e'] << u.erg/u.s + simtab['L_NU_E_BAR'] = f['data']['lum_ebar'][:, 2] << u.erg/u.s + simtab['L_NU_X'] = f['data']['lum']['lum_x'] << u.erg/u.s - simtab['E_NU_E'] = f['nue_data']['avg_energy'][:, 1] << u.MeV - simtab['E_NU_E_BAR'] = f['nuae_data']['avg_energy'][:, 1] << u.MeV - simtab['E_NU_X'] = f['nux_data']['avg_energy'][:, 1] << u.MeV - - #simtab['L_NU_E'] = edata[:, 3] << u.erg/u.s - #simtab['L_NU_E_BAR'] = edata[:, 4] << u.erg/u.s - #simtab['L_NU_X'] = xdata[:, 2] << u.erg/u.s - - #simtab['E_NU_E'] = edata[:, 5] << u.MeV - #simtab['E_NU_E_BAR'] = edata[:, 6] << u.MeV - #simtab['E_NU_X'] = xdata[:, 3] << u.MeV + simtab['E_NU_E'] = f['data']['lum_e'] / f['data']['nlum_e'] << u.erg + simtab['E_NU_E_BAR'] = f['data']['lum_ebar'] / f['data']['nlum_ebar'] << u.erg + simtab['E_NU_X'] = f['data']['lum_x'] / f['data']['nlum_x'] << u.erg simtab['ALPHA_NU_E'] = np.full(len(simtab['TIME']),3) simtab['ALPHA_NU_E_BAR'] = simtab['ALPHA_NU_E'] @@ -133,6 +125,8 @@ def __init__(self, filename, metadata={}): simtab['L_NU_E_BAR'][simtab['L_NU_E_BAR'] < 0] = 1 simtab['L_NU_X'][simtab['L_NU_X'] < 0] = 1 + metadata== f['metadata'] + super().__init__(simtab, metadata) From c6446fb03af683a1419b1c3fae4c8cfcb2592d9c Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 11 Aug 2026 15:17:26 -0400 Subject: [PATCH 20/52] Update ccsn.py --- python/snewpy/models/ccsn.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/snewpy/models/ccsn.py b/python/snewpy/models/ccsn.py index 0ee80f407..6ca3df25b 100644 --- a/python/snewpy/models/ccsn.py +++ b/python/snewpy/models/ccsn.py @@ -49,7 +49,7 @@ class method to get a list of all valid combinations and filter it: class Ebinger_2018(loaders.PUSHArchiveModel): """Model from the PUSH collaboration described in Ebinger et al. """ - def __init__(self, progenitor_mass:u.Quantity), eos:str='SFHo', callibration:str) + def __init__(self, progenitor_mass:u.Quantity, eos:str='SFHo', callibration:str) filename = f's{progenitor_mass.value:3.1f}._{eos}_{calibration}_Ebinger_luminosity.h5' return super().__init__(filename, self.metadata) From d0337374c513d9a57a7d9bb2da82a749951b12bd Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 11 Aug 2026 15:23:47 -0400 Subject: [PATCH 21/52] Update ccsn.py --- python/snewpy/models/ccsn.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/snewpy/models/ccsn.py b/python/snewpy/models/ccsn.py index 6ca3df25b..ae3dc34fc 100644 --- a/python/snewpy/models/ccsn.py +++ b/python/snewpy/models/ccsn.py @@ -50,7 +50,7 @@ class Ebinger_2018(loaders.PUSHArchiveModel): """Model from the PUSH collaboration described in Ebinger et al. """ def __init__(self, progenitor_mass:u.Quantity, eos:str='SFHo', callibration:str) - filename = f's{progenitor_mass.value:3.1f}._{eos}_{calibration}_Ebinger_luminosity.h5' + filename = f's{progenitor_mass.value:3.1f}._{eos}_{callibration}_Ebinger_luminosity.h5' return super().__init__(filename, self.metadata) @RegistryModel( @@ -62,7 +62,7 @@ class Curtis_2019(loaders.PUSHArchiveModel): """Model from the PUSH collaboration described in Curtis et al. """ def __init__(self, progenitor_mass:u.Quantity, eos:str='SFHo', callibration:str): - filename = f's{progenitor_mass.value:3.1f}._{eos}_{calibration}_Curtis_luminosity.h5' + filename = f's{progenitor_mass.value:3.1f}._{eos}_{callibration}_Curtis_luminosity.h5' return super().__init__(filename, self.metadata) From 484ee729ec7fc716e36479a3f3237c2b88b17c17 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 11 Aug 2026 15:25:27 -0400 Subject: [PATCH 22/52] Update ccsn_loaders.py --- python/snewpy/models/ccsn_loaders.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/snewpy/models/ccsn_loaders.py b/python/snewpy/models/ccsn_loaders.py index e769a0ec5..751035292 100644 --- a/python/snewpy/models/ccsn_loaders.py +++ b/python/snewpy/models/ccsn_loaders.py @@ -19,7 +19,7 @@ import numpy as np from scipy.special import gamma, lpmv -import snewpy.models.base +import snewpy.models.base as base from snewpy.flux import Spectrum from snewpy.flavor import ThreeFlavor from snewpy import _model_downloader From ffe2e583a4b48a17978feb340b6d8242c2979a47 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 11 Aug 2026 15:35:53 -0400 Subject: [PATCH 23/52] Update ccsn_loaders.py --- python/snewpy/models/ccsn_loaders.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python/snewpy/models/ccsn_loaders.py b/python/snewpy/models/ccsn_loaders.py index 751035292..c476bae6f 100644 --- a/python/snewpy/models/ccsn_loaders.py +++ b/python/snewpy/models/ccsn_loaders.py @@ -106,7 +106,8 @@ def __init__(self, filename, metadata={}): simtab = Table() - simtab['TIME'] = f['times'] * u.s + tbounce = f['metadata']['bounce_time'] * u.s + simtab['TIME'] = f['times'] * u.s - tbounce simtab['L_NU_E'] = f['data']['lum_e'] << u.erg/u.s simtab['L_NU_E_BAR'] = f['data']['lum_ebar'][:, 2] << u.erg/u.s From 74ce79616239769a43768db7ea9ae73819ab3503 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 11 Aug 2026 15:40:45 -0400 Subject: [PATCH 24/52] Update ccsn.py --- python/snewpy/models/ccsn.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/snewpy/models/ccsn.py b/python/snewpy/models/ccsn.py index ae3dc34fc..1642758bb 100644 --- a/python/snewpy/models/ccsn.py +++ b/python/snewpy/models/ccsn.py @@ -49,7 +49,7 @@ class method to get a list of all valid combinations and filter it: class Ebinger_2018(loaders.PUSHArchiveModel): """Model from the PUSH collaboration described in Ebinger et al. """ - def __init__(self, progenitor_mass:u.Quantity, eos:str='SFHo', callibration:str) + def __init__(self, progenitor_mass:u.Quantity, eos:str='SFHo', callibration:str='calI') filename = f's{progenitor_mass.value:3.1f}._{eos}_{callibration}_Ebinger_luminosity.h5' return super().__init__(filename, self.metadata) @@ -61,7 +61,7 @@ def __init__(self, progenitor_mass:u.Quantity, eos:str='SFHo', callibration:str) class Curtis_2019(loaders.PUSHArchiveModel): """Model from the PUSH collaboration described in Curtis et al. """ - def __init__(self, progenitor_mass:u.Quantity, eos:str='SFHo', callibration:str): + def __init__(self, progenitor_mass:u.Quantity, eos:str='SFHo', callibration:str='calI'): filename = f's{progenitor_mass.value:3.1f}._{eos}_{callibration}_Curtis_luminosity.h5' return super().__init__(filename, self.metadata) From a986ae71e779d0a8e351d1da26fa592e700131fa Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 11 Aug 2026 15:54:39 -0400 Subject: [PATCH 25/52] Update ccsn.py --- python/snewpy/models/ccsn.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/python/snewpy/models/ccsn.py b/python/snewpy/models/ccsn.py index 1642758bb..94bab141e 100644 --- a/python/snewpy/models/ccsn.py +++ b/python/snewpy/models/ccsn.py @@ -65,6 +65,19 @@ def __init__(self, progenitor_mass:u.Quantity, eos:str='SFHo', callibration:str= filename = f's{progenitor_mass.value:3.1f}._{eos}_{callibration}_Curtis_luminosity.h5' return super().__init__(filename, self.metadata) +@RegistryModel( + progenitor_mass= np.concatenate( (np.linspace(10.8, 28.2, 0.2), + np.linspace(29, 40, 1)) ) << u.Msun, + eos = ['SFHo', 'SFHx', 'DD2', 'BHB', 'TM1', NL3'], + callibration = ['calI'] +) +class Wolfe_2023(loaders.PUSHArchiveModel): + """Model from the PUSH collaboration described in Wolfe et al. + """ + def __init__(self, progenitor_mass:u.Quantity, eos:str='SFHo', callibration:str='calI') + filename = f's{progenitor_mass.value:3.1f}._{eos}_{callibration}_Wolfe_luminosity.h5' + return super().__init__(filename, self.metadata) + @RegistryModel() class Fischer_2020(loaders.Fischer_2020): @@ -76,6 +89,7 @@ def __init__(self): filename='Fischer_2020.tar.gz' return super().__init__(filename, metadata=self.metadata) + @RegistryModel( progenitor_mass = [13, 20, 30, 50] * u.Msun, revival_time = [0, 100, 200, 300] * u.ms, From 545b1ca50b404b8b64af5fcf64c67153bec4c3b5 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 11 Aug 2026 15:58:48 -0400 Subject: [PATCH 26/52] Update ccsn_loaders.py --- python/snewpy/models/ccsn_loaders.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/snewpy/models/ccsn_loaders.py b/python/snewpy/models/ccsn_loaders.py index c476bae6f..be2e93397 100644 --- a/python/snewpy/models/ccsn_loaders.py +++ b/python/snewpy/models/ccsn_loaders.py @@ -101,7 +101,7 @@ def __init__(self, filename, metadata={}): filename : str Absolute or relative path to model data """ - datafile = self.request_file(filename) + datafile = filename #self.request_file(filename) f = h5py.File(datafile, 'r') simtab = Table() From a0034c9dc2f58675d07fcef80f5d0efda27e75e1 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 11 Aug 2026 15:59:33 -0400 Subject: [PATCH 27/52] Update ccsn.py --- python/snewpy/models/ccsn.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/snewpy/models/ccsn.py b/python/snewpy/models/ccsn.py index 94bab141e..019d6fd3b 100644 --- a/python/snewpy/models/ccsn.py +++ b/python/snewpy/models/ccsn.py @@ -68,7 +68,7 @@ def __init__(self, progenitor_mass:u.Quantity, eos:str='SFHo', callibration:str= @RegistryModel( progenitor_mass= np.concatenate( (np.linspace(10.8, 28.2, 0.2), np.linspace(29, 40, 1)) ) << u.Msun, - eos = ['SFHo', 'SFHx', 'DD2', 'BHB', 'TM1', NL3'], + eos = ['SFHo', 'SFHx', 'DD2', 'BHB', 'TM1', 'NL3'], callibration = ['calI'] ) class Wolfe_2023(loaders.PUSHArchiveModel): From 92890063f95100a0f1ca14977de51a1a9e293f22 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 11 Aug 2026 16:01:18 -0400 Subject: [PATCH 28/52] Update PUSH.ipynb --- doc/source/nb/dev/PUSH.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/source/nb/dev/PUSH.ipynb b/doc/source/nb/dev/PUSH.ipynb index 2d0bda9c6..1428f95b0 100644 --- a/doc/source/nb/dev/PUSH.ipynb +++ b/doc/source/nb/dev/PUSH.ipynb @@ -18,7 +18,7 @@ "import astropy.units as u\n", "import numpy as np\n", "\n", - "from snewpy.models import ccsn, ccsn_loaders\n", + "from snewpy.models import ccsn\n", "from snewpy.flavor_transformation import AdiabaticMSW\n", "from snewpy.neutrino import MixingParameters\n", "from snewpy.models.base import PinchedModel, SupernovaModel" @@ -114,7 +114,7 @@ "from astropy.table import Table, join\n", "\n", "# prepare the neutrino flux from the model\n", - "model = PUSH(\"luminosity.d\",\"mutau_luminosity.d\") # SN model\n", + "model = WOLFE_2023(\"s27.6_SFHo_calI_Wolfe_luminosity.h5") # SN model\n", "transformation = AdiabaticMSW(MixingParameters('NORMAL')) # Desired flavor transformation\n", "\n", "times = model.get_time()\n", From f03f3c3f7ef0fa93a79fabc282929f4d1e8b42ad Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 11 Aug 2026 16:04:19 -0400 Subject: [PATCH 29/52] Update ccsn.py --- python/snewpy/models/ccsn.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/python/snewpy/models/ccsn.py b/python/snewpy/models/ccsn.py index 019d6fd3b..a0c0e1d0f 100644 --- a/python/snewpy/models/ccsn.py +++ b/python/snewpy/models/ccsn.py @@ -49,9 +49,9 @@ class method to get a list of all valid combinations and filter it: class Ebinger_2018(loaders.PUSHArchiveModel): """Model from the PUSH collaboration described in Ebinger et al. """ - def __init__(self, progenitor_mass:u.Quantity, eos:str='SFHo', callibration:str='calI') - filename = f's{progenitor_mass.value:3.1f}._{eos}_{callibration}_Ebinger_luminosity.h5' - return super().__init__(filename, self.metadata) + def __init__(self, progenitor_mass:u.Quantity, eos:str='SFHo', callibration:str='calI'): + filename = f's{progenitor_mass.value:2.1f}._{eos}_{callibration}_Ebinger_luminosity.h5' + return super().__init__(filename, metadata=self.metadata) @RegistryModel( progenitor_mass= [11.2, 27.] * u.Msun, @@ -62,8 +62,8 @@ class Curtis_2019(loaders.PUSHArchiveModel): """Model from the PUSH collaboration described in Curtis et al. """ def __init__(self, progenitor_mass:u.Quantity, eos:str='SFHo', callibration:str='calI'): - filename = f's{progenitor_mass.value:3.1f}._{eos}_{callibration}_Curtis_luminosity.h5' - return super().__init__(filename, self.metadata) + filename = f's{progenitor_mass.value:2.1f}._{eos}_{callibration}_Curtis_luminosity.h5' + return super().__init__(filename, metadata=self.metadata) @RegistryModel( progenitor_mass= np.concatenate( (np.linspace(10.8, 28.2, 0.2), @@ -74,9 +74,9 @@ def __init__(self, progenitor_mass:u.Quantity, eos:str='SFHo', callibration:str= class Wolfe_2023(loaders.PUSHArchiveModel): """Model from the PUSH collaboration described in Wolfe et al. """ - def __init__(self, progenitor_mass:u.Quantity, eos:str='SFHo', callibration:str='calI') - filename = f's{progenitor_mass.value:3.1f}._{eos}_{callibration}_Wolfe_luminosity.h5' - return super().__init__(filename, self.metadata) + def __init__(self, progenitor_mass:u.Quantity, eos:str='SFHo', callibration:str='calI'): + filename = f's{progenitor_mass.value:2.1f}._{eos}_{callibration}_Wolfe_luminosity.h5' + return super().__init__(filename, metadata=self.metadata) @RegistryModel() From 1b0279170cad61681d10e11db0e7b35cedc49660 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 11 Aug 2026 16:12:29 -0400 Subject: [PATCH 30/52] Update ccsn.py --- python/snewpy/models/ccsn.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/python/snewpy/models/ccsn.py b/python/snewpy/models/ccsn.py index a0c0e1d0f..32b2d49d9 100644 --- a/python/snewpy/models/ccsn.py +++ b/python/snewpy/models/ccsn.py @@ -66,8 +66,9 @@ def __init__(self, progenitor_mass:u.Quantity, eos:str='SFHo', callibration:str= return super().__init__(filename, metadata=self.metadata) @RegistryModel( - progenitor_mass= np.concatenate( (np.linspace(10.8, 28.2, 0.2), - np.linspace(29, 40, 1)) ) << u.Msun, + progenitor_mass = Parameter(np.concatenate((np.linspace(10.8, 28.2, 0.2), + np.linspace(29, 40, 1) ) )) << u.Msun, + desc_values='[10.8..+0.2..28.2, 29..+1..40] solMass'), eos = ['SFHo', 'SFHx', 'DD2', 'BHB', 'TM1', 'NL3'], callibration = ['calI'] ) From 1382d2ef65cc7892a888edb6044f14179cfe6776 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 11 Aug 2026 16:12:50 -0400 Subject: [PATCH 31/52] Update ccsn_loaders.py --- python/snewpy/models/ccsn_loaders.py | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/python/snewpy/models/ccsn_loaders.py b/python/snewpy/models/ccsn_loaders.py index be2e93397..fba46b1da 100644 --- a/python/snewpy/models/ccsn_loaders.py +++ b/python/snewpy/models/ccsn_loaders.py @@ -1114,26 +1114,4 @@ def __init__(self, filename, metadata={}): super().__init__(simtab, metadata) -class PinchedModel(base.PinchedModel): - """This is the loader version of base.PinchedModel i.e. it reads the data - for the PinchedModel from a file. The format of the file is that made by - the `doc/scripts/Analytic.py` script - """ - - param = "There are no input files available for this class. Use `doc/scripts/Analytic.py` in the SNEWPY GitHub repo to create a custom input file." - - def get_param_combinations(cls): - print(cls.param) - return [] - - def __init__(self, filename): - """ - Parameters - ---------- - filename : str - Absolute or relative path to file with model data. - """ - simtab = Table.read(filename,format='ascii') - self.filename = filename - super().__init__(simtab, metadata={}) From 6ec182dfe88f9f9daac339c30ce2eaf86c521128 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 11 Aug 2026 16:15:04 -0400 Subject: [PATCH 32/52] Update ccsn.py --- python/snewpy/models/ccsn.py | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/python/snewpy/models/ccsn.py b/python/snewpy/models/ccsn.py index 32b2d49d9..eea0198ce 100644 --- a/python/snewpy/models/ccsn.py +++ b/python/snewpy/models/ccsn.py @@ -34,8 +34,8 @@ class method to get a list of all valid combinations and filter it: from astropy import units as u from astropy.table import Table +import snewpy.model.base as base from snewpy.models import ccsn_loaders as loaders -from .base import PinchedModel from snewpy.models.registry_model import RegistryModel, Parameter from snewpy.models.registry_model import all_models @@ -573,4 +573,26 @@ def get_fluence(self, t): return fluence +class Analytic3Species(base.PinchedModel): + """This is the basically the loader version of base.PinchedModel i.e. it reads the data + for the PinchedModel from a file. The format of the file is that made by + the `doc/scripts/Analytic.py` script + """ + + param = "There are no input files available for this class. Use `doc/scripts/Analytic.py` in the SNEWPY GitHub repo to create a custom input file." + + def get_param_combinations(cls): + print(cls.param) + return [] + + def __init__(self, filename): + """ + Parameters + ---------- + filename : str + Absolute or relative path to file with model data. + """ + simtab = Table.read(filename,format='ascii') + self.filename = filename + super().__init__(simtab, metadata={}) From 56cf3d4b4478ecd5606a4ec48f1f056868bf4836 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 11 Aug 2026 16:19:55 -0400 Subject: [PATCH 33/52] Update ccsn.py --- python/snewpy/models/ccsn.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/python/snewpy/models/ccsn.py b/python/snewpy/models/ccsn.py index eea0198ce..64c2beb5e 100644 --- a/python/snewpy/models/ccsn.py +++ b/python/snewpy/models/ccsn.py @@ -65,9 +65,10 @@ def __init__(self, progenitor_mass:u.Quantity, eos:str='SFHo', callibration:str= filename = f's{progenitor_mass.value:2.1f}._{eos}_{callibration}_Curtis_luminosity.h5' return super().__init__(filename, metadata=self.metadata) + @RegistryModel( progenitor_mass = Parameter(np.concatenate((np.linspace(10.8, 28.2, 0.2), - np.linspace(29, 40, 1) ) )) << u.Msun, + np.linspace(29, 40, 1) )) << u.Msun, desc_values='[10.8..+0.2..28.2, 29..+1..40] solMass'), eos = ['SFHo', 'SFHx', 'DD2', 'BHB', 'TM1', 'NL3'], callibration = ['calI'] @@ -228,7 +229,7 @@ def __init__(self, progenitor_mass:u.Quantity): @RegistryModel( progenitor_mass = Parameter(values=(list(range(16, 27)) + [19.89, 22.39, 30, 33]) * u.Msun, desc_values = '[16..26, 19.89, 22.39, 30, 33] solMass' - ), + ) ) class Zha_2021(loaders.Zha_2021): """Model based on the hadron-quark phse transition models from `Zha et al. 2021 `_. @@ -250,7 +251,7 @@ def __init__(self, *, progenitor_mass:u.Quantity): name='turbmixing_param', label='Turb. mixing param.', description='Turbulent mixing parameter alpha_lambda', - ), + ) ) class Warren_2020(loaders.Warren_2020): """Model based on simulations from Warren et al., ApJ 898:139, 2020. From 33c2a842adf00c97e942a2d4190bcf6b4f33e96f Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 11 Aug 2026 16:25:34 -0400 Subject: [PATCH 34/52] Update ccsn.py --- python/snewpy/models/ccsn.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/snewpy/models/ccsn.py b/python/snewpy/models/ccsn.py index 64c2beb5e..eea51b873 100644 --- a/python/snewpy/models/ccsn.py +++ b/python/snewpy/models/ccsn.py @@ -34,7 +34,7 @@ class method to get a list of all valid combinations and filter it: from astropy import units as u from astropy.table import Table -import snewpy.model.base as base +from snewpy.models import base from snewpy.models import ccsn_loaders as loaders from snewpy.models.registry_model import RegistryModel, Parameter From 8d858131bd37bb9d8f0b48e95c45e6f51fd15378 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 11 Aug 2026 16:25:51 -0400 Subject: [PATCH 35/52] Update ccsn_loaders.py --- python/snewpy/models/ccsn_loaders.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/snewpy/models/ccsn_loaders.py b/python/snewpy/models/ccsn_loaders.py index fba46b1da..5bc4c99ce 100644 --- a/python/snewpy/models/ccsn_loaders.py +++ b/python/snewpy/models/ccsn_loaders.py @@ -19,7 +19,7 @@ import numpy as np from scipy.special import gamma, lpmv -import snewpy.models.base as base +from snewpy.models import base from snewpy.flux import Spectrum from snewpy.flavor import ThreeFlavor from snewpy import _model_downloader From ccbb6301ec4c3c891eafdb28d6040fcfe296ee0f Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 11 Aug 2026 16:34:47 -0400 Subject: [PATCH 36/52] Update ccsn.py --- python/snewpy/models/ccsn.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/snewpy/models/ccsn.py b/python/snewpy/models/ccsn.py index eea51b873..862d25b57 100644 --- a/python/snewpy/models/ccsn.py +++ b/python/snewpy/models/ccsn.py @@ -67,8 +67,8 @@ def __init__(self, progenitor_mass:u.Quantity, eos:str='SFHo', callibration:str= @RegistryModel( - progenitor_mass = Parameter(np.concatenate((np.linspace(10.8, 28.2, 0.2), - np.linspace(29, 40, 1) )) << u.Msun, + progenitor_mass = Parameter(np.concatenate((np.arange(10.8, 28.2+0.1, 0.2), + np.arange(29, 40+0.1, 1) )) << u.Msun, desc_values='[10.8..+0.2..28.2, 29..+1..40] solMass'), eos = ['SFHo', 'SFHx', 'DD2', 'BHB', 'TM1', 'NL3'], callibration = ['calI'] From eb9b83a334303a55c520805bd6101c719acc45eb Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 11 Aug 2026 16:46:01 -0400 Subject: [PATCH 37/52] Update PUSH.ipynb --- doc/source/nb/dev/PUSH.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/nb/dev/PUSH.ipynb b/doc/source/nb/dev/PUSH.ipynb index 1428f95b0..e90f570c2 100644 --- a/doc/source/nb/dev/PUSH.ipynb +++ b/doc/source/nb/dev/PUSH.ipynb @@ -114,7 +114,7 @@ "from astropy.table import Table, join\n", "\n", "# prepare the neutrino flux from the model\n", - "model = WOLFE_2023(\"s27.6_SFHo_calI_Wolfe_luminosity.h5") # SN model\n", + "model = WOLFE_2023(\"s27.6_SFHo_calI_Wolfe_luminosity.h5\") # SN model\n", "transformation = AdiabaticMSW(MixingParameters('NORMAL')) # Desired flavor transformation\n", "\n", "times = model.get_time()\n", From e81d50848a18ed71ac08e0b9203c6a807955cd81 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 11 Aug 2026 19:21:30 -0400 Subject: [PATCH 38/52] Add files via upload --- python/snewpy/models/ccsn.py | 17 ++++++++--------- python/snewpy/models/ccsn_loaders.py | 7 ++++--- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/python/snewpy/models/ccsn.py b/python/snewpy/models/ccsn.py index 862d25b57..bb3930067 100644 --- a/python/snewpy/models/ccsn.py +++ b/python/snewpy/models/ccsn.py @@ -50,8 +50,8 @@ class Ebinger_2018(loaders.PUSHArchiveModel): """Model from the PUSH collaboration described in Ebinger et al. """ def __init__(self, progenitor_mass:u.Quantity, eos:str='SFHo', callibration:str='calI'): - filename = f's{progenitor_mass.value:2.1f}._{eos}_{callibration}_Ebinger_luminosity.h5' - return super().__init__(filename, metadata=self.metadata) + filename = f's{progenitor_mass.value:2.1f}_{eos}_{callibration}_Ebinger_luminosity.h5' + return super().__init__(filename=filename, metadata=self.metadata) @RegistryModel( progenitor_mass= [11.2, 27.] * u.Msun, @@ -62,14 +62,13 @@ class Curtis_2019(loaders.PUSHArchiveModel): """Model from the PUSH collaboration described in Curtis et al. """ def __init__(self, progenitor_mass:u.Quantity, eos:str='SFHo', callibration:str='calI'): - filename = f's{progenitor_mass.value:2.1f}._{eos}_{callibration}_Curtis_luminosity.h5' - return super().__init__(filename, metadata=self.metadata) + filename = f's{progenitor_mass.value:2.1f}_{eos}_{callibration}_Curtis_luminosity.h5' + return super().__init__(filename=filename, metadata=self.metadata) @RegistryModel( - progenitor_mass = Parameter(np.concatenate((np.arange(10.8, 28.2+0.1, 0.2), - np.arange(29, 40+0.1, 1) )) << u.Msun, - desc_values='[10.8..+0.2..28.2, 29..+1..40] solMass'), + #progenitor_mass = np.concat( (np.arange(10.8,28.2+0.01,0.2),np.arange(29,40+0.01,1)) ) * u.Msun, + progenitor_mass = [ 10.8, 27.6, 28.2, 29, 40] * u.Msun, eos = ['SFHo', 'SFHx', 'DD2', 'BHB', 'TM1', 'NL3'], callibration = ['calI'] ) @@ -77,8 +76,8 @@ class Wolfe_2023(loaders.PUSHArchiveModel): """Model from the PUSH collaboration described in Wolfe et al. """ def __init__(self, progenitor_mass:u.Quantity, eos:str='SFHo', callibration:str='calI'): - filename = f's{progenitor_mass.value:2.1f}._{eos}_{callibration}_Wolfe_luminosity.h5' - return super().__init__(filename, metadata=self.metadata) + filename = f's{progenitor_mass.value:2.1f}_{eos}_{callibration}_Wolfe_luminosity.h5' + return super().__init__(filename=filename, metadata=self.metadata) @RegistryModel() diff --git a/python/snewpy/models/ccsn_loaders.py b/python/snewpy/models/ccsn_loaders.py index 5bc4c99ce..80193f8f1 100644 --- a/python/snewpy/models/ccsn_loaders.py +++ b/python/snewpy/models/ccsn_loaders.py @@ -102,12 +102,13 @@ def __init__(self, filename, metadata={}): Absolute or relative path to model data """ datafile = filename #self.request_file(filename) + print(datafile) f = h5py.File(datafile, 'r') simtab = Table() - tbounce = f['metadata']['bounce_time'] * u.s - simtab['TIME'] = f['times'] * u.s - tbounce + #tbounce = f['metadata']['bounce_time'] * u.s + simtab['TIME'] = f['times'] * u.s #- tbounce simtab['L_NU_E'] = f['data']['lum_e'] << u.erg/u.s simtab['L_NU_E_BAR'] = f['data']['lum_ebar'][:, 2] << u.erg/u.s @@ -126,7 +127,7 @@ def __init__(self, filename, metadata={}): simtab['L_NU_E_BAR'][simtab['L_NU_E_BAR'] < 0] = 1 simtab['L_NU_X'][simtab['L_NU_X'] < 0] = 1 - metadata== f['metadata'] + metadata = f['metadata'] super().__init__(simtab, metadata) From c915194cba652a71e21cfe4e91eb9ec5ae9655f8 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 11 Aug 2026 19:22:34 -0400 Subject: [PATCH 39/52] Add files via upload --- doc/source/nb/dev/PUSH.ipynb | 272 ++++++++++------------------------- 1 file changed, 76 insertions(+), 196 deletions(-) diff --git a/doc/source/nb/dev/PUSH.ipynb b/doc/source/nb/dev/PUSH.ipynb index e90f570c2..805ae5df3 100644 --- a/doc/source/nb/dev/PUSH.ipynb +++ b/doc/source/nb/dev/PUSH.ipynb @@ -18,7 +18,7 @@ "import astropy.units as u\n", "import numpy as np\n", "\n", - "from snewpy.models import ccsn\n", + "from snewpy.models.ccsn import Wolfe_2023\n", "from snewpy.flavor_transformation import AdiabaticMSW\n", "from snewpy.neutrino import MixingParameters\n", "from snewpy.models.base import PinchedModel, SupernovaModel" @@ -34,7 +34,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "id": "3ee6ab13-fa76-4889-85af-7c07446b7866", "metadata": {}, "outputs": [], @@ -44,7 +44,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "id": "86744938-3d21-48c6-9f92-78c477eb61b2", "metadata": {}, "outputs": [], @@ -83,7 +83,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "id": "6ef1506c-fb97-408d-b7d2-8f1df89d2b9d", "metadata": {}, "outputs": [], @@ -104,17 +104,70 @@ "## Create the neutrino flux at Earth from the model" ] }, + { + "cell_type": "code", + "execution_count": 5, + "id": "4e5b97ed-6acf-4a11-8a86-96cb83c424c8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'progenitor_mass': ,\n", + " 'eos': ['SFHo', 'SFHx', 'DD2', 'BHB', 'TM1', 'NL3'],\n", + " 'callibration': ['calI']}" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Wolfe_2023.param" + ] + }, { "cell_type": "code", "execution_count": 6, "id": "54dbcde6-4aac-4f96-9dbe-ced31225919a", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "s27.6_SFHo_calI_Wolfe_luminosity.h5\n" + ] + }, + { + "ename": "KeyError", + "evalue": "\"Unable to synchronously open object (object 'times' doesn't exist)\"", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[6], line 2\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;66;03m# prepare the neutrino flux from the model\u001b[39;00m\n\u001b[1;32m----> 2\u001b[0m model \u001b[38;5;241m=\u001b[39m Wolfe_2023(progenitor_mass\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m27.6\u001b[39m\u001b[38;5;241m*\u001b[39mu\u001b[38;5;241m.\u001b[39mMsun,eos\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mSFHo\u001b[39m\u001b[38;5;124m'\u001b[39m) \u001b[38;5;66;03m# SN model\u001b[39;00m\n\u001b[0;32m 3\u001b[0m transformation \u001b[38;5;241m=\u001b[39m AdiabaticMSW(MixingParameters(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mNORMAL\u001b[39m\u001b[38;5;124m'\u001b[39m)) \u001b[38;5;66;03m# Desired flavor transformation\u001b[39;00m\n\u001b[0;32m 5\u001b[0m times \u001b[38;5;241m=\u001b[39m model\u001b[38;5;241m.\u001b[39mget_time()\n", + "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\snewpy\\models\\base.py:23\u001b[0m, in \u001b[0;36m_wrap_init.._wrapper\u001b[1;34m(self, *arg, **kwargs)\u001b[0m\n\u001b[0;32m 21\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(init)\n\u001b[0;32m 22\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_wrapper\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39marg, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m---> 23\u001b[0m init(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39marg, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m 24\u001b[0m check(\u001b[38;5;28mself\u001b[39m)\n", + "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\snewpy\\models\\registry_model.py:383\u001b[0m, in \u001b[0;36mRegistryModel.._wrap..c.__init__\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 381\u001b[0m S \u001b[38;5;241m=\u001b[39m inspect\u001b[38;5;241m.\u001b[39msignature(\u001b[38;5;28msuper\u001b[39m()\u001b[38;5;241m.\u001b[39m\u001b[38;5;21m__init__\u001b[39m)\n\u001b[0;32m 382\u001b[0m init_params \u001b[38;5;241m=\u001b[39m {name:val \u001b[38;5;28;01mfor\u001b[39;00m name,val \u001b[38;5;129;01min\u001b[39;00m arguments\u001b[38;5;241m.\u001b[39mitems() \u001b[38;5;28;01mif\u001b[39;00m name \u001b[38;5;129;01min\u001b[39;00m S\u001b[38;5;241m.\u001b[39mparameters}\n\u001b[1;32m--> 383\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28msuper\u001b[39m()\u001b[38;5;241m.\u001b[39m\u001b[38;5;21m__init__\u001b[39m(\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39minit_params)\n", + "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\snewpy\\models\\base.py:23\u001b[0m, in \u001b[0;36m_wrap_init.._wrapper\u001b[1;34m(self, *arg, **kwargs)\u001b[0m\n\u001b[0;32m 21\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(init)\n\u001b[0;32m 22\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_wrapper\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39marg, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m---> 23\u001b[0m init(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39marg, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m 24\u001b[0m check(\u001b[38;5;28mself\u001b[39m)\n", + "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\snewpy\\models\\ccsn.py:80\u001b[0m, in \u001b[0;36mWolfe_2023.__init__\u001b[1;34m(self, progenitor_mass, eos, callibration)\u001b[0m\n\u001b[0;32m 78\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__init__\u001b[39m(\u001b[38;5;28mself\u001b[39m, progenitor_mass:u\u001b[38;5;241m.\u001b[39mQuantity, eos:\u001b[38;5;28mstr\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mSFHo\u001b[39m\u001b[38;5;124m'\u001b[39m, callibration:\u001b[38;5;28mstr\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcalI\u001b[39m\u001b[38;5;124m'\u001b[39m):\n\u001b[0;32m 79\u001b[0m filename \u001b[38;5;241m=\u001b[39m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124ms\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mprogenitor_mass\u001b[38;5;241m.\u001b[39mvalue\u001b[38;5;132;01m:\u001b[39;00m\u001b[38;5;124m2.1f\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m_\u001b[39m\u001b[38;5;132;01m{\u001b[39;00meos\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m_\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mcallibration\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m_Wolfe_luminosity.h5\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m---> 80\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28msuper\u001b[39m()\u001b[38;5;241m.\u001b[39m\u001b[38;5;21m__init__\u001b[39m(filename\u001b[38;5;241m=\u001b[39mfilename, metadata\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmetadata)\n", + "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\snewpy\\models\\base.py:23\u001b[0m, in \u001b[0;36m_wrap_init.._wrapper\u001b[1;34m(self, *arg, **kwargs)\u001b[0m\n\u001b[0;32m 21\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(init)\n\u001b[0;32m 22\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_wrapper\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39marg, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m---> 23\u001b[0m init(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39marg, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m 24\u001b[0m check(\u001b[38;5;28mself\u001b[39m)\n", + "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\snewpy\\models\\ccsn_loaders.py:111\u001b[0m, in \u001b[0;36mPUSHArchiveModel.__init__\u001b[1;34m(self, filename, metadata)\u001b[0m\n\u001b[0;32m 108\u001b[0m simtab \u001b[38;5;241m=\u001b[39m Table()\n\u001b[0;32m 110\u001b[0m \u001b[38;5;66;03m#tbounce = f['metadata']['bounce_time'] * u.s\u001b[39;00m\n\u001b[1;32m--> 111\u001b[0m simtab[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mTIME\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m f[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtimes\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m*\u001b[39m u\u001b[38;5;241m.\u001b[39ms \u001b[38;5;66;03m#- tbounce\u001b[39;00m\n\u001b[0;32m 113\u001b[0m simtab[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mL_NU_E\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m f[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdata\u001b[39m\u001b[38;5;124m'\u001b[39m][\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlum_e\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m<<\u001b[39m u\u001b[38;5;241m.\u001b[39merg\u001b[38;5;241m/\u001b[39mu\u001b[38;5;241m.\u001b[39ms\n\u001b[0;32m 114\u001b[0m simtab[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mL_NU_E_BAR\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m f[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdata\u001b[39m\u001b[38;5;124m'\u001b[39m][\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlum_ebar\u001b[39m\u001b[38;5;124m'\u001b[39m][:, \u001b[38;5;241m2\u001b[39m] \u001b[38;5;241m<<\u001b[39m u\u001b[38;5;241m.\u001b[39merg\u001b[38;5;241m/\u001b[39mu\u001b[38;5;241m.\u001b[39ms\n", + "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\h5py\\_hl\\group.py:407\u001b[0m, in \u001b[0;36mGroup.__getitem__\u001b[1;34m(self, name)\u001b[0m\n\u001b[0;32m 405\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__getitem__\u001b[39m(\u001b[38;5;28mself\u001b[39m, name):\n\u001b[0;32m 406\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\" Open an object in the file \"\"\"\u001b[39;00m\n\u001b[1;32m--> 407\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get(name)\n", + "File \u001b[1;32mh5py/_objects.pyx:54\u001b[0m, in \u001b[0;36mh5py._objects.with_phil.wrapper\u001b[1;34m()\u001b[0m\n", + "File \u001b[1;32mh5py/_objects.pyx:55\u001b[0m, in \u001b[0;36mh5py._objects.with_phil.wrapper\u001b[1;34m()\u001b[0m\n", + "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\h5py\\_hl\\group.py:421\u001b[0m, in \u001b[0;36mGroup._get\u001b[1;34m(self, name, lapl)\u001b[0m\n\u001b[0;32m 419\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m lapl \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 420\u001b[0m lapl \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_lapl\n\u001b[1;32m--> 421\u001b[0m oid \u001b[38;5;241m=\u001b[39m h5o\u001b[38;5;241m.\u001b[39mopen(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mid, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_e(name), lapl\u001b[38;5;241m=\u001b[39mlapl)\n\u001b[0;32m 422\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 423\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mAccessing a group is done with bytes or str, \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 424\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnot \u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mformat(\u001b[38;5;28mtype\u001b[39m(name)))\n", + "File \u001b[1;32mh5py/_objects.pyx:54\u001b[0m, in \u001b[0;36mh5py._objects.with_phil.wrapper\u001b[1;34m()\u001b[0m\n", + "File \u001b[1;32mh5py/_objects.pyx:55\u001b[0m, in \u001b[0;36mh5py._objects.with_phil.wrapper\u001b[1;34m()\u001b[0m\n", + "File \u001b[1;32mh5py/h5o.pyx:255\u001b[0m, in \u001b[0;36mh5py.h5o.open\u001b[1;34m()\u001b[0m\n", + "\u001b[1;31mKeyError\u001b[0m: \"Unable to synchronously open object (object 'times' doesn't exist)\"" + ] + } + ], "source": [ - "from astropy.table import Table, join\n", - "\n", "# prepare the neutrino flux from the model\n", - "model = WOLFE_2023(\"s27.6_SFHo_calI_Wolfe_luminosity.h5\") # SN model\n", + "model = Wolfe_2023(progenitor_mass=27.6*u.Msun,eos='SFHo') # SN model\n", "transformation = AdiabaticMSW(MixingParameters('NORMAL')) # Desired flavor transformation\n", "\n", "times = model.get_time()\n", @@ -128,21 +181,10 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "4745585e-fc5d-4e45-8696-55dc3cbe63fd", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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9cvn87XWuf/++1V6erp699131cKFC9XFF18sW412sa13mlFK+iAWZs2apWw2m7r33nvVihUr1KuvvqqSkpLUK6+80lpH+qHrXXHFFaq4uLh1++N3331X5eTkqNtuu621jvTDnufxeNS8efPUvHnzFKAeeeQRNW/ePLVu3TqlVMfe83HjxqmSkhL1+eefq7lz56rjjjuuS7c/3tfJmCi2ZDyUuGRMFHsyJkoMMiaKj71xTCRBqT3sscceU927d1cOh0MNGzasdSte0TWAbX49//zzrXUsy1J//vOfVUFBgXI6neqoo45SCxcujF+j9wM/H4BJH8TGhx9+qIYMGaKcTqcaMGCA+s9//tPmuPRD12tublbjx49X3bp1Uy6XS/Xq1UvdddddKhgMttaRftjzvvrqq21+FlxxxRVKqY69536/X11//fUqKytLud1udfrpp6uysrI4vJp9h4yJYkfGQ4lLxkTxIWOi+JMxUXzsjWMiTSmlumYOlhBCCCGEEEIIIYQQ2yY5pYQQQgghhBBCCCFEzElQSgghhBBCCCGEEELEnASlhBBCCCGEEEIIIUTMSVBKCCGEEEIIIYQQQsScBKWEEEIIIYQQQgghRMxJUEoIIYQQQgghhBBCxJwEpYQQQgghhBBCCCFEzElQSgghhBBCCCGEEELEnASlhBBCCCGEEEIIIUTMSVBKCCGEEEIIIYQQQsScBKWEEKILXXnllWiaxrhx49odu+6669A0jSuvvLJD1zrjjDM44YQTtnns22+/RdM05s6duzvNFUIIIYTY42Q8JITYHglKCSH2K6FQKObPWVpayhtvvIHf728tCwQCvP7663Tr1q3D1xk7dixffvkl69ata3fsueee4+CDD2bYsGF7pM1CCCGE2HfJeEgIkSgkKCWEiBulFA8++CC9evXC7XZz0EEH8fbbb7ceP+aYY7jxxhu57bbbyMrKoqCggLvvvrvT17j++uuZMGECOTk5nHjiiQB4PB4uvfRSkpOTKSws5B//+AfHHHMMN910EwAvvfQS2dnZBIPBNs933nnncfnll3fqdQ4bNoxu3brx7rvvtpa9++67lJaWMnTo0A6/ntNPP528vDxeeOGFNuf4fD7efPNNxo4d26l2CSGEECL+ZDwk4yEh9mcSlBJCxM0f/vAHnn/+eZ544gkWLVrEzTffzGWXXca0adNa67z44oskJyfz/fff8+CDD3LPPfcwZcqUTl/DZrMxY8YMnnrqKQAmTJjAjBkz+OCDD5gyZQrTp09vM9X7/PPPJxKJ8MEHH7SW1dbW8tFHH3HVVVd1+rVeddVVPP/8862Pn3vuOa6++upOvSc2m43LL7+cF154AaVU6zmTJk0iFApx6aWXdrpdQgghhIgvGQ/JeEiI/ZoSQog48Hq9yuVyqZkzZ7YpHzt2rLr44ouVUkodffTRavTo0W2Ojxw5Ut1+++2dusbBBx/c5nhzc7Oy2+1q0qRJrWWNjY0qKSlJjR8/vrXsN7/5jTrllFNaH0+cOFH16tVLWZbV4dd5xRVXqLPOOkvV1NQop9Op1qxZo9auXatcLpeqqalRZ511lrriiis6/HqWLFmiAPXll1+2Hj/qqKNajwshhBBi7yHjIRkPCbG/s8U7KCaE2D8tXryYQCDQOn18s1Ao1GYK94EHHtjmeGFhIdXV1Z26xogRI9ocX716NaZpcsghh7SWpaen079//zb1rr32WkaOHEl5eTnFxcU8//zzrYk6OysnJ4fTTjuNF198EaUUp512Gjk5OW3qdOT1DBgwgFGjRvHcc89x7LHHsmrVKqZPn85nn33W6TYJIYQQIr5kPCTjISH2dxKUEkLEhWVZAHz88ccUFxe3OeZ0Olt/ttvtbY5pmtZ6bkevkZyc3OaY2jTV++eDKbXVFHCAoUOHctBBB/HSSy9x0kknsXDhQj788MOOvcBtuPrqq7n++usBeOyxx9od7+jrGTt2LNdffz2PPfYYzz//PN27d+f444/f5XYJIYQQIj5kPCTjISH2dxKUEkLExaBBg3A6nZSVlXH00UfH9Bq9e/fGbrcza9YsSktLAWhubmbFihXtrnPNNdfwj3/8g/Lyck444YTW+rvi5JNPbt3t5qSTTtrl13PBBRcwfvx4XnvtNV588UWuvfbaXbpbKYQQQoj4kvGQjIeE2N9JUEoIERepqanccsst3HzzzViWxejRo2lubmbmzJmkpKRwxRVXdNk1UlNTueKKK7j11lvJysoiLy+PP//5z+i63m4wc+mll3LLLbfw9NNP89JLL+3WazYMgyVLlrT+vKuvJyUlhQsvvJA777yTpqYmrrzyyt1qlxBCCCHiQ8ZDMh4SYn8nQSkhRNz85S9/IS8vj/vuu4/Vq1eTkZHBsGHDuPPOO7v8Go888gjjxo3j9NNPJy0tjdtuu43169fjcrna1EtLS+O8887j448/5uyzz25z7IUXXuCqq65qN819R9LS0vbI6xk7dizPPvssY8aMoVu3bh1+fiGEEEIkFhkP7frrkfGQEHs/TXXmXw8hhNhHtbS0UFxczMMPP8zYsWPbHDvxxBMZOHAgjz76aJvyu+++m6lTpzJ16tQYtlQIIYQQomvIeEgIEWsyU0oIsV+aN28eS5cu5ZBDDqGpqYl77rkHgLPOOqu1Tn19PZ999hlffvkl//73v9td43//+x///Oc/Y9ZmIYQQQog9ScZDQoh4k6CUEGK/9dBDD7Fs2TIcDgfDhw9n+vTpbbYlHjZsGA0NDTzwwAPttkcG+Pbbb2PZXCGEEEKIPU7GQ0KIeJLle0IIIYQQQgghhBAi5vR4N0AIIYQQQgghhBBC7H8kKCWEEEIIIYQQQgghYk6CUkIIIYQQQgghhBAi5iQoJYQQQgghhBBCCCFiToJSQgghhBBCCCGEECLmJCglhBBCCCGEEEIIIWJOglJCCCGEEEIIIYQQIuYkKCWEEEIIIYQQQgghYk6CUkIIIYQQQgghhBAi5iQoJYQQQgghhBBCCCFiToJSQgghhBBCCCGEECLm/h/6zyTnHYdwNwAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "t = 50*u.ms\n", "\n", @@ -176,18 +218,10 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "0e7889dd-f442-4841-819b-ce7e31cd9a85", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using snowglobes_data module ...\n" - ] - } - ], + "outputs": [], "source": [ "from snewpy.rate_calculator import RateCalculator\n", "\n", @@ -205,37 +239,10 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "312c67d9-2556-4932-88b9-20ae7d042405", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['wc100kt30prct',\n", - " 'wc100kt15prct',\n", - " 'ar40kt',\n", - " 'scint20kt',\n", - " 'halo1',\n", - " 'halo2',\n", - " 'novaND',\n", - " 'novaFD',\n", - " 'wc100kt30prct_he',\n", - " 'ar40kt_he',\n", - " 'icecube',\n", - " 'km3net',\n", - " 'ds20',\n", - " 'argo',\n", - " 'lz',\n", - " 'xent',\n", - " 'pandax']" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "#list available detectors\n", "list(rc.detectors)" @@ -251,73 +258,12 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "c565f89f-e855-47b1-a591-da1561dd0bf5", "metadata": { "scrolled": true }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=ibd. Using 100% efficiency\n", - " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", - "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nue_e. Using 100% efficiency\n", - " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", - "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nuebar_e. Using 100% efficiency\n", - " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", - "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=numu_e. Using 100% efficiency\n", - " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", - "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=numubar_e. Using 100% efficiency\n", - " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", - "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nutau_e. Using 100% efficiency\n", - " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", - "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nutaubar_e. Using 100% efficiency\n", - " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", - "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nue_C12. Using 100% efficiency\n", - " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", - "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nuebar_C12. Using 100% efficiency\n", - " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", - "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nc_nue_C12. Using 100% efficiency\n", - " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", - "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nc_nuebar_C12. Using 100% efficiency\n", - " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", - "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nc_numu_C12. Using 100% efficiency\n", - " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", - "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nc_numubar_C12. Using 100% efficiency\n", - " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", - "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nc_nutau_C12. Using 100% efficiency\n", - " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", - "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nc_nutaubar_C12. Using 100% efficiency\n", - " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", - "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nue_C13. Using 100% efficiency\n", - " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", - "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nc_nue_C13. Using 100% efficiency\n", - " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", - "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nc_numu_C13. Using 100% efficiency\n", - " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", - "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nc_nutau_C13. Using 100% efficiency\n", - " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", - "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nc_nuebar_C13. Using 100% efficiency\n", - " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", - "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nc_numubar_C13. Using 100% efficiency\n", - " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n", - "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:388: UserWarning: Efficiency not found for detector=scint20kt, channel=nc_nutaubar_C13. Using 100% efficiency\n", - " warn(f'Efficiency not found for detector={name}, channel={ch.name}. Using 100% efficiency')\n" - ] - }, - { - "data": { - "text/plain": [ - "Detector(name=\"scint20kt\", mass=20.0 kt, channels=['ibd', 'nue_e', 'nuebar_e', 'numu_e', 'numubar_e', 'nutau_e', 'nutaubar_e', 'nue_C12', 'nuebar_C12', 'nc_nue_C12', 'nc_nuebar_C12', 'nc_numu_C12', 'nc_numubar_C12', 'nc_nutau_C12', 'nc_nutaubar_C12', 'nue_C13', 'nc_nue_C13', 'nc_numu_C13', 'nc_nutau_C13', 'nc_nuebar_C13', 'nc_numubar_C13', 'nc_nutaubar_C13'])" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "#read the detector\n", "det = rc.read_detector('scint20kt')\n", @@ -334,44 +280,12 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "a88a95fd-0e24-43e3-8205-41ac030a8632", "metadata": { "scrolled": true }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'ibd': DetectionChannel (flavor=NU_E_BAR, smearing=True, weight=0.1429),\n", - " 'nue_e': DetectionChannel (flavor=NU_E, smearing=True, weight=0.5716),\n", - " 'nuebar_e': DetectionChannel (flavor=NU_E_BAR, smearing=True, weight=0.5716),\n", - " 'numu_e': DetectionChannel (flavor=NU_MU, smearing=True, weight=0.5716),\n", - " 'numubar_e': DetectionChannel (flavor=NU_MU_BAR, smearing=True, weight=0.5716),\n", - " 'nutau_e': DetectionChannel (flavor=NU_TAU, smearing=True, weight=0.5716),\n", - " 'nutaubar_e': DetectionChannel (flavor=NU_TAU_BAR, smearing=True, weight=0.5716),\n", - " 'nue_C12': DetectionChannel (flavor=NU_E, smearing=True, weight=0.07066404999999999),\n", - " 'nuebar_C12': DetectionChannel (flavor=NU_E_BAR, smearing=True, weight=0.07066404999999999),\n", - " 'nc_nue_C12': DetectionChannel (flavor=NU_E, smearing=True, weight=0.07066404999999999),\n", - " 'nc_nuebar_C12': DetectionChannel (flavor=NU_E_BAR, smearing=True, weight=0.07066404999999999),\n", - " 'nc_numu_C12': DetectionChannel (flavor=NU_MU, smearing=True, weight=0.07066404999999999),\n", - " 'nc_numubar_C12': DetectionChannel (flavor=NU_MU_BAR, smearing=True, weight=0.07066404999999999),\n", - " 'nc_nutau_C12': DetectionChannel (flavor=NU_TAU, smearing=True, weight=0.07066404999999999),\n", - " 'nc_nutaubar_C12': DetectionChannel (flavor=NU_TAU_BAR, smearing=True, weight=0.07066404999999999),\n", - " 'nue_C13': DetectionChannel (flavor=NU_E, smearing=True, weight=0.00078595),\n", - " 'nc_nue_C13': DetectionChannel (flavor=NU_E, smearing=True, weight=0.00078595),\n", - " 'nc_numu_C13': DetectionChannel (flavor=NU_MU, smearing=True, weight=0.00078595),\n", - " 'nc_nutau_C13': DetectionChannel (flavor=NU_TAU, smearing=True, weight=0.00078595),\n", - " 'nc_nuebar_C13': DetectionChannel (flavor=NU_E_BAR, smearing=True, weight=0.00078595),\n", - " 'nc_numubar_C13': DetectionChannel (flavor=NU_MU_BAR, smearing=True, weight=0.00078595),\n", - " 'nc_nutaubar_C13': DetectionChannel (flavor=NU_TAU_BAR, smearing=True, weight=0.00078595)}" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "#list all the channels\n", "det.channels" @@ -387,29 +301,10 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "948ca075-66eb-449b-b310-a9e599d1e2e9", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:353: RuntimeWarning: divide by zero encountered in log\n", - " return np.interp(np.log(E)/np.log(10), xp, yp, left=0, right=0)*E*1e-38 <" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "rates = det.run(fluence)\n", "plot_rate(sum_rates(list(rates.values())), axis='energy', label='Total', lw=2, color='k')\n", @@ -425,25 +320,10 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "id": "89c0c8d6-144b-473c-9157-07e09fcef984", "metadata": {}, - "outputs": [ - { - "ename": "AttributeError", - "evalue": "'Detector' object has no attribute 'startswith'", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[14], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m events \u001b[38;5;241m=\u001b[39m rc\u001b[38;5;241m.\u001b[39mrun(fluence, det, detector_effects\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m) \n\u001b[0;32m 2\u001b[0m events_smeared \u001b[38;5;241m=\u001b[39m rc\u001b[38;5;241m.\u001b[39mrun(fluence, det, detector_effects\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[0;32m 4\u001b[0m \u001b[38;5;66;03m# Compute number of events in all interaction channels\u001b[39;00m\n", - "File \u001b[1;32mC:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:428\u001b[0m, in \u001b[0;36mRateCalculator.run\u001b[1;34m(self, flux, detector, material, detector_effects)\u001b[0m\n\u001b[0;32m 403\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21mrun\u001b[39m(\u001b[38;5;28mself\u001b[39m, flux:Container, detector:\u001b[38;5;28mstr\u001b[39m, material:\u001b[38;5;28mstr\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, detector_effects:\u001b[38;5;28mbool\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m)\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m\u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Container]:\n\u001b[0;32m 404\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Run the rate calculation for the given detector. \u001b[39;00m\n\u001b[0;32m 405\u001b[0m \u001b[38;5;124;03m \u001b[39;00m\n\u001b[0;32m 406\u001b[0m \u001b[38;5;124;03m Parameters\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 426\u001b[0m \u001b[38;5;124;03m A dictionary with interaction rates (as instances of :class:`snewpy.flux.Container`) for each channel.\u001b[39;00m\n\u001b[0;32m 427\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[1;32m--> 428\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mread_detector(detector,material)\u001b[38;5;241m.\u001b[39mrun(flux, detector_effects\u001b[38;5;241m=\u001b[39mdetector_effects)\n", - "File \u001b[1;32mC:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\rate_calculator.py:372\u001b[0m, in \u001b[0;36mRateCalculator.read_detector\u001b[1;34m(self, name, material)\u001b[0m\n\u001b[0;32m 356\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21mread_detector\u001b[39m(\u001b[38;5;28mself\u001b[39m, name:\u001b[38;5;28mstr\u001b[39m, material:\u001b[38;5;28mstr\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m)\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39mDetector:\n\u001b[0;32m 357\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Read the detector configuration from the SNOwGLoBES\u001b[39;00m\n\u001b[0;32m 358\u001b[0m \n\u001b[0;32m 359\u001b[0m \u001b[38;5;124;03m Parameters\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 370\u001b[0m \u001b[38;5;124;03m an object with the detector configuration.\u001b[39;00m\n\u001b[0;32m 371\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[1;32m--> 372\u001b[0m material \u001b[38;5;241m=\u001b[39m material \u001b[38;5;129;01mor\u001b[39;00m guess_material(name)\n\u001b[0;32m 373\u001b[0m channels \u001b[38;5;241m=\u001b[39m {}\n\u001b[0;32m 374\u001b[0m bins \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbinning[material]\n", - "File \u001b[1;32mC:\\ProgramData\\Anaconda3\\Lib\\site-packages\\snewpy-2.0-py3.13.egg\\snewpy\\snowglobes_interface.py:24\u001b[0m, in \u001b[0;36mguess_material\u001b[1;34m(detector)\u001b[0m\n\u001b[0;32m 23\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21mguess_material\u001b[39m(detector):\n\u001b[1;32m---> 24\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m detector\u001b[38;5;241m.\u001b[39mstartswith((\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mwc\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mice\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mkm3net\u001b[39m\u001b[38;5;124m'\u001b[39m)):\n\u001b[0;32m 25\u001b[0m mat \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mwater\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[0;32m 26\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m detector\u001b[38;5;241m.\u001b[39mstartswith(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124md2O\u001b[39m\u001b[38;5;124m'\u001b[39m):\n", - "\u001b[1;31mAttributeError\u001b[0m: 'Detector' object has no attribute 'startswith'" - ] - } - ], + "outputs": [], "source": [ "events = rc.run(fluence, det, detector_effects=False) \n", "events_smeared = rc.run(fluence, det, detector_effects=True)\n", @@ -480,7 +360,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.13.5" + "version": "3.12.7" } }, "nbformat": 4, From 5e98d28f4d9ef4162956feb89a1378b1b922e11a Mon Sep 17 00:00:00 2001 From: jpkneller Date: Wed, 12 Aug 2026 11:43:20 -0400 Subject: [PATCH 40/52] Add files via upload --- python/snewpy/models/model_files.yml | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/python/snewpy/models/model_files.yml b/python/snewpy/models/model_files.yml index a7126dce6..92ec5ac02 100644 --- a/python/snewpy/models/model_files.yml +++ b/python/snewpy/models/model_files.yml @@ -12,6 +12,12 @@ models: ccsn: Bollig_2016: repository: *ccsn_repository + + Bugli_2021: + repository: *ccsn_repository + + Fischer_2020: + repository: *ccsn_repository Fornax_2019: repository: *ccsn_repository @@ -27,6 +33,9 @@ models: Kuroda_2020: repository: *ccsn_repository + + Mori_2023: + repository: *ccsn_repository Nakazato_2013: repository: *ccsn_repository @@ -39,6 +48,9 @@ models: Sukhbold_2015: repository: *ccsn_repository + + Takata_2025: + repository: *ccsn_repository Tamborra_2014: repository: *ccsn_repository @@ -51,22 +63,14 @@ models: Warren_2020: repository: *ccsn_repository - - Zha_2021: - repository: *ccsn_repository - - Mori_2023: - repository: *ccsn_repository - Takata_2025: + Wolfe_2023: repository: *ccsn_repository - - Bugli_2021: - repository: *ccsn_repository - - Fischer_2020: + + Zha_2021: repository: *ccsn_repository + presn: Odrzywolek_2010: From 3af847a8ce06d5a81b5238ff7eafbe0a246e36d8 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Wed, 12 Aug 2026 12:06:32 -0400 Subject: [PATCH 41/52] Add files via upload --- python/snewpy/models/ccsn_loaders.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/python/snewpy/models/ccsn_loaders.py b/python/snewpy/models/ccsn_loaders.py index 80193f8f1..2af388e09 100644 --- a/python/snewpy/models/ccsn_loaders.py +++ b/python/snewpy/models/ccsn_loaders.py @@ -9,6 +9,7 @@ import re import sys import tarfile +from pathlib import Path from astropy import units as u from astropy.table import Table, join @@ -101,14 +102,13 @@ def __init__(self, filename, metadata={}): filename : str Absolute or relative path to model data """ - datafile = filename #self.request_file(filename) - print(datafile) + datafile = self.request_file(filename) f = h5py.File(datafile, 'r') simtab = Table() - #tbounce = f['metadata']['bounce_time'] * u.s - simtab['TIME'] = f['times'] * u.s #- tbounce + tbounce = f['metadata'].attrs['bounce_time'] * u.s + simtab['TIME'] = f['data']['times'] * u.s - tbounce simtab['L_NU_E'] = f['data']['lum_e'] << u.erg/u.s simtab['L_NU_E_BAR'] = f['data']['lum_ebar'][:, 2] << u.erg/u.s From dd2456b3918071b92d48b3cbc5342731d0f8ca70 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Wed, 12 Aug 2026 12:42:42 -0400 Subject: [PATCH 42/52] Add files via upload --- python/snewpy/models/ccsn_loaders.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/python/snewpy/models/ccsn_loaders.py b/python/snewpy/models/ccsn_loaders.py index 2af388e09..a5a0bb1e7 100644 --- a/python/snewpy/models/ccsn_loaders.py +++ b/python/snewpy/models/ccsn_loaders.py @@ -108,15 +108,15 @@ def __init__(self, filename, metadata={}): simtab = Table() tbounce = f['metadata'].attrs['bounce_time'] * u.s - simtab['TIME'] = f['data']['times'] * u.s - tbounce + simtab['TIME'] = f['data'].attrs['times'] * u.s - tbounce - simtab['L_NU_E'] = f['data']['lum_e'] << u.erg/u.s - simtab['L_NU_E_BAR'] = f['data']['lum_ebar'][:, 2] << u.erg/u.s - simtab['L_NU_X'] = f['data']['lum']['lum_x'] << u.erg/u.s + simtab['L_NU_E'] = f['data'].attrs['lum_e'] << u.erg/u.s + simtab['L_NU_E_BAR'] = f['data'].attrs['lum_ebar'] << u.erg/u.s + simtab['L_NU_X'] = f['data'].attrs['lum_x'] << u.erg/u.s - simtab['E_NU_E'] = f['data']['lum_e'] / f['data']['nlum_e'] << u.erg - simtab['E_NU_E_BAR'] = f['data']['lum_ebar'] / f['data']['nlum_ebar'] << u.erg - simtab['E_NU_X'] = f['data']['lum_x'] / f['data']['nlum_x'] << u.erg + simtab['E_NU_E'] = f['data'].attrs['lum_e'] / f['data'].attrs['nlum_e'] << u.erg + simtab['E_NU_E_BAR'] = f['data'].attrs['lum_ebar'] / f['data'].attrs['nlum_ebar'] << u.erg + simtab['E_NU_X'] = f['data'].attrs['lum_x'] / f['data'].attrs['nlum_x'] << u.erg simtab['ALPHA_NU_E'] = np.full(len(simtab['TIME']),3) simtab['ALPHA_NU_E_BAR'] = simtab['ALPHA_NU_E'] From d8032e679d2a2e8aef01620bad56899a2ddec196 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Wed, 12 Aug 2026 13:03:57 -0400 Subject: [PATCH 43/52] Add files via upload --- python/snewpy/models/ccsn_loaders.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/python/snewpy/models/ccsn_loaders.py b/python/snewpy/models/ccsn_loaders.py index a5a0bb1e7..9d48c11cd 100644 --- a/python/snewpy/models/ccsn_loaders.py +++ b/python/snewpy/models/ccsn_loaders.py @@ -108,15 +108,15 @@ def __init__(self, filename, metadata={}): simtab = Table() tbounce = f['metadata'].attrs['bounce_time'] * u.s - simtab['TIME'] = f['data'].attrs['times'] * u.s - tbounce + simtab['TIME'] = f['data'][:,0] * u.s - tbounce - simtab['L_NU_E'] = f['data'].attrs['lum_e'] << u.erg/u.s - simtab['L_NU_E_BAR'] = f['data'].attrs['lum_ebar'] << u.erg/u.s - simtab['L_NU_X'] = f['data'].attrs['lum_x'] << u.erg/u.s + simtab['L_NU_E'] = f['data'][:,3] << u.erg/u.s + simtab['L_NU_E_BAR'] = f['data'][:,4] << u.erg/u.s + simtab['L_NU_X'] = f['data'][:,6] << u.erg/u.s - simtab['E_NU_E'] = f['data'].attrs['lum_e'] / f['data'].attrs['nlum_e'] << u.erg - simtab['E_NU_E_BAR'] = f['data'].attrs['lum_ebar'] / f['data'].attrs['nlum_ebar'] << u.erg - simtab['E_NU_X'] = f['data'].attrs['lum_x'] / f['data'].attrs['nlum_x'] << u.erg + simtab['E_NU_E'] = f['data'][:,3] / f['data'][:,1] << u.erg + simtab['E_NU_E_BAR'] = f['data'][:,4] / f['data'][:,2] << u.erg + simtab['E_NU_X'] = f['data'][:,6] / f['data'][:,5] << u.erg simtab['ALPHA_NU_E'] = np.full(len(simtab['TIME']),3) simtab['ALPHA_NU_E_BAR'] = simtab['ALPHA_NU_E'] From e8a8c0d9bae56210aa54649e0481d12113a4f9ff Mon Sep 17 00:00:00 2001 From: jpkneller Date: Wed, 12 Aug 2026 13:04:15 -0400 Subject: [PATCH 44/52] Add files via upload --- ccsn_loaders.py | 1118 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1118 insertions(+) create mode 100644 ccsn_loaders.py diff --git a/ccsn_loaders.py b/ccsn_loaders.py new file mode 100644 index 000000000..9d48c11cd --- /dev/null +++ b/ccsn_loaders.py @@ -0,0 +1,1118 @@ +# -*- coding: utf-8 -*- +""" +The submodule ``snewpy.models.ccsn_loaders`` contains classes to load core-collapse +supernova models from files stored on disk. +""" + +import logging +import os +import re +import sys +import tarfile +from pathlib import Path + +from astropy import units as u +from astropy.table import Table, join +from astropy.io import ascii, fits +from astropy_healpix import healpy as hp + +import h5py +import numpy as np +from scipy.special import gamma, lpmv + +from snewpy.models import base +from snewpy.flux import Spectrum +from snewpy.flavor import ThreeFlavor +from snewpy import _model_downloader + +import multiprocessing + +class GarchingArchiveModel(base.PinchedModel): + """Subclass that reads models in the format used in the + `Garching Supernova Archive `_.""" + def __init__(self, filename, eos='LS220', metadata={}): + """Model Initialization. + + Parameters + ---------- + filename : str + Absolute or relative path to file with model data, we add nue/nuebar/nux. This argument will be deprecated. + eos: str + Equation of state. Valid value is 'LS220'. This argument will be deprecated. + + Other Parameters + ---------------- + progenitor_mass: astropy.units.Quantity + Mass of model progenitor in units Msun. Valid values are {progenitor_mass}. + Raises + ------ + FileNotFoundError + If a file for the chosen model parameters cannot be found + ValueError + If a combination of parameters is invalid when loading from parameters + """ + # Read through the several ASCII files for the chosen simulation and + # merge the data into one giant table. + mergtab = None + for flavor in ThreeFlavor: + _sfx = flavor.name.replace('_', '').lower() if flavor.is_electron else "nux" + _filename = '{}_{}_{}'.format(filename, eos, _sfx) + _lname = 'L_{}'.format(flavor.name) + _ename = 'E_{}'.format(flavor.name) + _e2name = 'E2_{}'.format(flavor.name) + _aname = 'ALPHA_{}'.format(flavor.name) + + # Open the requested filename using the model downloader. + datafile = self.request_file(_filename) + + simtab = Table.read(datafile, + names=['TIME', _lname, _ename, _e2name], + format='ascii') + simtab['TIME'].unit = 's' + simtab[_lname].unit = '1e51 erg/s' + simtab[_aname] = (2*simtab[_ename]**2 - simtab[_e2name]) / (simtab[_e2name] - simtab[_ename]**2) + simtab[_ename].unit = 'MeV' + del simtab[_e2name] + + if mergtab is None: + mergtab = simtab + else: + mergtab = join(mergtab, simtab, keys='TIME', join_type='left') + mergtab[_lname].fill_value = 0. + mergtab[_ename].fill_value = 0. + mergtab[_aname].fill_value = 0. + simtab = mergtab.filled() + if not metadata: + metadata = { + 'Progenitor mass': float(os.path.basename(filename).split('s')[1].split('c')[0]) * u.Msun, + 'EOS': eos, + } + super().__init__(simtab, metadata) + + +class PUSHArchiveModel(base.PinchedModel): + """Subclass that reads models in the format used + by the PUSH collaboration + """ + + def __init__(self, filename, metadata={}): + """ + Parameters + ---------- + filename : str + Absolute or relative path to model data + """ + datafile = self.request_file(filename) + f = h5py.File(datafile, 'r') + + simtab = Table() + + tbounce = f['metadata'].attrs['bounce_time'] * u.s + simtab['TIME'] = f['data'][:,0] * u.s - tbounce + + simtab['L_NU_E'] = f['data'][:,3] << u.erg/u.s + simtab['L_NU_E_BAR'] = f['data'][:,4] << u.erg/u.s + simtab['L_NU_X'] = f['data'][:,6] << u.erg/u.s + + simtab['E_NU_E'] = f['data'][:,3] / f['data'][:,1] << u.erg + simtab['E_NU_E_BAR'] = f['data'][:,4] / f['data'][:,2] << u.erg + simtab['E_NU_X'] = f['data'][:,6] / f['data'][:,5] << u.erg + + simtab['ALPHA_NU_E'] = np.full(len(simtab['TIME']),3) + simtab['ALPHA_NU_E_BAR'] = simtab['ALPHA_NU_E'] + simtab['ALPHA_NU_X'] = simtab['ALPHA_NU_E'] + + # prevent negative luminosities + simtab['L_NU_E'][simtab['L_NU_E'] < 0] = 1 + simtab['L_NU_E_BAR'][simtab['L_NU_E_BAR'] < 0] = 1 + simtab['L_NU_X'][simtab['L_NU_X'] < 0] = 1 + + metadata = f['metadata'] + + super().__init__(simtab, metadata) + + +class Nakazato_2013(base.PinchedModel): + def __init__(self, filename, metadata={}): + """Model initialization. + + Parameters + ---------- + filename : str + Absolute or relative path to FITS file with model data. + + Raises + ------ + FileNotFoundError + If a file for the chosen model parameters cannot be found + """ + # Open the requested filename using the model downloader. + datafile = self.request_file(filename) + # Read FITS table using the astropy reader. + simtab = Table.read(datafile) + + self.filename = os.path.basename(filename) + super().__init__(simtab, metadata) + + +class Sukhbold_2015(Nakazato_2013): + pass + + +class Tamborra_2014(GarchingArchiveModel): + pass + + +class Bollig_2016(GarchingArchiveModel): + pass + + +class Walk_2018(GarchingArchiveModel): + pass + + +class Walk_2019(GarchingArchiveModel): + pass + + +class OConnor_2013(base.PinchedModel): + """Model based on the black hole formation simulation in `O'Connor & Ott (2013) `_. + """ + + def __init__(self, filename, metadata={}): + """ + Parameters + ---------- + filename : str + Absolute or relative path to FITS file with model data. + """ + datafile = self.request_file(filename) + # Open luminosity file. + with tarfile.open(datafile) as tf: + # Extract luminosity data. + dataname = 's{:d}_{}_timeseries.dat'.format(int(metadata['Progenitor mass'].value), metadata['EOS']) + # Read FITS table using the astropy reader. + simtab = ascii.read(tf.extractfile(dataname), names=['TIME', 'L_NU_E', 'L_NU_E_BAR', 'L_NU_X', + 'E_NU_E', 'E_NU_E_BAR', 'E_NU_X', + 'RMS_NU_E', 'RMS_NU_E_BAR', 'RMS_NU_X']) + + simtab['ALPHA_NU_E'] = (2.0 * simtab['E_NU_E'] ** 2 - simtab['RMS_NU_E'] ** 2) / ( + simtab['RMS_NU_E'] ** 2 - simtab['E_NU_E'] ** 2) + simtab['ALPHA_NU_E_BAR'] = (2.0 * simtab['E_NU_E_BAR'] ** 2 - simtab['RMS_NU_E_BAR'] ** 2) / ( + simtab['RMS_NU_E_BAR'] ** 2 - simtab['E_NU_E_BAR'] ** 2) + simtab['ALPHA_NU_X'] = (2.0 * simtab['E_NU_X'] ** 2 - simtab['RMS_NU_X'] ** 2) / ( + simtab['RMS_NU_X'] ** 2 - simtab['E_NU_X'] ** 2) + + # note, here L_NU_X is already divided by 4 + super().__init__(simtab, metadata) + + +class OConnor_2015(base.PinchedModel): + """Model based on the black hole formation simulation in `O'Connor (2015) `_. + """ + + def __init__(self, filename, metadata={}): + """ + Parameters + ---------- + filename : str + Absolute or relative path to FITS file with model data. + """ + + datafile = self.request_file(filename) + simtab = Table.read(datafile, + names=['TIME', 'L_NU_E', 'L_NU_E_BAR', 'L_NU_X', + 'E_NU_E', 'E_NU_E_BAR', 'E_NU_X', + 'RMS_NU_E', 'RMS_NU_E_BAR', 'RMS_NU_X'], + format='ascii') + + header = ascii.read(simtab.meta['comments'], delimiter='=', format='no_header', names=['key', 'val']) + tbounce = float(header['val'][0]) + simtab['TIME'] -= tbounce + + simtab['ALPHA_NU_E'] = (2.0*simtab['E_NU_E']**2 - simtab['RMS_NU_E']**2) / \ + (simtab['RMS_NU_E']**2 - simtab['E_NU_E']**2) + simtab['ALPHA_NU_E_BAR'] = (2.0*simtab['E_NU_E_BAR']**2 - simtab['RMS_NU_E_BAR']**2) / \ + (simtab['RMS_NU_E_BAR']**2 - simtab['E_NU_E_BAR']**2) + simtab['ALPHA_NU_X'] = (2.0*simtab['E_NU_X']**2 - simtab['RMS_NU_X']**2) / \ + (simtab['RMS_NU_X']**2 - simtab['E_NU_X']**2) + + # SYB: double-check on this factor of 4. Should be factor of 2? + simtab['L_NU_X'] /= 4.0 + + # prevent negative lums + simtab['L_NU_E'][simtab['L_NU_E'] < 0] = 1 + simtab['L_NU_E_BAR'][simtab['L_NU_E_BAR'] < 0] = 1 + simtab['L_NU_X'][simtab['L_NU_X'] < 0] = 1 + + self.filename = os.path.basename(filename) + + super().__init__(simtab, metadata) + + +class Zha_2021(OConnor_2015): + pass + +class Warren_2020(base.PinchedModel): + def __init__(self, filename, metadata={}): + """ + Parameters + ---------- + filename : str + Absolute or relative path to file prefix, we add nue/nuebar/nux + """ + # Open the requested filename using the model downloader. + datafile = self.request_file(filename) + + # Open luminosity file. + # Read data from HDF5 files, then store. + f = h5py.File(datafile, 'r') + + simtab = Table() + + for i in range(len(f['nue_data']['lum'])): + if f['sim_data']['shock_radius'][i][1] > 0.00001: + bounce = f['sim_data']['shock_radius'][i][0] + break + + simtab['TIME'] = f['nue_data']['lum'][:, 0] - bounce + simtab['L_NU_E'] = f['nue_data']['lum'][:, 1] * 1e51 + simtab['L_NU_E_BAR'] = f['nuae_data']['lum'][:, 1] * 1e51 + simtab['L_NU_X'] = f['nux_data']['lum'][:, 1] * 1e51 + simtab['E_NU_E'] = f['nue_data']['avg_energy'][:, 1] + simtab['E_NU_E_BAR'] = f['nuae_data']['avg_energy'][:, 1] + simtab['E_NU_X'] = f['nux_data']['avg_energy'][:, 1] + simtab['RMS_NU_E'] = f['nue_data']['rms_energy'][:, 1] + simtab['RMS_NU_E_BAR'] = f['nuae_data']['rms_energy'][:, 1] + simtab['RMS_NU_X'] = f['nux_data']['rms_energy'][:, 1] + + simtab['ALPHA_NU_E'] = (2.0 * simtab['E_NU_E'] ** 2 - simtab['RMS_NU_E'] ** 2) / \ + (simtab['RMS_NU_E'] ** 2 - simtab['E_NU_E'] ** 2) + simtab['ALPHA_NU_E_BAR'] = (2.0 * simtab['E_NU_E_BAR'] ** 2 - simtab['RMS_NU_E_BAR'] + ** 2) / (simtab['RMS_NU_E_BAR'] ** 2 - simtab['E_NU_E_BAR'] ** 2) + simtab['ALPHA_NU_X'] = (2.0 * simtab['E_NU_X'] ** 2 - simtab['RMS_NU_X'] ** 2) / \ + (simtab['RMS_NU_X'] ** 2 - simtab['E_NU_X'] ** 2) + + # Set model metadata. + self.filename = os.path.basename(filename) + + super().__init__(simtab, metadata) + + +class Kuroda_2020(base.PinchedModel): + def __init__(self, filename, metadata={}): + """ + Parameters + ---------- + filename : str + Absolute or relative path to file prefix, we add nue/nuebar/nux + """ + + # Open the requested filename using the model downloader. + datafile = self.request_file(filename) + # Read ASCII data. + simtab = Table.read(datafile, format='ascii') + + # Get grid of model times. + simtab['TIME'] = simtab['Tpb[ms]'] << u.ms + for f in ["NU_E", "NU_E_BAR", "NU_X"]: + fkey = re.sub('(E|X)_BAR', r'A\g<1>', f).lower() + simtab[f'L_{f}'] = simtab[f''] * 1e51 << u.erg / u.s + simtab[f'E_{f}'] = simtab[f''] << u.MeV + # There is no pinch parameter so use alpha=2.0. + simtab[f'ALPHA_{f}'] = np.full_like(simtab[f'E_{f}'].value, 2.) + + self.filename = os.path.basename(filename) + + super().__init__(simtab, metadata) + +class Fornax_2019(base.SupernovaModel): + def __init__(self, filename, metadata={}, cache_flux=False): + """ + Parameters + ---------- + filename : str + Absolute or relative path to FITS file with model data. + cache_flux : bool + If true, pre-compute the flux on a fixed angular grid and store the values in a FITS file. + """ + # Open the requested filename using the model downloader. + datafile = self.request_file(filename) + + # Set up model metadata. + self.filename = os.path.basename(filename) + self.metadata = metadata + + self.dLdE_unit = 1e50 * u.erg/(u.s*u.MeV) + self.time = None + + self.E = {} + self.dE = {} + self.dLdE = {} + self.luminosity = {} + + self.is_cached = False + + logger = logging.getLogger() + if cache_flux and not 'healpy' in sys.modules: + logger.warning("No module named 'healpy'. Cannot enable caching.") + + # Check if we're initializing on a FITS file or not. + if filename.endswith('.fits'): + fitsfile = filename + else: + fitsfile = filename.replace('h5', 'fits') + + # Read a cached flux file in FITS format or generate one. + if cache_flux and os.path.exists(fitsfile): + self._read_fits(fitsfile) + ntim, nene, npix = self.dLdE[Flavor.NU_E].shape + self.npix = npix + self.nside = hp.npix2nside(npix) + self.is_cached = True + else: + # Load data from HDF5 + with h5py.File(datafile, 'r') as _h5file: + if self.time is None: + self.time = _h5file['nu0']['g0'].attrs['time'] * u.s + h5data = self._load_entire_hdf5(_h5file) + + # Use a HEALPix grid with nside=4 (192 pixels) to cache the + # values of Y_lm(theta, phi). + self.nside = 4 + self.npix = hp.nside2npix(self.nside) + thetac, phic = hp.pix2ang(self.nside, np.arange(self.npix)) + + Ylm = {} + for l in range(3): + Ylm[l] = {} + for m in range(-l, l+1): + Ylm[l][m] = Fornax_2019._real_sph_harm(l, m, thetac, phic) + + # Store 3D tables of dL/dE for each flavor. + nproc = len(ThreeFlavor) + with multiprocessing.Pool(processes=nproc, initializer=self._init_data, initargs=(h5data, Ylm, self.npix, self.dLdE_unit)) as pool: + data = pool.map(self._get_flavor_data, ThreeFlavor) + + for (_flavor, _E, _dE, _dLdE, _lum) in data: + self.E[_flavor] = _E + self.dE[_flavor] = _dE + self.dLdE[_flavor] = _dLdE + self.luminosity[_flavor] = _lum + + # Write output to FITS. + if cache_flux: + self._write_fits(fitsfile, overwrite=True) + self.is_cached = True + + @staticmethod + def _load_entire_hdf5(dct): + """Load full dictionary from HDF5""" + if isinstance(dct, h5py.Dataset): + return dct[()] + ret = {} + for k, v in dct.items(): + ret[k] = Fornax_2019._load_entire_hdf5(v) + return ret + + @staticmethod + def _flavorkeys(flavor): + """Convert flavor to data keys. + """ + if flavor == ThreeFlavor.NU_E: + return 'nu0' + elif flavor == ThreeFlavor.NU_E_BAR: + return 'nu1' + else: + return 'nu2' + + @staticmethod + def _init_data(hdf5_data, ylm, npix, dlde_unit): + """Variable initializer for the multiprocessing pool.""" + global h5data + global Ylm + global Npix + global dLdE_unit + h5data = hdf5_data + Ylm = ylm + Npix = npix + dLdE_unit = dlde_unit + + @staticmethod + def _get_flavor_data(flavor): + """Function to extract spectra for one flavor from HDF5.""" + key = Fornax_2019._flavorkeys(flavor) + E = h5data[key]['egroup'] * u.MeV + dE = h5data[key]['degroup'] * u.MeV + + ntim, nene = E.shape + dLdE = np.zeros((ntim, nene, Npix), dtype=float) + + # Loop over time bins + for i in range(ntim): + # Loop over energy bins: + for j in range(nene): + dLdE_ij = 0. + # Sum over multipole moments: + for l in range(3): + for m in range(-l, l+1): + dLdE_ij += h5data[key][f'g{j}'][f'l={l} m={m}'][i] * Ylm[l][m] + dLdE[i][j] = np.abs(dLdE_ij) + + # Set up proper units and correct for the nu_x factor + factor = 1. if flavor.is_electron else 0.25 + dLdE = dLdE * factor * dLdE_unit + + # Integrate over energy to get luminosity + L = np.sum(dLdE * dE[:, :, np.newaxis], axis=1) + + return (flavor, E, dE, dLdE, L) + + @staticmethod + def _fact(n): + """Calculate n!. + + Parameters + ---------- + n : int or float + Input for computing n factorial. + + Returns + ------- + factorial : float + Factorial n!, computed as Gamma(n+1). + """ + return gamma(n + 1.) + + @staticmethod + def _real_sph_harm(l, m, theta, phi): + """Compute orthonormalized real (tesseral) spherical harmonics Y_lm. + + Parameters + ---------- + l : int + Degree of the spherical harmonics. + m : int + Order of the spherical harmonics. + theta : float or ndarray + Input zenith angles. + phi : float or ndarray + Input azimuth angles. + + Returns + ------- + Y_lm : float or ndarray + Real-valued spherical harmonic function at theta, phi. + """ + if m < 0: + norm = np.sqrt((2*l + 1.)/(2*np.pi)*Fornax_2019._fact(l + m)/Fornax_2019._fact(l - m)) + return norm * lpmv(-m, l, np.cos(theta)) * np.sin(-m*phi) + elif m == 0: + norm = np.sqrt((2*l + 1.)/(4*np.pi)) + return norm * lpmv(0, l, np.cos(theta)) * np.ones_like(phi) + else: + norm = np.sqrt((2*l + 1.)/(2*np.pi)*Fornax_2019._fact(l - m)/Fornax_2019._fact(l + m)) + return norm * lpmv(m, l, np.cos(theta)) * np.cos(m*phi) + + def _read_fits(self, filename): + """Read cached angular data from FITS. + + Parameters + ---------- + filename : str + Input filename. + """ + hdus = fits.open(filename) + + self.time = hdus['TIME'].data * u.Unit(hdus['TIME'].header['BUNIT']) + + for flavor in ThreeFlavor: + name = str(flavor).split('.')[-1] + + ext = '{}_ENERGY'.format(name) + self.E[flavor] = hdus[ext].data * u.Unit(hdus[ext].header['BUNIT']) + + ext = '{}_DE'.format(name) + self.dE[flavor] = hdus[ext].data * u.Unit(hdus[ext].header['BUNIT']) + + ext = '{}_FLUX'.format(name) + self.dLdE[flavor] = hdus[ext].data * u.Unit(hdus[ext].header['BUNIT']) + self.dLdE[flavor] = self.dLdE[flavor].to('erg/(s*MeV)') + + + def _write_fits(self, filename, overwrite=False): + """Write angular-dependent calculated flux in FITS format. + + Parameters + ---------- + filename : str + Output filename. + """ + hx = fits.HDUList() + + hdu_time = fits.PrimaryHDU(self.time.to_value('s')) + hdu_time.header['EXTNAME'] = 'TIME' + hdu_time.header['BUNIT'] = 'second' + hx.append(hdu_time) + + for flavor in ThreeFlavor: + name = str(flavor).split('.')[-1] + + hdu_E = fits.ImageHDU(self.E[flavor].to_value('MeV')) + hdu_E.header['EXTNAME'] = '{}_ENERGY'.format(name) + hdu_E.header['BUNIT'] = 'MeV' + hx.append(hdu_E) + + hdu_dE = fits.ImageHDU(self.dE[flavor].to_value('MeV')) + hdu_dE.header['EXTNAME'] = '{}_DE'.format(name) + hdu_dE.header['BUNIT'] = 'MeV' + hx.append(hdu_dE) + + hdu_flux = fits.ImageHDU(self.dLdE[flavor].to_value(str(self.dLdE_unit))) + hdu_flux.header['EXTNAME'] = '{}_FLUX'.format(name) + hdu_flux.header['BUNIT'] = str(self.dLdE_unit) + hx.append(hdu_flux) + + hx.writeto(filename, overwrite=overwrite) + + def _get_binnedspectra(self, t, theta, phi): + """Get binned neutrino spectrum at a particular time. + + Parameters + ---------- + t : float or astropy.Quantity + Time to evaluate initial and oscillated spectra. + theta : astropy.Quantity + Zenith angle of the spectral emission. + phi : astropy.Quantity + Azimuth angle of the spectral emission. + + Returns + ------- + E : dict + Dictionary of energy bin central values, keyed by neutrino flavor. + dE : dict + Dictionary of energy bin widths, keyed by neutrino flavor. + binspec : dict + Dictionary of binned model spectra, keyed by neutrino flavor. + """ + E = {} + dE = {} + binspec = {} + + # Convert input time to a time index. + t = np.atleast_1d(t).to(self.time.unit) + j = np.array([np.abs(t_j - self.time).argmin() for t_j in t]) + k = hp.ang2pix(self.nside, theta.to_value('radian'), phi.to_value('radian')) + + for flavor in ThreeFlavor: + E[flavor] = self.E[flavor][j] + dE[flavor] = self.dE[flavor][j] + binspec[flavor] = self.dLdE[flavor][j,:,k] + + return E, dE, binspec + + def get_initial_spectra(self, t, E, theta, phi, flavors=ThreeFlavor, interpolation='linear'): + spectra_dict = self._get_initial_spectra_dict(t, E, theta, phi, flavors, interpolation) + return Spectrum.from_dict(spectra_dict, + time=t, + energy=E, + flavor_scheme=ThreeFlavor) + + def _get_initial_spectra_dict(self, t, E, theta, phi, flavors=ThreeFlavor, interpolation='linear'): + """Get neutrino spectra/luminosity curves before flavor transformation. + + Parameters + ---------- + t : astropy.Quantity + Time to evaluate initial spectra. + E : astropy.Quantity or ndarray of astropy.Quantity + Energies to evaluate the initial spectra. + theta : astropy.Quantity + Zenith angle of the spectral emission. + phi : astropy.Quantity + Azimuth angle of the spectral emission. + flavors: iterable of snewpy.neutrino.Flavor + Return spectra for these flavors only (default: all) + interpolation : str + Scheme to interpolate in spectra ('nearest', 'linear'). + + Returns + ------- + initial_spectra : dict + Dictionary of model spectra, keyed by neutrino flavor. + """ + initial_spectra = {} + + # Extract the binned spectra for the input t, theta, phi: + _E, _dE, _spec = self._get_binnedspectra(t, theta, phi) + + # Avoid "division by zero" in retrieval of the spectrum. + E[E == 0] = np.finfo(float).eps * E.unit + logE = np.atleast_1d(np.log10(E.to_value('MeV'))) + logeps = np.log10(np.finfo(float).eps * E.unit / u.MeV) + + for flavor in flavors: + + # Linear interpolation in flux. + if interpolation.lower() == 'linear': + # Pad log(E) array with values where flux is fixed to zero. + _logE = np.log10(_E[flavor].to_value('MeV')) + _dlogE = np.diff(_logE) + + # Set up energy bin edges + nt, nene = _E[flavor].shape + _logEbins = np.full((nt, nene+2), logeps) + _logEbins[:, 1:-1] = _logE + _logEbins[:,-1] = _logE[:,-1] + _dlogE[:,-1] + + # Pad spectrum with values where flux is fixed to zero: + _dLdE = np.full((nt, nene+2), 0.) + _dLdE[:, 1:-1] = _spec[flavor].to_value(self.dLdE_unit) + + initial_spectra[flavor] = [] + for i in range(nt): + initial_spectra[flavor].append(np.interp(logE, _logEbins[i], _dLdE[i]) * (self.dLdE_unit / E).to('1/(MeV*s)')) + initial_spectra[flavor] = np.vstack(initial_spectra[flavor]) + + # Nearest point interpolation + elif interpolation.lower() == 'nearest': + _logE = np.log10(_E[flavor].to_value('MeV')) + _dlogE = np.diff(_logE)[:,0] + + # Set up energy bin edges + nt, nene = _E[flavor].shape + _logEbins = np.full((nt, nene+1), 0.) + _logEbins[:, :-1] = _logE - 0.5*_dlogE[:,np.newaxis] + _logEbins[:, -1] = _logE[:,-1] + 0.5*_dlogE + _Ebins = 10**_logEbins * u.MeV + + initial_spectra[flavor] = [] + for i in range(nt): + idx = np.digitize(E, _Ebins[i]) + idx[idx > 0] -= 1 + idx[idx >= nene] = nene-1 + initial_spectra[flavor].append((_spec[flavor][i][idx] / E).to('1/(MeV*s)')) + initial_spectra[flavor] = np.vstack(initial_spectra[flavor]) + + # Unrecognized interpolation + else: + raise ValueError('Unrecognized interpolation type "{}"'.format(interpolation)) + + return initial_spectra + +class Fornax_2021(base.SupernovaModel): + def __init__(self, filename, metadata={}): + """ + Parameters + ---------- + filename : str + Absolute or relative path to HDF5 file with model data. + """ + #extra parameters + self.interpolation = "linear" #Scheme to interpolate in spectra ('nearest', 'linear'). + # Open the requested filename using the model downloader. + datafile = self.request_file(filename) + # Set up model metadata. + self.progenitor_mass = float(filename.split('/')[-1].split('_')[2][:-1]) * u.Msun + self.metadata = metadata + # Open HDF5 data file. + _h5file = h5py.File(datafile, 'r') + + self.time = _h5file['nu0'].attrs['time'] * u.s + + self.luminosity = {} + self._E = {} + self._dLdE = {} + for flavor in ThreeFlavor: + # Convert flavor to key name in the model HDF5 file + key = {ThreeFlavor.NU_E: 'nu0', + ThreeFlavor.NU_E_BAR: 'nu1', + ThreeFlavor.NU_MU: 'nu2', + ThreeFlavor.NU_MU_BAR: 'nu2', + ThreeFlavor.NU_TAU: 'nu2', + ThreeFlavor.NU_TAU_BAR: 'nu2'}[flavor] + + self._E[flavor] = np.asarray(_h5file[key]['egroup']) + self._dLdE[flavor] = {f"g{i}": np.asarray(_h5file[key][f'g{i}']) for i in range(12)} + + # Compute luminosity by integrating over model energy bins. + dE = np.asarray(_h5file[key]['degroup']) + n = len(dE[0]) + dLdE = np.zeros((len(self.time), n), dtype=float) + for i in range(n): + dLdE[:, i] = self._dLdE[flavor][f"g{i}"] + + # Note factor of 0.25 in nu_x and nu_x_bar. + factor = 1. if flavor.is_electron else 0.25 + self.luminosity[flavor] = np.sum(dLdE*dE, axis=1) * factor * 1e50 * u.erg/u.s + + def _get_initial_spectra_dict(self, t, E, flavors=ThreeFlavor): + """Get neutrino spectra/luminosity curves after oscillation. + + Parameters + ---------- + t : astropy.Quantity + Time to evaluate initial spectra. + E : astropy.Quantity or ndarray of astropy.Quantity + Energies to evaluate the initial spectra. + flavors: iterable of snewpy.neutrino.Flavor + Return spectra for these flavors only (default: all) + Returns + ------- + initialspectra : dict + Dictionary of model spectra, keyed by neutrino flavor. + """ + initialspectra = {} + + # Avoid "division by zero" in retrieval of the spectrum. + E[E == 0] = np.finfo(float).eps * E.unit + logE = np.log10(E.to_value('MeV')) + + # Make sure the input time uses the same units as the model time grid. + # Convert input time to a time index. + t = u.Quantity(t.to(self.time.unit), ndmin=1) + j = np.array(list(np.abs(_t - self.time).argmin() for _t in t)) + + for flavor in flavors: + # Energy bin centers (in MeV) + _E = self._E[flavor][j] + _logE = np.log10(_E) + _dlogE = np.diff(_logE) + + # Model flavors (internally) are nu_e, nu_e_bar, and nu_x, which stands + # for nu_mu(_bar) and nu_tau(_bar), making the flux 4x higher than nu_e and nu_e_bar. + factor = 1. if flavor.is_electron else 0.25 + + # Linear interpolation in flux. + if self.interpolation.lower() == 'linear': + # Pad log(E) array with values where flux is fixed to zero. + _logEbins = np.insert(_logE, 0, np.log10(np.finfo(float).eps * E.unit/u.MeV), axis=1) + _logEbins = np.append(_logEbins, np.expand_dims(_logE[:,-1] + _dlogE[:,-1], 1), axis=1) + + # Luminosity spectrum _dLdE is in units of 1e50 erg/s/MeV. + # Pad with values where flux is fixed to zero, then divide by E to get number luminosity + _dNLdE = np.asarray([np.zeros(j.shape)] + [self._dLdE[flavor]['g{}'.format(i)][j] for i in range(12)] + [np.zeros(j.shape)]).T + interp_values = np.array([np.interp(logE, __logEbins, __dNLdE) + for __logEbins, __dNLdE in zip(_logEbins, _dNLdE)]) + initialspectra[flavor] = (interp_values / E * factor * 1e50 * u.erg/u.s/u.MeV).to('1 / (erg s)') + + elif self.interpolation.lower() == 'nearest': + # Find edges of energy bins and identify which energy bin (each entry of) E falls into + _logEbinEdges = _logE - _dlogE[0,0] / 2 + _logEbinEdges = np.append(_logEbinEdges, np.expand_dims(_logE[:,-1] + _dlogE[:,-1]/2, 1), axis=1) + _EbinEdges = 10**_logEbinEdges + idx = np.array([np.searchsorted(edges, E) - 1 for edges in _EbinEdges]) + select = np.array([(_idx > 0) & (_idx < len(__E)) for _idx, __E in zip(idx, _E)]) + + # Divide luminosity spectrum by energy at bin center to get number luminosity spectrum + _dNLdE = np.zeros([len(j), len(np.atleast_1d(E))]) + for i in range(len(j)): + _dNLdE[i][np.where(select[i])] = np.asarray([self._dLdE[flavor]['g{}'.format(ebin_idx)][j[i]] / _E[i][ebin_idx] + for ebin_idx in idx[i][select[i]]]) + initialspectra[flavor] = ((_dNLdE << 1/u.MeV) * factor * 1e50 * u.erg/u.s/u.MeV).to('1 / (erg s)') + + else: + raise ValueError('Unrecognized interpolation type "{}"'.format(self.interpolation)) + + return initialspectra + + +class Fornax_2022(Fornax_2021): + def __init__(self, filename, metadata={}): + """ + Parameters + ---------- + filename : str + Absolute or relative path to HDF5 file with model data. + """ + #extra parameters + self.interpolation = "linear" #Scheme to interpolate in spectra ('nearest', 'linear'). + # Open the requested filename using the model downloader. + datafile = self.request_file(filename) + # Set up model metadata. + self.progenitor = os.path.splitext(os.path.basename(filename))[0].split('_')[2] + self.progenitor_mass = float(self.progenitor[:-3])*u.Msun if self.progenitor.endswith('bh') else float(self.progenitor)*u.Msun + + self.metadata = metadata + + # Open HDF5 data file. + _h5file = h5py.File(datafile, 'r') + + self.metadata['PNS mass'] = _h5file.attrs['Mpns'] * u.Msun + self.time = _h5file['nu0'].attrs['time'] * u.s + + self.luminosity = {} + self._E = {} + self._dLdE = {} + for flavor in ThreeFlavor: + # Convert flavor to key name in the model HDF5 file + key = {ThreeFlavor.NU_E: 'nu0', + ThreeFlavor.NU_E_BAR: 'nu1', + ThreeFlavor.NU_MU: 'nu2', + ThreeFlavor.NU_MU_BAR: 'nu2', + ThreeFlavor.NU_TAU: 'nu2', + ThreeFlavor.NU_TAU_BAR: 'nu2'}[flavor] + + self._E[flavor] = np.asarray(_h5file[key]['egroup']) + self._dLdE[flavor] = {f"g{i}": np.asarray(_h5file[key][f'g{i}']) for i in range(12)} + + # Compute luminosity by integrating over model energy bins. + dE = np.asarray(_h5file[key]['degroup']) + n = len(dE[0]) + dLdE = np.zeros((len(self.time), n), dtype=float) + for i in range(n): + dLdE[:, i] = self._dLdE[flavor][f"g{i}"] + + # Note factor of 0.25 in nu_x and nu_x_bar. + factor = 1. if flavor.is_electron else 0.25 + self.luminosity[flavor] = np.sum(dLdE*dE, axis=1) * factor * 1e50 * u.erg/u.s + + +class Fornax_2024(Fornax_2021): + def __init__(self, filename, metadata={}): + """ + Parameters + ---------- + filename : str + Absolute or relative path to HDF5 file with model data. + """ + #extra parameters + self.interpolation = 'linear' #Scheme to interpolate in spectra ('nearest', 'linear') + + # Open the requested filename using the model downloader. + datafile = self.request_file(filename) + # Set up model metadata. + self.progenitor = os.path.splitext(os.path.basename(filename))[0].split('_')[2] + self.progenitor_mass = float(re.sub('[A-Za-z]', '', self.progenitor)) + + self.metadata = metadata + + # Open HDF5 data file. + _h5file = h5py.File(datafile, 'r') + + self.metadata['PNS mass'] = _h5file.attrs['Mpns'] * u.Msun + self.time = _h5file['nu0'].attrs['time'] * u.s + + self.luminosity = {} + self._E = {} + self._dLdE = {} + for flavor in ThreeFlavor: + # Convert flavor to key name in the model HDF5 file + key = {ThreeFlavor.NU_E: 'nu0', + ThreeFlavor.NU_E_BAR: 'nu1', + ThreeFlavor.NU_MU: 'nu2', + ThreeFlavor.NU_MU_BAR: 'nu2', + ThreeFlavor.NU_TAU: 'nu2', + ThreeFlavor.NU_TAU_BAR: 'nu2'}[flavor] + + self._E[flavor] = np.asarray(_h5file[key]['egroup']) + self._dLdE[flavor] = {f"g{i}": np.asarray(_h5file[key][f'g{i}']) for i in range(12)} + + # Compute luminosity by integrating over model energy bins. + dE = np.asarray(_h5file[key]['degroup']) + n = len(dE[0]) + dLdE = np.zeros((len(self.time), n), dtype=float) + for i in range(n): + dLdE[:, i] = self._dLdE[flavor][f"g{i}"] + + # Note factor of 0.25 in nu_x and nu_x_bar. + factor = 1. if flavor.is_electron else 0.25 + self.luminosity[flavor] = np.sum(dLdE*dE, axis=1) * factor * 1e50 * u.erg/u.s + + +class Mori_2023(base.PinchedModel): + def __init__(self, filename, metadata={}): + """ + Parameters + ---------- + filename : str + Absolute or relative path to file prefix. + """ + # Open the requested filename using the model downloader. + datafile = self.request_file(filename) + + self.metadata = metadata + + # Read ASCII data. + simtab = Table.read(datafile, format='ascii') + + # Remove the first table row, which appears to have zero input. + simtab = simtab[simtab['1:t_sim[s]'] > 0] + + # Get grid of model times. + simtab['TIME'] = simtab['2:t_pb[s]'] << u.s + for j, (f, fkey) in enumerate(zip(["NU_E", "NU_E_BAR", "NU_X"], 'ebx')): + simtab[f'L_{f}'] = simtab[f'{6+j}:Le{fkey}[e/s]'] << u.erg / u.s + # Compute the pinch parameter from E_rms and E_avg + # / ^2 = (2+a)/(1+a), where + # E_rms^2 = - ^2. + Eavg = simtab[f'{9+j}:Em{fkey}[MeV]'] + Erms = simtab[f'{12+j}:Er{fkey}[MeV]'] + x = Erms**2 / Eavg**2 + alpha = (2-x) / (x-1) + + simtab[f'E_{f}'] = Eavg << u.MeV + simtab[f'E2_{f}'] = Erms**2 << u.MeV**2 + simtab[f'ALPHA_{f}'] = alpha + +# simtab[f'E_{f.name}'] = simtab[f'{9+j}:Em{fkey}[MeV]'] << u.MeV +# Erms = simtab[f'{12+j}:Er{fkey}[MeV]'] * u.MeV +# +# # Compute the pinch parameter from E_rms and E_avg +# simtab[f'E2_{f.name}'] = Erms**2 + simtab[f'E_{f.name}']**2 +# x = simtab[f'E2_{f.name}'] / simtab[f'E_{f.name}']**2 +# simtab[f'ALPHA_{f.name}'] = (2-x) / (x-1) + + self.filename = os.path.basename(filename) + + super().__init__(simtab, metadata) + + +class Takata_2025(base.PinchedModel): + def __init__(self, filename, metadata={}): + """ + Parameters + ---------- + filename: str + Absolute or relative path to file prefix. + + """ + + # Open the requested filename using the model downloader.\ + datafile = self.request_file(filename) + + self.metadata = metadata + + # Read ASCII data and clean up NaN values in float columns. + simtab = Table.read(datafile, format='ascii') + has_nan = np.zeros(len(simtab), dtype=bool) + for col in simtab.itercols(): + if col.info.dtype.kind == 'f': + has_nan |= np.isnan(col) + simtab = simtab[~has_nan] + + # Remove the first table row, which appears to have zero input. + simtab = simtab[simtab['1:t_sim[s]'] > 0] + + # Get grid of model times. + simtab['TIME'] = simtab['2:t_pb[s]'] << u.s + for j, (f, fkey) in enumerate(zip(["NU_E", "NU_E_BAR", "NU_X"], 'ebx')): + simtab[f'L_{f}'] = simtab[f'{6+j}:Le{fkey}[e/s]'] << u.erg / u.s + # Compute the pinch parameter from E_rms and E_avg + # E_rms^2/^2 = (2+a)/(1+a) + Eavg = simtab[f'{9+j}:Em{fkey}[MeV]'] + Erms = simtab[f'{12+j}:Er{fkey}[MeV]'] + x = Erms**2 / Eavg**2 + alpha = (2-x)/(x-1) + + simtab[f'E_{f}'] = Eavg << u.MeV + simtab[f'Erms_{f}'] = Erms << u.MeV + simtab[f'ALPHA_{f}'] = alpha + + self.filename = os.path.basename(filename) + + super().__init__(simtab, metadata) + + +class Bugli_2021(base.PinchedModel): + """Model based on `Buggli (2021) `_. + """ + + def __init__(self, filename, metadata={}): + """ + Parameters + ---------- + filename : str + Absolute or relative path to FITS file with model data. + """ + + datafile = self.request_file(filename) + simtab = Table.read(datafile, + names=['TIME', 'L_NU_E', 'L_NU_E_BAR', 'L_NU_X', + 'E_NU_E', 'E_NU_E_BAR', 'E_NU_X', + 'RMS_NU_E', 'RMS_NU_E_BAR', 'RMS_NU_X'], + format='ascii') + + simtab['ALPHA_NU_E'] = (2.0*simtab['E_NU_E']**2 - simtab['RMS_NU_E']**2) / \ + (simtab['RMS_NU_E']**2 - simtab['E_NU_E']**2) + simtab['ALPHA_NU_E_BAR'] = (2.0*simtab['E_NU_E_BAR']**2 - simtab['RMS_NU_E_BAR']**2) / \ + (simtab['RMS_NU_E_BAR']**2 - simtab['E_NU_E_BAR']**2) + simtab['ALPHA_NU_X'] = (2.0*simtab['E_NU_X']**2 - simtab['RMS_NU_X']**2) / \ + (simtab['RMS_NU_X']**2 - simtab['E_NU_X']**2) + + self.filename = os.path.basename(filename) + + super().__init__(simtab, metadata) + + +class Fischer_2020(base.PinchedModel): + def __init__(self, filename, metadata={}): + """ + Parameters + ---------- + filename : str + Absolute or relative path to file + """ + # Open the requested filename using the model downloader. + datafile = self.request_file(filename) + self.metadata = metadata + + # Open the requested filename using the model downloader. + # datafile = _model_downloader.get_model_data(self.__class__.__name__, filename) + # self.filename = os.path.basename(filename) + + simtab = Table() + + tf = tarfile.open(datafile) + + # Open luminosity file + with tf.extractfile("luminosity.dat") as Lfile: + Ldata = np.genfromtxt(Lfile, skip_header=2) + + simtab['TIME'] = Ldata[:, 0] + + simtab['L_NU_E'] = Ldata[:, 1] + simtab['L_NU_E_BAR'] = Ldata[:, 2] + simtab['L_NU_X'] = Ldata[:, 3] + simtab['L_NU_X_BAR'] = Ldata[:, 4] + + Lfile.close() + + # Open mean energy file + with tf.extractfile("menergy.dat") as Efile: + Edata = np.genfromtxt(Efile, skip_header=2) + + simtab['E_NU_E'] = Edata[:, 1] << u.MeV + simtab['E_NU_E_BAR'] = Edata[:, 2] << u.MeV + simtab['E_NU_X'] = Edata[:, 3] << u.MeV + simtab['E_NU_X_BAR'] = Edata[:, 4] << u.MeV + + Efile.close() + + # Open rms energy file + with tf.extractfile("rmsenergy.dat") as RMSEfile: + RMSEdata = np.genfromtxt(RMSEfile, skip_header=2) + + simtab['RMS_NU_E'] = RMSEdata[:, 1] << u.MeV + simtab['RMS_NU_E_BAR'] = RMSEdata[:, 2] << u.MeV + simtab['RMS_NU_X'] = RMSEdata[:, 3] << u.MeV + simtab['RMS_NU_X_BAR'] = RMSEdata[:, 4] << u.MeV + + RMSEfile.close() + + simtab['ALPHA_NU_E'] = (2.0 * simtab['E_NU_E'] ** 2 - simtab['RMS_NU_E'] ** 2) / \ + (simtab['RMS_NU_E'] ** 2 - simtab['E_NU_E'] ** 2) + simtab['ALPHA_NU_E_BAR'] = (2.0 * simtab['E_NU_E_BAR'] ** 2 - simtab['RMS_NU_E_BAR'] ** 2) / \ + (simtab['RMS_NU_E_BAR'] ** 2 - simtab['E_NU_E_BAR'] ** 2) + simtab['ALPHA_NU_X'] = (2.0 * simtab['E_NU_X'] ** 2 - simtab['RMS_NU_X'] ** 2) / \ + (simtab['RMS_NU_X'] ** 2 - simtab['E_NU_X'] ** 2) + simtab['ALPHA_NU_X_BAR'] = (2.0 * simtab['E_NU_X_BAR'] ** 2 - simtab['RMS_NU_X_BAR'] ** 2) / \ + (simtab['RMS_NU_X_BAR'] ** 2 - simtab['E_NU_X_BAR'] ** 2) + + tf.close() + + super().__init__(simtab, metadata) + + + From ec6fdc6f9b43a33fcdf64335a1cd72993f9947bc Mon Sep 17 00:00:00 2001 From: jpkneller Date: Wed, 12 Aug 2026 13:05:49 -0400 Subject: [PATCH 45/52] Add files via upload --- doc/source/nb/dev/PUSH.ipynb | 246 ++++++++++++++++++++++++++++++----- 1 file changed, 213 insertions(+), 33 deletions(-) diff --git a/doc/source/nb/dev/PUSH.ipynb b/doc/source/nb/dev/PUSH.ipynb index 805ae5df3..1ea318f50 100644 --- a/doc/source/nb/dev/PUSH.ipynb +++ b/doc/source/nb/dev/PUSH.ipynb @@ -113,7 +113,16 @@ { "data": { "text/plain": [ - "{'progenitor_mass': ,\n", + "{'progenitor_mass': ,\n", " 'eos': ['SFHo', 'SFHx', 'DD2', 'BHB', 'TM1', 'NL3'],\n", " 'callibration': ['calI']}" ] @@ -134,40 +143,19 @@ "metadata": {}, "outputs": [ { - "name": "stdout", + "name": "stderr", "output_type": "stream", "text": [ - "s27.6_SFHo_calI_Wolfe_luminosity.h5\n" - ] - }, - { - "ename": "KeyError", - "evalue": "\"Unable to synchronously open object (object 'times' doesn't exist)\"", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[6], line 2\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;66;03m# prepare the neutrino flux from the model\u001b[39;00m\n\u001b[1;32m----> 2\u001b[0m model \u001b[38;5;241m=\u001b[39m Wolfe_2023(progenitor_mass\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m27.6\u001b[39m\u001b[38;5;241m*\u001b[39mu\u001b[38;5;241m.\u001b[39mMsun,eos\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mSFHo\u001b[39m\u001b[38;5;124m'\u001b[39m) \u001b[38;5;66;03m# SN model\u001b[39;00m\n\u001b[0;32m 3\u001b[0m transformation \u001b[38;5;241m=\u001b[39m AdiabaticMSW(MixingParameters(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mNORMAL\u001b[39m\u001b[38;5;124m'\u001b[39m)) \u001b[38;5;66;03m# Desired flavor transformation\u001b[39;00m\n\u001b[0;32m 5\u001b[0m times \u001b[38;5;241m=\u001b[39m model\u001b[38;5;241m.\u001b[39mget_time()\n", - "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\snewpy\\models\\base.py:23\u001b[0m, in \u001b[0;36m_wrap_init.._wrapper\u001b[1;34m(self, *arg, **kwargs)\u001b[0m\n\u001b[0;32m 21\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(init)\n\u001b[0;32m 22\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_wrapper\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39marg, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m---> 23\u001b[0m init(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39marg, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m 24\u001b[0m check(\u001b[38;5;28mself\u001b[39m)\n", - "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\snewpy\\models\\registry_model.py:383\u001b[0m, in \u001b[0;36mRegistryModel.._wrap..c.__init__\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 381\u001b[0m S \u001b[38;5;241m=\u001b[39m inspect\u001b[38;5;241m.\u001b[39msignature(\u001b[38;5;28msuper\u001b[39m()\u001b[38;5;241m.\u001b[39m\u001b[38;5;21m__init__\u001b[39m)\n\u001b[0;32m 382\u001b[0m init_params \u001b[38;5;241m=\u001b[39m {name:val \u001b[38;5;28;01mfor\u001b[39;00m name,val \u001b[38;5;129;01min\u001b[39;00m arguments\u001b[38;5;241m.\u001b[39mitems() \u001b[38;5;28;01mif\u001b[39;00m name \u001b[38;5;129;01min\u001b[39;00m S\u001b[38;5;241m.\u001b[39mparameters}\n\u001b[1;32m--> 383\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28msuper\u001b[39m()\u001b[38;5;241m.\u001b[39m\u001b[38;5;21m__init__\u001b[39m(\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39minit_params)\n", - "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\snewpy\\models\\base.py:23\u001b[0m, in \u001b[0;36m_wrap_init.._wrapper\u001b[1;34m(self, *arg, **kwargs)\u001b[0m\n\u001b[0;32m 21\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(init)\n\u001b[0;32m 22\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_wrapper\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39marg, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m---> 23\u001b[0m init(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39marg, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m 24\u001b[0m check(\u001b[38;5;28mself\u001b[39m)\n", - "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\snewpy\\models\\ccsn.py:80\u001b[0m, in \u001b[0;36mWolfe_2023.__init__\u001b[1;34m(self, progenitor_mass, eos, callibration)\u001b[0m\n\u001b[0;32m 78\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__init__\u001b[39m(\u001b[38;5;28mself\u001b[39m, progenitor_mass:u\u001b[38;5;241m.\u001b[39mQuantity, eos:\u001b[38;5;28mstr\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mSFHo\u001b[39m\u001b[38;5;124m'\u001b[39m, callibration:\u001b[38;5;28mstr\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcalI\u001b[39m\u001b[38;5;124m'\u001b[39m):\n\u001b[0;32m 79\u001b[0m filename \u001b[38;5;241m=\u001b[39m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124ms\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mprogenitor_mass\u001b[38;5;241m.\u001b[39mvalue\u001b[38;5;132;01m:\u001b[39;00m\u001b[38;5;124m2.1f\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m_\u001b[39m\u001b[38;5;132;01m{\u001b[39;00meos\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m_\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mcallibration\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m_Wolfe_luminosity.h5\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m---> 80\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28msuper\u001b[39m()\u001b[38;5;241m.\u001b[39m\u001b[38;5;21m__init__\u001b[39m(filename\u001b[38;5;241m=\u001b[39mfilename, metadata\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmetadata)\n", - "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\snewpy\\models\\base.py:23\u001b[0m, in \u001b[0;36m_wrap_init.._wrapper\u001b[1;34m(self, *arg, **kwargs)\u001b[0m\n\u001b[0;32m 21\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(init)\n\u001b[0;32m 22\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_wrapper\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39marg, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m---> 23\u001b[0m init(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39marg, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m 24\u001b[0m check(\u001b[38;5;28mself\u001b[39m)\n", - "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\snewpy\\models\\ccsn_loaders.py:111\u001b[0m, in \u001b[0;36mPUSHArchiveModel.__init__\u001b[1;34m(self, filename, metadata)\u001b[0m\n\u001b[0;32m 108\u001b[0m simtab \u001b[38;5;241m=\u001b[39m Table()\n\u001b[0;32m 110\u001b[0m \u001b[38;5;66;03m#tbounce = f['metadata']['bounce_time'] * u.s\u001b[39;00m\n\u001b[1;32m--> 111\u001b[0m simtab[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mTIME\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m f[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtimes\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m*\u001b[39m u\u001b[38;5;241m.\u001b[39ms \u001b[38;5;66;03m#- tbounce\u001b[39;00m\n\u001b[0;32m 113\u001b[0m simtab[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mL_NU_E\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m f[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdata\u001b[39m\u001b[38;5;124m'\u001b[39m][\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlum_e\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m<<\u001b[39m u\u001b[38;5;241m.\u001b[39merg\u001b[38;5;241m/\u001b[39mu\u001b[38;5;241m.\u001b[39ms\n\u001b[0;32m 114\u001b[0m simtab[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mL_NU_E_BAR\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m f[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdata\u001b[39m\u001b[38;5;124m'\u001b[39m][\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlum_ebar\u001b[39m\u001b[38;5;124m'\u001b[39m][:, \u001b[38;5;241m2\u001b[39m] \u001b[38;5;241m<<\u001b[39m u\u001b[38;5;241m.\u001b[39merg\u001b[38;5;241m/\u001b[39mu\u001b[38;5;241m.\u001b[39ms\n", - "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\h5py\\_hl\\group.py:407\u001b[0m, in \u001b[0;36mGroup.__getitem__\u001b[1;34m(self, name)\u001b[0m\n\u001b[0;32m 405\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__getitem__\u001b[39m(\u001b[38;5;28mself\u001b[39m, name):\n\u001b[0;32m 406\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\" Open an object in the file \"\"\"\u001b[39;00m\n\u001b[1;32m--> 407\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get(name)\n", - "File \u001b[1;32mh5py/_objects.pyx:54\u001b[0m, in \u001b[0;36mh5py._objects.with_phil.wrapper\u001b[1;34m()\u001b[0m\n", - "File \u001b[1;32mh5py/_objects.pyx:55\u001b[0m, in \u001b[0;36mh5py._objects.with_phil.wrapper\u001b[1;34m()\u001b[0m\n", - "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\h5py\\_hl\\group.py:421\u001b[0m, in \u001b[0;36mGroup._get\u001b[1;34m(self, name, lapl)\u001b[0m\n\u001b[0;32m 419\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m lapl \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 420\u001b[0m lapl \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_lapl\n\u001b[1;32m--> 421\u001b[0m oid \u001b[38;5;241m=\u001b[39m h5o\u001b[38;5;241m.\u001b[39mopen(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mid, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_e(name), lapl\u001b[38;5;241m=\u001b[39mlapl)\n\u001b[0;32m 422\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 423\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mAccessing a group is done with bytes or str, \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 424\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnot \u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mformat(\u001b[38;5;28mtype\u001b[39m(name)))\n", - "File \u001b[1;32mh5py/_objects.pyx:54\u001b[0m, in \u001b[0;36mh5py._objects.with_phil.wrapper\u001b[1;34m()\u001b[0m\n", - "File \u001b[1;32mh5py/_objects.pyx:55\u001b[0m, in \u001b[0;36mh5py._objects.with_phil.wrapper\u001b[1;34m()\u001b[0m\n", - "File \u001b[1;32mh5py/h5o.pyx:255\u001b[0m, in \u001b[0;36mh5py.h5o.open\u001b[1;34m()\u001b[0m\n", - "\u001b[1;31mKeyError\u001b[0m: \"Unable to synchronously open object (object 'times' doesn't exist)\"" + "C:\\Users\\jpknelle\\AppData\\Roaming\\Python\\Python312\\site-packages\\snewpy\\models\\ccsn_loaders.py:117: RuntimeWarning: invalid value encountered in divide\n", + " simtab['E_NU_E'] = f['data'][:,3] / f['data'][:,1] << u.erg\n", + "C:\\Users\\jpknelle\\AppData\\Roaming\\Python\\Python312\\site-packages\\snewpy\\models\\ccsn_loaders.py:118: RuntimeWarning: invalid value encountered in divide\n", + " simtab['E_NU_E_BAR'] = f['data'][:,4] / f['data'][:,2] << u.erg\n" ] } ], "source": [ "# prepare the neutrino flux from the model\n", - "model = Wolfe_2023(progenitor_mass=27.6*u.Msun,eos='SFHo') # SN model\n", + "model = Wolfe_2023(progenitor_mass=27.6*u.solMass,eos='SFHo') # SN model\n", "transformation = AdiabaticMSW(MixingParameters('NORMAL')) # Desired flavor transformation\n", "\n", "times = model.get_time()\n", @@ -176,15 +164,26 @@ "\n", "#get the flux from the model\n", "flux = model.get_flux(t=times, E=energies, distance=distance, flavor_xform=transformation)\n", - "fluence = flux.integrate('time')" + "fluence = flux.integrate('time')\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "id": "4745585e-fc5d-4e45-8696-55dc3cbe63fd", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "t = 50*u.ms\n", "\n", @@ -218,10 +217,191 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "id": "0e7889dd-f442-4841-819b-ce7e31cd9a85", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "A module that was compiled using NumPy 1.x cannot be run in\n", + "NumPy 2.5.1 as it may crash. To support both 1.x and 2.x\n", + "versions of NumPy, modules must be compiled with NumPy 2.0.\n", + "Some module may need to rebuild instead e.g. with 'pybind11>=2.12'.\n", + "\n", + "If you are a user of the module, the easiest solution will be to\n", + "downgrade to 'numpy<2' or try to upgrade the affected module.\n", + "We expect that some modules will need time to support NumPy 2.\n", + "\n", + "Traceback (most recent call last): File \"\", line 198, in _run_module_as_main\n", + " File \"\", line 88, in _run_code\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\ipykernel_launcher.py\", line 17, in \n", + " app.launch_new_instance()\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\traitlets\\config\\application.py\", line 1075, in launch_instance\n", + " app.start()\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelapp.py\", line 701, in start\n", + " self.io_loop.start()\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\tornado\\platform\\asyncio.py\", line 205, in start\n", + " self.asyncio_loop.run_forever()\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\asyncio\\windows_events.py\", line 322, in run_forever\n", + " super().run_forever()\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\asyncio\\base_events.py\", line 641, in run_forever\n", + " self._run_once()\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\asyncio\\base_events.py\", line 1986, in _run_once\n", + " handle._run()\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\asyncio\\events.py\", line 88, in _run\n", + " self._context.run(self._callback, *self._args)\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelbase.py\", line 534, in dispatch_queue\n", + " await self.process_one()\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelbase.py\", line 523, in process_one\n", + " await dispatch(*args)\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelbase.py\", line 429, in dispatch_shell\n", + " await result\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelbase.py\", line 767, in execute_request\n", + " reply_content = await reply_content\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\ipykernel\\ipkernel.py\", line 429, in do_execute\n", + " res = shell.run_cell(\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\ipykernel\\zmqshell.py\", line 549, in run_cell\n", + " return super().run_cell(*args, **kwargs)\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3075, in run_cell\n", + " result = self._run_cell(\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3130, in _run_cell\n", + " result = runner(coro)\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\async_helpers.py\", line 128, in _pseudo_sync_runner\n", + " coro.send(None)\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3334, in run_cell_async\n", + " has_raised = await self.run_ast_nodes(code_ast.body, cell_name,\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3517, in run_ast_nodes\n", + " if await self.run_code(code, result, async_=asy):\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3577, in run_code\n", + " exec(code_obj, self.user_global_ns, self.user_ns)\n", + " File \"C:\\Users\\jpknelle\\AppData\\Local\\Temp\\ipykernel_25756\\53219191.py\", line 1, in \n", + " from snewpy.rate_calculator import RateCalculator\n", + " File \"C:\\Users\\jpknelle\\AppData\\Roaming\\Python\\Python312\\site-packages\\snewpy\\rate_calculator.py\", line 10, in \n", + " from snewpy.snowglobes_interface import SnowglobesData, guess_material\n", + " File \"C:\\Users\\jpknelle\\AppData\\Roaming\\Python\\Python312\\site-packages\\snewpy\\snowglobes_interface.py\", line 10, in \n", + " import pandas as pd\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\pandas\\__init__.py\", line 26, in \n", + " from pandas.compat import (\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\pandas\\compat\\__init__.py\", line 27, in \n", + " from pandas.compat.pyarrow import (\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\pandas\\compat\\pyarrow.py\", line 8, in \n", + " import pyarrow as pa\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\pyarrow\\__init__.py\", line 65, in \n", + " import pyarrow.lib as _lib\n" + ] + }, + { + "ename": "ImportError", + "evalue": "\nA module that was compiled using NumPy 1.x cannot be run in\nNumPy 2.5.1 as it may crash. To support both 1.x and 2.x\nversions of NumPy, modules must be compiled with NumPy 2.0.\nSome module may need to rebuild instead e.g. with 'pybind11>=2.12'.\n\nIf you are a user of the module, the easiest solution will be to\ndowngrade to 'numpy<2' or try to upgrade the affected module.\nWe expect that some modules will need time to support NumPy 2.\n\n", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mImportError\u001b[0m Traceback (most recent call last)", + "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\numpy\\core\\_multiarray_umath.py:46\u001b[0m, in \u001b[0;36m__getattr__\u001b[1;34m(attr_name)\u001b[0m\n\u001b[0;32m 41\u001b[0m \u001b[38;5;66;03m# Also print the message (with traceback). This is because old versions\u001b[39;00m\n\u001b[0;32m 42\u001b[0m \u001b[38;5;66;03m# of NumPy unfortunately set up the import to replace (and hide) the\u001b[39;00m\n\u001b[0;32m 43\u001b[0m \u001b[38;5;66;03m# error. The traceback shouldn't be needed, but e.g. pytest plugins\u001b[39;00m\n\u001b[0;32m 44\u001b[0m \u001b[38;5;66;03m# seem to swallow it and we should be failing anyway...\u001b[39;00m\n\u001b[0;32m 45\u001b[0m sys\u001b[38;5;241m.\u001b[39mstderr\u001b[38;5;241m.\u001b[39mwrite(msg \u001b[38;5;241m+\u001b[39m tb_msg)\n\u001b[1;32m---> 46\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mImportError\u001b[39;00m(msg)\n\u001b[0;32m 48\u001b[0m ret \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mgetattr\u001b[39m(_multiarray_umath, attr_name, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[0;32m 49\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ret \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", + "\u001b[1;31mImportError\u001b[0m: \nA module that was compiled using NumPy 1.x cannot be run in\nNumPy 2.5.1 as it may crash. To support both 1.x and 2.x\nversions of NumPy, modules must be compiled with NumPy 2.0.\nSome module may need to rebuild instead e.g. with 'pybind11>=2.12'.\n\nIf you are a user of the module, the easiest solution will be to\ndowngrade to 'numpy<2' or try to upgrade the affected module.\nWe expect that some modules will need time to support NumPy 2.\n\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "A module that was compiled using NumPy 1.x cannot be run in\n", + "NumPy 2.5.1 as it may crash. To support both 1.x and 2.x\n", + "versions of NumPy, modules must be compiled with NumPy 2.0.\n", + "Some module may need to rebuild instead e.g. with 'pybind11>=2.12'.\n", + "\n", + "If you are a user of the module, the easiest solution will be to\n", + "downgrade to 'numpy<2' or try to upgrade the affected module.\n", + "We expect that some modules will need time to support NumPy 2.\n", + "\n", + "Traceback (most recent call last): File \"\", line 198, in _run_module_as_main\n", + " File \"\", line 88, in _run_code\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\ipykernel_launcher.py\", line 17, in \n", + " app.launch_new_instance()\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\traitlets\\config\\application.py\", line 1075, in launch_instance\n", + " app.start()\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelapp.py\", line 701, in start\n", + " self.io_loop.start()\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\tornado\\platform\\asyncio.py\", line 205, in start\n", + " self.asyncio_loop.run_forever()\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\asyncio\\windows_events.py\", line 322, in run_forever\n", + " super().run_forever()\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\asyncio\\base_events.py\", line 641, in run_forever\n", + " self._run_once()\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\asyncio\\base_events.py\", line 1986, in _run_once\n", + " handle._run()\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\asyncio\\events.py\", line 88, in _run\n", + " self._context.run(self._callback, *self._args)\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelbase.py\", line 534, in dispatch_queue\n", + " await self.process_one()\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelbase.py\", line 523, in process_one\n", + " await dispatch(*args)\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelbase.py\", line 429, in dispatch_shell\n", + " await result\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelbase.py\", line 767, in execute_request\n", + " reply_content = await reply_content\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\ipykernel\\ipkernel.py\", line 429, in do_execute\n", + " res = shell.run_cell(\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\ipykernel\\zmqshell.py\", line 549, in run_cell\n", + " return super().run_cell(*args, **kwargs)\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3075, in run_cell\n", + " result = self._run_cell(\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3130, in _run_cell\n", + " result = runner(coro)\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\async_helpers.py\", line 128, in _pseudo_sync_runner\n", + " coro.send(None)\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3334, in run_cell_async\n", + " has_raised = await self.run_ast_nodes(code_ast.body, cell_name,\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3517, in run_ast_nodes\n", + " if await self.run_code(code, result, async_=asy):\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3577, in run_code\n", + " exec(code_obj, self.user_global_ns, self.user_ns)\n", + " File \"C:\\Users\\jpknelle\\AppData\\Local\\Temp\\ipykernel_25756\\53219191.py\", line 1, in \n", + " from snewpy.rate_calculator import RateCalculator\n", + " File \"C:\\Users\\jpknelle\\AppData\\Roaming\\Python\\Python312\\site-packages\\snewpy\\rate_calculator.py\", line 10, in \n", + " from snewpy.snowglobes_interface import SnowglobesData, guess_material\n", + " File \"C:\\Users\\jpknelle\\AppData\\Roaming\\Python\\Python312\\site-packages\\snewpy\\snowglobes_interface.py\", line 10, in \n", + " import pandas as pd\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\pandas\\__init__.py\", line 49, in \n", + " from pandas.core.api import (\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\pandas\\core\\api.py\", line 1, in \n", + " from pandas._libs import (\n", + " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\pandas\\_libs\\__init__.py\", line 17, in \n", + " import pandas._libs.pandas_datetime # noqa: F401 # isort: skip # type: ignore[reportUnusedImport]\n" + ] + }, + { + "ename": "ImportError", + "evalue": "\nA module that was compiled using NumPy 1.x cannot be run in\nNumPy 2.5.1 as it may crash. To support both 1.x and 2.x\nversions of NumPy, modules must be compiled with NumPy 2.0.\nSome module may need to rebuild instead e.g. with 'pybind11>=2.12'.\n\nIf you are a user of the module, the easiest solution will be to\ndowngrade to 'numpy<2' or try to upgrade the affected module.\nWe expect that some modules will need time to support NumPy 2.\n\n", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mImportError\u001b[0m Traceback (most recent call last)", + "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\numpy\\core\\_multiarray_umath.py:46\u001b[0m, in \u001b[0;36m__getattr__\u001b[1;34m(attr_name)\u001b[0m\n\u001b[0;32m 41\u001b[0m \u001b[38;5;66;03m# Also print the message (with traceback). This is because old versions\u001b[39;00m\n\u001b[0;32m 42\u001b[0m \u001b[38;5;66;03m# of NumPy unfortunately set up the import to replace (and hide) the\u001b[39;00m\n\u001b[0;32m 43\u001b[0m \u001b[38;5;66;03m# error. The traceback shouldn't be needed, but e.g. pytest plugins\u001b[39;00m\n\u001b[0;32m 44\u001b[0m \u001b[38;5;66;03m# seem to swallow it and we should be failing anyway...\u001b[39;00m\n\u001b[0;32m 45\u001b[0m sys\u001b[38;5;241m.\u001b[39mstderr\u001b[38;5;241m.\u001b[39mwrite(msg \u001b[38;5;241m+\u001b[39m tb_msg)\n\u001b[1;32m---> 46\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mImportError\u001b[39;00m(msg)\n\u001b[0;32m 48\u001b[0m ret \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mgetattr\u001b[39m(_multiarray_umath, attr_name, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[0;32m 49\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ret \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", + "\u001b[1;31mImportError\u001b[0m: \nA module that was compiled using NumPy 1.x cannot be run in\nNumPy 2.5.1 as it may crash. To support both 1.x and 2.x\nversions of NumPy, modules must be compiled with NumPy 2.0.\nSome module may need to rebuild instead e.g. with 'pybind11>=2.12'.\n\nIf you are a user of the module, the easiest solution will be to\ndowngrade to 'numpy<2' or try to upgrade the affected module.\nWe expect that some modules will need time to support NumPy 2.\n\n" + ] + }, + { + "ename": "ImportError", + "evalue": "numpy.core.multiarray failed to import", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mImportError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[8], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01msnewpy\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mrate_calculator\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m RateCalculator\n\u001b[0;32m 3\u001b[0m \u001b[38;5;66;03m#load the RateCalculator object\u001b[39;00m\n\u001b[0;32m 4\u001b[0m rc \u001b[38;5;241m=\u001b[39m RateCalculator()\n", + "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\snewpy\\rate_calculator.py:10\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 2\u001b[0m \u001b[38;5;124;03mThe module :mod:`snewpy.rate_calculator` defines a Python interface for calculating event rates using data from SNOwGLoBES\u001b[39;00m\n\u001b[0;32m 3\u001b[0m \n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 7\u001b[0m \u001b[38;5;124;03m :members: run\u001b[39;00m\n\u001b[0;32m 8\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 9\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mnumpy\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mnp\u001b[39;00m\n\u001b[1;32m---> 10\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01msnewpy\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01msnowglobes_interface\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m SnowglobesData, guess_material\n\u001b[0;32m 11\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01msnewpy\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mneutrino\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m Flavor\n\u001b[0;32m 12\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01msnewpy\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mflux\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m Container\n", + "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\snewpy\\snowglobes_interface.py:10\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 2\u001b[0m \u001b[38;5;124;03mThe module ``snewpy.snowglobes_interface`` contains a low-level Python interface for SNOwGLoBES v1.3.\u001b[39;00m\n\u001b[0;32m 3\u001b[0m \n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 7\u001b[0m \u001b[38;5;124;03m any time without warning, e.g. to support new SNOwGLoBES versions.\u001b[39;00m\n\u001b[0;32m 8\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 9\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpathlib\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m Path\n\u001b[1;32m---> 10\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mpd\u001b[39;00m\n\u001b[0;32m 11\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mnumpy\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mnp\u001b[39;00m\n\u001b[0;32m 12\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mos\u001b[39;00m\n", + "File \u001b[1;32mC:\\ProgramData\\anaconda3\\Lib\\site-packages\\pandas\\__init__.py:49\u001b[0m\n\u001b[0;32m 46\u001b[0m \u001b[38;5;66;03m# let init-time option registration happen\u001b[39;00m\n\u001b[0;32m 47\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mconfig_init\u001b[39;00m \u001b[38;5;66;03m# pyright: ignore[reportUnusedImport] # noqa: F401\u001b[39;00m\n\u001b[1;32m---> 49\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mapi\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m (\n\u001b[0;32m 50\u001b[0m \u001b[38;5;66;03m# dtype\u001b[39;00m\n\u001b[0;32m 51\u001b[0m ArrowDtype,\n\u001b[0;32m 52\u001b[0m Int8Dtype,\n\u001b[0;32m 53\u001b[0m Int16Dtype,\n\u001b[0;32m 54\u001b[0m Int32Dtype,\n\u001b[0;32m 55\u001b[0m Int64Dtype,\n\u001b[0;32m 56\u001b[0m UInt8Dtype,\n\u001b[0;32m 57\u001b[0m UInt16Dtype,\n\u001b[0;32m 58\u001b[0m UInt32Dtype,\n\u001b[0;32m 59\u001b[0m UInt64Dtype,\n\u001b[0;32m 60\u001b[0m Float32Dtype,\n\u001b[0;32m 61\u001b[0m Float64Dtype,\n\u001b[0;32m 62\u001b[0m CategoricalDtype,\n\u001b[0;32m 63\u001b[0m PeriodDtype,\n\u001b[0;32m 64\u001b[0m IntervalDtype,\n\u001b[0;32m 65\u001b[0m DatetimeTZDtype,\n\u001b[0;32m 66\u001b[0m StringDtype,\n\u001b[0;32m 67\u001b[0m BooleanDtype,\n\u001b[0;32m 68\u001b[0m \u001b[38;5;66;03m# missing\u001b[39;00m\n\u001b[0;32m 69\u001b[0m NA,\n\u001b[0;32m 70\u001b[0m isna,\n\u001b[0;32m 71\u001b[0m isnull,\n\u001b[0;32m 72\u001b[0m notna,\n\u001b[0;32m 73\u001b[0m notnull,\n\u001b[0;32m 74\u001b[0m \u001b[38;5;66;03m# indexes\u001b[39;00m\n\u001b[0;32m 75\u001b[0m Index,\n\u001b[0;32m 76\u001b[0m CategoricalIndex,\n\u001b[0;32m 77\u001b[0m RangeIndex,\n\u001b[0;32m 78\u001b[0m MultiIndex,\n\u001b[0;32m 79\u001b[0m IntervalIndex,\n\u001b[0;32m 80\u001b[0m TimedeltaIndex,\n\u001b[0;32m 81\u001b[0m DatetimeIndex,\n\u001b[0;32m 82\u001b[0m PeriodIndex,\n\u001b[0;32m 83\u001b[0m IndexSlice,\n\u001b[0;32m 84\u001b[0m \u001b[38;5;66;03m# tseries\u001b[39;00m\n\u001b[0;32m 85\u001b[0m NaT,\n\u001b[0;32m 86\u001b[0m Period,\n\u001b[0;32m 87\u001b[0m period_range,\n\u001b[0;32m 88\u001b[0m Timedelta,\n\u001b[0;32m 89\u001b[0m timedelta_range,\n\u001b[0;32m 90\u001b[0m Timestamp,\n\u001b[0;32m 91\u001b[0m date_range,\n\u001b[0;32m 92\u001b[0m bdate_range,\n\u001b[0;32m 93\u001b[0m Interval,\n\u001b[0;32m 94\u001b[0m interval_range,\n\u001b[0;32m 95\u001b[0m DateOffset,\n\u001b[0;32m 96\u001b[0m \u001b[38;5;66;03m# conversion\u001b[39;00m\n\u001b[0;32m 97\u001b[0m to_numeric,\n\u001b[0;32m 98\u001b[0m to_datetime,\n\u001b[0;32m 99\u001b[0m to_timedelta,\n\u001b[0;32m 100\u001b[0m \u001b[38;5;66;03m# misc\u001b[39;00m\n\u001b[0;32m 101\u001b[0m Flags,\n\u001b[0;32m 102\u001b[0m Grouper,\n\u001b[0;32m 103\u001b[0m factorize,\n\u001b[0;32m 104\u001b[0m unique,\n\u001b[0;32m 105\u001b[0m value_counts,\n\u001b[0;32m 106\u001b[0m NamedAgg,\n\u001b[0;32m 107\u001b[0m array,\n\u001b[0;32m 108\u001b[0m Categorical,\n\u001b[0;32m 109\u001b[0m set_eng_float_format,\n\u001b[0;32m 110\u001b[0m Series,\n\u001b[0;32m 111\u001b[0m DataFrame,\n\u001b[0;32m 112\u001b[0m )\n\u001b[0;32m 114\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdtypes\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdtypes\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m SparseDtype\n\u001b[0;32m 116\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mtseries\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mapi\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m infer_freq\n", + "File \u001b[1;32mC:\\ProgramData\\anaconda3\\Lib\\site-packages\\pandas\\core\\api.py:1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_libs\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m (\n\u001b[0;32m 2\u001b[0m NaT,\n\u001b[0;32m 3\u001b[0m Period,\n\u001b[0;32m 4\u001b[0m Timedelta,\n\u001b[0;32m 5\u001b[0m Timestamp,\n\u001b[0;32m 6\u001b[0m )\n\u001b[0;32m 7\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_libs\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mmissing\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m NA\n\u001b[0;32m 9\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdtypes\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdtypes\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m (\n\u001b[0;32m 10\u001b[0m ArrowDtype,\n\u001b[0;32m 11\u001b[0m CategoricalDtype,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 14\u001b[0m PeriodDtype,\n\u001b[0;32m 15\u001b[0m )\n", + "File \u001b[1;32mC:\\ProgramData\\anaconda3\\Lib\\site-packages\\pandas\\_libs\\__init__.py:17\u001b[0m\n\u001b[0;32m 13\u001b[0m \u001b[38;5;66;03m# Below imports needs to happen first to ensure pandas top level\u001b[39;00m\n\u001b[0;32m 14\u001b[0m \u001b[38;5;66;03m# module gets monkeypatched with the pandas_datetime_CAPI\u001b[39;00m\n\u001b[0;32m 15\u001b[0m \u001b[38;5;66;03m# see pandas_datetime_exec in pd_datetime.c\u001b[39;00m\n\u001b[0;32m 16\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_libs\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpandas_parser\u001b[39;00m \u001b[38;5;66;03m# isort: skip # type: ignore[reportUnusedImport]\u001b[39;00m\n\u001b[1;32m---> 17\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_libs\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpandas_datetime\u001b[39;00m \u001b[38;5;66;03m# noqa: F401 # isort: skip # type: ignore[reportUnusedImport]\u001b[39;00m\n\u001b[0;32m 18\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_libs\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01minterval\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m Interval\n\u001b[0;32m 19\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_libs\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mtslibs\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m (\n\u001b[0;32m 20\u001b[0m NaT,\n\u001b[0;32m 21\u001b[0m NaTType,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 26\u001b[0m iNaT,\n\u001b[0;32m 27\u001b[0m )\n", + "\u001b[1;31mImportError\u001b[0m: numpy.core.multiarray failed to import" + ] + } + ], "source": [ "from snewpy.rate_calculator import RateCalculator\n", "\n", From 0dd5ac7b2c63dcb79aad65797237ebdb4a265018 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Wed, 12 Aug 2026 13:13:27 -0400 Subject: [PATCH 46/52] Update ccsn_loaders.py --- python/snewpy/models/ccsn_loaders.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/python/snewpy/models/ccsn_loaders.py b/python/snewpy/models/ccsn_loaders.py index 9d48c11cd..fcdaff4ce 100644 --- a/python/snewpy/models/ccsn_loaders.py +++ b/python/snewpy/models/ccsn_loaders.py @@ -113,10 +113,14 @@ def __init__(self, filename, metadata={}): simtab['L_NU_E'] = f['data'][:,3] << u.erg/u.s simtab['L_NU_E_BAR'] = f['data'][:,4] << u.erg/u.s simtab['L_NU_X'] = f['data'][:,6] << u.erg/u.s - + simtab['E_NU_E'] = f['data'][:,3] / f['data'][:,1] << u.erg simtab['E_NU_E_BAR'] = f['data'][:,4] / f['data'][:,2] << u.erg simtab['E_NU_X'] = f['data'][:,6] / f['data'][:,5] << u.erg + #remove bad values + simtab['E_NU_E'][np.isnan(['E_NU_E'])] = 0 + simtab['E_NU_E_BAR'][np.isnan(['E_NU_E_BAR'])] = 0 + simtab['E_NU_X'][np.isnan(['E_NU_X'])] = 0 simtab['ALPHA_NU_E'] = np.full(len(simtab['TIME']),3) simtab['ALPHA_NU_E_BAR'] = simtab['ALPHA_NU_E'] From 51d8ba0f799cc3cf0a6aef16796d19cf862a31c1 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Wed, 12 Aug 2026 13:29:57 -0400 Subject: [PATCH 47/52] Add files via upload --- python/snewpy/models/ccsn_loaders.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/python/snewpy/models/ccsn_loaders.py b/python/snewpy/models/ccsn_loaders.py index fcdaff4ce..a0f0ad57e 100644 --- a/python/snewpy/models/ccsn_loaders.py +++ b/python/snewpy/models/ccsn_loaders.py @@ -113,14 +113,15 @@ def __init__(self, filename, metadata={}): simtab['L_NU_E'] = f['data'][:,3] << u.erg/u.s simtab['L_NU_E_BAR'] = f['data'][:,4] << u.erg/u.s simtab['L_NU_X'] = f['data'][:,6] << u.erg/u.s - - simtab['E_NU_E'] = f['data'][:,3] / f['data'][:,1] << u.erg - simtab['E_NU_E_BAR'] = f['data'][:,4] / f['data'][:,2] << u.erg - simtab['E_NU_X'] = f['data'][:,6] / f['data'][:,5] << u.erg + + with np.errstate(divide='ignore', invalid='ignore'): + simtab['E_NU_E'] = np.array(f['data'][:,3]) / np.array(f['data'][:,1]) << u.erg + simtab['E_NU_E_BAR'] = np.array(f['data'][:,4]) / np.array(f['data'][:,2]) << u.erg + simtab['E_NU_X'] = np.array(f['data'][:,6]) / np.array(f['data'][:,5]) << u.erg #remove bad values - simtab['E_NU_E'][np.isnan(['E_NU_E'])] = 0 - simtab['E_NU_E_BAR'][np.isnan(['E_NU_E_BAR'])] = 0 - simtab['E_NU_X'][np.isnan(['E_NU_X'])] = 0 + simtab['E_NU_E'][np.isnan(simtab['E_NU_E'])] = 1 * u.erg + simtab['E_NU_E_BAR'][np.isnan(simtab['E_NU_E_BAR'])] = 1 * u.erg + simtab['E_NU_X'][np.isnan(simtab['E_NU_X'])] = 1 * u.erg simtab['ALPHA_NU_E'] = np.full(len(simtab['TIME']),3) simtab['ALPHA_NU_E_BAR'] = simtab['ALPHA_NU_E'] From 207678acda67598baabf54238f598d7c1763df93 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Wed, 12 Aug 2026 13:33:55 -0400 Subject: [PATCH 48/52] Add files via upload --- doc/source/nb/dev/PUSH.ipynb | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/doc/source/nb/dev/PUSH.ipynb b/doc/source/nb/dev/PUSH.ipynb index 1ea318f50..31e52deb1 100644 --- a/doc/source/nb/dev/PUSH.ipynb +++ b/doc/source/nb/dev/PUSH.ipynb @@ -141,18 +141,7 @@ "execution_count": 6, "id": "54dbcde6-4aac-4f96-9dbe-ced31225919a", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\jpknelle\\AppData\\Roaming\\Python\\Python312\\site-packages\\snewpy\\models\\ccsn_loaders.py:117: RuntimeWarning: invalid value encountered in divide\n", - " simtab['E_NU_E'] = f['data'][:,3] / f['data'][:,1] << u.erg\n", - "C:\\Users\\jpknelle\\AppData\\Roaming\\Python\\Python312\\site-packages\\snewpy\\models\\ccsn_loaders.py:118: RuntimeWarning: invalid value encountered in divide\n", - " simtab['E_NU_E_BAR'] = f['data'][:,4] / f['data'][:,2] << u.erg\n" - ] - } - ], + "outputs": [], "source": [ "# prepare the neutrino flux from the model\n", "model = Wolfe_2023(progenitor_mass=27.6*u.solMass,eos='SFHo') # SN model\n", @@ -277,7 +266,7 @@ " if await self.run_code(code, result, async_=asy):\n", " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3577, in run_code\n", " exec(code_obj, self.user_global_ns, self.user_ns)\n", - " File \"C:\\Users\\jpknelle\\AppData\\Local\\Temp\\ipykernel_25756\\53219191.py\", line 1, in \n", + " File \"C:\\Users\\jpknelle\\AppData\\Local\\Temp\\ipykernel_17544\\53219191.py\", line 1, in \n", " from snewpy.rate_calculator import RateCalculator\n", " File \"C:\\Users\\jpknelle\\AppData\\Roaming\\Python\\Python312\\site-packages\\snewpy\\rate_calculator.py\", line 10, in \n", " from snewpy.snowglobes_interface import SnowglobesData, guess_material\n", @@ -360,7 +349,7 @@ " if await self.run_code(code, result, async_=asy):\n", " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3577, in run_code\n", " exec(code_obj, self.user_global_ns, self.user_ns)\n", - " File \"C:\\Users\\jpknelle\\AppData\\Local\\Temp\\ipykernel_25756\\53219191.py\", line 1, in \n", + " File \"C:\\Users\\jpknelle\\AppData\\Local\\Temp\\ipykernel_17544\\53219191.py\", line 1, in \n", " from snewpy.rate_calculator import RateCalculator\n", " File \"C:\\Users\\jpknelle\\AppData\\Roaming\\Python\\Python312\\site-packages\\snewpy\\rate_calculator.py\", line 10, in \n", " from snewpy.snowglobes_interface import SnowglobesData, guess_material\n", From dad7f722a47f93dd6ba8cc1125dc07d189d06381 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Wed, 12 Aug 2026 21:21:45 -0400 Subject: [PATCH 49/52] Add files via upload --- python/snewpy/models/ccsn_loaders.py | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/python/snewpy/models/ccsn_loaders.py b/python/snewpy/models/ccsn_loaders.py index a0f0ad57e..f3b678e3d 100644 --- a/python/snewpy/models/ccsn_loaders.py +++ b/python/snewpy/models/ccsn_loaders.py @@ -108,20 +108,23 @@ def __init__(self, filename, metadata={}): simtab = Table() tbounce = f['metadata'].attrs['bounce_time'] * u.s - simtab['TIME'] = f['data'][:,0] * u.s - tbounce - simtab['L_NU_E'] = f['data'][:,3] << u.erg/u.s - simtab['L_NU_E_BAR'] = f['data'][:,4] << u.erg/u.s - simtab['L_NU_X'] = f['data'][:,6] << u.erg/u.s + data = np.array(f['data'][:,:]) + + # Keep row only if all elements are >= 0 + columns = data[:, 1:] + mask = np.any(columns<=0,axis=1) + data = data[~mask] + + simtab['TIME'] = data[:,0] * u.s - tbounce + + simtab['L_NU_E'] = data[:,3] << u.erg/u.s + simtab['L_NU_E_BAR'] = data[:,4] << u.erg/u.s + simtab['L_NU_X'] = data[:,6] << u.erg/u.s - with np.errstate(divide='ignore', invalid='ignore'): - simtab['E_NU_E'] = np.array(f['data'][:,3]) / np.array(f['data'][:,1]) << u.erg - simtab['E_NU_E_BAR'] = np.array(f['data'][:,4]) / np.array(f['data'][:,2]) << u.erg - simtab['E_NU_X'] = np.array(f['data'][:,6]) / np.array(f['data'][:,5]) << u.erg - #remove bad values - simtab['E_NU_E'][np.isnan(simtab['E_NU_E'])] = 1 * u.erg - simtab['E_NU_E_BAR'][np.isnan(simtab['E_NU_E_BAR'])] = 1 * u.erg - simtab['E_NU_X'][np.isnan(simtab['E_NU_X'])] = 1 * u.erg + simtab['E_NU_E'] = data[:,3] / data[:,1] << u.erg + simtab['E_NU_E_BAR'] = data[:,4] / data[:,2] << u.erg + simtab['E_NU_X'] = data[:,6] / data[:,5] << u.erg simtab['ALPHA_NU_E'] = np.full(len(simtab['TIME']),3) simtab['ALPHA_NU_E_BAR'] = simtab['ALPHA_NU_E'] From 1adc2f85aa88d3a772c33a2ea52a90beec0f6046 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Wed, 12 Aug 2026 23:23:41 -0400 Subject: [PATCH 50/52] Add files via upload --- doc/source/nb/dev/PUSH.ipynb | 338 +++++++++++++---------------------- 1 file changed, 121 insertions(+), 217 deletions(-) diff --git a/doc/source/nb/dev/PUSH.ipynb b/doc/source/nb/dev/PUSH.ipynb index 31e52deb1..a9641cef8 100644 --- a/doc/source/nb/dev/PUSH.ipynb +++ b/doc/source/nb/dev/PUSH.ipynb @@ -69,13 +69,13 @@ " ylabel+=', '+y.unit._repr_latex_()\n", " plt.ylabel(ylabel)\n", " \n", - "def plot_rate(rate, axis:str='time', **kwargs):\n", + "def plot_events(numbers, axis:str='time', **kwargs):\n", " if axis=='time':\n", - " x = rate.time.to('s')\n", - " y = rate.integrate_or_sum('energy').array.squeeze()\n", + " x = numbers.time.to('s')\n", + " y = numbers.integrate_or_sum('energy').array.squeeze()\n", " elif axis=='energy':\n", - " x = rate.energy.to('MeV')\n", - " y = rate.integrate_or_sum('time').array.squeeze()\n", + " x = numbers.energy.to('MeV')\n", + " y = numbers.integrate_or_sum('time').array.squeeze()\n", " else: \n", " raise ValueError(f'axis=\"{axis}\" should be one of \"time\",\"energy\"')\n", " plot_quantity(x,y,xlabel=axis.capitalize(), ylabel='Event rate', **kwargs)\n" @@ -90,10 +90,10 @@ "source": [ "#a helper function to calculate total rate\n", "from snewpy.flux import Container\n", - "def sum_rates(rates:list):\n", - " res = sum([rate.array for rate in rates])\n", - " rate = rates[0]#take first as an instance\n", - " return Container(res,rate.flavor, rate.time, rate.energy, integrable_axes=rate._integrable_axes)" + "def sum_events(numbers:list):\n", + " res = sum([n.array for n in numbers])\n", + " n = numbers[0]#take first channel as an instance\n", + " return Container(res,n.flavor, n.time, n.energy, integrable_axes=n._integrable_axes)\n" ] }, { @@ -164,7 +164,7 @@ "outputs": [ { "data": { - "image/png": "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", + "image/png": "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dRJERK5gsVicTih+/vx51KtXD2vXrnXaM+nkyZOoV68eEhISykwODRw4EPPmzUN4eHiV5U1ERERUGW4cC+Xm5iIqKgpz587FsGHDtPbLly+jZs2aWL16Nfr16+e0jhEjRmDGjBk8pQAR3TVOTBHRQ2vx4sXYt28f+vXrh9zcXHzwwQdQFAW7du2CXq9HYWEhkpKS8OGHHyI7Oxtbt251dcpERERElWbNmjVYt24dBg4cCIvFgk8//RQXL17Evn374OPjA4vFgj179mDOnDlITU3Fvn37yhzmR0R0rzgxRUQPLVVVMX/+fGzcuBEigrZt2+Kvf/2rtvt6eno6nnnmGURFReHDDz+85S7oRERERA+iJUuWYO3atTCbzYiPj8fUqVMREBAAwLE3+ZNPPonIyEi89957aNSokYuzJaLfI05MERERERERERGRS+hcnQARERERERERET2cODFFREREREREREQuwYkpIiIiIiIiIiJyCU5MERERERERERGRS3BiioiIiIiIiIiIXIITU0RERERERERE5BKcmCIiIiIiIiIiIpfgxBQREREREREREbkEJ6aIiIiIiIiIiMglODFFREREREREREQu8f8BxWmbrFQ7uuAAAAAASUVORK5CYII=", "text/plain": [ "
" ] @@ -209,188 +209,7 @@ "execution_count": 8, "id": "0e7889dd-f442-4841-819b-ce7e31cd9a85", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\n", - "A module that was compiled using NumPy 1.x cannot be run in\n", - "NumPy 2.5.1 as it may crash. To support both 1.x and 2.x\n", - "versions of NumPy, modules must be compiled with NumPy 2.0.\n", - "Some module may need to rebuild instead e.g. with 'pybind11>=2.12'.\n", - "\n", - "If you are a user of the module, the easiest solution will be to\n", - "downgrade to 'numpy<2' or try to upgrade the affected module.\n", - "We expect that some modules will need time to support NumPy 2.\n", - "\n", - "Traceback (most recent call last): File \"\", line 198, in _run_module_as_main\n", - " File \"\", line 88, in _run_code\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\ipykernel_launcher.py\", line 17, in \n", - " app.launch_new_instance()\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\traitlets\\config\\application.py\", line 1075, in launch_instance\n", - " app.start()\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelapp.py\", line 701, in start\n", - " self.io_loop.start()\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\tornado\\platform\\asyncio.py\", line 205, in start\n", - " self.asyncio_loop.run_forever()\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\asyncio\\windows_events.py\", line 322, in run_forever\n", - " super().run_forever()\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\asyncio\\base_events.py\", line 641, in run_forever\n", - " self._run_once()\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\asyncio\\base_events.py\", line 1986, in _run_once\n", - " handle._run()\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\asyncio\\events.py\", line 88, in _run\n", - " self._context.run(self._callback, *self._args)\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelbase.py\", line 534, in dispatch_queue\n", - " await self.process_one()\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelbase.py\", line 523, in process_one\n", - " await dispatch(*args)\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelbase.py\", line 429, in dispatch_shell\n", - " await result\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelbase.py\", line 767, in execute_request\n", - " reply_content = await reply_content\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\ipykernel\\ipkernel.py\", line 429, in do_execute\n", - " res = shell.run_cell(\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\ipykernel\\zmqshell.py\", line 549, in run_cell\n", - " return super().run_cell(*args, **kwargs)\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3075, in run_cell\n", - " result = self._run_cell(\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3130, in _run_cell\n", - " result = runner(coro)\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\async_helpers.py\", line 128, in _pseudo_sync_runner\n", - " coro.send(None)\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3334, in run_cell_async\n", - " has_raised = await self.run_ast_nodes(code_ast.body, cell_name,\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3517, in run_ast_nodes\n", - " if await self.run_code(code, result, async_=asy):\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3577, in run_code\n", - " exec(code_obj, self.user_global_ns, self.user_ns)\n", - " File \"C:\\Users\\jpknelle\\AppData\\Local\\Temp\\ipykernel_17544\\53219191.py\", line 1, in \n", - " from snewpy.rate_calculator import RateCalculator\n", - " File \"C:\\Users\\jpknelle\\AppData\\Roaming\\Python\\Python312\\site-packages\\snewpy\\rate_calculator.py\", line 10, in \n", - " from snewpy.snowglobes_interface import SnowglobesData, guess_material\n", - " File \"C:\\Users\\jpknelle\\AppData\\Roaming\\Python\\Python312\\site-packages\\snewpy\\snowglobes_interface.py\", line 10, in \n", - " import pandas as pd\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\pandas\\__init__.py\", line 26, in \n", - " from pandas.compat import (\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\pandas\\compat\\__init__.py\", line 27, in \n", - " from pandas.compat.pyarrow import (\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\pandas\\compat\\pyarrow.py\", line 8, in \n", - " import pyarrow as pa\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\pyarrow\\__init__.py\", line 65, in \n", - " import pyarrow.lib as _lib\n" - ] - }, - { - "ename": "ImportError", - "evalue": "\nA module that was compiled using NumPy 1.x cannot be run in\nNumPy 2.5.1 as it may crash. To support both 1.x and 2.x\nversions of NumPy, modules must be compiled with NumPy 2.0.\nSome module may need to rebuild instead e.g. with 'pybind11>=2.12'.\n\nIf you are a user of the module, the easiest solution will be to\ndowngrade to 'numpy<2' or try to upgrade the affected module.\nWe expect that some modules will need time to support NumPy 2.\n\n", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mImportError\u001b[0m Traceback (most recent call last)", - "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\numpy\\core\\_multiarray_umath.py:46\u001b[0m, in \u001b[0;36m__getattr__\u001b[1;34m(attr_name)\u001b[0m\n\u001b[0;32m 41\u001b[0m \u001b[38;5;66;03m# Also print the message (with traceback). This is because old versions\u001b[39;00m\n\u001b[0;32m 42\u001b[0m \u001b[38;5;66;03m# of NumPy unfortunately set up the import to replace (and hide) the\u001b[39;00m\n\u001b[0;32m 43\u001b[0m \u001b[38;5;66;03m# error. The traceback shouldn't be needed, but e.g. pytest plugins\u001b[39;00m\n\u001b[0;32m 44\u001b[0m \u001b[38;5;66;03m# seem to swallow it and we should be failing anyway...\u001b[39;00m\n\u001b[0;32m 45\u001b[0m sys\u001b[38;5;241m.\u001b[39mstderr\u001b[38;5;241m.\u001b[39mwrite(msg \u001b[38;5;241m+\u001b[39m tb_msg)\n\u001b[1;32m---> 46\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mImportError\u001b[39;00m(msg)\n\u001b[0;32m 48\u001b[0m ret \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mgetattr\u001b[39m(_multiarray_umath, attr_name, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[0;32m 49\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ret \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", - "\u001b[1;31mImportError\u001b[0m: \nA module that was compiled using NumPy 1.x cannot be run in\nNumPy 2.5.1 as it may crash. To support both 1.x and 2.x\nversions of NumPy, modules must be compiled with NumPy 2.0.\nSome module may need to rebuild instead e.g. with 'pybind11>=2.12'.\n\nIf you are a user of the module, the easiest solution will be to\ndowngrade to 'numpy<2' or try to upgrade the affected module.\nWe expect that some modules will need time to support NumPy 2.\n\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\n", - "A module that was compiled using NumPy 1.x cannot be run in\n", - "NumPy 2.5.1 as it may crash. To support both 1.x and 2.x\n", - "versions of NumPy, modules must be compiled with NumPy 2.0.\n", - "Some module may need to rebuild instead e.g. with 'pybind11>=2.12'.\n", - "\n", - "If you are a user of the module, the easiest solution will be to\n", - "downgrade to 'numpy<2' or try to upgrade the affected module.\n", - "We expect that some modules will need time to support NumPy 2.\n", - "\n", - "Traceback (most recent call last): File \"\", line 198, in _run_module_as_main\n", - " File \"\", line 88, in _run_code\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\ipykernel_launcher.py\", line 17, in \n", - " app.launch_new_instance()\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\traitlets\\config\\application.py\", line 1075, in launch_instance\n", - " app.start()\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelapp.py\", line 701, in start\n", - " self.io_loop.start()\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\tornado\\platform\\asyncio.py\", line 205, in start\n", - " self.asyncio_loop.run_forever()\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\asyncio\\windows_events.py\", line 322, in run_forever\n", - " super().run_forever()\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\asyncio\\base_events.py\", line 641, in run_forever\n", - " self._run_once()\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\asyncio\\base_events.py\", line 1986, in _run_once\n", - " handle._run()\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\asyncio\\events.py\", line 88, in _run\n", - " self._context.run(self._callback, *self._args)\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelbase.py\", line 534, in dispatch_queue\n", - " await self.process_one()\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelbase.py\", line 523, in process_one\n", - " await dispatch(*args)\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelbase.py\", line 429, in dispatch_shell\n", - " await result\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelbase.py\", line 767, in execute_request\n", - " reply_content = await reply_content\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\ipykernel\\ipkernel.py\", line 429, in do_execute\n", - " res = shell.run_cell(\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\ipykernel\\zmqshell.py\", line 549, in run_cell\n", - " return super().run_cell(*args, **kwargs)\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3075, in run_cell\n", - " result = self._run_cell(\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3130, in _run_cell\n", - " result = runner(coro)\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\async_helpers.py\", line 128, in _pseudo_sync_runner\n", - " coro.send(None)\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3334, in run_cell_async\n", - " has_raised = await self.run_ast_nodes(code_ast.body, cell_name,\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3517, in run_ast_nodes\n", - " if await self.run_code(code, result, async_=asy):\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3577, in run_code\n", - " exec(code_obj, self.user_global_ns, self.user_ns)\n", - " File \"C:\\Users\\jpknelle\\AppData\\Local\\Temp\\ipykernel_17544\\53219191.py\", line 1, in \n", - " from snewpy.rate_calculator import RateCalculator\n", - " File \"C:\\Users\\jpknelle\\AppData\\Roaming\\Python\\Python312\\site-packages\\snewpy\\rate_calculator.py\", line 10, in \n", - " from snewpy.snowglobes_interface import SnowglobesData, guess_material\n", - " File \"C:\\Users\\jpknelle\\AppData\\Roaming\\Python\\Python312\\site-packages\\snewpy\\snowglobes_interface.py\", line 10, in \n", - " import pandas as pd\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\pandas\\__init__.py\", line 49, in \n", - " from pandas.core.api import (\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\pandas\\core\\api.py\", line 1, in \n", - " from pandas._libs import (\n", - " File \"C:\\ProgramData\\anaconda3\\Lib\\site-packages\\pandas\\_libs\\__init__.py\", line 17, in \n", - " import pandas._libs.pandas_datetime # noqa: F401 # isort: skip # type: ignore[reportUnusedImport]\n" - ] - }, - { - "ename": "ImportError", - "evalue": "\nA module that was compiled using NumPy 1.x cannot be run in\nNumPy 2.5.1 as it may crash. To support both 1.x and 2.x\nversions of NumPy, modules must be compiled with NumPy 2.0.\nSome module may need to rebuild instead e.g. with 'pybind11>=2.12'.\n\nIf you are a user of the module, the easiest solution will be to\ndowngrade to 'numpy<2' or try to upgrade the affected module.\nWe expect that some modules will need time to support NumPy 2.\n\n", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mImportError\u001b[0m Traceback (most recent call last)", - "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\numpy\\core\\_multiarray_umath.py:46\u001b[0m, in \u001b[0;36m__getattr__\u001b[1;34m(attr_name)\u001b[0m\n\u001b[0;32m 41\u001b[0m \u001b[38;5;66;03m# Also print the message (with traceback). This is because old versions\u001b[39;00m\n\u001b[0;32m 42\u001b[0m \u001b[38;5;66;03m# of NumPy unfortunately set up the import to replace (and hide) the\u001b[39;00m\n\u001b[0;32m 43\u001b[0m \u001b[38;5;66;03m# error. The traceback shouldn't be needed, but e.g. pytest plugins\u001b[39;00m\n\u001b[0;32m 44\u001b[0m \u001b[38;5;66;03m# seem to swallow it and we should be failing anyway...\u001b[39;00m\n\u001b[0;32m 45\u001b[0m sys\u001b[38;5;241m.\u001b[39mstderr\u001b[38;5;241m.\u001b[39mwrite(msg \u001b[38;5;241m+\u001b[39m tb_msg)\n\u001b[1;32m---> 46\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mImportError\u001b[39;00m(msg)\n\u001b[0;32m 48\u001b[0m ret \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mgetattr\u001b[39m(_multiarray_umath, attr_name, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[0;32m 49\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ret \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", - "\u001b[1;31mImportError\u001b[0m: \nA module that was compiled using NumPy 1.x cannot be run in\nNumPy 2.5.1 as it may crash. To support both 1.x and 2.x\nversions of NumPy, modules must be compiled with NumPy 2.0.\nSome module may need to rebuild instead e.g. with 'pybind11>=2.12'.\n\nIf you are a user of the module, the easiest solution will be to\ndowngrade to 'numpy<2' or try to upgrade the affected module.\nWe expect that some modules will need time to support NumPy 2.\n\n" - ] - }, - { - "ename": "ImportError", - "evalue": "numpy.core.multiarray failed to import", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mImportError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[8], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01msnewpy\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mrate_calculator\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m RateCalculator\n\u001b[0;32m 3\u001b[0m \u001b[38;5;66;03m#load the RateCalculator object\u001b[39;00m\n\u001b[0;32m 4\u001b[0m rc \u001b[38;5;241m=\u001b[39m RateCalculator()\n", - "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\snewpy\\rate_calculator.py:10\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 2\u001b[0m \u001b[38;5;124;03mThe module :mod:`snewpy.rate_calculator` defines a Python interface for calculating event rates using data from SNOwGLoBES\u001b[39;00m\n\u001b[0;32m 3\u001b[0m \n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 7\u001b[0m \u001b[38;5;124;03m :members: run\u001b[39;00m\n\u001b[0;32m 8\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 9\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mnumpy\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mnp\u001b[39;00m\n\u001b[1;32m---> 10\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01msnewpy\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01msnowglobes_interface\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m SnowglobesData, guess_material\n\u001b[0;32m 11\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01msnewpy\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mneutrino\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m Flavor\n\u001b[0;32m 12\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01msnewpy\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mflux\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m Container\n", - "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\snewpy\\snowglobes_interface.py:10\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 2\u001b[0m \u001b[38;5;124;03mThe module ``snewpy.snowglobes_interface`` contains a low-level Python interface for SNOwGLoBES v1.3.\u001b[39;00m\n\u001b[0;32m 3\u001b[0m \n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 7\u001b[0m \u001b[38;5;124;03m any time without warning, e.g. to support new SNOwGLoBES versions.\u001b[39;00m\n\u001b[0;32m 8\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 9\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpathlib\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m Path\n\u001b[1;32m---> 10\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mpd\u001b[39;00m\n\u001b[0;32m 11\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mnumpy\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mnp\u001b[39;00m\n\u001b[0;32m 12\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mos\u001b[39;00m\n", - "File \u001b[1;32mC:\\ProgramData\\anaconda3\\Lib\\site-packages\\pandas\\__init__.py:49\u001b[0m\n\u001b[0;32m 46\u001b[0m \u001b[38;5;66;03m# let init-time option registration happen\u001b[39;00m\n\u001b[0;32m 47\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mconfig_init\u001b[39;00m \u001b[38;5;66;03m# pyright: ignore[reportUnusedImport] # noqa: F401\u001b[39;00m\n\u001b[1;32m---> 49\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mapi\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m (\n\u001b[0;32m 50\u001b[0m \u001b[38;5;66;03m# dtype\u001b[39;00m\n\u001b[0;32m 51\u001b[0m ArrowDtype,\n\u001b[0;32m 52\u001b[0m Int8Dtype,\n\u001b[0;32m 53\u001b[0m Int16Dtype,\n\u001b[0;32m 54\u001b[0m Int32Dtype,\n\u001b[0;32m 55\u001b[0m Int64Dtype,\n\u001b[0;32m 56\u001b[0m UInt8Dtype,\n\u001b[0;32m 57\u001b[0m UInt16Dtype,\n\u001b[0;32m 58\u001b[0m UInt32Dtype,\n\u001b[0;32m 59\u001b[0m UInt64Dtype,\n\u001b[0;32m 60\u001b[0m Float32Dtype,\n\u001b[0;32m 61\u001b[0m Float64Dtype,\n\u001b[0;32m 62\u001b[0m CategoricalDtype,\n\u001b[0;32m 63\u001b[0m PeriodDtype,\n\u001b[0;32m 64\u001b[0m IntervalDtype,\n\u001b[0;32m 65\u001b[0m DatetimeTZDtype,\n\u001b[0;32m 66\u001b[0m StringDtype,\n\u001b[0;32m 67\u001b[0m BooleanDtype,\n\u001b[0;32m 68\u001b[0m \u001b[38;5;66;03m# missing\u001b[39;00m\n\u001b[0;32m 69\u001b[0m NA,\n\u001b[0;32m 70\u001b[0m isna,\n\u001b[0;32m 71\u001b[0m isnull,\n\u001b[0;32m 72\u001b[0m notna,\n\u001b[0;32m 73\u001b[0m notnull,\n\u001b[0;32m 74\u001b[0m \u001b[38;5;66;03m# indexes\u001b[39;00m\n\u001b[0;32m 75\u001b[0m Index,\n\u001b[0;32m 76\u001b[0m CategoricalIndex,\n\u001b[0;32m 77\u001b[0m RangeIndex,\n\u001b[0;32m 78\u001b[0m MultiIndex,\n\u001b[0;32m 79\u001b[0m IntervalIndex,\n\u001b[0;32m 80\u001b[0m TimedeltaIndex,\n\u001b[0;32m 81\u001b[0m DatetimeIndex,\n\u001b[0;32m 82\u001b[0m PeriodIndex,\n\u001b[0;32m 83\u001b[0m IndexSlice,\n\u001b[0;32m 84\u001b[0m \u001b[38;5;66;03m# tseries\u001b[39;00m\n\u001b[0;32m 85\u001b[0m NaT,\n\u001b[0;32m 86\u001b[0m Period,\n\u001b[0;32m 87\u001b[0m period_range,\n\u001b[0;32m 88\u001b[0m Timedelta,\n\u001b[0;32m 89\u001b[0m timedelta_range,\n\u001b[0;32m 90\u001b[0m Timestamp,\n\u001b[0;32m 91\u001b[0m date_range,\n\u001b[0;32m 92\u001b[0m bdate_range,\n\u001b[0;32m 93\u001b[0m Interval,\n\u001b[0;32m 94\u001b[0m interval_range,\n\u001b[0;32m 95\u001b[0m DateOffset,\n\u001b[0;32m 96\u001b[0m \u001b[38;5;66;03m# conversion\u001b[39;00m\n\u001b[0;32m 97\u001b[0m to_numeric,\n\u001b[0;32m 98\u001b[0m to_datetime,\n\u001b[0;32m 99\u001b[0m to_timedelta,\n\u001b[0;32m 100\u001b[0m \u001b[38;5;66;03m# misc\u001b[39;00m\n\u001b[0;32m 101\u001b[0m Flags,\n\u001b[0;32m 102\u001b[0m Grouper,\n\u001b[0;32m 103\u001b[0m factorize,\n\u001b[0;32m 104\u001b[0m unique,\n\u001b[0;32m 105\u001b[0m value_counts,\n\u001b[0;32m 106\u001b[0m NamedAgg,\n\u001b[0;32m 107\u001b[0m array,\n\u001b[0;32m 108\u001b[0m Categorical,\n\u001b[0;32m 109\u001b[0m set_eng_float_format,\n\u001b[0;32m 110\u001b[0m Series,\n\u001b[0;32m 111\u001b[0m DataFrame,\n\u001b[0;32m 112\u001b[0m )\n\u001b[0;32m 114\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdtypes\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdtypes\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m SparseDtype\n\u001b[0;32m 116\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mtseries\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mapi\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m infer_freq\n", - "File \u001b[1;32mC:\\ProgramData\\anaconda3\\Lib\\site-packages\\pandas\\core\\api.py:1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_libs\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m (\n\u001b[0;32m 2\u001b[0m NaT,\n\u001b[0;32m 3\u001b[0m Period,\n\u001b[0;32m 4\u001b[0m Timedelta,\n\u001b[0;32m 5\u001b[0m Timestamp,\n\u001b[0;32m 6\u001b[0m )\n\u001b[0;32m 7\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_libs\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mmissing\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m NA\n\u001b[0;32m 9\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdtypes\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mdtypes\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m (\n\u001b[0;32m 10\u001b[0m ArrowDtype,\n\u001b[0;32m 11\u001b[0m CategoricalDtype,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 14\u001b[0m PeriodDtype,\n\u001b[0;32m 15\u001b[0m )\n", - "File \u001b[1;32mC:\\ProgramData\\anaconda3\\Lib\\site-packages\\pandas\\_libs\\__init__.py:17\u001b[0m\n\u001b[0;32m 13\u001b[0m \u001b[38;5;66;03m# Below imports needs to happen first to ensure pandas top level\u001b[39;00m\n\u001b[0;32m 14\u001b[0m \u001b[38;5;66;03m# module gets monkeypatched with the pandas_datetime_CAPI\u001b[39;00m\n\u001b[0;32m 15\u001b[0m \u001b[38;5;66;03m# see pandas_datetime_exec in pd_datetime.c\u001b[39;00m\n\u001b[0;32m 16\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_libs\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpandas_parser\u001b[39;00m \u001b[38;5;66;03m# isort: skip # type: ignore[reportUnusedImport]\u001b[39;00m\n\u001b[1;32m---> 17\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_libs\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpandas_datetime\u001b[39;00m \u001b[38;5;66;03m# noqa: F401 # isort: skip # type: ignore[reportUnusedImport]\u001b[39;00m\n\u001b[0;32m 18\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_libs\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01minterval\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m Interval\n\u001b[0;32m 19\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01m_libs\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mtslibs\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m (\n\u001b[0;32m 20\u001b[0m NaT,\n\u001b[0;32m 21\u001b[0m NaTType,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 26\u001b[0m iNaT,\n\u001b[0;32m 27\u001b[0m )\n", - "\u001b[1;31mImportError\u001b[0m: numpy.core.multiarray failed to import" - ] - } - ], + "outputs": [], "source": [ "from snewpy.rate_calculator import RateCalculator\n", "\n", @@ -408,10 +227,37 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "id": "312c67d9-2556-4932-88b9-20ae7d042405", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "['wc100kt30prct',\n", + " 'wc100kt15prct',\n", + " 'ar40kt',\n", + " 'scint20kt',\n", + " 'halo1',\n", + " 'halo2',\n", + " 'novaND',\n", + " 'novaFD',\n", + " 'wc100kt30prct_he',\n", + " 'ar40kt_he',\n", + " 'icecube',\n", + " 'km3net',\n", + " 'ds20',\n", + " 'argo',\n", + " 'lz',\n", + " 'xent',\n", + " 'pandax']" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "#list available detectors\n", "list(rc.detectors)" @@ -427,16 +273,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "id": "c565f89f-e855-47b1-a591-da1561dd0bf5", "metadata": { "scrolled": true }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "Detector(name=\"ar40kt\", mass=40.0 kt, channels=['nue_e', 'nuebar_e', 'numu_e', 'numubar_e', 'nutau_e', 'nutaubar_e', 'nue_Ar40', 'nuebar_Ar40', 'nc_nue_Ar40', 'nc_numu_Ar40', 'nc_nutau_Ar40', 'nc_nuebar_Ar40', 'nc_numubar_Ar40', 'nc_nutaubar_Ar40'])" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "#read the detector\n", - "det = rc.read_detector('scint20kt')\n", - "det" + "detector = rc.read_detector('ar40kt')\n", + "detector" ] }, { @@ -449,15 +306,39 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "id": "a88a95fd-0e24-43e3-8205-41ac030a8632", "metadata": { "scrolled": true }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "{'nue_e': DetectionChannel (flavor=NU_E, smearing=True, weight=0.45),\n", + " 'nuebar_e': DetectionChannel (flavor=NU_E_BAR, smearing=True, weight=0.45),\n", + " 'numu_e': DetectionChannel (flavor=NU_MU, smearing=True, weight=0.45),\n", + " 'numubar_e': DetectionChannel (flavor=NU_MU_BAR, smearing=True, weight=0.45),\n", + " 'nutau_e': DetectionChannel (flavor=NU_TAU, smearing=True, weight=0.45),\n", + " 'nutaubar_e': DetectionChannel (flavor=NU_TAU_BAR, smearing=True, weight=0.45),\n", + " 'nue_Ar40': DetectionChannel (flavor=NU_E, smearing=True, weight=0.025),\n", + " 'nuebar_Ar40': DetectionChannel (flavor=NU_E_BAR, smearing=True, weight=0.025),\n", + " 'nc_nue_Ar40': DetectionChannel (flavor=NU_E, smearing=True, weight=0.025),\n", + " 'nc_numu_Ar40': DetectionChannel (flavor=NU_MU, smearing=True, weight=0.025),\n", + " 'nc_nutau_Ar40': DetectionChannel (flavor=NU_TAU, smearing=True, weight=0.025),\n", + " 'nc_nuebar_Ar40': DetectionChannel (flavor=NU_E_BAR, smearing=True, weight=0.025),\n", + " 'nc_numubar_Ar40': DetectionChannel (flavor=NU_MU_BAR, smearing=True, weight=0.025),\n", + " 'nc_nutaubar_Ar40': DetectionChannel (flavor=NU_TAU_BAR, smearing=True, weight=0.025)}" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "#list all the channels\n", - "det.channels" + "detector.channels" ] }, { @@ -470,38 +351,61 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "id": "948ca075-66eb-449b-b310-a9e599d1e2e9", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\jpknelle\\AppData\\Roaming\\Python\\Python312\\site-packages\\snewpy\\rate_calculator.py:353: RuntimeWarning: divide by zero encountered in log\n", + " return np.interp(np.log(E)/np.log(10), xp, yp, left=0, right=0)*E*1e-38 <" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ - "rates = det.run(fluence)\n", - "plot_rate(sum_rates(list(rates.values())), axis='energy', label='Total', lw=2, color='k')\n", - "for chan,rate in rates.items():\n", - " plot_rate(rate, axis='energy', label=chan)\n", - "#plt.yscale('log')\n", - "#plt.ylim(1e-2)\n", + "events = detector.run(fluence, detector_effects=True)\n", + "\n", + "plot_events(sum_events(list(events.values())), axis='energy', label='Total', lw=2, color='k')\n", + "for chan,numbers in events.items():\n", + " plot_events(numbers, axis='energy', label=chan)\n", + "\n", "plt.legend(ncols=3)\n", - "plt.ylabel(f'Events per {rate.energy.diff()[0]< Date: Thu, 13 Aug 2026 17:08:09 -0400 Subject: [PATCH 51/52] Update ccsn_loaders.py --- python/snewpy/models/ccsn_loaders.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/python/snewpy/models/ccsn_loaders.py b/python/snewpy/models/ccsn_loaders.py index f3b678e3d..e2e383f76 100644 --- a/python/snewpy/models/ccsn_loaders.py +++ b/python/snewpy/models/ccsn_loaders.py @@ -109,7 +109,7 @@ def __init__(self, filename, metadata={}): tbounce = f['metadata'].attrs['bounce_time'] * u.s - data = np.array(f['data'][:,:]) + data = np.array(f['data']) # Keep row only if all elements are >= 0 columns = data[:, 1:] @@ -135,7 +135,12 @@ def __init__(self, filename, metadata={}): simtab['L_NU_E_BAR'][simtab['L_NU_E_BAR'] < 0] = 1 simtab['L_NU_X'][simtab['L_NU_X'] < 0] = 1 - metadata = f['metadata'] + metadata = dict(f['metadata'].attrs) + + k = f['metadata/compactness_forpush'].attrs['columns'] + compacness = np.transpose( np.array( f['metadata/compactness_forpush'] ) ) + + metadata = metadata | dict(zip(k,compacness)) super().__init__(simtab, metadata) From 0ba7dcbc0638b8ed492a6436f4381dd2be1815a9 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Fri, 14 Aug 2026 13:12:52 -0400 Subject: [PATCH 52/52] Delete ccsn_loaders.py --- ccsn_loaders.py | 1118 ----------------------------------------------- 1 file changed, 1118 deletions(-) delete mode 100644 ccsn_loaders.py diff --git a/ccsn_loaders.py b/ccsn_loaders.py deleted file mode 100644 index 9d48c11cd..000000000 --- a/ccsn_loaders.py +++ /dev/null @@ -1,1118 +0,0 @@ -# -*- coding: utf-8 -*- -""" -The submodule ``snewpy.models.ccsn_loaders`` contains classes to load core-collapse -supernova models from files stored on disk. -""" - -import logging -import os -import re -import sys -import tarfile -from pathlib import Path - -from astropy import units as u -from astropy.table import Table, join -from astropy.io import ascii, fits -from astropy_healpix import healpy as hp - -import h5py -import numpy as np -from scipy.special import gamma, lpmv - -from snewpy.models import base -from snewpy.flux import Spectrum -from snewpy.flavor import ThreeFlavor -from snewpy import _model_downloader - -import multiprocessing - -class GarchingArchiveModel(base.PinchedModel): - """Subclass that reads models in the format used in the - `Garching Supernova Archive `_.""" - def __init__(self, filename, eos='LS220', metadata={}): - """Model Initialization. - - Parameters - ---------- - filename : str - Absolute or relative path to file with model data, we add nue/nuebar/nux. This argument will be deprecated. - eos: str - Equation of state. Valid value is 'LS220'. This argument will be deprecated. - - Other Parameters - ---------------- - progenitor_mass: astropy.units.Quantity - Mass of model progenitor in units Msun. Valid values are {progenitor_mass}. - Raises - ------ - FileNotFoundError - If a file for the chosen model parameters cannot be found - ValueError - If a combination of parameters is invalid when loading from parameters - """ - # Read through the several ASCII files for the chosen simulation and - # merge the data into one giant table. - mergtab = None - for flavor in ThreeFlavor: - _sfx = flavor.name.replace('_', '').lower() if flavor.is_electron else "nux" - _filename = '{}_{}_{}'.format(filename, eos, _sfx) - _lname = 'L_{}'.format(flavor.name) - _ename = 'E_{}'.format(flavor.name) - _e2name = 'E2_{}'.format(flavor.name) - _aname = 'ALPHA_{}'.format(flavor.name) - - # Open the requested filename using the model downloader. - datafile = self.request_file(_filename) - - simtab = Table.read(datafile, - names=['TIME', _lname, _ename, _e2name], - format='ascii') - simtab['TIME'].unit = 's' - simtab[_lname].unit = '1e51 erg/s' - simtab[_aname] = (2*simtab[_ename]**2 - simtab[_e2name]) / (simtab[_e2name] - simtab[_ename]**2) - simtab[_ename].unit = 'MeV' - del simtab[_e2name] - - if mergtab is None: - mergtab = simtab - else: - mergtab = join(mergtab, simtab, keys='TIME', join_type='left') - mergtab[_lname].fill_value = 0. - mergtab[_ename].fill_value = 0. - mergtab[_aname].fill_value = 0. - simtab = mergtab.filled() - if not metadata: - metadata = { - 'Progenitor mass': float(os.path.basename(filename).split('s')[1].split('c')[0]) * u.Msun, - 'EOS': eos, - } - super().__init__(simtab, metadata) - - -class PUSHArchiveModel(base.PinchedModel): - """Subclass that reads models in the format used - by the PUSH collaboration - """ - - def __init__(self, filename, metadata={}): - """ - Parameters - ---------- - filename : str - Absolute or relative path to model data - """ - datafile = self.request_file(filename) - f = h5py.File(datafile, 'r') - - simtab = Table() - - tbounce = f['metadata'].attrs['bounce_time'] * u.s - simtab['TIME'] = f['data'][:,0] * u.s - tbounce - - simtab['L_NU_E'] = f['data'][:,3] << u.erg/u.s - simtab['L_NU_E_BAR'] = f['data'][:,4] << u.erg/u.s - simtab['L_NU_X'] = f['data'][:,6] << u.erg/u.s - - simtab['E_NU_E'] = f['data'][:,3] / f['data'][:,1] << u.erg - simtab['E_NU_E_BAR'] = f['data'][:,4] / f['data'][:,2] << u.erg - simtab['E_NU_X'] = f['data'][:,6] / f['data'][:,5] << u.erg - - simtab['ALPHA_NU_E'] = np.full(len(simtab['TIME']),3) - simtab['ALPHA_NU_E_BAR'] = simtab['ALPHA_NU_E'] - simtab['ALPHA_NU_X'] = simtab['ALPHA_NU_E'] - - # prevent negative luminosities - simtab['L_NU_E'][simtab['L_NU_E'] < 0] = 1 - simtab['L_NU_E_BAR'][simtab['L_NU_E_BAR'] < 0] = 1 - simtab['L_NU_X'][simtab['L_NU_X'] < 0] = 1 - - metadata = f['metadata'] - - super().__init__(simtab, metadata) - - -class Nakazato_2013(base.PinchedModel): - def __init__(self, filename, metadata={}): - """Model initialization. - - Parameters - ---------- - filename : str - Absolute or relative path to FITS file with model data. - - Raises - ------ - FileNotFoundError - If a file for the chosen model parameters cannot be found - """ - # Open the requested filename using the model downloader. - datafile = self.request_file(filename) - # Read FITS table using the astropy reader. - simtab = Table.read(datafile) - - self.filename = os.path.basename(filename) - super().__init__(simtab, metadata) - - -class Sukhbold_2015(Nakazato_2013): - pass - - -class Tamborra_2014(GarchingArchiveModel): - pass - - -class Bollig_2016(GarchingArchiveModel): - pass - - -class Walk_2018(GarchingArchiveModel): - pass - - -class Walk_2019(GarchingArchiveModel): - pass - - -class OConnor_2013(base.PinchedModel): - """Model based on the black hole formation simulation in `O'Connor & Ott (2013) `_. - """ - - def __init__(self, filename, metadata={}): - """ - Parameters - ---------- - filename : str - Absolute or relative path to FITS file with model data. - """ - datafile = self.request_file(filename) - # Open luminosity file. - with tarfile.open(datafile) as tf: - # Extract luminosity data. - dataname = 's{:d}_{}_timeseries.dat'.format(int(metadata['Progenitor mass'].value), metadata['EOS']) - # Read FITS table using the astropy reader. - simtab = ascii.read(tf.extractfile(dataname), names=['TIME', 'L_NU_E', 'L_NU_E_BAR', 'L_NU_X', - 'E_NU_E', 'E_NU_E_BAR', 'E_NU_X', - 'RMS_NU_E', 'RMS_NU_E_BAR', 'RMS_NU_X']) - - simtab['ALPHA_NU_E'] = (2.0 * simtab['E_NU_E'] ** 2 - simtab['RMS_NU_E'] ** 2) / ( - simtab['RMS_NU_E'] ** 2 - simtab['E_NU_E'] ** 2) - simtab['ALPHA_NU_E_BAR'] = (2.0 * simtab['E_NU_E_BAR'] ** 2 - simtab['RMS_NU_E_BAR'] ** 2) / ( - simtab['RMS_NU_E_BAR'] ** 2 - simtab['E_NU_E_BAR'] ** 2) - simtab['ALPHA_NU_X'] = (2.0 * simtab['E_NU_X'] ** 2 - simtab['RMS_NU_X'] ** 2) / ( - simtab['RMS_NU_X'] ** 2 - simtab['E_NU_X'] ** 2) - - # note, here L_NU_X is already divided by 4 - super().__init__(simtab, metadata) - - -class OConnor_2015(base.PinchedModel): - """Model based on the black hole formation simulation in `O'Connor (2015) `_. - """ - - def __init__(self, filename, metadata={}): - """ - Parameters - ---------- - filename : str - Absolute or relative path to FITS file with model data. - """ - - datafile = self.request_file(filename) - simtab = Table.read(datafile, - names=['TIME', 'L_NU_E', 'L_NU_E_BAR', 'L_NU_X', - 'E_NU_E', 'E_NU_E_BAR', 'E_NU_X', - 'RMS_NU_E', 'RMS_NU_E_BAR', 'RMS_NU_X'], - format='ascii') - - header = ascii.read(simtab.meta['comments'], delimiter='=', format='no_header', names=['key', 'val']) - tbounce = float(header['val'][0]) - simtab['TIME'] -= tbounce - - simtab['ALPHA_NU_E'] = (2.0*simtab['E_NU_E']**2 - simtab['RMS_NU_E']**2) / \ - (simtab['RMS_NU_E']**2 - simtab['E_NU_E']**2) - simtab['ALPHA_NU_E_BAR'] = (2.0*simtab['E_NU_E_BAR']**2 - simtab['RMS_NU_E_BAR']**2) / \ - (simtab['RMS_NU_E_BAR']**2 - simtab['E_NU_E_BAR']**2) - simtab['ALPHA_NU_X'] = (2.0*simtab['E_NU_X']**2 - simtab['RMS_NU_X']**2) / \ - (simtab['RMS_NU_X']**2 - simtab['E_NU_X']**2) - - # SYB: double-check on this factor of 4. Should be factor of 2? - simtab['L_NU_X'] /= 4.0 - - # prevent negative lums - simtab['L_NU_E'][simtab['L_NU_E'] < 0] = 1 - simtab['L_NU_E_BAR'][simtab['L_NU_E_BAR'] < 0] = 1 - simtab['L_NU_X'][simtab['L_NU_X'] < 0] = 1 - - self.filename = os.path.basename(filename) - - super().__init__(simtab, metadata) - - -class Zha_2021(OConnor_2015): - pass - -class Warren_2020(base.PinchedModel): - def __init__(self, filename, metadata={}): - """ - Parameters - ---------- - filename : str - Absolute or relative path to file prefix, we add nue/nuebar/nux - """ - # Open the requested filename using the model downloader. - datafile = self.request_file(filename) - - # Open luminosity file. - # Read data from HDF5 files, then store. - f = h5py.File(datafile, 'r') - - simtab = Table() - - for i in range(len(f['nue_data']['lum'])): - if f['sim_data']['shock_radius'][i][1] > 0.00001: - bounce = f['sim_data']['shock_radius'][i][0] - break - - simtab['TIME'] = f['nue_data']['lum'][:, 0] - bounce - simtab['L_NU_E'] = f['nue_data']['lum'][:, 1] * 1e51 - simtab['L_NU_E_BAR'] = f['nuae_data']['lum'][:, 1] * 1e51 - simtab['L_NU_X'] = f['nux_data']['lum'][:, 1] * 1e51 - simtab['E_NU_E'] = f['nue_data']['avg_energy'][:, 1] - simtab['E_NU_E_BAR'] = f['nuae_data']['avg_energy'][:, 1] - simtab['E_NU_X'] = f['nux_data']['avg_energy'][:, 1] - simtab['RMS_NU_E'] = f['nue_data']['rms_energy'][:, 1] - simtab['RMS_NU_E_BAR'] = f['nuae_data']['rms_energy'][:, 1] - simtab['RMS_NU_X'] = f['nux_data']['rms_energy'][:, 1] - - simtab['ALPHA_NU_E'] = (2.0 * simtab['E_NU_E'] ** 2 - simtab['RMS_NU_E'] ** 2) / \ - (simtab['RMS_NU_E'] ** 2 - simtab['E_NU_E'] ** 2) - simtab['ALPHA_NU_E_BAR'] = (2.0 * simtab['E_NU_E_BAR'] ** 2 - simtab['RMS_NU_E_BAR'] - ** 2) / (simtab['RMS_NU_E_BAR'] ** 2 - simtab['E_NU_E_BAR'] ** 2) - simtab['ALPHA_NU_X'] = (2.0 * simtab['E_NU_X'] ** 2 - simtab['RMS_NU_X'] ** 2) / \ - (simtab['RMS_NU_X'] ** 2 - simtab['E_NU_X'] ** 2) - - # Set model metadata. - self.filename = os.path.basename(filename) - - super().__init__(simtab, metadata) - - -class Kuroda_2020(base.PinchedModel): - def __init__(self, filename, metadata={}): - """ - Parameters - ---------- - filename : str - Absolute or relative path to file prefix, we add nue/nuebar/nux - """ - - # Open the requested filename using the model downloader. - datafile = self.request_file(filename) - # Read ASCII data. - simtab = Table.read(datafile, format='ascii') - - # Get grid of model times. - simtab['TIME'] = simtab['Tpb[ms]'] << u.ms - for f in ["NU_E", "NU_E_BAR", "NU_X"]: - fkey = re.sub('(E|X)_BAR', r'A\g<1>', f).lower() - simtab[f'L_{f}'] = simtab[f''] * 1e51 << u.erg / u.s - simtab[f'E_{f}'] = simtab[f''] << u.MeV - # There is no pinch parameter so use alpha=2.0. - simtab[f'ALPHA_{f}'] = np.full_like(simtab[f'E_{f}'].value, 2.) - - self.filename = os.path.basename(filename) - - super().__init__(simtab, metadata) - -class Fornax_2019(base.SupernovaModel): - def __init__(self, filename, metadata={}, cache_flux=False): - """ - Parameters - ---------- - filename : str - Absolute or relative path to FITS file with model data. - cache_flux : bool - If true, pre-compute the flux on a fixed angular grid and store the values in a FITS file. - """ - # Open the requested filename using the model downloader. - datafile = self.request_file(filename) - - # Set up model metadata. - self.filename = os.path.basename(filename) - self.metadata = metadata - - self.dLdE_unit = 1e50 * u.erg/(u.s*u.MeV) - self.time = None - - self.E = {} - self.dE = {} - self.dLdE = {} - self.luminosity = {} - - self.is_cached = False - - logger = logging.getLogger() - if cache_flux and not 'healpy' in sys.modules: - logger.warning("No module named 'healpy'. Cannot enable caching.") - - # Check if we're initializing on a FITS file or not. - if filename.endswith('.fits'): - fitsfile = filename - else: - fitsfile = filename.replace('h5', 'fits') - - # Read a cached flux file in FITS format or generate one. - if cache_flux and os.path.exists(fitsfile): - self._read_fits(fitsfile) - ntim, nene, npix = self.dLdE[Flavor.NU_E].shape - self.npix = npix - self.nside = hp.npix2nside(npix) - self.is_cached = True - else: - # Load data from HDF5 - with h5py.File(datafile, 'r') as _h5file: - if self.time is None: - self.time = _h5file['nu0']['g0'].attrs['time'] * u.s - h5data = self._load_entire_hdf5(_h5file) - - # Use a HEALPix grid with nside=4 (192 pixels) to cache the - # values of Y_lm(theta, phi). - self.nside = 4 - self.npix = hp.nside2npix(self.nside) - thetac, phic = hp.pix2ang(self.nside, np.arange(self.npix)) - - Ylm = {} - for l in range(3): - Ylm[l] = {} - for m in range(-l, l+1): - Ylm[l][m] = Fornax_2019._real_sph_harm(l, m, thetac, phic) - - # Store 3D tables of dL/dE for each flavor. - nproc = len(ThreeFlavor) - with multiprocessing.Pool(processes=nproc, initializer=self._init_data, initargs=(h5data, Ylm, self.npix, self.dLdE_unit)) as pool: - data = pool.map(self._get_flavor_data, ThreeFlavor) - - for (_flavor, _E, _dE, _dLdE, _lum) in data: - self.E[_flavor] = _E - self.dE[_flavor] = _dE - self.dLdE[_flavor] = _dLdE - self.luminosity[_flavor] = _lum - - # Write output to FITS. - if cache_flux: - self._write_fits(fitsfile, overwrite=True) - self.is_cached = True - - @staticmethod - def _load_entire_hdf5(dct): - """Load full dictionary from HDF5""" - if isinstance(dct, h5py.Dataset): - return dct[()] - ret = {} - for k, v in dct.items(): - ret[k] = Fornax_2019._load_entire_hdf5(v) - return ret - - @staticmethod - def _flavorkeys(flavor): - """Convert flavor to data keys. - """ - if flavor == ThreeFlavor.NU_E: - return 'nu0' - elif flavor == ThreeFlavor.NU_E_BAR: - return 'nu1' - else: - return 'nu2' - - @staticmethod - def _init_data(hdf5_data, ylm, npix, dlde_unit): - """Variable initializer for the multiprocessing pool.""" - global h5data - global Ylm - global Npix - global dLdE_unit - h5data = hdf5_data - Ylm = ylm - Npix = npix - dLdE_unit = dlde_unit - - @staticmethod - def _get_flavor_data(flavor): - """Function to extract spectra for one flavor from HDF5.""" - key = Fornax_2019._flavorkeys(flavor) - E = h5data[key]['egroup'] * u.MeV - dE = h5data[key]['degroup'] * u.MeV - - ntim, nene = E.shape - dLdE = np.zeros((ntim, nene, Npix), dtype=float) - - # Loop over time bins - for i in range(ntim): - # Loop over energy bins: - for j in range(nene): - dLdE_ij = 0. - # Sum over multipole moments: - for l in range(3): - for m in range(-l, l+1): - dLdE_ij += h5data[key][f'g{j}'][f'l={l} m={m}'][i] * Ylm[l][m] - dLdE[i][j] = np.abs(dLdE_ij) - - # Set up proper units and correct for the nu_x factor - factor = 1. if flavor.is_electron else 0.25 - dLdE = dLdE * factor * dLdE_unit - - # Integrate over energy to get luminosity - L = np.sum(dLdE * dE[:, :, np.newaxis], axis=1) - - return (flavor, E, dE, dLdE, L) - - @staticmethod - def _fact(n): - """Calculate n!. - - Parameters - ---------- - n : int or float - Input for computing n factorial. - - Returns - ------- - factorial : float - Factorial n!, computed as Gamma(n+1). - """ - return gamma(n + 1.) - - @staticmethod - def _real_sph_harm(l, m, theta, phi): - """Compute orthonormalized real (tesseral) spherical harmonics Y_lm. - - Parameters - ---------- - l : int - Degree of the spherical harmonics. - m : int - Order of the spherical harmonics. - theta : float or ndarray - Input zenith angles. - phi : float or ndarray - Input azimuth angles. - - Returns - ------- - Y_lm : float or ndarray - Real-valued spherical harmonic function at theta, phi. - """ - if m < 0: - norm = np.sqrt((2*l + 1.)/(2*np.pi)*Fornax_2019._fact(l + m)/Fornax_2019._fact(l - m)) - return norm * lpmv(-m, l, np.cos(theta)) * np.sin(-m*phi) - elif m == 0: - norm = np.sqrt((2*l + 1.)/(4*np.pi)) - return norm * lpmv(0, l, np.cos(theta)) * np.ones_like(phi) - else: - norm = np.sqrt((2*l + 1.)/(2*np.pi)*Fornax_2019._fact(l - m)/Fornax_2019._fact(l + m)) - return norm * lpmv(m, l, np.cos(theta)) * np.cos(m*phi) - - def _read_fits(self, filename): - """Read cached angular data from FITS. - - Parameters - ---------- - filename : str - Input filename. - """ - hdus = fits.open(filename) - - self.time = hdus['TIME'].data * u.Unit(hdus['TIME'].header['BUNIT']) - - for flavor in ThreeFlavor: - name = str(flavor).split('.')[-1] - - ext = '{}_ENERGY'.format(name) - self.E[flavor] = hdus[ext].data * u.Unit(hdus[ext].header['BUNIT']) - - ext = '{}_DE'.format(name) - self.dE[flavor] = hdus[ext].data * u.Unit(hdus[ext].header['BUNIT']) - - ext = '{}_FLUX'.format(name) - self.dLdE[flavor] = hdus[ext].data * u.Unit(hdus[ext].header['BUNIT']) - self.dLdE[flavor] = self.dLdE[flavor].to('erg/(s*MeV)') - - - def _write_fits(self, filename, overwrite=False): - """Write angular-dependent calculated flux in FITS format. - - Parameters - ---------- - filename : str - Output filename. - """ - hx = fits.HDUList() - - hdu_time = fits.PrimaryHDU(self.time.to_value('s')) - hdu_time.header['EXTNAME'] = 'TIME' - hdu_time.header['BUNIT'] = 'second' - hx.append(hdu_time) - - for flavor in ThreeFlavor: - name = str(flavor).split('.')[-1] - - hdu_E = fits.ImageHDU(self.E[flavor].to_value('MeV')) - hdu_E.header['EXTNAME'] = '{}_ENERGY'.format(name) - hdu_E.header['BUNIT'] = 'MeV' - hx.append(hdu_E) - - hdu_dE = fits.ImageHDU(self.dE[flavor].to_value('MeV')) - hdu_dE.header['EXTNAME'] = '{}_DE'.format(name) - hdu_dE.header['BUNIT'] = 'MeV' - hx.append(hdu_dE) - - hdu_flux = fits.ImageHDU(self.dLdE[flavor].to_value(str(self.dLdE_unit))) - hdu_flux.header['EXTNAME'] = '{}_FLUX'.format(name) - hdu_flux.header['BUNIT'] = str(self.dLdE_unit) - hx.append(hdu_flux) - - hx.writeto(filename, overwrite=overwrite) - - def _get_binnedspectra(self, t, theta, phi): - """Get binned neutrino spectrum at a particular time. - - Parameters - ---------- - t : float or astropy.Quantity - Time to evaluate initial and oscillated spectra. - theta : astropy.Quantity - Zenith angle of the spectral emission. - phi : astropy.Quantity - Azimuth angle of the spectral emission. - - Returns - ------- - E : dict - Dictionary of energy bin central values, keyed by neutrino flavor. - dE : dict - Dictionary of energy bin widths, keyed by neutrino flavor. - binspec : dict - Dictionary of binned model spectra, keyed by neutrino flavor. - """ - E = {} - dE = {} - binspec = {} - - # Convert input time to a time index. - t = np.atleast_1d(t).to(self.time.unit) - j = np.array([np.abs(t_j - self.time).argmin() for t_j in t]) - k = hp.ang2pix(self.nside, theta.to_value('radian'), phi.to_value('radian')) - - for flavor in ThreeFlavor: - E[flavor] = self.E[flavor][j] - dE[flavor] = self.dE[flavor][j] - binspec[flavor] = self.dLdE[flavor][j,:,k] - - return E, dE, binspec - - def get_initial_spectra(self, t, E, theta, phi, flavors=ThreeFlavor, interpolation='linear'): - spectra_dict = self._get_initial_spectra_dict(t, E, theta, phi, flavors, interpolation) - return Spectrum.from_dict(spectra_dict, - time=t, - energy=E, - flavor_scheme=ThreeFlavor) - - def _get_initial_spectra_dict(self, t, E, theta, phi, flavors=ThreeFlavor, interpolation='linear'): - """Get neutrino spectra/luminosity curves before flavor transformation. - - Parameters - ---------- - t : astropy.Quantity - Time to evaluate initial spectra. - E : astropy.Quantity or ndarray of astropy.Quantity - Energies to evaluate the initial spectra. - theta : astropy.Quantity - Zenith angle of the spectral emission. - phi : astropy.Quantity - Azimuth angle of the spectral emission. - flavors: iterable of snewpy.neutrino.Flavor - Return spectra for these flavors only (default: all) - interpolation : str - Scheme to interpolate in spectra ('nearest', 'linear'). - - Returns - ------- - initial_spectra : dict - Dictionary of model spectra, keyed by neutrino flavor. - """ - initial_spectra = {} - - # Extract the binned spectra for the input t, theta, phi: - _E, _dE, _spec = self._get_binnedspectra(t, theta, phi) - - # Avoid "division by zero" in retrieval of the spectrum. - E[E == 0] = np.finfo(float).eps * E.unit - logE = np.atleast_1d(np.log10(E.to_value('MeV'))) - logeps = np.log10(np.finfo(float).eps * E.unit / u.MeV) - - for flavor in flavors: - - # Linear interpolation in flux. - if interpolation.lower() == 'linear': - # Pad log(E) array with values where flux is fixed to zero. - _logE = np.log10(_E[flavor].to_value('MeV')) - _dlogE = np.diff(_logE) - - # Set up energy bin edges - nt, nene = _E[flavor].shape - _logEbins = np.full((nt, nene+2), logeps) - _logEbins[:, 1:-1] = _logE - _logEbins[:,-1] = _logE[:,-1] + _dlogE[:,-1] - - # Pad spectrum with values where flux is fixed to zero: - _dLdE = np.full((nt, nene+2), 0.) - _dLdE[:, 1:-1] = _spec[flavor].to_value(self.dLdE_unit) - - initial_spectra[flavor] = [] - for i in range(nt): - initial_spectra[flavor].append(np.interp(logE, _logEbins[i], _dLdE[i]) * (self.dLdE_unit / E).to('1/(MeV*s)')) - initial_spectra[flavor] = np.vstack(initial_spectra[flavor]) - - # Nearest point interpolation - elif interpolation.lower() == 'nearest': - _logE = np.log10(_E[flavor].to_value('MeV')) - _dlogE = np.diff(_logE)[:,0] - - # Set up energy bin edges - nt, nene = _E[flavor].shape - _logEbins = np.full((nt, nene+1), 0.) - _logEbins[:, :-1] = _logE - 0.5*_dlogE[:,np.newaxis] - _logEbins[:, -1] = _logE[:,-1] + 0.5*_dlogE - _Ebins = 10**_logEbins * u.MeV - - initial_spectra[flavor] = [] - for i in range(nt): - idx = np.digitize(E, _Ebins[i]) - idx[idx > 0] -= 1 - idx[idx >= nene] = nene-1 - initial_spectra[flavor].append((_spec[flavor][i][idx] / E).to('1/(MeV*s)')) - initial_spectra[flavor] = np.vstack(initial_spectra[flavor]) - - # Unrecognized interpolation - else: - raise ValueError('Unrecognized interpolation type "{}"'.format(interpolation)) - - return initial_spectra - -class Fornax_2021(base.SupernovaModel): - def __init__(self, filename, metadata={}): - """ - Parameters - ---------- - filename : str - Absolute or relative path to HDF5 file with model data. - """ - #extra parameters - self.interpolation = "linear" #Scheme to interpolate in spectra ('nearest', 'linear'). - # Open the requested filename using the model downloader. - datafile = self.request_file(filename) - # Set up model metadata. - self.progenitor_mass = float(filename.split('/')[-1].split('_')[2][:-1]) * u.Msun - self.metadata = metadata - # Open HDF5 data file. - _h5file = h5py.File(datafile, 'r') - - self.time = _h5file['nu0'].attrs['time'] * u.s - - self.luminosity = {} - self._E = {} - self._dLdE = {} - for flavor in ThreeFlavor: - # Convert flavor to key name in the model HDF5 file - key = {ThreeFlavor.NU_E: 'nu0', - ThreeFlavor.NU_E_BAR: 'nu1', - ThreeFlavor.NU_MU: 'nu2', - ThreeFlavor.NU_MU_BAR: 'nu2', - ThreeFlavor.NU_TAU: 'nu2', - ThreeFlavor.NU_TAU_BAR: 'nu2'}[flavor] - - self._E[flavor] = np.asarray(_h5file[key]['egroup']) - self._dLdE[flavor] = {f"g{i}": np.asarray(_h5file[key][f'g{i}']) for i in range(12)} - - # Compute luminosity by integrating over model energy bins. - dE = np.asarray(_h5file[key]['degroup']) - n = len(dE[0]) - dLdE = np.zeros((len(self.time), n), dtype=float) - for i in range(n): - dLdE[:, i] = self._dLdE[flavor][f"g{i}"] - - # Note factor of 0.25 in nu_x and nu_x_bar. - factor = 1. if flavor.is_electron else 0.25 - self.luminosity[flavor] = np.sum(dLdE*dE, axis=1) * factor * 1e50 * u.erg/u.s - - def _get_initial_spectra_dict(self, t, E, flavors=ThreeFlavor): - """Get neutrino spectra/luminosity curves after oscillation. - - Parameters - ---------- - t : astropy.Quantity - Time to evaluate initial spectra. - E : astropy.Quantity or ndarray of astropy.Quantity - Energies to evaluate the initial spectra. - flavors: iterable of snewpy.neutrino.Flavor - Return spectra for these flavors only (default: all) - Returns - ------- - initialspectra : dict - Dictionary of model spectra, keyed by neutrino flavor. - """ - initialspectra = {} - - # Avoid "division by zero" in retrieval of the spectrum. - E[E == 0] = np.finfo(float).eps * E.unit - logE = np.log10(E.to_value('MeV')) - - # Make sure the input time uses the same units as the model time grid. - # Convert input time to a time index. - t = u.Quantity(t.to(self.time.unit), ndmin=1) - j = np.array(list(np.abs(_t - self.time).argmin() for _t in t)) - - for flavor in flavors: - # Energy bin centers (in MeV) - _E = self._E[flavor][j] - _logE = np.log10(_E) - _dlogE = np.diff(_logE) - - # Model flavors (internally) are nu_e, nu_e_bar, and nu_x, which stands - # for nu_mu(_bar) and nu_tau(_bar), making the flux 4x higher than nu_e and nu_e_bar. - factor = 1. if flavor.is_electron else 0.25 - - # Linear interpolation in flux. - if self.interpolation.lower() == 'linear': - # Pad log(E) array with values where flux is fixed to zero. - _logEbins = np.insert(_logE, 0, np.log10(np.finfo(float).eps * E.unit/u.MeV), axis=1) - _logEbins = np.append(_logEbins, np.expand_dims(_logE[:,-1] + _dlogE[:,-1], 1), axis=1) - - # Luminosity spectrum _dLdE is in units of 1e50 erg/s/MeV. - # Pad with values where flux is fixed to zero, then divide by E to get number luminosity - _dNLdE = np.asarray([np.zeros(j.shape)] + [self._dLdE[flavor]['g{}'.format(i)][j] for i in range(12)] + [np.zeros(j.shape)]).T - interp_values = np.array([np.interp(logE, __logEbins, __dNLdE) - for __logEbins, __dNLdE in zip(_logEbins, _dNLdE)]) - initialspectra[flavor] = (interp_values / E * factor * 1e50 * u.erg/u.s/u.MeV).to('1 / (erg s)') - - elif self.interpolation.lower() == 'nearest': - # Find edges of energy bins and identify which energy bin (each entry of) E falls into - _logEbinEdges = _logE - _dlogE[0,0] / 2 - _logEbinEdges = np.append(_logEbinEdges, np.expand_dims(_logE[:,-1] + _dlogE[:,-1]/2, 1), axis=1) - _EbinEdges = 10**_logEbinEdges - idx = np.array([np.searchsorted(edges, E) - 1 for edges in _EbinEdges]) - select = np.array([(_idx > 0) & (_idx < len(__E)) for _idx, __E in zip(idx, _E)]) - - # Divide luminosity spectrum by energy at bin center to get number luminosity spectrum - _dNLdE = np.zeros([len(j), len(np.atleast_1d(E))]) - for i in range(len(j)): - _dNLdE[i][np.where(select[i])] = np.asarray([self._dLdE[flavor]['g{}'.format(ebin_idx)][j[i]] / _E[i][ebin_idx] - for ebin_idx in idx[i][select[i]]]) - initialspectra[flavor] = ((_dNLdE << 1/u.MeV) * factor * 1e50 * u.erg/u.s/u.MeV).to('1 / (erg s)') - - else: - raise ValueError('Unrecognized interpolation type "{}"'.format(self.interpolation)) - - return initialspectra - - -class Fornax_2022(Fornax_2021): - def __init__(self, filename, metadata={}): - """ - Parameters - ---------- - filename : str - Absolute or relative path to HDF5 file with model data. - """ - #extra parameters - self.interpolation = "linear" #Scheme to interpolate in spectra ('nearest', 'linear'). - # Open the requested filename using the model downloader. - datafile = self.request_file(filename) - # Set up model metadata. - self.progenitor = os.path.splitext(os.path.basename(filename))[0].split('_')[2] - self.progenitor_mass = float(self.progenitor[:-3])*u.Msun if self.progenitor.endswith('bh') else float(self.progenitor)*u.Msun - - self.metadata = metadata - - # Open HDF5 data file. - _h5file = h5py.File(datafile, 'r') - - self.metadata['PNS mass'] = _h5file.attrs['Mpns'] * u.Msun - self.time = _h5file['nu0'].attrs['time'] * u.s - - self.luminosity = {} - self._E = {} - self._dLdE = {} - for flavor in ThreeFlavor: - # Convert flavor to key name in the model HDF5 file - key = {ThreeFlavor.NU_E: 'nu0', - ThreeFlavor.NU_E_BAR: 'nu1', - ThreeFlavor.NU_MU: 'nu2', - ThreeFlavor.NU_MU_BAR: 'nu2', - ThreeFlavor.NU_TAU: 'nu2', - ThreeFlavor.NU_TAU_BAR: 'nu2'}[flavor] - - self._E[flavor] = np.asarray(_h5file[key]['egroup']) - self._dLdE[flavor] = {f"g{i}": np.asarray(_h5file[key][f'g{i}']) for i in range(12)} - - # Compute luminosity by integrating over model energy bins. - dE = np.asarray(_h5file[key]['degroup']) - n = len(dE[0]) - dLdE = np.zeros((len(self.time), n), dtype=float) - for i in range(n): - dLdE[:, i] = self._dLdE[flavor][f"g{i}"] - - # Note factor of 0.25 in nu_x and nu_x_bar. - factor = 1. if flavor.is_electron else 0.25 - self.luminosity[flavor] = np.sum(dLdE*dE, axis=1) * factor * 1e50 * u.erg/u.s - - -class Fornax_2024(Fornax_2021): - def __init__(self, filename, metadata={}): - """ - Parameters - ---------- - filename : str - Absolute or relative path to HDF5 file with model data. - """ - #extra parameters - self.interpolation = 'linear' #Scheme to interpolate in spectra ('nearest', 'linear') - - # Open the requested filename using the model downloader. - datafile = self.request_file(filename) - # Set up model metadata. - self.progenitor = os.path.splitext(os.path.basename(filename))[0].split('_')[2] - self.progenitor_mass = float(re.sub('[A-Za-z]', '', self.progenitor)) - - self.metadata = metadata - - # Open HDF5 data file. - _h5file = h5py.File(datafile, 'r') - - self.metadata['PNS mass'] = _h5file.attrs['Mpns'] * u.Msun - self.time = _h5file['nu0'].attrs['time'] * u.s - - self.luminosity = {} - self._E = {} - self._dLdE = {} - for flavor in ThreeFlavor: - # Convert flavor to key name in the model HDF5 file - key = {ThreeFlavor.NU_E: 'nu0', - ThreeFlavor.NU_E_BAR: 'nu1', - ThreeFlavor.NU_MU: 'nu2', - ThreeFlavor.NU_MU_BAR: 'nu2', - ThreeFlavor.NU_TAU: 'nu2', - ThreeFlavor.NU_TAU_BAR: 'nu2'}[flavor] - - self._E[flavor] = np.asarray(_h5file[key]['egroup']) - self._dLdE[flavor] = {f"g{i}": np.asarray(_h5file[key][f'g{i}']) for i in range(12)} - - # Compute luminosity by integrating over model energy bins. - dE = np.asarray(_h5file[key]['degroup']) - n = len(dE[0]) - dLdE = np.zeros((len(self.time), n), dtype=float) - for i in range(n): - dLdE[:, i] = self._dLdE[flavor][f"g{i}"] - - # Note factor of 0.25 in nu_x and nu_x_bar. - factor = 1. if flavor.is_electron else 0.25 - self.luminosity[flavor] = np.sum(dLdE*dE, axis=1) * factor * 1e50 * u.erg/u.s - - -class Mori_2023(base.PinchedModel): - def __init__(self, filename, metadata={}): - """ - Parameters - ---------- - filename : str - Absolute or relative path to file prefix. - """ - # Open the requested filename using the model downloader. - datafile = self.request_file(filename) - - self.metadata = metadata - - # Read ASCII data. - simtab = Table.read(datafile, format='ascii') - - # Remove the first table row, which appears to have zero input. - simtab = simtab[simtab['1:t_sim[s]'] > 0] - - # Get grid of model times. - simtab['TIME'] = simtab['2:t_pb[s]'] << u.s - for j, (f, fkey) in enumerate(zip(["NU_E", "NU_E_BAR", "NU_X"], 'ebx')): - simtab[f'L_{f}'] = simtab[f'{6+j}:Le{fkey}[e/s]'] << u.erg / u.s - # Compute the pinch parameter from E_rms and E_avg - # / ^2 = (2+a)/(1+a), where - # E_rms^2 = - ^2. - Eavg = simtab[f'{9+j}:Em{fkey}[MeV]'] - Erms = simtab[f'{12+j}:Er{fkey}[MeV]'] - x = Erms**2 / Eavg**2 - alpha = (2-x) / (x-1) - - simtab[f'E_{f}'] = Eavg << u.MeV - simtab[f'E2_{f}'] = Erms**2 << u.MeV**2 - simtab[f'ALPHA_{f}'] = alpha - -# simtab[f'E_{f.name}'] = simtab[f'{9+j}:Em{fkey}[MeV]'] << u.MeV -# Erms = simtab[f'{12+j}:Er{fkey}[MeV]'] * u.MeV -# -# # Compute the pinch parameter from E_rms and E_avg -# simtab[f'E2_{f.name}'] = Erms**2 + simtab[f'E_{f.name}']**2 -# x = simtab[f'E2_{f.name}'] / simtab[f'E_{f.name}']**2 -# simtab[f'ALPHA_{f.name}'] = (2-x) / (x-1) - - self.filename = os.path.basename(filename) - - super().__init__(simtab, metadata) - - -class Takata_2025(base.PinchedModel): - def __init__(self, filename, metadata={}): - """ - Parameters - ---------- - filename: str - Absolute or relative path to file prefix. - - """ - - # Open the requested filename using the model downloader.\ - datafile = self.request_file(filename) - - self.metadata = metadata - - # Read ASCII data and clean up NaN values in float columns. - simtab = Table.read(datafile, format='ascii') - has_nan = np.zeros(len(simtab), dtype=bool) - for col in simtab.itercols(): - if col.info.dtype.kind == 'f': - has_nan |= np.isnan(col) - simtab = simtab[~has_nan] - - # Remove the first table row, which appears to have zero input. - simtab = simtab[simtab['1:t_sim[s]'] > 0] - - # Get grid of model times. - simtab['TIME'] = simtab['2:t_pb[s]'] << u.s - for j, (f, fkey) in enumerate(zip(["NU_E", "NU_E_BAR", "NU_X"], 'ebx')): - simtab[f'L_{f}'] = simtab[f'{6+j}:Le{fkey}[e/s]'] << u.erg / u.s - # Compute the pinch parameter from E_rms and E_avg - # E_rms^2/^2 = (2+a)/(1+a) - Eavg = simtab[f'{9+j}:Em{fkey}[MeV]'] - Erms = simtab[f'{12+j}:Er{fkey}[MeV]'] - x = Erms**2 / Eavg**2 - alpha = (2-x)/(x-1) - - simtab[f'E_{f}'] = Eavg << u.MeV - simtab[f'Erms_{f}'] = Erms << u.MeV - simtab[f'ALPHA_{f}'] = alpha - - self.filename = os.path.basename(filename) - - super().__init__(simtab, metadata) - - -class Bugli_2021(base.PinchedModel): - """Model based on `Buggli (2021) `_. - """ - - def __init__(self, filename, metadata={}): - """ - Parameters - ---------- - filename : str - Absolute or relative path to FITS file with model data. - """ - - datafile = self.request_file(filename) - simtab = Table.read(datafile, - names=['TIME', 'L_NU_E', 'L_NU_E_BAR', 'L_NU_X', - 'E_NU_E', 'E_NU_E_BAR', 'E_NU_X', - 'RMS_NU_E', 'RMS_NU_E_BAR', 'RMS_NU_X'], - format='ascii') - - simtab['ALPHA_NU_E'] = (2.0*simtab['E_NU_E']**2 - simtab['RMS_NU_E']**2) / \ - (simtab['RMS_NU_E']**2 - simtab['E_NU_E']**2) - simtab['ALPHA_NU_E_BAR'] = (2.0*simtab['E_NU_E_BAR']**2 - simtab['RMS_NU_E_BAR']**2) / \ - (simtab['RMS_NU_E_BAR']**2 - simtab['E_NU_E_BAR']**2) - simtab['ALPHA_NU_X'] = (2.0*simtab['E_NU_X']**2 - simtab['RMS_NU_X']**2) / \ - (simtab['RMS_NU_X']**2 - simtab['E_NU_X']**2) - - self.filename = os.path.basename(filename) - - super().__init__(simtab, metadata) - - -class Fischer_2020(base.PinchedModel): - def __init__(self, filename, metadata={}): - """ - Parameters - ---------- - filename : str - Absolute or relative path to file - """ - # Open the requested filename using the model downloader. - datafile = self.request_file(filename) - self.metadata = metadata - - # Open the requested filename using the model downloader. - # datafile = _model_downloader.get_model_data(self.__class__.__name__, filename) - # self.filename = os.path.basename(filename) - - simtab = Table() - - tf = tarfile.open(datafile) - - # Open luminosity file - with tf.extractfile("luminosity.dat") as Lfile: - Ldata = np.genfromtxt(Lfile, skip_header=2) - - simtab['TIME'] = Ldata[:, 0] - - simtab['L_NU_E'] = Ldata[:, 1] - simtab['L_NU_E_BAR'] = Ldata[:, 2] - simtab['L_NU_X'] = Ldata[:, 3] - simtab['L_NU_X_BAR'] = Ldata[:, 4] - - Lfile.close() - - # Open mean energy file - with tf.extractfile("menergy.dat") as Efile: - Edata = np.genfromtxt(Efile, skip_header=2) - - simtab['E_NU_E'] = Edata[:, 1] << u.MeV - simtab['E_NU_E_BAR'] = Edata[:, 2] << u.MeV - simtab['E_NU_X'] = Edata[:, 3] << u.MeV - simtab['E_NU_X_BAR'] = Edata[:, 4] << u.MeV - - Efile.close() - - # Open rms energy file - with tf.extractfile("rmsenergy.dat") as RMSEfile: - RMSEdata = np.genfromtxt(RMSEfile, skip_header=2) - - simtab['RMS_NU_E'] = RMSEdata[:, 1] << u.MeV - simtab['RMS_NU_E_BAR'] = RMSEdata[:, 2] << u.MeV - simtab['RMS_NU_X'] = RMSEdata[:, 3] << u.MeV - simtab['RMS_NU_X_BAR'] = RMSEdata[:, 4] << u.MeV - - RMSEfile.close() - - simtab['ALPHA_NU_E'] = (2.0 * simtab['E_NU_E'] ** 2 - simtab['RMS_NU_E'] ** 2) / \ - (simtab['RMS_NU_E'] ** 2 - simtab['E_NU_E'] ** 2) - simtab['ALPHA_NU_E_BAR'] = (2.0 * simtab['E_NU_E_BAR'] ** 2 - simtab['RMS_NU_E_BAR'] ** 2) / \ - (simtab['RMS_NU_E_BAR'] ** 2 - simtab['E_NU_E_BAR'] ** 2) - simtab['ALPHA_NU_X'] = (2.0 * simtab['E_NU_X'] ** 2 - simtab['RMS_NU_X'] ** 2) / \ - (simtab['RMS_NU_X'] ** 2 - simtab['E_NU_X'] ** 2) - simtab['ALPHA_NU_X_BAR'] = (2.0 * simtab['E_NU_X_BAR'] ** 2 - simtab['RMS_NU_X_BAR'] ** 2) / \ - (simtab['RMS_NU_X_BAR'] ** 2 - simtab['E_NU_X_BAR'] ** 2) - - tf.close() - - super().__init__(simtab, metadata) - - -