Source code for sofia_redux.scan.source_models.maps.significance_map
# Licensed under a 3-clause BSD style license - see LICENSE.rst
from astropy import units
import numpy as np
from sofia_redux.scan.source_models.maps.overlay import Overlay
from sofia_redux.scan.source_models.maps.noise_map import NoiseMap
from sofia_redux.scan.flags.flagged_array import FlaggedArray
__all__ = ['SignificanceMap']
[docs]
class SignificanceMap(Overlay):
def __init__(self, observation=None):
"""
Create a significance map overlay of an observation.
The exposure map overlay returns and operates on the data and weight
images of the Observation2D basis.
Parameters
----------
observation : Observation2D, optional
The observation map from which to overlay significance.
"""
super().__init__(data=observation)
[docs]
def set_default_unit(self):
"""
Set the default unit for the map significance.
The default unit will always be dimensionless (a number).
Returns
-------
None
"""
super().set_unit(1 * units.dimensionless_unscaled)
[docs]
def set_unit(self, unit):
"""
Set the unit for the map (Not available for S2N map).
The signal-to-noise ratio will always be expressed in dimensionless
units (as a number).
Parameters
----------
unit : str or units.Unit or units.Quantity
Returns
-------
None
"""
super().set_unit(1 * units.dimensionless_unscaled)
@property
def data(self):
"""
Return the data values of the significance map.
The significance (S2N or signal-to-noise ratio) is given by::
s2n = data * sqrt(weight)
where weight should be equivalent to 1/variance.
Returns
-------
numpy.ndarray
"""
weight = self.basis.weight
if weight is None or weight.data is None:
return None
data = self.basis.data
if data is None:
return None
return data * np.sqrt(weight.data)
@data.setter
def data(self, significance):
"""
Set the significance data values.
This results in the basis image data being set to::
data = noise * significance
where noise is calculated as the 1/sqrt(weight) values of the
basis observation.
Parameters
----------
significance : numpy.ndarray or FlaggedArray
Returns
-------
None
"""
noise = NoiseMap(self.basis).data
if noise is None: # pragma: no cover
return
if isinstance(significance, FlaggedArray):
data = noise * significance.data
valid = significance.valid
data[~valid] = self.blanking_value
else:
data = noise * significance
self.basis.data = data