Source code for coordio.site
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# @Author: José Sánchez-Gallego (gallegoj@uw.edu)
# @Date: 2020-08-17
# @Filename: site.py
# @License: BSD 3-clause (http://www.opensource.org/licenses/BSD-3-Clause)
import copy
import numpy
from . import config
from .exceptions import CoordIOError
from .time import Time
g = 9.80665 # m / s^2
R0 = 8.314462618 # J / (mol K)
T0 = 288.16 # K
M = 0.02896968 # kg / mol
p0 = 1013.25 # millibar (hPa)
[docs]
class Site:
r"""A representation of an observing site.
Parameters
----------
name : str
The name of the site. If the name matches that of a site in the
configuration file those values will be used, overridden by the
input keywords.
latitude : float
The site latitude in degrees.
longitude : float
The East-positive longitude of the site, in degrees.
altitude : float
The altitude (elevation) of the site above see level, in meters.
Defaults to zero meters.
pressure : float
The atmospheric pressure at the site, in millibar (same as hPa). If
not provided the pressure will be calculated using the altitude
:math:`h` and the approximate expression
.. math::
p \sim -p_0 \exp\left( \dfrac{g h M} {T_0 R_0} \right)
where :math:`p_0` is the pressure at sea level, :math:`M` is the molar
mass of the air, :math:`R_0` is the universal gas constant, and
:math:`T_0=288.16\,{\rm K}` is the standard sea-level temperature.
temperature : float
The site temperature, in degrees Celsius. Defaults to
:math:`10^\circ{\rm C}`.
rh : float
The relative humidity, in the range :math:`0-1`. Defaults to 0.5.
system_time_scale : str
The time scale of the system time. Defaults to UTC.
Attributes
----------
time : .Time
A `.Time` instance describing the time for the observation. Use
`.set_time` to set the time.
"""
def __init__(self, name, latitude=None, longitude=None,
altitude=None, pressure=None, temperature=None,
rh=None, system_time_scale=None):
kwargs = dict(latitude=latitude,
longitude=longitude,
altitude=altitude,
pressure=pressure,
temperature=temperature,
rh=rh,
system_time_scale=system_time_scale)
if name in config['site']:
config_kwargs = config['site'][name].copy()
for kw in kwargs:
if kwargs[kw] is None and kw in config_kwargs:
kwargs[kw] = config_kwargs[kw]
self.name = name
for key, value in kwargs.items():
setattr(self, key, value)
if not self.longitude or not self.latitude:
raise CoordIOError('Longitude and latitude need to be defined.')
# Set defaults
self.altitude = self.altitude or 0.
self.temperature = self.temperature or 10.
self.rh = self.rh or 0.5
self.system_time_scale = self.system_time_scale or 'UTC'
if self.pressure is None:
self.pressure = p0 * numpy.exp(-(self.altitude * g * M) / (T0 * R0))
self.time = None
def __repr__(self):
return (f'<Site {self.name!r} '
f'(longitude={self.longitude}, latitude={self.latitude})>')
[docs]
def set_time(self, value=None, scale='TAI'):
"""Sets the time of the observation.
Parameters
----------
value : float, .Time, or None
A `.Time` instance or the Julian date of the time to use.
If `None`, the current system datetime will be used.
scale : str
The time scale of the Julian date. Ignored if ``value`` is a
`.Time` instance.
"""
if isinstance(value, Time):
self.time = value
else:
self.time = Time(value, format='jd', scale=scale)
[docs]
def copy(self):
"""Returns a copy of the object."""
return copy.copy(self)