redback 1.0.31__py3-none-any.whl → 1.12.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. redback/__init__.py +3 -2
  2. redback/analysis.py +321 -4
  3. redback/filters.py +57 -23
  4. redback/get_data/directory.py +18 -0
  5. redback/likelihoods.py +260 -0
  6. redback/model_library.py +12 -2
  7. redback/plotting.py +335 -4
  8. redback/priors/blackbody_spectrum_with_absorption_and_emission_lines.prior +9 -0
  9. redback/priors/csm_shock_and_arnett_two_rphots.prior +11 -0
  10. redback/priors/exp_rise_powerlaw_decline.prior +6 -0
  11. redback/priors/powerlaw_spectrum_with_absorption_and_emission_lines.prior +8 -0
  12. redback/priors/salt2.prior +6 -0
  13. redback/priors/shock_cooling_and_arnett_bolometric.prior +11 -0
  14. redback/priors/shockcooling_morag.prior +6 -0
  15. redback/priors/shockcooling_morag_and_arnett.prior +10 -0
  16. redback/priors/shockcooling_morag_and_arnett_bolometric.prior +9 -0
  17. redback/priors/shockcooling_morag_bolometric.prior +5 -0
  18. redback/priors/shockcooling_sapirandwaxman.prior +6 -0
  19. redback/priors/shockcooling_sapirandwaxman_bolometric.prior +5 -0
  20. redback/priors/shockcooling_sapirwaxman_and_arnett.prior +10 -0
  21. redback/priors/shockcooling_sapirwaxman_and_arnett_bolometric.prior +9 -0
  22. redback/priors/shocked_cocoon_and_arnett.prior +13 -0
  23. redback/priors/synchrotron_ism.prior +6 -0
  24. redback/priors/synchrotron_massloss.prior +6 -0
  25. redback/priors/synchrotron_pldensity.prior +7 -0
  26. redback/priors/thermal_synchrotron_v2_fluxdensity.prior +8 -0
  27. redback/priors/thermal_synchrotron_v2_lnu.prior +7 -0
  28. redback/priors.py +10 -3
  29. redback/result.py +9 -1
  30. redback/sampler.py +46 -4
  31. redback/sed.py +48 -1
  32. redback/simulate_transients.py +5 -1
  33. redback/tables/filters.csv +265 -254
  34. redback/transient/__init__.py +2 -3
  35. redback/transient/transient.py +648 -10
  36. redback/transient_models/__init__.py +3 -2
  37. redback/transient_models/extinction_models.py +3 -2
  38. redback/transient_models/gaussianprocess_models.py +45 -0
  39. redback/transient_models/general_synchrotron_models.py +296 -6
  40. redback/transient_models/phenomenological_models.py +154 -7
  41. redback/transient_models/shock_powered_models.py +503 -40
  42. redback/transient_models/spectral_models.py +82 -0
  43. redback/transient_models/supernova_models.py +405 -31
  44. redback/transient_models/tde_models.py +57 -41
  45. redback/utils.py +302 -51
  46. {redback-1.0.31.dist-info → redback-1.12.0.dist-info}/METADATA +8 -6
  47. {redback-1.0.31.dist-info → redback-1.12.0.dist-info}/RECORD +50 -29
  48. {redback-1.0.31.dist-info → redback-1.12.0.dist-info}/WHEEL +1 -1
  49. {redback-1.0.31.dist-info → redback-1.12.0.dist-info/licenses}/LICENCE.md +0 -0
  50. {redback-1.0.31.dist-info → redback-1.12.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,82 @@
1
+ import numpy
2
+ from astropy.cosmology import Planck18 as cosmo
3
+ import redback.constants as cc
4
+ from redback.utils import lambda_to_nu, fnu_to_flambda
5
+ import redback.sed as sed
6
+ import redback.transient_models.phenomenological_models as pm
7
+
8
+ def _get_blackbody_spectrum(angstrom, temperature, r_photosphere, distance):
9
+ """
10
+ :param angstrom: wavelength array in angstroms
11
+ :param temperature: temperature in Kelvin
12
+ :param r_photosphere: photosphere radius in cm
13
+ :param distance: distance in cm
14
+ :return: flux in ergs/s/cm^2/angstrom
15
+ """
16
+ frequency = lambda_to_nu(angstrom)
17
+ flux_density = sed.blackbody_to_flux_density(frequency=frequency,
18
+ temperature=temperature,
19
+ r_photosphere=r_photosphere,
20
+ dl=distance)
21
+ flux_density = fnu_to_flambda(f_nu=flux_density, wavelength_A=angstrom)
22
+ return flux_density.value
23
+
24
+ def _get_powerlaw_spectrum(angstrom, alpha, aa):
25
+ """
26
+ :param angstrom: wavelength array in angstroms
27
+ :param alpha: power law index
28
+ :param aa: normalization
29
+ :return: flux in ergs/s/cm^2/angstrom
30
+ """
31
+ return aa*angstrom**alpha
32
+
33
+ def powerlaw_spectrum_with_absorption_and_emission_lines(angstroms, alpha, aa, lc1, ls1,
34
+ v1, lc2, ls2, v2, **kwargs):
35
+ """
36
+ A power law spectrum with one absorption line and one emission line.
37
+ One can add more lines if needed. Or turn the line strength to zero to remove the line.
38
+
39
+ :param angstroms: wavelength array in angstroms
40
+ :param alpha: power law index
41
+ :param aa: normalization
42
+ :param lc1: center of emission line
43
+ :param ls1: strength of emission line
44
+ :param v1: velocity of emission line
45
+ :param lc2: center of absorption line
46
+ :param ls2: strength of absorption line
47
+ :param v2: velocity of absorption line
48
+ :return: flux in ergs/s/cm^2/angstrom
49
+ """
50
+ flux = _get_powerlaw_spectrum(angstrom=angstroms, alpha=alpha, aa=aa)
51
+ fp1 = pm.line_spectrum_with_velocity_dispersion(angstroms, lc1, ls1, v1)
52
+ fp2 = pm.line_spectrum_with_velocity_dispersion(angstroms, lc2, ls2, v2)
53
+ return flux + fp1 - fp2
54
+
55
+
56
+ def blackbody_spectrum_with_absorption_and_emission_lines(angstroms, redshift,
57
+ rph, temp,
58
+ lc1, ls1, v1,
59
+ lc2, ls2, v2, **kwargs):
60
+ """
61
+ A blackbody spectrum with one absorption line and one emission line.
62
+ One can add more lines if needed. Or turn the line strength to zero to remove the line.
63
+
64
+ :param angstroms: wavelength array in angstroms
65
+ :param redshift: redshift
66
+ :param rph: photosphere radius in cm
67
+ :param temp: photosphere temperature in Kelvin
68
+ :param lc1: center of emission line
69
+ :param ls1: strength of emission line
70
+ :param v1: velocity of emission line
71
+ :param lc2: center of absorption line
72
+ :param ls2: strength of absorption line
73
+ :param v2: velocity of absorption line
74
+ :return: flux in ergs/s/cm^2/angstrom
75
+ """
76
+ cosmology = kwargs.get('cosmology', cosmo)
77
+ dl = cosmology.luminosity_distance(redshift).cgs.value
78
+ flux = _get_blackbody_spectrum(angstrom=angstroms, distance=dl,
79
+ r_photosphere=rph, temperature=temp)
80
+ fp1 = pm.line_spectrum_with_velocity_dispersion(angstroms, lc1, ls1, v1)
81
+ fp2 = pm.line_spectrum_with_velocity_dispersion(angstroms, lc2, ls2, v2)
82
+ return flux + fp1 - fp2
@@ -3,7 +3,7 @@ import pandas as pd
3
3
  from redback.transient_models.phenomenological_models import exponential_powerlaw, fallback_lbol
4
4
  from redback.transient_models.magnetar_models import magnetar_only, basic_magnetar
5
5
  from redback.transient_models.magnetar_driven_ejecta_models import _ejecta_dynamics_and_interaction
6
- from redback.transient_models.shock_powered_models import _shock_cooling
6
+ from redback.transient_models.shock_powered_models import _shocked_cocoon, _csm_shock_breakout
7
7
  import redback.interaction_processes as ip
8
8
  import redback.sed as sed
9
9
  import redback.photosphere as photosphere
@@ -115,6 +115,36 @@ def sncosmo_models(time, redshift, model_kwargs=None, **kwargs):
115
115
  elif kwargs['output_format'] == 'sncosmo_source':
116
116
  return model
117
117
 
118
+ @citation_wrapper('https://ui.adsabs.harvard.edu/abs/2007A%26A...466...11G/abstract, sncosmo')
119
+ def salt2(time, redshift, x0, x1, c, peak_time, **kwargs):
120
+ """
121
+ A wrapper to the salt2 model in sncosmo
122
+
123
+ :param time: time in days in observer frame (in mjd days)
124
+ :param redshift: redshift
125
+ :param x0: x0
126
+ :param x1: x1
127
+ :param c: c
128
+ :param peak_time: peak time in mjd
129
+ :param kwargs: Additional keyword arguments
130
+ :param cosmology: astropy cosmology object by default set to Planck18
131
+ :param mw_extinction: Boolean for whether there is MW extinction or not. Default True
132
+ :param host_extinction: Boolean for whether there is host extinction or not. Default True
133
+ if used adds an extra parameter ebv which must also be in kwargs; host galaxy E(B-V). Set to 0.1 by default
134
+ :param use_set_peak_magnitude: Boolean for whether to set the peak magnitude or not. Default False,
135
+ if True the following keyword arguments also apply. Else the brightness is set by the model_kwargs.
136
+ :param peak_abs_mag: SNe peak absolute magnitude default set to -19
137
+ :param peak_abs_mag_band: Band corresponding to the peak abs mag limit, default to standard::b. Must be in SNCosmo
138
+ :param magnitude_system: Mag system; default ab
139
+ :param output_format: 'flux_density', 'magnitude', 'spectra', 'flux', 'sncosmo_source'
140
+ :return: set by output format - 'flux_density', 'magnitude', 'flux', 'sncosmo_source'
141
+ """
142
+ kwargs['sncosmo_model'] = 'salt2'
143
+ kwargs['peak_time'] = peak_time
144
+ model_kwargs = {'x0':x0, 'x1':x1, 'c':c}
145
+ out = sncosmo_models(time=time, redshift=redshift, model_kwargs=model_kwargs, **kwargs)
146
+ return out
147
+
118
148
  @citation_wrapper('redback')
119
149
  def exponential_powerlaw_bolometric(time, lbol_0, alpha_1, alpha_2, tpeak_d, **kwargs):
120
150
  """
@@ -363,10 +393,40 @@ def arnett(time, redshift, f_nickel, mej, **kwargs):
363
393
  spectra=spectra, lambda_array=lambda_observer_frame,
364
394
  **kwargs)
365
395
 
366
- @citation_wrapper('https://ui.adsabs.harvard.edu/abs/1982ApJ...253..785A/abstract')
396
+ def shock_cooling_and_arnett_bolometric(time, log10_mass, log10_radius, log10_energy,
397
+ f_nickel, mej, vej, kappa, kappa_gamma, temperature_floor, **kwargs):
398
+ """
399
+ Bolometric luminosity of shock cooling and arnett model
400
+
401
+ :param time: time in days in source frame
402
+ :param log10_mass: log10 mass of extended material in solar masses
403
+ :param log10_radius: log10 radius of extended material in cm
404
+ :param log10_energy: log10 energy of extended material in ergs
405
+ :param f_nickel: fraction of nickel mass
406
+ :param mej: total ejecta mass in solar masses
407
+ :param vej: velocity of ejecta in km/s
408
+ :param kappa: opacity in cm^2/g
409
+ :param kappa_gamma: gamma-ray opacity in cm^2/g
410
+ :param temperature_floor: temperature floor in K
411
+ :param kwargs: Additional keyword arguments
412
+ :param nn: density power law slope
413
+ :param delta: inner density power law slope
414
+ :return: bolometric luminosity in erg/s
415
+ """
416
+ from redback.transient_models.shock_powered_models import shock_cooling_bolometric
417
+ lbol_1 = shock_cooling_bolometric(time=time * day_to_s, log10_mass=log10_mass, log10_radius=log10_radius,
418
+ log10_energy=log10_energy, **kwargs)
419
+ lbol_2 = arnett_bolometric(time=time, f_nickel=f_nickel, mej=mej, vej=vej, kappa=kappa,
420
+ kappa_gamma=kappa_gamma, temperature_floor=temperature_floor, **kwargs)
421
+ return lbol_1 + lbol_2
422
+
423
+
424
+ @citation_wrapper('https://ui.adsabs.harvard.edu/abs/1982ApJ...253..785A/abstract, Piro+2021')
367
425
  def shock_cooling_and_arnett(time, redshift, log10_mass, log10_radius, log10_energy,
368
- f_nickel, mej, **kwargs):
426
+ f_nickel, mej, vej, kappa, kappa_gamma, temperature_floor, **kwargs):
369
427
  """
428
+ Photometric light curve of shock cooling and arnett model
429
+
370
430
  :param time: time in days
371
431
  :param redshift: source redshift
372
432
  :param log10_mass: log10 mass of extended material in solar masses
@@ -374,12 +434,13 @@ def shock_cooling_and_arnett(time, redshift, log10_mass, log10_radius, log10_ene
374
434
  :param log10_energy: log10 energy of extended material in ergs
375
435
  :param f_nickel: fraction of nickel mass
376
436
  :param mej: total ejecta mass in solar masses
377
- :param kwargs: Must be all the kwargs required by the specific interaction_process, photosphere, sed methods used
378
- e.g., for Diffusion and TemperatureFloor: kappa, kappa_gamma, vej (km/s), temperature_floor
437
+ :param vej: velocity of ejecta in km/s
438
+ :param kappa: opacity in cm^2/g
439
+ :param kappa_gamma: gamma-ray opacity in cm^2/g
440
+ :param temperature_floor: temperature floor in K
441
+ :param kwargs: Additional keyword arguments
379
442
  :param nn: density power law slope
380
443
  :param delta: inner density power law slope
381
- :param interaction_process: Default is Diffusion.
382
- Can also be None in which case the output is just the raw engine luminosity, or another interaction process.
383
444
  :param photosphere: Default is TemperatureFloor.
384
445
  kwargs must have vej or relevant parameters if using different photosphere model
385
446
  :param sed: Default is blackbody.
@@ -391,32 +452,19 @@ def shock_cooling_and_arnett(time, redshift, log10_mass, log10_radius, log10_ene
391
452
  :param cosmology: Cosmology to use for luminosity distance calculation. Defaults to Planck18. Must be a astropy.cosmology object.
392
453
  :return: set by output format - 'flux_density', 'magnitude', 'spectra', 'flux', 'sncosmo_source'
393
454
  """
394
- kwargs['interaction_process'] = kwargs.get("interaction_process", ip.Diffusion)
395
455
  kwargs['photosphere'] = kwargs.get("photosphere", photosphere.TemperatureFloor)
396
456
  kwargs['sed'] = kwargs.get("sed", sed.Blackbody)
397
457
  cosmology = kwargs.get('cosmology', cosmo)
398
458
  dl = cosmology.luminosity_distance(redshift).cgs.value
399
- mass = 10 ** log10_mass
400
- radius = 10 ** log10_radius
401
- energy = 10 ** log10_energy
402
459
 
403
460
  if kwargs['output_format'] == 'flux_density':
404
461
  frequency = kwargs['frequency']
405
462
  frequency, time = calc_kcorrected_properties(frequency=frequency, redshift=redshift, time=time)
406
- output = _shock_cooling(time * day_to_s, mass=mass, radius=radius, energy=energy, **kwargs)
407
- lbol_1 = output.lbol
408
- lbol_2 = _nickelcobalt_engine(time=time, f_nickel=f_nickel, mej=mej)
409
- lbol = lbol_1 + lbol_2
410
-
411
- if kwargs['interaction_process'] is not None:
412
- dense_resolution = kwargs.get("dense_resolution", 1000)
413
- dense_times = np.linspace(0, time[-1]+100, dense_resolution)
414
- dense_lbols = _nickelcobalt_engine(time=dense_times, f_nickel=f_nickel, mej=mej)
415
- dense_lbols += _shock_cooling(dense_times * day_to_s, mass=mass, radius=radius, energy=energy, **kwargs).lbol
416
- interaction_class = kwargs['interaction_process'](time=time, dense_times=dense_times, luminosity=dense_lbols,
417
- mej=mej, **kwargs)
418
- lbol = interaction_class.new_luminosity
419
- photo = kwargs['photosphere'](time=time, luminosity=lbol, **kwargs)
463
+ lbol = shock_cooling_and_arnett_bolometric(time, log10_mass=log10_mass, log10_radius=log10_radius,
464
+ log10_energy=log10_energy, f_nickel=f_nickel,
465
+ mej=mej, vej=vej, kappa=kappa, kappa_gamma=kappa_gamma,
466
+ temperature_floor=temperature_floor, **kwargs)
467
+ photo = kwargs['photosphere'](time=time, luminosity=lbol, vej=vej, temperature_floor=temperature_floor, **kwargs)
420
468
 
421
469
  sed_1 = kwargs['sed'](temperature=photo.photosphere_temperature, r_photosphere=photo.r_photosphere,
422
470
  frequency=frequency, luminosity_distance=dl)
@@ -429,10 +477,11 @@ def shock_cooling_and_arnett(time, redshift, log10_mass, log10_radius, log10_ene
429
477
  time_observer_frame = time_temp * (1. + redshift)
430
478
  frequency, time = calc_kcorrected_properties(frequency=lambda_to_nu(lambda_observer_frame),
431
479
  redshift=redshift, time=time_observer_frame)
432
- lbol_1 = _nickelcobalt_engine(time=time, f_nickel=f_nickel, mej=mej)
433
- lbol_2 = _shock_cooling(time * day_to_s, mass=mass, radius=radius, energy=energy, **kwargs).lbol
434
- lbol = lbol_1 + lbol_2
435
- photo = kwargs['photosphere'](time=time, luminosity=lbol, **kwargs)
480
+ lbol = shock_cooling_and_arnett_bolometric(time, log10_mass=log10_mass, log10_radius=log10_radius,
481
+ log10_energy=log10_energy, f_nickel=f_nickel,
482
+ mej=mej, vej=vej, kappa=kappa, kappa_gamma=kappa_gamma,
483
+ temperature_floor=temperature_floor, **kwargs)
484
+ photo = kwargs['photosphere'](time=time, luminosity=lbol, vej=vej, temperature_floor=temperature_floor, **kwargs)
436
485
  sed_1 = kwargs['sed'](temperature=photo.photosphere_temperature, r_photosphere=photo.r_photosphere,
437
486
  frequency=frequency[:,None], luminosity_distance=dl)
438
487
  fmjy = sed_1.flux_density.T
@@ -447,6 +496,181 @@ def shock_cooling_and_arnett(time, redshift, log10_mass, log10_radius, log10_ene
447
496
  spectra=spectra, lambda_array=lambda_observer_frame,
448
497
  **kwargs)
449
498
 
499
+ @citation_wrapper('https://academic.oup.com/mnras/article/522/2/2764/7086123#443111844, https://ui.adsabs.harvard.edu/abs/1982ApJ...253..785A/abstract')
500
+ def shockcooling_morag_and_arnett_bolometric(time, v_shock, m_env, mej, f_rho, f_nickel, radius, kappa, **kwargs):
501
+ """
502
+ Assumes Shock cooling following Morag+ and arnett model for radioactive decay
503
+
504
+ :param time: time in source frame in days
505
+ :param v_shock: shock speed in km/s, also the ejecta velocity in the arnett calculation
506
+ :param m_env: envelope mass in solar masses
507
+ :param mej: ejecta mass in solar masses
508
+ :param f_rho: f_rho. Typically, of order unity
509
+ :param f_nickel: fraction of nickel mass
510
+ :param radius: star/envelope radius in units of 10^13 cm
511
+ :param kappa: opacity in cm^2/g
512
+ :param kwargs: Additional parameters required by model
513
+ :return: bolometric luminosity in erg/s
514
+ """
515
+ from redback.transient_models.shock_powered_models import shockcooling_morag_bolometric
516
+ f_rho_m = f_rho * mej
517
+ nickel_lbol = arnett_bolometric(time=time, f_nickel=f_nickel,
518
+ mej=mej, interaction_process=ip.Diffusion, kappa=kappa, vej=v_shock, **kwargs)
519
+ sbo_output = shockcooling_morag_bolometric(time=time, v_shock=v_shock, m_env=m_env, f_rho_m=f_rho_m,
520
+ radius=radius, kappa=kappa, **kwargs)
521
+ lbol = nickel_lbol + sbo_output
522
+ return lbol
523
+
524
+ @citation_wrapper('https://academic.oup.com/mnras/article/522/2/2764/7086123#443111844, https://ui.adsabs.harvard.edu/abs/1982ApJ...253..785A/abstract')
525
+ def shockcooling_morag_and_arnett(time, redshift, v_shock, m_env, mej, f_rho, f_nickel, radius, kappa, **kwargs):
526
+ """
527
+ Assumes Shock cooling following Morag+ and arnett model for radioactive decay
528
+
529
+ :param time: time in observer frame in days
530
+ :param redshift: source redshift
531
+ :param v_shock: shock speed in km/s, also the ejecta velocity in the arnett calculation
532
+ :param m_env: envelope mass in solar masses
533
+ :param mej: ejecta mass in solar masses
534
+ :param f_rho: f_rho. Typically, of order unity
535
+ :param f_nickel: fraction of nickel mass
536
+ :param radius: star/envelope radius in units of 10^13 cm
537
+ :param kappa: opacity in cm^2/g
538
+ :param kwargs: Additional parameters required by model
539
+ :param frequency: Required if output_format is 'flux_density'.
540
+ frequency to calculate - Must be same length as time array or a single number).
541
+ :param bands: Required if output_format is 'magnitude' or 'flux'.
542
+ :param output_format: 'flux_density', 'magnitude', 'spectra', 'flux', 'sncosmo_source'
543
+ :param lambda_array: Optional argument to set your desired wavelength array (in Angstroms) to evaluate the SED on.
544
+ :param cosmology: Cosmology to use for luminosity distance calculation. Defaults to Planck18. Must be a astropy.cosmology object.
545
+ :return: set by output format - 'flux_density', 'magnitude', 'spectra', 'flux', 'sncosmo_source'
546
+ """
547
+ cosmology = kwargs.get('cosmology', cosmo)
548
+ dl = cosmology.luminosity_distance(redshift).cgs.value
549
+
550
+ if kwargs['output_format'] == 'flux_density':
551
+ frequency = kwargs['frequency']
552
+ frequency, time = calc_kcorrected_properties(frequency=frequency, redshift=redshift, time=time)
553
+ lbol = shockcooling_morag_and_arnett_bolometric(time=time, v_shock=v_shock, m_env=m_env, mej=mej,
554
+ f_rho=f_rho, f_nickel=f_nickel, radius=radius, kappa=kappa, **kwargs)
555
+ photo = photosphere.TemperatureFloor(time=time, luminosity=lbol, vej=v_shock, **kwargs)
556
+ sed_1 = sed.Blackbody(temperature=photo.photosphere_temperature, r_photosphere=photo.r_photosphere,
557
+ frequency=frequency, luminosity_distance=dl)
558
+ flux_density = sed_1.flux_density
559
+ return flux_density.to(uu.mJy).value
560
+ else:
561
+ time_obs = time
562
+ lambda_observer_frame = kwargs.get('lambda_array', np.geomspace(100, 60000, 100))
563
+ time_temp = np.geomspace(0.1, 3000, 300) # in days
564
+ time_observer_frame = time_temp * (1. + redshift)
565
+ frequency, time = calc_kcorrected_properties(frequency=lambda_to_nu(lambda_observer_frame),
566
+ redshift=redshift, time=time_observer_frame)
567
+ lbol = shockcooling_morag_and_arnett_bolometric(time=time, v_shock=v_shock, m_env=m_env, mej=mej,
568
+ f_rho=f_rho, f_nickel=f_nickel, radius=radius, kappa=kappa, **kwargs)
569
+ photo = photosphere.TemperatureFloor(time=time, luminosity=lbol, vej=v_shock, **kwargs)
570
+ sed_1 = sed.Blackbody(temperature=photo.photosphere_temperature, r_photosphere=photo.r_photosphere,
571
+ frequency=frequency[:, None], luminosity_distance=dl)
572
+ fmjy = sed_1.flux_density.T
573
+ spectra = fmjy.to(uu.mJy).to(uu.erg / uu.cm ** 2 / uu.s / uu.Angstrom,
574
+ equivalencies=uu.spectral_density(wav=lambda_observer_frame * uu.Angstrom))
575
+ if kwargs['output_format'] == 'spectra':
576
+ return namedtuple('output', ['time', 'lambdas', 'spectra'])(time=time_observer_frame,
577
+ lambdas=lambda_observer_frame,
578
+ spectra=spectra)
579
+ else:
580
+ return sed.get_correct_output_format_from_spectra(time=time_obs, time_eval=time_observer_frame,
581
+ spectra=spectra, lambda_array=lambda_observer_frame,
582
+ **kwargs)
583
+
584
+ @citation_wrapper('https://iopscience.iop.org/article/10.3847/1538-4357/aa64df, https://ui.adsabs.harvard.edu/abs/1982ApJ...253..785A/abstract')
585
+ def shockcooling_sapirwaxman_and_arnett_bolometric(time, v_shock, m_env, mej, f_rho, f_nickel, radius, kappa, **kwargs):
586
+ """
587
+ Assumes Shock cooling following Sapir and Waxman and arnett model for radioactive decay
588
+
589
+ :param time: time in source frame in days
590
+ :param v_shock: shock speed in km/s, also the ejecta velocity in the arnett calculation
591
+ :param m_env: envelope mass in solar masses
592
+ :param mej: ejecta mass in solar masses
593
+ :param f_rho: f_rho. Typically, of order unity
594
+ :param f_nickel: fraction of nickel mass
595
+ :param radius: star/envelope radius in units of 10^13 cm
596
+ :param kappa: opacity in cm^2/g
597
+ :param kwargs: Additional parameters required by model
598
+ :param n: index of progenitor density profile, 1.5 (default) or 3.0
599
+ :param RW: If True, use the simplified Rabinak & Waxman formulation (off by default)
600
+ :return: bolometric luminosity in erg/s
601
+ """
602
+ from redback.transient_models.shock_powered_models import shockcooling_sapirandwaxman_bolometric
603
+ f_rho_m = f_rho * mej
604
+ nickel_lbol = arnett_bolometric(time=time, f_nickel=f_nickel,
605
+ mej=mej, interaction_process=ip.Diffusion, kappa=kappa, vej=v_shock, **kwargs)
606
+ sbo_output = shockcooling_sapirandwaxman_bolometric(time=time, v_shock=v_shock, m_env=m_env, f_rho_m=f_rho_m,
607
+ radius=radius, kappa=kappa, **kwargs)
608
+ lbol = nickel_lbol + sbo_output
609
+ return lbol
610
+
611
+ @citation_wrapper('https://iopscience.iop.org/article/10.3847/1538-4357/aa64df, https://ui.adsabs.harvard.edu/abs/1982ApJ...253..785A/abstract')
612
+ def shockcooling_sapirwaxman_and_arnett(time, redshift, v_shock, m_env, mej, f_rho, f_nickel, radius, kappa, **kwargs):
613
+ """
614
+ Assumes Shock cooling following Sapir and Waxman and arnett model for radioactive decay
615
+
616
+ :param time: time in source frame in days
617
+ :param v_shock: shock speed in km/s, also the ejecta velocity in the arnett calculation
618
+ :param m_env: envelope mass in solar masses
619
+ :param mej: ejecta mass in solar masses
620
+ :param f_rho: f_rho. Typically, of order unity
621
+ :param f_nickel: fraction of nickel mass
622
+ :param radius: star/envelope radius in units of 10^13 cm
623
+ :param kappa: opacity in cm^2/g
624
+ :param kwargs: Additional parameters required by model
625
+ :param n: index of progenitor density profile, 1.5 (default) or 3.0
626
+ :param RW: If True, use the simplified Rabinak & Waxman formulation (off by default)
627
+ :param frequency: Required if output_format is 'flux_density'.
628
+ frequency to calculate - Must be same length as time array or a single number).
629
+ :param bands: Required if output_format is 'magnitude' or 'flux'.
630
+ :param output_format: 'flux_density', 'magnitude', 'spectra', 'flux', 'sncosmo_source'
631
+ :param lambda_array: Optional argument to set your desired wavelength array (in Angstroms) to evaluate the SED on.
632
+ :param cosmology: Cosmology to use for luminosity distance calculation. Defaults to Planck18. Must be a astropy.cosmology object.
633
+ :return: set by output format - 'flux_density', 'magnitude', 'spectra', 'flux', 'sncosmo_source'
634
+ """
635
+ cosmology = kwargs.get('cosmology', cosmo)
636
+ dl = cosmology.luminosity_distance(redshift).cgs.value
637
+
638
+ if kwargs['output_format'] == 'flux_density':
639
+ frequency = kwargs['frequency']
640
+ frequency, time = calc_kcorrected_properties(frequency=frequency, redshift=redshift, time=time)
641
+ lbol = shockcooling_morag_and_arnett_bolometric(time=time, v_shock=v_shock, m_env=m_env, mej=mej,
642
+ f_rho=f_rho, f_nickel=f_nickel, radius=radius, kappa=kappa,
643
+ **kwargs)
644
+ photo = photosphere.TemperatureFloor(time=time, luminosity=lbol, vej=v_shock, **kwargs)
645
+ sed_1 = sed.Blackbody(temperature=photo.photosphere_temperature, r_photosphere=photo.r_photosphere,
646
+ frequency=frequency, luminosity_distance=dl)
647
+ flux_density = sed_1.flux_density
648
+ return flux_density.to(uu.mJy).value
649
+ else:
650
+ time_obs = time
651
+ lambda_observer_frame = kwargs.get('lambda_array', np.geomspace(100, 60000, 100))
652
+ time_temp = np.geomspace(0.1, 3000, 300) # in days
653
+ time_observer_frame = time_temp * (1. + redshift)
654
+ frequency, time = calc_kcorrected_properties(frequency=lambda_to_nu(lambda_observer_frame),
655
+ redshift=redshift, time=time_observer_frame)
656
+ lbol = shockcooling_morag_and_arnett_bolometric(time=time, v_shock=v_shock, m_env=m_env, mej=mej,
657
+ f_rho=f_rho, f_nickel=f_nickel, radius=radius, kappa=kappa,
658
+ **kwargs)
659
+ photo = photosphere.TemperatureFloor(time=time, luminosity=lbol, vej=v_shock, **kwargs)
660
+ sed_1 = sed.Blackbody(temperature=photo.photosphere_temperature, r_photosphere=photo.r_photosphere,
661
+ frequency=frequency[:, None], luminosity_distance=dl)
662
+ fmjy = sed_1.flux_density.T
663
+ spectra = fmjy.to(uu.mJy).to(uu.erg / uu.cm ** 2 / uu.s / uu.Angstrom,
664
+ equivalencies=uu.spectral_density(wav=lambda_observer_frame * uu.Angstrom))
665
+ if kwargs['output_format'] == 'spectra':
666
+ return namedtuple('output', ['time', 'lambdas', 'spectra'])(time=time_observer_frame,
667
+ lambdas=lambda_observer_frame,
668
+ spectra=spectra)
669
+ else:
670
+ return sed.get_correct_output_format_from_spectra(time=time_obs, time_eval=time_observer_frame,
671
+ spectra=spectra, lambda_array=lambda_observer_frame,
672
+ **kwargs)
673
+
450
674
  @citation_wrapper('redback')
451
675
  def basic_magnetar_powered_bolometric(time, p0, bp, mass_ns, theta_pb, **kwargs):
452
676
  """
@@ -707,7 +931,6 @@ def magnetar_nickel(time, redshift, f_nickel, mej, p0, bp, mass_ns, theta_pb, **
707
931
  **kwargs)
708
932
 
709
933
 
710
-
711
934
  @citation_wrapper('redback')
712
935
  def homologous_expansion_supernova_model_bolometric(time, mej, ek, **kwargs):
713
936
  """
@@ -1619,12 +1842,12 @@ def csm_shock_and_arnett_bolometric(time, mej, f_nickel, csm_mass, v_min, beta,
1619
1842
  lbol = nickel_lbol + sbo_output
1620
1843
  return lbol
1621
1844
 
1622
-
1623
1845
  @citation_wrapper('https://ui.adsabs.harvard.edu/abs/2022ApJ...933..238M/abstract, https://ui.adsabs.harvard.edu/abs/1982ApJ...253..785A/abstract')
1624
1846
  def csm_shock_and_arnett(time, redshift, mej, f_nickel, csm_mass, v_min, beta, shell_radius,
1625
1847
  shell_width_ratio, kappa, **kwargs):
1626
1848
  """
1627
1849
  Assumes CSM interaction for a shell-like CSM with a hard outer boundary and arnett model for radioactive decay
1850
+ Assumes one single photosphere from the sum of the bolometric luminosities
1628
1851
 
1629
1852
  :param time: time in days in observer frame
1630
1853
  :param redshift: source redshift
@@ -1674,6 +1897,157 @@ def csm_shock_and_arnett(time, redshift, mej, f_nickel, csm_mass, v_min, beta, s
1674
1897
  sed_1 = sed.Blackbody(temperature=photo.photosphere_temperature, r_photosphere=photo.r_photosphere,
1675
1898
  frequency=frequency[:, None], luminosity_distance=dl)
1676
1899
  fmjy = sed_1.flux_density.T
1900
+ spectra = fmjy.to(uu.mJy).to(uu.erg / uu.cm ** 2 / uu.s / uu.Angstrom,
1901
+ equivalencies=uu.spectral_density(wav=lambda_observer_frame * uu.Angstrom))
1902
+ if kwargs['output_format'] == 'spectra':
1903
+ return namedtuple('output', ['time', 'lambdas', 'spectra'])(time=time_observer_frame,
1904
+ lambdas=lambda_observer_frame,
1905
+ spectra=spectra)
1906
+ else:
1907
+ return sed.get_correct_output_format_from_spectra(time=time_obs, time_eval=time_observer_frame,
1908
+ spectra=spectra, lambda_array=lambda_observer_frame,
1909
+ **kwargs)
1910
+
1911
+ @citation_wrapper('https://ui.adsabs.harvard.edu/abs/2022ApJ...933..238M/abstract, https://ui.adsabs.harvard.edu/abs/1982ApJ...253..785A/abstract')
1912
+ def csm_shock_and_arnett_two_rphots(time, redshift, mej, f_nickel, csm_mass, v_min, beta, shell_radius,
1913
+ shell_width_ratio, kappa, **kwargs):
1914
+ """
1915
+ Assumes CSM interaction for a shell-like CSM with a hard outer boundary and arnett model for radioactive decay.
1916
+ Assumes the photospheres for the CSM-interaction and the Arnett model are different.
1917
+
1918
+ :param time: time in days in observer frame
1919
+ :param redshift: source redshift
1920
+ :param mej: ejecta mass in solar masses
1921
+ :param f_nickel: fraction of nickel mass
1922
+ :param csm_mass: csm mass in solar masses
1923
+ :param v_min: ejecta velocity in km/s
1924
+ :param beta: velocity ratio in c (beta < 1)
1925
+ :param shell_radius: radius of shell in 10^14 cm
1926
+ :param kappa: opacity
1927
+ :param shell_width_ratio: shell width ratio (deltaR/R0)
1928
+ :param kwargs: kappa_gamma, temperature_floor, and any kwarg to
1929
+ change any other input physics/parameters from default.
1930
+ :param frequency: Required if output_format is 'flux_density'.
1931
+ frequency to calculate - Must be same length as time array or a single number).
1932
+ :param bands: Required if output_format is 'magnitude' or 'flux'.
1933
+ :param output_format: 'flux_density', 'magnitude', 'spectra', 'flux', 'sncosmo_source'
1934
+ :param lambda_array: Optional argument to set your desired wavelength array (in Angstroms) to evaluate the SED on.
1935
+ :param cosmology: Cosmology to use for luminosity distance calculation. Defaults to Planck18. Must be a astropy.cosmology object.
1936
+ :return: set by output format - 'flux_density', 'magnitude', 'spectra', 'flux', 'sncosmo_source'
1937
+ """
1938
+ cosmology = kwargs.get('cosmology', cosmo)
1939
+ dl = cosmology.luminosity_distance(redshift).cgs.value
1940
+
1941
+ if kwargs['output_format'] == 'flux_density':
1942
+ frequency = kwargs['frequency']
1943
+ frequency, time = calc_kcorrected_properties(frequency=frequency, redshift=redshift, time=time)
1944
+
1945
+ output = _csm_shock_breakout(time=time, csm_mass=csm_mass*solar_mass, v_min=v_min, beta=beta, kappa=kappa,
1946
+ shell_radius=shell_radius, shell_width_ratio=shell_width_ratio, **kwargs)
1947
+ r_phot = output.r_photosphere
1948
+ temp = output.temperature
1949
+ flux_density = sed.blackbody_to_flux_density(temperature=temp, r_photosphere=r_phot, dl=dl, frequency=frequency)
1950
+ lbol = arnett_bolometric(time=time, f_nickel=f_nickel, mej=mej, vej=v_min, kappa=kappa,
1951
+ interaction_process=ip.Diffusion, **kwargs)
1952
+ photo = photosphere.TemperatureFloor(time=time, luminosity=lbol, vej=v_min, **kwargs)
1953
+ sed_1 = sed.Blackbody(temperature=photo.photosphere_temperature,
1954
+ r_photosphere=photo.r_photosphere, frequency=frequency, luminosity_distance=dl)
1955
+ flux_density += sed_1.flux_density
1956
+ return flux_density.to(uu.mJy).value
1957
+ else:
1958
+ time_obs = time
1959
+ lambda_observer_frame = kwargs.get('lambda_array', np.geomspace(100, 60000, 100))
1960
+ time_temp = np.geomspace(0.1, 300, 300) # in days
1961
+ time_observer_frame = time_temp * (1. + redshift)
1962
+ frequency, time = calc_kcorrected_properties(frequency=lambda_to_nu(lambda_observer_frame),
1963
+ redshift=redshift, time=time_observer_frame)
1964
+ output = _csm_shock_breakout(time=time, csm_mass=csm_mass * solar_mass, v_min=v_min, beta=beta, kappa=kappa,
1965
+ shell_radius=shell_radius, shell_width_ratio=shell_width_ratio, **kwargs)
1966
+ fmjy = sed.blackbody_to_flux_density(temperature=output.temperature,
1967
+ r_photosphere=output.r_photosphere, frequency=frequency[:, None], dl=dl)
1968
+ lbol = arnett_bolometric(time=time, f_nickel=f_nickel, mej=mej, vej=v_min, kappa=kappa,
1969
+ interaction_process=ip.Diffusion, **kwargs)
1970
+ photo = photosphere.TemperatureFloor(time=time, luminosity=lbol, vej=v_min, **kwargs)
1971
+ sed_1 = sed.Blackbody(temperature=photo.photosphere_temperature,
1972
+ r_photosphere=photo.r_photosphere, frequency=frequency[:, None], luminosity_distance=dl)
1973
+ fmjy += sed_1.flux_density
1974
+ fmjy = fmjy.T
1975
+ spectra = fmjy.to(uu.mJy).to(uu.erg / uu.cm ** 2 / uu.s / uu.Angstrom,
1976
+ equivalencies=uu.spectral_density(wav=lambda_observer_frame * uu.Angstrom))
1977
+ if kwargs['output_format'] == 'spectra':
1978
+ return namedtuple('output', ['time', 'lambdas', 'spectra'])(time=time_observer_frame,
1979
+ lambdas=lambda_observer_frame,
1980
+ spectra=spectra)
1981
+ else:
1982
+ return sed.get_correct_output_format_from_spectra(time=time_obs, time_eval=time_observer_frame,
1983
+ spectra=spectra, lambda_array=lambda_observer_frame,
1984
+ **kwargs)
1985
+
1986
+ def shocked_cocoon_and_arnett(time, redshift, mej_c, vej_c, eta, tshock, shocked_fraction, cos_theta_cocoon, kappa,
1987
+ mej, f_nickel, vej, **kwargs):
1988
+ """
1989
+ Emission from a shocked cocoon and arnett model for radioactive decay.
1990
+ We assume two different photospheres here.
1991
+
1992
+ :param time: Time in days in observer frame
1993
+ :param redshift: redshift
1994
+ :param mej_c: cocoon mass (in solar masses)
1995
+ :param vej_c: cocoon material velocity (in c)
1996
+ :param eta: slope for the cocoon density profile
1997
+ :param tshock: shock breakout time (in seconds)
1998
+ :param shocked_fraction: fraction of the cocoon shocked
1999
+ :param cos_theta_cocoon: cosine of the cocoon opening angle
2000
+ :param kappa: opacity
2001
+ :param mej: supernova ejecta mass (in solar masses)
2002
+ :param f_nickel: fraction of nickel for ejecta mass
2003
+ :param vej: supernova ejecta velocity (in km/s)
2004
+ :param kwargs: Extra parameters used by model e.g., kappa_gamma, temperature_floor, and any kwarg to
2005
+ change any other input physics/parameters from default.
2006
+ :param frequency: Required if output_format is 'flux_density'.
2007
+ frequency to calculate - Must be same length as time array or a single number).
2008
+ :param bands: Required if output_format is 'magnitude' or 'flux'.
2009
+ :param output_format: 'flux_density', 'magnitude', 'spectra', 'flux', 'sncosmo_source'
2010
+ :param lambda_array: Optional argument to set your desired wavelength array (in Angstroms) to evaluate the SED on.
2011
+ :param cosmology: Cosmology to use for luminosity distance calculation. Defaults to Planck18. Must be a astropy.cosmology object.
2012
+ :return: set by output format - 'flux_density', 'magnitude', 'spectra', 'flux', 'sncosmo_source'
2013
+ """
2014
+ cosmology = kwargs.get('cosmology', cosmo)
2015
+ dl = cosmology.luminosity_distance(redshift).cgs.value
2016
+ time_obs = time
2017
+
2018
+ if kwargs['output_format'] == 'flux_density':
2019
+ frequency = kwargs['frequency']
2020
+ frequency, time = calc_kcorrected_properties(frequency=frequency, redshift=redshift, time=time)
2021
+ output = _shocked_cocoon(time=time, mej=mej_c, vej=vej_c, eta=eta,
2022
+ tshock=tshock, shocked_fraction=shocked_fraction,
2023
+ cos_theta_cocoon=cos_theta_cocoon, kappa=kappa)
2024
+ flux_density = sed.blackbody_to_flux_density(temperature=output.temperature, r_photosphere=output.r_photosphere,
2025
+ dl=dl, frequency=frequency)
2026
+ lbol = arnett_bolometric(time=time, f_nickel=f_nickel, mej=mej, vej=vej,
2027
+ interaction_process=ip.Diffusion, kappa=kappa, **kwargs)
2028
+ photo = photosphere.TemperatureFloor(time=time, luminosity=lbol, vej=vej, **kwargs)
2029
+ sed_1 = sed.Blackbody(temperature=photo.photosphere_temperature,
2030
+ r_photosphere=photo.r_photosphere, frequency=frequency, luminosity_distance=dl)
2031
+ flux_density += sed_1.flux_density
2032
+ return flux_density.to(uu.mJy).value
2033
+ else:
2034
+ lambda_observer_frame = kwargs.get('frequency_array', np.geomspace(100, 60000, 200))
2035
+ time_temp = np.linspace(1e-2, 300, 300)
2036
+ time_observer_frame = time_temp
2037
+ frequency, time = calc_kcorrected_properties(frequency=lambda_to_nu(lambda_observer_frame),
2038
+ redshift=redshift, time=time_observer_frame)
2039
+ output = _shocked_cocoon(time=time, mej=mej_c, vej=vej_c, eta=eta,
2040
+ tshock=tshock, shocked_fraction=shocked_fraction,
2041
+ cos_theta_cocoon=cos_theta_cocoon, kappa=kappa)
2042
+ fmjy = sed.blackbody_to_flux_density(temperature=output.temperature,
2043
+ r_photosphere=output.r_photosphere, frequency=frequency[:, None], dl=dl)
2044
+ lbol = arnett_bolometric(time=time, f_nickel=f_nickel, mej=mej, vej=vej,
2045
+ interaction_process=ip.Diffusion, kappa=kappa, **kwargs)
2046
+ photo = photosphere.TemperatureFloor(time=time, luminosity=lbol, vej=vej, **kwargs)
2047
+ sed_1 = sed.Blackbody(temperature=photo.photosphere_temperature,
2048
+ r_photosphere=photo.r_photosphere, frequency=frequency[:, None], luminosity_distance=dl)
2049
+ fmjy += sed_1.flux_density
2050
+ fmjy = fmjy.T
1677
2051
  spectra = fmjy.to(uu.mJy).to(uu.erg / uu.cm ** 2 / uu.s / uu.Angstrom,
1678
2052
  equivalencies=uu.spectral_density(wav=lambda_observer_frame * uu.Angstrom))
1679
2053
  if kwargs['output_format'] == 'spectra':