from abc import abstractmethod

import numpy as np

from ...base import Property, Base

[docs]class BeamShape(Base):
"""Base class for beam shape"""
peak_power: float = Property(doc="peak power of the main lobe in Watts")

[docs]    @abstractmethod
def beam_power(self, azimuth, elevation, beam_width, **kwargs):
"""beam power sent in the direction of the target.
azimuth = elevation = 0 for center of beam"""
raise NotImplementedError

[docs]class Beam2DGaussian(BeamShape):
r"""The beam is in the shape of a 2D gaussian in the azimuth and elevation.
The width at half the maxima is the beam width. It is described by:

.. math::

P = P_p\exp \left( 0.5 \times \left(\left(\frac{2.35\,az}{B_w}\right)
^2 +\left(\frac{2.35\,el}{B_w}\right)^2 \right) \right)

where :math:az and :math:el are the azimuth and elevation angles away
from the centre. :math:B_w is the beam width and :math:P_p is the peak
power.
"""
# Full width half maximum
FWHM = 2 * np.sqrt(2 * np.log(2))

[docs]    def beam_power(self, azimuth, elevation, beam_width, **kwargs):
"""
Parameters
----------
azimuth : float
The angle of the target away from the boresight of the radar in
azimuth
elevation : float
The angle of the target away from the boresight of the radar in
elevation
beam_width: float
The width of the radar beam

Returns
-------
float
the power directed towards the target
"""
return self.peak_power * np.exp(
-0.5 * ((azimuth/beam_width*self.FWHM)**2 + (elevation/beam_width*self.FWHM)**2))