redback 1.0.31__tar.gz → 1.1__tar.gz

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 (220) hide show
  1. {redback-1.0.31 → redback-1.1}/PKG-INFO +8 -6
  2. {redback-1.0.31 → redback-1.1}/README.md +3 -3
  3. {redback-1.0.31 → redback-1.1}/redback/__init__.py +3 -2
  4. redback-1.1/redback/analysis.py +470 -0
  5. {redback-1.0.31 → redback-1.1}/redback/filters.py +57 -23
  6. {redback-1.0.31 → redback-1.1}/redback/get_data/directory.py +18 -0
  7. {redback-1.0.31 → redback-1.1}/redback/likelihoods.py +260 -0
  8. {redback-1.0.31 → redback-1.1}/redback/model_library.py +12 -2
  9. {redback-1.0.31 → redback-1.1}/redback/plotting.py +335 -4
  10. redback-1.1/redback/priors/blackbody_spectrum_with_absorption_and_emission_lines.prior +9 -0
  11. redback-1.1/redback/priors/csm_shock_and_arnett_two_rphots.prior +11 -0
  12. redback-1.1/redback/priors/exp_rise_powerlaw_decline.prior +6 -0
  13. redback-1.1/redback/priors/powerlaw_spectrum_with_absorption_and_emission_lines.prior +8 -0
  14. redback-1.1/redback/priors/shockcooling_morag.prior +6 -0
  15. redback-1.1/redback/priors/shockcooling_morag_and_arnett.prior +10 -0
  16. redback-1.1/redback/priors/shockcooling_morag_and_arnett_bolometric.prior +9 -0
  17. redback-1.1/redback/priors/shockcooling_morag_bolometric.prior +5 -0
  18. redback-1.1/redback/priors/shockcooling_sapirandwaxman.prior +6 -0
  19. redback-1.1/redback/priors/shockcooling_sapirandwaxman_bolometric.prior +5 -0
  20. redback-1.1/redback/priors/shockcooling_sapirwaxman_and_arnett.prior +10 -0
  21. redback-1.1/redback/priors/shockcooling_sapirwaxman_and_arnett_bolometric.prior +9 -0
  22. redback-1.1/redback/priors/shocked_cocoon_and_arnett.prior +13 -0
  23. redback-1.1/redback/priors/synchrotron_ism.prior +6 -0
  24. redback-1.1/redback/priors/synchrotron_massloss.prior +6 -0
  25. redback-1.1/redback/priors/synchrotron_pldensity.prior +7 -0
  26. redback-1.1/redback/priors/thermal_synchrotron_v2_fluxdensity.prior +8 -0
  27. redback-1.1/redback/priors/thermal_synchrotron_v2_lnu.prior +7 -0
  28. {redback-1.0.31 → redback-1.1}/redback/priors.py +10 -3
  29. {redback-1.0.31 → redback-1.1}/redback/result.py +9 -1
  30. {redback-1.0.31 → redback-1.1}/redback/sampler.py +46 -4
  31. {redback-1.0.31 → redback-1.1}/redback/sed.py +48 -1
  32. {redback-1.0.31 → redback-1.1}/redback/simulate_transients.py +5 -1
  33. redback-1.1/redback/tables/filters.csv +265 -0
  34. {redback-1.0.31 → redback-1.1}/redback/transient/__init__.py +2 -3
  35. {redback-1.0.31 → redback-1.1}/redback/transient/transient.py +648 -10
  36. {redback-1.0.31 → redback-1.1}/redback/transient_models/__init__.py +3 -2
  37. {redback-1.0.31 → redback-1.1}/redback/transient_models/extinction_models.py +3 -2
  38. redback-1.1/redback/transient_models/gaussianprocess_models.py +45 -0
  39. {redback-1.0.31 → redback-1.1}/redback/transient_models/general_synchrotron_models.py +296 -6
  40. {redback-1.0.31 → redback-1.1}/redback/transient_models/phenomenological_models.py +154 -7
  41. {redback-1.0.31 → redback-1.1}/redback/transient_models/shock_powered_models.py +503 -40
  42. redback-1.1/redback/transient_models/spectral_models.py +82 -0
  43. {redback-1.0.31 → redback-1.1}/redback/transient_models/supernova_models.py +333 -7
  44. {redback-1.0.31 → redback-1.1}/redback/transient_models/tde_models.py +57 -41
  45. {redback-1.0.31 → redback-1.1}/redback/utils.py +302 -51
  46. {redback-1.0.31 → redback-1.1}/redback.egg-info/PKG-INFO +8 -6
  47. {redback-1.0.31 → redback-1.1}/redback.egg-info/SOURCES.txt +19 -0
  48. {redback-1.0.31 → redback-1.1}/redback.egg-info/requires.txt +1 -0
  49. {redback-1.0.31 → redback-1.1}/setup.py +3 -2
  50. redback-1.0.31/redback/analysis.py +0 -153
  51. redback-1.0.31/redback/tables/filters.csv +0 -254
  52. redback-1.0.31/redback/transient_models/gaussianprocess_models.py +0 -0
  53. {redback-1.0.31 → redback-1.1}/LICENCE.md +0 -0
  54. {redback-1.0.31 → redback-1.1}/redback/constants.py +0 -0
  55. {redback-1.0.31 → redback-1.1}/redback/constraints.py +0 -0
  56. {redback-1.0.31 → redback-1.1}/redback/ejecta_relations.py +0 -0
  57. {redback-1.0.31 → redback-1.1}/redback/eos.py +0 -0
  58. {redback-1.0.31 → redback-1.1}/redback/get_data/__init__.py +0 -0
  59. {redback-1.0.31 → redback-1.1}/redback/get_data/batse.py +0 -0
  60. {redback-1.0.31 → redback-1.1}/redback/get_data/fermi.py +0 -0
  61. {redback-1.0.31 → redback-1.1}/redback/get_data/fink.py +0 -0
  62. {redback-1.0.31 → redback-1.1}/redback/get_data/getter.py +0 -0
  63. {redback-1.0.31 → redback-1.1}/redback/get_data/konus.py +0 -0
  64. {redback-1.0.31 → redback-1.1}/redback/get_data/lasair.py +0 -0
  65. {redback-1.0.31 → redback-1.1}/redback/get_data/open_data.py +0 -0
  66. {redback-1.0.31 → redback-1.1}/redback/get_data/swift.py +0 -0
  67. {redback-1.0.31 → redback-1.1}/redback/get_data/utils.py +0 -0
  68. {redback-1.0.31 → redback-1.1}/redback/interaction_processes.py +0 -0
  69. {redback-1.0.31 → redback-1.1}/redback/photosphere.py +0 -0
  70. {redback-1.0.31 → redback-1.1}/redback/plot_styles/paper.mplstyle +0 -0
  71. {redback-1.0.31 → redback-1.1}/redback/priors/alternativepowerlaw_redback.prior +0 -0
  72. {redback-1.0.31 → redback-1.1}/redback/priors/alternativepowerlaw_redback_refreshed.prior +0 -0
  73. {redback-1.0.31 → redback-1.1}/redback/priors/arnett.prior +0 -0
  74. {redback-1.0.31 → redback-1.1}/redback/priors/arnett_bolometric.prior +0 -0
  75. {redback-1.0.31 → redback-1.1}/redback/priors/basic_magnetar.prior +0 -0
  76. {redback-1.0.31 → redback-1.1}/redback/priors/basic_magnetar_powered.prior +0 -0
  77. {redback-1.0.31 → redback-1.1}/redback/priors/basic_magnetar_powered_bolometric.prior +0 -0
  78. {redback-1.0.31 → redback-1.1}/redback/priors/basic_mergernova.prior +0 -0
  79. {redback-1.0.31 → redback-1.1}/redback/priors/bazin_sne.prior +0 -0
  80. {redback-1.0.31 → redback-1.1}/redback/priors/bulla_bns_kilonova.prior +0 -0
  81. {redback-1.0.31 → redback-1.1}/redback/priors/bulla_nsbh_kilonova.prior +0 -0
  82. {redback-1.0.31 → redback-1.1}/redback/priors/cocoon.prior +0 -0
  83. {redback-1.0.31 → redback-1.1}/redback/priors/collapsing_magnetar.prior +0 -0
  84. {redback-1.0.31 → redback-1.1}/redback/priors/collapsing_radiative_losses.prior +0 -0
  85. {redback-1.0.31 → redback-1.1}/redback/priors/cone_afterglow.prior +0 -0
  86. {redback-1.0.31 → redback-1.1}/redback/priors/cooling_envelope.prior +0 -0
  87. {redback-1.0.31 → redback-1.1}/redback/priors/csm_interaction.prior +0 -0
  88. {redback-1.0.31 → redback-1.1}/redback/priors/csm_nickel.prior +0 -0
  89. {redback-1.0.31 → redback-1.1}/redback/priors/csm_shock_and_arnett.prior +0 -0
  90. {redback-1.0.31 → redback-1.1}/redback/priors/csm_shock_and_arnett_bolometric.prior +0 -0
  91. {redback-1.0.31 → redback-1.1}/redback/priors/csm_shock_breakout.prior +0 -0
  92. {redback-1.0.31 → redback-1.1}/redback/priors/doublegaussian_redback.prior +0 -0
  93. {redback-1.0.31 → redback-1.1}/redback/priors/doublegaussian_redback_refreshed.prior +0 -0
  94. {redback-1.0.31 → redback-1.1}/redback/priors/evolving_magnetar.prior +0 -0
  95. {redback-1.0.31 → redback-1.1}/redback/priors/evolving_magnetar_only.prior +0 -0
  96. {redback-1.0.31 → redback-1.1}/redback/priors/exponential_powerlaw_bolometric.prior +0 -0
  97. {redback-1.0.31 → redback-1.1}/redback/priors/five_component_powerlaw.prior +0 -0
  98. {redback-1.0.31 → redback-1.1}/redback/priors/four_component_powerlaw.prior +0 -0
  99. {redback-1.0.31 → redback-1.1}/redback/priors/full_magnetar.prior +0 -0
  100. {redback-1.0.31 → redback-1.1}/redback/priors/full_vacuum_dipole_magnetar.prior +0 -0
  101. {redback-1.0.31 → redback-1.1}/redback/priors/gaussian.prior +0 -0
  102. {redback-1.0.31 → redback-1.1}/redback/priors/gaussian_redback.prior +0 -0
  103. {redback-1.0.31 → redback-1.1}/redback/priors/gaussian_redback_refreshed.prior +0 -0
  104. {redback-1.0.31 → redback-1.1}/redback/priors/gaussiancore.prior +0 -0
  105. {redback-1.0.31 → redback-1.1}/redback/priors/gaussianrise_cooling_envelope.prior +0 -0
  106. {redback-1.0.31 → redback-1.1}/redback/priors/gaussianrise_cooling_envelope_bolometric.prior +0 -0
  107. {redback-1.0.31 → redback-1.1}/redback/priors/general_magnetar.prior +0 -0
  108. {redback-1.0.31 → redback-1.1}/redback/priors/general_magnetar_driven_supernova.prior +0 -0
  109. {redback-1.0.31 → redback-1.1}/redback/priors/general_magnetar_driven_supernova_bolometric.prior +0 -0
  110. {redback-1.0.31 → redback-1.1}/redback/priors/general_magnetar_slsn.prior +0 -0
  111. {redback-1.0.31 → redback-1.1}/redback/priors/general_mergernova.prior +0 -0
  112. {redback-1.0.31 → redback-1.1}/redback/priors/general_mergernova_evolution.prior +0 -0
  113. {redback-1.0.31 → redback-1.1}/redback/priors/general_mergernova_thermalisation.prior +0 -0
  114. {redback-1.0.31 → redback-1.1}/redback/priors/general_metzger_magnetar_driven.prior +0 -0
  115. {redback-1.0.31 → redback-1.1}/redback/priors/general_metzger_magnetar_driven_evolution.prior +0 -0
  116. {redback-1.0.31 → redback-1.1}/redback/priors/general_metzger_magnetar_driven_thermalisation.prior +0 -0
  117. {redback-1.0.31 → redback-1.1}/redback/priors/gw_magnetar.prior +0 -0
  118. {redback-1.0.31 → redback-1.1}/redback/priors/homologous_expansion_supernova.prior +0 -0
  119. {redback-1.0.31 → redback-1.1}/redback/priors/kasen_bns_kilonova.prior +0 -0
  120. {redback-1.0.31 → redback-1.1}/redback/priors/kilonova_afterglow.prior +0 -0
  121. {redback-1.0.31 → redback-1.1}/redback/priors/kilonova_afterglow_nakarpiran.prior +0 -0
  122. {redback-1.0.31 → redback-1.1}/redback/priors/kilonova_afterglow_redback.prior +0 -0
  123. {redback-1.0.31 → redback-1.1}/redback/priors/magnetar_luminosity_evolution.prior +0 -0
  124. {redback-1.0.31 → redback-1.1}/redback/priors/magnetar_nickel.prior +0 -0
  125. {redback-1.0.31 → redback-1.1}/redback/priors/magnetar_only.prior +0 -0
  126. {redback-1.0.31 → redback-1.1}/redback/priors/metzger_kilonova_model.prior +0 -0
  127. {redback-1.0.31 → redback-1.1}/redback/priors/metzger_magnetar_driven_kilonova_model.prior +0 -0
  128. {redback-1.0.31 → redback-1.1}/redback/priors/mosfit_kilonova.prior +0 -0
  129. {redback-1.0.31 → redback-1.1}/redback/priors/mosfit_rprocess.prior +0 -0
  130. {redback-1.0.31 → redback-1.1}/redback/priors/nicholl_bns.prior +0 -0
  131. {redback-1.0.31 → redback-1.1}/redback/priors/one_comp_kne_rosswog_heatingrate.prior +0 -0
  132. {redback-1.0.31 → redback-1.1}/redback/priors/one_component_ejecta_relation.prior +0 -0
  133. {redback-1.0.31 → redback-1.1}/redback/priors/one_component_ejecta_relation_projection.prior +0 -0
  134. {redback-1.0.31 → redback-1.1}/redback/priors/one_component_kilonova_model.prior +0 -0
  135. {redback-1.0.31 → redback-1.1}/redback/priors/one_component_nsbh_ejecta_relation.prior +0 -0
  136. {redback-1.0.31 → redback-1.1}/redback/priors/piecewise_radiative_losses.prior +0 -0
  137. {redback-1.0.31 → redback-1.1}/redback/priors/polytrope_eos_two_component_bns.prior +0 -0
  138. {redback-1.0.31 → redback-1.1}/redback/priors/power_law_stratified_kilonova.prior +0 -0
  139. {redback-1.0.31 → redback-1.1}/redback/priors/powerlaw_redback.prior +0 -0
  140. {redback-1.0.31 → redback-1.1}/redback/priors/powerlaw_redback_refreshed.prior +0 -0
  141. {redback-1.0.31 → redback-1.1}/redback/priors/powerlawcore.prior +0 -0
  142. {redback-1.0.31 → redback-1.1}/redback/priors/pwn.prior +0 -0
  143. {redback-1.0.31 → redback-1.1}/redback/priors/radiative_losses.prior +0 -0
  144. {redback-1.0.31 → redback-1.1}/redback/priors/radiative_losses_mdr.prior +0 -0
  145. {redback-1.0.31 → redback-1.1}/redback/priors/radiative_losses_smoothness.prior +0 -0
  146. {redback-1.0.31 → redback-1.1}/redback/priors/radiative_only.prior +0 -0
  147. {redback-1.0.31 → redback-1.1}/redback/priors/shock_cooling.prior +0 -0
  148. {redback-1.0.31 → redback-1.1}/redback/priors/shock_cooling_and_arnett.prior +0 -0
  149. {redback-1.0.31 → redback-1.1}/redback/priors/shock_cooling_bolometric.prior +0 -0
  150. {redback-1.0.31 → redback-1.1}/redback/priors/shocked_cocoon.prior +0 -0
  151. {redback-1.0.31 → redback-1.1}/redback/priors/shocked_cocoon_bolometric.prior +0 -0
  152. {redback-1.0.31 → redback-1.1}/redback/priors/six_component_powerlaw.prior +0 -0
  153. {redback-1.0.31 → redback-1.1}/redback/priors/slsn.prior +0 -0
  154. {redback-1.0.31 → redback-1.1}/redback/priors/slsn_bolometric.prior +0 -0
  155. {redback-1.0.31 → redback-1.1}/redback/priors/smoothpowerlaw.prior +0 -0
  156. {redback-1.0.31 → redback-1.1}/redback/priors/sn_exponential_powerlaw.prior +0 -0
  157. {redback-1.0.31 → redback-1.1}/redback/priors/sn_fallback.prior +0 -0
  158. {redback-1.0.31 → redback-1.1}/redback/priors/stream_stream_tde.prior +0 -0
  159. {redback-1.0.31 → redback-1.1}/redback/priors/stream_stream_tde_bolometric.prior +0 -0
  160. {redback-1.0.31 → redback-1.1}/redback/priors/tde_analytical.prior +0 -0
  161. {redback-1.0.31 → redback-1.1}/redback/priors/tde_analytical_bolometric.prior +0 -0
  162. {redback-1.0.31 → redback-1.1}/redback/priors/tde_fallback.prior +0 -0
  163. {redback-1.0.31 → redback-1.1}/redback/priors/tde_fallback_bolometric.prior +0 -0
  164. {redback-1.0.31 → redback-1.1}/redback/priors/tde_synchrotron.prior +0 -0
  165. {redback-1.0.31 → redback-1.1}/redback/priors/thermal_synchrotron_fluxdensity.prior +0 -0
  166. {redback-1.0.31 → redback-1.1}/redback/priors/thermal_synchrotron_lnu.prior +0 -0
  167. {redback-1.0.31 → redback-1.1}/redback/priors/thin_shell_supernova.prior +0 -0
  168. {redback-1.0.31 → redback-1.1}/redback/priors/three_component_kilonova_model.prior +0 -0
  169. {redback-1.0.31 → redback-1.1}/redback/priors/three_component_powerlaw.prior +0 -0
  170. {redback-1.0.31 → redback-1.1}/redback/priors/tophat.prior +0 -0
  171. {redback-1.0.31 → redback-1.1}/redback/priors/tophat_and_arnett.prior +0 -0
  172. {redback-1.0.31 → redback-1.1}/redback/priors/tophat_and_twocomponent.prior +0 -0
  173. {redback-1.0.31 → redback-1.1}/redback/priors/tophat_and_twolayerstratified.prior +0 -0
  174. {redback-1.0.31 → redback-1.1}/redback/priors/tophat_from_emulator.prior +0 -0
  175. {redback-1.0.31 → redback-1.1}/redback/priors/tophat_redback.prior +0 -0
  176. {redback-1.0.31 → redback-1.1}/redback/priors/tophat_redback_refreshed.prior +0 -0
  177. {redback-1.0.31 → redback-1.1}/redback/priors/trapped_magnetar.prior +0 -0
  178. {redback-1.0.31 → redback-1.1}/redback/priors/two_comp_kne_rosswog_heatingrate.prior +0 -0
  179. {redback-1.0.31 → redback-1.1}/redback/priors/two_component_bns_ejecta_relation.prior +0 -0
  180. {redback-1.0.31 → redback-1.1}/redback/priors/two_component_kilonova_model.prior +0 -0
  181. {redback-1.0.31 → redback-1.1}/redback/priors/two_component_nsbh_ejecta_relation.prior +0 -0
  182. {redback-1.0.31 → redback-1.1}/redback/priors/two_component_powerlaw.prior +0 -0
  183. {redback-1.0.31 → redback-1.1}/redback/priors/two_layer_stratified_kilonova.prior +0 -0
  184. {redback-1.0.31 → redback-1.1}/redback/priors/twocomponent_redback.prior +0 -0
  185. {redback-1.0.31 → redback-1.1}/redback/priors/twocomponent_redback_refreshed.prior +0 -0
  186. {redback-1.0.31 → redback-1.1}/redback/priors/type_1a.prior +0 -0
  187. {redback-1.0.31 → redback-1.1}/redback/priors/type_1c.prior +0 -0
  188. {redback-1.0.31 → redback-1.1}/redback/priors/vacuum_dipole_magnetar_only.prior +0 -0
  189. {redback-1.0.31 → redback-1.1}/redback/priors/villar_sne.prior +0 -0
  190. {redback-1.0.31 → redback-1.1}/redback/redback_errors.py +0 -0
  191. {redback-1.0.31 → redback-1.1}/redback/tables/BATSE_4B_catalogue.csv +0 -0
  192. {redback-1.0.31 → redback-1.1}/redback/tables/BATSE_trigger_table.txt +0 -0
  193. {redback-1.0.31 → redback-1.1}/redback/tables/GRBcatalog.sqlite +0 -0
  194. {redback-1.0.31 → redback-1.1}/redback/tables/GRBs_w_redshift.txt +0 -0
  195. {redback-1.0.31 → redback-1.1}/redback/tables/LGRB_table.txt +0 -0
  196. {redback-1.0.31 → redback-1.1}/redback/tables/OAC_metadata.csv +0 -0
  197. {redback-1.0.31 → redback-1.1}/redback/tables/SGRB_table.txt +0 -0
  198. {redback-1.0.31 → redback-1.1}/redback/tables/csm_table.txt +0 -0
  199. {redback-1.0.31 → redback-1.1}/redback/tables/qdot_rosswogkorobkin24.pck +0 -0
  200. {redback-1.0.31 → redback-1.1}/redback/tables/rubin_baseline_v3.0_10yrs.tar.gz +0 -0
  201. {redback-1.0.31 → redback-1.1}/redback/tables/summary_general_swift_bat.txt +0 -0
  202. {redback-1.0.31 → redback-1.1}/redback/tables/ztf.tar.gz +0 -0
  203. {redback-1.0.31 → redback-1.1}/redback/transient/afterglow.py +0 -0
  204. {redback-1.0.31 → redback-1.1}/redback/transient/kilonova.py +0 -0
  205. {redback-1.0.31 → redback-1.1}/redback/transient/prompt.py +0 -0
  206. {redback-1.0.31 → redback-1.1}/redback/transient/supernova.py +0 -0
  207. {redback-1.0.31 → redback-1.1}/redback/transient/tde.py +0 -0
  208. {redback-1.0.31 → redback-1.1}/redback/transient_models/afterglow_models.py +0 -0
  209. {redback-1.0.31 → redback-1.1}/redback/transient_models/combined_models.py +0 -0
  210. {redback-1.0.31 → redback-1.1}/redback/transient_models/fireball_models.py +0 -0
  211. {redback-1.0.31 → redback-1.1}/redback/transient_models/integrated_flux_afterglow_models.py +0 -0
  212. {redback-1.0.31 → redback-1.1}/redback/transient_models/kilonova_models.py +0 -0
  213. {redback-1.0.31 → redback-1.1}/redback/transient_models/magnetar_driven_ejecta_models.py +0 -0
  214. {redback-1.0.31 → redback-1.1}/redback/transient_models/magnetar_models.py +0 -0
  215. {redback-1.0.31 → redback-1.1}/redback/transient_models/phase_models.py +0 -0
  216. {redback-1.0.31 → redback-1.1}/redback/transient_models/prompt_models.py +0 -0
  217. {redback-1.0.31 → redback-1.1}/redback.egg-info/dependency_links.txt +0 -0
  218. {redback-1.0.31 → redback-1.1}/redback.egg-info/not-zip-safe +0 -0
  219. {redback-1.0.31 → redback-1.1}/redback.egg-info/top_level.txt +0 -0
  220. {redback-1.0.31 → redback-1.1}/setup.cfg +0 -0
