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
@@ -1178,8 +1178,8 @@ def fitted_pl_decay(time, redshift, log_mh, a_bh, m_disc, r0, tvi, t_form, incl,
1178
1178
  nulnus_decay = np.zeros(len(time))
1179
1179
 
1180
1180
  if len(freqs_un) == 1:
1181
- nulnus_plateau = m.model_UV(time, log_mh, a_bh, m_disc, r0, tvi, t_form, ang, frequency)
1182
- nulnus_decay = m.decay_model(time, log_L, tdecay, p, t_peak, log_T, v=freqs_un[0])
1181
+ nulnus_plateau = m.model_UV(time, log_mh, a_bh, m_disc, r0, tvi, t_form, ang, v=freqs_un[0])
1182
+ nulnus_decay = m.decay_model(time, log_L, t_decay, p, t_peak, log_T, v=freqs_un[0])
1183
1183
  nulnus_rise = m.rise_model(time, log_L, sigma, t_peak, log_T, v=freqs_un[0])
1184
1184
  else:
1185
1185
  for i in range(0,len(freqs_un)):
@@ -1199,9 +1199,11 @@ def fitted_pl_decay(time, redshift, log_mh, a_bh, m_disc, r0, tvi, t_form, incl,
1199
1199
  frequency, time = calc_kcorrected_properties(frequency=lambda_to_nu(lambda_observer_frame),
1200
1200
  redshift=redshift, time=time_observer_frame)
1201
1201
  nulnus_plateau = m.model_SEDs(time, log_mh, a_bh, m_disc, r0, tvi, t_form, ang, frequency)
1202
- nulnus_risedecay = np.zeros((100, 300))
1203
- for i in range(0,len(frequency)):
1204
- nulnus_risedecay[i,:] = m.decay_model(time, log_L, t_decay, p, t_peak, log_T, v=frequency[i]) + m.rise_model(time, log_L, sigma, t_peak, log_T, v=frequency[i])
1202
+
1203
+ freq_0 = 6e14
1204
+ l_e_amp = (model.decay_model(time, log_L, t_decay, t_peak, log_T, freq_0) + model.rise_model(time, log_L, sigma, t_peak, log_T, freq_0))
1205
+ nulnus_risedecay = ((l_e_amp[:, None] * (frequency/freq_0)**4 *
1206
+ (np.exp(cc.planck * freq_0/(cc.boltzmann_constant * 10**log_T)) - 1)/(np.exp(cc.planck * frequency/(cc.boltzmann_constant * 10**log_T)) - 1)).T)
1205
1207
  flux_density = ((nulnus_risedecay + nulnus_plateau)/(4.0 * np.pi * dl**2 * frequency[:,np.newaxis] * 1.0e-26))
1206
1208
  fmjy = flux_density.T
1207
1209
  spectra = (fmjy * uu.mJy).to(uu.erg / uu.cm ** 2 / uu.s / uu.Angstrom,
@@ -1259,8 +1261,8 @@ def fitted_exp_decay(time, redshift, log_mh, a_bh, m_disc, r0, tvi, t_form, incl
1259
1261
  nulnus_decay = np.zeros(len(time))
1260
1262
 
1261
1263
  if len(freqs_un) == 1:
1262
- nulnus_plateau = m.model_UV(time, log_mh, a_bh, m_disc, r0, tvi, t_form, ang, frequency)
1263
- nulnus_decay = m.decay_model(time, log_L, tdecay, t_peak, log_T, v=freqs_un[0])
1264
+ nulnus_plateau = m.model_UV(time, log_mh, a_bh, m_disc, r0, tvi, t_form, ang, v=freqs_un[0])
1265
+ nulnus_decay = m.decay_model(time, log_L, t_decay, t_peak, log_T, v=freqs_un[0])
1264
1266
  nulnus_rise = m.rise_model(time, log_L, sigma, t_peak, log_T, v=freqs_un[0])
1265
1267
  else:
1266
1268
  for i in range(0,len(freqs_un)):
@@ -1280,9 +1282,11 @@ def fitted_exp_decay(time, redshift, log_mh, a_bh, m_disc, r0, tvi, t_form, incl
1280
1282
  frequency, time = calc_kcorrected_properties(frequency=lambda_to_nu(lambda_observer_frame),
1281
1283
  redshift=redshift, time=time_observer_frame)
1282
1284
  nulnus_plateau = m.model_SEDs(time, log_mh, a_bh, m_disc, r0, tvi, t_form, ang, frequency)
1283
- nulnus_risedecay = np.zeros((100, 300))
1284
- for i in range(0,len(frequency)):
1285
- nulnus_risedecay[i,:] = m.decay_model(time, log_L, t_decay, t_peak, log_T, v=frequency[i]) + m.rise_model(time, log_L, sigma, t_peak, log_T, v=frequency[i])
1285
+
1286
+ freq_0 = 6e14
1287
+ l_e_amp = (m.decay_model(time, log_L, t_decay, t_peak, log_T, freq_0) + m.rise_model(time, log_L, sigma, t_peak, log_T, freq_0))
1288
+ nulnus_risedecay = ((l_e_amp[:, None] * (frequency/freq_0)**4 *
1289
+ (np.exp(cc.planck * freq_0/(cc.boltzmann_constant * 10**log_T)) - 1)/(np.exp(cc.planck * frequency/(cc.boltzmann_constant * 10**log_T)) - 1)).T)
1286
1290
  flux_density = ((nulnus_risedecay + nulnus_plateau)/(4.0 * np.pi * dl**2 * frequency[:,np.newaxis] * 1.0e-26))
1287
1291
  fmjy = flux_density.T
1288
1292
  spectra = (fmjy * uu.mJy).to(uu.erg / uu.cm ** 2 / uu.s / uu.Angstrom,
@@ -1378,11 +1382,10 @@ def stream_stream_tde_bolometric(time, mbh_6, mstar, c1, f, h_r, inc_tcool, del_
1378
1382
  norm = output.bolometric_luminosity[0] / f1
1379
1383
 
1380
1384
  #evaluate giant array of bolometric luminosities
1381
- tt_pre_fb = np.linspace(0, output.time_temp[0], 100)
1385
+ tt_pre_fb = np.linspace(0, output.time_temp[0]-0.001, 100)
1382
1386
  tt_post_fb = output.time_temp
1383
1387
  full_time = np.concatenate([tt_pre_fb, tt_post_fb])
1384
- f1 = pm.gaussian_rise(time=tt_pre_fb, a_1=norm,
1385
- peak_time=peak_time * cc.day_to_s, sigma_t=sigma_t * cc.day_to_s)
1388
+ f1 = norm * np.exp(-(tt_pre_fb - (peak_time * cc.day_to_s))**2.0 / (2 * (sigma_t * cc.day_to_s) **2.0))
1386
1389
  f2 = output.bolometric_luminosity
1387
1390
  full_lbol = np.concatenate([f1, f2])
1388
1391
  lbol_func = interp1d(full_time, y=full_lbol, fill_value='extrapolate')
@@ -1420,7 +1423,7 @@ def stream_stream_tde(time, redshift, mbh_6, mstar, c1, f, h_r, inc_tcool, del_o
1420
1423
  #get bolometric and temperature info
1421
1424
  f1 = pm.gaussian_rise(time=output.time_temp[0] / cc.day_to_s, a_1=1, peak_time=peak_time, sigma_t=sigma_t)
1422
1425
  norm = output.bolometric_luminosity[0] / f1
1423
- tt_pre_fb = np.linspace(0, output.time_temp[0], 100)
1426
+ tt_pre_fb = np.linspace(0, output.time_temp[0]-0.001, 100)
1424
1427
  tt_post_fb = output.time_temp
1425
1428
  full_time = np.concatenate([tt_pre_fb, tt_post_fb])
1426
1429
  f1_src = pm.gaussian_rise(time=tt_pre_fb, a_1=norm,
@@ -1436,34 +1439,47 @@ def stream_stream_tde(time, redshift, mbh_6, mstar, c1, f, h_r, inc_tcool, del_o
1436
1439
  if kwargs['output_format'] == 'flux_density':
1437
1440
  frequency = kwargs['frequency']
1438
1441
  if isinstance(frequency, float):
1439
- frequency = np.ones(len(time)) * frequency
1440
-
1441
- else:
1442
- bands = kwargs['bands']
1443
- if isinstance(bands, str):
1444
- bands = [str(bands) for x in range(len(time))]
1445
- frequency=bands_to_frequency(bands)
1442
+ frequency = np.ones(len(time)) * frequency
1446
1443
 
1447
- # convert to source frame time and frequency
1448
- frequency, time = calc_kcorrected_properties(frequency=frequency, redshift=redshift, time=time)
1449
- unique_frequency = np.sort(np.unique(frequency))
1450
-
1451
- # build flux density function for each frequency
1452
- flux_den_interp_func = {}
1453
- total_time = full_time * (1 + redshift)
1454
- for freq in unique_frequency:
1455
- flux_den = sed.blackbody_to_flux_density(temperature=full_temp,
1444
+ # convert to source frame time and frequency
1445
+ frequency, time = calc_kcorrected_properties(frequency=frequency, redshift=redshift, time=time)
1446
+ unique_frequency = np.sort(np.unique(frequency))
1447
+
1448
+ # build flux density function for each frequency
1449
+ flux_den_interp_func = {}
1450
+ total_time = full_time * (1 + redshift)
1451
+ for freq in unique_frequency:
1452
+ flux_den = sed.blackbody_to_flux_density(temperature=full_temp,
1456
1453
  r_photosphere=r_eff,
1457
1454
  dl=dl, frequency=freq).to(uu.mJy)
1458
- flux_den_interp_func[freq] = interp1d(total_time, flux_den, fill_value='extrapolate')
1455
+ flux_den_interp_func[freq] = interp1d(total_time, flux_den, fill_value='extrapolate')
1459
1456
 
1460
- # interpolate onto actual observed frequency and time values
1461
- flux_density = []
1462
- for freq, tt in zip(frequency, time):
1463
- flux_density.append(flux_den_interp_func[freq](tt * cc.day_to_s))
1464
- flux_density = flux_density * uu.mJy
1465
-
1466
- if kwargs['output_format'] == 'flux_density':
1467
- return flux_density.to(uu.mJy).value
1468
- else:
1469
- return calc_ABmag_from_flux_density(flux_density.to(uu.mJy).value).value
1457
+ # interpolate onto actual observed frequency and time values
1458
+ flux_density = []
1459
+ for freq, tt in zip(frequency, time):
1460
+ flux_density.append(flux_den_interp_func[freq](tt * cc.day_to_s))
1461
+ flux_density = flux_density * uu.mJy
1462
+ return flux_density.to(uu.mJy).value
1463
+
1464
+ else:
1465
+ time_obs = time
1466
+ lambda_observer_frame = kwargs.get('lambda_array', np.geomspace(100, 60000, 100))
1467
+ time_observer_frame = full_time * (1. + redshift)
1468
+ frequency, time = calc_kcorrected_properties(frequency=lambda_to_nu(lambda_observer_frame),
1469
+ redshift=redshift, time=time_observer_frame)
1470
+ freq_0 = 6e14
1471
+ flux_den = sed.blackbody_to_flux_density(temperature=full_temp,
1472
+ r_photosphere=r_eff,
1473
+ dl=dl, frequency=freq_0).to(uu.mJy)
1474
+ fmjy = ((flux_den[:, None] * (frequency/freq_0)**4 *
1475
+ (np.exp(cc.planck * freq_0/(cc.boltzmann_constant * full_temp[:, None])) - 1) / (np.exp(cc.planck * frequency/(cc.boltzmann_constant * full_temp[:, None])) - 1)).T)
1476
+ spectra = fmjy.T.to(uu.erg / uu.cm ** 2 / uu.s / uu.Angstrom,
1477
+ equivalencies=uu.spectral_density(wav=lambda_observer_frame * uu.Angstrom))
1478
+ if kwargs['output_format'] == 'spectra':
1479
+ return namedtuple('output', ['time', 'lambdas', 'spectra'])(time=time_observer_frame,
1480
+ lambdas=lambda_observer_frame,
1481
+ spectra=spectra)
1482
+ else:
1483
+ return sed.get_correct_output_format_from_spectra(time=time_obs, time_eval=time_observer_frame/cc.day_to_s,
1484
+ spectra=spectra, lambda_array=lambda_observer_frame,
1485
+ **kwargs)