Skip to content

Commit

Permalink
Make MetadataMetricTask flexible in its quantum size.
Browse files Browse the repository at this point in the history
The same class (and any subclasses) can now be used for metadata from
any source task, provided they only need to process one metadata
object at a time.
  • Loading branch information
kfindeisen committed Aug 10, 2020
1 parent 0f0248e commit 4816a2c
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 7 deletions.
40 changes: 33 additions & 7 deletions python/lsst/verify/tasks/metadataMetricTask.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@

import abc

import lsst.pex.config

from lsst.pipe.base import Struct, connectionTypes
from lsst.verify.tasks import MetricTask, MetricConfig, MetricConnections, \
MetricComputationError
Expand Down Expand Up @@ -60,19 +62,43 @@ class SingleMetadataMetricConnections(
multiple=False,
)

def __init__(self, *, config=None):
"""Customize the connections for a specific MetricTask instance.
Parameters
----------
config : `MetadataMetricConfig`
A config for `MetadataMetricTask` or one of its subclasses.
"""
super().__init__(config=config)
if config and config.metadataDimensions != self.metadata.dimensions:
# Hack, but only way to get a connection without fixed dimensions
newMetadata = connectionTypes.Input(
name=self.metadata.name,
doc=self.metadata.doc,
storageClass=self.metadata.storageClass,
dimensions=config.metadataDimensions,
multiple=self.metadata.multiple,
)
self.metadata = newMetadata
# Registry must match actual connections
self.allConnections['metadata'] = self.metadata
# Task requires that quantum dimensions match input dimensions
self.dimensions = config.metadataDimensions


class MetadataMetricConfig(
MetricConfig,
pipelineConnections=SingleMetadataMetricConnections):
"""A base class for metadata metric task configs.
Notes
-----
`MetadataMetricTask` classes that have CCD-level granularity can use
this class as-is. Support for metrics of a different granularity
may be added later.
"""
pass
metadataDimensions = lsst.pex.config.ListField(
default=SingleMetadataMetricConnections.dimensions,
dtype=str,
doc="Override for the dimensions of the 'metadata' input, when "
"instrumenting Tasks that don't produce one metadata object "
"per visit.",
)


class _AbstractMetadataMetricTask(MetricTask):
Expand Down
13 changes: 13 additions & 0 deletions python/lsst/verify/tasks/testUtils.py
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,19 @@ def testPassThroughRun(self):
else:
self.task.run([None])

def testDimensionsOverride(self):
config = self.task.config
expectedDimensions = {"instrument", "visit"}
config.metadataDimensions = expectedDimensions

connections = config.connections.ConnectionsClass(config=config)
self.assertSetEqual(set(connections.dimensions),
expectedDimensions)
self.assertIn(connections.metadata,
connections.allConnections.values())
self.assertSetEqual(set(connections.metadata.dimensions),
expectedDimensions)


class ApdbMetricTestCase(gen2Utils.MetricTaskTestCase, MetricTaskTestCase):
"""Unit test base class for tests of `ApdbMetricTask`.
Expand Down

0 comments on commit 4816a2c

Please sign in to comment.