Source code for observation_utils

import math
import numpy as np
import healpy as hp

__all__ = ['get_pointings', 'upgrade_healpix', 'get_healpix_centers']
__all__ += ['get_target_nside']


[docs]def get_pointings(n_pointings, healpix_in, nside_in, seed): rng = np.random.default_rng(seed=seed) target_nside = get_target_nside(n_pointings, nside_in=nside_in) sightline_ids = upgrade_healpix(healpix_in, False, nside_in, target_nside) ra_grid, dec_grid = get_healpix_centers(sightline_ids, target_nside, nest=True) # Randomly choose number of sightlines requested rand_i = rng.choice(np.arange(len(ra_grid)), size=n_pointings, replace=False) ra_grid, dec_grid = ra_grid[rand_i], dec_grid[rand_i] return ra_grid, dec_grid
[docs]def upgrade_healpix(pix_id, nested, nside_in, nside_out): """Upgrade (superresolve) a healpix into finer ones Parameters ---------- pix_id : int coarse healpix ID to upgrade nested : bool whether `pix_id` is given in NESTED scheme nside_in : int NSIDE of `pix_id` nside_out : int desired NSIDE of finer healpix Returns ------- np.array the upgraded healpix IDs in the NESTED scheme """ if not nested: pix_id = hp.ring2nest(nside_in, pix_id) order_diff = np.log2(nside_out) - np.log2(nside_in) factor = 4**order_diff upgraded_ids = pix_id*factor + np.arange(factor) return upgraded_ids.astype(int)
[docs]def get_healpix_centers(pix_id, nside, nest): """Get the ra, dec corresponding to centers of the healpixels with given IDs Parameters ---------- pix_id : int or array-like IDs of healpixels to evaluate centers. Must be in NESTED scheme nside_in : int NSIDE of `pix_id` """ theta, phi = hp.pix2ang(nside, pix_id, nest=nest) ra, dec = np.degrees(phi), -np.degrees(theta-0.5*np.pi) return ra, dec
def get_target_nside(n_pix, nside_in=2**5): """Get the NSIDE corresponding to the number of sub-healpixels Parameters ---------- n_pix : int desired number of pixels nside_in : int input NSIDE to subsample """ order_in = int(np.log2(nside_in)) order_diff = math.ceil(np.log(n_pix)/np.log(4.0)) # round up log4(n_pix) order_out = order_diff + order_in nside_out = int(2**order_out) return nside_out def get_distance(ra_i, dec_i, ra_f, dec_f): """Compute the distance between two angular positions given in degrees """ ra_diff = (ra_f - ra_i)*np.cos(np.deg2rad(dec_f)) dec_diff = (dec_f - dec_i) return np.linalg.norm(np.vstack([ra_diff, dec_diff]), axis=0), ra_diff, dec_diff