Tamborra 2014 Models

Data from Tamborra et al., Phys. Rev. D90:045032, 2014. Models (s20.0c and s27.0c) taken from the Garching Supernova archive (https://wwwmpa.mpa-garching.mpg.de/ccsnarchive/data/Tamborra2014/) with permission for use in SNEWS2.0.

Reference: I. Tamborra et al., Neutrino emission characteristics and detection opportunities based on three-dimensional supernova simulations, Phys. Rev D90:045032, 2014.

[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 Tamborra_2014
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 Tamborra_2014 model. We can use the param property to view all physics parameters and their possible values. However, for this model, not all combinations of these parameters are valid, so we use the get_param_combinations function to get a list of all valid combinations:

[2]:
# Tamborra_2014.param
Tamborra_2014.get_param_combinations()
[2]:
[{'progenitor_mass': <Quantity 11.2 solMass>, 'direction': 1, 'eos': 'LS220'},
 {'progenitor_mass': <Quantity 20. solMass>, 'direction': 1, 'eos': 'LS220'},
 {'progenitor_mass': <Quantity 27. solMass>, 'direction': 1, 'eos': 'LS220'},
 {'progenitor_mass': <Quantity 27. solMass>, 'direction': 2, 'eos': 'LS220'},
 {'progenitor_mass': <Quantity 27. solMass>, 'direction': 3, 'eos': 'LS220'}]

We’ll initialise two of these progenitors. If this is the first time you’re using a progenitor, snewpy will automatically download the required data files for you.

[3]:
m20 = Tamborra_2014(progenitor_mass=20*u.solMass, direction=1)
m27 = Tamborra_2014(progenitor_mass=27*u.solMass, direction=1)

m20
[3]:

Tamborra_2014 Model

Parameter

Value

EOS

LS220

Progenitor mass

\(20\) \(\mathrm{M_{\odot}}\)

Direction

1

Finally, let’s plot the luminosity of different neutrino flavors for this model. (Note that the Tamborra_2014 simulations didn’t distinguish between \(\nu_x\) and \(\bar{\nu}_x\), so both have the same luminosity.)

[4]:
fig, axes = plt.subplots(1, 2, figsize=(12, 5), sharex=True, sharey=True, tight_layout=True)

for i, model in enumerate([m20, m27]):
    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.0, 0.35),
           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}$]');
../../_images/nb_ccsn_Tamborra_2014_7_0.png

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

[5]:
# 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)
[6]:
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}$]');
../../_images/nb_ccsn_Tamborra_2014_10_0.png