# -*- coding: utf-8 -*-
from functools import reduce
from operator import mul
import numpy as np
from africanus.util.docs import DocstringTemplate
from africanus.util.numba import jit
@jit(nopython=True, nogil=True, cache=True)
def _nb_feed_rotation(parallactic_angles, feed_type, feed_rotation):
shape = parallactic_angles.shape
parangles = parallactic_angles.flat
# Linear feeds
if feed_type == 0:
for i, pa in enumerate(parangles):
pa_cos = np.cos(pa)
pa_sin = np.sin(pa)
feed_rotation.real[i, 0, 0] = pa_cos
feed_rotation.imag[i, 0, 0] = 0.0
feed_rotation.real[i, 0, 1] = pa_sin
feed_rotation.imag[i, 0, 1] = 0.0
feed_rotation.real[i, 1, 0] = -pa_sin
feed_rotation.imag[i, 1, 0] = 0.0
feed_rotation.real[i, 1, 1] = pa_cos
feed_rotation.imag[i, 1, 1] = 0.0
# Circular feeds
elif feed_type == 1:
for i, pa in enumerate(parangles):
pa_cos = np.cos(pa)
pa_sin = np.sin(pa)
feed_rotation.real[i, 0, 0] = pa_cos
feed_rotation.imag[i, 0, 0] = -pa_sin
feed_rotation[i, 0, 1] = 0.0 + 0.0*1j
feed_rotation[i, 1, 0] = 0.0 + 0.0*1j
feed_rotation.real[i, 1, 1] = pa_cos
feed_rotation.imag[i, 1, 1] = pa_sin
else:
raise ValueError("Invalid feed_type")
return feed_rotation.reshape(shape + (2, 2))
[docs]def feed_rotation(parallactic_angles, feed_type='linear'):
if feed_type == 'linear':
poltype = 0
elif feed_type == 'circular':
poltype = 1
else:
raise ValueError("Invalid feed_type '%s'" % feed_type)
if parallactic_angles.dtype == np.float32:
dtype = np.complex64
elif parallactic_angles.dtype == np.float64:
dtype = np.complex128
else:
raise ValueError("parallactic_angles has "
"none-floating point type %s"
% parallactic_angles.dtype)
# Create result array with flattened parangles
shape = (reduce(mul, parallactic_angles.shape),) + (2, 2)
result = np.empty(shape, dtype=dtype)
return _nb_feed_rotation(parallactic_angles, poltype, result)
FEED_ROTATION_DOCS = DocstringTemplate(r"""
Computes the 2x2 feed rotation (L) matrix
from the ``parallactic_angles``.
.. math::
\textrm{linear}
\begin{bmatrix}
cos(pa) & sin(pa) \\
-sin(pa) & cos(pa)
\end{bmatrix}
\qquad
\textrm{circular}
\begin{bmatrix}
e^{-i pa} & 0 \\
0 & e^{i pa}
\end{bmatrix}
Parameters
----------
parallactic_angles : $(array_type)
floating point parallactic angles. Of shape
:code:`(pa0, pa1, ..., pan)`.
feed_type : {'linear', 'circular'}
The type of feed
Returns
-------
feed_matrix : $(array_type)
Feed rotation matrix of shape :code:`(pa0, pa1,...,pan,2,2)`
""")
try:
feed_rotation.__doc__ = FEED_ROTATION_DOCS.substitute(
array_type=":class:`numpy.ndarray`")
except AttributeError:
pass