Using the StokesCoord
Class#
The StokesCoord
class provides a minimal wrapper for interacting with Stokes
parameters as handled by WCS. In WCS (as described in the FITS 4.0
specification), the stokes parameters are allocated an integer number, each
representing a different parameter, for example “I” is given the number 1 and
“Q” the number 2. The StokesCoord
class uses a mapping between these numbers
and the names of the parameters as given by the FITS WCS conventions, and allows
you to refer to the parameters by their string names rather than their numbers.
For example, the default representation of the StokesCoord
object uses the
names rather than the numbers.
>>> import numpy as np
>>> from astropy.coordinates import StokesCoord
>>> StokesCoord([1, 2, 3, 4])
StokesCoord(['I', 'Q', 'U', 'V'])
These “symbols” as the StokesCoord
class refers to them as can also be accessed via the StokesCoord.symbol
property:
>>> stokes = StokesCoord([1, 2, 3, 4])
>>> stokes.symbol
array(['I', 'Q', 'U', 'V'], dtype='<U2')
And the StokesCoord
class can also be instantiated with symbols rather than numbers:
>>> StokesCoord("I")
StokesCoord('I')
Numeric values which are not present in the mapping will be represented by the string "?"
:
>>> StokesCoord([1, 10])
StokesCoord(['I', '?'])
It is possible to add custom number - symbol mappings see Mapping Symbols to Numeric Values.
Comparing to Symbols and Numbers#
It is possible to compare the values in a StokesCoord
with their parameter names:
>>> stokes = StokesCoord([1, 2, 3, 4])
>>> stokes == "I"
array([ True, False, False, False])
Comparing StokesCoord
classes like this compares their underlying numeric
values, by converting the symbol to a number.
To directly compare the symbols you can do:
>>> stokes = StokesCoord([1, 2, 3, 4, 5, 6])
>>> stokes.symbol == "?"
array([False, False, False, False, True, True])
This comparison matches all values where the equivalent symbol isn’t known, in comparison to comparing to values where the underlying numbers could vary but all are unknown (so they are not equal).
Note that comparing to symbols does not work with numpy.equal
only the ==
operator.
Mapping Symbols to Numeric Values#
Built-in Symbols#
The mapping between the numbers and the parameter names built into astropy is as follows:
>>> from astropy.coordinates.polarization import FITS_STOKES_VALUE_SYMBOL_MAP
>>> for number, symbol in FITS_STOKES_VALUE_SYMBOL_MAP.items():
... print(f"{number:-2}: {symbol.symbol} - {symbol.description}")
1: I - Standard Stokes unpolarized
2: Q - Standard Stokes linear
3: U - Standard Stokes linear
4: V - Standard Stokes circular
-1: RR - Right-right circular: <RR*>
-2: LL - Left-left circular: <LL*>
-3: RL - Right-left cross-circular: Re(<RL*>))
-4: LR - Left-right cross-circular: Re(<LR*>)=Im(<RL*>)
-5: XX - X parallel linear: <XX*>
-6: YY - Y parallel linear: <YY*>
-7: XY - XY cross linear: Re(<XY*>)
-8: YX - YX cross linear: Im(<XY*>)
Adding Custom Symbols#
It is possible to add custom mappings between numbers and parameters.
This can be done with the custom_stokes_symbol_mapping
context manager:
>>> from astropy.coordinates import custom_stokes_symbol_mapping, StokesSymbol
>>> with custom_stokes_symbol_mapping({10: StokesSymbol("J", "A custom parameter name")}):
... print(StokesCoord(10))
StokesCoord('J')