Source code for uranography.camera

"""Tool for computing an outline of a camera footprint."""

import astropy.units as u
import numpy as np
import pandas as pd
from astropy.coordinates import SkyCoord


[docs] class CameraFootprintPerimeter(object): """Compute outline of an exposure with a camera.""" def __init__(self, file_name): """Read the vertices of the polygon defining the camera footprint. Parameters ---------- file_name : `str` The name of the file with the camera footprint vertices Returns ------- footprint : `CameraFootprintPerimeter` The camera footprint instance """ self.vertices = pd.read_csv(file_name, delim_whitespace=True, header=0, index_col=False) if "angle" not in self.vertices.columns: self.vertices["angle"] = np.degrees(np.arctan2(self.vertices.y, self.vertices.x)) if "r" not in self.vertices.columns: self.vertices["r"] = np.hypot(self.vertices.y, self.vertices.x)
[docs] def single_eq_vertices(self, ra, decl, rotation=0): # pylint: disable=C0103 """Compute vertices for a single pair of equatorial coordinates Parameters ---------- ra : `float` The R.A. (in degrees) decl : `float` The declination (in degrees) rotation : `float` The camera rotation (in degrees) Returns ------- ra : `numpy.ndarray` An array of the R.A. of the vertices of the polygon surrounding the camera footprint (degrees). decl : `numpy.ndarray` An array of the declinations of the vertices of the polygon surrounding the camera footprint (degrees). """ center = SkyCoord(ra, decl, unit="deg") # rotation matches the sense used by # rubin_sim.utils.camera_footprint.LsstCameraFootprint eq_vertices = center.directional_offset_by( (self.vertices.angle.values + rotation) * u.deg, self.vertices.r.values * u.deg, ) ra = eq_vertices.ra.deg # pylint: disable=C0103 decl = eq_vertices.dec.deg return ra, decl
[docs] def __call__(self, ra, decl, rotation=0): # pylint: disable=C0103 """Compute vertices for a single pair of equatorial coordinates Parameters ---------- ra : `np.ndarray` The R.A. of pointings (in degrees) decl : `np.ndarray` The declination of pointings (in degrees) rotation : `float` or `np.ndarray` The camera rotation(s) (in degrees) Returns ------- ra : `numpy.ndarray` An array of the R.A. of the vertices of the polygon surrounding the camera footprints (degrees). decl : `numpy.ndarray` An array of the declinations of the vertices of the polygon surrounding the camera footprints (degrees). """ if np.isscalar(ra): return self.single_eq_vertices(ra, decl, rotation) if np.isscalar(rotation): rotation = np.full_like(ra, rotation) vertex_ras, vertex_decls = [], [] for this_ra, this_decl, this_rotation in zip(ra, decl, rotation): this_vertex_ra, this_vertex_decl = self.single_eq_vertices(this_ra, this_decl, this_rotation) vertex_ras.append(this_vertex_ra) vertex_decls.append(this_vertex_decl) return vertex_ras, vertex_decls