Source code for astromodels.core.polarization

__author__ = 'giacomov'

from astromodels.core.tree import Node
from astromodels.core.parameter import Parameter


[docs]class Polarization(Node): def __init__(self, polarization_type='linear'): assert polarization_type in ['linear', 'stokes'], 'polarization must be linear or stokes' self._polarization_type = polarization_type Node.__init__(self, 'polarization') @staticmethod def _get_parameter_from_input(number_or_parameter, minimum, maximum, what, desc, unit): # Try to transform it to float, if it works than we transform it to a parameter try: number_or_parameter = float(number_or_parameter) except TypeError: assert isinstance(number_or_parameter, Parameter), "%s must be either a number or a " \ "parameter instance" % what # So this is a Parameter instance already. Enforce that it has the right maximum and minimum parameter = number_or_parameter assert parameter.min_value == minimum, "%s must have a minimum of %s" % (what, minimum) assert parameter.max_value == maximum, "%s must have a maximum of %s" % (what, maximum) else: # This was a float. Enforce that it has a legal value assert minimum <= number_or_parameter <= maximum, "%s cannot have a value of %s, " \ "it must be %s <= %s <= %s" % (what, number_or_parameter, minimum, what, maximum) parameter = Parameter(what, number_or_parameter, desc=desc, min_value=minimum, max_value=maximum, unit=unit, free=True) return parameter
# TODO: add transform between polarizations
[docs]class LinearPolarization(Polarization): def __init__(self, degree, angle): """ Linear parameterization of polarization :param degree: The polarization degree :param angle: The polarization angle """ super(LinearPolarization, self).__init__(polarization_type='linear') degree = self._get_parameter_from_input(degree, 0, 100, 'degree', 'Polarization degree', 'dimensionless_unscaled') angle = self._get_parameter_from_input(angle, 0, 180, 'angle', 'Polarization angle', 'deg') self._add_child(degree) self._add_child(angle)
[docs]class StokesPolarization(Polarization): def __init__(self, I, Q, U, V): """ Stokes parameterization of polarization :param I: :param Q: :param U: :param V: """ super(StokesPolarization, self).__init__(polarization_type='stokes') # get the parameters set up I = self._get_parameter_from_input(I, 0, 1, 'I', 'Stokes I') Q = self._get_parameter_from_input(Q, 0, 1, 'Q', 'Stokes Q') U = self._get_parameter_from_input(U, 0, 1, 'U', 'Stokes U') V = self._get_parameter_from_input(V, 0, 1, 'V', 'Stokes V') # add the children self._add_child(I) self._add_child(Q) self._add_child(U) self._add_child(V)
# def to_linear_polarization(self): # # polarization angle # # psi = 0.5 * np.arctan2(U_bin, Q_bin) # # # polarization fraction # # frac = np.sqrt(Q_bin ** 2 + U_bin ** 2) / I_bin # # pass # # #angle = 0.5 * np.arctan2(se) # #