@@ -1,7 +1,7 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: redback
3
- Version: 1.0.31
4
- Summary: A Bayesian inference pipeline for electromagnetic transients
3
+ Version: 1.1
4
+ Summary: A Bayesian inference and modelling pipeline for electromagnetic transients
5
5
  Home-page: https://github.com/nikhil-sarin/redback
6
6
  Author: Nikhil Sarin, Moritz Huebner
7
7
  Author-email: nsarin.astro@gmail.com
@@ -31,6 +31,7 @@ Requires-Dist: afterglowpy
31
31
  Provides-Extra: all
32
32
  Requires-Dist: nestle; extra == "all"
33
33
  Requires-Dist: sherpa; extra == "all"
34
+ Requires-Dist: george; extra == "all"
34
35
  Requires-Dist: scikit-learn; extra == "all"
35
36
  Requires-Dist: PyQt5; extra == "all"
36
37
  Requires-Dist: lalsuite; extra == "all"
@@ -45,6 +46,7 @@ Dynamic: description
45
46
  Dynamic: description-content-type
46
47
  Dynamic: home-page
47
48
  Dynamic: license
49
+ Dynamic: license-file
48
50
  Dynamic: provides-extra
49
51
  Dynamic: requires-dist
50
52
  Dynamic: requires-python
