.. lsst-task-topic:: lsst.verify.gen2tasks.MetricsControllerTask .. currentmodule:: lsst.verify.gen2tasks ##################### MetricsControllerTask ##################### ``MetricsControllerTask`` runs collections of :lsst-task:`lsst.verify.gen2tasks.MetricTask`, and stores the resulting `~lsst.verify.Measurement` objects using the `~lsst.verify.Job` persistence framework. It is a stand-in for functionality provided by the Gen 3 Tasks framework. The datasets that ``MetricsControllerTask`` consumes depend on the :lsst-task:`~lsst.verify.gen2tasks.MetricTask`\ s to be run, and are handled automatically. ``MetricsControllerTask`` is not a command-line task, but may be called from within both task- and non-task pipelines. .. _lsst.verify.gen2tasks.MetricsControllerTask-summary: Processing summary ================== Unlike most tasks, ``MetricsControllerTask`` has a `~MetricsControllerTask.runDataRefs` method that takes a list of data references. ``MetricsControllerTask`` calls every :lsst-task:`~lsst.verify.gen2tasks.MetricTask` in :lsst-config-field:`~lsst.verify.gen2tasks.metricsControllerTask.MetricsControllerConfig.measurers` on every data reference, loading any datasets necessary. It produces one `~lsst.verify.Job` object for each input data reference, and writes them to disk. .. _lsst.verify.gen2tasks.MetricsControllerTask-api: Python API summary ================== .. lsst-task-api-summary:: lsst.verify.gen2tasks.MetricsControllerTask .. TODO: uncomment this block after resolving DM-18496 .. .. _lsst.verify.gen2tasks.MetricsControllerTask-subtasks: .. .. Retargetable subtasks .. ===================== .. .. .. lsst-task-config-subtasks:: lsst.verify.gen2tasks.MetricsControllerTask .. _lsst.verify.gen2tasks.MetricsControllerTask-configs: Configuration fields ==================== .. lsst-task-config-fields:: lsst.verify.gen2tasks.MetricsControllerTask .. _lsst.verify.gen2tasks.MetricsControllerTask-indepth: In Depth ======== Because ``MetricsControllerTask`` applies every :lsst-task:`~lsst.verify.gen2tasks.MetricTask` to every input data reference indiscriminately, it may not give good results with metrics or data references having a mixture of granularities (e.g., CCD-level, visit-level, dataset-level). The recommended way around this limitation is to create multiple ``MetricsControllerTask`` objects, and configure each one for metrics of a single granularity. Each :lsst-task:`~lsst.verify.gen2tasks.MetricTask` in a ``MetricsControllerTask`` must measure a different metric, or they will overwrite each others' values. .. _lsst.verify.gen2tasks.MetricsControllerTask-examples: Examples ======== Typically, a user of ``MetricsControllerTask`` will configure it with tasks that have `register` decorator: .. code-block:: py from lsst.verify.gen2tasks import register, \ MetricTask, MetricsControllerTask @register("ultimate") class UltimateMetric(MetricTask): ... @register("second") class SecondaryMetric(MetricTask): ... config = MetricsControllerTask.ConfigClass() config.measurers = ["ultimate", "second"] config.measurers["ultimate"].answer = 42 task = MetricsControllerTask(config) # CCD-level metrics need CCD-level datarefs # Exact dataset type doesn't matter datarefs = [butler.subset("calexp", visit=42, ccd=ccd) for ccd in range(1, 101)] struct = task.runDataRefs(datarefs) assert len(struct.jobs) == len(datarefs) A :lsst-task:`~lsst.verify.gen2tasks.MetricTask` must have the `registerMultiple` decorator to be used multiple times: .. code-block:: py from lsst.verify.gen2tasks import registerMultiple, MetricTask, MetricsControllerTask @registerMultiple("common") class CommonMetric(MetricTask): ... config = MetricsControllerTask.ConfigClass() config.measurers = ["common"] config.measurers["common"].configs["case1"] = CommonMetric.ConfigClass() config.measurers["common"].configs["case1"].metric = "misc_tasks.Case1Metric" config.measurers["common"].configs["case2"] = CommonMetric.ConfigClass() config.measurers["common"].configs["case2"].metric = "misc_tasks.Case2Metric" task = MetricsControllerTask(config) ``MetricsControllerTask`` will create and run two different ``CommonMetric`` objects, one configured with ``metric = "misc_tasks.Case1Metric"`` and one with ``metric = "misc_tasks.Case2Metric"``. The names ``"case1"`` and ``"case2"`` can be anything, so long as they are unique.