Source code for rubin_sim.maf.metrics.pair_metric
__all__ = ("PairMetric",)
import numpy as np
from .base_metric import BaseMetric
[docs]
class PairMetric(BaseMetric):
"""Count the number of pairs of visits that could be used for
Solar System object detection.
Parameters
----------
mjd_col : `str`, opt
Name of the MJD column in the observations.
metric_name : `str`, opt
Name for the resulting metric. If None, one is constructed from
the class name.
match_min : `float`, opt
Minutes after first observation to count something as a match.
match_max : `float`, opt
Minutes after first observation to count something as a match.
bin_size : `float`, opt
bin_size to use (minutes).
Note that bin_size should be considerably smaller than the difference
between match_min and match_max.
Result
------
num_pairs : `float`
The number of pairs of visits within the min and max time range.
"""
def __init__(
self,
mjd_col="observationStartMJD",
metric_name="Pairs",
match_min=20.0,
match_max=40.0,
bin_size=5.0,
**kwargs,
):
self.mjd_col = mjd_col
self.bin_size = bin_size / 60.0 / 24.0
self.match_min = match_min / 60.0 / 24.0
self.match_max = match_max / 60.0 / 24.0
super(PairMetric, self).__init__(col=mjd_col, metric_name=metric_name, units="N Pairs", **kwargs)
[docs]
def run(self, data_slice, slice_point=None):
bins = np.arange(
data_slice[self.mjd_col].min(),
data_slice[self.mjd_col].max() + self.bin_size,
self.bin_size,
)
hist, bin_edges = np.histogram(data_slice[self.mjd_col], bins=bins)
nbin_min = np.round(self.match_min / self.bin_size)
nbin_max = np.round(self.match_max / self.bin_size)
bins_to_check = np.arange(nbin_min, nbin_max + 1, 1)
bins_w_obs = np.where(hist > 0)[0]
# now, for each bin with an observation,
# need to check if there is a bin
# far enough ahead that is also populated.
result = 0
for binadd in bins_to_check:
result += np.size(np.intersect1d(bins_w_obs, bins_w_obs + binadd))
if result == 0:
result = self.badval
return result