@@ -56,7 +58,7 @@ Dynamic: summary
56
58
  ![PyPI](https://img.shields.io/pypi/v/redback)
57
59
  [![arXiv](https://img.shields.io/badge/arXiv-2308.12806-00ff00.svg)](https://arxiv.org/abs/2308.12806)
58
60
  # Redback
59
- Introducing REDBACK, a bayesian inference software package for fitting electromagnetic transients
61
+ Introducing REDBACK, A software package for end-to-end modelling, fitting, and interpretation of electromagnetic transients via Bayesian Inference
60
62
 
61
63
  ### Online documentation
62
64
 
@@ -67,12 +69,12 @@ Introducing REDBACK, a bayesian inference software package for fitting electroma
67
69
 
68
70
  ### Motivation and why redback might be useful to you.
69
71
  The launch of new telescopes/surveys is leading to an explosion of transient observations.
70
- Redback is a software package for end-to-end interpretation and parameter estimation of these transients.
72
+ Redback is a software package for modelling, end-to-end interpretation and parameter estimation of these transients.
71
73
 
72
74
  - Download data for supernovae, tidal disruption events, gamma-ray burst afterglows, kilonovae, prompt emission from
73
75
  different catalogs/telescopes; Swift, BATSE, Open access catalogs, FINK and LASAIR brokers.
74
76
  Users can also provide their own data or use simulated data
75
- - Redback processes the data into a homogeneous transient object. Making it easy to plot lightcurves and do any other processing.
77
+ - Redback processes the data into a homogeneous transient object. Making it easy to plot lightcurves and do any other processing e.g., estimating bolometric luminosities or blackbody properties.
76
78
  - The user can then fit one of the models implemented in redback. Or fit their own model. Models for several different types of electromagnetic transients are implemented and range from simple analytical models to numerical surrogates.
77
79
  - All models are implemented as functions and can be used to simulate populations, without needing to provide data. This way redback can be used simply as a tool to simulate realistic populations, no need to actually fit anything.
78
80
  - Simulate realistic transient lightcurves for Rubin LSST Survey using the latest cadence tables and for ZTF. Or make your own survey.
@@ -4,7 +4,7 @@
4
4
  ![PyPI](https://img.shields.io/pypi/v/redback)
5
5
  [![arXiv](https://img.shields.io/badge/arXiv-2308.12806-00ff00.svg)](https://arxiv.org/abs/2308.12806)
6
6
  # Redback
7
- Introducing REDBACK, a bayesian inference software package for fitting electromagnetic transients
7
+ Introducing REDBACK, A software package for end-to-end modelling, fitting, and interpretation of electromagnetic transients via Bayesian Inference
8
8
 
9
9
  ### Online documentation
10
10
 
@@ -15,12 +15,12 @@ Introducing REDBACK, a bayesian inference software package for fitting electroma
15
15
 
16
16
  ### Motivation and why redback might be useful to you.
17
17
  The launch of new telescopes/surveys is leading to an explosion of transient observations.
18
- Redback is a software package for end-to-end interpretation and parameter estimation of these transients.
18
+ Redback is a software package for modelling, end-to-end interpretation and parameter estimation of these transients.
19
19
 
20
20
  - Download data for supernovae, tidal disruption events, gamma-ray burst afterglows, kilonovae, prompt emission from
21
21
  different catalogs/telescopes; Swift, BATSE, Open access catalogs, FINK and LASAIR brokers.
22
22
  Users can also provide their own data or use simulated data
23
- - Redback processes the data into a homogeneous transient object. Making it easy to plot lightcurves and do any other processing.
23
+ - Redback processes the data into a homogeneous transient object. Making it easy to plot lightcurves and do any other processing e.g., estimating bolometric luminosities or blackbody properties.
24
24
  - The user can then fit one of the models implemented in redback. Or fit their own model. Models for several different types of electromagnetic transients are implemented and range from simple analytical models to numerical surrogates.
25
25
  - All models are implemented as functions and can be used to simulate populations, without needing to provide data. This way redback can be used simply as a tool to simulate realistic populations, no need to actually fit anything.
26
26
  - Simulate realistic transient lightcurves for Rubin LSST Survey using the latest cadence tables and for ZTF. Or make your own survey.
@@ -1,8 +1,9 @@
1
1
  from redback import analysis, constants, get_data, redback_errors, priors, result, sampler, transient, \
2
- transient_models, utils, photosphere, sed, interaction_processes, constraints, plotting, model_library, simulate_transients
2
+ transient_models, utils, photosphere, sed, interaction_processes, constraints, plotting, model_library, \
3
+ simulate_transients
3
4
  from redback.transient import afterglow, kilonova, prompt, supernova, tde
4
5
  from redback.sampler import fit_model
5
6
  from redback.utils import setup_logger
6
7
 
7
- __version__ = "1.0.31"
8
+ __version__ = "1.1.0"
8
9
  setup_logger(log_level='info')
@@ -0,0 +1,470 @@
1
+ import matplotlib.pyplot as plt
2
+ import numpy as np
3
+
4
+ import pandas as pd
5
+
6
+ import redback.model_library
7
+ from redback.utils import logger, find_nearest, bands_to_frequency
8
+ from redback.result import RedbackResult
9
+ from redback.constants import day_to_s
10
+ import matplotlib
11
+
12
+
13
+ def _setup_plotting_result(model, model_kwargs, parameters, transient):
14
+ """
15
+ Helper function to setup the plotting result
16
+
17
+ :param model: model string or model function
18
+ :param model_kwargs: keyword arguments passed to the model
19
+ :param parameters: parameters to plot
20
+ :param transient: transient object
21
+ :return: a tuple of model, parameters, and result
22
+ """
23
+ if isinstance(parameters, dict):
24
+ parameters = pd.DataFrame.from_dict(parameters)
25
+ parameters["log_likelihood"] = np.arange(len(parameters))
26
+ if isinstance(model, str):
27
+ model = redback.model_library.all_models_dict[model]
28
+ meta_data = dict(model=model.__name__, transient_type=transient.__class__.__name__.lower())
29
+ transient_kwargs = {k.lstrip("_"): v for k, v in transient.__dict__.items()}
30
+ meta_data.update(transient_kwargs)
31
+ meta_data['model_kwargs'] = model_kwargs or dict()
32
+ res = RedbackResult(label="None", outdir="None",
33
+ search_parameter_keys=None,
34
+ fixed_parameter_keys=None,
35
+ constraint_parameter_keys=None, priors=None,
36
+ sampler_kwargs=dict(), injection_parameters=None,
37
+ meta_data=meta_data, posterior=parameters, samples=None,
38
+ nested_samples=None, log_evidence=0,
39
+ log_evidence_err=0, information_gain=0,
40
+ log_noise_evidence=0, log_bayes_factor=0,
41
+ log_likelihood_evaluations=0,
42
+ log_prior_evaluations=0, sampling_time=0, nburn=0,
43
+ num_likelihood_evaluations=0, walkers=0,
44
+ max_autocorrelation_time=0, use_ratio=False,
45
+ version=None)
46
+ return model, parameters, res
47
+
48
+
49
+ def plot_lightcurve(transient, parameters, model, model_kwargs=None, **kwargs: None):
50
+ """
51
+ Plot a lightcurve for a given model and parameters
52
+
53
+ :param transient: transient object
54
+ :param parameters: parameters to plot
55
+ :param model: model string or model function
56
+ :param model_kwargs: keyword arguments passed to the model
57
+ :return: plot_lightcurve
58
+ """
59
+ model, parameters, res = _setup_plotting_result(model, model_kwargs, parameters, transient)
60
+ return res.plot_lightcurve(model=model, random_models=len(parameters), plot_max_likelihood=False,
61
+ save=False, show=False, **kwargs)
62
+
63
+
64
+ def plot_multiband_lightcurve(transient, parameters, model, model_kwargs=None, **kwargs: None):
65
+ """
66
+ Plot a multiband lightcurve for a given model and parameters
67
+
68
+ :param transient: transient object
69
+ :param parameters: parameters to plot
70
+ :param model: model string or model function
71
+ :param model_kwargs: keyword arguments passed to the model
72
+ :return: plot_multiband_lightcurve
73
+ """
74
+ model, parameters, res = _setup_plotting_result(model, model_kwargs, parameters, transient)
75
+ return res.plot_multiband_lightcurve(model=model, random_models=len(parameters), plot_max_likelihood=False,
76
+ save=False, show=False, **kwargs)
77
+
78
+
79
+ def plot_evolution_parameters(result, random_models=100):
80
+ """
81
+ Plot evolution parameters for a given evolving_magnetar result
82
+
83
+ :param result: redback result
84
+ :param random_models: number of random models to plot
85
+ :return: fig and axes
86
+ """
87
+ logger.warning("This type of plot is only valid for evolving magnetar models")
88
+ tmin = np.log10(np.min(result.metadata['time']))
89
+ tmax = np.log10(np.max(result.metadata['time']))
90
+ time = np.logspace(tmin, tmax, 100)
91
+ fig, ax = plt.subplots(3, 1, sharex=True, figsize=(5, 10))
92
+ for j in range(random_models):
93
+ s = dict(result.posterior.iloc[np.random.randint(len(result.posterior))])
94
+ s["output"] = "namedtuple"
95
+ model = redback.model_library.all_models_dict["evolving_magnetar_only"]
96
+ output = model(time, **s)
97
+ nn = output.nn
98
+ mu = output.mu
99
+ alpha = output.alpha
100
+ ax[0].plot(time, nn, "--", lw=1, color='red', zorder=-1)
101
+ ax[1].plot(time, np.rad2deg(alpha), "--", lw=1, color='red', zorder=-1)
102
+ ax[2].plot(time, mu, "--", lw=1, color='red', zorder=-1)
103
+ ax[0].set_ylabel('braking index')
104
+ ax[1].set_ylabel('inclination angle')
105
+ ax[2].set_ylabel('magnetic moment')
106
+ for x in range(3):
107
+ ax[x].set_yscale('log')
108
+ ax[x].set_xscale('log')
109
+ fig.supxlabel(r"Time since burst [s]")
110
+ return fig, ax
111
+
112
+ def plot_spectrum(model, parameters, time_to_plot, axes=None, **kwargs):
113
+ """
114
+ Plot a spectrum for a given model and parameters
115
+
116
+ :param model: Model string for a redback model
117
+ :param parameters: dictionary of parameters/alongside model specific keyword arguments.
118
+ Must be one set of parameters. If you want to plot a posterior prediction of the spectrum,
119
+ call this function in a loop.
120
+ :param time_to_plot: Times to plot (in days) the spectrum at.
121
+ The spectrum plotted will be at the nearest neighbour to this value
122
+ :param axes: None or matplotlib axes object if you want to plot on an existing set of axes
123
+ :param kwargs: Additional keyword arguments used by this function.
124
+ :param colors_list: List of colors to use for each time to plot. Set randomly unless specified.
125
+ :return: matplotlib axes
126
+ """
127
+ function = redback.model_library.all_models_dict[model]
128
+ model_kwargs = {}
129
+ model_kwargs.update(parameters)
130
+ model_kwargs['output_format'] = 'spectra'
131
+ model_kwargs['bands'] = 'lsstg'
132
+ output = function(time_to_plot, **model_kwargs)
133
+ lambdas = output.lambdas
134
+ time_of_output = output.time/day_to_s
135
+
136
+ #extract spectrum at the times of interest.
137
+ spec = {}
138
+ for tt in time_to_plot:
139
+ _, idx = find_nearest(time_of_output, tt)
140
+ spec[tt] = output.spectra[idx]
141
+
142
+ if 'colors_list' in kwargs.keys():
143
+ colors_list = kwargs.pop('colors_list')
144
+ else:
145
+ colors_list = matplotlib.cm.tab20(range(len(time_to_plot)))
146
+
147
+ ax = axes or plt.gca()
148
+ for i, tt in enumerate(time_to_plot):
149
+ ax.semilogx(lambdas, spec[tt], color=colors_list[i], label=f"{tt:.1f} days")
150
+ ax.set_xlabel(r'Wavelength ($\mathrm{\AA}$)')
151
+ ax.set_ylabel(r'Flux ($10^{-17}$ erg s$^{-1}$ cm$^{-2}$ $\mathrm{\AA}$)')
152
+ ax.legend(loc='upper left')
153
+ return ax
154
+
155
+ def plot_gp_lightcurves(transient, gp_output, axes=None, band_colors=None, band_scaling=None):
156
+ """
157
+ Plot the Gaussian Process lightcurves
158
+
159
+ :param transient: A transient object
160
+ :param gp_output: The output of the fit_gp function
161
+ :param axes: axes, ideally you should be passing the axes from the plot_data methods
162
+ :param band_colors: a dictionary of band colors; again ideally you should be passing the band_colors from the plot_data methods
163
+ :return: axes object with the GP lightcurves plotted
164
+ """
165
+ ax = axes or plt.gca()
166
+
167
+ if transient.use_phase_model:
168
+ ref_date = transient.x[0]
169
+ else:
170
+ ref_date = 0
171
+
172
+ t_new = np.linspace(transient.x.min() - 10, transient.x.max() + 20, 100)
173
+
174
+ if transient.data_mode in ['flux_density', 'flux', 'magnitude']:
175
+ if band_colors is None:
176
+ band_colors = dict(zip(transient.unique_bands, plt.cm.tab20(range(len(transient.unique_bands)))))
177
+ else:
178
+ band_colors = band_colors
179
+ if gp_output.use_frequency:
180
+ for band in transient.unique_bands:
181
+ if band_scaling:
182
+ scaling = band_scaling[band]
183
+ else:
184
+ scaling = 0
185
+ f_new = np.ones_like(t_new) * bands_to_frequency([band])
186
+ X_new = np.column_stack((f_new, t_new))
187
+ gp = gp_output.gp
188
+ y_pred, y_cov = gp.predict(gp_output.scaled_y, X_new, return_cov=True)
189
+ y_std = np.sqrt(np.diag(y_cov))
190
+ y_lower = y_pred - 0.5 * y_std
191
+ y_upper = y_pred + 0.5 * y_std
192
+ ax.plot(t_new - ref_date, (y_pred * gp_output.y_scaler) + scaling, color=band_colors[band])
193
+ ax.fill_between(t_new - ref_date, (y_lower * gp_output.y_scaler) + scaling,
194
+ (y_upper * gp_output.y_scaler) + scaling, alpha=0.5,
195
+ color=band_colors[band])
196
+ else:
197
+ for band in transient.unique_bands:
198
+ if band_scaling:
199
+ scaling = band_scaling[band]
200
+ else:
201
+ scaling = 0
202
+ gp = gp_output.gp[band]
203
+ y_pred, y_cov = gp.predict(gp_output.scaled_y[band], t_new, return_cov=True)
204
+ y_std = np.sqrt(np.diag(y_cov))
205
+ y_lower = y_pred - 0.5 * y_std
206
+ y_upper = y_pred + 0.5 * y_std
207
+ ax.plot(t_new - ref_date, (y_pred * gp_output.y_scaler) + scaling, color=band_colors[band])
208
+ ax.fill_between(t_new - ref_date, (y_lower * gp_output.y_scaler) + scaling,
209
+ (y_upper * gp_output.y_scaler) + scaling, alpha=0.5,
210
+ color=band_colors[band])
211
+ else:
212
+ y_pred, y_cov = gp_output.gp.predict(gp_output.scaled_y, t_new, return_cov=True)
213
+ y_std = np.sqrt(np.diag(y_cov))
214
+ y_lower = y_pred - 0.5 * y_std
215
+ y_upper = y_pred + 0.5 * y_std
216
+
217
+ ax.plot(t_new, y_pred * gp_output.y_scaler, color='red')
218
+ ax.fill_between(t_new, y_lower * gp_output.y_scaler, y_upper * gp_output.y_scaler, alpha=0.5, color='red')
219
+ return ax
220
+
221
+ def fit_temperature_and_radius_gp(data, kernelT, kernelR, plot=False, **kwargs):
222
+ """
223
+ Fit a Gaussian Process to the temperature and radius data
224
+
225
+ :param data: DataFrame containing the temperature and radius data output of the transient.estimate_bb_params method.
226
+ :param kernelT: george kernel for the temperature
227
+ :param kernelR: george kernel for the radius
228
+ :param plot: Whether to make a two-panel plot of the temperature and radius GP evolution and the data
229
+ :param kwargs: Additional keyword arguments
230
+ :param inflate_errors: If True, inflate the errors by 20%, default is False
231
+ :return: Temperature and radius GP objects and plot fig and axes if requested
232
+ """
233
+ import george
234
+ from scipy.optimize import minimize
235
+
236
+ temperature = data['temperature']
237
+ radius = data['radius']
238
+ t_data = data['epoch_times']
239
+ T_err = data['temp_err']
240
+ R_err = data['radius_err']
241
+ inflate_errors = kwargs.get('inflate_errors', True)
242
+ if inflate_errors:
243
+ error = kwargs.get('error', 1.5)
244
+ else:
245
+ error = 1
246
+ gp_T_err_raw = T_err * error
247
+ gp_R_err = R_err * error
248
+
249
+ fit_in_log = kwargs.get("fit_in_log", False)
250
+ if fit_in_log:
251
+ # In log space, use: log10(T); propagate errors via: δ(log10T)=δT/(T*ln(10))
252
+ temperature_fit = np.log10(temperature)
253
+ gp_T_err = gp_T_err_raw / (temperature * np.log(10))
254
+ else:
255
+ temperature_fit = temperature
256
+ gp_T_err = gp_T_err_raw
257
+
258
+ gp_T = george.GP(kernelT)
259
+ gp_T.compute(t_data, gp_T_err + 1e-8)
260
+
261
+ def neg_ln_like_T(p):
262
+ gp_T.set_parameter_vector(p)
263
+ return -gp_T.log_likelihood(temperature_fit)
264
+
265
+ def grad_neg_ln_like_T(p):
266
+ gp_T.set_parameter_vector(p)
267
+ return -gp_T.grad_log_likelihood(temperature_fit)
268
+
269
+ p0_T = gp_T.get_parameter_vector()
270
+ result_T = minimize(neg_ln_like_T, p0_T, jac=grad_neg_ln_like_T)
271
+ gp_T.set_parameter_vector(result_T.x)
272
+
273
+ logger.info("Finished GP fit for temperature")
274
+ logger.info(f"GP final parameters: {gp_T.get_parameter_dict()}")
275
+
276
+ gp_R = george.GP(kernelR)
277
+ gp_R.compute(t_data, gp_R_err + 1e-8)
278
+
279
+ def neg_ln_like_R(p):
280
+ gp_R.set_parameter_vector(p)
281
+ return -gp_R.log_likelihood(radius)
282
+
283
+ def grad_neg_ln_like_R(p):
284
+ gp_R.set_parameter_vector(p)
285
+ return -gp_R.grad_log_likelihood(radius)
286
+
287
+ p0_R = gp_R.get_parameter_vector()
288
+ result_R = minimize(neg_ln_like_R, p0_R, jac=grad_neg_ln_like_R)
289
+ gp_R.set_parameter_vector(result_R.x)
290
+
291
+ logger.info("Finished GP fit for radius")
292
+ logger.info(f"GP final parameters: {gp_R.get_parameter_dict()}")
293
+
294
+ if plot:
295
+ sigma_to_plot = kwargs.get('sigma_to_plot', 1)
296
+ label = r"${}\sigma$ GP uncertainty".format(str(int(sigma_to_plot)))
297
+ t_pred = np.linspace(t_data.min(), t_data.max(), 100)
298
+ # Temperature prediction
299
+ T_pred, T_pred_var = gp_T.predict(temperature_fit, t_pred, return_var=True)
300
+ T_pred_std = np.sqrt(T_pred_var)
301
+
302
+ # If fitting in log space, convert the prediction back to linear units.
303
+ if fit_in_log:
304
+ T_pred_lin = 10**T_pred
305
+ # Propagate the uncertainty approximately: dT ≈ 10^x * ln(10) * sigma_x.
306
+ T_pred_std_lin = 10**T_pred * np.log(10) * T_pred_std
307
+ else:
308
+ T_pred_lin = T_pred
309
+ T_pred_std_lin = T_pred_std
310
+
311
+ # Radius prediction
312
+ R_pred, R_pred_var = gp_R.predict(radius, t_pred, return_var=True)
313
+ R_pred_std = np.sqrt(R_pred_var)
314
+
315
+ fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(7, 3))
316
+ ax1.errorbar(t_data, temperature, yerr=T_err, fmt='o', label='Data', color='blue')
317
+ ax1.plot(t_pred, T_pred_lin, label='GP Prediction', color='red')
318
+ ax1.fill_between(t_pred, T_pred_lin - sigma_to_plot*T_pred_std_lin, T_pred_lin + sigma_to_plot*T_pred_std_lin,
319
+ alpha=0.2, color='red', label=label)
320
+ ax2.errorbar(t_data, radius, yerr=R_err, fmt='o', label='Data', color='blue')
321
+ ax2.plot(t_pred, R_pred, label='GP Prediction', color='red')
322
+ ax2.fill_between(t_pred, R_pred - sigma_to_plot*R_pred_std, R_pred + sigma_to_plot*R_pred_std, alpha=0.2, color='red',
323
+ label=label)
324
+
325
+ ax1.set_xlabel("Time", fontsize=15)
326
+ ax1.set_ylabel("Temperature [K]", fontsize=15)
327
+ ax1.set_title("Temperature Evolution", fontsize=15)
328
+ ax2.set_xlabel("Time", fontsize=15)
329
+ ax2.set_ylabel("Radius [cm]", fontsize=15)
330
+ ax2.set_title("Radius Evolution from GP", fontsize=15)
331
+
332
+ ax1.set_yscale('log')
333
+ ax2.set_yscale('log')
334
+
335
+ ax1.legend()
336
+ ax2.legend()
337
+ plt.subplots_adjust(wspace=0.3)
338
+ return gp_T, gp_R, fig, (ax1, ax2)
339
+ else:
340
+ return gp_T, gp_R
341
+
342
+ def generate_new_transient_data_from_gp(gp_out, t_new, transient, **kwargs):
343
+ """
344
+ Generates new transient data based on Gaussian Process (GP) predictions for the given time array
345
+ and transient object. Depending on the data mode of the transient object
346
+ (e.g., 'flux_density', 'flux', 'magnitude', or 'luminosity'), this function updates the data
347
+ accordingly, adjusting errors and scaling by frequency if necessary.
348
+
349
+ :param gp_out: The GP output object containing the Gaussian Process model, scaled data,
350
+ and other related attributes.
351
+ :type gp_out: object
352
+ :param t_new: Array of new time values for which GP predictions are to be generated.
353
+ :type t_new: array-like
354
+ :param transient: The transient object containing the original observation data and related
355
+ properties such as data mode and unique frequencies or bands.
356
+ :type transient: object
357
+ :param kwargs: Additional parameters to modify behavior, such as:
358
+
359
+ - **inflate_y_err** (bool): Flag to indicate whether to inflate GP errors.
360
+ - **error** (float): Multiplier for adjusting GP error inflation.
361
+
362
+ :return: A new transient object with data updated using GP predictions.
363
+ :rtype: object
364
+ """
365
+ data_mode = transient.data_mode
366
+ logger.info(f"Data mode: {data_mode}")
367
+ logger.info("Creating new {} data".format(data_mode))
368
+
369
+ if data_mode not in ['flux_density', 'flux', 'magnitude', 'luminosity']:
370
+ raise ValueError("Data mode {} not understood".format(data_mode))
371
+
372
+ if kwargs.get('inflate_y_err', True):
373
+ error = kwargs.get('error', 10)
374
+ else:
375
+ logger.info("Using GP predicted errors, this is likely being too conservative")
376
+ error = 1.
377
+
378
+ if gp_out.use_frequency:
379
+ logger.info("GP is a 2D kernel with effective frequency")
380
+ freqs = transient.unique_frequencies
381
+ T, F = np.meshgrid(t_new, freqs)
382
+ try:
383
+ bands = redback.utils.frequency_to_bandname(F.flatten())
384
+ except Exception:
385
+ bands = F.flatten().astype(str)
386
+ X_new = np.column_stack((F.flatten(), T.flatten()))
387
+ y_pred, y_var = gp_out.gp.predict(gp_out.scaled_y, X_new, return_var=True)
388
+ y_std = np.sqrt(y_var)
389
+ y_err = y_std * error
390
+ y_pred = y_pred * gp_out.y_scaler
391
+ tts = T.flatten()
392
+ freqs = F.flatten()
393
+ else:
394
+ logger.info("GP is a 1D kernel")
395
+ if data_mode == 'flux_density':
396
+ logger.warning("Bandnames/frequency attributes for the transient object may be weird, "
397
+ "Please check for yourself")
398
+ tts = []
399
+ ys = []
400
+ yerrs = []
401
+ bbs = []
402
+ for key in gp_out.gp.keys():
403
+ gp = gp_out.gp[key]
404
+ y_pred, y_cov = gp.predict(gp_out.scaled_y[key], t_new, return_cov=True)
405
+ y_std = np.sqrt(np.diag(y_cov))
406
+ y_err = y_std * error
407
+ y_pred = y_pred * gp_out.y_scaler
408
+ _bands = np.repeat(key, len(t_new))
409
+ bbs.append(key)
410
+ tts.append(t_new)
411
+ ys.append(y_pred)
412
+ yerrs.append(y_err)
413
+ temp_frame = pd.DataFrame({'time': tts, 'ys': ys, 'yerr': yerrs, 'band': bbs})
414
+ temp_frame.sort_values('time', inplace=True)
415
+ y_pred = temp_frame['ys']
416
+ y_err = temp_frame['yerr']
417
+ bands = temp_frame['band']
418
+ freqs = temp_frame['band']
419
+ tts = temp_frame['time']
420
+ elif data_mode in ['flux', 'magnitude']:
421
+ tts = []
422
+ ys = []
423
+ yerrs = []
424
+ bbs = []
425
+ for band in transient.unique_bands:
426
+ gp = gp_out.gp[band]
427
+ y_pred, y_cov = gp.predict(gp_out.scaled_y[band], t_new, return_cov=True)
428
+ y_std = np.sqrt(np.diag(y_cov))
429
+ y_err = y_std * error
430
+ y_pred = y_pred * gp_out.y_scaler
431
+ _bands = np.repeat(band, len(t_new))
432
+ bbs.append(_bands)
433
+ tts.append(t_new)
434
+ ys.append(y_pred)
435
+ yerrs.append(y_err)
436
+ temp_frame = pd.DataFrame({'time':tts, 'ys':ys, 'yerr':yerrs, 'band':bbs})
437
+ temp_frame.sort_values('time', inplace=True)
438
+ y_pred = temp_frame['ys']
439
+ y_err = temp_frame['yerr']
440
+ bands = temp_frame['band']
441
+ tts = temp_frame['time']
442
+ elif data_mode == 'luminosity':
443
+ y_pred, y_cov = gp_out.gp.predict(gp_out.scaled_y, t_new, return_cov=True)
444
+ y_std = np.sqrt(np.diag(y_cov))
445
+ y_err = y_std * error
446
+ y_pred = y_pred * gp_out.y_scaler
447
+ tts = t_new
448
+
449
+ logger.info(f"Data mode: {data_mode}")
450
+ logger.info("Creating new transient object with GP data")
451
+ if data_mode == 'flux_density':
452
+ new_transient = redback.transient.OpticalTransient(name=transient.name + '_gp',
453
+ flux_density=y_pred, flux_density_err=y_err,
454
+ time=tts, bands=bands, frequency=freqs,
455
+ data_mode=data_mode, redshift=transient.redshift)
456
+ elif data_mode == 'flux':
457
+ new_transient = redback.transient.OpticalTransient(name=transient.name + '_gp',
458
+ flux=y_pred, flux_err=y_err,
459
+ time=tts, bands=bands,
460
+ data_mode=data_mode, redshift=transient.redshift)
461
+ elif data_mode == 'magnitude':
462
+ new_transient = redback.transient.OpticalTransient(name=transient.name + '_gp',
463
+ magnitude=y_pred, magnitude_err=y_err,
464
+ time=tts, bands=bands,
465
+ data_mode=data_mode, redshift=transient.redshift)
466
+ elif data_mode == 'luminosity':
467
+ new_transient = redback.transient.OpticalTransient(name=transient.name + '_gp',
468
+ Lum50=y_pred, Lum50_err=y_err,
469
+ time_rest_frame=tts, data_mode=data_mode)
470
+ return new_transient