Source code for lsst.verify.report

#
# LSST Data Management System
#
# This product includes software developed by the
# LSST Project (http://www.lsst.org/).
#
# See COPYRIGHT file at the top of the source tree.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the LSST License Statement and
# the GNU General Public License along with this program.  If not,
# see <https://www.lsstcorp.org/LegalNotices/>.
#
from __future__ import print_function, division

__all__ = ['Report']

from astropy.table import Table
import numpy as np

from .naming import Name


[docs]class Report(object): """Report tabulating specification pass/fail status for a set of `lsst.verify.Measurement`\ s. Parameters ---------- measurements : `lsst.verify.MeasurementSet` Measurements to be tested. specs : `lsst.verify.SpecificationSet` Specifications to test measurements against. These specifications are assumed to be relevant to the measurements. Use `lsst.verify.SpecificationSet.subset`, passing in job metadata (`lsst.verify.Job.meta`), to ensure this. """ def __init__(self, measurements, specs): self._meas_set = measurements self._spec_set = specs
[docs] def make_table(self): """Make an table summarizing specification tests of measurements. Returns ------- table : `astropy.table.Table` Table with columns: - **Status** - **Specification** - **Measurement** - **Test** - **Metric Tags** - **Spec. Tags** """ # Columns for the table statuses = [] spec_name_items = [] measurements = [] tests = [] metric_tags = [] spec_tags = [] spec_names = list(self._spec_set.keys()) spec_names.sort() for spec_name in spec_names: # Test if there is a measurement for this specification, # if not, we just skip it. metric_name = Name(package=spec_name.package, metric=spec_name.metric) try: meas = self._meas_set[metric_name] except KeyError: # No measurement for this specification, just skip it. continue spec = self._spec_set[spec_name] if np.isnan(meas.quantity): # Not measured # https://emojipedia.org/heavy-minus-sign/ statuses.append(u'\U00002796') elif spec.check(meas.quantity): # Passed # http://emojipedia.org/white-heavy-check-mark/ statuses.append(u'\U00002705') else: # Failed. # http://emojipedia.org/cross-mark/ statuses.append(u'\U0000274C') spec_name_items.append(str(spec_name)) measurements.append(meas._repr_latex_()) tests.append(spec._repr_latex_()) tags = list(spec.tags) tags.sort() spec_tags.append(', '.join(tags)) metric = meas.metric if metric is None: # no metric is available, this is the default metric_tags.append('N/A') else: tags = list(metric.tags) tags.sort() metric_tags.append(', '.join(tags)) table = Table([statuses, spec_name_items, measurements, tests, metric_tags, spec_tags], names=['Status', 'Specification', 'Measurement', 'Test', 'Metric Tags', 'Spec. Tags']) return table
def _repr_html_(self): """HTML representation of the report for Jupyter notebooks.""" table = self.make_table() return table._repr_html_()
[docs] def show(self): """Display the report in a Jupyter notebook.""" table = self.make_table() return table.show_in_notebook(show_row_index='')