# -*- coding: utf-8 -*-
import warnings
from .parangles_astropy import have_astropy_parangles, astropy_parallactic_angles
from .parangles_casa import have_casa_parangles, casa_parallactic_angles
_discovered_backends = []
if have_astropy_parangles:
_discovered_backends.append("astropy")
if have_casa_parangles:
_discovered_backends.append("casa")
_standard_backends = set(["casa", "astropy", "test"])
[docs]
def parallactic_angles(times, antenna_positions, field_centre, backend="casa"):
"""
Computes parallactic angles per timestep for the given
reference antenna position and field centre.
Parameters
----------
times : :class:`numpy.ndarray`
Array of Mean Julian Date times in
*seconds* with shape :code:`(time,)`,
antenna_positions : :class:`numpy.ndarray`
Antenna positions of shape :code:`(ant, 3)`
in *metres* in the *ITRF* frame.
field_centre : :class:`numpy.ndarray`
Field centre of shape :code:`(2,)` in *radians*
backend : {'casa', 'test'}, optional
Backend to use for calculating the parallactic angles.
* ``casa`` defers to an implementation
depending on ``python-casacore``.
This backend should be used by default.
* ``test`` creates parallactic angles
by multiplying the ``times`` and ``antenna_position``
arrays. It exist solely for testing.
Returns
-------
parallactic_angles : :class:`numpy.ndarray`
Parallactic angles of shape :code:`(time,ant)`
"""
if backend not in _standard_backends:
raise ValueError(
"'%s' is not one of the "
"standard backends '%s'" % (backend, _standard_backends)
)
if not field_centre.shape == (2,):
raise ValueError("Invalid field_centre shape %s" % (field_centre.shape,))
if backend == "astropy":
warnings.warn("astropy backend currently returns the incorrect values")
return astropy_parallactic_angles(times, antenna_positions, field_centre)
elif backend == "casa":
return casa_parallactic_angles(times, antenna_positions, field_centre)
elif backend == "test":
return times[:, None] * (antenna_positions.sum(axis=1)[None, :])
else:
raise ValueError("Invalid backend %s" % backend)