Warren 2020 Models¶
Data from “Constraining properties of the next nearby core-collapse supernova with multi-messenger signals: multi-messenger signals” by Warren, MacKenzie; Couch, Sean; O’Connor, Evan; Morozova, Viktoriya.
1D FLASH simulations with STIR, for alpha_lambda = 1.23, 1.25, and 1.27. Run with SFHo EOS, M1 with 12 energy groups.
For more information on these simulations, see Warren, Couch, O’Connor, & Morozova (arXiv:1912.03328) and Couch, Warren, & O’Connor (2020).
Includes the multi-messenger data from the STIR simulations. The filename indicates the turbulent mixing parameter a and progenitor mass m of the simulation. Columns are time [s], shock radius [cm], explosion energy [ergs], electron neutrino mean energy [MeV], electron neutrino rms energy [MeV], electron neutrino luminosity [10^51 ergs/s], electron antineutrino mean energy [MeV], electron antineutrino rms energy [MeV], electron antineutrino luminosity [10^51 ergs/s], x neutrino mean energy [MeV], x neutrino rms energy [MeV], x neutrino luminosity [10^51 ergs/s], gravitational wave frequency from eigenmode analysis of the protoneutron star structure [Hz]. Note that the x neutrino luminosity is for one neutrino flavor - to get the total mu/tau neutrino and antineutrino luminosities requires multiplying this number by 4.
[1]:
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
from astropy import units as u
from snewpy.neutrino import Flavor, MassHierarchy
from snewpy.models.ccsn import Warren_2020
from snewpy.flavor_transformation import NoTransformation, AdiabaticMSW, ThreeFlavorDecoherence
mpl.rc('font', size=16)
%matplotlib inline
Initialize Models¶
To start, let’s see what progenitors are available for the Warren_2020 model. We can use the param property to view all physics parameters and their possible values:
[2]:
Warren_2020.param
[2]:
{'progenitor_mass': <Quantity [ 9. , 9.25, 9.5 , 9.75, 10. , 10.25, 10.5 , 10.75,
11. , 11.25, 11.5 , 11.75, 12. , 12.25, 12.5 , 12.75,
13. , 13.1 , 13.2 , 13.3 , 13.4 , 13.5 , 13.6 , 13.7 ,
13.8 , 13.9 , 14. , 14.1 , 14.2 , 14.3 , 14.4 , 14.5 ,
14.6 , 14.7 , 14.8 , 14.9 , 15. , 15.1 , 15.2 , 15.3 ,
15.4 , 15.5 , 15.6 , 15.7 , 15.8 , 15.9 , 16. , 16.1 ,
16.2 , 16.3 , 16.4 , 16.5 , 16.6 , 16.7 , 16.8 , 16.9 ,
17. , 17.1 , 17.2 , 17.3 , 17.4 , 17.5 , 17.6 , 17.7 ,
17.8 , 17.9 , 18. , 18.1 , 18.2 , 18.3 , 18.4 , 18.5 ,
18.6 , 18.7 , 18.8 , 18.9 , 19. , 19.1 , 19.2 , 19.3 ,
19.4 , 19.5 , 19.6 , 19.7 , 19.8 , 19.9 , 20. , 20.1 ,
20.2 , 20.3 , 20.4 , 20.5 , 20.6 , 20.7 , 20.8 , 20.9 ,
21. , 21.1 , 21.2 , 21.3 , 21.4 , 21.5 , 21.6 , 21.7 ,
21.8 , 21.9 , 22. , 22.1 , 22.2 , 22.3 , 22.4 , 22.5 ,
22.6 , 22.7 , 22.8 , 22.9 , 23. , 23.1 , 23.2 , 23.3 ,
23.4 , 23.5 , 23.6 , 23.7 , 23.8 , 23.9 , 24. , 24.1 ,
24.2 , 24.3 , 24.4 , 24.5 , 24.6 , 24.7 , 24.8 , 24.9 ,
25. , 25.1 , 25.2 , 25.3 , 25.4 , 25.5 , 25.6 , 25.7 ,
25.8 , 25.9 , 26. , 26.1 , 26.2 , 26.3 , 26.4 , 26.5 ,
26.6 , 26.7 , 26.8 , 26.9 , 27. , 27.1 , 27.2 , 27.3 ,
27.4 , 27.5 , 27.6 , 27.7 , 27.8 , 27.9 , 28. , 28.1 ,
28.2 , 28.3 , 28.4 , 28.5 , 28.6 , 28.7 , 28.8 , 28.9 ,
29. , 29.1 , 29.2 , 29.3 , 29.4 , 29.5 , 29.6 , 29.7 ,
29.8 , 29.9 , 30. , 31. , 32. , 33. , 35. , 40. ,
45. , 50. , 55. , 60. , 70. , 80. , 100. , 120. ] solMass>,
'turbmixing_param': [1.23, 1.25, 1.27],
'eos': ['SFHo']}
Quite a lot of choice there! Let’s use the get_param_combinations function to get a list of all valid combinations and filter it:
[3]:
# This will print a long tuple of combinations:
#Warren_2020.get_param_combinations()
# To get a more manageable list, let’s filter it to show only the
# available progenitors with integer masses and mixing of 1.23:
filtered_models = list(params for params in Warren_2020.get_param_combinations()
if params['turbmixing_param'] == 1.23
and params['progenitor_mass'].value.is_integer()
and 10 <= params['progenitor_mass'].value <= 25)
print("Filtered list of progenitors:\n", *filtered_models, sep='\n')
Filtered list of progenitors:
{'progenitor_mass': <Quantity 10. solMass>, 'turbmixing_param': 1.23, 'eos': 'SFHo'}
{'progenitor_mass': <Quantity 11. solMass>, 'turbmixing_param': 1.23, 'eos': 'SFHo'}
{'progenitor_mass': <Quantity 12. solMass>, 'turbmixing_param': 1.23, 'eos': 'SFHo'}
{'progenitor_mass': <Quantity 13. solMass>, 'turbmixing_param': 1.23, 'eos': 'SFHo'}
{'progenitor_mass': <Quantity 14. solMass>, 'turbmixing_param': 1.23, 'eos': 'SFHo'}
{'progenitor_mass': <Quantity 15. solMass>, 'turbmixing_param': 1.23, 'eos': 'SFHo'}
{'progenitor_mass': <Quantity 16. solMass>, 'turbmixing_param': 1.23, 'eos': 'SFHo'}
{'progenitor_mass': <Quantity 17. solMass>, 'turbmixing_param': 1.23, 'eos': 'SFHo'}
{'progenitor_mass': <Quantity 18. solMass>, 'turbmixing_param': 1.23, 'eos': 'SFHo'}
{'progenitor_mass': <Quantity 19. solMass>, 'turbmixing_param': 1.23, 'eos': 'SFHo'}
{'progenitor_mass': <Quantity 20. solMass>, 'turbmixing_param': 1.23, 'eos': 'SFHo'}
{'progenitor_mass': <Quantity 21. solMass>, 'turbmixing_param': 1.23, 'eos': 'SFHo'}
{'progenitor_mass': <Quantity 22. solMass>, 'turbmixing_param': 1.23, 'eos': 'SFHo'}
{'progenitor_mass': <Quantity 23. solMass>, 'turbmixing_param': 1.23, 'eos': 'SFHo'}
{'progenitor_mass': <Quantity 24. solMass>, 'turbmixing_param': 1.23, 'eos': 'SFHo'}
{'progenitor_mass': <Quantity 25. solMass>, 'turbmixing_param': 1.23, 'eos': 'SFHo'}
We’ll pick one of these progenitors and initialise it. If this is the first time you’re using this progenitor, snewpy will automatically download the required data file for you.
[4]:
m10 = Warren_2020(**filtered_models[0])
m25 = Warren_2020(**filtered_models[-1])
# This is equivalent to:
#m10 = Warren_2020(progenitor_mass=10*u.solMass, turbmixing_param=1.23)
#m25 = Warren_2020(progenitor_mass=25*u.solMass, turbmixing_param=1.23)
m10
/tmp/ipykernel_2221/1210975369.py:1: UserWarning: Argument `eos` is deprecated.
m10 = Warren_2020(**filtered_models[0])
/tmp/ipykernel_2221/1210975369.py:2: UserWarning: Argument `eos` is deprecated.
m25 = Warren_2020(**filtered_models[-1])
[4]:
Warren_2020 Model: stir_multimessenger_a1.23_m10.0.h5
Parameter |
Value |
|---|---|
EOS |
SFHo |
Progenitor mass |
\(10\) \(\mathrm{M_{\odot}}\) |
Turb. mixing param. |
1.23 |
Finally, let’s plot the luminosity of different neutrino flavors for this model. (Note that the Warren_2020 simulations didn’t distinguish between \(\nu_x\) and \(\bar{\nu}_x\), so both have the same luminosity.)
[5]:
fig, axes = plt.subplots(1, 2, figsize=(12, 5), sharex=True, sharey=True, tight_layout=True)
for i, model in enumerate([m10, m25]):
ax = axes[i]
for flavor in Flavor:
ax.plot(model.time, model.luminosity[flavor]/1e51, # Report luminosity in units foe/s
label=flavor.to_tex(),
color='C0' if flavor.is_electron else 'C1',
ls='-' if flavor.is_neutrino else ':',
lw=2)
ax.set(xlim=(-0.05, 0.65),
xlabel=r'$t-t_{\rm bounce}$ [s]',
title=r'{}: {} $M_\odot$'.format(model.metadata['EOS'], model.metadata['Progenitor mass'].value))
ax.grid()
ax.legend(loc='upper right', ncol=2, fontsize=18)
axes[0].set(ylabel=r'luminosity [foe s$^{-1}$]');
Initial and Oscillated Spectra¶
Plot the neutrino spectra at the source and after the requested flavor transformation has been applied.
Adiabatic MSW Flavor Transformation: Normal mass ordering¶
[6]:
# Adiabatic MSW effect. NMO is used by default.
xform_nmo = AdiabaticMSW()
# Energy array and time to compute spectra.
# Note that any convenient units can be used and the calculation will remain internally consistent.
E = np.linspace(0,100,201) * u.MeV
t = 50*u.ms
ispec = model.get_initial_spectra(t, E)
ospec_nmo = model.get_transformed_spectra(t, E, xform_nmo)
[7]:
fig, axes = plt.subplots(1,2, figsize=(12,5), sharex=True, sharey=True, tight_layout=True)
for i, spec in enumerate([ispec, ospec_nmo]):
ax = axes[i]
for flavor in Flavor:
ax.plot(E, spec[flavor],
label=flavor.to_tex(),
color='C0' if flavor.is_electron else 'C1',
ls='-' if flavor.is_neutrino else ':', lw=2,
alpha=0.7)
ax.set(xlabel=r'$E$ [{}]'.format(E.unit),
title='Initial Spectra: $t = ${:.1f}'.format(t) if i==0 else 'Oscillated Spectra: $t = ${:.1f}'.format(t))
ax.grid()
ax.legend(loc='upper right', ncol=2, fontsize=16)
ax = axes[0]
ax.set(ylabel=r'flux [erg$^{-1}$ s$^{-1}$]')
fig.tight_layout();