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
redback/model_library.py CHANGED
@@ -1,13 +1,13 @@
1
1
  from redback.transient_models import afterglow_models, \
2
2
  extinction_models, kilonova_models, fireball_models, \
3
3
  gaussianprocess_models, magnetar_models, magnetar_driven_ejecta_models, phase_models, phenomenological_models, \
4
- prompt_models, shock_powered_models, supernova_models, tde_models, integrated_flux_afterglow_models, combined_models
4
+ prompt_models, shock_powered_models, supernova_models, tde_models, integrated_flux_afterglow_models, combined_models, general_synchrotron_models
5
5
  from redback.utils import get_functions_dict
6
6
 
7
7
  modules = [afterglow_models, extinction_models, fireball_models,
8
8
  gaussianprocess_models, integrated_flux_afterglow_models, kilonova_models,
9
9
  magnetar_models, magnetar_driven_ejecta_models,
10
- phase_models, phenomenological_models, prompt_models, shock_powered_models, supernova_models, tde_models, combined_models]
10
+ phase_models, phenomenological_models, prompt_models, shock_powered_models, supernova_models, tde_models, combined_models, general_synchrotron_models]
11
11
 
12
12
  all_models_dict = dict()
13
13
  modules_dict = dict()
redback/plotting.py CHANGED
@@ -346,7 +346,7 @@ class IntegratedFluxPlotter(Plotter):
346
346
  axes.plot(times, ys, color=self.random_sample_color, alpha=self.random_sample_alpha, lw=self.linewidth,
347
347
  zorder=self.zorder)
348
348
  elif self.uncertainty_mode == "credible_intervals":
349
- lower_bound, upper_bound, _ = redback.utils.calc_credible_intervals(samples=random_ys_list)
349
+ lower_bound, upper_bound, _ = redback.utils.calc_credible_intervals(samples=random_ys_list, interval=self.credible_interval_level)
350
350
  axes.fill_between(
351
351
  times, lower_bound, upper_bound, alpha=self.uncertainty_band_alpha, color=self.max_likelihood_color)
352
352
 
@@ -391,11 +391,11 @@ class LuminosityPlotter(IntegratedFluxPlotter):
391
391
 
392
392
  class MagnitudePlotter(Plotter):
393
393
 
394
- xlim_low_phase_model_multiplier = 0.9
395
- xlim_high_phase_model_multiplier = 1.1
396
- xlim_high_multiplier = 1.2
397
- ylim_low_magnitude_multiplier = 0.8
398
- ylim_high_magnitude_multiplier = 1.2
394
+ xlim_low_phase_model_multiplier = KwargsAccessorWithDefault("xlim_low_multiplier", 0.9)
395
+ xlim_high_phase_model_multiplier = KwargsAccessorWithDefault("xlim_high_multiplier", 1.1)
396
+ xlim_high_multiplier = KwargsAccessorWithDefault("xlim_high_multiplier", 1.2)
397
+ ylim_low_magnitude_multiplier = KwargsAccessorWithDefault("ylim_low_multiplier", 0.8)
398
+ ylim_high_magnitude_multiplier = KwargsAccessorWithDefault("ylim_high_multiplier", 1.2)
399
399
  ncols = KwargsAccessorWithDefault("ncols", 2)
400
400
 
401
401
  @property
@@ -635,11 +635,11 @@ class MagnitudePlotter(Plotter):
635
635
  elif self.uncertainty_mode == "credible_intervals":
636
636
  if band in self.band_scaling:
637
637
  if self.band_scaling.get("type") == 'x':
638
- lower_bound, upper_bound, _ = redback.utils.calc_credible_intervals(samples=np.array(random_ys_list) * self.band_scaling.get(band))
638
+ lower_bound, upper_bound, _ = redback.utils.calc_credible_intervals(samples=np.array(random_ys_list) * self.band_scaling.get(band), interval=self.credible_interval_level)
639
639
  elif self.band_scaling.get("type") == '+':
640
- lower_bound, upper_bound, _ = redback.utils.calc_credible_intervals(samples=np.array(random_ys_list) + self.band_scaling.get(band))
640
+ lower_bound, upper_bound, _ = redback.utils.calc_credible_intervals(samples=np.array(random_ys_list) + self.band_scaling.get(band), interval=self.credible_interval_level)
641
641
  else:
642
- lower_bound, upper_bound, _ = redback.utils.calc_credible_intervals(samples=np.array(random_ys_list))
642
+ lower_bound, upper_bound, _ = redback.utils.calc_credible_intervals(samples=np.array(random_ys_list), interval=self.credible_interval_level)
643
643
  axes.fill_between(
644
644
  times - self._reference_mjd_date, lower_bound, upper_bound,
645
645
  alpha=self.uncertainty_band_alpha, color=color_sample)
@@ -789,7 +789,7 @@ class MagnitudePlotter(Plotter):
789
789
  axes[ii].plot(times - self._reference_mjd_date, random_ys, color=color_sample,
790
790
  alpha=self.random_sample_alpha, lw=self.linewidth, zorder=self.zorder)
791
791
  elif self.uncertainty_mode == "credible_intervals":
792
- lower_bound, upper_bound, _ = redback.utils.calc_credible_intervals(samples=random_ys_list)
792
+ lower_bound, upper_bound, _ = redback.utils.calc_credible_intervals(samples=random_ys_list, interval=self.credible_interval_level)
793
793
  axes[ii].fill_between(
794
794
  times - self._reference_mjd_date, lower_bound, upper_bound,
795
795
  alpha=self.uncertainty_band_alpha, color=color_sample)
