Source code for rubin_scheduler.utils.site

__all__ = ("Site",)

import warnings

import astropy.units as u
import numpy as np
from astropy.coordinates import EarthLocation


class LsstSiteParameters:
    """
    This is a struct containing the LSST site parameters as defined in

    https://docushare.lsstcorp.org/docushare/dsweb/ImageStoreViewer/LSE-30

    (accessed on 4 January 2016)

    This class only exists for initializing Site with LSST parametervalues.
    Users should not be accessing this class directly.
    """

    def __init__(self):
        self.longitude = -70.7494  # in degrees
        self.latitude = -30.2444  # in degrees
        self.height = 2650.0  # in meters
        self.temperature = 11.5  # in centigrade
        self.pressure = 750.0  # in millibars
        self.humidity = 0.4  # scale 0-1
        self.lapse_rate = 0.0065  # in Kelvin per meter
        # the lapse rate was not specified by LSE-30;
        # 0.0065 K/m appears to be the "standard" value
        # see, for example
        # http://mnras.oxfordjournals.org/content/365/4/1235.full


[docs] class Site: """ This class will store site information for use in Catalog objects. Defaults values are LSST site values taken from the Observatory System Specification document https://docushare.lsstcorp.org/docushare/dsweb/ImageStoreViewer/LSE-30 on 4 January 2016 Parameters ---------- name : `str`, opt The name of the observatory. Set to 'LSST' for other parameters to default to LSST values. longitude : `float`, opt Longitude of the site in degrees. latitude : `float`, opt Latitude of the site in degrees. height : `float`, opt Height of the site in meters. temperature : `float`, opt Mean temperature in Centigrade pressure : `float`, opt Pressure for the site in millibars. humidity : `float`, opt Relative humidity (range 0-1). lapse_rate : `float`, opt Change in temperature in Kelvins per meter """ def __init__( self, name=None, longitude=None, latitude=None, height=None, temperature=None, pressure=None, humidity=None, lapse_rate=None, ): default_params = None self._name = name if self._name == "LSST": default_params = LsstSiteParameters() if default_params is not None: if longitude is None: longitude = default_params.longitude if latitude is None: latitude = default_params.latitude if height is None: height = default_params.height if temperature is None: temperature = default_params.temperature if pressure is None: pressure = default_params.pressure if humidity is None: humidity = default_params.humidity if lapse_rate is None: lapse_rate = default_params.lapse_rate if longitude is not None: self._longitude_rad = np.radians(longitude) else: self._longitude_rad = None if latitude is not None: self._latitude_rad = np.radians(latitude) else: self._latitude_rad = None self._longitude_deg = longitude self._latitude_deg = latitude self._height = height self._pressure = pressure if temperature is not None: self._temperature_kelvin = temperature + 273.15 # in Kelvin else: self._temperature_kelvin = None self._temperature_centigrade = temperature self._humidity = humidity self._lapse_rate = lapse_rate # Go through all the attributes of this Site. # Raise a warning if any are None so that the user # is not surprised when some use of this Site fails # because something that should have beena a float # is NoneType list_of_nones = [] if self.longitude is None or self.longitude_rad is None: if self.longitude_rad is not None: raise RuntimeError("in Site: longitude is None but longitude_rad is not") if self.longitude is not None: raise RuntimeError("in Site: longitude_rad is None but longitude is not") list_of_nones.append("longitude") if self.latitude is None or self.latitude_rad is None: if self.latitude_rad is not None: raise RuntimeError("in Site: latitude is None but latitude_rad is not") if self.latitude is not None: raise RuntimeError("in Site: latitude_rad is None but latitude is not") list_of_nones.append("latitude") if self.temperature is None or self.temperature_kelvin is None: if self.temperature is not None: raise RuntimeError("in Site: temperature_kelvin is None but temperature is not") if self.temperature_kelvin is not None: raise RuntimeError("in Site: temperature is None but temperature_kelvin is not") list_of_nones.append("temperature") if self.height is None: list_of_nones.append("height") if self.pressure is None: list_of_nones.append("pressure") if self.humidity is None: list_of_nones.append("humidity") if self.lapse_rate is None: list_of_nones.append("lapse_rate") if len(list_of_nones) != 0: msg = "The following attributes of your Site were None:\n" for name in list_of_nones: msg += "%s\n" % name msg += "If you want these to just default to LSST values,\n" msg += "instantiate your Site with name='LSST'" warnings.warn(msg) def to_earth_location(self): return EarthLocation.from_geodetic( lon=self.longitude * u.deg, lat=self.latitude * u.deg, height=self.height * u.meter ) def __eq__(self, other): for param in self.__dict__: if param not in other.__dict__: return False if self.__dict__[param] != other.__dict__[param]: return False for param in other.__dict__: if param not in self.__dict__: return False return True def __ne__(self, other): return not self.__eq__(other) @property def name(self): """ observatory name """ return self._name @property def longitude_rad(self): """ observatory longitude in radians """ return self._longitude_rad @property def longitude(self): """ observatory longitude in degrees """ return self._longitude_deg @property def latitude_rad(self): """ observatory latitude in radians """ return self._latitude_rad @property def latitude(self): """ observatory latitude in degrees """ return self._latitude_deg @property def temperature(self): """ mean temperature in centigrade """ return self._temperature_centigrade @property def temperature_kelvin(self): """ mean temperature in Kelvin """ return self._temperature_kelvin @property def height(self): """ height in meters """ return self._height @property def pressure(self): """ mean pressure in millibars """ return self._pressure @property def humidity(self): """ mean humidity in the range 0-1 """ return self._humidity @property def lapse_rate(self): """ temperature lapse rate (in Kelvin per meter) """ return self._lapse_rate