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.
Files changed (66) hide show
  1. redback/__init__.py +4 -0
  2. redback/constraints.py +46 -25
  3. redback/eos.py +1 -0
  4. redback/get_data/fink.py +1 -1
  5. redback/get_data/lasair.py +3 -4
  6. redback/get_data/swift.py +7 -7
  7. redback/interaction_processes.py +1 -4
  8. redback/likelihoods.py +207 -21
  9. redback/model_library.py +2 -2
  10. redback/plotting.py +10 -10
  11. redback/priors/bazin_sne.prior +5 -0
  12. redback/priors/csm_interaction.prior +6 -7
  13. redback/priors/csm_nickel.prior +3 -3
  14. redback/priors/csm_shock_and_arnett.prior +11 -0
  15. redback/priors/csm_shock_and_arnett_bolometric.prior +10 -0
  16. redback/priors/csm_shock_breakout.prior +7 -0
  17. redback/priors/nicholl_bns.prior +2 -1
  18. redback/priors/one_comp_kne_rosswog_heatingrate.prior +5 -0
  19. redback/priors/pwn.prior +7 -0
  20. redback/priors/shocked_cocoon.prior +6 -6
  21. redback/priors/sn_fallback.prior +8 -0
  22. redback/priors/stream_stream_tde.prior +10 -0
  23. redback/priors/stream_stream_tde_bolometric.prior +9 -0
  24. redback/priors/tde_analytical.prior +5 -5
  25. redback/priors/tde_analytical_bolometric.prior +6 -4
  26. redback/priors/tde_fallback.prior +9 -0
  27. redback/priors/tde_fallback_bolometric.prior +6 -0
  28. redback/priors/tde_synchrotron.prior +6 -0
  29. redback/priors/tophat_from_emulator.prior +9 -0
  30. redback/priors/two_comp_kne_rosswog_heatingrate.prior +9 -0
  31. redback/priors/two_layer_stratified_kilonova.prior +1 -1
  32. redback/priors/villar_sne.prior +7 -0
  33. redback/priors.py +12 -1
  34. redback/sed.py +194 -2
  35. redback/simulate_transients.py +71 -35
  36. redback/tables/GRBs_w_redshift.txt +430 -413
  37. redback/tables/LGRB_table.txt +70 -6
  38. redback/tables/SGRB_table.txt +139 -135
  39. redback/tables/filters.csv +14 -0
  40. redback/tables/qdot_rosswogkorobkin24.pck +0 -0
  41. redback/tables/ztf.tar.gz +0 -0
  42. redback/transient/afterglow.py +17 -7
  43. redback/transient/kilonova.py +6 -3
  44. redback/transient/prompt.py +14 -4
  45. redback/transient/supernova.py +7 -3
  46. redback/transient/tde.py +6 -3
  47. redback/transient/transient.py +29 -12
  48. redback/transient_models/afterglow_models.py +152 -146
  49. redback/transient_models/combined_models.py +69 -48
  50. redback/transient_models/extinction_models.py +6 -6
  51. redback/transient_models/general_synchrotron_models.py +518 -0
  52. redback/transient_models/integrated_flux_afterglow_models.py +2 -2
  53. redback/transient_models/kilonova_models.py +310 -61
  54. redback/transient_models/magnetar_driven_ejecta_models.py +2 -2
  55. redback/transient_models/magnetar_models.py +1 -1
  56. redback/transient_models/phenomenological_models.py +69 -1
  57. redback/transient_models/shock_powered_models.py +159 -110
  58. redback/transient_models/supernova_models.py +211 -43
  59. redback/transient_models/tde_models.py +975 -5
  60. redback/utils.py +309 -16
  61. {redback-1.0.1.dist-info → redback-1.0.3.dist-info}/METADATA +46 -6
  62. {redback-1.0.1.dist-info → redback-1.0.3.dist-info}/RECORD +65 -49
  63. {redback-1.0.1.dist-info → redback-1.0.3.dist-info}/WHEEL +1 -1
  64. redback/tables/ztf_obslog.csv +0 -106649
  65. {redback-1.0.1.dist-info → redback-1.0.3.dist-info}/LICENCE.md +0 -0
  66. {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
- peak_abs_mag = kwargs.get('peak_abs_mag', -19)
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
- magsystem = kwargs.get('magnitude_system', 'ab')
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
- model.update(model_kwargs)
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
- model.set_source_peakabsmag(peak_abs_mag, band=peak_abs_mag_band, magsys=magsystem, cosmo=cosmology)
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(phase=time, band=bands, magsys='ab')
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(phase=time, band=bands, magsys='ab')
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('redback')
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
- mask_1 = t_FS - time * day_to_s > 0
908
- mask_2 = t_RS - time * day_to_s > 0
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
- lbol = efficiency * (2.0 * np.pi / (nn - eta) ** 3 * g_n ** ((5.0 - eta) / (nn - eta)) * qq **
911
- ((nn - 5.0) / (nn - eta)) * (nn - 3.0) ** 2 * (nn - 5.0) * Bf ** (5.0 - eta) * AA **
912
- ((5.0 - eta) / (nn - eta)) * (time * day_to_s + ti) **
913
- ((2.0 * nn + 6.0 * eta - nn * eta - 15.) /
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[~mask_1] = 0
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('redback')
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.linspace(0, time[-1]+100, dense_resolution)
960
- dense_lbols = _csm_engine(time=dense_times, mej=mej, csm_mass=csm_mass, vej=vej,
961
- eta=eta, rho=rho, kappa=kappa, r0=r0, **kwargs).lbol
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.geomspace(0.1, 3000, 300) # in days
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('Omand and Sarin (2023)')
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('Omand and Sarin (2023)')
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)