Source code for hipscat.pixel_math.polygon_filter

from __future__ import annotations

from typing import List, Tuple

import healpy as hp
import numpy as np
from typing_extensions import TypeAlias

from hipscat.pixel_math import HealpixPixel
from hipscat.pixel_math.filter import get_filtered_pixel_list
from hipscat.pixel_tree.pixel_tree import PixelTree

# Pair of spherical sky coordinates (ra, dec)
[docs] SphericalCoordinates: TypeAlias = Tuple[float, float]
# Sky coordinates on the unit sphere, in cartesian representation (x,y,z)
[docs] CartesianCoordinates: TypeAlias = Tuple[float, float, float]
[docs] def filter_pixels_by_polygon( pixel_tree: PixelTree, vertices: List[CartesianCoordinates] ) -> List[HealpixPixel]: """Filter the leaf pixels in a pixel tree to return a list of healpix pixels that overlap with a polygonal region. Args: pixel_tree (PixelTree): The catalog tree to filter pixels from. vertices (List[CartesianCoordinates]): The vertices of the polygon to filter points with, in lists of (x,y,z) points on the unit sphere. Returns: List of HealpixPixel, representing only the pixels that overlap with the specified polygonal region, and the maximum pixel order. """ max_order = pixel_tree.get_max_depth() polygon_tree = _generate_polygon_pixel_tree(vertices, max_order) return get_filtered_pixel_list(pixel_tree, polygon_tree)
[docs] def _generate_polygon_pixel_tree(vertices: np.array, order: int) -> PixelTree: """Generates a pixel_tree filled with leaf nodes at a given order that overlap within a polygon. Vertices is an array of 3D coordinates, in cartesian representation (x,y,z) and shape (Num vertices, 3), representing the vertices of the polygon.""" polygon_pixels = hp.query_polygon(hp.order2nside(order), vertices, inclusive=True, nest=True) pixel_list = [HealpixPixel(order, polygon_pixel) for polygon_pixel in polygon_pixels] return PixelTree.from_healpix(pixel_list)