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]:
<module 'strings.plotter' from 'strings/plotter.py'>

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);


Probability distribution functions (PDFs)

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);


Summary

  • 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.