Source code for sofia_redux.scan.channels.gain_provider.zero_mean_gains

# Licensed under a 3-clause BSD style license - see LICENSE.rst

from sofia_redux.scan.channels.gain_provider.gain_provider import GainProvider
from sofia_redux.scan.channels.mode.correlated_mode import CorrelatedMode
from abc import abstractmethod
import numpy as np

__all__ = ['ZeroMeanGains']


[docs] class ZeroMeanGains(GainProvider): def __init__(self): """ An abstract class designed to subtract average gain values. """ super().__init__() self.ave_g = 0.0
[docs] @abstractmethod def get_relative_gain(self, channel_data): # pragma: no cover pass
[docs] @abstractmethod def set_raw_gain(self, channel_data, gain): # pragma: no cover pass
[docs] def get_gain(self, channel_data): """ Returns gain values with the average gain removed (determined from `validate` of a Mode. Parameters ---------- channel_data : ChannelData or ChannelGroup The channel data from which to extract gains. Returns ------- gains : numpy.ndarray (float) The returned zero-mean gains. """ gains = self.get_relative_gain(channel_data) - self.ave_g gains[np.isnan(gains)] = 0.0 return gains
[docs] def set_gain(self, channel_data, gains): """ Set gains in the channel data. Parameters ---------- channel_data : ChannelData or ChannelGroup The channel data for which to set gains. gains : numpy.ndarray (float) The gains to apply. Returns ------- None """ self.set_raw_gain(channel_data, gains + self.ave_g)
[docs] def validate(self, mode): """ Validate a given mode. Determine the average gain from a given mode. Parameters ---------- mode : Mode Returns ------- None """ gains = self.get_relative_gain(mode.channel_group) weights = mode.channel_group.weight if isinstance(mode, CorrelatedMode): keep = mode.channel_group.is_unflagged(mode.skip_flags) gains = gains[keep] weights = weights[keep] sum_wg = np.sum(weights * gains) sum_w = np.sum(weights) if sum_w == 0: self.ave_g = 0.0 else: self.ave_g = sum_wg / sum_w