redback 1.0.1__py3-none-any.whl → 1.0.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- redback/__init__.py +4 -0
- redback/constraints.py +46 -25
- redback/eos.py +1 -0
- redback/get_data/fink.py +1 -1
- redback/get_data/lasair.py +3 -4
- redback/get_data/swift.py +7 -7
- redback/interaction_processes.py +1 -4
- redback/likelihoods.py +207 -21
- redback/model_library.py +2 -2
- redback/plotting.py +10 -10
- redback/priors/bazin_sne.prior +5 -0
- redback/priors/csm_interaction.prior +6 -7
- redback/priors/csm_nickel.prior +3 -3
- redback/priors/csm_shock_and_arnett.prior +11 -0
- redback/priors/csm_shock_and_arnett_bolometric.prior +10 -0
- redback/priors/csm_shock_breakout.prior +7 -0
- redback/priors/nicholl_bns.prior +2 -1
- redback/priors/one_comp_kne_rosswog_heatingrate.prior +5 -0
- redback/priors/pwn.prior +7 -0
- redback/priors/shocked_cocoon.prior +6 -6
- redback/priors/sn_fallback.prior +8 -0
- redback/priors/stream_stream_tde.prior +10 -0
- redback/priors/stream_stream_tde_bolometric.prior +9 -0
- redback/priors/tde_analytical.prior +5 -5
- redback/priors/tde_analytical_bolometric.prior +6 -4
- redback/priors/tde_fallback.prior +9 -0
- redback/priors/tde_fallback_bolometric.prior +6 -0
- redback/priors/tde_synchrotron.prior +6 -0
- redback/priors/tophat_from_emulator.prior +9 -0
- redback/priors/two_comp_kne_rosswog_heatingrate.prior +9 -0
- redback/priors/two_layer_stratified_kilonova.prior +1 -1
- redback/priors/villar_sne.prior +7 -0
- redback/priors.py +12 -1
- redback/sed.py +194 -2
- redback/simulate_transients.py +71 -35
- redback/tables/GRBs_w_redshift.txt +430 -413
- redback/tables/LGRB_table.txt +70 -6
- redback/tables/SGRB_table.txt +139 -135
- redback/tables/filters.csv +14 -0
- redback/tables/qdot_rosswogkorobkin24.pck +0 -0
- redback/tables/ztf.tar.gz +0 -0
- redback/transient/afterglow.py +17 -7
- redback/transient/kilonova.py +6 -3
- redback/transient/prompt.py +14 -4
- redback/transient/supernova.py +7 -3
- redback/transient/tde.py +6 -3
- redback/transient/transient.py +29 -12
- redback/transient_models/afterglow_models.py +152 -146
- redback/transient_models/combined_models.py +69 -48
- redback/transient_models/extinction_models.py +6 -6
- redback/transient_models/general_synchrotron_models.py +518 -0
- redback/transient_models/integrated_flux_afterglow_models.py +2 -2
- redback/transient_models/kilonova_models.py +310 -61
- redback/transient_models/magnetar_driven_ejecta_models.py +2 -2
- redback/transient_models/magnetar_models.py +1 -1
- redback/transient_models/phenomenological_models.py +69 -1
- redback/transient_models/shock_powered_models.py +159 -110
- redback/transient_models/supernova_models.py +211 -43
- redback/transient_models/tde_models.py +975 -5
- redback/utils.py +309 -16
- {redback-1.0.1.dist-info → redback-1.0.3.dist-info}/METADATA +46 -6
- {redback-1.0.1.dist-info → redback-1.0.3.dist-info}/RECORD +65 -49
- {redback-1.0.1.dist-info → redback-1.0.3.dist-info}/WHEEL +1 -1
- redback/tables/ztf_obslog.csv +0 -106649
- {redback-1.0.1.dist-info → redback-1.0.3.dist-info}/LICENCE.md +0 -0
- {redback-1.0.1.dist-info → redback-1.0.3.dist-info}/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import numpy as np
|
|
2
2
|
import pandas as pd
|
|
3
|
-
from redback.transient_models.phenomenological_models import exponential_powerlaw
|
|
3
|
+
from redback.transient_models.phenomenological_models import exponential_powerlaw, fallback_lbol
|
|
4
4
|
from redback.transient_models.magnetar_models import magnetar_only, basic_magnetar
|
|
5
5
|
from redback.transient_models.magnetar_driven_ejecta_models import _ejecta_dynamics_and_interaction
|
|
6
6
|
from redback.transient_models.shock_powered_models import _shock_cooling
|
|
@@ -21,7 +21,7 @@ homologous_expansion_models = ['exponential_powerlaw_bolometric', 'arnett_bolome
|
|
|
21
21
|
'type_1c_bolometric','type_1a_bolometric']
|
|
22
22
|
|
|
23
23
|
@citation_wrapper('https://zenodo.org/record/6363879#.YkQn3y8RoeY')
|
|
24
|
-
def sncosmo_models(time, redshift, model_kwargs, **kwargs):
|
|
24
|
+
def sncosmo_models(time, redshift, model_kwargs=None, **kwargs):
|
|
25
25
|
"""
|
|
26
26
|
A wrapper to SNCosmo models
|
|
27
27
|
|
|
@@ -33,28 +33,36 @@ def sncosmo_models(time, redshift, model_kwargs, **kwargs):
|
|
|
33
33
|
:param sncosmo_model: String of the SNcosmo model to use.
|
|
34
34
|
:param peak_time: SNe peak time in days
|
|
35
35
|
:param cosmology: astropy cosmology object by default set to Planck18
|
|
36
|
-
:param peak_abs_mag: SNe peak absolute magnitude default set to -19
|
|
37
|
-
:param peak_abs_mag_band: Band corresponding to the peak abs mag limit, default to standard::b. Must be in SNCosmo
|
|
38
36
|
:param mw_extinction: Boolean for whether there is MW extinction or not. Default True
|
|
39
|
-
:param magnitude_system: Mag system; default ab
|
|
40
37
|
:param host_extinction: Boolean for whether there is host extinction or not. Default True
|
|
41
38
|
if used adds an extra parameter ebv which must also be in kwargs; host galaxy E(B-V). Set to 0.1 by default
|
|
39
|
+
:param use_set_peak_magnitude: Boolean for whether to set the peak magnitude or not. Default False,
|
|
40
|
+
if True the following keyword arguments also apply. Else the brightness is set by the model_kwargs.
|
|
41
|
+
:param peak_abs_mag: SNe peak absolute magnitude default set to -19
|
|
42
|
+
:param peak_abs_mag_band: Band corresponding to the peak abs mag limit, default to standard::b. Must be in SNCosmo
|
|
43
|
+
:param magnitude_system: Mag system; default ab
|
|
42
44
|
:return: set by output format - 'flux_density', 'magnitude', 'flux', 'sncosmo_source'
|
|
43
45
|
"""
|
|
44
46
|
import sncosmo
|
|
45
|
-
cosmology = kwargs.get('cosmology', cosmo)
|
|
46
47
|
peak_time = kwargs.get('peak_time', 0)
|
|
47
|
-
|
|
48
|
-
peak_abs_mag_band = kwargs.get('peak_abs_mag_band', 'standard::b')
|
|
48
|
+
cosmology = kwargs.get('cosmology', cosmo)
|
|
49
49
|
model_name = kwargs.get('sncosmo_model', 'salt2')
|
|
50
50
|
host_extinction = kwargs.get('host_extinction', True)
|
|
51
51
|
mw_extinction = kwargs.get('mw_extinction', True)
|
|
52
|
-
|
|
52
|
+
use_set_peak_magnitude = kwargs.get('use_set_peak_magnitude', False)
|
|
53
53
|
|
|
54
54
|
model = sncosmo.Model(source=model_name)
|
|
55
55
|
model.set(z=redshift)
|
|
56
56
|
model.set(t0=peak_time)
|
|
57
|
-
|
|
57
|
+
|
|
58
|
+
if model_kwargs == None:
|
|
59
|
+
_model_kwargs = {}
|
|
60
|
+
for x in kwargs['model_kwarg_names']:
|
|
61
|
+
_model_kwargs[x] = kwargs[x]
|
|
62
|
+
else:
|
|
63
|
+
_model_kwargs = model_kwargs
|
|
64
|
+
|
|
65
|
+
model.update(_model_kwargs)
|
|
58
66
|
|
|
59
67
|
if host_extinction:
|
|
60
68
|
ebv = kwargs.get('ebv', 0.1)
|
|
@@ -63,13 +71,21 @@ def sncosmo_models(time, redshift, model_kwargs, **kwargs):
|
|
|
63
71
|
if mw_extinction:
|
|
64
72
|
model.add_effect(sncosmo.F99Dust(), 'mw', 'obs')
|
|
65
73
|
|
|
66
|
-
|
|
74
|
+
if use_set_peak_magnitude:
|
|
75
|
+
peak_abs_mag = kwargs.get('peak_abs_mag', -19)
|
|
76
|
+
peak_abs_mag_band = kwargs.get('peak_abs_mag_band', 'standard::b')
|
|
77
|
+
magsystem = kwargs.get('magnitude_system', 'ab')
|
|
78
|
+
model.set_source_peakabsmag(peak_abs_mag, band=peak_abs_mag_band, magsys=magsystem, cosmo=cosmology)
|
|
67
79
|
|
|
68
80
|
if kwargs['output_format'] == 'flux_density':
|
|
69
81
|
frequency = kwargs['frequency']
|
|
70
82
|
|
|
83
|
+
if isinstance(frequency, float):
|
|
84
|
+
frequency = np.array([frequency])
|
|
85
|
+
|
|
71
86
|
if (len(frequency) != 1 or len(frequency) == len(time)):
|
|
72
87
|
raise ValueError('frequency array must be of length 1 or same size as time array')
|
|
88
|
+
|
|
73
89
|
unique_frequency = np.sort(np.unique(frequency))
|
|
74
90
|
angstroms = nu_to_lambda(unique_frequency)
|
|
75
91
|
|
|
@@ -90,12 +106,12 @@ def sncosmo_models(time, redshift, model_kwargs, **kwargs):
|
|
|
90
106
|
|
|
91
107
|
if kwargs['output_format'] == 'flux':
|
|
92
108
|
bands = kwargs['bands']
|
|
93
|
-
magnitude = model.bandmag(
|
|
94
|
-
return sed.bandpass_magnitude_to_flux(magnitude=magnitude, bands=bands)
|
|
109
|
+
magnitude = model.bandmag(time=time, band=bands, magsys='ab')
|
|
110
|
+
return np.nan_to_num(sed.bandpass_magnitude_to_flux(magnitude=magnitude, bands=bands))
|
|
95
111
|
elif kwargs['output_format'] == 'magnitude':
|
|
96
112
|
bands = kwargs['bands']
|
|
97
|
-
magnitude = model.bandmag(
|
|
98
|
-
return magnitude
|
|
113
|
+
magnitude = model.bandmag(time=time, band=bands, magsys='ab')
|
|
114
|
+
return np.nan_to_num(magnitude)
|
|
99
115
|
elif kwargs['output_format'] == 'sncosmo_source':
|
|
100
116
|
return model
|
|
101
117
|
|
|
@@ -125,6 +141,64 @@ def exponential_powerlaw_bolometric(time, lbol_0, alpha_1, alpha_2, tpeak_d, **k
|
|
|
125
141
|
lbol = interaction_class.new_luminosity
|
|
126
142
|
return lbol
|
|
127
143
|
|
|
144
|
+
def sn_fallback(time, redshift, logl1, tr, **kwargs):
|
|
145
|
+
"""
|
|
146
|
+
:param time: observer frame time in days
|
|
147
|
+
:param redshift: source redshift
|
|
148
|
+
:param logl1: bolometric luminosity scale in log10 (cgs)
|
|
149
|
+
:param tr: transition time for luminosity
|
|
150
|
+
:param kwargs: Must be all the kwargs required by the specific interaction_process, photosphere, sed methods used
|
|
151
|
+
e.g., for Diffusion and TemperatureFloor: kappa, kappa_gamma, mej (solar masses), vej (km/s), floor temperature
|
|
152
|
+
:param interaction_process: Default is Diffusion.
|
|
153
|
+
Can also be None in which case the output is just the raw engine luminosity, or another interaction process.
|
|
154
|
+
:param photosphere: Default is TemperatureFloor.
|
|
155
|
+
kwargs must vej or relevant parameters if using different photosphere model
|
|
156
|
+
:param sed: Default is blackbody.
|
|
157
|
+
:param frequency: Required if output_format is ‘flux_density’.
|
|
158
|
+
frequency to calculate - Must be same length as time array or a single number).
|
|
159
|
+
:param bands: Required if output_format is ‘magnitude’ or ‘flux’.
|
|
160
|
+
:param output_format: ‘flux_density’, ‘magnitude’, ‘spectra’, ‘flux’, ‘sncosmo_source’
|
|
161
|
+
:param lambda_array: Optional argument to set your desired wavelength array (in Angstroms) to evaluate the SED on.
|
|
162
|
+
:param cosmology: Cosmology to use for luminosity distance calculation. Defaults to Planck18. Must be a astropy.cosmology object.
|
|
163
|
+
:return: set by output format - ‘flux_density’, ‘magnitude’, ‘spectra’, ‘flux’, ‘sncosmo_source’
|
|
164
|
+
"""
|
|
165
|
+
kwargs["interaction_process"] = kwargs.get("interaction_process", ip.Diffusion)
|
|
166
|
+
kwargs["photosphere"] = kwargs.get("photosphere", photosphere.TemperatureFloor)
|
|
167
|
+
kwargs["sed"] = kwargs.get("sed", sed.Blackbody)
|
|
168
|
+
cosmology = kwargs.get("cosmology", cosmo)
|
|
169
|
+
dl = cosmology.luminosity_distance(redshift).cgs.value
|
|
170
|
+
if kwargs['output_format'] == 'flux_density':
|
|
171
|
+
frequency = kwargs['frequency']
|
|
172
|
+
frequency, time = calc_kcorrected_properties(frequency=frequency, redshift=redshift, time=time)
|
|
173
|
+
lbol = fallback_lbol(time=time, logl1=logl1, tr=tr)
|
|
174
|
+
photo = kwargs['photosphere'](time=time, luminosity=lbol, **kwargs)
|
|
175
|
+
sed_1 = kwargs['sed'](temperature=photo.photosphere_temperature, r_photosphere=photo.r_photosphere,
|
|
176
|
+
frequency=frequency, luminosity_distance=dl)
|
|
177
|
+
flux_density = sed_1.flux_density
|
|
178
|
+
return flux_density.to(uu.mJy).value
|
|
179
|
+
else:
|
|
180
|
+
time_obs = time
|
|
181
|
+
lambda_observer_frame = kwargs.get('lambda_array', np.geomspace(100, 60000, 100))
|
|
182
|
+
time_temp = np.geomspace(0.1, 3000, 300) # in days
|
|
183
|
+
time_observer_frame = time_temp * (1. + redshift)
|
|
184
|
+
frequency, time = calc_kcorrected_properties(frequency=lambda_to_nu(lambda_observer_frame),
|
|
185
|
+
redshift=redshift, time=time_observer_frame)
|
|
186
|
+
lbol = fallback_lbol(time=time, logl1=logl1, tr=tr)
|
|
187
|
+
photo = kwargs['photosphere'](time=time, luminosity=lbol, **kwargs)
|
|
188
|
+
sed_1 = kwargs['sed'](temperature=photo.photosphere_temperature, r_photosphere=photo.r_photosphere,
|
|
189
|
+
frequency=frequency[:,None], luminosity_distance=dl)
|
|
190
|
+
fmjy = sed_1.flux_density.T
|
|
191
|
+
spectra = fmjy.to(uu.mJy).to(uu.erg / uu.cm ** 2 / uu.s / uu.Angstrom,
|
|
192
|
+
equivalencies=uu.spectral_density(wav=lambda_observer_frame * uu.Angstrom))
|
|
193
|
+
if kwargs['output_format'] == 'spectra':
|
|
194
|
+
return namedtuple('output', ['time', 'lambdas', 'spectra'])(time=time_observer_frame,
|
|
195
|
+
lambdas=lambda_observer_frame,
|
|
196
|
+
spectra=spectra)
|
|
197
|
+
else:
|
|
198
|
+
return sed.get_correct_output_format_from_spectra(time=time_obs, time_eval=time_observer_frame,
|
|
199
|
+
spectra=spectra, lambda_array=lambda_observer_frame,
|
|
200
|
+
**kwargs)
|
|
201
|
+
|
|
128
202
|
@citation_wrapper('https://ui.adsabs.harvard.edu/abs/2018ApJS..236....6G/abstract')
|
|
129
203
|
def sn_exponential_powerlaw(time, redshift, lbol_0, alpha_1, alpha_2, tpeak_d, **kwargs):
|
|
130
204
|
"""
|
|
@@ -289,7 +363,7 @@ def arnett(time, redshift, f_nickel, mej, **kwargs):
|
|
|
289
363
|
spectra=spectra, lambda_array=lambda_observer_frame,
|
|
290
364
|
**kwargs)
|
|
291
365
|
|
|
292
|
-
@citation_wrapper('
|
|
366
|
+
@citation_wrapper('https://ui.adsabs.harvard.edu/abs/1982ApJ...253..785A/abstract')
|
|
293
367
|
def shock_cooling_and_arnett(time, redshift, log10_mass, log10_radius, log10_energy,
|
|
294
368
|
f_nickel, mej, **kwargs):
|
|
295
369
|
"""
|
|
@@ -874,11 +948,9 @@ def _csm_engine(time, mej, csm_mass, vej, eta, rho, kappa, r0, **kwargs):
|
|
|
874
948
|
# scaling constant for CSM density profile
|
|
875
949
|
qq = rho * r0 ** eta
|
|
876
950
|
# outer CSM shell radius
|
|
877
|
-
radius_csm = ((3.0 - eta) / (4.0 * np.pi * qq) * csm_mass + r0 ** (3.0 - eta)) ** (
|
|
878
|
-
1.0 / (3.0 - eta))
|
|
951
|
+
radius_csm = ((3.0 - eta) / (4.0 * np.pi * qq) * csm_mass + r0 ** (3.0 - eta)) ** (1.0 / (3.0 - eta))
|
|
879
952
|
# photosphere radius
|
|
880
|
-
r_photosphere = abs((-2.0 * (1.0 - eta) / (3.0 * kappa * qq) +
|
|
881
|
-
radius_csm ** (1.0 - eta)) ** (1.0 / (1.0 - eta)))
|
|
953
|
+
r_photosphere = abs((-2.0 * (1.0 - eta) / (3.0 * kappa * qq) + radius_csm ** (1.0 - eta)) ** (1.0 / (1.0 - eta)))
|
|
882
954
|
|
|
883
955
|
# mass of the optically thick CSM (tau > 2/3).
|
|
884
956
|
mass_csm_threshold = np.abs(4.0 * np.pi * qq / (3.0 - eta) * (
|
|
@@ -904,20 +976,19 @@ def _csm_engine(time, mej, csm_mass, vej, eta, rho, kappa, r0, **kwargs):
|
|
|
904
976
|
(3.0 - nn) * g_n)) ** (1.0 / (3.0 - nn))) ** (
|
|
905
977
|
(nn - eta) / (eta - 3.0))
|
|
906
978
|
|
|
907
|
-
|
|
908
|
-
|
|
979
|
+
mask_RS = t_RS - time * day_to_s > 0
|
|
980
|
+
mask_FS = t_FS - time * day_to_s > 0
|
|
981
|
+
|
|
982
|
+
lbol_FS = 2.0 * np.pi / (nn - eta) ** 3 * g_n ** ((5.0 - eta) / (nn - eta)) * qq ** ((nn - 5.0) / (nn - eta)) \
|
|
983
|
+
* (nn - 3.0) ** 2 * (nn - 5.0) * Bf ** (5.0 - eta) * AA ** ((5.0 - eta) / (nn - eta)) * (time * day_to_s + ti) \
|
|
984
|
+
** ((2.0 * nn + 6.0 * eta - nn * eta - 15.) / (nn - eta))
|
|
909
985
|
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
(nn - eta)) + 2.0 * np.pi * (AA * g_n / qq) **
|
|
915
|
-
((5.0 - nn) / (nn - eta)) * Br ** (5.0 - nn) * g_n * ((3.0 - eta) / (nn - eta)) ** 3 * (
|
|
916
|
-
time * day_to_s + ti) **
|
|
917
|
-
((2.0 * nn + 6.0 * eta - nn * eta - 15.0) / (nn - eta)))
|
|
986
|
+
lbol_RS = 2.0 * np.pi * (AA * g_n / qq) ** ((5.0 - nn) / (nn - eta)) * Br ** (5.0 - nn) * g_n * ((3.0 - eta) / (nn - eta)) \
|
|
987
|
+
** 3 * (time * day_to_s + ti) ** ((2.0 * nn + 6.0 * eta - nn * eta - 15.0) / (nn - eta))
|
|
988
|
+
lbol_FS[~mask_FS] = 0
|
|
989
|
+
lbol_RS[~mask_RS] = 0
|
|
918
990
|
|
|
919
|
-
lbol
|
|
920
|
-
lbol[~mask_2] = 0
|
|
991
|
+
lbol = efficiency * (lbol_FS + lbol_RS)
|
|
921
992
|
|
|
922
993
|
csm_output = namedtuple('csm_output', ['lbol', 'r_photosphere', 'mass_csm_threshold'])
|
|
923
994
|
csm_output.lbol = lbol
|
|
@@ -926,7 +997,7 @@ def _csm_engine(time, mej, csm_mass, vej, eta, rho, kappa, r0, **kwargs):
|
|
|
926
997
|
return csm_output
|
|
927
998
|
|
|
928
999
|
|
|
929
|
-
@citation_wrapper('
|
|
1000
|
+
@citation_wrapper('https://ui.adsabs.harvard.edu/abs/2013ApJ...773...76C/abstract, https://ui.adsabs.harvard.edu/abs/2017ApJ...849...70V/abstract, https://ui.adsabs.harvard.edu/abs/2020RNAAS...4...16J/abstract')
|
|
930
1001
|
def csm_interaction_bolometric(time, mej, csm_mass, vej, eta, rho, kappa, r0, **kwargs):
|
|
931
1002
|
"""
|
|
932
1003
|
:param time: time in days in source frame
|
|
@@ -951,14 +1022,15 @@ def csm_interaction_bolometric(time, mej, csm_mass, vej, eta, rho, kappa, r0, **
|
|
|
951
1022
|
csm_output = _csm_engine(time=time, mej=mej, csm_mass=csm_mass, vej=vej,
|
|
952
1023
|
eta=eta, rho=rho, kappa=kappa, r0=r0, **kwargs)
|
|
953
1024
|
lbol = csm_output.lbol
|
|
954
|
-
r_photosphere = csm_output.r_photosphere
|
|
955
|
-
mass_csm_threshold = csm_output.mass_csm_threshold
|
|
956
1025
|
|
|
957
1026
|
if _interaction_process is not None:
|
|
958
1027
|
dense_resolution = kwargs.get("dense_resolution", 1000)
|
|
959
|
-
dense_times = np.
|
|
960
|
-
|
|
961
|
-
|
|
1028
|
+
dense_times = np.geomspace(0.1, time[-1]+100, dense_resolution)
|
|
1029
|
+
csm_output = _csm_engine(time=dense_times, mej=mej, csm_mass=csm_mass, vej=vej,
|
|
1030
|
+
eta=eta, rho=rho, kappa=kappa, r0=r0, **kwargs)
|
|
1031
|
+
dense_lbols = csm_output.lbol
|
|
1032
|
+
r_photosphere = csm_output.r_photosphere
|
|
1033
|
+
mass_csm_threshold = csm_output.mass_csm_threshold
|
|
962
1034
|
interaction_class = _interaction_process(time=time, dense_times=dense_times, luminosity=dense_lbols,
|
|
963
1035
|
kappa=kappa, r_photosphere=r_photosphere,
|
|
964
1036
|
mass_csm_threshold=mass_csm_threshold, csm_mass=csm_mass, **kwargs)
|
|
@@ -966,7 +1038,7 @@ def csm_interaction_bolometric(time, mej, csm_mass, vej, eta, rho, kappa, r0, **
|
|
|
966
1038
|
return lbol
|
|
967
1039
|
|
|
968
1040
|
|
|
969
|
-
@citation_wrapper('https://ui.adsabs.harvard.edu/abs/2013ApJ...773...76C/abstract')
|
|
1041
|
+
@citation_wrapper('https://ui.adsabs.harvard.edu/abs/2013ApJ...773...76C/abstract, https://ui.adsabs.harvard.edu/abs/2017ApJ...849...70V/abstract, https://ui.adsabs.harvard.edu/abs/2020RNAAS...4...16J/abstract')
|
|
970
1042
|
def csm_interaction(time, redshift, mej, csm_mass, vej, eta, rho, kappa, r0, **kwargs):
|
|
971
1043
|
"""
|
|
972
1044
|
:param time: time in days in observer frame
|
|
@@ -1017,7 +1089,7 @@ def csm_interaction(time, redshift, mej, csm_mass, vej, eta, rho, kappa, r0, **k
|
|
|
1017
1089
|
else:
|
|
1018
1090
|
time_obs = time
|
|
1019
1091
|
lambda_observer_frame = kwargs.get('lambda_array', np.geomspace(100, 60000, 100))
|
|
1020
|
-
time_temp = np.
|
|
1092
|
+
time_temp = np.linspace(0.1, 500, 300) # in days
|
|
1021
1093
|
time_observer_frame = time_temp * (1. + redshift)
|
|
1022
1094
|
frequency, time = calc_kcorrected_properties(frequency=lambda_to_nu(lambda_observer_frame),
|
|
1023
1095
|
redshift=redshift, time=time_observer_frame)
|
|
@@ -1341,7 +1413,7 @@ def general_magnetar_slsn(time, redshift, l0, tsd, nn, ** kwargs):
|
|
|
1341
1413
|
spectra=spectra, lambda_array=lambda_observer_frame,
|
|
1342
1414
|
**kwargs)
|
|
1343
1415
|
|
|
1344
|
-
@citation_wrapper('
|
|
1416
|
+
@citation_wrapper('https://ui.adsabs.harvard.edu/abs/2024MNRAS.527.6455O/abstract')
|
|
1345
1417
|
def general_magnetar_driven_supernova_bolometric(time, mej, E_sn, kappa, l0, tau_sd, nn, kappa_gamma, **kwargs):
|
|
1346
1418
|
"""
|
|
1347
1419
|
:param time: time in observer frame in days
|
|
@@ -1401,7 +1473,7 @@ def general_magnetar_driven_supernova_bolometric(time, mej, E_sn, kappa, l0, tau
|
|
|
1401
1473
|
else:
|
|
1402
1474
|
return lbol
|
|
1403
1475
|
|
|
1404
|
-
@citation_wrapper('
|
|
1476
|
+
@citation_wrapper('https://ui.adsabs.harvard.edu/abs/2024MNRAS.527.6455O/abstract')
|
|
1405
1477
|
def general_magnetar_driven_supernova(time, redshift, mej, E_sn, kappa, l0, tau_sd, nn, kappa_gamma, **kwargs):
|
|
1406
1478
|
"""
|
|
1407
1479
|
:param time: time in observer frame in days
|
|
@@ -1515,4 +1587,100 @@ def general_magnetar_driven_supernova(time, redshift, mej, E_sn, kappa, l0, tau_
|
|
|
1515
1587
|
else:
|
|
1516
1588
|
return sed.get_correct_output_format_from_spectra(time=time_obs, time_eval=time_observer_frame/day_to_s,
|
|
1517
1589
|
spectra=spectra, lambda_array=lambda_observer_frame,
|
|
1518
|
-
**kwargs)
|
|
1590
|
+
**kwargs)
|
|
1591
|
+
|
|
1592
|
+
|
|
1593
|
+
|
|
1594
|
+
@citation_wrapper('https://ui.adsabs.harvard.edu/abs/2022ApJ...933..238M/abstract, https://ui.adsabs.harvard.edu/abs/1982ApJ...253..785A/abstract')
|
|
1595
|
+
def csm_shock_and_arnett_bolometric(time, mej, f_nickel, csm_mass, v_min, beta, shell_radius,
|
|
1596
|
+
shell_width_ratio, kappa, **kwargs):
|
|
1597
|
+
"""
|
|
1598
|
+
Assumes CSM interaction for a shell-like CSM with a hard outer boundary and arnett model for radioactive decay
|
|
1599
|
+
|
|
1600
|
+
:param time: time in days in source frame
|
|
1601
|
+
:param mej: ejecta mass in solar masses
|
|
1602
|
+
:param f_nickel: fraction of nickel mass
|
|
1603
|
+
:param csm_mass: csm mass in solar masses
|
|
1604
|
+
:param v_min: ejecta velocity in km/s
|
|
1605
|
+
:param beta: velocity ratio in c (beta < 1)
|
|
1606
|
+
:param shell_radius: radius of shell in 10^14 cm
|
|
1607
|
+
:param kappa: opacity
|
|
1608
|
+
:param shell_width_ratio: shell width ratio (deltaR/R0)
|
|
1609
|
+
:param kwargs: kappa_gamma, temperature_floor, and any kwarg to
|
|
1610
|
+
change any other input physics/parameters from default.
|
|
1611
|
+
:return: bolometric luminosity in erg/s
|
|
1612
|
+
"""
|
|
1613
|
+
from redback.transient_models.shock_powered_models import csm_shock_breakout_bolometric
|
|
1614
|
+
nickel_lbol = arnett_bolometric(time=time, f_nickel=f_nickel,
|
|
1615
|
+
mej=mej, interaction_process=ip.Diffusion, kappa=kappa, vej=v_min, **kwargs)
|
|
1616
|
+
sbo_output = csm_shock_breakout_bolometric(time=time, v_min=v_min, beta=beta,
|
|
1617
|
+
kappa=kappa, csm_mass=csm_mass, shell_radius=shell_radius,
|
|
1618
|
+
shell_width_ratio=shell_width_ratio, **kwargs)
|
|
1619
|
+
lbol = nickel_lbol + sbo_output
|
|
1620
|
+
return lbol
|
|
1621
|
+
|
|
1622
|
+
|
|
1623
|
+
@citation_wrapper('https://ui.adsabs.harvard.edu/abs/2022ApJ...933..238M/abstract, https://ui.adsabs.harvard.edu/abs/1982ApJ...253..785A/abstract')
|
|
1624
|
+
def csm_shock_and_arnett(time, redshift, mej, f_nickel, csm_mass, v_min, beta, shell_radius,
|
|
1625
|
+
shell_width_ratio, kappa, **kwargs):
|
|
1626
|
+
"""
|
|
1627
|
+
Assumes CSM interaction for a shell-like CSM with a hard outer boundary and arnett model for radioactive decay
|
|
1628
|
+
|
|
1629
|
+
:param time: time in days in observer frame
|
|
1630
|
+
:param redshift: source redshift
|
|
1631
|
+
:param mej: ejecta mass in solar masses
|
|
1632
|
+
:param f_nickel: fraction of nickel mass
|
|
1633
|
+
:param csm_mass: csm mass in solar masses
|
|
1634
|
+
:param v_min: ejecta velocity in km/s
|
|
1635
|
+
:param beta: velocity ratio in c (beta < 1)
|
|
1636
|
+
:param shell_radius: radius of shell in 10^14 cm
|
|
1637
|
+
:param kappa: opacity
|
|
1638
|
+
:param shell_width_ratio: shell width ratio (deltaR/R0)
|
|
1639
|
+
:param kwargs: kappa_gamma, temperature_floor, and any kwarg to
|
|
1640
|
+
change any other input physics/parameters from default.
|
|
1641
|
+
:param frequency: Required if output_format is 'flux_density'.
|
|
1642
|
+
frequency to calculate - Must be same length as time array or a single number).
|
|
1643
|
+
:param bands: Required if output_format is 'magnitude' or 'flux'.
|
|
1644
|
+
:param output_format: 'flux_density', 'magnitude', 'spectra', 'flux', 'sncosmo_source'
|
|
1645
|
+
:param lambda_array: Optional argument to set your desired wavelength array (in Angstroms) to evaluate the SED on.
|
|
1646
|
+
:param cosmology: Cosmology to use for luminosity distance calculation. Defaults to Planck18. Must be a astropy.cosmology object.
|
|
1647
|
+
:return: set by output format - 'flux_density', 'magnitude', 'spectra', 'flux', 'sncosmo_source'
|
|
1648
|
+
"""
|
|
1649
|
+
cosmology = kwargs.get('cosmology', cosmo)
|
|
1650
|
+
dl = cosmology.luminosity_distance(redshift).cgs.value
|
|
1651
|
+
|
|
1652
|
+
if kwargs['output_format'] == 'flux_density':
|
|
1653
|
+
frequency = kwargs['frequency']
|
|
1654
|
+
frequency, time = calc_kcorrected_properties(frequency=frequency, redshift=redshift, time=time)
|
|
1655
|
+
lbol = csm_shock_and_arnett_bolometric(time=time, mej=mej, f_nickel=f_nickel, csm_mass=csm_mass,
|
|
1656
|
+
v_min=v_min, beta=beta, shell_radius=shell_radius,
|
|
1657
|
+
shell_width_ratio=shell_width_ratio, kappa=kappa, **kwargs)
|
|
1658
|
+
photo = photosphere.TemperatureFloor(time=time, luminosity=lbol, vej=v_min, **kwargs)
|
|
1659
|
+
sed_1 = sed.Blackbody(temperature=photo.photosphere_temperature, r_photosphere=photo.r_photosphere,
|
|
1660
|
+
frequency=frequency, luminosity_distance=dl)
|
|
1661
|
+
flux_density = sed_1.flux_density
|
|
1662
|
+
return flux_density.to(uu.mJy).value
|
|
1663
|
+
else:
|
|
1664
|
+
time_obs = time
|
|
1665
|
+
lambda_observer_frame = kwargs.get('lambda_array', np.geomspace(100, 60000, 100))
|
|
1666
|
+
time_temp = np.geomspace(0.1, 3000, 300) # in days
|
|
1667
|
+
time_observer_frame = time_temp * (1. + redshift)
|
|
1668
|
+
frequency, time = calc_kcorrected_properties(frequency=lambda_to_nu(lambda_observer_frame),
|
|
1669
|
+
redshift=redshift, time=time_observer_frame)
|
|
1670
|
+
lbol = csm_shock_and_arnett_bolometric(time=time, mej=mej, f_nickel=f_nickel, csm_mass=csm_mass,
|
|
1671
|
+
v_min=v_min, beta=beta, shell_radius=shell_radius,
|
|
1672
|
+
shell_width_ratio=shell_width_ratio, kappa=kappa, **kwargs)
|
|
1673
|
+
photo = photosphere.TemperatureFloor(time=time, luminosity=lbol, vej=v_min, **kwargs)
|
|
1674
|
+
sed_1 = sed.Blackbody(temperature=photo.photosphere_temperature, r_photosphere=photo.r_photosphere,
|
|
1675
|
+
frequency=frequency[:, None], luminosity_distance=dl)
|
|
1676
|
+
fmjy = sed_1.flux_density.T
|
|
1677
|
+
spectra = fmjy.to(uu.mJy).to(uu.erg / uu.cm ** 2 / uu.s / uu.Angstrom,
|
|
1678
|
+
equivalencies=uu.spectral_density(wav=lambda_observer_frame * uu.Angstrom))
|
|
1679
|
+
if kwargs['output_format'] == 'spectra':
|
|
1680
|
+
return namedtuple('output', ['time', 'lambdas', 'spectra'])(time=time_observer_frame,
|
|
1681
|
+
lambdas=lambda_observer_frame,
|
|
1682
|
+
spectra=spectra)
|
|
1683
|
+
else:
|
|
1684
|
+
return sed.get_correct_output_format_from_spectra(time=time_obs, time_eval=time_observer_frame,
|
|
1685
|
+
spectra=spectra, lambda_array=lambda_observer_frame,
|
|
1686
|
+
**kwargs)
|