redback 1.0.31__py3-none-any.whl → 1.12.0__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 (50) hide show
  1. redback/__init__.py +3 -2
  2. redback/analysis.py +321 -4
  3. redback/filters.py +57 -23
  4. redback/get_data/directory.py +18 -0
  5. redback/likelihoods.py +260 -0
  6. redback/model_library.py +12 -2
  7. redback/plotting.py +335 -4
  8. redback/priors/blackbody_spectrum_with_absorption_and_emission_lines.prior +9 -0
  9. redback/priors/csm_shock_and_arnett_two_rphots.prior +11 -0
  10. redback/priors/exp_rise_powerlaw_decline.prior +6 -0
  11. redback/priors/powerlaw_spectrum_with_absorption_and_emission_lines.prior +8 -0
  12. redback/priors/salt2.prior +6 -0
  13. redback/priors/shock_cooling_and_arnett_bolometric.prior +11 -0
  14. redback/priors/shockcooling_morag.prior +6 -0
  15. redback/priors/shockcooling_morag_and_arnett.prior +10 -0
  16. redback/priors/shockcooling_morag_and_arnett_bolometric.prior +9 -0
  17. redback/priors/shockcooling_morag_bolometric.prior +5 -0
  18. redback/priors/shockcooling_sapirandwaxman.prior +6 -0
  19. redback/priors/shockcooling_sapirandwaxman_bolometric.prior +5 -0
  20. redback/priors/shockcooling_sapirwaxman_and_arnett.prior +10 -0
  21. redback/priors/shockcooling_sapirwaxman_and_arnett_bolometric.prior +9 -0
  22. redback/priors/shocked_cocoon_and_arnett.prior +13 -0
  23. redback/priors/synchrotron_ism.prior +6 -0
  24. redback/priors/synchrotron_massloss.prior +6 -0
  25. redback/priors/synchrotron_pldensity.prior +7 -0
  26. redback/priors/thermal_synchrotron_v2_fluxdensity.prior +8 -0
  27. redback/priors/thermal_synchrotron_v2_lnu.prior +7 -0
  28. redback/priors.py +10 -3
  29. redback/result.py +9 -1
  30. redback/sampler.py +46 -4
  31. redback/sed.py +48 -1
  32. redback/simulate_transients.py +5 -1
  33. redback/tables/filters.csv +265 -254
  34. redback/transient/__init__.py +2 -3
  35. redback/transient/transient.py +648 -10
  36. redback/transient_models/__init__.py +3 -2
  37. redback/transient_models/extinction_models.py +3 -2
  38. redback/transient_models/gaussianprocess_models.py +45 -0
  39. redback/transient_models/general_synchrotron_models.py +296 -6
  40. redback/transient_models/phenomenological_models.py +154 -7
  41. redback/transient_models/shock_powered_models.py +503 -40
  42. redback/transient_models/spectral_models.py +82 -0
  43. redback/transient_models/supernova_models.py +405 -31
  44. redback/transient_models/tde_models.py +57 -41
  45. redback/utils.py +302 -51
  46. {redback-1.0.31.dist-info → redback-1.12.0.dist-info}/METADATA +8 -6
  47. {redback-1.0.31.dist-info → redback-1.12.0.dist-info}/RECORD +50 -29
  48. {redback-1.0.31.dist-info → redback-1.12.0.dist-info}/WHEEL +1 -1
  49. {redback-1.0.31.dist-info → redback-1.12.0.dist-info/licenses}/LICENCE.md +0 -0
  50. {redback-1.0.31.dist-info → redback-1.12.0.dist-info}/top_level.txt +0 -0
