From 3f7513807d9695d91615aec0094daa7eb6bfc483 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Mon, 13 Jul 2026 14:23:45 -0400 Subject: [PATCH 01/40] Update extended.py Rewrite of extended.py so as to interface with rest of snewpy --- python/snewpy/models/extended.py | 87 +++++++++++++++----------------- 1 file changed, 40 insertions(+), 47 deletions(-) diff --git a/python/snewpy/models/extended.py b/python/snewpy/models/extended.py index a613dc46e..b37d2badd 100644 --- a/python/snewpy/models/extended.py +++ b/python/snewpy/models/extended.py @@ -6,11 +6,7 @@ from snewpy.neutrino import Flavor from snewpy.models.base import SupernovaModel - -class ExtendedModel(SupernovaModel): - """Class defining a supernova model with a cooling tail extension.""" - - def __init__(self, base_model): + def __init__(self, base_model, k=-1., A=None, tau_c=36. * u.s, alpha=2.66): """Initialize extended supernova model class.""" if not isinstance(base_model, SupernovaModel): raise TypeError("ExtendedModel.__init__ requires a SupernovaModel object") @@ -25,25 +21,51 @@ def __init__(self, base_model): self.t_final = self.time[-1] self.L_final = {flv: self.luminosity[flv][-1] for flv in Flavor} - def get_initial_spectra(self, *args, **kwargs): - """Get neutrino spectra/luminosity curves before oscillation""" - return self._get_initial_spectra(*args, **kwargs) + self.k = k + if A is None: + tf = self.t_final + Lf = self.L_final[flavor] + A = Lf / (tf.value**k * np.exp(-(tf/tau_c)**alpha)) + self.A = A + self.tau_c = tau_c + self.alpha = alpha + + def get_initial_spectra(self, t, E): + """Get neutrino spectra/luminosity curves before oscillation + + Parameters + ---------- + t : astropy.Quantity + Times to add to supernova model. + E : astropy.Quantity + Energies to evaluate the initial spectra. + """ + + model_spectra = model._get_initial_spectra_dict(self, t, E) + array = model_spectra + + # Select times after the end of the model + select = t > self.t_final + L_ext = self.get_extended_luminosity(t) + + extended_spectra = {} + for flavor in Flavor: + extended_spectra[flavor] = model_spectra[flavor] * L_ext / L_final[flavor] + array[flavor].append(extended_spectra[flavor]) + + return Spectrum(data=array + flavor=model.flavor, + time=t, + energy=E, + integrable_axes=model._integrable_axes) - def get_extended_luminosity(self, t, k=-1., A=None, tau_c=36. * u.s, alpha=2.66, flavor = Flavor.NU_E): + def get_extended_luminosity(self, t): """Get neutrino luminosity from supernova cooling tail luminosity model. Parameters ---------- t : astropy.Quantity Time to evaluate luminosity. - k : float - Power law factor (default: -1) - A : astropy.Quantity - Normalization factor (default: None, automatically match original model data) - tau_c : astropy.Quantity - Exponential decay characteristic timescale (default: 36 s) - alpha : float - Exponential decay factor (default: 2.66) Returns ------- @@ -52,35 +74,6 @@ def get_extended_luminosity(self, t, k=-1., A=None, tau_c=36. * u.s, alpha=2.66, """ if t.value < 0.5: warn("Extended luminosity model not applicable to early times") - if A is None: - tf = self.t_final - Lf = self.L_final[flavor] - A = Lf / (tf.value**k * np.exp(-(tf/tau_c)**alpha)) - return A * t.value**k * np.exp(-(t/tau_c)**alpha) - - def extend(self, ts, k=-1., A=None, tau_c=36. * u.s, alpha=2.66): - """Extend supernova model to specific times. + return self.A * t.value**self.k * np.exp(-(t/self.tau_c)**self.alpha) - Parameters - ---------- - ts : astropy.Quantity - Times to add to supernova model. - k : float - Power law factor (default: -1) - A : astropy.Quantity - Normalization factor (default: None, automatically match original model data) - tau_c : astropy.Quantity - Exponential decay characteristic timescale (default: 36 s) - alpha : float - Exponential decay factor (default: 2.66) - """ - # Select times after the end of the model - select = ts > self.t_final - for t in ts[select]: - self.time = np.append(self.time, t) - for flavor in Flavor: - L_ext = self.get_extended_luminosity(t, k = k, A = A, tau_c = tau_c, alpha = alpha, flavor = flavor) - self.luminosity[flavor] = np.append(self.luminosity[flavor], L_ext) - self.meanE[flavor] = np.append(self.meanE[flavor], self.meanE[flavor][-1]) - self.pinch[flavor] = np.append(self.pinch[flavor], self.pinch[flavor][-1]) From 8a90018aeb41c5703858792b1abbbda84ec5ca23 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Mon, 13 Jul 2026 14:27:44 -0400 Subject: [PATCH 02/40] Update extended.py Oops. typo --- python/snewpy/models/extended.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/python/snewpy/models/extended.py b/python/snewpy/models/extended.py index b37d2badd..029d32c04 100644 --- a/python/snewpy/models/extended.py +++ b/python/snewpy/models/extended.py @@ -6,6 +6,9 @@ from snewpy.neutrino import Flavor from snewpy.models.base import SupernovaModel +class ExtendedModel(SupernovaModel): + """Class defining a supernova model with a cooling tail extension.""" + def __init__(self, base_model, k=-1., A=None, tau_c=36. * u.s, alpha=2.66): """Initialize extended supernova model class.""" if not isinstance(base_model, SupernovaModel): From 51b4b13d5c67a73a05d373470c475800f25d8a4f Mon Sep 17 00:00:00 2001 From: jpkneller Date: Mon, 13 Jul 2026 14:31:17 -0400 Subject: [PATCH 03/40] Update extended.py --- python/snewpy/models/extended.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/python/snewpy/models/extended.py b/python/snewpy/models/extended.py index 029d32c04..591438456 100644 --- a/python/snewpy/models/extended.py +++ b/python/snewpy/models/extended.py @@ -33,7 +33,7 @@ def __init__(self, base_model, k=-1., A=None, tau_c=36. * u.s, alpha=2.66): self.tau_c = tau_c self.alpha = alpha - def get_initial_spectra(self, t, E): + def _get_initial_spectra_dict(self, t, E): """Get neutrino spectra/luminosity curves before oscillation Parameters @@ -56,11 +56,7 @@ def get_initial_spectra(self, t, E): extended_spectra[flavor] = model_spectra[flavor] * L_ext / L_final[flavor] array[flavor].append(extended_spectra[flavor]) - return Spectrum(data=array - flavor=model.flavor, - time=t, - energy=E, - integrable_axes=model._integrable_axes) + return array def get_extended_luminosity(self, t): """Get neutrino luminosity from supernova cooling tail luminosity model. From 37302ecca8017d5e91374c16a36d9f7e50762031 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Mon, 13 Jul 2026 14:51:29 -0400 Subject: [PATCH 04/40] Update extended.py --- python/snewpy/models/extended.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/snewpy/models/extended.py b/python/snewpy/models/extended.py index 591438456..d71a65670 100644 --- a/python/snewpy/models/extended.py +++ b/python/snewpy/models/extended.py @@ -3,7 +3,7 @@ import numpy as np from astropy import units as u -from snewpy.neutrino import Flavor +from snewpy.flavor import ThreeFlavor from snewpy.models.base import SupernovaModel class ExtendedModel(SupernovaModel): From eac5e7a7a3037344fa6afd310729df64d725486d Mon Sep 17 00:00:00 2001 From: jpkneller Date: Mon, 13 Jul 2026 14:56:12 -0400 Subject: [PATCH 05/40] Update extended.py --- python/snewpy/models/extended.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/python/snewpy/models/extended.py b/python/snewpy/models/extended.py index d71a65670..d925d304b 100644 --- a/python/snewpy/models/extended.py +++ b/python/snewpy/models/extended.py @@ -22,13 +22,12 @@ def __init__(self, base_model, k=-1., A=None, tau_c=36. * u.s, alpha=2.66): else: setattr(self, method_name, getattr(base_model, method_name)) self.t_final = self.time[-1] - self.L_final = {flv: self.luminosity[flv][-1] for flv in Flavor} + self.L_final = {flv: self.luminosity[flv][-1] for flv in ThreeFlavor} self.k = k if A is None: - tf = self.t_final - Lf = self.L_final[flavor] - A = Lf / (tf.value**k * np.exp(-(tf/tau_c)**alpha)) + for flv in ThreeFlavor: + A[flv] = self.L_final / (self.t_final.value**k * np.exp(-(self.t_final/tau_c)**alpha)) self.A = A self.tau_c = tau_c self.alpha = alpha From 1ed2884aa70efd0a87bc5001a51d5b92dafd5dfd Mon Sep 17 00:00:00 2001 From: jpkneller Date: Mon, 13 Jul 2026 15:00:04 -0400 Subject: [PATCH 06/40] Update extended.py --- python/snewpy/models/extended.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/python/snewpy/models/extended.py b/python/snewpy/models/extended.py index d925d304b..56979ace9 100644 --- a/python/snewpy/models/extended.py +++ b/python/snewpy/models/extended.py @@ -26,8 +26,10 @@ def __init__(self, base_model, k=-1., A=None, tau_c=36. * u.s, alpha=2.66): self.k = k if A is None: + tf = self.t_final for flv in ThreeFlavor: - A[flv] = self.L_final / (self.t_final.value**k * np.exp(-(self.t_final/tau_c)**alpha)) + Lf = self.L_final[flv] + A[flv] = self.Lf / (tf.value**k * np.exp(-(tf/tau_c)**alpha)) self.A = A self.tau_c = tau_c self.alpha = alpha From d7fd2ecd17ee9ec4cf2e635b13d48239c2b72b78 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Mon, 13 Jul 2026 16:01:38 -0400 Subject: [PATCH 07/40] Update extended.py --- python/snewpy/models/extended.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/snewpy/models/extended.py b/python/snewpy/models/extended.py index 56979ace9..724cf803e 100644 --- a/python/snewpy/models/extended.py +++ b/python/snewpy/models/extended.py @@ -29,7 +29,7 @@ def __init__(self, base_model, k=-1., A=None, tau_c=36. * u.s, alpha=2.66): tf = self.t_final for flv in ThreeFlavor: Lf = self.L_final[flv] - A[flv] = self.Lf / (tf.value**k * np.exp(-(tf/tau_c)**alpha)) + A[flv] = Lf / (tf.value**k * np.exp(-(tf/tau_c)**alpha)) self.A = A self.tau_c = tau_c self.alpha = alpha From f73c96b085fe057b8a2686ea6bfad3319d9d7dc8 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Mon, 13 Jul 2026 16:03:29 -0400 Subject: [PATCH 08/40] Update extended.py --- python/snewpy/models/extended.py | 1 + 1 file changed, 1 insertion(+) diff --git a/python/snewpy/models/extended.py b/python/snewpy/models/extended.py index 724cf803e..5577cbb88 100644 --- a/python/snewpy/models/extended.py +++ b/python/snewpy/models/extended.py @@ -26,6 +26,7 @@ def __init__(self, base_model, k=-1., A=None, tau_c=36. * u.s, alpha=2.66): self.k = k if A is None: + A = {} tf = self.t_final for flv in ThreeFlavor: Lf = self.L_final[flv] From 7ea6c017c69a616b37985940d401b3de854660b1 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Mon, 13 Jul 2026 16:19:30 -0400 Subject: [PATCH 09/40] Update extended.py --- python/snewpy/models/extended.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/python/snewpy/models/extended.py b/python/snewpy/models/extended.py index 5577cbb88..10a9cb732 100644 --- a/python/snewpy/models/extended.py +++ b/python/snewpy/models/extended.py @@ -35,7 +35,7 @@ def __init__(self, base_model, k=-1., A=None, tau_c=36. * u.s, alpha=2.66): self.tau_c = tau_c self.alpha = alpha - def _get_initial_spectra_dict(self, t, E): + def _get_initial_spectra_dict(self, t, E, flavors=ThreeFlavor): """Get neutrino spectra/luminosity curves before oscillation Parameters @@ -47,15 +47,16 @@ def _get_initial_spectra_dict(self, t, E): """ model_spectra = model._get_initial_spectra_dict(self, t, E) - array = model_spectra - + # Select times after the end of the model select = t > self.t_final L_ext = self.get_extended_luminosity(t) - extended_spectra = {} - for flavor in Flavor: - extended_spectra[flavor] = model_spectra[flavor] * L_ext / L_final[flavor] + array = {} + for flavor in flavors: + array[flavor] = model_spectra[flavor] + model_spectra_final[flavor] = array[flavor][-1] + extended_spectra[flavor] = model_spectra_final[flavor] * L_ext / L_final[flavor] array[flavor].append(extended_spectra[flavor]) return array From 4df6c3fcad9ca65ac53d6473d4222664ed1f3c95 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 14 Jul 2026 09:44:42 -0400 Subject: [PATCH 10/40] Update extended.py --- python/snewpy/models/extended.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/snewpy/models/extended.py b/python/snewpy/models/extended.py index 10a9cb732..2a1502961 100644 --- a/python/snewpy/models/extended.py +++ b/python/snewpy/models/extended.py @@ -49,13 +49,13 @@ def _get_initial_spectra_dict(self, t, E, flavors=ThreeFlavor): model_spectra = model._get_initial_spectra_dict(self, t, E) # Select times after the end of the model - select = t > self.t_final + t_ext = t > self.t_final L_ext = self.get_extended_luminosity(t) array = {} for flavor in flavors: array[flavor] = model_spectra[flavor] - model_spectra_final[flavor] = array[flavor][-1] + model_spectra_final[flavor] = array[flavor][-1,:] extended_spectra[flavor] = model_spectra_final[flavor] * L_ext / L_final[flavor] array[flavor].append(extended_spectra[flavor]) From 3228ba8f99ab13926589ad1e54e251b59857aa3f Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 14 Jul 2026 09:50:58 -0400 Subject: [PATCH 11/40] Update extended.py --- python/snewpy/models/extended.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/python/snewpy/models/extended.py b/python/snewpy/models/extended.py index 2a1502961..8be477ad3 100644 --- a/python/snewpy/models/extended.py +++ b/python/snewpy/models/extended.py @@ -14,13 +14,14 @@ def __init__(self, base_model, k=-1., A=None, tau_c=36. * u.s, alpha=2.66): if not isinstance(base_model, SupernovaModel): raise TypeError("ExtendedModel.__init__ requires a SupernovaModel object") - self.__dict__ = base_model.__dict__.copy() + """self.__dict__ = base_model.__dict__.copy() for method_name in dir(base_model): if callable(getattr(base_model, method_name)) and method_name[0] != '_': if method_name == 'get_initial_spectra': self._get_initial_spectra = getattr(base_model, method_name) else: - setattr(self, method_name, getattr(base_model, method_name)) + setattr(self, method_name, getattr(base_model, method_name))""" + self.model = base_model self.t_final = self.time[-1] self.L_final = {flv: self.luminosity[flv][-1] for flv in ThreeFlavor} @@ -46,7 +47,7 @@ def _get_initial_spectra_dict(self, t, E, flavors=ThreeFlavor): Energies to evaluate the initial spectra. """ - model_spectra = model._get_initial_spectra_dict(self, t, E) + model_spectra = self.model._get_initial_spectra_dict(self, t, E) # Select times after the end of the model t_ext = t > self.t_final From 6391996af91f7863e7e954bc37750a29371587d8 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 14 Jul 2026 09:58:12 -0400 Subject: [PATCH 12/40] Update extended.py --- python/snewpy/models/extended.py | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/python/snewpy/models/extended.py b/python/snewpy/models/extended.py index 8be477ad3..eb360a89b 100644 --- a/python/snewpy/models/extended.py +++ b/python/snewpy/models/extended.py @@ -22,16 +22,12 @@ def __init__(self, base_model, k=-1., A=None, tau_c=36. * u.s, alpha=2.66): else: setattr(self, method_name, getattr(base_model, method_name))""" self.model = base_model - self.t_final = self.time[-1] - self.L_final = {flv: self.luminosity[flv][-1] for flv in ThreeFlavor} + self.t_final = self.model.get_time()[-1] + #self.L_final = {flv: self.luminosity[flv][-1] for flv in ThreeFlavor} self.k = k if A is None: - A = {} - tf = self.t_final - for flv in ThreeFlavor: - Lf = self.L_final[flv] - A[flv] = Lf / (tf.value**k * np.exp(-(tf/tau_c)**alpha)) + A = 1 / ( self.t_final.value**k * np.exp(-(self.t_final/tau_c)**alpha) ) self.A = A self.tau_c = tau_c self.alpha = alpha @@ -51,18 +47,18 @@ def _get_initial_spectra_dict(self, t, E, flavors=ThreeFlavor): # Select times after the end of the model t_ext = t > self.t_final - L_ext = self.get_extended_luminosity(t) + f_ext = self.get_extended_time_dependence(t) array = {} for flavor in flavors: array[flavor] = model_spectra[flavor] model_spectra_final[flavor] = array[flavor][-1,:] - extended_spectra[flavor] = model_spectra_final[flavor] * L_ext / L_final[flavor] + extended_spectra[flavor] = model_spectra_final[flavor] * f_ext array[flavor].append(extended_spectra[flavor]) return array - def get_extended_luminosity(self, t): + def get_extended_extended_time_dependence(self, t): """Get neutrino luminosity from supernova cooling tail luminosity model. Parameters @@ -73,7 +69,7 @@ def get_extended_luminosity(self, t): Returns ------- astropy.Quantity - Luminosity calculated from cooling tail model. + extended time dependence calculated from cooling tail model. """ if t.value < 0.5: warn("Extended luminosity model not applicable to early times") From 1df2e7bfb0deada82e4c1cb4efb3febb26e4fa4f Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 14 Jul 2026 10:30:24 -0400 Subject: [PATCH 13/40] Update extended.py --- python/snewpy/models/extended.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/python/snewpy/models/extended.py b/python/snewpy/models/extended.py index eb360a89b..e4372b90a 100644 --- a/python/snewpy/models/extended.py +++ b/python/snewpy/models/extended.py @@ -22,12 +22,11 @@ def __init__(self, base_model, k=-1., A=None, tau_c=36. * u.s, alpha=2.66): else: setattr(self, method_name, getattr(base_model, method_name))""" self.model = base_model - self.t_final = self.model.get_time()[-1] - #self.L_final = {flv: self.luminosity[flv][-1] for flv in ThreeFlavor} + super().__init__(model.time,model.metadata) self.k = k if A is None: - A = 1 / ( self.t_final.value**k * np.exp(-(self.t_final/tau_c)**alpha) ) + A = 1 / ( self.time[-1].value**k * np.exp(-(self.time[-1]/tau_c)**alpha) ) self.A = A self.tau_c = tau_c self.alpha = alpha @@ -52,13 +51,12 @@ def _get_initial_spectra_dict(self, t, E, flavors=ThreeFlavor): array = {} for flavor in flavors: array[flavor] = model_spectra[flavor] - model_spectra_final[flavor] = array[flavor][-1,:] - extended_spectra[flavor] = model_spectra_final[flavor] * f_ext + extended_spectra[flavor] = np.outer( f_ext, model_spectra[flavor][-1,:]) array[flavor].append(extended_spectra[flavor]) return array - def get_extended_extended_time_dependence(self, t): + def get_extended_time_dependence(self, t): """Get neutrino luminosity from supernova cooling tail luminosity model. Parameters From 46a0de583b26d4a3ecec333fd01a596fc4f1aa56 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 14 Jul 2026 10:34:44 -0400 Subject: [PATCH 14/40] Update extended.py --- python/snewpy/models/extended.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/snewpy/models/extended.py b/python/snewpy/models/extended.py index e4372b90a..8da80e08f 100644 --- a/python/snewpy/models/extended.py +++ b/python/snewpy/models/extended.py @@ -22,7 +22,7 @@ def __init__(self, base_model, k=-1., A=None, tau_c=36. * u.s, alpha=2.66): else: setattr(self, method_name, getattr(base_model, method_name))""" self.model = base_model - super().__init__(model.time,model.metadata) + super().__init__(base_model.time,base_model.metadata) self.k = k if A is None: From d0455627038aeca11168fd4d534956229f3a77f3 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 14 Jul 2026 10:41:41 -0400 Subject: [PATCH 15/40] Update extended.py --- python/snewpy/models/extended.py | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/python/snewpy/models/extended.py b/python/snewpy/models/extended.py index 8da80e08f..472c77520 100644 --- a/python/snewpy/models/extended.py +++ b/python/snewpy/models/extended.py @@ -14,14 +14,7 @@ def __init__(self, base_model, k=-1., A=None, tau_c=36. * u.s, alpha=2.66): if not isinstance(base_model, SupernovaModel): raise TypeError("ExtendedModel.__init__ requires a SupernovaModel object") - """self.__dict__ = base_model.__dict__.copy() - for method_name in dir(base_model): - if callable(getattr(base_model, method_name)) and method_name[0] != '_': - if method_name == 'get_initial_spectra': - self._get_initial_spectra = getattr(base_model, method_name) - else: - setattr(self, method_name, getattr(base_model, method_name))""" - self.model = base_model + self.base_model = base_model super().__init__(base_model.time,base_model.metadata) self.k = k @@ -42,17 +35,17 @@ def _get_initial_spectra_dict(self, t, E, flavors=ThreeFlavor): Energies to evaluate the initial spectra. """ - model_spectra = self.model._get_initial_spectra_dict(self, t, E) + base_model_spectra = self.base_model._get_initial_spectra_dict(self, t, E) # Select times after the end of the model - t_ext = t > self.t_final - f_ext = self.get_extended_time_dependence(t) + t_ext = t > self.time[-1] + f_ext = self.get_extended_time_dependence(t_ext) array = {} for flavor in flavors: - array[flavor] = model_spectra[flavor] - extended_spectra[flavor] = np.outer( f_ext, model_spectra[flavor][-1,:]) - array[flavor].append(extended_spectra[flavor]) + array[flavor] = base_model_spectra[flavor] + extended_model_spectra[flavor] = np.outer( f_ext, base_model_spectra[flavor][-1,:]) + array[flavor].append(extended_model_spectra[flavor]) return array @@ -69,7 +62,7 @@ def get_extended_time_dependence(self, t): astropy.Quantity extended time dependence calculated from cooling tail model. """ - if t.value < 0.5: + if t < 0.5 * u.s: warn("Extended luminosity model not applicable to early times") return self.A * t.value**self.k * np.exp(-(t/self.tau_c)**self.alpha) From 981703135911024fe2af8721d9b25bb800545886 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 14 Jul 2026 10:54:32 -0400 Subject: [PATCH 16/40] Update extended.py --- python/snewpy/models/extended.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/python/snewpy/models/extended.py b/python/snewpy/models/extended.py index 472c77520..2036ded8e 100644 --- a/python/snewpy/models/extended.py +++ b/python/snewpy/models/extended.py @@ -34,6 +34,9 @@ def _get_initial_spectra_dict(self, t, E, flavors=ThreeFlavor): E : astropy.Quantity Energies to evaluate the initial spectra. """ + #convert input arguments to 1D arrays + t = u.Quantity(t, ndmin=1) + E = u.Quantity(E, ndmin=1) base_model_spectra = self.base_model._get_initial_spectra_dict(self, t, E) From 63528c00a9b3003506cfd584b29e87d5762c7000 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 14 Jul 2026 10:56:52 -0400 Subject: [PATCH 17/40] Update extended.py --- python/snewpy/models/extended.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/snewpy/models/extended.py b/python/snewpy/models/extended.py index 2036ded8e..0a4e8bbea 100644 --- a/python/snewpy/models/extended.py +++ b/python/snewpy/models/extended.py @@ -38,7 +38,7 @@ def _get_initial_spectra_dict(self, t, E, flavors=ThreeFlavor): t = u.Quantity(t, ndmin=1) E = u.Quantity(E, ndmin=1) - base_model_spectra = self.base_model._get_initial_spectra_dict(self, t, E) + base_model_spectra = self.base_model._get_initial_spectra_dict(t, E) # Select times after the end of the model t_ext = t > self.time[-1] From ce7d3e76830930271ae4a46ca379fddde8159ffa Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 14 Jul 2026 11:01:33 -0400 Subject: [PATCH 18/40] Update extended.py --- python/snewpy/models/extended.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/snewpy/models/extended.py b/python/snewpy/models/extended.py index 0a4e8bbea..752dfa47c 100644 --- a/python/snewpy/models/extended.py +++ b/python/snewpy/models/extended.py @@ -65,7 +65,7 @@ def get_extended_time_dependence(self, t): astropy.Quantity extended time dependence calculated from cooling tail model. """ - if t < 0.5 * u.s: + if t < u.Quantity(0.5*u.s): warn("Extended luminosity model not applicable to early times") return self.A * t.value**self.k * np.exp(-(t/self.tau_c)**self.alpha) From 98cc4b073393eb02382e592018d9648433fadad4 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 14 Jul 2026 11:03:23 -0400 Subject: [PATCH 19/40] Update extended.py --- python/snewpy/models/extended.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/snewpy/models/extended.py b/python/snewpy/models/extended.py index 752dfa47c..0f3d68db7 100644 --- a/python/snewpy/models/extended.py +++ b/python/snewpy/models/extended.py @@ -65,7 +65,7 @@ def get_extended_time_dependence(self, t): astropy.Quantity extended time dependence calculated from cooling tail model. """ - if t < u.Quantity(0.5*u.s): + if t.to_value('s') < 0.5: warn("Extended luminosity model not applicable to early times") return self.A * t.value**self.k * np.exp(-(t/self.tau_c)**self.alpha) From 0bd23b7694081ad84b907f840c9887d6a8354a5b Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 14 Jul 2026 11:05:37 -0400 Subject: [PATCH 20/40] Update extended.py --- python/snewpy/models/extended.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/snewpy/models/extended.py b/python/snewpy/models/extended.py index 0f3d68db7..b290debc7 100644 --- a/python/snewpy/models/extended.py +++ b/python/snewpy/models/extended.py @@ -65,7 +65,7 @@ def get_extended_time_dependence(self, t): astropy.Quantity extended time dependence calculated from cooling tail model. """ - if t.to_value('s') < 0.5: + if t[0] < 0.5*u.s: warn("Extended luminosity model not applicable to early times") return self.A * t.value**self.k * np.exp(-(t/self.tau_c)**self.alpha) From 7f9a39a0635a1a5f57af8c101d4658eb73378ea6 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 14 Jul 2026 12:23:54 -0400 Subject: [PATCH 21/40] Update extended.py --- python/snewpy/models/extended.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/snewpy/models/extended.py b/python/snewpy/models/extended.py index b290debc7..3bca573eb 100644 --- a/python/snewpy/models/extended.py +++ b/python/snewpy/models/extended.py @@ -19,7 +19,7 @@ def __init__(self, base_model, k=-1., A=None, tau_c=36. * u.s, alpha=2.66): self.k = k if A is None: - A = 1 / ( self.time[-1].value**k * np.exp(-(self.time[-1]/tau_c)**alpha) ) + A = 1 / ( self.time[-1]**k * np.exp(-(self.time[-1]/tau_c)**alpha) ) self.A = A self.tau_c = tau_c self.alpha = alpha @@ -67,6 +67,6 @@ def get_extended_time_dependence(self, t): """ if t[0] < 0.5*u.s: warn("Extended luminosity model not applicable to early times") - return self.A * t.value**self.k * np.exp(-(t/self.tau_c)**self.alpha) + return self.A * t**self.k * np.exp(-(t/self.tau_c)**self.alpha) From 2493a488fcc51ae02e296c3a6e74f37c9bca303f Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 14 Jul 2026 12:29:48 -0400 Subject: [PATCH 22/40] Update extended.py --- python/snewpy/models/extended.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/python/snewpy/models/extended.py b/python/snewpy/models/extended.py index 3bca573eb..53a182e86 100644 --- a/python/snewpy/models/extended.py +++ b/python/snewpy/models/extended.py @@ -52,21 +52,24 @@ def _get_initial_spectra_dict(self, t, E, flavors=ThreeFlavor): return array - def get_extended_time_dependence(self, t): + def get_extended_time_dependence(self, times): """Get neutrino luminosity from supernova cooling tail luminosity model. Parameters ---------- - t : astropy.Quantity - Time to evaluate luminosity. + times : astropy.Quantity + Times to evaluate luminosity. Returns ------- astropy.Quantity extended time dependence calculated from cooling tail model. """ - if t[0] < 0.5*u.s: + if times[0] < 0.5*u.s: warn("Extended luminosity model not applicable to early times") - return self.A * t**self.k * np.exp(-(t/self.tau_c)**self.alpha) + f = np.empty(len(times)) + for i in len(times): + f[i] = self.A * times[i]**self.k * np.exp(-(times[i]/self.tau_c)**self.alpha) + return f From 420986ed86e5e7472c4981e15d62e3b39799df40 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 14 Jul 2026 12:32:31 -0400 Subject: [PATCH 23/40] Update extended.py --- python/snewpy/models/extended.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/snewpy/models/extended.py b/python/snewpy/models/extended.py index 53a182e86..88931613c 100644 --- a/python/snewpy/models/extended.py +++ b/python/snewpy/models/extended.py @@ -68,7 +68,7 @@ def get_extended_time_dependence(self, times): if times[0] < 0.5*u.s: warn("Extended luminosity model not applicable to early times") f = np.empty(len(times)) - for i in len(times): + for i in range(len(times)): f[i] = self.A * times[i]**self.k * np.exp(-(times[i]/self.tau_c)**self.alpha) return f From 5c25f7311d38e5d41700f48c82b296242bedac0d Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 14 Jul 2026 12:37:42 -0400 Subject: [PATCH 24/40] Update extended.py --- python/snewpy/models/extended.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/python/snewpy/models/extended.py b/python/snewpy/models/extended.py index 88931613c..d8b821586 100644 --- a/python/snewpy/models/extended.py +++ b/python/snewpy/models/extended.py @@ -67,9 +67,8 @@ def get_extended_time_dependence(self, times): """ if times[0] < 0.5*u.s: warn("Extended luminosity model not applicable to early times") - f = np.empty(len(times)) - for i in range(len(times)): - f[i] = self.A * times[i]**self.k * np.exp(-(times[i]/self.tau_c)**self.alpha) - return f + + return self.A * times[i]**self.k * np.exp(-(times[i]/self.tau_c).value**self.alpha) + From f2ac561645be50cd3baf2a0aa6033166ad48813c Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 14 Jul 2026 12:38:16 -0400 Subject: [PATCH 25/40] Update extended.py --- python/snewpy/models/extended.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/snewpy/models/extended.py b/python/snewpy/models/extended.py index d8b821586..be6e3edf3 100644 --- a/python/snewpy/models/extended.py +++ b/python/snewpy/models/extended.py @@ -68,7 +68,7 @@ def get_extended_time_dependence(self, times): if times[0] < 0.5*u.s: warn("Extended luminosity model not applicable to early times") - return self.A * times[i]**self.k * np.exp(-(times[i]/self.tau_c).value**self.alpha) + return self.A * times**self.k * np.exp(-(times/self.tau_c).value**self.alpha) From 1cf6410489aa9fe502abde51c99164869c0ae224 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 14 Jul 2026 12:56:35 -0400 Subject: [PATCH 26/40] Update extended.py --- python/snewpy/models/extended.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/snewpy/models/extended.py b/python/snewpy/models/extended.py index be6e3edf3..0f37249f4 100644 --- a/python/snewpy/models/extended.py +++ b/python/snewpy/models/extended.py @@ -47,8 +47,8 @@ def _get_initial_spectra_dict(self, t, E, flavors=ThreeFlavor): array = {} for flavor in flavors: array[flavor] = base_model_spectra[flavor] - extended_model_spectra[flavor] = np.outer( f_ext, base_model_spectra[flavor][-1,:]) - array[flavor].append(extended_model_spectra[flavor]) + extended_model_spectra = np.outer( f_ext, base_model_spectra[flavor][-1,:]) + array[flavor].append(extended_model_spectra) return array From 1fe2c1e4660cd777f407ef43c481cdbb3d9a7e49 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 14 Jul 2026 13:12:18 -0400 Subject: [PATCH 27/40] Update extended.py --- python/snewpy/models/extended.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/snewpy/models/extended.py b/python/snewpy/models/extended.py index 0f37249f4..c57245ba3 100644 --- a/python/snewpy/models/extended.py +++ b/python/snewpy/models/extended.py @@ -48,7 +48,7 @@ def _get_initial_spectra_dict(self, t, E, flavors=ThreeFlavor): for flavor in flavors: array[flavor] = base_model_spectra[flavor] extended_model_spectra = np.outer( f_ext, base_model_spectra[flavor][-1,:]) - array[flavor].append(extended_model_spectra) + array[flavor] = np.append(array[flavor],extended_model_spectra) return array From ae9de15ae3a742237ed30ac113f0d8f29ec410a8 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 14 Jul 2026 16:38:24 -0400 Subject: [PATCH 28/40] Delete doc/source/nb/dev/ExtendedCoolingTail.ipynb --- doc/source/nb/dev/ExtendedCoolingTail.ipynb | 195 -------------------- 1 file changed, 195 deletions(-) delete mode 100644 doc/source/nb/dev/ExtendedCoolingTail.ipynb diff --git a/doc/source/nb/dev/ExtendedCoolingTail.ipynb b/doc/source/nb/dev/ExtendedCoolingTail.ipynb deleted file mode 100644 index f0b166f0e..000000000 --- a/doc/source/nb/dev/ExtendedCoolingTail.ipynb +++ /dev/null @@ -1,195 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "bb730907", - "metadata": {}, - "source": [ - "# Extended Cooling Tail" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "18341676-5496-4da6-a722-7e730791387a", - "metadata": {}, - "outputs": [], - "source": [ - "from snewpy.models.ccsn import Nakazato_2013\n", - "from snewpy.models.extended import ExtendedModel\n", - "from snewpy.neutrino import Flavor, MassHierarchy\n", - "\n", - "from astropy import units as u\n", - "\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt" - ] - }, - { - "cell_type": "markdown", - "id": "944473f5-309f-4d65-b857-99f07d496a37", - "metadata": {}, - "source": [ - "## Model Initialization\n", - "\n", - "Let's use a model from the `Nakazato_2013` family of simulations. There are many model parameters to choose from:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5a329b2c-58be-42d5-be06-70d0afebb633", - "metadata": {}, - "outputs": [], - "source": [ - "Nakazato_2013.param" - ] - }, - { - "cell_type": "markdown", - "id": "11432208-7c45-46d7-b1dc-6bf6d52d0b31", - "metadata": {}, - "source": [ - "Since there are many valid and invalid combinations of parameters available, we will generate a list of valid parameters using the class function `get_param_combinations` and then select one of the particular models for plotting.\n", - "\n", - "It is not really important which model we choose, so we'll pick a large metallicity model (high $Z$)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "62291165-b6db-4dab-b80a-d45058583a83", - "metadata": {}, - "outputs": [], - "source": [ - "highZ_models = list(params for params in Nakazato_2013.get_param_combinations() if params['metallicity'] == 0.02)" - ] - }, - { - "cell_type": "markdown", - "id": "2d791680-42ec-4910-9c40-07749938156a", - "metadata": {}, - "source": [ - "This should be equivalent to the initialization:\n", - "```\n", - "model = Nakazato_2013(progenitor_mass=20< Date: Tue, 14 Jul 2026 16:38:52 -0400 Subject: [PATCH 29/40] Add files via upload --- doc/source/nb/dev/ExtendedCoolingTail.ipynb | 389 ++++++++++++++++++++ 1 file changed, 389 insertions(+) create mode 100644 doc/source/nb/dev/ExtendedCoolingTail.ipynb diff --git a/doc/source/nb/dev/ExtendedCoolingTail.ipynb b/doc/source/nb/dev/ExtendedCoolingTail.ipynb new file mode 100644 index 000000000..52fcd0c14 --- /dev/null +++ b/doc/source/nb/dev/ExtendedCoolingTail.ipynb @@ -0,0 +1,389 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "bb730907", + "metadata": {}, + "source": [ + "# Extended Cooling Tail" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "18341676-5496-4da6-a722-7e730791387a", + "metadata": {}, + "outputs": [], + "source": [ + "from snewpy.models.ccsn import Nakazato_2013\n", + "from snewpy.models.extended import ExtendedModel\n", + "from snewpy.flavor import ThreeFlavor\n", + "\n", + "from astropy import units as u\n", + "\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "markdown", + "id": "944473f5-309f-4d65-b857-99f07d496a37", + "metadata": {}, + "source": [ + "## Model Initialization\n", + "\n", + "Let's use a model from the `Nakazato_2013` family of simulations. There are many model parameters to choose from:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "5a329b2c-58be-42d5-be06-70d0afebb633", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'progenitor_mass': ,\n", + " 'revival_time': ,\n", + " 'metallicity': [0.02, 0.004],\n", + " 'eos': ['LS220', 'shen', 'togashi']}" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Nakazato_2013.param" + ] + }, + { + "cell_type": "markdown", + "id": "11432208-7c45-46d7-b1dc-6bf6d52d0b31", + "metadata": {}, + "source": [ + "Since there are many valid and invalid combinations of parameters available, we will generate a list of valid parameters using the class function `get_param_combinations` and then select one of the particular models for plotting.\n", + "\n", + "It is not really important which model we choose, so we'll pick a large metallicity model (high $Z$)." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "62291165-b6db-4dab-b80a-d45058583a83", + "metadata": {}, + "outputs": [], + "source": [ + "highZ_models = list(params for params in Nakazato_2013.get_param_combinations() if params['metallicity'] == 0.02)" + ] + }, + { + "cell_type": "markdown", + "id": "2d791680-42ec-4910-9c40-07749938156a", + "metadata": {}, + "source": [ + "This should be equivalent to the initialization:\n", + "```\n", + "model = Nakazato_2013(progenitor_mass=20<" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "energy = np.linspace(0,100,3) * u.MeV\n", + "times = model.get_time()\n", + "spectrum = model.get_initial_spectra(t=times, E=energy)\n", + "spectrum2 = model._get_initial_spectra_dict(t=times, E=energy)\n", + "print(spectrum2[ThreeFlavor.NU_E].shape)\n", + "\n", + "fig, ax = plt.subplots(1, figsize=(8,6), tight_layout=False)\n", + "for flavor in ThreeFlavor:\n", + " ax.plot(times, spectrum[flavor].array.squeeze(),\n", + " label=flavor.to_tex(),\n", + " color = 'C0' if flavor.is_electron else 'C1',\n", + " ls = '-' if flavor.is_neutrino else ':',\n", + " lw = 2 )\n", + "\n", + "ax.set(xlim=( (times[0]-0.5*u.s).value , (times[-1]+0.5*u.s).value ),\n", + " xlabel=r'$t-t_{\\rm bounce}$ [s]',\n", + " ylabel=r'flux',\n", + " yscale='log',\n", + " ylim=(1e50,1e57))\n", + "ax.grid()\n", + "ax.legend(loc='upper right', ncol=2, fontsize=18);" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "c25465ef-53be-42e7-ba9d-7b20f47fdaad", + "metadata": {}, + "outputs": [], + "source": [ + "ext_model = ExtendedModel(model)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "6ffad09c-7472-452f-a596-ee684db735e5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf inf inf\n", + " inf inf inf inf 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", + " 24.65695591 24.65695591] s\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/jpknelle/.local/lib/python3.12/site-packages/snewpy/models/extended.py:69: UserWarning: Extended luminosity model not applicable to early times\n", + " warn(\"Extended luminosity model not applicable to early times\")\n", + "/home/jpknelle/.local/lib/python3.12/site-packages/snewpy/models/extended.py:71: RuntimeWarning: divide by zero encountered in power\n", + " return self.A * times**self.k * np.exp(-(times/self.tau_c).value**self.alpha)\n", + "/home/jpknelle/.local/lib/python3.12/site-packages/numpy/_core/numeric.py:989: RuntimeWarning: invalid value encountered in multiply\n", + " return multiply(a.ravel()[:, newaxis], b.ravel()[newaxis, :], out)\n" + ] + }, + { + "ename": "UnitConversionError", + "evalue": "'1 / erg' and '1 / (erg s)' are not convertible", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mUnitConversionError\u001b[0m Traceback (most recent call last)", + "File \u001b[0;32m~/.local/lib/python3.12/site-packages/astropy/units/quantity.py:992\u001b[0m, in \u001b[0;36mQuantity.to_value\u001b[0;34m(self, unit, equivalencies)\u001b[0m\n\u001b[1;32m 991\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 992\u001b[0m scale \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43munit\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_to\u001b[49m\u001b[43m(\u001b[49m\u001b[43munit\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 993\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m:\n\u001b[1;32m 994\u001b[0m \u001b[38;5;66;03m# Short-cut failed; try default (maybe equivalencies help).\u001b[39;00m\n", + "File \u001b[0;32m~/.local/lib/python3.12/site-packages/astropy/units/core.py:623\u001b[0m, in \u001b[0;36mUnitBase._to\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 621\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m self_decomposed\u001b[38;5;241m.\u001b[39mscale \u001b[38;5;241m/\u001b[39m other_decomposed\u001b[38;5;241m.\u001b[39mscale\n\u001b[0;32m--> 623\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m UnitConversionError(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;132;01m!r}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m is not a scaled version of \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mother\u001b[38;5;132;01m!r}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", + "\u001b[0;31mUnitConversionError\u001b[0m: 'Unit(\"1 / erg\")' is not a scaled version of 'Unit(\"1 / (erg s)\")'", + "\nDuring handling of the above exception, another exception occurred:\n", + "\u001b[0;31mUnitConversionError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[9], line 5\u001b[0m\n\u001b[1;32m 2\u001b[0m t_ext \u001b[38;5;241m=\u001b[39m ext_times \u001b[38;5;241m>\u001b[39m model\u001b[38;5;241m.\u001b[39mtime[\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m]\n\u001b[1;32m 3\u001b[0m \u001b[38;5;28mprint\u001b[39m(ext_model\u001b[38;5;241m.\u001b[39mget_extended_time_dependence(t_ext))\n\u001b[0;32m----> 5\u001b[0m ext_spectrum \u001b[38;5;241m=\u001b[39m \u001b[43mext_model\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_initial_spectra\u001b[49m\u001b[43m(\u001b[49m\u001b[43mt\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mext_times\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mE\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43menergy\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 7\u001b[0m fig, ax \u001b[38;5;241m=\u001b[39m plt\u001b[38;5;241m.\u001b[39msubplots(\u001b[38;5;241m1\u001b[39m, figsize\u001b[38;5;241m=\u001b[39m(\u001b[38;5;241m8\u001b[39m,\u001b[38;5;241m6\u001b[39m), tight_layout\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\n\u001b[1;32m 8\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m flavor \u001b[38;5;129;01min\u001b[39;00m ThreeFlavor:\n", + "File \u001b[0;32m~/.local/lib/python3.12/site-packages/snewpy/models/base.py:134\u001b[0m, in \u001b[0;36mSupernovaModel.get_initial_spectra\u001b[0;34m(self, t, E)\u001b[0m\n\u001b[1;32m 119\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mget_initial_spectra\u001b[39m(\u001b[38;5;28mself\u001b[39m, t, E):\n\u001b[1;32m 120\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Get neutrino spectra at the source.\u001b[39;00m\n\u001b[1;32m 121\u001b[0m \n\u001b[1;32m 122\u001b[0m \u001b[38;5;124;03m Parameters\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 132\u001b[0m \u001b[38;5;124;03m A container with the information about the initial neutrino spectra\u001b[39;00m\n\u001b[1;32m 133\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 134\u001b[0m spectra_dict \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_get_initial_spectra_dict\u001b[49m\u001b[43m(\u001b[49m\u001b[43mt\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mE\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mflavors\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mThreeFlavor\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 135\u001b[0m initial_spectra \u001b[38;5;241m=\u001b[39m flux\u001b[38;5;241m.\u001b[39mContainer[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m1/(MeV*s)\u001b[39m\u001b[38;5;124m'\u001b[39m]\u001b[38;5;241m.\u001b[39mfrom_dict(spectra_dict, \n\u001b[1;32m 136\u001b[0m time\u001b[38;5;241m=\u001b[39mt,\n\u001b[1;32m 137\u001b[0m energy\u001b[38;5;241m=\u001b[39mE,\n\u001b[1;32m 138\u001b[0m flavor_scheme\u001b[38;5;241m=\u001b[39mThreeFlavor)\n\u001b[1;32m 139\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m initial_spectra\n", + "File \u001b[0;32m~/.local/lib/python3.12/site-packages/snewpy/models/extended.py:51\u001b[0m, in \u001b[0;36mExtendedModel._get_initial_spectra_dict\u001b[0;34m(self, t, E, flavors)\u001b[0m\n\u001b[1;32m 49\u001b[0m array[flavor] \u001b[38;5;241m=\u001b[39m base_model_spectra[flavor]\n\u001b[1;32m 50\u001b[0m extended_model_spectra \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mouter( f_ext, base_model_spectra[flavor][\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m,:])\n\u001b[0;32m---> 51\u001b[0m array[flavor] \u001b[38;5;241m=\u001b[39m \u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mappend\u001b[49m\u001b[43m(\u001b[49m\u001b[43marray\u001b[49m\u001b[43m[\u001b[49m\u001b[43mflavor\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43mextended_model_spectra\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 53\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m array\n", + "File \u001b[0;32m~/.local/lib/python3.12/site-packages/astropy/units/quantity.py:1897\u001b[0m, in \u001b[0;36mQuantity.__array_function__\u001b[0;34m(self, function, types, args, kwargs)\u001b[0m\n\u001b[1;32m 1895\u001b[0m function_helper \u001b[38;5;241m=\u001b[39m FUNCTION_HELPERS[function]\n\u001b[1;32m 1896\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m-> 1897\u001b[0m args, kwargs, unit, out \u001b[38;5;241m=\u001b[39m \u001b[43mfunction_helper\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1898\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mNotImplementedError\u001b[39;00m:\n\u001b[1;32m 1899\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_not_implemented_or_raise(function, types)\n", + "File \u001b[0;32m~/.local/lib/python3.12/site-packages/astropy/units/quantity_helper/function_helpers.py:805\u001b[0m, in \u001b[0;36mappend\u001b[0;34m(arr, values, *args, **kwargs)\u001b[0m\n\u001b[1;32m 803\u001b[0m \u001b[38;5;129m@function_helper\u001b[39m\n\u001b[1;32m 804\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mappend\u001b[39m(arr, values, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[0;32m--> 805\u001b[0m arrays, unit \u001b[38;5;241m=\u001b[39m \u001b[43m_quantities2arrays\u001b[49m\u001b[43m(\u001b[49m\u001b[43marr\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mvalues\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43munit_from_first\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 806\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m arrays \u001b[38;5;241m+\u001b[39m args, kwargs, unit, \u001b[38;5;28;01mNone\u001b[39;00m\n", + "File \u001b[0;32m~/.local/lib/python3.12/site-packages/astropy/units/quantity_helper/function_helpers.py:443\u001b[0m, in \u001b[0;36m_quantities2arrays\u001b[0;34m(unit_from_first, *args)\u001b[0m\n\u001b[1;32m 439\u001b[0m \u001b[38;5;66;03m# We use the private _to_own_unit method here instead of just\u001b[39;00m\n\u001b[1;32m 440\u001b[0m \u001b[38;5;66;03m# converting everything to quantity and then do .to_value(qs0.unit)\u001b[39;00m\n\u001b[1;32m 441\u001b[0m \u001b[38;5;66;03m# as we want to allow arbitrary unit for 0, inf, and nan.\u001b[39;00m\n\u001b[1;32m 442\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 443\u001b[0m arrays \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mtuple\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m(\u001b[49m\u001b[43mq\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_to_own_unit\u001b[49m\u001b[43m(\u001b[49m\u001b[43marg\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43marg\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43margs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 444\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m:\n\u001b[1;32m 445\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mNotImplementedError\u001b[39;00m\n", + "File \u001b[0;32m~/.local/lib/python3.12/site-packages/astropy/units/quantity_helper/function_helpers.py:443\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 439\u001b[0m \u001b[38;5;66;03m# We use the private _to_own_unit method here instead of just\u001b[39;00m\n\u001b[1;32m 440\u001b[0m \u001b[38;5;66;03m# converting everything to quantity and then do .to_value(qs0.unit)\u001b[39;00m\n\u001b[1;32m 441\u001b[0m \u001b[38;5;66;03m# as we want to allow arbitrary unit for 0, inf, and nan.\u001b[39;00m\n\u001b[1;32m 442\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 443\u001b[0m arrays \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mtuple\u001b[39m((\u001b[43mq\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_to_own_unit\u001b[49m\u001b[43m(\u001b[49m\u001b[43marg\u001b[49m\u001b[43m)\u001b[49m) \u001b[38;5;28;01mfor\u001b[39;00m arg \u001b[38;5;129;01min\u001b[39;00m args)\n\u001b[1;32m 444\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m:\n\u001b[1;32m 445\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mNotImplementedError\u001b[39;00m\n", + "File \u001b[0;32m~/.local/lib/python3.12/site-packages/astropy/units/quantity.py:1713\u001b[0m, in \u001b[0;36mQuantity._to_own_unit\u001b[0;34m(self, value, check_precision, unit)\u001b[0m\n\u001b[1;32m 1711\u001b[0m unit \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39munit\n\u001b[1;32m 1712\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m-> 1713\u001b[0m _value \u001b[38;5;241m=\u001b[39m \u001b[43mvalue\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mto_value\u001b[49m\u001b[43m(\u001b[49m\u001b[43munit\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1714\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mAttributeError\u001b[39;00m:\n\u001b[1;32m 1715\u001b[0m \u001b[38;5;66;03m# We're not a Quantity.\u001b[39;00m\n\u001b[1;32m 1716\u001b[0m \u001b[38;5;66;03m# First remove two special cases (with a fast test):\u001b[39;00m\n\u001b[1;32m 1717\u001b[0m \u001b[38;5;66;03m# 1) Maybe masked printing? MaskedArray with quantities does not\u001b[39;00m\n\u001b[1;32m 1718\u001b[0m \u001b[38;5;66;03m# work very well, but no reason to break even repr and str.\u001b[39;00m\n\u001b[1;32m 1719\u001b[0m \u001b[38;5;66;03m# 2) np.ma.masked? useful if we're a MaskedQuantity.\u001b[39;00m\n\u001b[1;32m 1720\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m value \u001b[38;5;129;01mis\u001b[39;00m np\u001b[38;5;241m.\u001b[39mma\u001b[38;5;241m.\u001b[39mmasked \u001b[38;5;129;01mor\u001b[39;00m (\n\u001b[1;32m 1721\u001b[0m value \u001b[38;5;129;01mis\u001b[39;00m np\u001b[38;5;241m.\u001b[39mma\u001b[38;5;241m.\u001b[39mmasked_print_option \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdtype\u001b[38;5;241m.\u001b[39mkind \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mO\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 1722\u001b[0m ):\n", + "File \u001b[0;32m~/.local/lib/python3.12/site-packages/astropy/units/quantity.py:995\u001b[0m, in \u001b[0;36mQuantity.to_value\u001b[0;34m(self, unit, equivalencies)\u001b[0m\n\u001b[1;32m 992\u001b[0m scale \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39munit\u001b[38;5;241m.\u001b[39m_to(unit)\n\u001b[1;32m 993\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m:\n\u001b[1;32m 994\u001b[0m \u001b[38;5;66;03m# Short-cut failed; try default (maybe equivalencies help).\u001b[39;00m\n\u001b[0;32m--> 995\u001b[0m value \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_to_value\u001b[49m\u001b[43m(\u001b[49m\u001b[43munit\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mequivalencies\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 996\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 997\u001b[0m value \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mview(np\u001b[38;5;241m.\u001b[39mndarray)\n", + "File \u001b[0;32m~/.local/lib/python3.12/site-packages/astropy/units/quantity.py:901\u001b[0m, in \u001b[0;36mQuantity._to_value\u001b[0;34m(self, unit, equivalencies)\u001b[0m\n\u001b[1;32m 898\u001b[0m equivalencies \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_equivalencies\n\u001b[1;32m 899\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdtype\u001b[38;5;241m.\u001b[39mnames \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39munit, StructuredUnit):\n\u001b[1;32m 900\u001b[0m \u001b[38;5;66;03m# Standard path, let unit to do work.\u001b[39;00m\n\u001b[0;32m--> 901\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43munit\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mto\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 902\u001b[0m \u001b[43m \u001b[49m\u001b[43munit\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mview\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mndarray\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mequivalencies\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mequivalencies\u001b[49m\n\u001b[1;32m 903\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 905\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 906\u001b[0m \u001b[38;5;66;03m# The .to() method of a simple unit cannot convert a structured\u001b[39;00m\n\u001b[1;32m 907\u001b[0m \u001b[38;5;66;03m# dtype, so we work around it, by recursing.\u001b[39;00m\n\u001b[1;32m 908\u001b[0m \u001b[38;5;66;03m# TODO: deprecate this?\u001b[39;00m\n\u001b[1;32m 909\u001b[0m \u001b[38;5;66;03m# Convert simple to Structured on initialization?\u001b[39;00m\n\u001b[1;32m 910\u001b[0m result \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mempty_like(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mview(np\u001b[38;5;241m.\u001b[39mndarray))\n", + "File \u001b[0;32m~/.local/lib/python3.12/site-packages/astropy/units/core.py:659\u001b[0m, in \u001b[0;36mUnitBase.to\u001b[0;34m(self, other, value, equivalencies)\u001b[0m\n\u001b[1;32m 657\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m UNITY\n\u001b[1;32m 658\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 659\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_converter\u001b[49m\u001b[43m(\u001b[49m\u001b[43mUnit\u001b[49m\u001b[43m(\u001b[49m\u001b[43mother\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mequivalencies\u001b[49m\u001b[43m)\u001b[49m(value)\n", + "File \u001b[0;32m~/.local/lib/python3.12/site-packages/astropy/units/core.py:588\u001b[0m, in \u001b[0;36mUnitBase.get_converter\u001b[0;34m(self, other, equivalencies)\u001b[0m\n\u001b[1;32m 585\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 586\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mlambda\u001b[39;00m v: b(converter(v))\n\u001b[0;32m--> 588\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m exc\n", + "File \u001b[0;32m~/.local/lib/python3.12/site-packages/astropy/units/core.py:571\u001b[0m, in \u001b[0;36mUnitBase.get_converter\u001b[0;34m(self, other, equivalencies)\u001b[0m\n\u001b[1;32m 569\u001b[0m \u001b[38;5;66;03m# if that doesn't work, maybe we can do it with equivalencies?\u001b[39;00m\n\u001b[1;32m 570\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 571\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_apply_equivalencies\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 572\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mother\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_normalize_equivalencies\u001b[49m\u001b[43m(\u001b[49m\u001b[43mequivalencies\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 573\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 574\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m UnitsError \u001b[38;5;28;01mas\u001b[39;00m exc:\n\u001b[1;32m 575\u001b[0m \u001b[38;5;66;03m# Last hope: maybe other knows how to do it?\u001b[39;00m\n\u001b[1;32m 576\u001b[0m \u001b[38;5;66;03m# We assume the equivalencies have the unit itself as first item.\u001b[39;00m\n\u001b[1;32m 577\u001b[0m \u001b[38;5;66;03m# TODO: maybe better for other to have a `_back_converter` method?\u001b[39;00m\n\u001b[1;32m 578\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mhasattr\u001b[39m(other, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mequivalencies\u001b[39m\u001b[38;5;124m\"\u001b[39m):\n", + "File \u001b[0;32m~/.local/lib/python3.12/site-packages/astropy/units/core.py:522\u001b[0m, in \u001b[0;36mUnitBase._apply_equivalencies\u001b[0;34m(self, unit, other, equivalencies)\u001b[0m\n\u001b[1;32m 519\u001b[0m unit_str \u001b[38;5;241m=\u001b[39m get_err_str(unit)\n\u001b[1;32m 520\u001b[0m other_str \u001b[38;5;241m=\u001b[39m get_err_str(other)\n\u001b[0;32m--> 522\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m UnitConversionError(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00munit_str\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m and \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mother_str\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m are not convertible\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", + "\u001b[0;31mUnitConversionError\u001b[0m: '1 / erg' and '1 / (erg s)' are not convertible" + ] + } + ], + "source": [ + "\n", + "ext_times = np.linspace(times[0],2*times[-1],500)\n", + "t_ext = ext_times > model.time[-1]\n", + "print(ext_model.get_extended_time_dependence(t_ext))\n", + "\n", + "ext_spectrum = ext_model.get_initial_spectra(t=ext_times, E=energy)\n", + "\n", + "fig, ax = plt.subplots(1, figsize=(8,6), tight_layout=False)\n", + "for flavor in ThreeFlavor:\n", + " ax.plot(ext_times, ext_spectrum[flavor].array.squeeze(),\n", + " label=flavor.to_tex(),\n", + " color = 'C0' if flavor.is_electron else 'C1',\n", + " ls = '-' if flavor.is_neutrino else ':',\n", + " lw = 2 )\n", + "\n", + "ax.set(xlim=( (times[0]-0.5*u.s).value , (times[-1]+0.5*u.s).value ),\n", + " xlabel=r'$t-t_{\\rm bounce}$ [s]',\n", + " ylabel=r'flux',\n", + " yscale='log',\n", + " ylim=(1e50,1e57))\n", + "ax.grid()\n", + "ax.legend(loc='upper right', ncol=2, fontsize=18);" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "09334339-eba3-4f52-a712-b9345ad8b385", + "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.12.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From a173b35bd2c882a9c9d8313c0dcf7293c610ebd4 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 14 Jul 2026 16:42:09 -0400 Subject: [PATCH 30/40] Update ExtendedCoolingTail.ipynb --- doc/source/nb/dev/ExtendedCoolingTail.ipynb | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/doc/source/nb/dev/ExtendedCoolingTail.ipynb b/doc/source/nb/dev/ExtendedCoolingTail.ipynb index 52fcd0c14..108c66cae 100644 --- a/doc/source/nb/dev/ExtendedCoolingTail.ipynb +++ b/doc/source/nb/dev/ExtendedCoolingTail.ipynb @@ -160,11 +160,9 @@ } ], "source": [ - "energy = np.linspace(0,100,3) * u.MeV\n", + "energy =20 * u.MeV\n", "times = model.get_time()\n", "spectrum = model.get_initial_spectra(t=times, E=energy)\n", - "spectrum2 = model._get_initial_spectra_dict(t=times, E=energy)\n", - "print(spectrum2[ThreeFlavor.NU_E].shape)\n", "\n", "fig, ax = plt.subplots(1, figsize=(8,6), tight_layout=False)\n", "for flavor in ThreeFlavor:\n", @@ -334,8 +332,6 @@ "source": [ "\n", "ext_times = np.linspace(times[0],2*times[-1],500)\n", - "t_ext = ext_times > model.time[-1]\n", - "print(ext_model.get_extended_time_dependence(t_ext))\n", "\n", "ext_spectrum = ext_model.get_initial_spectra(t=ext_times, E=energy)\n", "\n", From 2acfa26a0f72547899f5649abde4a69f82c88040 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 14 Jul 2026 19:42:02 -0400 Subject: [PATCH 31/40] Update extended.py --- python/snewpy/models/extended.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/snewpy/models/extended.py b/python/snewpy/models/extended.py index c57245ba3..2dc31727f 100644 --- a/python/snewpy/models/extended.py +++ b/python/snewpy/models/extended.py @@ -53,7 +53,7 @@ def _get_initial_spectra_dict(self, t, E, flavors=ThreeFlavor): return array def get_extended_time_dependence(self, times): - """Get neutrino luminosity from supernova cooling tail luminosity model. + """Get time dependence of extended times from supernova cooling tail model. Parameters ---------- From 72543d3591fd20138b0252fe49b887fb984bc1d1 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 14 Jul 2026 19:43:56 -0400 Subject: [PATCH 32/40] Update ExtendedCoolingTail.ipynb --- doc/source/nb/dev/ExtendedCoolingTail.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/nb/dev/ExtendedCoolingTail.ipynb b/doc/source/nb/dev/ExtendedCoolingTail.ipynb index 108c66cae..c03676c01 100644 --- a/doc/source/nb/dev/ExtendedCoolingTail.ipynb +++ b/doc/source/nb/dev/ExtendedCoolingTail.ipynb @@ -132,7 +132,7 @@ "id": "0adb675d-9aa9-4ecf-80c3-0090d0025137", "metadata": {}, "source": [ - "Plot the model neutrino luminosity versus time." + "Plot the model's neutrino fluxes for E = 20 MeV versus time." ] }, { From 1f49dbeffa702ee640c692fae2cc24fce5ae0994 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Tue, 14 Jul 2026 20:32:48 -0400 Subject: [PATCH 33/40] Update extended.py --- python/snewpy/models/extended.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/python/snewpy/models/extended.py b/python/snewpy/models/extended.py index 2dc31727f..df8e2af8c 100644 --- a/python/snewpy/models/extended.py +++ b/python/snewpy/models/extended.py @@ -37,9 +37,10 @@ def _get_initial_spectra_dict(self, t, E, flavors=ThreeFlavor): #convert input arguments to 1D arrays t = u.Quantity(t, ndmin=1) E = u.Quantity(E, ndmin=1) + Nt, NE = len(t), len(E) base_model_spectra = self.base_model._get_initial_spectra_dict(t, E) - + # Select times after the end of the model t_ext = t > self.time[-1] f_ext = self.get_extended_time_dependence(t_ext) @@ -47,10 +48,15 @@ def _get_initial_spectra_dict(self, t, E, flavors=ThreeFlavor): array = {} for flavor in flavors: array[flavor] = base_model_spectra[flavor] - extended_model_spectra = np.outer( f_ext, base_model_spectra[flavor][-1,:]) + if Nt == 1: + array[flavor] = np.expand_dims(array[flavor], axis=0) + if NE == 1: + array[flavor] = np.expand_dims(array[flavor], axis=1) + + extended_model_spectra = np.outer( f_ext, array[flavor][-1,:]) array[flavor] = np.append(array[flavor],extended_model_spectra) - return array + return array.squeeze() def get_extended_time_dependence(self, times): """Get time dependence of extended times from supernova cooling tail model. From 7bca45536de87240d69fabac313a7be860f5825a Mon Sep 17 00:00:00 2001 From: jpkneller Date: Wed, 15 Jul 2026 08:18:14 -0400 Subject: [PATCH 34/40] Update extended.py --- python/snewpy/models/extended.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/snewpy/models/extended.py b/python/snewpy/models/extended.py index df8e2af8c..8bf2b0481 100644 --- a/python/snewpy/models/extended.py +++ b/python/snewpy/models/extended.py @@ -42,7 +42,7 @@ def _get_initial_spectra_dict(self, t, E, flavors=ThreeFlavor): base_model_spectra = self.base_model._get_initial_spectra_dict(t, E) # Select times after the end of the model - t_ext = t > self.time[-1] + t_ext = t[t>self.time[-1]] f_ext = self.get_extended_time_dependence(t_ext) array = {} From 550f5f5e38dd84997dc55f84c599b3c14b66db63 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Wed, 15 Jul 2026 08:28:15 -0400 Subject: [PATCH 35/40] Update extended.py --- python/snewpy/models/extended.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python/snewpy/models/extended.py b/python/snewpy/models/extended.py index 8bf2b0481..51ae711a0 100644 --- a/python/snewpy/models/extended.py +++ b/python/snewpy/models/extended.py @@ -55,8 +55,9 @@ def _get_initial_spectra_dict(self, t, E, flavors=ThreeFlavor): extended_model_spectra = np.outer( f_ext, array[flavor][-1,:]) array[flavor] = np.append(array[flavor],extended_model_spectra) + array[flavor] = array[flavor].squeeze() - return array.squeeze() + return array def get_extended_time_dependence(self, times): """Get time dependence of extended times from supernova cooling tail model. From 2c5a95cefdf371f397833e30bba7a7a39612ace5 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Wed, 15 Jul 2026 08:31:23 -0400 Subject: [PATCH 36/40] Update extended.py --- python/snewpy/models/extended.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python/snewpy/models/extended.py b/python/snewpy/models/extended.py index 51ae711a0..7e954a0ee 100644 --- a/python/snewpy/models/extended.py +++ b/python/snewpy/models/extended.py @@ -39,7 +39,8 @@ def _get_initial_spectra_dict(self, t, E, flavors=ThreeFlavor): E = u.Quantity(E, ndmin=1) Nt, NE = len(t), len(E) - base_model_spectra = self.base_model._get_initial_spectra_dict(t, E) + t_model = t[t <= self.time[-1]] + base_model_spectra = self.base_model._get_initial_spectra_dict(t_model, E) # Select times after the end of the model t_ext = t[t>self.time[-1]] From 7ab75ad208daa31474da2b934f2e2621d0a57c34 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Wed, 15 Jul 2026 13:01:05 -0400 Subject: [PATCH 37/40] Update extended.py --- python/snewpy/models/extended.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/python/snewpy/models/extended.py b/python/snewpy/models/extended.py index 7e954a0ee..06a299135 100644 --- a/python/snewpy/models/extended.py +++ b/python/snewpy/models/extended.py @@ -55,8 +55,7 @@ def _get_initial_spectra_dict(self, t, E, flavors=ThreeFlavor): array[flavor] = np.expand_dims(array[flavor], axis=1) extended_model_spectra = np.outer( f_ext, array[flavor][-1,:]) - array[flavor] = np.append(array[flavor],extended_model_spectra) - array[flavor] = array[flavor].squeeze() + array[flavor] = np.append(array[flavor],extended_model_spectra) return array From cc9073bb6f8efb826642e2e413b3f7ebf072780a Mon Sep 17 00:00:00 2001 From: jpkneller Date: Wed, 15 Jul 2026 14:42:59 -0400 Subject: [PATCH 38/40] Update extended.py --- python/snewpy/models/extended.py | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/python/snewpy/models/extended.py b/python/snewpy/models/extended.py index 06a299135..4813488a0 100644 --- a/python/snewpy/models/extended.py +++ b/python/snewpy/models/extended.py @@ -36,26 +36,25 @@ def _get_initial_spectra_dict(self, t, E, flavors=ThreeFlavor): """ #convert input arguments to 1D arrays t = u.Quantity(t, ndmin=1) - E = u.Quantity(E, ndmin=1) - Nt, NE = len(t), len(E) - + E = u.Quantity(E, ndmin=1) + t_model = t[t <= self.time[-1]] base_model_spectra = self.base_model._get_initial_spectra_dict(t_model, E) - + for flavor in base_model_spectra: + if len(t_model) == 1: + base_model_spectra[flavor] = np.expand_dims(base_model_spectra[flavor], axis=0) + if len(E) == 1: + base_model_spectra[flavor] = np.expand_dims(base_model_spectra[flavor], axis=1) + # Select times after the end of the model - t_ext = t[t>self.time[-1]] + t_ext = t[t > self.time[-1]] f_ext = self.get_extended_time_dependence(t_ext) - + array = {} for flavor in flavors: - array[flavor] = base_model_spectra[flavor] - if Nt == 1: - array[flavor] = np.expand_dims(array[flavor], axis=0) - if NE == 1: - array[flavor] = np.expand_dims(array[flavor], axis=1) - - extended_model_spectra = np.outer( f_ext, array[flavor][-1,:]) - array[flavor] = np.append(array[flavor],extended_model_spectra) + extended_model_spectra = np.outer(f_ext , base_model_spectra[flavor][-1,:]) + array[flavor] = np.append(base_model_spectra[flavor],extended_model_spectra,axis=0) + array[flavor] = array[flavor].squeeze() return array From 8510fd1c88f40ff724ff39e5431edb5331270598 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Wed, 15 Jul 2026 15:02:54 -0400 Subject: [PATCH 39/40] Delete doc/source/nb/dev/ExtendedCoolingTail.ipynb --- doc/source/nb/dev/ExtendedCoolingTail.ipynb | 385 -------------------- 1 file changed, 385 deletions(-) delete mode 100644 doc/source/nb/dev/ExtendedCoolingTail.ipynb diff --git a/doc/source/nb/dev/ExtendedCoolingTail.ipynb b/doc/source/nb/dev/ExtendedCoolingTail.ipynb deleted file mode 100644 index c03676c01..000000000 --- a/doc/source/nb/dev/ExtendedCoolingTail.ipynb +++ /dev/null @@ -1,385 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "bb730907", - "metadata": {}, - "source": [ - "# Extended Cooling Tail" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "18341676-5496-4da6-a722-7e730791387a", - "metadata": {}, - "outputs": [], - "source": [ - "from snewpy.models.ccsn import Nakazato_2013\n", - "from snewpy.models.extended import ExtendedModel\n", - "from snewpy.flavor import ThreeFlavor\n", - "\n", - "from astropy import units as u\n", - "\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt" - ] - }, - { - "cell_type": "markdown", - "id": "944473f5-309f-4d65-b857-99f07d496a37", - "metadata": {}, - "source": [ - "## Model Initialization\n", - "\n", - "Let's use a model from the `Nakazato_2013` family of simulations. There are many model parameters to choose from:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "5a329b2c-58be-42d5-be06-70d0afebb633", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'progenitor_mass': ,\n", - " 'revival_time': ,\n", - " 'metallicity': [0.02, 0.004],\n", - " 'eos': ['LS220', 'shen', 'togashi']}" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "Nakazato_2013.param" - ] - }, - { - "cell_type": "markdown", - "id": "11432208-7c45-46d7-b1dc-6bf6d52d0b31", - "metadata": {}, - "source": [ - "Since there are many valid and invalid combinations of parameters available, we will generate a list of valid parameters using the class function `get_param_combinations` and then select one of the particular models for plotting.\n", - "\n", - "It is not really important which model we choose, so we'll pick a large metallicity model (high $Z$)." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "62291165-b6db-4dab-b80a-d45058583a83", - "metadata": {}, - "outputs": [], - "source": [ - "highZ_models = list(params for params in Nakazato_2013.get_param_combinations() if params['metallicity'] == 0.02)" - ] - }, - { - "cell_type": "markdown", - "id": "2d791680-42ec-4910-9c40-07749938156a", - "metadata": {}, - "source": [ - "This should be equivalent to the initialization:\n", - "```\n", - "model = Nakazato_2013(progenitor_mass=20<" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "energy =20 * u.MeV\n", - "times = model.get_time()\n", - "spectrum = model.get_initial_spectra(t=times, E=energy)\n", - "\n", - "fig, ax = plt.subplots(1, figsize=(8,6), tight_layout=False)\n", - "for flavor in ThreeFlavor:\n", - " ax.plot(times, spectrum[flavor].array.squeeze(),\n", - " label=flavor.to_tex(),\n", - " color = 'C0' if flavor.is_electron else 'C1',\n", - " ls = '-' if flavor.is_neutrino else ':',\n", - " lw = 2 )\n", - "\n", - "ax.set(xlim=( (times[0]-0.5*u.s).value , (times[-1]+0.5*u.s).value ),\n", - " xlabel=r'$t-t_{\\rm bounce}$ [s]',\n", - " ylabel=r'flux',\n", - " yscale='log',\n", - " ylim=(1e50,1e57))\n", - "ax.grid()\n", - "ax.legend(loc='upper right', ncol=2, fontsize=18);" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "c25465ef-53be-42e7-ba9d-7b20f47fdaad", - "metadata": {}, - "outputs": [], - "source": [ - "ext_model = ExtendedModel(model)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "6ffad09c-7472-452f-a596-ee684db735e5", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[ inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf inf inf\n", - " inf inf inf inf 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591 24.65695591\n", - " 24.65695591 24.65695591] s\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/jpknelle/.local/lib/python3.12/site-packages/snewpy/models/extended.py:69: UserWarning: Extended luminosity model not applicable to early times\n", - " warn(\"Extended luminosity model not applicable to early times\")\n", - "/home/jpknelle/.local/lib/python3.12/site-packages/snewpy/models/extended.py:71: RuntimeWarning: divide by zero encountered in power\n", - " return self.A * times**self.k * np.exp(-(times/self.tau_c).value**self.alpha)\n", - "/home/jpknelle/.local/lib/python3.12/site-packages/numpy/_core/numeric.py:989: RuntimeWarning: invalid value encountered in multiply\n", - " return multiply(a.ravel()[:, newaxis], b.ravel()[newaxis, :], out)\n" - ] - }, - { - "ename": "UnitConversionError", - "evalue": "'1 / erg' and '1 / (erg s)' are not convertible", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mUnitConversionError\u001b[0m Traceback (most recent call last)", - "File \u001b[0;32m~/.local/lib/python3.12/site-packages/astropy/units/quantity.py:992\u001b[0m, in \u001b[0;36mQuantity.to_value\u001b[0;34m(self, unit, equivalencies)\u001b[0m\n\u001b[1;32m 991\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 992\u001b[0m scale \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43munit\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_to\u001b[49m\u001b[43m(\u001b[49m\u001b[43munit\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 993\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m:\n\u001b[1;32m 994\u001b[0m \u001b[38;5;66;03m# Short-cut failed; try default (maybe equivalencies help).\u001b[39;00m\n", - "File \u001b[0;32m~/.local/lib/python3.12/site-packages/astropy/units/core.py:623\u001b[0m, in \u001b[0;36mUnitBase._to\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 621\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m self_decomposed\u001b[38;5;241m.\u001b[39mscale \u001b[38;5;241m/\u001b[39m other_decomposed\u001b[38;5;241m.\u001b[39mscale\n\u001b[0;32m--> 623\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m UnitConversionError(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;132;01m!r}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m is not a scaled version of \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mother\u001b[38;5;132;01m!r}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", - "\u001b[0;31mUnitConversionError\u001b[0m: 'Unit(\"1 / erg\")' is not a scaled version of 'Unit(\"1 / (erg s)\")'", - "\nDuring handling of the above exception, another exception occurred:\n", - "\u001b[0;31mUnitConversionError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[9], line 5\u001b[0m\n\u001b[1;32m 2\u001b[0m t_ext \u001b[38;5;241m=\u001b[39m ext_times \u001b[38;5;241m>\u001b[39m model\u001b[38;5;241m.\u001b[39mtime[\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m]\n\u001b[1;32m 3\u001b[0m \u001b[38;5;28mprint\u001b[39m(ext_model\u001b[38;5;241m.\u001b[39mget_extended_time_dependence(t_ext))\n\u001b[0;32m----> 5\u001b[0m ext_spectrum \u001b[38;5;241m=\u001b[39m \u001b[43mext_model\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_initial_spectra\u001b[49m\u001b[43m(\u001b[49m\u001b[43mt\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mext_times\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mE\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43menergy\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 7\u001b[0m fig, ax \u001b[38;5;241m=\u001b[39m plt\u001b[38;5;241m.\u001b[39msubplots(\u001b[38;5;241m1\u001b[39m, figsize\u001b[38;5;241m=\u001b[39m(\u001b[38;5;241m8\u001b[39m,\u001b[38;5;241m6\u001b[39m), tight_layout\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\n\u001b[1;32m 8\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m flavor \u001b[38;5;129;01min\u001b[39;00m ThreeFlavor:\n", - "File \u001b[0;32m~/.local/lib/python3.12/site-packages/snewpy/models/base.py:134\u001b[0m, in \u001b[0;36mSupernovaModel.get_initial_spectra\u001b[0;34m(self, t, E)\u001b[0m\n\u001b[1;32m 119\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mget_initial_spectra\u001b[39m(\u001b[38;5;28mself\u001b[39m, t, E):\n\u001b[1;32m 120\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Get neutrino spectra at the source.\u001b[39;00m\n\u001b[1;32m 121\u001b[0m \n\u001b[1;32m 122\u001b[0m \u001b[38;5;124;03m Parameters\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 132\u001b[0m \u001b[38;5;124;03m A container with the information about the initial neutrino spectra\u001b[39;00m\n\u001b[1;32m 133\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 134\u001b[0m spectra_dict \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_get_initial_spectra_dict\u001b[49m\u001b[43m(\u001b[49m\u001b[43mt\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mE\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mflavors\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mThreeFlavor\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 135\u001b[0m initial_spectra \u001b[38;5;241m=\u001b[39m flux\u001b[38;5;241m.\u001b[39mContainer[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m1/(MeV*s)\u001b[39m\u001b[38;5;124m'\u001b[39m]\u001b[38;5;241m.\u001b[39mfrom_dict(spectra_dict, \n\u001b[1;32m 136\u001b[0m time\u001b[38;5;241m=\u001b[39mt,\n\u001b[1;32m 137\u001b[0m energy\u001b[38;5;241m=\u001b[39mE,\n\u001b[1;32m 138\u001b[0m flavor_scheme\u001b[38;5;241m=\u001b[39mThreeFlavor)\n\u001b[1;32m 139\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m initial_spectra\n", - "File \u001b[0;32m~/.local/lib/python3.12/site-packages/snewpy/models/extended.py:51\u001b[0m, in \u001b[0;36mExtendedModel._get_initial_spectra_dict\u001b[0;34m(self, t, E, flavors)\u001b[0m\n\u001b[1;32m 49\u001b[0m array[flavor] \u001b[38;5;241m=\u001b[39m base_model_spectra[flavor]\n\u001b[1;32m 50\u001b[0m extended_model_spectra \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mouter( f_ext, base_model_spectra[flavor][\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m,:])\n\u001b[0;32m---> 51\u001b[0m array[flavor] \u001b[38;5;241m=\u001b[39m \u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mappend\u001b[49m\u001b[43m(\u001b[49m\u001b[43marray\u001b[49m\u001b[43m[\u001b[49m\u001b[43mflavor\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43mextended_model_spectra\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 53\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m array\n", - "File \u001b[0;32m~/.local/lib/python3.12/site-packages/astropy/units/quantity.py:1897\u001b[0m, in \u001b[0;36mQuantity.__array_function__\u001b[0;34m(self, function, types, args, kwargs)\u001b[0m\n\u001b[1;32m 1895\u001b[0m function_helper \u001b[38;5;241m=\u001b[39m FUNCTION_HELPERS[function]\n\u001b[1;32m 1896\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m-> 1897\u001b[0m args, kwargs, unit, out \u001b[38;5;241m=\u001b[39m \u001b[43mfunction_helper\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1898\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mNotImplementedError\u001b[39;00m:\n\u001b[1;32m 1899\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_not_implemented_or_raise(function, types)\n", - "File \u001b[0;32m~/.local/lib/python3.12/site-packages/astropy/units/quantity_helper/function_helpers.py:805\u001b[0m, in \u001b[0;36mappend\u001b[0;34m(arr, values, *args, **kwargs)\u001b[0m\n\u001b[1;32m 803\u001b[0m \u001b[38;5;129m@function_helper\u001b[39m\n\u001b[1;32m 804\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mappend\u001b[39m(arr, values, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[0;32m--> 805\u001b[0m arrays, unit \u001b[38;5;241m=\u001b[39m \u001b[43m_quantities2arrays\u001b[49m\u001b[43m(\u001b[49m\u001b[43marr\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mvalues\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43munit_from_first\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 806\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m arrays \u001b[38;5;241m+\u001b[39m args, kwargs, unit, \u001b[38;5;28;01mNone\u001b[39;00m\n", - "File \u001b[0;32m~/.local/lib/python3.12/site-packages/astropy/units/quantity_helper/function_helpers.py:443\u001b[0m, in \u001b[0;36m_quantities2arrays\u001b[0;34m(unit_from_first, *args)\u001b[0m\n\u001b[1;32m 439\u001b[0m \u001b[38;5;66;03m# We use the private _to_own_unit method here instead of just\u001b[39;00m\n\u001b[1;32m 440\u001b[0m \u001b[38;5;66;03m# converting everything to quantity and then do .to_value(qs0.unit)\u001b[39;00m\n\u001b[1;32m 441\u001b[0m \u001b[38;5;66;03m# as we want to allow arbitrary unit for 0, inf, and nan.\u001b[39;00m\n\u001b[1;32m 442\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 443\u001b[0m arrays \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mtuple\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m(\u001b[49m\u001b[43mq\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_to_own_unit\u001b[49m\u001b[43m(\u001b[49m\u001b[43marg\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43marg\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43margs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 444\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m:\n\u001b[1;32m 445\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mNotImplementedError\u001b[39;00m\n", - "File \u001b[0;32m~/.local/lib/python3.12/site-packages/astropy/units/quantity_helper/function_helpers.py:443\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 439\u001b[0m \u001b[38;5;66;03m# We use the private _to_own_unit method here instead of just\u001b[39;00m\n\u001b[1;32m 440\u001b[0m \u001b[38;5;66;03m# converting everything to quantity and then do .to_value(qs0.unit)\u001b[39;00m\n\u001b[1;32m 441\u001b[0m \u001b[38;5;66;03m# as we want to allow arbitrary unit for 0, inf, and nan.\u001b[39;00m\n\u001b[1;32m 442\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 443\u001b[0m arrays \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mtuple\u001b[39m((\u001b[43mq\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_to_own_unit\u001b[49m\u001b[43m(\u001b[49m\u001b[43marg\u001b[49m\u001b[43m)\u001b[49m) \u001b[38;5;28;01mfor\u001b[39;00m arg \u001b[38;5;129;01min\u001b[39;00m args)\n\u001b[1;32m 444\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m:\n\u001b[1;32m 445\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mNotImplementedError\u001b[39;00m\n", - "File \u001b[0;32m~/.local/lib/python3.12/site-packages/astropy/units/quantity.py:1713\u001b[0m, in \u001b[0;36mQuantity._to_own_unit\u001b[0;34m(self, value, check_precision, unit)\u001b[0m\n\u001b[1;32m 1711\u001b[0m unit \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39munit\n\u001b[1;32m 1712\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m-> 1713\u001b[0m _value \u001b[38;5;241m=\u001b[39m \u001b[43mvalue\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mto_value\u001b[49m\u001b[43m(\u001b[49m\u001b[43munit\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1714\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mAttributeError\u001b[39;00m:\n\u001b[1;32m 1715\u001b[0m \u001b[38;5;66;03m# We're not a Quantity.\u001b[39;00m\n\u001b[1;32m 1716\u001b[0m \u001b[38;5;66;03m# First remove two special cases (with a fast test):\u001b[39;00m\n\u001b[1;32m 1717\u001b[0m \u001b[38;5;66;03m# 1) Maybe masked printing? MaskedArray with quantities does not\u001b[39;00m\n\u001b[1;32m 1718\u001b[0m \u001b[38;5;66;03m# work very well, but no reason to break even repr and str.\u001b[39;00m\n\u001b[1;32m 1719\u001b[0m \u001b[38;5;66;03m# 2) np.ma.masked? useful if we're a MaskedQuantity.\u001b[39;00m\n\u001b[1;32m 1720\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m value \u001b[38;5;129;01mis\u001b[39;00m np\u001b[38;5;241m.\u001b[39mma\u001b[38;5;241m.\u001b[39mmasked \u001b[38;5;129;01mor\u001b[39;00m (\n\u001b[1;32m 1721\u001b[0m value \u001b[38;5;129;01mis\u001b[39;00m np\u001b[38;5;241m.\u001b[39mma\u001b[38;5;241m.\u001b[39mmasked_print_option \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdtype\u001b[38;5;241m.\u001b[39mkind \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mO\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 1722\u001b[0m ):\n", - "File \u001b[0;32m~/.local/lib/python3.12/site-packages/astropy/units/quantity.py:995\u001b[0m, in \u001b[0;36mQuantity.to_value\u001b[0;34m(self, unit, equivalencies)\u001b[0m\n\u001b[1;32m 992\u001b[0m scale \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39munit\u001b[38;5;241m.\u001b[39m_to(unit)\n\u001b[1;32m 993\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m:\n\u001b[1;32m 994\u001b[0m \u001b[38;5;66;03m# Short-cut failed; try default (maybe equivalencies help).\u001b[39;00m\n\u001b[0;32m--> 995\u001b[0m value \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_to_value\u001b[49m\u001b[43m(\u001b[49m\u001b[43munit\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mequivalencies\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 996\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 997\u001b[0m value \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mview(np\u001b[38;5;241m.\u001b[39mndarray)\n", - "File \u001b[0;32m~/.local/lib/python3.12/site-packages/astropy/units/quantity.py:901\u001b[0m, in \u001b[0;36mQuantity._to_value\u001b[0;34m(self, unit, equivalencies)\u001b[0m\n\u001b[1;32m 898\u001b[0m equivalencies \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_equivalencies\n\u001b[1;32m 899\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdtype\u001b[38;5;241m.\u001b[39mnames \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39munit, StructuredUnit):\n\u001b[1;32m 900\u001b[0m \u001b[38;5;66;03m# Standard path, let unit to do work.\u001b[39;00m\n\u001b[0;32m--> 901\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43munit\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mto\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 902\u001b[0m \u001b[43m \u001b[49m\u001b[43munit\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mview\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mndarray\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mequivalencies\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mequivalencies\u001b[49m\n\u001b[1;32m 903\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 905\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 906\u001b[0m \u001b[38;5;66;03m# The .to() method of a simple unit cannot convert a structured\u001b[39;00m\n\u001b[1;32m 907\u001b[0m \u001b[38;5;66;03m# dtype, so we work around it, by recursing.\u001b[39;00m\n\u001b[1;32m 908\u001b[0m \u001b[38;5;66;03m# TODO: deprecate this?\u001b[39;00m\n\u001b[1;32m 909\u001b[0m \u001b[38;5;66;03m# Convert simple to Structured on initialization?\u001b[39;00m\n\u001b[1;32m 910\u001b[0m result \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mempty_like(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mview(np\u001b[38;5;241m.\u001b[39mndarray))\n", - "File \u001b[0;32m~/.local/lib/python3.12/site-packages/astropy/units/core.py:659\u001b[0m, in \u001b[0;36mUnitBase.to\u001b[0;34m(self, other, value, equivalencies)\u001b[0m\n\u001b[1;32m 657\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m UNITY\n\u001b[1;32m 658\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 659\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_converter\u001b[49m\u001b[43m(\u001b[49m\u001b[43mUnit\u001b[49m\u001b[43m(\u001b[49m\u001b[43mother\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mequivalencies\u001b[49m\u001b[43m)\u001b[49m(value)\n", - "File \u001b[0;32m~/.local/lib/python3.12/site-packages/astropy/units/core.py:588\u001b[0m, in \u001b[0;36mUnitBase.get_converter\u001b[0;34m(self, other, equivalencies)\u001b[0m\n\u001b[1;32m 585\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 586\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mlambda\u001b[39;00m v: b(converter(v))\n\u001b[0;32m--> 588\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m exc\n", - "File \u001b[0;32m~/.local/lib/python3.12/site-packages/astropy/units/core.py:571\u001b[0m, in \u001b[0;36mUnitBase.get_converter\u001b[0;34m(self, other, equivalencies)\u001b[0m\n\u001b[1;32m 569\u001b[0m \u001b[38;5;66;03m# if that doesn't work, maybe we can do it with equivalencies?\u001b[39;00m\n\u001b[1;32m 570\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 571\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_apply_equivalencies\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 572\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mother\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_normalize_equivalencies\u001b[49m\u001b[43m(\u001b[49m\u001b[43mequivalencies\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 573\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 574\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m UnitsError \u001b[38;5;28;01mas\u001b[39;00m exc:\n\u001b[1;32m 575\u001b[0m \u001b[38;5;66;03m# Last hope: maybe other knows how to do it?\u001b[39;00m\n\u001b[1;32m 576\u001b[0m \u001b[38;5;66;03m# We assume the equivalencies have the unit itself as first item.\u001b[39;00m\n\u001b[1;32m 577\u001b[0m \u001b[38;5;66;03m# TODO: maybe better for other to have a `_back_converter` method?\u001b[39;00m\n\u001b[1;32m 578\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mhasattr\u001b[39m(other, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mequivalencies\u001b[39m\u001b[38;5;124m\"\u001b[39m):\n", - "File \u001b[0;32m~/.local/lib/python3.12/site-packages/astropy/units/core.py:522\u001b[0m, in \u001b[0;36mUnitBase._apply_equivalencies\u001b[0;34m(self, unit, other, equivalencies)\u001b[0m\n\u001b[1;32m 519\u001b[0m unit_str \u001b[38;5;241m=\u001b[39m get_err_str(unit)\n\u001b[1;32m 520\u001b[0m other_str \u001b[38;5;241m=\u001b[39m get_err_str(other)\n\u001b[0;32m--> 522\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m UnitConversionError(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00munit_str\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m and \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mother_str\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m are not convertible\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", - "\u001b[0;31mUnitConversionError\u001b[0m: '1 / erg' and '1 / (erg s)' are not convertible" - ] - } - ], - "source": [ - "\n", - "ext_times = np.linspace(times[0],2*times[-1],500)\n", - "\n", - "ext_spectrum = ext_model.get_initial_spectra(t=ext_times, E=energy)\n", - "\n", - "fig, ax = plt.subplots(1, figsize=(8,6), tight_layout=False)\n", - "for flavor in ThreeFlavor:\n", - " ax.plot(ext_times, ext_spectrum[flavor].array.squeeze(),\n", - " label=flavor.to_tex(),\n", - " color = 'C0' if flavor.is_electron else 'C1',\n", - " ls = '-' if flavor.is_neutrino else ':',\n", - " lw = 2 )\n", - "\n", - "ax.set(xlim=( (times[0]-0.5*u.s).value , (times[-1]+0.5*u.s).value ),\n", - " xlabel=r'$t-t_{\\rm bounce}$ [s]',\n", - " ylabel=r'flux',\n", - " yscale='log',\n", - " ylim=(1e50,1e57))\n", - "ax.grid()\n", - "ax.legend(loc='upper right', ncol=2, fontsize=18);" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "09334339-eba3-4f52-a712-b9345ad8b385", - "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.12.5" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} From 9256f914d163fa2673a8a3b6502eecb776574468 Mon Sep 17 00:00:00 2001 From: jpkneller Date: Wed, 15 Jul 2026 15:03:28 -0400 Subject: [PATCH 40/40] Add files via upload --- doc/source/nb/dev/ExtendedCoolingTail.ipynb | 282 ++++++++++++++++++++ 1 file changed, 282 insertions(+) create mode 100644 doc/source/nb/dev/ExtendedCoolingTail.ipynb diff --git a/doc/source/nb/dev/ExtendedCoolingTail.ipynb b/doc/source/nb/dev/ExtendedCoolingTail.ipynb new file mode 100644 index 000000000..716c3158d --- /dev/null +++ b/doc/source/nb/dev/ExtendedCoolingTail.ipynb @@ -0,0 +1,282 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "bb730907", + "metadata": {}, + "source": [ + "# Extended Cooling Tail" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "18341676-5496-4da6-a722-7e730791387a", + "metadata": {}, + "outputs": [], + "source": [ + "from snewpy.models.ccsn import Nakazato_2013\n", + "from snewpy.models.extended import ExtendedModel\n", + "from snewpy.flavor import ThreeFlavor\n", + "\n", + "from astropy import units as u\n", + "\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "markdown", + "id": "944473f5-309f-4d65-b857-99f07d496a37", + "metadata": {}, + "source": [ + "## Model Initialization\n", + "\n", + "Let's use a model from the `Nakazato_2013` family of simulations. There are many model parameters to choose from:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "5a329b2c-58be-42d5-be06-70d0afebb633", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'progenitor_mass': ,\n", + " 'revival_time': ,\n", + " 'metallicity': [0.02, 0.004],\n", + " 'eos': ['LS220', 'shen', 'togashi']}" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Nakazato_2013.param" + ] + }, + { + "cell_type": "markdown", + "id": "11432208-7c45-46d7-b1dc-6bf6d52d0b31", + "metadata": {}, + "source": [ + "Since there are many valid and invalid combinations of parameters available, we will generate a list of valid parameters using the class function `get_param_combinations` and then select one of the particular models for plotting.\n", + "\n", + "It is not really important which model we choose, so we'll pick a large metallicity model (high $Z$)." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "62291165-b6db-4dab-b80a-d45058583a83", + "metadata": {}, + "outputs": [], + "source": [ + "highZ_models = list(params for params in Nakazato_2013.get_param_combinations() if params['metallicity'] == 0.02)" + ] + }, + { + "cell_type": "markdown", + "id": "2d791680-42ec-4910-9c40-07749938156a", + "metadata": {}, + "source": [ + "This should be equivalent to the initialization:\n", + "```\n", + "model = Nakazato_2013(progenitor_mass=20<" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "energy = 20 * u.MeV\n", + "times = model.get_time()\n", + "spectrum = model.get_initial_spectra(t=times, E=energy)\n", + "\n", + "fig, ax = plt.subplots(1, figsize=(8,6), tight_layout=False)\n", + "for flavor in ThreeFlavor:\n", + " ax.plot(times, spectrum[flavor].array.squeeze(),\n", + " label=flavor.to_tex(),\n", + " color = 'C0' if flavor.is_electron else 'C1',\n", + " ls = '-' if flavor.is_neutrino else ':',\n", + " lw = 2 )\n", + "\n", + "ax.set(xlim=( (times[0]-0.5*u.s).value , (times[-1]+0.5*u.s).value ),\n", + " xlabel=r'$t-t_{\\rm bounce}$ [s]',\n", + " ylabel=r'flux',\n", + " yscale='log',\n", + " ylim=(1e50,1e57))\n", + "ax.grid()\n", + "ax.legend(loc='upper right', ncol=2, fontsize=18);" + ] + }, + { + "cell_type": "markdown", + "id": "8ab065e4-699a-4fa9-a888-f5f677285002", + "metadata": {}, + "source": [ + "Now make an ExtendedModel from the existing model. The extension follows the prescription found in Li, Roberts abd Beacom, doi:10.1103/physrevd.103.023016. The parameters k, A, tau_c and alpha are parameters for the generaliztion of equation (2) from that paper. A is the normalization: if set to None, the ExtendedModel will compute the appropriate normalaization so that the fluxes are continuous. We shall use the default values for the other paramaters but you might want to play around with them. " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "c25465ef-53be-42e7-ba9d-7b20f47fdaad", + "metadata": {}, + "outputs": [], + "source": [ + "ext_model = ExtendedModel(model, k=-1., A=None, tau_c=36.*u.s, alpha=2.66)" + ] + }, + { + "cell_type": "markdown", + "id": "85aa35d9-2cf1-4caf-8a61-acb2ad4384ea", + "metadata": {}, + "source": [ + "Set up the array of times for the ExtendedModel. In this case we'll extend the model to a time twice as long as the original" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "67d224bc-fb09-4366-94db-5230a842a300", + "metadata": {}, + "outputs": [], + "source": [ + "ext_times = np.linspace(times[0],2*times[-1],500)" + ] + }, + { + "cell_type": "markdown", + "id": "346a76cc-4ac4-455b-a11d-8c5b06f9f5e6", + "metadata": {}, + "source": [ + "Get the flux for the ExtendedModel again for a neutrino energy of 20 MeV, then plot it" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "6ffad09c-7472-452f-a596-ee684db735e5", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxUAAAJNCAYAAABHt1gkAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjksIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvJkbTWQAAAAlwSFlzAAAPYQAAD2EBqD+naQAAxalJREFUeJzs3Xl4VNX9x/H3nZmsZCMJSSAEwr7vBBBQRHEBFUWrtq5oi7YFa4vaavurta1WW61aNZbWXatW64q7iCiyI/u+EwIkIQkJ2ZPJzP39cUnCZBLINpkEPq/nuY9z77n3zpnDOJnvnPM9xzBN00RERERERKSJbP6ugIiIiIiItG8KKkREREREpFkUVIiIiIiISLMoqBARERERkWZRUCEiIiIiIs2ioEJERERERJpFQYWIiIiIiDSLggoREREREWkWBRUiIiIiItIsCipERERERKRZFFSIiIiIiEiznBZBRXJyMkOHDmX48OFMnjwZgB07djB8+PDqLSQkhA8++MC/FRUREREROQ0Zpmma/q5EcyUnJ7N582bCwsLqLC8qKiI5OZm0tDQ6dOjQyrUTERERETm9nRY9Facyf/58zj//fAUUIiIiIiI+4PegYvHixVx22WV06dIFwzDqHKKUmppKcnIywcHBjB07llWrVnmUG4bBpEmTSElJ4fXXX/e6/u233+baa6/11UsQERERETmjOfxdgeLiYoYNG8att97KlVde6VX+1ltvMXfuXObNm8fYsWN58sknueiii9ixYwdxcXEALFmyhMTERDIyMpgyZQpDhgxh6NChABQUFLBs2TL++9//nrQe5eXllJeXV++73W6OHj1KTEwMhmG04CsWEREREWkfTNOksLCQLl26YLOdpD/CbEMA8/333/c4NmbMGHP27NnV+y6Xy+zSpYv58MMP13mPu+++23zppZeq91999VXz+uuvP+Vz/+EPfzABbdq0adOmTZs2bdq01drS09NP+l3a7z0VJ1NRUcGaNWu47777qo/ZbDamTJnC8uXLAaunw+12Ex4eTlFREV9//TXXXHNN9flvv/02t9122ymf67777mPu3LnV+8eOHaNbt27s27eP8PDwOq9xOp0sWrSIyZMnExAQ0NSXKXVQ2/qG2tU31K6+o7b1DbWr76htfUPt6hsNadfCwkJ69OhR7/fhKm06qMjJycHlchEfH+9xPD4+nu3btwOQlZXFjBkzAHC5XMyaNYuUlBTACgxWrVrFu+++e8rnCgoKIigoyOt4dHQ0ERERdV7jdDoJDQ0lJiZGb/AWprb1DbWrb6hdfUdt6xtqV99R2/qG2tU3GtKuVcdPlQ7QpoOKhujZsycbNmyosywyMpKsrKxG3S81NZXU1FRcLldLVE9ERERE5LTn99mfTiY2Nha73e4VGGRlZZGQkOCT55w9ezZbt25l9erVPrm/iIiIiMjppk0HFYGBgYwaNYqFCxdWH3O73SxcuJCzzjrLjzUTEREREZEqfh/+VFRUxO7du6v39+3bx/r164mOjqZbt27MnTuXm2++mdGjRzNmzBiefPJJiouLueWWW/xYaxERERERqeL3oOL7779n8uTJ1ftVMzDdfPPNvPzyy1x77bVkZ2dz//33k5mZyfDhw/n888+9krdbinIqREREREQax+9Bxbnnnou1REX95syZw5w5c1qlPrNnz2b27NkUFBQQGRnZKs8pIiIiItKetemcChERERERafsUVIiIiIiISLP4ffhTW6OcChEROd2YponT6cTtdgPWglcOh4OysjL9vWthalvfULs2nc1mIyAg4JSL1zWXgopalFMhIiKnC5fLRU5ODoWFhTidzurjpmmSkJBAenq6z79onGnUtr6hdm2egIAAwsPDq9eA8wUFFSIiIqchl8tFeno65eXlREZGEhYWht1uxzAM3G43RUVFhIWFYbNpJHRLUtv6htq1aUzTxOVyUVRURH5+PqWlpSQlJfkksFBQISIichrKycmhvLycbt26ERIS4lHmdrupqKggODhYX9BamNrWN9SuzRMWFkZkZCQHDhwgJyfHJ0sz6F9FRETkNGOaJoWFhURGRnoFFCJyZgoJCSEiIoLCwsJTLufQFAoqaklNTWXgwIGkpKT4uyoiIiJN4nQ6cTqdhIWF+bsqItKGhIeHV38+tDQFFbXMnj2brVu3snr1an9XRUREpEmqZnnyVUKmiLRPVZ8JVZ8RLUlBhYiIyGlKs+SIyIl8+ZmgoEJERERERJpFQYWIiIiIiDSLggoREREREWkWBRW1aPYnEREREZHGUVBRi2Z/EhERERFpHAUVIiIiIiLSLAoqRERERESkWRz+roCIiIiIyOmsOetDmKbZgjXxHQUVIiIiIiI+1F4Cg+bQ8CcREREREWkWBRW1aEpZEREREZHGUVBRi6aUFRERERFpHAUVIiIiIicxbdo0DMNg2rRpXmWmaTJkyBAMw+Dpp5/2Q+2kPTmd30sKKkREREROIjExEYCDBw96lRmGwa9+9SsAXnzxxVatl7Q/p/N7SUGFiIiIyEl07doVqPuLIMDEiRMB2LhxIwUFBa1WL2l/Tuf3koIKERERkZOo+iKYl5dHSUmJV3n37t0BcLvd7N+/vzWrJu3M6fxe0joVIiIiZ6jpqUvJKazwdzVaTKfwID66Y2KL37dqyApAeno6/fr18ygvLy+vflxZWdniz99uLHsGlqdaj6/8N/Q4u6Ysbz+8ONV6POBSmPao57Vv/BAyNliP79rmWbbudYyvHyTCdMPUv8Ggy2vKygvhmTHW4+QJcNXzntd+8HPYs8h6/LOlEBpdU7bjc/jYGm7EpF/D6Fsa9XKb4nR+LymoEBEROUPlFJaTWVB+6hPPcFW/LoM1bKX2F8GlS5cC4HA46NOnzxmx0Fmdyguh8LD12FXrfeV21ZSV5ntfW5JTU16bswSj8DAG4HbW+nXfNGuuK8mt475Ha8pNt2dZZWlNWUVx3c/dwhr7XmpPFFSIiIicoWLDgwDD39VoMZ3Cg3xy39pfBGubN28eAFOmTCE8PLzdjYVvMUHhEN7Femyv9W9hs9eUhUR5XxsaW1NeW0AoZngXTNMNAaGeZYZRc11oTB33ja4pN2qN+neE1JQFdqj7uVtYY99L7YmCilpSU1NJTU3F5XL5uyoiIiI+NX/2BGw2pVeeSlRUFB06dKC4uNjri+D8+fOZP38+APfee68/qtd2jJ9jbXXpmOw9rOlE1/23/rIR12MO+xEFBQVERER4lgWFn/y+Vzxbf1m/i62tFZ3O7yV9ktSixe9ERESktqqx8Onp6dXH0tLSmDVrFgCzZs1i0qRJHtds27aNm266iS5duhASEsLQoUN55ZVXWq/S0iY15b107rnnMmTIEK97ffDBBxiGwcKFC31Y44ZRUCEiIiJyCrWnAi0qKmL69OkcOXKEiRMnei1WtmDBAkaNGsW6deu48847eeKJJ0hKSmLmzJm8+uqrrV5/aTsa+14Ca4rZESNGeB1ft24dAMOHD/ddhRtIw59ERERETuHEL4IlJSVcfvnlbNy4kZSUFD755BOCgmpyCA4dOsS1117L9OnTef3117Hb7QDcfvvtTJw4kccff5ybbrrJL69D/K8x7yWAAwcOkJeXV29Q0bVrV2Ji6sgnaWUKKkREREROoWrISlpaGpdccgnffPMNKSkpfPnll17j/B999FHcbjcPPfQQeXl5HmVDhw7ltddea7V6S9vTmPcSwIYN1lS7dQUV69evbxO9FKCgQkREROSUqn5dzs/P55tvvuHss8/m448/9voS6HK5+PDDDyksLKR379513qtz584+r6+0XQ19L1WpCipqBw+5ubmkp6dz8803+7S+DaWgQkREROQUTpwKdMaMGbz++uuEhIR4nZeenk5+fj4///nPmTFjRp33qu/Lo5wZGvpeqrJhwwaSk5OJioryON6W8ilAQYWIiIjIKU2fPr1Bi9pVrVGRnJzMlClTfF0taYca+l6qsmHDBgYMGOB1/NNPPwXaTlCh2Z9EREREWkj37t1xOBy89957uN1ur/KsrCw/1Eraq6KiIvbs2eP1vtm1axfPPfcc4eHh9OzZ00+186SeChEREZEWEhkZycyZM3n++ecZN24c1157LeHh4Rw4cIAlS5YQHx/PW2+95e9qSjuxadMm3G43O3bs4Oqrr+acc84hLS2ter0Tl8vFU089xZ133unnmiqoEBEREWlRjzzyCCNHjuT555/nz3/+My6Xiy5dujBx4kR++tOf+rt60o5UJWm/+eabPPDAA8yfP5/evXvzwgsvsHjxYv75z3+yfft2P9fSoqBCREREpAXZ7XZuv/12fvazn/m7KtLObdiwgbCwMC699FIuu+wyj7Lp06fz2GOP+alm3pRTISIiIiLSBm3YsIHBgwdjGIa/q3JKCipqSU1NZeDAgaSkpPi7KiIiIiJyhjJNk02bNjFkyBB/V6VBFFTUMnv2bLZu3crq1av9XRUREREROUPt2bOHoqIiBg8e7O+qNIhyKkRERERE2pjevXs3aj0Lf1NPhYiIiIiINIuCChERERERaRYFFSIiIiIi0iwKKkREREREpFkUVIiIiIiISLMoqBARERERkWZRUCEiIiIiIs2ioKIZ0o6W8PgmO79+b3O7mkdYRERERKQlKahohnve2URakcH76w7z5dYsf1dHRERERMQvFFQ0w7r0Y9WPd2QW+rEmIiIiIiL+o6CihZQ5Xf6ugoiIiIiIXyioaCFlTre/qyAiIiIi4hcKKpoh0FHTfOWV6qkQERERkTOTw98VaM+CHDYq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Z7psONNlw/s1LQCk0fk5SVoUp8eiND0OpRlxKEjRhWVncCYVo1zJ6k9EREREROGmVAjISdYhJ1mH9delA5Amg9d3SonGcI/GyRYLnG5foiGO2Efj919I+2hEKAXMNelRmhGLeSk6mO1S0hLqwCkmFSHo721DzHCh97ycoRARERHRDKJSKjDXpMdckx73LsoA4Fve9ljzcI9GL2pb+zA4Ysc+l1vEsWapt2PoSthx8SD++7s3hBZPSK+e4ZQOs6/Qe06+QIiIiIhoxhu5vO03Fkt1Ay43TrZacPSCGUcu9OLoBTMaOq0QR+zXl2fUhvzeTCqIiIiIiKapqAglFmTGY8GIDfv6Blw41mzGl2d78NGhOizNTgj5fZhUhMCjMQB2aSIMDLnyBkNERERENA66qAhcP8eAssxYpPedxJoiU8jXVExAXDNWlC7RV9AmyxcIEREREZGMmFSMUl1djcLCQpSVlckdChERERHRlMCkYpSqqiqcOHECBw8elDsUIiIiIqIpgUlFCNyDLl9h0ClfIEREREREMmJSEQJ39xlf4QJ7NoiIiIhoZmJSQUREREREIWFSEQK3MtJXiIqTLQ4iIiIiIjkxqQhBtCHLVzDNky0OIiIiIiI5MakgIiIiIqKQMKkgIiIiIqKQMKkYhZvfERERERFdGSYVo1zJ5nf9nU2+Qtux8AVFRERERDSJMakIgdLj8BUGLPIFQkREREQkIyYVREREREQUEiYVIVAZ5vgK6YvlC4SIiIiISEZMKkKgUKp8BVWEfIEQEREREcmISQUREREREYWESQUREREREYWESUUI+s1dvkJfm3yBEBERERHJiElFCJQD3b5Cd4N8gRARERERyYhJBRERERERhYRJRQg8UXG+QnyWXGEQEREREcmKSUUIomKNvkJsmnyBEBERERHJiEnFKNXV1SgsLERZWZncoRARERERTQlMKkapqqrCiRMncPDgQblDISIiIiKaEphUEBERERFRSJhUhMDZXucrNH0qXyBERERERDJiUkFERERERCFhUhECtxDhK6hj5AuEiIiIiEhGTCpCEJ2c7SukzpctDiIiIiIiOTGpICIiIiKikDCpICIiIiKikDCpICIiIiKikDCpCEF/1zlfoaNWvkCIiIiIiGTEpCIESne/r2Dvli8QIiIiIiIZMakgIiIiIqKQMKkIgRCX6SukLpAvECIiIiIiGTGpCEFEZLSvoNbIFwgRERERkYyYVBARERERUUiYVBARERERUUimRVKRlZWFkpISzJ8/HytWrPDWr1u3DvHx8fi7v/u7sLzvgLXXV7D1hOU9iIiIiIgmO5XcAUyUffv2QavV+tU98sgjeOihh/Cf//mfYXlPha3dV+g8GZb3ICIiIiKa7KZFT8WlLF++HDqdTu4wiIiIiIimNdmTij179uDOO+9EamoqBEHAe++9F/Cc6upqZGVlISoqCuXl5fj888/9zguCgGXLlqGsrAxvvvnmNYoccEfofQV92jV7XyIiIiKiyUT24U82mw2lpaV46KGHsH79+oDz27Ztw5YtW/Dqq6+ivLwcW7duxerVq1FXV4fk5GQAwN69e5GWlobW1lZUVFSguLgYJSUlVxSHw+GAw+Hwli0WCwDA5XLB5XIFfU1UvAno6AIADMZmQLzE8+jKDbf5pdqerg7bNTzYruHDtg0Ptmv4sG3Dg+0aHuNp1/G2uSCKojghUU0AQRCwfft2rF271ltXXl6OsrIyvPLKKwAAj8eDjIwMfO9738MPfvCDgGs8/vjjmDdvHjZu3AgA2LVrF1555RW8++67Y773s88+i+eeey6g/q233oJGE3wPimW1TyGu/ywA4MuMh3DOsHwcn5KIiIiIaGqw2+24//77YTabodfrL/k82XsqxuJ0OnH48GE8+eST3jqFQoGKigrs378fgNTT4fF4oNPpYLVa8fHHH+Pee++94vd68sknsWXLFm/ZYrEgIyMDq1atumQDKppfBPqlx8XFxShacPsVvy8F53K5sGPHDtx6662IiIiQO5xpg+0aHmzX8GHbhgfbNXzYtuHBdg2P8bTr8Oidy5nUSUVXVxfcbjeMRqNfvdFoRG1tLQCgvb0d69atAwC43W5s2rQJZWVlAICKigocOXIENpsN6enpeOedd7B06dKg7xUZGYnIyMiA+oiIiEs2skcQvI9VSiXAm3zCjdX+dPXYruHBdg0ftm14sF3Dh20bHmzX8BirXcfb3pM6qRiP7OxsHDlyJOi5v/71r2F9b0f7KUQPF84dABZWhvX9iIiIiIgmI9lXfxqLwWCAUqlEe3u7X317eztMJlNY3rO6uhqFhYXe3o6xCBgxHcUzGJZ4iIiIiIgmu0mdVKjVaixcuBA7d+701nk8HuzcufOSw5hCVVVVhRMnTuDgwYOXfa4HSl9BFTh0ioiIiIhoJpB9+JPVakV9fb233NjYiJqaGiQkJCAzMxNbtmxBZWUlFi1ahMWLF2Pr1q2w2Wx48MEHZYxaEmXMAdqPSYX0RfIGQ0REREQkE9mTikOHDmHFihXe8vAKTJWVlXj99dexYcMGdHZ24umnn0ZbWxvmz5+PDz/8MGDy9kSprq5GdXU13G53WK5PRERERDTdyJ5ULF++HJfbKmPz5s3YvHnzNYmnqqoKVVVVsFgsiI2NvSbvSUREREQ0lU3qORVERERERDT5MakIgb37gq/Q3SBfIEREREREMmJSEQLVoM1X6GuTLxAiIiIiIhkxqRjlSvapICIiIiIiJhUBrmSfCuhSfI+N88IXFBERERHRJMakIgRqjd5XiI6TLQ4iIiIiIjkxqSAiIiIiopAwqSAiIiIiopAwqRjlSiZqO/utvsKAJYxRERERERFNXkwqRrmSidqipdlXaDsWxqiIiIiIiCYvJhVERERERBQSJhUhcKs0voI2Wb5AiIiIiIhkxKQiBJrEDF/BkCtfIEREREREMmJSMQp31CYiIiIiujJMKka5oh21iYiIiIiISQUREREREYWGSUUI+tvrfYXmw/IFQkREREQkIyYVIVDA7Su4BuQLhIiIiIhIRkwqQiL4HiqU8oVBRERERCQjJhUhiDTm+QqZS+QLhIiIiIhIRkwqiIiIiIgoJEwqRuE+FUREREREV4ZJxSjcp4KIiIiI6MowqQiBvafNV7h4Xr5AiIiIiIhkxKQiBEqX2Vcwn5MvECIiIiIiGTGpICIiIiKikDCpCIGoSfIVDHmXfiIRERER0TTGpCIEUboEX0GbdOknEhERERFNY0wqiIiIiIgoJEwqiIiIiIgoJEwqRrmSze9czgFfYeRjIiIiIqIZhEnFKFey+Z3n4llfoeVwGKMiIiIiIpq8mFQQEREREVFImFSEwK2I9BWiEy79RCIiIiKiaYxJRQg0SVm+grFAtjiIiIiIiOTEpIKIiIiIiELCpIKIiIiIiELCpIKIiIiIiELCpCIE/R1nfIW2o/IFQkREREQkIyYVIVB4XL7CQJ98gRARERERyYhJBRERERERhYRJRQjUybm+QuYS+QIhIiIiIpIRk4oQCIoRzadQyhcIEREREZGMmFSMUl1djcLCQpSVlckdChERERHRlMCkYpSqqiqcOHECBw8elDsUIiIiIqIpgUlFCPp7O30FS6t8gRARERERyYhJRQgUAz2+wsVG+QIhIiIiIpIRkwoiIiIiIgoJk4oQeKISfIX42fIFQkREREQkIyYVIYiOS/IV9CnyBUJEREREJCMmFUREREREFBImFUREREREFBImFSEQPR5fweOWLxAiIiIiIhkxqQiBs+O0r3D+gHyBEBERERHJiEkFERERERGFhElFCDyKCF8hUidfIEREREREMmJSEYLo5GxfwVQsXyBERERERDJiUkFERERERCFhUkFERERERCFhUkFERERERCGZFklFVlYWSkpKMH/+fKxYscJb/8c//hH5+fnIzc3Fr3/96wl/X3tHk6/QcXLCr09ERERENBWo5A5gouzbtw9ardZbHhwcxJYtW/DJJ58gNjYWCxcuxLp165CYmDhh76n0OABhqNB/ccKuS0REREQ0lUyLnopgPv/8c8ybNw9paWnQarVYs2YNPvroI7nDIiIiIiKadmRPKvbs2YM777wTqampEAQB7733XsBzqqurkZWVhaioKJSXl+Pzzz/3Oy8IApYtW4aysjK8+eabAICWlhakpaV5n5OWlobm5uYJjV2RMMtXSLluQq9NRERERDRVyD78yWazobS0FA899BDWr18fcH7btm3YsmULXn31VZSXl2Pr1q1YvXo16urqkJycDADYu3cv0tLS0NraioqKChQXX/meEQ6HAw6Hw1s2m80AgJ6eHrhcrqCvUQwq4XCIAIDB/kGI3d1X/L4UnMvlgt1uR3d3NyIiIi7/AhoXtmt4sF3Dh20bHmzX8GHbhgfbNTzG0659fX0AAFEUx76YOIkAELdv3+5Xt3jxYrGqqspbdrvdYmpqqvjCCy8EvcZjjz0m/uY3vxE//fRTce3atd76Rx55RHzzzTcv+d7PPPOMCIAHDx48ePDgwYMHDx6jjvPnz4/5PV4Y+jI/KQiCgO3bt2Pt2rUAAKfTCY1Gg3fffddbBwCVlZXo7e3F+++/D5vNBo/HA51OB6vVimXLluHVV1/FggULUFBQgF27dnknau/bt++SE7VH91R4PB709PQgMTERgiAEfY3FYkFGRgbOnz8PvV4/Ye1AbNtwYbuGB9s1fNi24cF2DR+2bXiwXcNjPO0qiiL6+vqQmpoKheLSMydkH/40lq6uLrjdbhiNRr96o9GI2tpaAEB7ezvW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sAsXLqC7u5v38GWIoojNmzdj+/bt+PjjjzF79my/8wsXLkRERITfPVtXV4dz587xnh3D5do1mJqaGgDgPXsVPB4PHA4H79cJNtyuwfB+HZ+VK1fi2LFjqKmp8R6LFi3CAw884H08Efcshz9dpS1btqCyshKLFi3C4sWLsXXrVthsNjz44INyhzZlPfbYY7jzzjsxa9YstLS04JlnnoFSqcQ3vvENuUObcqxWq99fbhobG1FTU4OEhARkZmbi0UcfxfPPP4/c3FzMnj0bTz31FFJTU7F27Vr5gp4CxmrXhIQEPPfcc7j77rthMpnQ0NCAJ554Ajk5OVi9erWMUU9+VVVVeOutt/D+++9Dp9N5x/DGxsYiOjoasbGxePjhh7FlyxYkJCRAr9fje9/7HpYuXYolS5bIHP3kdbl2bWhowFtvvYXbb78diYmJOHr0KL7//e/j5ptvDlhukvw9+eSTWLNmDTIzM9HX14e33noLu3btwl/+8hferyEYq115v149nU7nN5cKAGJiYpCYmOitn5B7dmIXq5pZXn75ZTEzM1NUq9Xi4sWLxc8++0zukKa0DRs2iCkpKaJarRbT0tLEDRs2iPX19XKHNSV98sknIoCAo7KyUhRFaVnZp556SjQajWJkZKS4cuVKsa6uTt6gp4Cx2tVut4urVq0Sk5KSxIiICHHWrFnipk2bxLa2NrnDnvSCtSkA8Te/+Y33Of39/eJ3v/tdMT4+XtRoNOK6devE1tZW+YKeAi7XrufOnRNvvvlmMSEhQYyMjBRzcnLExx9/XDSbzfIGPgU89NBD4qxZs0S1Wi0mJSWJK1euFD/66CPved6vV2esduX9OrFGL887EfesIIqieHV5DxEREREREedUEBERERFRiJhUEBERERFRSJhUEBERERFRSJhUEBERERFRSJhUEBERERFRSJhUEBERERFRSJhUEBERERFRSJhUEBERERFRSJhUEBERERFRSJhUEBERAVi+fDkEQYAgCKipqRnXazZu3Oh9zXvvvRfW+IiIJjMmFUREM9j3v/99rF+/fspcN9w2bdqE1tZWFBUVjev5P/vZz9Da2hrmqIiIJj8mFUREM9jnn3+ORYsWTZnrhptGo4HJZIJKpRrX82NjY2EymcIcFRHR5MekgohoBnI6nYiIiMC+ffvwox/9CIIgYMmSJZP2unJ59913UVxcjOjoaCQmJqKiogI2m03usIiIJp3x/SmGiIimFZVKhU8//RTl5eWoqamB0WhEVFTUpL2uHFpbW/GNb3wDL774ItatW4e+vj787W9/gyiKcodGRDTpMKkgIpqBFAoFWlpakJiYiNLS0rBet6mpCRUVFTh06NCEvc+10NraisHBQaxfvx6zZs0CABQXF8scFRHR5MThT0REM9SXX345ZkLxgx/8wLuy0aWO2traK77uVFFaWoqVK1eiuLgY99xzD371q1/h4sWLcodFRDQpMakgIpqhampqxvzy/0//9E84efLkmEd2dva4rut0OnHvvfeioKAAlZWVGBwc9J77yU9+gqKiIhQXF+PNN98EIPVujJzo/dhjj+H1119HU1MTSktLUVlZiYKCAmzYsME7HOm1115DSUkJSktL8dhjjwEA3njjDZSVlaG0tBRbtmy5ovZRKpXYsWMH/vznP6OwsBAvv/wy8vPz0djYeEXXISKaCTj8iYhohjp27BjuvvvuS55PSkpCUlLShFz3+PHjeO2117Bo0SLcf//9+K//+i9s3LgRBw8exNtvv41Dhw7BbrejrKwMK1asGPP6J0+exG9/+1sUFBRgxYoV2Lt3L+Li4vDv//7v+Nvf/oa4uDj09PTg5MmTeP/997F//36oVCp861vfwp/+9Cfccccd4/4sgiDghhtuwA033ICnn34as2bNwvbt2684QSEimu6YVBARzVAejwd1dXVoaWlBTEwMYmNjw3JdAMjJyfH2PNx33334n//5H2zcuBGffvop7r77bkRFRSEqKgorV67EwYMHx+xByc/PR2FhIQBgwYIFaGpqwsWLF7FhwwbExcUBABISEvDWW2/hs88+876v3W7HwoULx/05Dhw4gJ07d2LVqlVITk7GgQMH0NnZiYKCgqtpFiKiaY3Dn4iIZqjnn38er7/+OtLS0vD888+H9bqCIHjPD8/HGItKpYLH4/GWHQ6H93FkZKT3sVKphNvtDnoNj8eDTZs2oaamBjU1NTh16hQeeeSRcX8OvV6PPXv24Pbbb0deXh7+5V/+BT/96U+xZs2acV+DiGimYFJBRDRD/f3f/z2am5shiiJeeumlsF739OnT+OKLLwAA27Ztw4033ggAuPHGG/H73/8eDocDFy9exMcff4zFixcjOTkZLS0t6Ovrg9VqxY4dO8Z8z1tuuQXbtm2D2WwGAPT09GDlypXYtm0buru7AQAdHR1XtPt1QUEBPvzwQ3R0dGBgYAB1dXXYvHnzFbcHEdFMwKSCiIjCrqioCD/5yU9QUFAAhUKB+++/HwCwaNEi3HPPPVi4cCFuvvlmPPfcc0hJSYFarcYTTzyBBQsW4K677rrsUq5FRUV45JFHcMMNN2D+/Pn48Y9/jHnz5uFHP/oRVq5ciZKSEtxxxx3o6ekZ8zq/+MUvoNVqcezYsXF9rm9/+9vQarXjawQiomlMELmLDxEREZqbm9Hf3w8AyMzMhFqtvuxrOjo6YLFYAAApKSneOSRERDMNkwoiIiIiIgoJhz8REREREVFImFQQEREREVFImFQQEREREVFImFQQEREREVFImFQQEREREVFImFQQEREREVFImFQQEREREVFImFQQEREREVFImFQQEREREVFI/n/ABT3fe13bMwAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "ext_spectrum = ext_model.get_initial_spectra(t=ext_times, E=energy)\n", + "\n", + "fig, ax = plt.subplots(1, figsize=(8,6), tight_layout=False)\n", + "for flavor in ThreeFlavor:\n", + " ax.plot(ext_times, ext_spectrum[flavor].array.squeeze(),\n", + " label=flavor.to_tex(),\n", + " color = 'C0' if flavor.is_electron else 'C1',\n", + " ls = '-' if flavor.is_neutrino else ':',\n", + " lw = 2 )\n", + "\n", + "ax.set(xlim=( (ext_times[0]-0.5*u.s).value , (ext_times[-1]+0.5*u.s).value ),\n", + " xlabel=r'$t-t_{\\rm bounce}$ [s]',\n", + " ylabel=r'flux',\n", + " yscale='log',\n", + " ylim=(1e50,1e57))\n", + "ax.grid()\n", + "ax.legend(loc='upper right', ncol=2, fontsize=18);" + ] + } + ], + "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.12.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}