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.
- {redback-1.0.31 → redback-1.1}/PKG-INFO +8 -6
- {redback-1.0.31 → redback-1.1}/README.md +3 -3
- {redback-1.0.31 → redback-1.1}/redback/__init__.py +3 -2
- redback-1.1/redback/analysis.py +470 -0
- {redback-1.0.31 → redback-1.1}/redback/filters.py +57 -23
- {redback-1.0.31 → redback-1.1}/redback/get_data/directory.py +18 -0
- {redback-1.0.31 → redback-1.1}/redback/likelihoods.py +260 -0
- {redback-1.0.31 → redback-1.1}/redback/model_library.py +12 -2
- {redback-1.0.31 → redback-1.1}/redback/plotting.py +335 -4
- redback-1.1/redback/priors/blackbody_spectrum_with_absorption_and_emission_lines.prior +9 -0
- redback-1.1/redback/priors/csm_shock_and_arnett_two_rphots.prior +11 -0
- redback-1.1/redback/priors/exp_rise_powerlaw_decline.prior +6 -0
- redback-1.1/redback/priors/powerlaw_spectrum_with_absorption_and_emission_lines.prior +8 -0
- redback-1.1/redback/priors/shockcooling_morag.prior +6 -0
- redback-1.1/redback/priors/shockcooling_morag_and_arnett.prior +10 -0
- redback-1.1/redback/priors/shockcooling_morag_and_arnett_bolometric.prior +9 -0
- redback-1.1/redback/priors/shockcooling_morag_bolometric.prior +5 -0
- redback-1.1/redback/priors/shockcooling_sapirandwaxman.prior +6 -0
- redback-1.1/redback/priors/shockcooling_sapirandwaxman_bolometric.prior +5 -0
- redback-1.1/redback/priors/shockcooling_sapirwaxman_and_arnett.prior +10 -0
- redback-1.1/redback/priors/shockcooling_sapirwaxman_and_arnett_bolometric.prior +9 -0
- redback-1.1/redback/priors/shocked_cocoon_and_arnett.prior +13 -0
- redback-1.1/redback/priors/synchrotron_ism.prior +6 -0
- redback-1.1/redback/priors/synchrotron_massloss.prior +6 -0
- redback-1.1/redback/priors/synchrotron_pldensity.prior +7 -0
- redback-1.1/redback/priors/thermal_synchrotron_v2_fluxdensity.prior +8 -0
- redback-1.1/redback/priors/thermal_synchrotron_v2_lnu.prior +7 -0
- {redback-1.0.31 → redback-1.1}/redback/priors.py +10 -3
- {redback-1.0.31 → redback-1.1}/redback/result.py +9 -1
- {redback-1.0.31 → redback-1.1}/redback/sampler.py +46 -4
- {redback-1.0.31 → redback-1.1}/redback/sed.py +48 -1
- {redback-1.0.31 → redback-1.1}/redback/simulate_transients.py +5 -1
- redback-1.1/redback/tables/filters.csv +265 -0
- {redback-1.0.31 → redback-1.1}/redback/transient/__init__.py +2 -3
- {redback-1.0.31 → redback-1.1}/redback/transient/transient.py +648 -10
- {redback-1.0.31 → redback-1.1}/redback/transient_models/__init__.py +3 -2
- {redback-1.0.31 → redback-1.1}/redback/transient_models/extinction_models.py +3 -2
- redback-1.1/redback/transient_models/gaussianprocess_models.py +45 -0
- {redback-1.0.31 → redback-1.1}/redback/transient_models/general_synchrotron_models.py +296 -6
- {redback-1.0.31 → redback-1.1}/redback/transient_models/phenomenological_models.py +154 -7
- {redback-1.0.31 → redback-1.1}/redback/transient_models/shock_powered_models.py +503 -40
- redback-1.1/redback/transient_models/spectral_models.py +82 -0
- {redback-1.0.31 → redback-1.1}/redback/transient_models/supernova_models.py +333 -7
- {redback-1.0.31 → redback-1.1}/redback/transient_models/tde_models.py +57 -41
- {redback-1.0.31 → redback-1.1}/redback/utils.py +302 -51
- {redback-1.0.31 → redback-1.1}/redback.egg-info/PKG-INFO +8 -6
- {redback-1.0.31 → redback-1.1}/redback.egg-info/SOURCES.txt +19 -0
- {redback-1.0.31 → redback-1.1}/redback.egg-info/requires.txt +1 -0
- {redback-1.0.31 → redback-1.1}/setup.py +3 -2
- redback-1.0.31/redback/analysis.py +0 -153
- redback-1.0.31/redback/tables/filters.csv +0 -254
- redback-1.0.31/redback/transient_models/gaussianprocess_models.py +0 -0
- {redback-1.0.31 → redback-1.1}/LICENCE.md +0 -0
- {redback-1.0.31 → redback-1.1}/redback/constants.py +0 -0
- {redback-1.0.31 → redback-1.1}/redback/constraints.py +0 -0
- {redback-1.0.31 → redback-1.1}/redback/ejecta_relations.py +0 -0
- {redback-1.0.31 → redback-1.1}/redback/eos.py +0 -0
- {redback-1.0.31 → redback-1.1}/redback/get_data/__init__.py +0 -0
- {redback-1.0.31 → redback-1.1}/redback/get_data/batse.py +0 -0
- {redback-1.0.31 → redback-1.1}/redback/get_data/fermi.py +0 -0
- {redback-1.0.31 → redback-1.1}/redback/get_data/fink.py +0 -0
- {redback-1.0.31 → redback-1.1}/redback/get_data/getter.py +0 -0
- {redback-1.0.31 → redback-1.1}/redback/get_data/konus.py +0 -0
- {redback-1.0.31 → redback-1.1}/redback/get_data/lasair.py +0 -0
- {redback-1.0.31 → redback-1.1}/redback/get_data/open_data.py +0 -0
- {redback-1.0.31 → redback-1.1}/redback/get_data/swift.py +0 -0
- {redback-1.0.31 → redback-1.1}/redback/get_data/utils.py +0 -0
- {redback-1.0.31 → redback-1.1}/redback/interaction_processes.py +0 -0
- {redback-1.0.31 → redback-1.1}/redback/photosphere.py +0 -0
- {redback-1.0.31 → redback-1.1}/redback/plot_styles/paper.mplstyle +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/alternativepowerlaw_redback.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/alternativepowerlaw_redback_refreshed.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/arnett.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/arnett_bolometric.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/basic_magnetar.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/basic_magnetar_powered.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/basic_magnetar_powered_bolometric.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/basic_mergernova.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/bazin_sne.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/bulla_bns_kilonova.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/bulla_nsbh_kilonova.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/cocoon.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/collapsing_magnetar.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/collapsing_radiative_losses.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/cone_afterglow.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/cooling_envelope.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/csm_interaction.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/csm_nickel.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/csm_shock_and_arnett.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/csm_shock_and_arnett_bolometric.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/csm_shock_breakout.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/doublegaussian_redback.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/doublegaussian_redback_refreshed.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/evolving_magnetar.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/evolving_magnetar_only.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/exponential_powerlaw_bolometric.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/five_component_powerlaw.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/four_component_powerlaw.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/full_magnetar.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/full_vacuum_dipole_magnetar.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/gaussian.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/gaussian_redback.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/gaussian_redback_refreshed.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/gaussiancore.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/gaussianrise_cooling_envelope.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/gaussianrise_cooling_envelope_bolometric.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/general_magnetar.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/general_magnetar_driven_supernova.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/general_magnetar_driven_supernova_bolometric.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/general_magnetar_slsn.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/general_mergernova.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/general_mergernova_evolution.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/general_mergernova_thermalisation.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/general_metzger_magnetar_driven.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/general_metzger_magnetar_driven_evolution.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/general_metzger_magnetar_driven_thermalisation.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/gw_magnetar.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/homologous_expansion_supernova.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/kasen_bns_kilonova.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/kilonova_afterglow.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/kilonova_afterglow_nakarpiran.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/kilonova_afterglow_redback.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/magnetar_luminosity_evolution.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/magnetar_nickel.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/magnetar_only.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/metzger_kilonova_model.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/metzger_magnetar_driven_kilonova_model.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/mosfit_kilonova.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/mosfit_rprocess.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/nicholl_bns.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/one_comp_kne_rosswog_heatingrate.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/one_component_ejecta_relation.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/one_component_ejecta_relation_projection.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/one_component_kilonova_model.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/one_component_nsbh_ejecta_relation.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/piecewise_radiative_losses.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/polytrope_eos_two_component_bns.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/power_law_stratified_kilonova.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/powerlaw_redback.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/powerlaw_redback_refreshed.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/powerlawcore.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/pwn.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/radiative_losses.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/radiative_losses_mdr.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/radiative_losses_smoothness.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/radiative_only.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/shock_cooling.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/shock_cooling_and_arnett.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/shock_cooling_bolometric.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/shocked_cocoon.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/shocked_cocoon_bolometric.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/six_component_powerlaw.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/slsn.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/slsn_bolometric.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/smoothpowerlaw.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/sn_exponential_powerlaw.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/sn_fallback.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/stream_stream_tde.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/stream_stream_tde_bolometric.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/tde_analytical.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/tde_analytical_bolometric.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/tde_fallback.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/tde_fallback_bolometric.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/tde_synchrotron.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/thermal_synchrotron_fluxdensity.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/thermal_synchrotron_lnu.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/thin_shell_supernova.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/three_component_kilonova_model.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/three_component_powerlaw.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/tophat.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/tophat_and_arnett.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/tophat_and_twocomponent.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/tophat_and_twolayerstratified.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/tophat_from_emulator.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/tophat_redback.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/tophat_redback_refreshed.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/trapped_magnetar.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/two_comp_kne_rosswog_heatingrate.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/two_component_bns_ejecta_relation.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/two_component_kilonova_model.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/two_component_nsbh_ejecta_relation.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/two_component_powerlaw.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/two_layer_stratified_kilonova.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/twocomponent_redback.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/twocomponent_redback_refreshed.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/type_1a.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/type_1c.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/vacuum_dipole_magnetar_only.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/priors/villar_sne.prior +0 -0
- {redback-1.0.31 → redback-1.1}/redback/redback_errors.py +0 -0
- {redback-1.0.31 → redback-1.1}/redback/tables/BATSE_4B_catalogue.csv +0 -0
- {redback-1.0.31 → redback-1.1}/redback/tables/BATSE_trigger_table.txt +0 -0
- {redback-1.0.31 → redback-1.1}/redback/tables/GRBcatalog.sqlite +0 -0
- {redback-1.0.31 → redback-1.1}/redback/tables/GRBs_w_redshift.txt +0 -0
- {redback-1.0.31 → redback-1.1}/redback/tables/LGRB_table.txt +0 -0
- {redback-1.0.31 → redback-1.1}/redback/tables/OAC_metadata.csv +0 -0
- {redback-1.0.31 → redback-1.1}/redback/tables/SGRB_table.txt +0 -0
- {redback-1.0.31 → redback-1.1}/redback/tables/csm_table.txt +0 -0
- {redback-1.0.31 → redback-1.1}/redback/tables/qdot_rosswogkorobkin24.pck +0 -0
- {redback-1.0.31 → redback-1.1}/redback/tables/rubin_baseline_v3.0_10yrs.tar.gz +0 -0
- {redback-1.0.31 → redback-1.1}/redback/tables/summary_general_swift_bat.txt +0 -0
- {redback-1.0.31 → redback-1.1}/redback/tables/ztf.tar.gz +0 -0
- {redback-1.0.31 → redback-1.1}/redback/transient/afterglow.py +0 -0
- {redback-1.0.31 → redback-1.1}/redback/transient/kilonova.py +0 -0
- {redback-1.0.31 → redback-1.1}/redback/transient/prompt.py +0 -0
- {redback-1.0.31 → redback-1.1}/redback/transient/supernova.py +0 -0
- {redback-1.0.31 → redback-1.1}/redback/transient/tde.py +0 -0
- {redback-1.0.31 → redback-1.1}/redback/transient_models/afterglow_models.py +0 -0
- {redback-1.0.31 → redback-1.1}/redback/transient_models/combined_models.py +0 -0
- {redback-1.0.31 → redback-1.1}/redback/transient_models/fireball_models.py +0 -0
- {redback-1.0.31 → redback-1.1}/redback/transient_models/integrated_flux_afterglow_models.py +0 -0
- {redback-1.0.31 → redback-1.1}/redback/transient_models/kilonova_models.py +0 -0
- {redback-1.0.31 → redback-1.1}/redback/transient_models/magnetar_driven_ejecta_models.py +0 -0
- {redback-1.0.31 → redback-1.1}/redback/transient_models/magnetar_models.py +0 -0
- {redback-1.0.31 → redback-1.1}/redback/transient_models/phase_models.py +0 -0
- {redback-1.0.31 → redback-1.1}/redback/transient_models/prompt_models.py +0 -0
- {redback-1.0.31 → redback-1.1}/redback.egg-info/dependency_links.txt +0 -0
- {redback-1.0.31 → redback-1.1}/redback.egg-info/not-zip-safe +0 -0
- {redback-1.0.31 → redback-1.1}/redback.egg-info/top_level.txt +0 -0
- {redback-1.0.31 → redback-1.1}/setup.cfg +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: redback
|
|
3
|
-
Version: 1.
|
|
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
|

|
|
57
59
|
[](https://arxiv.org/abs/2308.12806)
|
|
58
60
|
# Redback
|
|
59
|
-
Introducing REDBACK,
|
|
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
|

|
|
5
5
|
[](https://arxiv.org/abs/2308.12806)
|
|
6
6
|
# Redback
|
|
7
|
-
Introducing REDBACK,
|
|
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,
|
|
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
|
|
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
|