In [3]:
cd ~/Dropbox/notebooks/ghost_halos/
In [4]:
import numpy as np
import matplotlib.pyplot as plt
#rcParams['font.size'] = 12
font = {'size' : 15}
matplotlib.rc('font', **font)
In [5]:
from astropy.io import fits
In [6]:
def load_halo(fname):
try:
hdulist = fits.open(fname)
except:
print "Cannot open "+fname
return
tdata = hdulist[1].data
hdulist.close()
return tdata['Obsangle'], tdata['Intensity'] # arcsec, arcsec^-2
In [7]:
alpha, grey_igm_halo = load_halo('halo_uIGM_grey_gra.fits')
alpha, big_igm_halo = load_halo('halo_uIGM_gra.fits')
Minimal flux to get into RASS Bright Sources Catalog: $5 \times 10^{-13}$ cgs
From IGM Dust Calculation (evernote): Chandra 0.04 ct/s = $3 \times 10^{-13}$ cgs @ 1 keV
Estimate of Chandra count rate: $$ R_{Chandra} = F \ \frac{0.04\ {\rm ct/s}}{3 \times 10^{-13}\ {\rm cgs}} $$
The typical Chandra 0.5-2 keV background is 0.1 ct/s/chip = $4 \times 10^{-7}$ ct/s/arcsec$^2$
In [8]:
RASSBSC_flux = 5.e-13 # cgs
RChandra = 0.04 / 3.e-13 # ct/s per flux (cgs)
SXRB = 4.e-7 # ct/s/arcsec^2
src_rate = RASSBSC_flux * RChandra # Minimally bright quasars
bsrc_rate = src_rate * 10.0 # Maximally bright quasars, photon flux around 5.e-12 cgs
min_rate = 0.04 # ct/s from Table 1 of thesis, Ch 5
print "Chandra count rate for min RASS BSC flux: ~", src_rate, "ct/s"
In [9]:
def plot_halos_vs_bkg(ax, xlim=(0.1,1.e3), ylim=(3.e-11,1.e-3)):
# Plot IGM dust halos
# Brightest
ax.plot(alpha, grey_igm_halo * bsrc_rate, 'k-', lw=3, label='Grey IGM')
ax.plot(alpha, big_igm_halo * bsrc_rate, 'k-', lw=1, label=r'$1\ \mu m$ IGM')
# Moderately bright enough
ax.plot(alpha, grey_igm_halo * min_rate, color='0.6', ls='-', lw=3, label='')
ax.plot(alpha, big_igm_halo * min_rate, color='0.6', ls='-', lw=1, label='')
# Plot the typical background
ax.axhline(SXRB, color='k', ls=':', label='')
ax.text(40.0, 6.e-7, '0.5-2 keV background', color='0.3', size=12)
plt.loglog()
ax.set_xlim(xlim)
ax.set_ylim(ylim)
plt.legend(loc='upper right', frameon=False, fontsize=15)
plt.xlabel('Observation Angle [arcsec]', size=15)
plt.ylabel('Halo Brightness [ct s$^{-1}$ arcsec$^{-2}$]', size=15)
plt.text(1.0, 1.e-8, r'$F_{\rm src} =\ 3 \times\ 10^{-13}\ {\rm cgs}$', color='0.3', size=12)
plt.text(1.0, 1.5e-4, r'$F_{\rm src} =\ 5 \times\ 10^{-12}\ {\rm cgs}$', color='k', size=12)
return
In [10]:
ax = plt.subplot(111)
plot_halos_vs_bkg(ax)
The basic formula and some calculations
Corrales & Paerels (2012): $$ \Delta \chi_{\rm max} \approx 4.5\ {\rm kpc}\ \chi_{Gpc} E^{-2}_{keV} a_{0.1}^{-2} $$
And in general (Corrales & Paerels 2012): $$ \Delta \chi = \chi_{OS} \alpha^2 (1-x) $$
Keep in mind that the minimal x value is: $$ x_{min} \approx \frac{\alpha}{2 \sigma} $$ where $$ \sigma = \frac{10.4'}{a(0.1\ \mu{\rm m})\ E({\rm keV})} $$
Fade time for a total halo ($\alpha = \sigma$)
The furthest you can look back along a sight line is $x_{min} \approx \alpha/2\sigma$
The largest observable halo angle is $\sim \sigma$, so the total time it takes for a halo to fade is: $$ t_{fade} \approx \frac{\chi_{OS}}{c} \frac{\sigma^2}{2} $$
Fade time as a function of angle
Using the fact that $x_{min} \approx \alpha/2\sigma$, I can calculate the time delay for the longest ($\chi_{max}$) value at a particular sight line ($\alpha$).
$$ \Delta t_{max} = \frac{\chi_{OS}}{c} \alpha^2 (1 - \frac{\alpha}{2 \sigma}) $$
In [11]:
import cosmology as cosm
In [12]:
## Units
C = 3.e10 # cm/s
GPC = 1.e9 * 3.e18 # cm
ARCSEC = 5.e-6 # radians
ARCMIN = 3.e-4 # radians
YEAR = 3.e7 # seconds
## Other params
ZS = 2.0
COSMO = cosm.Cosmology(d=3.e-6)
In [13]:
def charsig(a, E):
""" returns the characteristic scattering angle, in arcseconds
a: [um] Grain size
E: [keV] Photon energy"""
charsig0 = 1.04 * 60 # arcsec per 1 um grain size per keV
return charsig0 / a / E
def tmax(alpha, a=0.1, E=1.0, zs=ZS):
""" Calculate the maximum time delay associated with
observation angle and typical grain population
alpha: [arcmin] Observation angle
a: [micron] Grain size
E: [keV] Photon energy
zs: Redshift of source"""
time_os = cosm.DChi(zs, 0.0) * (GPC/C) / YEAR
alpha_rad = alpha * ARCSEC
xterm = 1 - alpha/(2*charsig(a,E))
return time_os * alpha_rad**2 * xterm
In [21]:
def plot_time_delay(ax, xlim=(0.1,1.e3), ylim=(-3,5)):
tbig = tmax(alpha, a=1.0)
tsma = tmax(alpha, a=0.1)
ipos_big = np.where(tbig > 0.0)[0]
ipos_sma = np.where(tsma > 0.0)[0]
ax.plot(alpha[ipos_sma], np.log10(tsma[ipos_sma]), ls='-', color='k', lw=1, label=r'$0.1\ \mu m$ grains')
ax.plot(alpha[ipos_big], np.log10(tbig[ipos_big]), ls='--', color='k', lw=2, label=r'$1.0\ \mu m$ grains')
plt.semilogx()
ax.set_xlim(xlim)
ax.set_ylim(ylim)
plt.legend(loc='upper left', frameon=False, fontsize=12)
plt.xlabel("Observation angle [arcsec]", size=15)
plt.ylabel(r"$\log\ \delta t_{\rm max}$ [yrs]", size=15)
return
In [22]:
ax = plt.subplot(111)
plot_time_delay(ax)
In [16]:
import matplotlib.gridspec as gridspec
In [24]:
XLIM = (1.0,1.e3)
fig = plt.figure(figsize=(6,6))
gs = gridspec.GridSpec(2, 1, height_ratios=[2,1])
ax1 = plt.subplot(gs[0])
plot_halos_vs_bkg(ax1)
plt.xlabel('')
ax1.xaxis.set_ticklabels('')
ax2 = plt.subplot(gs[1])
plot_time_delay(ax2, ylim=(-2,5.5))
gs.update(hspace=0.0)
#plt.savefig('figure03.pdf', format='pdf')
In [17]: