Source code for hats.pixel_tree.moc_filter
import numpy as np
from mocpy import MOC
from numba import njit
from hats.pixel_tree.pixel_tree import PixelTree
[docs]
def filter_by_moc(tree: PixelTree, moc: MOC) -> PixelTree:
"""Filters a pixel tree to only include the pixels that overlap with the pixels in the moc
Parameters
----------
tree: PixelTree
The tree to perform the filtering on
moc: MOC
The moc to use to filter
Returns
-------
PixelTree
A new PixelTree object with only the pixels from the input tree that overlap with the moc.
"""
if len(tree) == 0:
return tree
moc_ranges = moc.to_depth29_ranges
# Convert tree intervals to order 29 to match moc intervals
tree_29_ranges = tree.tree << (2 * (29 - tree.tree_order))
tree_mask = perform_filter_by_moc(tree_29_ranges, moc_ranges)
return PixelTree(tree.tree[tree_mask], tree.tree_order)
@njit
[docs]
def perform_filter_by_moc(tree: np.ndarray, moc: np.ndarray) -> np.ndarray: # pragma: no cover
"""Performs filtering with lists of pixel intervals
Input interval lists must be at the same order.
Parameters
----------
tree: np.ndarray
Array of pixel intervals to be filtered
moc: np.ndarray
Array of pixel intervals to be used to filter
Returns
-------
ndarray
A boolean array of dimension tree.shape[0] which masks which pixels in tree
overlap with the pixels in moc
"""
output = np.full(tree.shape[0], fill_value=False, dtype=np.bool_)
tree_index = 0
moc_index = 0
while tree_index < len(tree) and moc_index < len(moc):
tree_pix = tree[tree_index]
moc_pix = moc[moc_index]
if tree_pix[0] >= moc_pix[1]:
# Don't overlap, tree pixel ahead so move onto next MOC pixel
moc_index += 1
continue
if moc_pix[0] >= tree_pix[1]:
# Don't overlap, MOC pixel ahead so move onto next tree pixel
tree_index += 1
continue
# Pixels overlap, so include current tree pixel and check next tree pixel
output[tree_index] = True
tree_index += 1
return output