Source code for rubin_sim.maf.slicers.healpix_sdss_slicer

__all__ = ("HealpixSDSSSlicer",)

from functools import wraps

import matplotlib.path as mplPath
import numpy as np
from rubin_scheduler.utils import _xyz_from_ra_dec, gnomonic_project_toxy

from rubin_sim.maf.plots import HealpixSDSSSkyMap

from .healpix_slicer import HealpixSlicer


[docs] class HealpixSDSSSlicer(HealpixSlicer): """For use with SDSS stripe 82 square images""" def __init__( self, nside=128, lon_col="RA1", lat_col="Dec1", verbose=True, use_cache=True, radius=17.0 / 60.0, leafsize=100, **kwargs, ): """Using one corner of the chip as the spatial key and the diagonal as the radius.""" super().__init__( verbose=verbose, lon_col=lon_col, lat_col=lat_col, radius=radius, leafsize=leafsize, use_cache=use_cache, nside=nside, ) self.cornerLables = ["RA1", "Dec1", "RA2", "Dec2", "RA3", "Dec3", "RA4", "Dec4"] self.plot_funcs = [ HealpixSDSSSkyMap, ]
[docs] def setup_slicer(self, sim_data, maps=None): """ Use sim_data[self.lon_col] and sim_data[self.lat_col] (in radians) to set up KDTree. """ self._run_maps(maps) self._build_tree(sim_data[self.lon_col], sim_data[self.lat_col], self.leafsize) self._set_rad(self.radius) self.corners = sim_data[self.cornerLables] @wraps(self._slice_sim_data) def _slice_sim_data(islice): """Return indexes for relevant opsim data at slice_point (slice_point=lon_col/lat_col value .. usually ra/dec).""" sx, sy, sz = _xyz_from_ra_dec(self.slice_points["ra"][islice], self.slice_points["dec"][islice]) # Query against tree. initIndices = self.opsimtree.query_ball_point((sx, sy, sz), self.rad) # Loop through all the images and check if the slice_point # is inside the corners of the chip indices = [] # Gnomic project all the corners that are near the slice point, # centered on slice point x1, y1 = gnomonic_project_toxy( self.corners["RA1"][initIndices], self.corners["Dec1"][initIndices], self.slice_points["ra"][islice], self.slice_points["dec"][islice], ) x2, y2 = gnomonic_project_toxy( self.corners["RA2"][initIndices], self.corners["Dec2"][initIndices], self.slice_points["ra"][islice], self.slice_points["dec"][islice], ) x3, y3 = gnomonic_project_toxy( self.corners["RA3"][initIndices], self.corners["Dec3"][initIndices], self.slice_points["ra"][islice], self.slice_points["dec"][islice], ) x4, y4 = gnomonic_project_toxy( self.corners["RA4"][initIndices], self.corners["Dec4"][initIndices], self.slice_points["ra"][islice], self.slice_points["dec"][islice], ) for i, ind in enumerate(initIndices): # Use matplotlib to make a polygon on bbPath = mplPath.Path( np.array( [ [x1[i], y1[i]], [x2[i], y2[i]], [x3[i], y3[i]], [x4[i], y4[i]], [x1[i], y1[i]], ] ) ) # Check if the slice_point is inside the image corners # and append to list if it is if bbPath.contains_point((0.0, 0.0)) == 1: indices.append(ind) return { "idxs": indices, "slice_point": { "sid": self.slice_points["sid"][islice], "ra": self.slice_points["ra"][islice], "dec": self.slice_points["dec"][islice], }, } setattr(self, "_slice_sim_data", _slice_sim_data)