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

Large scales

[ ]:
alm_log_pol_tens_large_scale = hp.read_alm(
    datadir
    / "gnilc_dust_largescale_template_logpoltens_alm_nside2048_lmax1024_complex64.fits.gz",
    hdu=(1, 2, 3),
)
[ ]:
map_log_pol_tens_large_scale = hp.alm2map(
    alm_log_pol_tens_large_scale.astype(np.complex128), nside=output_nside
)
[ ]:
map_log_pol_tens_large_scale

Small scales modulation

[ ]:
modulate_alm = {
    k: hp.read_alm(datadir / f"gnilc_dust_{k}_modulation_alms_lmax768.fits.gz").astype(
        np.complex128
    )
    for k in ["temperature", "polarization"]
}

Small scales

[ ]:
cl_small_scale = hp.read_cl(
    datadir / "gnilc_dust_small_scales_logpoltens_cl_lmax16384.fits.gz"
)
[ ]:
synalm_lmax = 8192 * 2  # it needs to be the same for all output nside
# synalm_lmax = 1024
np.random.seed(8192)

alm_log_pol_tens_small_scale = hp.synalm(
    list(cl_small_scale),
    lmax=synalm_lmax,
    new=True,
)
[ ]:
alm_log_pol_tens_small_scale = [
    hp.almxfl(each, np.ones(output_lmax))
    for each in alm_log_pol_tens_small_scale
]
map_log_pol_tens_small_scale = hp.alm2map(
    alm_log_pol_tens_small_scale, nside=output_nside
)
[ ]:
map_log_pol_tens_small_scale
[ ]:
map_log_pol_tens_small_scale[0] *= hp.alm2map(
    modulate_alm["temperature"], output_nside
)
map_log_pol_tens_small_scale[1:] *= hp.alm2map(
    modulate_alm["polarization"], output_nside
)
assert np.isnan(map_log_pol_tens_small_scale).sum() == 0
[ ]:
map_log_pol_tens_small_scale

Combine scales

  • Combine small and large scale maps

  • Transform from logpoltens to IQU

  • Write output map

[ ]:
map_log_pol_tens = map_log_pol_tens_large_scale
map_log_pol_tens += map_log_pol_tens_small_scale
[ ]:
del map_log_pol_tens_small_scale
[ ]:
from pysm3.utils import log_pol_tens_to_map
[ ]:
output_map = log_pol_tens_to_map(map_log_pol_tens)
[ ]:
output_map
[ ]:
del map_log_pol_tens

Galactic plane fix

[ ]:
galplane_fix = hp.read_map(datadir / "gnilc_dust_galplane.fits.gz", (0, 1, 2, 3))
[ ]:
output_map *= hp.ud_grade(galplane_fix[3], output_nside)
output_map += hp.ud_grade(galplane_fix[:3] * (1 - galplane_fix[3]), output_nside)
[ ]:
output_map

Color correction

Planck 353 GHz color correction https://github.com/galsci/pysm/issues/99

[ ]:
output_map *= 0.911
[ ]:
output_map
[ ]:
hp.write_map(
    output_dir / f"gnilc_dust_template_nside{output_nside}.fits",
    output_map,
    dtype=np.float32,
    overwrite=True,
    column_units = "uK_RJ",
    extra_header = [("lmax", output_lmax), ("ref_freq", "353 GHz")]
)