"""
Represents a Stokes vector (four components s0, s1, s2, s3). It accepts a stack (s0, etc. are arrays).
"""
import numpy
[docs]class StokesVector(object):
"""StokesVector Constructor.
Parameters
----------
element_list : list, optional
the Stokes parameters [S0,S1,S2,S3]
"""
def __init__(self, element_list=[0.0,0.0,0.0,0.0]):
self._s0 = numpy.array(element_list[0])
self._s1 = numpy.array(element_list[1])
self._s2 = numpy.array(element_list[2])
self._s3 = numpy.array(element_list[3])
[docs] def duplicate(self):
"""Duplicates a StokesVector.
Returns
-------
StokesVector instance
New StokesVector instance with identical x,y,z components.
"""
return StokesVector(element_list=self.getList())
[docs] def components(self):
"""Generates a numpy 1x4 array from the Stokes vector components.
Returns
-------
numpy array
The four stokes components.
"""
return numpy.array(self.getList())
@property
def s0(self):
"""
Gets s0 (first stokes parameter).
Returns
-------
float or numpy array
"""
return(self._s0)
@property
def s1(self):
"""
Gets s1 (second stokes parameter).
Returns
-------
float or numpy array
"""
return(self._s1)
@property
def s2(self):
"""
Gets s2 (first stokes parameter).
Returns
-------
float or numpy array
"""
return(self._s2)
@property
def s3(self):
"""
Gets s3 (first stokes parameter).
Returns
-------
float or numpy array
"""
return(self._s3)
[docs] def append(self, vector):
"""
Appends a stoked-vector to the stack.
Parameters
----------
vector : instance of StokesVector
"""
s00 = numpy.append(self.s0, vector.s0)
s11 = numpy.append(self.s1, vector.s1)
s22 = numpy.append(self.s2, vector.s2)
s33 = numpy.append(self.s3, vector.s3)
self.setFromArray([s00,s11,s22,s33])
[docs] def concatenate(self, vector):
"""
Concatenates a vector to the stack.
Parameters
----------
vector : instance of StokesVector
Returns
-------
instance of StokesVector
The resulting vector with the concatenation.
"""
s00 = numpy.append(self.s0, vector.s0)
s11 = numpy.append(self.s1, vector.s1)
s22 = numpy.append(self.s2, vector.s2)
s33 = numpy.append(self.s3, vector.s3)
return StokesVector([s00,s11,s22,s33])
[docs] def getS0(self):
"""Returns the S0 component.
Returns
-------
float
The S0 component.
"""
return self.s0
[docs] def getS1(self):
"""Returns the S1 component.
Returns
-------
float
The S1 component.
"""
return self.s1
[docs] def getS2(self):
"""Returns the S2 component.
Returns
-------
float
The S2 component.
"""
return self.s2
[docs] def getS3(self):
"""Returns the S3 component.
Returns
-------
float
The S3 component.
"""
return self.s3
[docs] def getList(self):
"""Generates a 1x4 list with the four Stokes components.
Returns
-------
list
list containing the Stokes parameters.
"""
result = list()
result.append(self._s0)
result.append(self._s1)
result.append(self._s2)
result.append(self._s3)
return result
[docs] def setFromArray(self, array):
"""Set stokes components from a given array
Parameters
----------
array : list or numpy array
"""
self._s0 = numpy.array(array[0])
self._s1 = numpy.array(array[1])
self._s2 = numpy.array(array[2])
self._s3 = numpy.array(array[3])
[docs] def setFromValues(self, s0, s1, s2, s3):
"""Set stokes components from given values
Parameters
----------
s0 : float
s1 : float
s2 : float
s3 : float
"""
self._s0 = numpy.array(s0)
self._s1 = numpy.array(s1)
self._s2 = numpy.array(s2)
self._s3 = numpy.array(s3)
[docs] def circularPolarizationDegree(self):
"""Calculates the degree of circular polarization of the radiation described by the Stokes parameter.
Parameters
----------
Returns
-------
float
Degree of circular polarization S3/S0
"""
try:
return self._s3 / self._s0
except:
return 0.0
[docs] def toString(self):
"""Returns a string with the four Stokes parameters (separated by a blank).
Returns
-------
str
the four Stokes parameters.
"""
""":return: a string object containing the four components of the Stokes vector."""
return "{S0} {S1} {S2} {S3}".format(S0=self._s0, S1=self._s1, S2=self._s2, S3=self._s3)
def __eq__(self, candidate):
if (self._s0 != candidate._s0).any():
return False
if (self._s1 != candidate._s1).any():
return False
if (self._s2 != candidate._s2).any():
return False
if (self._s3 != candidate._s3).any():
return False
return True
if __name__ == "__main__":
element_list = [0.78177969457877930,
0.22595711869558588,
0.28797567756487550,
0.58551861060989900]
stokes_vector = StokesVector(element_list)
assert(stokes_vector.s0 == 0.78177969457877930)
assert(stokes_vector.s1 == 0.22595711869558588)
assert(stokes_vector.s2 == 0.28797567756487550)
assert(stokes_vector.s3 == 0.58551861060989900)
array1 = stokes_vector.components()
array2 = stokes_vector.getList()
assert( isinstance(array1, numpy.ndarray))
assert( isinstance(array2, list))
numpy.testing.assert_array_equal(array1, numpy.asarray(element_list))
assert(array2 == element_list)
pol_deg = stokes_vector.circularPolarizationDegree()
assert( (isinstance(pol_deg, float) or (isinstance(pol_deg, numpy.ndarray))))
assert( pol_deg == 0.7489560226111716 )
stokes_vector1 = StokesVector([[1, 1], [2, 2], [3, 3], [4, 4]]) # without final zeros
stokes_vector2 = StokesVector([[1, 1], [2, 2], [3, 3], [4, 4]]) # without final zeros
print(stokes_vector2.s0)
assert(stokes_vector1 == stokes_vector1)
assert(not(stokes_vector1 != stokes_vector2))