""" Estimate magnitude range for a host FRB given DM """
import numpy as np
#import healpy as hp
from matplotlib import pyplot as plt
import matplotlib.gridspec as gridspec
from astropy.coordinates import Distance
from astropy.coordinates import SkyCoord
from frb.figures import utils as frb_fig_u
from frb.galaxies import utils as frb_gal_u
from frb import mw
# user parameters
FRB = 'FRB20240304'
frb_coords = SkyCoord(ra=182.9972083, dec=11.8130667, unit='deg')
DM_FRB=2641.5
host_DM = 80.
MW_halo = 50.
[docs]
def grab_zlim():
"""
Computes the minimum and maximum FRB redshift limits within a confidence
interval from DM
Returns z_min, z_max
"""
# NE 2001
DM_ISM = mw.ismDM(frb_coords)
# DM Cosmic: total - MW_ISM from ne2001 - MW_halo from user - host_DM from user
DM_cosmic = DM_FRB - DM_ISM.value - MW_halo - host_DM
# Load z-DM distribution
sdict = prob_dmz.grab_repo_grid()
PDM_z = sdict['PDM_z']
z = sdict['z']
DM = sdict['DM']
# find probability corresponding to calculated DM_cosmic
iDM = np.argmin(np.abs(DM - DM_cosmic))
PzDM = PDM_z[iDM, :] / np.sum(PDM_z[iDM, :])
# create cumulative dist and set confidence limits
cum_sum = np.cumsum(PzDM)
limits = (2.5, 97.5)
# find z corresponding to confidence limits in the CDF
z_min = z[np.argmin(np.abs(cum_sum-limits[0]/100.))]
z_max = z[np.argmin(np.abs(cum_sum-limits[1]/100.))]
return z_min, z_max
[docs]
def r_vs_dm(outfile='fig_r_vs_z.png',
flipy=True, known_hosts = False):
"""
Plots the intersection of galaxy apparent magnitude evolution with redshift
and redshift range of the FRB and saves it.
Args:
outfile (str) : name of the output file. Default "fig_r_vs_z.png"
flipy (bool) : flip order of y-axis (mag) values. Default True
known_hosts (bool) : wish to overplot m_r - z for known FRB hosts. Default False
"""
# get redshift limits given DM
z_min, z_max = grab_zlim()
# Function to convert redshift to m_r for Luminosity
f_mL = frb_gal_u.load_f_mL()
# set up the figure
plt.figure(figsize=(6, 5))
gs = gridspec.GridSpec(1,1)
ax = plt.subplot(gs[0])
ax.grid(alpha=0.2)
# if you wish to overplot known FRB hosts
if known_hosts == True:
# Load up hosts
host_tbl, _ = frb_gal_u.build_table_of_hosts()
# Cut on PATH
cut_path = (host_tbl.P_Ox > 0.8) & np.isfinite(host_tbl.P_Ox)
# Cut on M_r
cut_Mr = np.isfinite(host_tbl.M_r)
good_hosts = host_tbl[cut_Mr & cut_path].copy()
# Calculate apparaent magnitude
m_r = []
for kk in range(len(good_hosts)):
ihost = good_hosts.iloc[kk]
# Distance
d = Distance(z=ihost.z)
m_r.append(ihost.M_r + d.distmod.value)
good_hosts['m_r'] = m_r
# plot the known hosts
ax.plot(good_hosts.z, good_hosts.m_r, 'ok',
label='Secure hosts')
# plot
# L curves
zvals = np.linspace(0.021, 4.0, 200)
m_Lstar = f_mL(zvals)
ax.plot(zvals, m_Lstar, '-r', label='L*')
m_01Lstar = m_Lstar + 2.5
ax.plot(zvals, m_01Lstar, '--r', label='0.1 L*')
m_001Lstar = m_Lstar + 5
ax.plot(zvals, m_001Lstar, ':r', label='0.01 L*')
# Add P(z|DM)
xmnx = (0., 4.)
ymnx = (14, 33.)
if flipy:
ymnx = (ymnx[1], ymnx[0])
y_range = np.linspace(ymnx[0], ymnx[1], 100)
ax.fill_betweenx(y_range, x1=z_min, x2=z_max,
color='lightgreen', alpha=0.5)
#zlbl = 'P(z|DM) [95% c.l.]'
zlbl = '95% c.l. FRB Redshift \n estimated from DM'
ax.text(np.mean([z_min,z_max]), 20.5, zlbl,
color='k',
size='large', ha='center')
ax.set_xlabel(r'$z$')
ax.set_ylabel(r'$m_r$')
ax.set_xlim(xmnx)
ax.set_ylim(ymnx)
ax.xaxis.set_major_locator(plt.MultipleLocator(0.5))
ax.legend()
frb_fig_u.set_fontsize(ax, 15.)
# End
plt.title(FRB)
plt.tight_layout(pad=0.2, h_pad=0., w_pad=0.1)
print('Writing {:s}'.format(outfile))
kwargs = {}
if 'png' in outfile:
kwargs['dpi'] = 300
plt.savefig(outfile, **kwargs)
plt.close()
''' Run me '''
# Command line execution
if __name__ == '__main__':
r_vs_dm()