Source code for hipscat.pixel_math.healpix_pixel_function
from typing import List
import numpy as np
from hipscat.pixel_math.healpix_pixel import HealpixPixel
[docs]
def get_pixel_argsort(pixels: List[HealpixPixel]):
"""Perform an indirect sort of a list of HealpixPixels.
This will order the pixels according to a breadth-first traversal of the healpix
pixel hierarchy, not merely by increasing order by Norder/Npix (depth-first ordering).
This is similar to ordering fully by _hipscat_index.
Args:
pixels (List[HealpixPixel]): array to sort
Returns:
array of indices that sort the pixels in breadth-first order.
"""
if pixels is None or len(pixels) == 0:
return []
# Construct a parallel list of exploded, high order pixels.
highest_order = np.max(pixels).order
constant_breadth_pixel = [pixel.pixel * (4 ** (highest_order - pixel.order)) for pixel in pixels]
# Get the argsort of the higher order array.
return np.argsort(constant_breadth_pixel, kind="stable")
[docs]
def get_pixels_from_intervals(intervals: np.ndarray, tree_order: int) -> np.ndarray:
"""Computes an array of HEALPix [order, pixel] for an array of intervals
Args:
intervals (np.ndarray): Array of intervals of the start and end pixel numbers of HEALPix pixels.
Must be NESTED numbering scheme.
tree_order (int): The order of the pixel numbers in the interval array
Returns (np.ndarray):
An array of [order, pixel] in NESTED numbering scheme for each interval in the array.
"""
if intervals.shape[0] == 0:
return np.empty((0, 2), dtype=np.int64)
orders = np.full(intervals.shape[0], fill_value=-1)
pixels = np.full(intervals.shape[0], fill_value=-1)
# alignment uses (-1, -1) as a missing pixel, so we can't use the HEALPix math on these elements
non_negative_mask = intervals.T[0] >= 0
start_intervals = intervals.T[0][non_negative_mask]
end_intervals = intervals.T[1][non_negative_mask]
orders[non_negative_mask] = tree_order - (np.int64(np.log2(end_intervals - start_intervals)) >> 1)
pixels[non_negative_mask] = start_intervals >> 2 * (tree_order - orders[non_negative_mask])
return np.array([orders, pixels]).T