Source code for mhealpy.pixelfunc.moc

# Pixelization related function for multi-order coverage maps
# See http://ivoa.net/documents/MOC

import numpy as np
from numpy import array, log2, sqrt, exp

import mhealpy as hp

[docs]def uniq2nside(uniq): """ Extract the corresponding nside from a UNIQ numbered pixel Args: uniq (int or array): Pixel number Return: int or array """ order = (log2(array(uniq)/4)/2).astype(int) return hp.order2nside(order)
[docs]def uniq2nest(uniq): """ Convert from UNIQ ordering scheme to NESTED Args: uniq (int or array): Pixel number Return (int or array, int or array): nside, npix """ uniq = array(uniq) nside = uniq2nside(uniq) npix = uniq - 4 * nside * nside return nside, npix
[docs]def nest2uniq(nside, ipix): """ Convert from from NESTED to UNIQ scheme Args: nside (int): HEALPix NSIDE parameter ipix (int or array): Pixel number in NESTED scheme Return: int or array """ ipix = array(ipix) return 4 * nside * nside + ipix
[docs]def nest2range(nside_input, pix, nside_output): """ Get the equivalent range of pixel that correspond to all `child pixels` of a map of a greater order. Args: nside_input (int or array): Nside of input pixel pix (int or array): Input pixel. nside_output (int): Nside of map with `child pixels` Return: (int or array, int or array): Start pixel (inclusive) and stop pixel (exclusive) """ if np.any(nside_input > nside_output): raise ValueError("Input order must be greater or equal to output order") npix_ratio = nside_output * nside_output // nside_input // nside_input pix = array(pix) return (pix*npix_ratio, (pix+1)*npix_ratio)
[docs]def uniq2range(nside, uniq): """ Convert from a pixel number in NUNIQ scheme to the range of children pixels that it would correspond to in a NESTED map of a given order Args: order (int): Nside of equivalent single resolution map uniq (int or array): Pixel number in NUNIQ scheme Return: (int or array, int or array): Start pixel (inclusive) and stop pixel (exclusive) """ pix_nside, pix = uniq2nest(uniq) return nest2range(pix_nside, pix, nside)
[docs]def range2uniq(nside, pix_range): """ Convert from range of children pixels in a NESTED map of a given order to the corresponding uniq pixel number. Args: nside (int): Nside of equivalent single resolution map pix_range (int or array, int or array): Star pixel (inclusive) and stop pixel (exclusive) Return: int """ npix_ratio = array(pix_range[1]) - array(pix_range[0]) nside_uniq = nside / sqrt(npix_ratio) pix = array(pix_range[0]) / npix_ratio if (nside_uniq < 1 or any([not float(i).is_integer() for i in array([nside_uniq]).flatten()]) or any([not float(i).is_integer() for i in array([pix]).flatten()])): raise ValueError("pix_range is malformed for a HEALPix " "map of nside {}".format(nside)) return nest2uniq(array(nside_uniq).astype(int), array(pix).astype(int))