@@ -0,0 +1,5 @@
1
+ aa = LogUniform(1e-15,1e15,name='aa', latex_label = r'$A$')
2
+ bb = LogUniform(1e-15,1e15,name='bb', latex_label = r'$B$')
3
+ t0 = Uniform(0,50,name='t0', latex_label = r'$t_0$')
4
+ tau_rise = Uniform(0.01, 50, name='tau_rise', latex_label = r'$\\tau_{\\mathrm{rise}}$')
5
+ tau_fall = Uniform(1, 300, name='tau_fall', latex_label = r'$\\tau_{\\mathrm{fall}}$')
@@ -1,10 +1,9 @@
1
1
  redshift = Uniform(1e-3,3,name='redshift', latex_label = r'$z$')
2
- mej = LogUniform(1e-4, 100, 'mej', latex_label = r'$M_{\mathrm{ej} }~(M_\odot)$')
3
- csm_mass = LogUniform(1e-4, 100, 'csm_mass', latex_label = r'$M_{\mathrm{csm}}~(M_\odot)$')
2
+ mej = LogUniform(1, 100, 'mej', latex_label = r'$M_{\mathrm{ej} }~(M_\odot)$')
3
+ csm_mass = LogUniform(1, 100, 'csm_mass', latex_label = r'$M_{\mathrm{csm}}~(M_\odot)$')
4
4
  vej = LogUniform(1e3, 1e5, 'vej', latex_label = r'$v_{\mathrm{ej}}~(\mathrm{km}/\mathrm{s})$')
5
- eta = Uniform(0, 1, '\\eta', latex_label = r'$\\eta$')
6
- rho = Uniform(8, 12, 'rho', latex_label = r'$\\rho$')
7
- r0 = Uniform(4, 8, 'r0', latex_label=r'$r_0~({\mathrm{AU}})$')
5
+ eta = Uniform(0, 2, '\\eta', latex_label = r'$\\eta$')
6
+ rho = LogUniform(1e-14, 1e-12, 'rho', latex_label = r'$\\rho$')
7
+ r0 = Uniform(50, 700, 'r0', latex_label=r'$r_0~({\mathrm{AU}})$')
8
8
  kappa = Uniform(0.05, 2, 'kappa', latex_label = r'$\\kappa~(\mathrm{cm}^{2}/\mathrm{g})$')
9
- kappa_gamma = LogUniform(1e-4, 1e4, 'kappa_gamma', latex_label = r'$\\kappa_{\\gamma}~(\mathrm{cm}^{2}/\mathrm{g})$')
10
- temperature_floor = LogUniform(1e3,1e5,name = 'temperature_floor', latex_label = r'$T_{\mathrm{floor}}~(\mathrm{K})$')
9
+ temperature_floor = LogUniform(100,1e4,name = 'temperature_floor', latex_label = r'$T_{\mathrm{floor}}~(\mathrm{K})$')
@@ -3,9 +3,9 @@ mej = LogUniform(1e-4, 100, 'mej', latex_label = r'$M_{\mathrm{ej} }~(M_\odot)$'
3
3
  f_nickel = LogUniform(1e-3,1,name='f_nickel', latex_label = r'$f_{\mathrm{Ni}}$')
4
4
  csm_mass = LogUniform(1e-4, 100, 'csm_mass', latex_label = r'$M_{\mathrm{csm}}~(M_\odot)$')
5
5
  ek = LogUniform(1e48, 1e52, 'ek', latex_label = r'$E_{\mathrm{kin}}~(\mathrm{ erg})$')
6
- eta = Uniform(0, 1, '\\eta', latex_label = r'$\\eta$')
7
- rho = Uniform(8, 12, 'rho', latex_label = r'$\\rho$')
6
+ eta = Uniform(0, 2, '\\eta', latex_label = r'$\\eta$')
7
+ rho = LogUniform(1e-15, 1e-12, 'rho', latex_label = r'$\\rho$')
8
8
  r0 = Uniform(4, 8, 'r0', latex_label=r'$r_0~({\mathrm{AU}})$')
9
9
  kappa = Uniform(0.05, 2, 'kappa', latex_label = r'$\\kappa~(\mathrm{cm}^{2}/\mathrm{g})$')
10
10
  kappa_gamma = LogUniform(1e-4, 1e4, 'kappa_gamma', latex_label = r'$\\kappa_{\\gamma}~(\mathrm{cm}^{2}/\mathrm{g})$')
11
- temperature_floor = LogUniform(1e3,1e5,name = 'temperature_floor', latex_label = r'$T_{\mathrm{floor}}~(\mathrm{K})$')
11
+ temperature_floor = LogUniform(100,1e4,name = 'temperature_floor', latex_label = r'$T_{\mathrm{floor}}~(\mathrm{K})$')
@@ -0,0 +1,11 @@
1
+ redshift = Uniform(0.01, 1, 'redshift', latex_label=r'$z$')
2
+ mej = LogUniform(1e-4, 30, 'mej', latex_label = r'$M_{\mathrm{ej}}~(M_\odot)$')
3
+ f_nickel = LogUniform(1e-3,1,name='f_nickel', latex_label = r'$f_{\mathrm{Ni}}$')
4
+ csm_mass = LogUniform(1e-3, 5, 'csm_mass', latex_label=r'$M_{\mathrm{CSM}}~(M_{\odot})$')
5
+ v_min = LogUniform(1e3, 3e4, 'vej', latex_label = r'$v_{\mathrm{ej}}~(\mathrm{km}/\mathrm{s})$')
6
+ beta = Uniform(0.4, 0.5, 'beta', latex_label=r'$\\beta$')
7
+ kappa = Uniform(0.01, 1, 'kappa', latex_label = r'$\\kappa~(\mathrm{cm}^{2}/\mathrm{g})$')
8
+ shell_radius = Uniform(1e-2, 10, 'shell_radius', latex_label=r'$R_{\mathrm{shell}}~(10^{14}~\mathrm{cm})$')
9
+ shell_width_ratio = Uniform(0.1, 0.5, 'shell_width_ratio', latex_label=r'$\\Delta~R_{\mathrm{shell}}/R_{\mathrm{shell}}$')
10
+ kappa_gamma = LogUniform(1e-4, 1e4, 'kappa_gamma', latex_label = r'$\\kappa_{\\gamma}~(\mathrm{cm}^{2}/\mathrm{g})$')
11
+ temperature_floor = LogUniform(1e3,1e5,name = 'temperature_floor', latex_label = r'$T_{\mathrm{floor}}~(\mathrm{K})$')
@@ -0,0 +1,10 @@
1
+ mej = LogUniform(1e-4, 30, 'mej', latex_label = r'$M_{\mathrm{ej}}~(M_\odot)$')
2
+ f_nickel = LogUniform(1e-3,1,name='f_nickel', latex_label = r'$f_{\mathrm{Ni}}$')
3
+ csm_mass = LogUniform(1e-3, 5, 'csm_mass', latex_label=r'$M_{\mathrm{CSM}}~(M_{\odot})$')
4
+ v_min = LogUniform(1e3, 3e4, 'vej', latex_label = r'$v_{\mathrm{ej}}~(\mathrm{km}/\mathrm{s})$')
5
+ beta = Uniform(0.4, 0.5, 'beta', latex_label=r'$\\beta$')
6
+ kappa = Uniform(0.01, 1, 'kappa', latex_label = r'$\\kappa~(\mathrm{cm}^{2}/\mathrm{g})$')
7
+ shell_radius = Uniform(1e-2, 10, 'shell_radius', latex_label=r'$R_{\mathrm{shell}}~(10^{14}~\mathrm{cm})$')
8
+ shell_width_ratio = Uniform(0.1, 0.5, 'shell_width_ratio', latex_label=r'$\\Delta~R_{\mathrm{shell}}/R_{\mathrm{shell}}$')
9
+ kappa_gamma = LogUniform(1e-4, 1e4, 'kappa_gamma', latex_label = r'$\\kappa_{\\gamma}~(\mathrm{cm}^{2}/\mathrm{g})$')
10
+ temperature_floor = LogUniform(1e3,1e5,name = 'temperature_floor', latex_label = r'$T_{\mathrm{floor}}~(\mathrm{K})$')
@@ -0,0 +1,7 @@
1
+ redshift = Uniform(0.01, 1, 'redshift', latex_label=r'$z$')
2
+ csm_mass = LogUniform(1e-3, 2, 'csm_mass', latex_label=r'$M_{\mathrm{CSM}}~(M_{\odot})$')
3
+ v_min = LogUniform(1e3, 3e4, 'vej', latex_label = r'$v_{\mathrm{ej}}~(\mathrm{km}/\mathrm{s})$')
4
+ beta = Uniform(0.4, 0.5, 'beta', latex_label=r'$\\beta$')
5
+ kappa = Uniform(0.01, 1, 'kappa', latex_label = r'$\\kappa~(\mathrm{cm}^{2}/\mathrm{g})$')
6
+ shell_radius = Uniform(1e-2, 10, 'shell_radius', latex_label=r'$R_{\mathrm{shell}}~(10^{14}~\mathrm{cm})$')
7
+ shell_width_ratio = Uniform(0.1, 0.5, 'shell_width_ratio', latex_label=r'$\\Delta~R_{\mathrm{shell}}/R_{\mathrm{shell}}$')
@@ -8,7 +8,8 @@ mtov = Uniform(2.05, 2.4, 'mtov', latex_label = r'$M_{\mathrm{TOV}}~(M_\odot)$')
8
8
  epsilon = Uniform(0.05, 0.6, 'zeta', latex_label = r'$\\epsilon$')
9
9
  alpha = Uniform(0.1, 1, 'alpha', latex_label = r'$\\alpha$')
10
10
  cos_theta = Uniform(0.0, 1.0, 'cos_theta', latex_label = r'$\cos~\\theta$')
11
- cos_theta_cocoon = Uniform(0.707, 1.0, 'cos_theta_cocoon', latex_label = r'$\cos~\\theta_{\mathrm{cocoon}}$')
11
+ cos_theta_open = Uniform(0.707, 0.866, 'cos_theta_open', latex_label = r'$\cos~\\theta_{\mathrm{open}}$')
12
+ cos_theta_cocoon = Uniform(0.866, 1.0, 'cos_theta_cocoon', latex_label = r'$\cos~\\theta_{\mathrm{cocoon}}$')
12
13
  temperature_floor_1 = LogUniform(100, 6000, 'temperature_floor_1', latex_label = r'$T_{\mathrm{floor}~1}$ (K)')
13
14
  temperature_floor_2 = LogUniform(100, 6000, 'temperature_floor_2', latex_label = r'$T_{\mathrm{floor}~2}$ (K)')
14
15
  temperature_floor_3 = LogUniform(100, 6000, 'temperature_floor_3', latex_label = r'$T_{\mathrm{floor}~3}$ (K)')
@@ -0,0 +1,5 @@
1
+ redshift = Uniform(1e-6, 0.1, 'redshift', latex_label = r'$z$')
2
+ mej = Uniform(1e-2, 0.05, 'mej', latex_label = r'$M_{\mathrm{ej} }~(M_\odot)$')
3
+ vej = Uniform(0.05, 0.3, 'vej', latex_label = r'$v_{\mathrm{ej}}~(c)$')
4
+ ye = Uniform(0.05, 0.4, 'ye', latex_label = r'$Y_{e}$')
5
+ temperature_floor = LogUniform(100, 6000, 'temperature_floor', latex_label = r'$T_{\mathrm{floor}}~(\mathrm{K})$')
@@ -0,0 +1,7 @@
1
+ redshift = Uniform(1e-6,3,name='redshift', latex_label = r'$z$')
2
+ l0 = LogUniform(1e40, 1e50, 'l0', latex_label = r'$L_{\mathrm{0}} [erg s^{-1}]$')
3
+ tau_sd = LogUniform(1e2, 1e8, 'tau_sd', latex_label = r'$t_{\mathrm{SD}} [s]$')
4
+ nn = LogUniform(1.5, 10, 'nn', latex_label = r'$n$')
5
+ mej = LogUniform(1e-1, 100, 'mej', latex_label = r'$M_{\mathrm{ej}} [M_{\odot}]$')
6
+ eps_b = LogUniform(1e-7, 1, 'eps_b', latex_label = r'$\epsilon_{\mathrm{B}}$')
7
+ gamma_b = LogUniform(1e2, 1e7, 'gamma_b', latex_label = r'$\gamma_{\mathrm{b}}$')
@@ -1,8 +1,8 @@
1
1
  redshift = Uniform(1e-3,3,name='redshift', latex_label = r'$z$')
2
- mej = Uniform(1e-4, 0.1, 'mej', latex_label = r'$M_{\mathrm{ej} }~(M_\odot)$')
3
- vej = Uniform(0.1, 0.7, 'vej', latex_label = r'$v_{\mathrm{ej}}~(c)$')
2
+ mej = Uniform(1e-4, 0.2, 'mej', latex_label = r'$M_{\mathrm{ej} }~(M_\odot)$')
3
+ vej = Uniform(0.01, 0.7, 'vej', latex_label = r'$v_{\mathrm{ej}}~(c)$')
4
4
  eta = Uniform(1, 5, '\\eta', latex_label = r'$\\eta$')
5
- tshock = Uniform(1, 2, 'tshock', latex_label = r'$t_{\mathrm{shock}}~(\mathrm{s})$')
6
- shocked_fraction = Uniform(0.1, 1, 'shocked_fraction', latex_label = r'$f_{\mathrm{shocked}}$')
7
- cos_theta_cocoon = Uniform(0.2, 0.9, 'cos_theta_cocoon', latex_label = r'$\cos~\\theta_{\mathrm{cocoon}}$')
8
- kappa = Uniform(1, 30, 'kappa', latex_label = r'$\\kappa~(\mathrm{cm}^{2}/\mathrm{g})$')
5
+ tshock = Uniform(0.1, 10, 'tshock', latex_label = r'$t_{\mathrm{shock}}~(\mathrm{s})$')
6
+ shocked_fraction = Uniform(0.01, 1, 'shocked_fraction', latex_label = r'$f_{\mathrm{shocked}}$')
7
+ cos_theta_cocoon = Uniform(0.866, 1.0, 'cos_theta_cocoon', latex_label = r'$\cos~\\theta_{\mathrm{cocoon}}$')
8
+ kappa = Uniform(0.1, 30, 'kappa', latex_label = r'$\\kappa~(\mathrm{cm}^{2}/\mathrm{g})$')
@@ -0,0 +1,8 @@
1
+ redshift = Uniform(1e-3,3,name='redshift', latex_label = r'$z$')
2
+ logl1 = Uniform(51, 57, name='logl1', latex_label=r'$\log_{10}L_{1} [erg~s^{-1}]$')
3
+ tr = LogUniform(1e-4, 100, name='tr', latex_label=r'T_{r} [day]')
4
+ mej = LogUniform(1e-4, 100, 'mej', latex_label = r'$M_{\mathrm{ej}}~(M_\odot)$')
5
+ vej = LogUniform(1e3, 1e5, 'vej', latex_label = r'$v_{\mathrm{ej}}~(\mathrm{km}/\mathrm{s})$')
6
+ kappa = Uniform(0.05, 2, 'kappa', latex_label = r'$\\kappa~(\mathrm{cm}^{2}/\mathrm{g})$')
7
+ kappa_gamma = LogUniform(1e-4, 1e4, 'kappa_gamma', latex_label = r'$\\kappa_{\\gamma}~(\mathrm{cm}^{2}/\mathrm{g})$')
8
+ temperature_floor = LogUniform(1e3,1e5,name = 'temperature_floor', latex_label = r'$T_{\mathrm{floor}}~(\mathrm{K})$')
@@ -0,0 +1,10 @@
1
+ redshift = Uniform(1e-6, 3, 'redshift', latex_label = r'$z$')
2
+ peak_time = LogUniform(0.1,60, name='peak_time', latex_label = r'$t_{\mathrm{peak}}~(\mathrm{day})$')
3
+ sigma_t = LogUniform(10,60, name='sigma_t', latex_label = r'$\\sigma~(\mathrm{day})$')
4
+ mbh_6 = LogUniform(0.01, 20, name='mbh_6', latex_label = r'$M_{\mathrm{BH}}~(10^{6}~M_\odot)$')
5
+ mstar = LogUniform(0.1, 10, name='stellar_mass', latex_label = r'$M_{\mathrm{star}}~(M_\odot)$')
6
+ c1 = 1.0
7
+ del_omega = 2.0
8
+ f = 0.2
9
+ h_r = 0.2
10
+ inc_tcool = 1
@@ -0,0 +1,9 @@
1
+ peak_time = LogUniform(0.1,60, name='peak_time', latex_label = r'$t_{\mathrm{peak}}~(\mathrm{day})$')
2
+ sigma_t = LogUniform(10,60, name='sigma_t', latex_label = r'$\\sigma~(\mathrm{day})$')
3
+ mbh_6 = LogUniform(0.01, 20, name='mbh_6', latex_label = r'$M_{\mathrm{BH}}~(10^{6}~M_\odot)$')
4
+ mstar = LogUniform(0.1, 10, name='stellar_mass', latex_label = r'$M_{\mathrm{star}}~(M_\odot)$')
5
+ c1 = 1.0
6
+ del_omega = 2.0
7
+ f = 0.2
8
+ h_r = 0.2
9
+ inc_tcool = 1
@@ -1,8 +1,8 @@
1
1
  redshift = Uniform(0.01, 3, 'redshift', latex_label=r'$z$')
2
- mej = LogUniform(1e-4, 100, 'mej', latex_label = r'$M_{\mathrm{ej} }~(M_\odot)$')
2
+ mej = LogUniform(0.1, 100, 'mej', latex_label = r'$M_{\mathrm{ej} }~(M_\odot)$')
3
3
  vej = LogUniform(1e3, 1e5, 'vej', latex_label = r'$v_{\mathrm{ej}}~(\mathrm{km}/\mathrm{s})$')
4
- kappa = Uniform(0.05, 2, 'kappa', latex_label = r'$\\kappa~(\mathrm{cm}^{2}/\mathrm{g})$')
4
+ kappa = Uniform(0.05, 1e2, 'kappa', latex_label = r'$\\kappa~(\mathrm{cm}^{2}/\mathrm{g})$')
5
5
  kappa_gamma = LogUniform(1e-4, 1e4, 'kappa_gamma', latex_label = r'$\\kappa_{\\gamma}~(\mathrm{cm}^{2}/\mathrm{g})$')
6
- temperature_floor = LogUniform(1e3,1e5,name = 'temperature_floor', latex_label = r'$T_{\mathrm{floor}}~(\mathrm{K})$')
7
- l0 = LogUniform(1e51, 1e58, "l0", latex_label="$l_0$")
8
- t_0_turn = LogUniform(1e-4, 1e2, "t_0_turn", latex_label="$t_{0 t}$")
6
+ temperature_floor = LogUniform(1e3,1e4,name = 'temperature_floor', latex_label = r'$T_{\mathrm{floor}}~(\mathrm{K})$')
7
+ l0 = LogUniform(1e51, 1e60, "l0", latex_label="$l_0$")
8
+ t_0_turn = LogUniform(1e-4, 5e2, "t_0_turn", latex_label="$t_{0 t}$")
@@ -1,6 +1,8 @@
1
- mej = LogUniform(1e-4, 100, 'mej', latex_label = r'$M_{\mathrm{ej} }~(M_\odot)$')
1
+ redshift = Uniform(0.01, 3, 'redshift', latex_label=r'$z$')
2
+ mej = LogUniform(0.1, 100, 'mej', latex_label = r'$M_{\mathrm{ej} }~(M_\odot)$')
2
3
  vej = LogUniform(1e3, 1e5, 'vej', latex_label = r'$v_{\mathrm{ej}}~(\mathrm{km}/\mathrm{s})$')
3
- kappa = Uniform(0.05, 2, 'kappa', latex_label = r'$\\kappa~(\mathrm{cm}^{2}/\mathrm{g})$')
4
+ kappa = Uniform(0.05, 1e2, 'kappa', latex_label = r'$\\kappa~(\mathrm{cm}^{2}/\mathrm{g})$')
4
5
  kappa_gamma = LogUniform(1e-4, 1e4, 'kappa_gamma', latex_label = r'$\\kappa_{\\gamma}~(\mathrm{cm}^{2}/\mathrm{g})$')
5
- l0 = LogUniform(1e51, 1e58, "l0", latex_label="$l_0$")
6
- t_0_turn = LogUniform(1e-4, 1e2, "t_0_turn", latex_label="$t_{0 t}$")
6
+ temperature_floor = LogUniform(1e3,1e4,name = 'temperature_floor', latex_label = r'$T_{\mathrm{floor}}~(\mathrm{K})$')
7
+ l0 = LogUniform(1e51, 1e60, "l0", latex_label="$l_0$")
8
+ t_0_turn = LogUniform(1e-4, 5e2, "t_0_turn", latex_label="$t_{0 t}$")
@@ -0,0 +1,9 @@
1
+ redshift = Uniform(1e-6, 3, 'redshift', latex_label = r'$z$')
2
+ mbh6 = Uniform(0.01, 20, name='mbh_6', latex_label = r'$M_{\mathrm{BH}}~[10^{6}~M_{\odot}]$')
3
+ mstar = Uniform(0.1, 30, name='mstar', latex_label = r'$M_{\mathrm{star}} [M_{\odot}]$')
4
+ tvisc = LogUniform(1e-3, 1e2, name='tvisc', latex_label = r'$t_{\mathrm{visc}}$')
5
+ bb = Uniform(0, 2, name='bb', latex_label = r'$\\beta^{\star}$')
6
+ eta = LogUniform(1e-4, 0.4, name='eta', latex_label=r'$\eta$')
7
+ leddlimit = 1
8
+ rph0 = LogUniform(1e-4, 1e4, name='rph_0', latex_label = r'$R_{\mathrm{ph-0}}$')
9
+ lphoto = Uniform(0, 2, name='lphoto', latex_label = r'$L_{\mathrm{photo}}^{\star}$')
@@ -0,0 +1,6 @@
1
+ mbh6 = Uniform(0.01, 20, name='mbh_6', latex_label = r'$M_{\mathrm{BH}}~[10^{6}~M_{\odot}]$')
2
+ mstar = Uniform(0.1, 30, name='mstar', latex_label = r'$M_{\mathrm{star}} [M_{\odot}]$')
3
+ tvisc = LogUniform(1e-3, 1e2, name='tvisc', latex_label = r'$t_{\mathrm{visc}}$')
4
+ bb = Uniform(0, 2, name='bb', latex_label = r'$\\beta^{\star}$')
5
+ eta = LogUniform(1e-4, 0.4, name='eta', latex_label=r'$\eta$')
6
+ leddlimit = 1
@@ -0,0 +1,6 @@
1
+ redshift = Uniform(0.01, 3, 'redshift', latex_label=r'$z$')
2
+ Mej = Uniform(0.1, 10, 'Mej', latex_label = r'$M_{\mathrm{ej}}~(M_\odot)$')
3
+ vej = Uniform(1e3, 3e4, 'vej', latex_label = r'$v_{\mathrm{ej}}~(\mathrm{km}/\mathrm{s})$')
4
+ logepse = Uniform(-5, 0, 'logepse', latex_label=r'$\log_{10}~\\epsilon_{e}$')
5
+ logepsb = Uniform(-5, 0, 'logepsb', latex_label=r'$\log_{10}~\\epsilon_{B}$')
6
+ p = Uniform(2, 3, 'p', latex_label=r'$p$')
@@ -0,0 +1,9 @@
1
+ redshift = Uniform(0.01, 3, 'redshift', latex_label=r'$z$')
2
+ thv = Sine(name='thv', maximum=np.pi/2, latex_label=r'$\\theta_{\mathrm{observer}}~(\mathrm{rad})$')
3
+ loge0 = Uniform(44, 54, 'loge0', latex_label=r'$\log_{10}~E_{0} / {\mathrm{erg}}$')
4
+ thc = Uniform(0.01, 0.1, 'thc', latex_label=r'$\\theta_{\mathrm{core}}~({\mathrm{rad}})$')
5
+ logn0 = Uniform(-5, 2, 'logn0', latex_label=r'$\log_{10}~n_{\mathrm{ism}} / {\mathrm{cm}}^{-3}$')
6
+ p = Uniform(2, 3, 'p', latex_label=r'$p$')
7
+ logepse = Uniform(-5, 0, 'logepse', latex_label=r'$\log_{10}~\\epsilon_{e}$')
8
+ logepsb = Uniform(-5, 0, 'logepsb', latex_label=r'$\log_{10}~\\epsilon_{B}$')
9
+ g0 = Uniform(100,2000, 'g0', latex_label=r'$\\Gamma_{0}$')
@@ -0,0 +1,9 @@
1
+ redshift = Uniform(1e-6, 0.1, 'redshift', latex_label = r'$z$')
2
+ mej_1 = Uniform(1e-2, 0.05, 'mej', latex_label = r'$M_{\mathrm{ej}~1}~(M_\odot)$')
3
+ vej_1 = Uniform(0.05, 0.3, 'vej', latex_label = r'$v_{\mathrm{ej}~1}~(c)$')
4
+ ye_1 = Uniform(0.05, 0.5, 'ye', latex_label = r'$Y_{e~1}$')
5
+ temperature_floor_1 = LogUniform(100, 6000, 'temperature_floor', latex_label = r'$T_{\mathrm{floor}~1}~(\mathrm{K})$')
6
+ mej_2 = Uniform(1e-2, 0.05, 'mej', latex_label = r'$M_{\mathrm{ej}~2}~(M_\odot)$')
7
+ vej_2 = Uniform(0.05, 0.3, 'vej', latex_label = r'$v_{\mathrm{ej}~2}~(c)$')
8
+ ye_2 = Uniform(0.05, 0.5, 'ye', latex_label = r'$Y_{e~2}$')
9
+ temperature_floor_2 = LogUniform(100, 6000, 'temperature_floor', latex_label = r'$T_{\mathrm{floor}~2}~(\mathrm{K})$')
@@ -3,4 +3,4 @@ mej = Uniform(1e-2, 0.05, 'mej', latex_label = r'$M_{\mathrm{ej}}~(M_\odot)$')
3
3
  vej_1 = Uniform(0.05, 0.2, 'vej_1', latex_label = r'$v_{\mathrm{ej}~1}~(c)$')
4
4
  vej_2 = Uniform(0.3, 0.5, 'vej_2', latex_label = r'$v_{\mathrm{ej}~2}~(c)$')
5
5
  kappa = Uniform(1, 30, 'kappa', latex_label = r'$\\kappa~(\mathrm{cm}^{2}/\mathrm{g})$')
6
- beta = Uniform(1.5, 8, 'beta', latex_label = r'$\\beta$')
6
+ beta = Uniform(3.1, 8, 'beta', latex_label = r'$\\beta$')
@@ -0,0 +1,7 @@
1
+ aa = LogUniform(1e-15,1e15,name='aa', latex_label = r'$A$')
2
+ cc = LogUniform(1e-15,1e15,name='bb', latex_label = r'$C$')
3
+ t0 = Uniform(0,50,name='t0', latex_label = r'$t_0$')
4
+ tau_rise = Uniform(0.01, 50, name='tau_rise', latex_label = r'$\\tau_{\\mathrm{rise}}$')
5
+ tau_fall = Uniform(1, 300, name='tau_fall', latex_label = r'$\\tau_{\\mathrm{fall}}$')
6
+ gamma = Uniform(0.1, 100, name='gamma', latex_label = r'$\\gamma$')
7
+ nu = Uniform(0, 1, name='nu', latex_label = r'$\\nu$')
redback/priors.py CHANGED
@@ -9,7 +9,18 @@ from redback.utils import logger
9
9
 
10
10
 
11
11
  def get_priors(model, times=None, y=None, yerr=None, dt=None, **kwargs):
12
- prompt_prior_functions = dict(gaussian=get_gaussian_priors, skew_gaussian=get_skew_gaussian_priors,
12
+ """
13
+ Get the prior for the given model. If the model is a prompt model, the times, y, and yerr must be provided.
14
+
15
+ :param model: String referring to a name of a model implemented in Redback.
16
+ :param times: Time array
17
+ :param y: Y values, arbitrary units
18
+ :param yerr: Error on y values, arbitrary units
19
+ :param dt: time interval
20
+ :param kwargs: Extra arguments to be passed to the prior function
21
+ :return: priors: PriorDict object
22
+ """
23
+ prompt_prior_functions = dict(gaussian_prompt=get_gaussian_priors, skew_gaussian=get_skew_gaussian_priors,
13
24
  skew_exponential=get_skew_exponential_priors, fred=get_fred_priors,
14
25
  fred_extended=get_fred_extended_priors)
15
26
 
redback/sed.py CHANGED
@@ -6,6 +6,193 @@ from sncosmo import TimeSeriesSource
6
6
  from redback.constants import *
7
7
  from redback.utils import nu_to_lambda, bandpass_magnitude_to_flux
8
8
 
9
+ def _bandflux_single_redback(model, band, time_or_phase):
10
+ """
11
+
12
+ Synthetic photometry of a model through a single bandpass
13
+
14
+ :param model: Source object
15
+ :param band: Bandpass
16
+ :param time_or_phase: Time or phase numpy array
17
+ :return: bandflux through the bandpass
18
+ """
19
+ from sncosmo.utils import integration_grid
20
+ HC_ERG_AA = 1.9864458571489284e-08 # planck * speed_of_light in AA/s
21
+ MODEL_BANDFLUX_SPACING = 5.0 # Angstroms
22
+
23
+ if (band.minwave() < model.minwave() or band.maxwave() > model.maxwave()):
24
+ raise ValueError('bandpass {0!r:s} [{1:.6g}, .., {2:.6g}] '
25
+ 'outside spectral range [{3:.6g}, .., {4:.6g}]'
26
+ .format(band.name, band.minwave(), band.maxwave(),
27
+ model.minwave(), model.maxwave()))
28
+
29
+ # Set up wavelength grid. Spacing (dwave) evenly divides the bandpass,
30
+ # closest to 5 angstroms without going over.
31
+ wave, dwave = integration_grid(band.minwave(), band.maxwave(),
32
+ MODEL_BANDFLUX_SPACING)
33
+ trans = band(wave)
34
+ f = model._flux(time_or_phase, wave)
35
+ f = np.abs(f)
36
+ return np.sum(wave * trans * f, axis=1) * dwave / HC_ERG_AA
37
+
38
+
39
+ def _bandflux_redback(model, band, time_or_phase, zp, zpsys):
40
+ """
41
+ Support function for bandflux in Source and Model. Follows SNCOSMO
42
+
43
+ This is necessary to have outside because ``phase`` is used in Source
44
+ and ``time`` is used in Model, and we want the method signatures to
45
+ have the right variable name.
46
+ """
47
+ from sncosmo.magsystems import get_magsystem
48
+ from sncosmo.bandpasses import get_bandpass
49
+
50
+ if zp is not None and zpsys is None:
51
+ raise ValueError('zpsys must be given if zp is not None')
52
+
53
+ # broadcast arrays
54
+ if zp is None:
55
+ time_or_phase, band = np.broadcast_arrays(time_or_phase, band)
56
+ else:
57
+ time_or_phase, band, zp, zpsys = \
58
+ np.broadcast_arrays(time_or_phase, band, zp, zpsys)
59
+
60
+ # Convert all to 1-d arrays.
61
+ ndim = time_or_phase.ndim # Save input ndim for return val.
62
+ time_or_phase = np.atleast_1d(time_or_phase)
63
+ band = np.atleast_1d(band)
64
+ if zp is not None:
65
+ zp = np.atleast_1d(zp)
66
+ zpsys = np.atleast_1d(zpsys)
67
+
68
+ # initialize output arrays
69
+ bandflux = np.zeros(time_or_phase.shape, dtype=float)
70
+
71
+ # Loop over unique bands.
72
+ for b in set(band):
73
+ mask = band == b
74
+ b = get_bandpass(b)
75
+
76
+ fsum = _bandflux_single_redback(model, b, time_or_phase[mask])
77
+
78
+ if zp is not None:
79
+ zpnorm = 10. ** (0.4 * zp[mask])
80
+ bandzpsys = zpsys[mask]
81
+ for ms in set(bandzpsys):
82
+ mask2 = bandzpsys == ms
83
+ ms = get_magsystem(ms)
84
+ zpnorm[mask2] = zpnorm[mask2] / ms.zpbandflux(b)
85
+ fsum *= zpnorm
86
+
87
+ bandflux[mask] = fsum
88
+
89
+ if ndim == 0:
90
+ return bandflux[0]
91
+ return bandflux
92
+
93
+ def _bandmag_redback(model, band, magsys, time_or_phase):
94
+ """
95
+ Support function for bandflux in Source and Model.
96
+ This is necessary to have outside the models because ``phase`` is used in
97
+ Source and ``time`` is used in Model.
98
+ """
99
+ from sncosmo.magsystems import get_magsystem
100
+
101
+ bandflux = _bandflux_redback(model, band, time_or_phase, None, None)
102
+ band, magsys, bandflux = np.broadcast_arrays(band, magsys, bandflux)
103
+ return_scalar = (band.ndim == 0)
104
+ band = band.ravel()
105
+ magsys = magsys.ravel()
106
+ bandflux = bandflux.ravel()
107
+
108
+ result = np.empty(bandflux.shape, dtype=float)
109
+ for i, (b, ms, f) in enumerate(zip(band, magsys, bandflux)):
110
+ ms = get_magsystem(ms)
111
+ zpf = ms.zpbandflux(b)
112
+ result[i] = -2.5 * np.log10(f / zpf)
113
+
114
+ if return_scalar:
115
+ return result[0]
116
+ return result
117
+
118
+ class RedbackTimeSeriesSource(TimeSeriesSource):
119
+ def __init__(self, phase, wave, flux, **kwargs):
120
+ """
121
+ RedbackTimeSeriesSource is a subclass of sncosmo.TimeSeriesSource that adds the ability to return the
122
+ flux density at a given time and wavelength, and changes
123
+ the behaviour of the _flux method to better handle models with very low flux values.
124
+
125
+ :param phase: phase/time array
126
+ :param wave: wavelength array in Angstrom
127
+ :param spectra: spectra in erg/cm^2/s/A evaluated at all times and frequencies; shape (len(times), len(frequency_array))
128
+ :param kwargs: additional arguments
129
+ """
130
+ super(RedbackTimeSeriesSource, self).__init__(phase=phase, wave=wave, flux=flux, **kwargs)
131
+
132
+ def get_flux_density(self, time, wavelength):
133
+ """
134
+ Get the flux density at a given time and wavelength.
135
+
136
+ :param time: time in days
137
+ :param wavelength: wavelength in Angstrom
138
+ :return: flux density in erg/cm^2/s/A
139
+ """
140
+ return self._flux(time, wavelength)
141
+
142
+ def bandflux(self, band, phase, zp=None, zpsys=None):
143
+ """
144
+ Flux through the given bandpass(es) at the given phase(s).
145
+
146
+ Default return value is flux in photons / s / cm^2. If zp and zpsys
147
+ are given, flux(es) are scaled to the requested zeropoints.
148
+
149
+ Parameters
150
+ ----------
151
+ band : str or list_like
152
+ Name(s) of bandpass(es) in registry.
153
+ phase : float or list_like, optional
154
+ Phase(s) in days. Default is `None`, which corresponds to the full
155
+ native phase sampling of the model.
156
+ zp : float or list_like, optional
157
+ If given, zeropoint to scale flux to (must also supply ``zpsys``).
158
+ If not given, flux is not scaled.
159
+ zpsys : str or list_like, optional
160
+ Name of a magnitude system in the registry, specifying the system
161
+ that ``zp`` is in.
162
+
163
+ Returns
164
+ -------
165
+ bandflux : float or `~numpy.ndarray`
166
+ Flux in photons / s /cm^2, unless `zp` and `zpsys` are
167
+ given, in which case flux is scaled so that it corresponds
168
+ to the requested zeropoint. Return value is `float` if all
169
+ input parameters are scalars, `~numpy.ndarray` otherwise.
170
+ """
171
+ return _bandflux_redback(self, band, phase, zp, zpsys)
172
+
173
+ def bandmag(self, band, magsys, phase):
174
+ """Magnitude at the given phase(s) through the given
175
+ bandpass(es), and for the given magnitude system(s).
176
+
177
+ Parameters
178
+ ----------
179
+ band : str or list_like
180
+ Name(s) of bandpass in registry.
181
+ magsys : str or list_like
182
+ Name(s) of `~sncosmo.MagSystem` in registry.
183
+ phase : float or list_like
184
+ Phase(s) in days.
185
+
186
+ Returns
187
+ -------
188
+ mag : float or `~numpy.ndarray`
189
+ Magnitude for each item in band, magsys, phase.
190
+ The return value is a float if all parameters are not iterables.
191
+ The return value is an `~numpy.ndarray` if any are iterable.
192
+ """
193
+ return _bandmag_redback(self, band, magsys, phase)
194
+
195
+
9
196
 
10
197
  def blackbody_to_flux_density(temperature, r_photosphere, dl, frequency):
11
198
  """
@@ -298,13 +485,18 @@ def get_correct_output_format_from_spectra(time, time_eval, spectra, lambda_arra
298
485
  :param time: times in observer frame in days to evaluate the model on
299
486
  :param time_eval: times in observer frame where spectra are evaluated. A densely sampled array for accuracy
300
487
  :param bands: band array - must be same length as time array or a single band
301
- :param spectra: spectra in mJy evaluated at all times and frequencies; shape (len(times), len(frequency_array))
488
+ :param spectra: spectra in erg/cm^2/s/A evaluated at all times and frequencies; shape (len(times), len(frequency_array))
302
489
  :param lambda_array: wavelenth array in Angstrom in observer frame
303
490
  :param kwargs: Additional parameters
304
491
  :param output_format: 'flux', 'magnitude', 'sncosmo_source', 'flux_density'
305
492
  :return: flux, magnitude or SNcosmo TimeSeries Source depending on output format kwarg
306
493
  """
307
- source = TimeSeriesSource(phase=time_eval, wave=lambda_array, flux=spectra)
494
+ # clean up spectrum to remove nonsensical values before creating sncosmo source
495
+ spectra = np.nan_to_num(spectra)
496
+ spectra[spectra.value == np.nan_to_num(np.inf)] = 1e-30 * np.mean(spectra[5])
497
+ spectra[spectra.value == 0.] = 1e-30 * np.mean(spectra[5])
498
+
499
+ source = RedbackTimeSeriesSource(phase=time_eval, wave=lambda_array, flux=spectra)
308
500
  if kwargs['output_format'] == 'flux':
309
501
  bands = kwargs['bands']
310
502
  magnitude = source.bandmag(phase=time, band=bands, magsys='ab')