Source code for rubin_sim.maf.metrics.night_pointing_metric

__all__ = ("NightPointingMetric",)

import numpy as np
from astropy import units as u
from astropy.coordinates import AltAz, EarthLocation, get_body, get_sun
from astropy.time import Time
from rubin_scheduler.utils import Site

from .base_metric import BaseMetric


[docs] class NightPointingMetric(BaseMetric): """ Gather relevant information for a night to plot. """ def __init__( self, alt_col="altitude", az_col="azimuth", filter_col="filter", mjd_col="observationStartMJD", metric_name="NightPointing", telescope="LSST", **kwargs, ): cols = [alt_col, az_col, filter_col, mjd_col] super(NightPointingMetric, self).__init__( col=cols, metric_name=metric_name, metric_dtype="object", **kwargs ) self.telescope = Site(name=telescope) self.alt_col = alt_col self.az_col = az_col self.filter_col = filter_col self.mjd_col = mjd_col self.location = EarthLocation( lat=self.telescope.latitude_rad * u.rad, lon=self.telescope.longitude_rad * u.rad, height=self.telescope.height * u.m, )
[docs] def run(self, data_slice, slice_point=None): pad = 30.0 / 60.0 / 24.0 mjd_min = data_slice[self.mjd_col].min() - pad mjd_max = data_slice[self.mjd_col].max() + pad # How often to plot the moon and things step = 20.0 / 60.0 / 24.0 mjds = Time(np.arange(mjd_min, mjd_max + step, step), format="mjd") aa = AltAz(location=self.location, obstime=mjds) moon_coords = get_body("moon", mjds).transform_to(aa) sun_coords = get_sun(mjds).transform_to(aa) moon_alts = np.array(moon_coords.alt.rad) moon_azs = np.array(moon_coords.az.rad) mjds = np.array(mjds) sun_alts = np.array(sun_coords.alt.rad) sun_azs = np.array(sun_coords.az.rad) return { "data_slice": data_slice, "moon_alts": moon_alts, "moon_azs": moon_azs, "mjds": mjds, "sun_alts": sun_alts, "sun_azs": sun_azs, }