Source code for lsst.verify.output
#
# 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 absolute_import, division, print_function
__all__ = ['output_quantities']
from .job import Job
from .measurement import Measurement
from .naming import Name
[docs]def output_quantities(package_name, quantities, suffix=None,
                      include_metrics=False, metrics_package='verify_metrics'):
    """Output measurements, as `astropy.units.Quantity` objects, from a
    pipeline task execution to a `lsst.verify`-formatted JSON file.
    Parameters
    ----------
    package_name : `str`
        Name of the package producing measurements. This name is used two ways:
        1. Make fully-qualified metric names from keys in the ``quantities``
           dictionary. For example, if a ``quantities`` dict has a key-value
           pair ``{'PA1': 5 * u.mmag}`` and ``package_name='validate_drp'``,
           the fully-qualified metric name is ``'validate_drp.PA1'``.
        2. As a filename prefix for the output JSON file.
    quantities : `dict` of `astropy.units.Quantity` values
        Dictionary of measurements as plain `astropy.units.Quantity`
        instances. Each key is the name of a metric. If metric names are
        not fully-specified (in ``package.metric`` format), the package
        name can be provided with the ``package_name`` argument.
    suffix : `str`, optional
        Additional suffix to add to the output JSON filename::
            {package_name}_{suffix}.verify.json
        The suffix may be used to distinguish measurement output files from
        different tasks in the same package.
    include_metrics : `bool`, optional
        Metric and specification definitions are included in the JSON output
        if set to `True`. The metric and specification definitions are
        loaded from a metric package indicated by the ``metrics_package``
        argument. Normally tasks do not need to include metric definitions if
        a post-processing step is used. Default: `False`.
    metrics_package : `str`, optional
        Name of the metrics package to obtain metrics from if
        ``include_metrics`` is `True`. Default is ``'verify_metrics'``.
    Returns
    -------
    filename : `str`
        Filename where the JSON file was written.
    See also
    --------
    lsst.verify.Job.write
    Notes
    -----
    This function is designed for lightweight `lsst.verify` framework usage.
    Rather than maintaining `Job` and `Measurement` objects,
    a task can simply record metric measurements as `astropy.units.Quantity`
    objects. With `output_quantities`, the task can output these measurements
    in a standardized `lsst.verify` JSON format. Post-processing tools
    can load this data for local analysis, or submit it to the
    https://squash.lsst.codes dashboard service.
    Tasks that need to include `Blob`\ s, `Measurement.extras` or query
    `Metric` objects should create a `Job` instance and use
    `Job.write` instead.
    """
    if include_metrics:
        job = Job.load_metrics_package(metrics_package, subset=package_name)
    else:
        job = Job()
    for name, quantity in quantities.items():
        metric_name = Name(package=package_name, metric=name)
        measurement = Measurement(metric_name, quantity=quantity)
        job.measurements.insert(measurement)
    if suffix is not None:
        filename = '{package}_{suffix}.verify.json'.format(
            package=package_name, suffix=suffix)
    else:
        filename = '{package}.verify.json'.format(package=package_name)
    job.write(filename)
    return filename