Source code for rubin_sim.maf.maf_contrib.periodic_metric
# Example for PeriodicMetric
# Mike Lund - Vanderbilt University
# mike.lund@gmail.com
# Last edited 3/10/2015
# Motivation: The detection of periodic signals can be examined by
# using canonical signals and attempted to recover these.
# However, a more general approach would be to examine the strength in
# signal that is lost as a result of poor phase coverage.
# This metric calculates the spectral window function for a set of
# scheduled observations. The largest peak at a nonzero frequency is
# used as a proxy to quantify how much power is
# lost to other frequencies. Full phase coverage will result in a value of 1.
# We refer to this as the Periodic Purity Function.
__all__ = ("PeriodicMetric",)
import numpy as np
from rubin_sim.maf.metrics import BaseMetric
[docs]
class PeriodicMetric(BaseMetric):
"""From a set of observation times, uses code provided by Robert Siverd
(LCOGT) to calculate the spectral window function.
"""
def __init__(self, time_col="expMJD", **kwargs):
self.time_col = time_col
super(PeriodicMetric, self).__init__(col=[self.time_col], **kwargs)
[docs]
def run(self, data_slice, slice_point=None):
frq_pts = 30000.0
max_frq = 25.0
times = data_slice[self.time_col]
times = times - times[0] # change times to smaller numbers
use_jd = np.array(times)
window_frq = np.arange(frq_pts) * max_frq / frq_pts
window_val = np.zeros_like(window_frq, dtype="float")
for x, frq in enumerate(window_frq):
window_val[x] = np.sum(np.cos(-2.0 * np.pi * frq * use_jd))
window_val /= np.float(use_jd.size)
secondpeak = np.sort(window_val)[-2]
totalsum = (np.sum(window_val) - np.sort(window_val)[-1]) / (frq_pts - 1)
data = np.asarray([secondpeak, totalsum])
return data
def reduce_peak(self, data):
return 1.0 - data[0]
def reduce_sum(self, data):
return data[1]