Source code for setigen.frame_utils

import numpy as np
import matplotlib.pyplot as plt
from astropy.stats import sigma_clip


[docs] def db(a): """ Convert to dB. """ return 10 * np.log10(a)
[docs] def array(fr): """ Return a Numpy array for input frame or Numpy array. Parameters ---------- fr : Frame, or 2D ndarray Input frame or Numpy array Returns ------- data : ndarray Data array """ try: return fr.get_data() except AttributeError: return fr
[docs] def integrate(fr, axis='t', mode='mean', normalize=False): """ Integrate along either time ('t', 0) or frequency ('f', 1) axes, to create spectra or time series data. Mode is either 'mean' or 'sum'. Parameters ---------- fr : Frame, or 2D ndarray Input frame or Numpy array axis : int or str Axis over which to integrate; time ('t', 0) or frequency ('f', 1) mode : {"mean", "sum"}, default: "mean" Integration mode normalize : bool Option to normalize integrated array to mean 0, std 1 Returns ------- output : ndarray Integrated product """ # If `data` is a Frame object, just grab its data data = array(fr) if axis in ['f', 1]: axis = 1 else: axis = 0 if mode[0] == 's': output = np.sum(data, axis=axis) else: output = np.mean(data, axis=axis) if normalize: c_output = sigma_clip(output) output = (output - np.mean(c_output)) / np.std(c_output) return output
[docs] def get_slice(fr, l, r): """ Slice frame data with left and right index bounds. Parameters ---------- fr : Frame Input frame l : int Left bound r : int Right bound Returns ------- s_fr : Frame Sliced frame """ s_data = fr.data[:, l:r] # Match frequency to truncated frame if fr.ascending: fch1 = fr.fs[l] else: fch1 = fr.fs[r - 1] s_fr = fr.from_data(fr.df, fr.dt, fch1, fr.ascending, s_data, metadata=fr.metadata, waterfall=fr.check_waterfall()) return s_fr