Generate synchrotron spectral index map

[ ]:
import numpy as np
import healpy as hp
from pathlib import Path
[ ]:
datadir=Path("data/")
output_dir = Path("production-data/synch")
output_dir_raw = output_dir / "raw"
[ ]:
output_nside = 2048
[ ]:
output_lmax = int(min(2.5 * output_nside, 8192 * 2))

Large scales

[ ]:
alm_large_scale = hp.read_alm(
    output_dir_raw / f"synch_largescale_beta_alm_nside512_lmax768.fits.gz",
    hdu=1,
)
[ ]:
map_large_scale = hp.alm2map(alm_large_scale.astype(np.complex128), nside=output_nside)

Small scales modulation

[ ]:
modulate_alm = hp.read_alm(
    output_dir_raw / f"synch_amplitude_modulation_alms_lmax768.fits.gz"
).astype(np.complex128)

Small scales

[ ]:
cl_small_scale = hp.read_cl(
    output_dir_raw / f"synch_small_scales_beta_cl_lmax16384.fits.gz"
)
[ ]:
synalm_lmax = 8192 * 2  # for reproducibility
# synalm_lmax = output_lmax
seed = 444
np.random.seed(seed)

alm_small_scale = hp.synalm(
    cl_small_scale,
    lmax=synalm_lmax,
    new=True,
)

alm_small_scale = hp.almxfl(alm_small_scale, np.ones(output_lmax+1))
map_small_scale = hp.alm2map(alm_small_scale, nside=output_nside)
map_small_scale *= hp.alm2map(modulate_alm, output_nside)
assert np.isnan(map_small_scale).sum() == 0

Combine scales

  • Combine small and large scale maps

  • Write output map

[ ]:
output_map = map_large_scale + map_small_scale - 3.1
[ ]:
hp.write_map(output_dir / f"synch_beta_nside{output_nside}.fits", output_map, dtype=np.float32, overwrite=True)
[ ]:
from pysm3.utils import add_metadata
[ ]:
add_metadata([output_dir / f"synch_beta_nside{output_nside}.fits"], coord="G", unit="", ref_freq="23 GHz", ell_max=str(output_lmax))
[ ]:
hp.mollview(map_large_scale, title="Large scale")
hp.mollview(map_small_scale, title="Small scale")
hp.mollview(output_map, title="Total")