This notebook explores different map-based statistics to look for a cosmic-string network in the CMB data. It uses 7.2 x 7.2 deg simulated CMB + strings maps (including ACT beams FWHM=1.4' and Gaussian noise with pixel std = 16$\mu$K, no foregrounds, no point sources); string-network signal is computed from Nambu-Goto simulations in Fraisse et al.
Note: AdvACTPol is ~100 times this simulated sky coverage. Tension upper limit (currently, Planck 2013): $G_\mu = 10^{-6}$.
In [50]:
%matplotlib inline
import matplotlib.pyplot as plt
import strings.mapset as m
import strings.plotter as sp
import strings.statistic as stat
noiseACT = 16
reload(m)
reload(sp)
Out[50]:
In [32]:
N = 1
recalc = False
cmb = m.MapSet_Group(N=N, recalc=recalc,noise=0)
stringy = m.MapSet_Group(N=N, recalc=recalc, strings=True,
Gmu=1.4e-7, noise=0)
stringy_strong = m.MapSet_Group(N=N, recalc=recalc,
strings=True, Gmu=1e-6,
noise=0)
N = 100
cmb_noisy = m.MapSet_Group(N=N, recalc=recalc,noise=noiseACT)
stringy_noisy = m.MapSet_Group(N=N, strings=True, Gmu=1.4e-7,
noise=noiseACT)
stringy_noisy_strong = m.MapSet_Group(N=N, strings=True, Gmu=1e-6,
noise=noiseACT, string_file_num=1)
This is what we're working with; shown below are noise-free maps, obtained as GradGrad(map), where map = CMB + a strong signal (RHS), or + a signal at a current limit (LHS):
In [8]:
plt.figure(figsize=(14,7))
ax = plt.subplot(121)
stringy.gradgrad.plot_map(0, ax=ax, title='Limit: Gmu={:.1e}'.format(stringy.gradgrad.kwargs['Gmu']))
ax = plt.subplot(122)
stringy_strong.gradgrad.plot_map(0, ax=ax, title='Strong: Gmu={:.1e}'.format(stringy_strong.gradgrad.kwargs['Gmu']))
plt.suptitle('GradGrad(CMB + strings)', fontsize=20);
Now we explore a convolution of GradGrad maps with a stick kernel. First, we convolve GradGrad(map) with a stick-shaped kernel of a given position angle, and repeat over a range of angles to create a map "stack". Then we create a single map by choosing the max value at every pixel in the stack.
For stick-kernel of length=20', width=2', Gmu at the current upper limit, noise=0, here's what a single stick-convolved map looks like:
In [16]:
from strings.convolve import rotated_stick_convolve
mapstack = rotated_stick_convolve(stringy.gradgrad.edged(0))
plt.figure(figsize=(7,7))
plt.imshow(mapstack[5,30:-30,30:-30]);
And here is what this new convolved/maxed map looks like, for no noise, first for CMB+strings (strong signal), and then for CMB only:
In [26]:
plt.figure(figsize=(14,7))
ax = plt.subplot(121)
stringy_strong.gradgrad.plot_map(0, ax=ax, title='GradGrad')
ax = plt.subplot(122)
stringy_strong.gradgrad_rotstick.plot_map(0, ax=ax, title='Stick Convolved')
plt.suptitle('Gmu = 1e-6 (no noise)', fontsize=20);
plt.figure(figsize=(14,7))
ax = plt.subplot(121)
cmb.gradgrad.plot_map(0, ax=ax, title='GradGrad')
ax = plt.subplot(122)
cmb.gradgrad_rotstick.plot_map(0, ax=ax, title='Stick Convolved')
plt.suptitle('CMB only (no noise)', fontsize=20);
We first compare the PDFs (and residual PDFs) of map pixel-values, GradGrad(map) pixel values, and stick-convolved-maxed GradGrad(map) pixel values. We show comparison of these three PDFs for a strong string signal below. The gray band is $68\%$ CL computed from 100 CMB-only (incl. beams and noise) simulations. The red line is based on a single string-network simulation; it is the mean of the red band; the red band is $68\%$ CL computed from 100 different CMB+noise realizations added to the same string simulation. The residuals are wrt to the mean of the CMB-only sims.
In [47]:
plt.figure(figsize=(12,6))
ax = plt.subplot(321)
sp.plot_pdf(cmb_noisy, stringy_noisy_strong, which='map',
pdf_only=True, ax=ax, title='map')
ax = plt.subplot(322)
sp.plot_pdf(cmb_noisy, stringy_noisy_strong, which='map',
resid_only=True, ax=ax, title='map: residuals');
ax = plt.subplot(323)
sp.plot_pdf(cmb_noisy, stringy_noisy_strong, which='gradgrad',
pdf_only=True, ax=ax, title='GradGrad')
ax = plt.subplot(324)
sp.plot_pdf(cmb_noisy, stringy_noisy_strong, which='gradgrad',
resid_only=True, ax=ax, title='GradGrad: residuals');
ax = plt.subplot(325)
sp.plot_pdf(cmb_noisy, stringy_noisy_strong, which='gradgrad_rotstick',
pdf_only=True, ax=ax, title='Convolved GradGrad')
ax = plt.subplot(326)
sp.plot_pdf(cmb_noisy, stringy_noisy_strong, which='gradgrad_rotstick',
resid_only=True, ax=ax, title='Convolved GradGrad: residuals');
plt.subplots_adjust(hspace=0.5)
plt.suptitle('PDF Comparison (Strong signal, Gmu=1e-6)', fontsize=20);
Now we repeat the same plot for the signal at the current upper limit:
In [48]:
plt.figure(figsize=(12,6))
ax = plt.subplot(321)
sp.plot_pdf(cmb_noisy, stringy_noisy, which='map',
pdf_only=True, ax=ax, title='map')
ax = plt.subplot(322)
sp.plot_pdf(cmb_noisy, stringy_noisy, which='map',
resid_only=True, ax=ax, title='map: residuals');
ax = plt.subplot(323)
sp.plot_pdf(cmb_noisy, stringy_noisy, which='gradgrad',
pdf_only=True, ax=ax, title='GradGrad')
ax = plt.subplot(324)
sp.plot_pdf(cmb_noisy, stringy_noisy, which='gradgrad',
resid_only=True, ax=ax, title='GradGrad: residuals');
ax = plt.subplot(325)
sp.plot_pdf(cmb_noisy, stringy_noisy, which='gradgrad_rotstick',
pdf_only=True, ax=ax, title='Convolved GradGrad')
ax = plt.subplot(326)
sp.plot_pdf(cmb_noisy, stringy_noisy, which='gradgrad_rotstick',
resid_only=True, ax=ax, title='Convolved GradGrad: residuals');
plt.subplots_adjust(hspace=0.5)
plt.suptitle('PDF Comparison (Limit signal, Gmu=1.4e-7)', fontsize=20);
However, since AdvACTPol will have ~100 times more pixels to build this statistic, and due to the limitation from the string-network simulation, we can only "project" the sensitivity of AdvACTPol to the same string simulation, rather than directly calculate it from currently available string-network sims:
In [76]:
plt.figure(figsize=(15,5))
beatdown = 10
import warnings
warnings.filterwarnings("ignore")
ax = plt.subplot(131)
sp.plot_pdf(cmb_noisy, stringy_noisy, which='map',
resid_only=True, ax=ax, title='map\nresiduals',
beatdown=beatdown);
ax = plt.subplot(132)
sp.plot_pdf(cmb_noisy, stringy_noisy, which='gradgrad',
resid_only=True, ax=ax, title='GradGrad\nresiduals',
beatdown=beatdown);
ax = plt.subplot(133)
sp.plot_pdf(cmb_noisy, stringy_noisy, which='gradgrad_rotstick',
resid_only=True, ax=ax, title='Convolved GradGrad\nresiduals',
beatdown=beatdown);
plt.subplots_adjust(top=0.75);
plt.suptitle('PROJECTION (Limit signal, Gmu=1.4e-7)', fontsize=20);
Rotated-stick-maxed convolution PDF looks most promising, and might have the advantage of being able to avoid striping + point sources.
For realistic projections, and to quantify the PDF signal from strings for future data fits, we need larger (~5000 sq deg) string-network simulations.
Next steps:
test the power-spectrum of kernel position-angle that maximized the pixel values;
model PDFs as chi-squared distribution;
look into quantifying string signal in PDFs from more sims;
simulate point sources and striping.