@@ -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,6 @@
1
+ t0 = Uniform(58000, 59000, 't0', latex_label = '$t_0$')
2
+ m_peak = Uniform(16, 20, 'm_peak', latex_label = '$m_{peak}$')
3
+ tau_rise = Uniform(0.1, 10.0, 'tau_rise', latex_label = '$\\tau_{rise}$')
4
+ tau_decline = Uniform(0.1, 10.0, 'tau_decline', latex_label = '$\\tau_{decline}$')
5
+ alpha = Uniform(0.1, 5.0, 'alpha', latex_label = '$\\alpha$')
6
+ t_peak = Uniform(59000, 59500, 't_peak', latex_label = '$t_{peak}$')
@@ -0,0 +1,8 @@
1
+ aa = LogUniform(1e-2, 1e2, name='aa', latex_label=r'$A$')
2
+ alpha = Uniform(minimum=-5, maximum=5, name='alpha', latex_label=r'$\\alpha$')
3
+ lc1 = Uniform(2000, 7000, name='lc1', latex_label=r'$\Lambda_{\mathrm{emission}}$')
4
+ lc2 = Uniform(2000,7000, name='lc2', latex_label=r'$\Lambda_{\mathrm{absorption}}$')
5
+ ls1 = LogUniform(1e-34, 1e-31, name='ls1', latex_label=r'line_stength$_{\mathrm{emission}}$')
6
+ ls2 = LogUniform(1e-34, 1e-31, name='ls2', latex_label=r'line_stength$_{\mathrm{absorption}}$')
7
+ v1 = Uniform(1e3, 1e4, name='v1', latex_label=r'$v_{\mathrm{emission}}$')
8
+ v2 = Uniform(1e3, 1e4, name='v2', latex_label=r'$v_{\mathrm{absorption}}$')
@@ -0,0 +1,6 @@
1
+ redshift = Uniform(0.1, 0.2, name='redshift', latex_label=r'$z$')
2
+ peak_time = Uniform(10, 20, name='peak_time', latex_label=r'$t_{\mathrm{peak}}~(\mathrm{days})$')
3
+ t0 = Uniform(0, 1, name='t0', latex_label=r'$t_0~(\mathrm{days})$')
4
+ x0 = Uniform(1e-10, 1e-1, name='x0', latex_label=r'$x_0$')
5
+ x1 = Normal(0, 1, name='x1', latex_label=r'$x_1$')
6
+ c = Normal(0, 0.1, name='c', latex_label=r'$c$')
@@ -0,0 +1,11 @@
1
+ log10_mass = Uniform(-2, 3, 'log10_mass', latex_label=r'$\log_{10}~m_{\mathrm{en}} / M_\odot$')
2
+ log10_radius = Uniform(10, 14, 'log10_radius', latex_label=r'$\log_{10}~R_{\mathrm{en}} / {\mathrm{cm}}^{-3}$')
3
+ log10_energy = Uniform(40, 52, 'log10_energy', latex_label=r'$\log_{10}~E_{\mathrm{en}} / {\mathrm{erg}}$')
4
+ nn = Uniform(8, 12, 'nn', latex_label=r'$nn$')
5
+ delta = Uniform(1, 1.5, 'delta', latex_label=r'$\\Delta$')
6
+ f_nickel = LogUniform(1e-3,1,name='f_nickel', latex_label = r'$f_{\mathrm{Ni}}$')
7
+ mej = LogUniform(1e-4, 100, 'mej', latex_label = r'$M_{\mathrm{ej} }~(M_\odot)$')
8
+ vej = LogUniform(1e3, 1e5, 'vej', latex_label = r'$v_{\mathrm{ej}}~(\mathrm{km}/\mathrm{s})$')
9
+ kappa = Uniform(0.05, 2, 'kappa', latex_label = r'$\\kappa~(\mathrm{cm}^{2}/\mathrm{g})$')
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,6 @@
1
+ redshift = Uniform(0.05, 0.3, 'redshift', latex_label = r'$z$')
2
+ v_shock = LogUniform(1e3, 5e4, 'vej', latex_label = r'$v_{\mathrm{ej}}~(\mathrm{km}/\mathrm{s})$')
3
+ m_env = LogUniform(1e-3, 5, 'm_env', latex_label = r'$M_{\mathrm{env}}~(M_{\odot})$')
4
+ f_rho_m = Uniform(0.01, 20, 'f_rho_m', latex_label = r'$f_{\\rho_{m}}$')
5
+ radius = LogUniform(1e-2, 10, 'radius', latex_label=r'$R_{\mathrm{star}}~(10^{13}~\mathrm{cm})$')
6
+ kappa = Uniform(0.01, 1, 'kappa', latex_label = r'$\\kappa~(\mathrm{cm}^{2}/\mathrm{g})$')
@@ -0,0 +1,10 @@
1
+ redshift = Uniform(0.05, 0.3, 'redshift', latex_label = r'$z$')
2
+ v_shock = LogUniform(1e3, 5e4, 'vej', latex_label = r'$v_{\mathrm{ej}}~(\mathrm{km}/\mathrm{s})$')
3
+ m_env = LogUniform(1e-3, 5, 'm_env', latex_label = r'$M_{\mathrm{env}}~(M_{\odot})$')
4
+ mej = LogUniform(1e-4, 100, 'mej', latex_label = r'$M_{\mathrm{ej} }~(M_\odot)$')
5
+ f_rho = Uniform(0.5, 3, 'f_rho', latex_label = r'$f_{\\rho}$')
6
+ f_nickel = LogUniform(1e-3,1,name='f_nickel', latex_label = r'$f_{\mathrm{Ni}}$')
7
+ radius = LogUniform(1e-3, 10, 'radius', latex_label=r'$R_{\mathrm{star}}~(10^{13}~\mathrm{cm})$')
8
+ kappa = Uniform(0.01, 1, '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,8e3,name = 'temperature_floor', latex_label = r'$T_{\mathrm{floor}}~(\mathrm{K})$')
@@ -0,0 +1,9 @@
1
+ v_shock = LogUniform(1e3, 5e4, 'vej', latex_label = r'$v_{\mathrm{ej}}~(\mathrm{km}/\mathrm{s})$')
2
+ m_env = LogUniform(1e-3, 5, 'm_env', latex_label = r'$M_{\mathrm{env}}~(M_{\odot})$')
3
+ mej = LogUniform(1e-4, 100, 'mej', latex_label = r'$M_{\mathrm{ej} }~(M_\odot)$')
4
+ f_rho = Uniform(0.5, 3, 'f_rho', latex_label = r'$f_{\\rho}$')
5
+ f_nickel = LogUniform(1e-3,1,name='f_nickel', latex_label = r'$f_{\mathrm{Ni}}$')
6
+ radius = LogUniform(1e-3, 10, 'radius', latex_label=r'$R_{\mathrm{star}}~(10^{13}~\mathrm{cm})$')
7
+ kappa = Uniform(0.01, 1, 'kappa', latex_label = r'$\\kappa~(\mathrm{cm}^{2}/\mathrm{g})$')
8
+ kappa_gamma = LogUniform(1e-4, 1e4, 'kappa_gamma', latex_label = r'$\\kappa_\\gamma~(\mathrm{cm}^{2}/\mathrm{g})$')
9
+ temperature_floor = LogUniform(1e3,8e3,name = 'temperature_floor', latex_label = r'$T_{\mathrm{floor}}~(\mathrm{K})$')
@@ -0,0 +1,5 @@
1
+ v_shock = LogUniform(1e3, 5e4, 'vej', latex_label = r'$v_{\mathrm{ej}}~(\mathrm{km}/\mathrm{s})$')
2
+ m_env = LogUniform(1e-3, 5, 'm_env', latex_label = r'$M_{\mathrm{env}}~(M_{\odot})$')
3
+ f_rho_m = Uniform(0.01, 20, 'f_rho_m', latex_label = r'$f_{\\rho_{m}}$')
4
+ radius = LogUniform(1e-2, 10, 'radius', latex_label=r'$R_{\mathrm{star}}~(10^{13}~\mathrm{cm})$')
5
+ kappa = Uniform(0.01, 1, 'kappa', latex_label = r'$\\kappa~(\mathrm{cm}^{2}/\mathrm{g})$')
@@ -0,0 +1,6 @@
1
+ redshift = Uniform(0.05, 0.3, 'redshift', latex_label = r'$z$')
2
+ v_shock = LogUniform(1e3, 5e4, 'vej', latex_label = r'$v_{\mathrm{ej}}~(\mathrm{km}/\mathrm{s})$')
3
+ m_env = LogUniform(1e-3, 5, 'm_env', latex_label = r'$M_{\mathrm{env}}~(M_{\odot})$')
4
+ f_rho_m = Uniform(0.01, 20, 'f_rho_m', latex_label = r'$f_{\\rho_{m}}$')
5
+ radius = LogUniform(1e-2, 10, 'radius', latex_label=r'$R_{\mathrm{star}}~(10^{13}~\mathrm{cm})$')
6
+ kappa = Uniform(0.01, 1, 'kappa', latex_label = r'$\\kappa~(\mathrm{cm}^{2}/\mathrm{g})$')
@@ -0,0 +1,5 @@
1
+ v_shock = LogUniform(1e3, 5e4, 'vej', latex_label = r'$v_{\mathrm{ej}}~(\mathrm{km}/\mathrm{s})$')
2
+ m_env = Uniform(1e-3, 5, 'm_env', latex_label = r'$M_{\mathrm{env}}~(M_{\odot})$')
3
+ f_rho_m = Uniform(0.01, 20, 'f_rho_m', latex_label = r'$f_{\\rho_{m}}$')
4
+ radius = Uniform(1e-2, 10, 'radius', latex_label=r'$R_{\mathrm{star}}~(10^{13}~\mathrm{cm})$')
5
+ kappa = Uniform(0.01, 1, 'kappa', latex_label = r'$\\kappa~(\mathrm{cm}^{2}/\mathrm{g})$')
@@ -0,0 +1,10 @@
1
+ redshift = Uniform(0.05, 0.3, 'redshift', latex_label = r'$z$')
2
+ v_shock = LogUniform(1e3, 5e4, 'vej', latex_label = r'$v_{\mathrm{ej}}~(\mathrm{km}/\mathrm{s})$')
3
+ m_env = LogUniform(1e-3, 5, 'm_env', latex_label = r'$M_{\mathrm{env}}~(M_{\odot})$')
4
+ mej = LogUniform(1e-4, 100, 'mej', latex_label = r'$M_{\mathrm{ej} }~(M_\odot)$')
5
+ f_rho = Uniform(0.5, 3, 'f_rho', latex_label = r'$f_{\\rho}$')
6
+ f_nickel = LogUniform(1e-3,1,name='f_nickel', latex_label = r'$f_{\mathrm{Ni}}$')
7
+ radius = LogUniform(1e-3, 10, 'radius', latex_label=r'$R_{\mathrm{star}}~(10^{13}~\mathrm{cm})$')
8
+ kappa = Uniform(0.01, 1, '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,8e3,name = 'temperature_floor', latex_label = r'$T_{\mathrm{floor}}~(\mathrm{K})$')
@@ -0,0 +1,9 @@
1
+ v_shock = LogUniform(1e3, 5e4, 'vej', latex_label = r'$v_{\mathrm{ej}}~(\mathrm{km}/\mathrm{s})$')
2
+ m_env = LogUniform(1e-3, 5, 'm_env', latex_label = r'$M_{\mathrm{env}}~(M_{\odot})$')
3
+ mej = LogUniform(1e-4, 100, 'mej', latex_label = r'$M_{\mathrm{ej} }~(M_\odot)$')
4
+ f_rho = Uniform(0.5, 3, 'f_rho', latex_label = r'$f_{\\rho}$')
5
+ f_nickel = LogUniform(1e-3,1,name='f_nickel', latex_label = r'$f_{\mathrm{Ni}}$')
6
+ radius = LogUniform(1e-3, 10, 'radius', latex_label=r'$R_{\mathrm{star}}~(10^{13}~\mathrm{cm})$')
7
+ kappa = Uniform(0.01, 1, 'kappa', latex_label = r'$\\kappa~(\mathrm{cm}^{2}/\mathrm{g})$')
8
+ kappa_gamma = LogUniform(1e-4, 1e4, 'kappa_gamma', latex_label = r'$\\kappa_\\gamma~(\mathrm{cm}^{2}/\mathrm{g})$')
9
+ temperature_floor = LogUniform(1e3,8e3,name = 'temperature_floor', latex_label = r'$T_{\mathrm{floor}}~(\mathrm{K})$')
@@ -0,0 +1,13 @@
1
+ redshift = Uniform(1e-3,3,name='redshift', latex_label = r'$z$')
2
+ mej_c = Uniform(0.1, 2, 'mej_c', latex_label = r'$M_{\mathrm{cocoon} }~(M_\odot)$')
3
+ vej_c = Uniform(0.01, 0.3, 'vej_c', latex_label = r'$v_{\mathrm{cocoon}}~(c)$')
4
+ eta = Uniform(1, 5, '\\eta', latex_label = r'$\\eta$')
5
+ tshock = Uniform(0.1, 100, '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
+ f_nickel = LogUniform(1e-3,1,name='f_nickel', latex_label = r'$f_{\mathrm{Ni}}$')
9
+ mej = LogUniform(0.1, 100, 'mej', latex_label = r'$M_{\mathrm{ej}}~(M_\odot)$')
10
+ vej = LogUniform(1e3, 1e5, 'vej', latex_label = r'$v_{\mathrm{ej}}~(\mathrm{km}/\mathrm{s})$')
11
+ kappa = Uniform(0.05, 2, 'kappa', latex_label = r'$\\kappa~(\mathrm{cm}^{2}/\mathrm{g})$')
12
+ kappa_gamma = LogUniform(1e-4, 1e4, 'kappa_gamma', latex_label = r'$\\kappa_{\\gamma}~(\mathrm{cm}^{2}/\mathrm{g})$')
13
+ temperature_floor = LogUniform(1e3,1e5,name = 'temperature_floor', latex_label = r'$T_{\mathrm{floor}}~(\mathrm{K})$')
@@ -0,0 +1,6 @@
1
+ redshift = Uniform(0.01, 3, 'redshift', latex_label=r'$z$')
2
+ v_s = Uniform(1e3, 3e4, 'vej', latex_label = r'$v_{\mathrm{s}}~(\mathrm{km}/\mathrm{s})$')
3
+ logn0 = Uniform(-5, 2, 'logn0', latex_label=r'$\log_{10}~n_{\mathrm{ism}} / {\mathrm{cm}}^{-3}$')
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,6 @@
1
+ redshift = Uniform(0.01, 3, 'redshift', latex_label=r'$z$')
2
+ v_s = Uniform(1e3, 3e4, 'vej', latex_label = r'$v_{\mathrm{s}}~(\mathrm{km}/\mathrm{s})$')
3
+ log_Mdot_vwind = Uniform(-10, -4, 'log_Mdot_vwind', latex_label = r'$\dot{M}/u_{\mathrm{wind}}~(M_\odot \mathrm{s km year}^{-1})$')
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,7 @@
1
+ redshift = Uniform(0.01, 3, 'redshift', latex_label=r'$z$')
2
+ v_s = Uniform(1e3, 3e4, 'vej', latex_label = r'$v_{\mathrm{s}}~(\mathrm{km}/\mathrm{s})$')
3
+ logA = Uniform(-5, 5, 'logA', latex_label=r'$A / {\mathrm{cm}}^{-3}$')
4
+ s = Uniform(0, 2, 's', latex_label=r'$s$')
5
+ logepse = Uniform(-5, 0, 'logepse', latex_label=r'$\log_{10}~\\epsilon_{e}$')
6
+ logepsb = Uniform(-5, 0, 'logepsb', latex_label=r'$\log_{10}~\\epsilon_{B}$')
7
+ p = Uniform(2, 3, 'p', latex_label=r'$p$')
@@ -0,0 +1,8 @@
1
+ redshift = Uniform(0.01, 3, 'redshift', latex_label=r'$z$')
2
+ bG_sh = Uniform(0.1, 10, 'bG_sh', latex_label=r'$\\Gamma\\beta$')
3
+ log_Mdot_vwind = Uniform(-10, -4, 'log_Mdot_vwind', latex_label = r'$\dot{M}/u_{\mathrm{wind}}~(M_\odot \mathrm{s km year}^{-1})$')
4
+ n_ism = Uniform(0, 10, 'n_ism', latex_label=r'$n_{\mathrm{ism}} / {\mathrm{cm}}^{-3}$')
5
+ logepse = Uniform(-5, 0, 'logepse', latex_label=r'$\log_{10}~\\epsilon_{e}$')
6
+ logepsb = Uniform(-5, 0, 'logepsb', latex_label=r'$\log_{10}~\\epsilon_{B}$')
7
+ xi = Uniform(0.01, 1., 'xi', latex_label=r'$\\xi_{N}$')
8
+ p = Uniform(2, 3, 'p', latex_label=r'$p$')
@@ -0,0 +1,7 @@
1
+ bG_sh = Uniform(0.1, 10, 'bG_sh', latex_label=r'$\\\Gamma\\beta$')
2
+ log_Mdot_vwind = Uniform(-10, -4, 'log_Mdot_vwind', latex_label = r'$\dot{M}/u_{\mathrm{wind}}~(M_\odot \mathrm{s km year}^{-1})$')
3
+ n_ism = Uniform(0, 10, 'n_ism', latex_label=r'$n_{\mathrm{ism}} / {\mathrm{cm}}^{-3}$')
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
+ xi = Uniform(0.01, 1., 'xi', latex_label=r'$\\xi_{N}$')
7
+ p = Uniform(2, 3, 'p', latex_label=r'$p$')
redback/priors.py CHANGED
@@ -40,12 +40,19 @@ def get_priors(model, times=None, y=None, yerr=None, dt=None, **kwargs):
40
40
  return priors
41
41
 
42
42
  priors = PriorDict()
43
+
44
+ if model in redback.model_library.base_models_dict:
45
+ logger.info(f'Setting up prior for base model {model}.')
46
+ logger.info(f'You will need to explicitly set a prior on t0 and or extinction if relevant')
47
+
43
48
  try:
44
49
  filename = os.path.join(os.path.dirname(__file__), 'priors', f'{model}.prior')
45
50
  priors.from_file(filename)
46
- except FileNotFoundError as e:
47
- logger.warning(e)
48
- logger.warning('Returning empty PriorDict.')
51
+ except FileNotFoundError:
52
+ logger.warning(f'No prior file found for model {model}. '
53
+ f'Perhaps you also want to set up the prior for the base model? '
54
+ f'Or you may need to set up your prior explicitly.')
55
+ logger.info('Returning Empty PriorDict.')
49
56
  return priors
50
57
 
51
58
 
redback/result.py CHANGED
@@ -136,6 +136,14 @@ class RedbackResult(Result):
136
136
  return self.transient.plot_lightcurve(model=model, posterior=self.posterior,
137
137
  model_kwargs=self.model_kwargs, **kwargs)
138
138
 
139
+ def plot_spectrum(self, model: Union[callable, str] = None, **kwargs: None) -> matplotlib.axes.Axes:
140
+ """ Reconstructs the transient and calls the specific `plot_spectrum` method.
141
+ Detailed documentation appears below by running `print(plot_spectrum.__doc__)` """
142
+ if model is None:
143
+ model = model_library.all_models_dict[self.model]
144
+ return self.transient.plot_spectrum(model=model, posterior=self.posterior,
145
+ model_kwargs=self.model_kwargs, **kwargs)
146
+
139
147
  def plot_residual(self, model: Union[callable, str] = None, **kwargs: None) -> matplotlib.axes.Axes:
140
148
  """Reconstructs the transient and calls the specific `plot_residual` method.
141
149
  Detailed documentation appears below by running `print(plot_residual.__doc__)` """
@@ -168,7 +176,7 @@ class RedbackResult(Result):
168
176
  plot_multiband.__doc__ = plot_multiband.__doc__ + redback.transient.Transient.plot_multiband.__doc__
169
177
  plot_multiband_lightcurve.__doc__ = \
170
178
  plot_multiband_lightcurve.__doc__ + redback.transient.Transient.plot_multiband_lightcurve.__doc__
171
-
179
+ plot_spectrum.__doc__ = plot_spectrum.__doc__ + redback.transient.Spectrum.plot_spectrum.__doc__
172
180
 
173
181
  def read_in_result(
174
182
  filename: str = None, outdir: str = None, label: str = None,
redback/sampler.py CHANGED
@@ -12,7 +12,7 @@ from redback.result import RedbackResult
12
12
  from redback.utils import logger
13
13
  from redback.transient.afterglow import Afterglow
14
14
  from redback.transient.prompt import PromptTimeSeries
15
- from redback.transient.transient import OpticalTransient, Transient
15
+ from redback.transient.transient import OpticalTransient, Transient, Spectrum
16
16
 
17
17
 
18
18
  dirname = os.path.dirname(__file__)
@@ -40,11 +40,13 @@ def fit_model(
40
40
  :param resume: Whether to resume the run from a checkpoint if available.
41
41
  :param save_format: The format to save the result in. (Default value = 'json'_
42
42
  :param model_kwargs: Additional keyword arguments for the model.
43
- :param kwargs: Additional parameters that will be passed to the sampler
43
+ :param clean: If True, rerun the fitting, if false try to use previous results in the output directory.
44
44
  :param plot: If True, create corner and lightcurve plot
45
+ :param kwargs: Additional parameters that will be passed to the sampler
45
46
  :return: Redback result object, transient specific data object
46
47
  """
47
48
  if isinstance(model, str):
49
+ modelname = model
48
50
  model = all_models_dict[model]
49
51
 
50
52
  if transient.data_mode in ["flux_density", "magnitude"]:
@@ -53,12 +55,22 @@ def fit_model(
53
55
  f"Transient data mode {transient.data_mode} is inconsistent with "
54
56
  f"output format {model_kwargs['output_format']}. These should be the same.")
55
57
 
56
- prior = prior or bilby.prior.PriorDict(filename=f"{dirname}/Priors/{model}.prior")
58
+ if prior is None:
59
+ prior = bilby.prior.PriorDict(filename=f"{dirname}/priors/{modelname}.prior")
60
+ logger.warning(f"No prior given. Using default priors for {modelname}")
61
+ else:
62
+ prior = prior
57
63
  outdir = outdir or f"{transient.directory_structure.directory_path}/{model.__name__}"
58
64
  Path(outdir).mkdir(parents=True, exist_ok=True)
59
65
  label = label or transient.name
60
66
 
61
- if isinstance(transient, Afterglow):
67
+ if isinstance(transient, Spectrum):
68
+ return _fit_spectrum(transient=transient, model=model, outdir=outdir, label=label, sampler=sampler,
69
+ nlive=nlive, prior=prior, walks=walks,
70
+ resume=resume, save_format=save_format, model_kwargs=model_kwargs,
71
+ plot=plot, **kwargs)
72
+
73
+ elif isinstance(transient, Afterglow):
62
74
  return _fit_grb(
63
75
  transient=transient, model=model, outdir=outdir, label=label, sampler=sampler, nlive=nlive, prior=prior,
64
76
  walks=walks, use_photon_index_prior=use_photon_index_prior, resume=resume, save_format=save_format,
@@ -82,7 +94,37 @@ def fit_model(
82
94
  else:
83
95
  raise ValueError(f'Source type {transient.__class__.__name__} not known')
84
96
 
97
+ def _fit_spectrum(transient, model, outdir, label, likelihood=None, sampler='dynesty', nlive=3000, prior=None, walks=1000,
98
+ resume=True, save_format='json', model_kwargs=None, plot=True, **kwargs):
99
+ x, y, y_err = transient.angstroms, transient.flux_density, transient.flux_density_err
100
+ likelihood = likelihood or GaussianLikelihood(x=x, y=y, sigma=y_err, function=model, kwargs=model_kwargs)
101
+
102
+ meta_data = dict(model=model.__name__, transient_type=transient.__class__.__name__.lower())
103
+ transient_kwargs = {k.lstrip("_"): v for k, v in transient.__dict__.items()}
104
+ meta_data.update(transient_kwargs)
105
+ model_kwargs = redback.utils.check_kwargs_validity(model_kwargs)
106
+ meta_data['model_kwargs'] = model_kwargs
107
+ nthreads = kwargs.get('nthreads', 1)
108
+
109
+ result = None
110
+ if not kwargs.get("clean", False):
111
+ try:
112
+ result = redback.result.read_in_result(
113
+ outdir=outdir, label=label, extension=kwargs.get("extension", "json"), gzip=kwargs.get("gzip", False))
114
+ plt.close('all')
115
+ return result
116
+ except Exception:
117
+ pass
85
118
 
119
+ result = result or bilby.run_sampler(
120
+ likelihood=likelihood, priors=prior, label=label, sampler=sampler, nlive=nlive,
121
+ outdir=outdir, plot=plot, use_ratio=False, walks=walks, resume=resume,
122
+ maxmcmc=10 * walks, result_class=RedbackResult, meta_data=meta_data,
123
+ nthreads=nthreads, save_bounds=False, nsteps=nlive, nwalkers=walks, save=save_format, **kwargs)
124
+ plt.close('all')
125
+ if plot:
126
+ result.plot_spectrum(model=model)
127
+ return result
86
128
 
87
129
  def _fit_grb(transient, model, outdir, label, likelihood=None, sampler='dynesty', nlive=3000, prior=None, walks=1000,
88
130
  use_photon_index_prior=False, resume=True, save_format='json', model_kwargs=None, plot=True, **kwargs):
redback/sed.py CHANGED
@@ -203,7 +203,7 @@ def blackbody_to_flux_density(temperature, r_photosphere, dl, frequency):
203
203
  :param dl: luminosity_distance in cm
204
204
  :param frequency: frequency to calculate in Hz - Must be same length as time array or a single number.
205
205
  In source frame
206
- :return: flux_density
206
+ :return: flux_density in erg/s/Hz/cm^2
207
207
  """
208
208
  # adding units back in to ensure dimensions are correct
209
209
  frequency = frequency * uu.Hz
@@ -248,6 +248,53 @@ class _SED(object):
248
248
  # convert to mJy
249
249
  return flux_density.to(uu.mJy)
250
250
 
251
+ def boosted_bolometric_luminosity(temperature, radius, lambda_cut):
252
+ """
253
+ Compute the boosted bolometric luminosity for a blackbody with temperature T (K)
254
+ and radius R (cm) to account for missing blue flux.
255
+
256
+ It uses:
257
+ L_bb = 4π R² σ_SB T⁴,
258
+ F_tot = σ_SB T⁴, and integrates the flux density redward of lambda_cut.
259
+
260
+ Parameters
261
+ ----------
262
+ temperature : float
263
+ Temperature (K)
264
+ radius : float
265
+ Photospheric radius (cm)
266
+ lambda_cut : float
267
+ Cutoff wavelength in centimeters (i.e. converted from angstroms by multiplying by 1e-8)
268
+
269
+ Returns
270
+ -------
271
+ L_boosted : float
272
+ The corrected bolometric luminosity (erg/s)
273
+ """
274
+ from scipy.integrate import quad
275
+ sigma_SB = sigma_sb # Stefan–Boltzmann constant in cgs
276
+
277
+ # Compute pure-blackbody bolometric luminosity.
278
+ L_bb = 4.0 * np.pi * radius ** 2 * sigma_SB * temperature ** 4
279
+ # Total flux per unit area (erg/s/cm^2)
280
+ F_tot = sigma_SB * temperature ** 4
281
+
282
+ # Define the Planck function B_lambda (in erg/s/cm^2/cm/sr)
283
+ def planck_lambda(lam, T):
284
+ h = planck # erg s
285
+ c = speed_of_light # cm/s
286
+ k = boltzmann_constant # erg/K
287
+ return (2.0 * h * c ** 2) / (lam ** 5) / (np.exp(h * c / (lam * k * T)) - 1.0)
288
+
289
+ # Integrand: π * B_lambda gives flux per unit wavelength (erg/s/cm²/cm)
290
+ integrand = lambda lam, T: np.pi * planck_lambda(lam, T)
291
+ # Integrate from lambda_cut to infinity to get the red flux.
292
+ F_red, integration_error = quad(integrand, lambda_cut, np.inf, args=(temperature,))
293
+ # Compute boost factor.
294
+ Boost = F_tot / F_red
295
+ # Corrected luminosity.
296
+ return Boost * L_bb, L_bb
297
+
251
298
 
252
299
  class CutoffBlackbody(_SED):
253
300
 
@@ -76,7 +76,7 @@ class SimulateGenericTransient(object):
76
76
  injection_kwargs = self.parameters.copy()
77
77
  if 'bands' in model_kwargs.keys():
78
78
  injection_kwargs['bands'] = self.subset_bands
79
- injection_kwargs['output_format'] = 'magnitude'
79
+ injection_kwargs['output_format'] = model_kwargs['output_format']
80
80
  if 'frequency' in model_kwargs.keys():
81
81
  injection_kwargs['frequency'] = self.subset_frequency
82
82
  injection_kwargs['output_format'] = 'flux_density'
@@ -534,6 +534,10 @@ class SimulateOpticalTransient(object):
534
534
  Function to wrap user models into sncosmo model format for full functionality.
535
535
  :return: sncosmo source
536
536
  """
537
+ # Ensure sncosmo_kwargs is a dictionary
538
+ if self.sncosmo_kwargs is None:
539
+ self.sncosmo_kwargs = {}
540
+
537
541
  self.sncosmo_kwargs['max_time'] = self.sncosmo_kwargs.get('max_time', 100)
538
542
  self.parameters['wavelength_observer_frame'] = self.parameters.get('wavelength_observer_frame',
539
543
  np.geomspace(100,60000,100))