Coverage for tests/test_verifyToSasquatch.py: 24%
60 statements
« prev ^ index » next coverage.py v7.2.7, created at 2023-06-13 02:05 -0700
« prev ^ index » next coverage.py v7.2.7, created at 2023-06-13 02:05 -0700
1# This file is part of analysis_tools.
2#
3# Developed for the LSST Data Management System.
4# This product includes software developed by the LSST Project
5# (https://www.lsst.org).
6# See the COPYRIGHT file at the top-level directory of this distribution
7# for details of code ownership.
8#
9# This program is free software: you can redistribute it and/or modify
10# it under the terms of the GNU General Public License as published by
11# the Free Software Foundation, either version 3 of the License, or
12# (at your option) any later version.
13#
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17# GNU General Public License for more details.
18#
19# You should have received a copy of the GNU General Public License
20# along with this program. If not, see <https://www.gnu.org/licenses/>.
22import tempfile
23import unittest
25import astropy.units as u
26import lsst.daf.butler.tests as butlerTests
27from lsst.analysis.tools.bin.verifyToSasquatch import _bundle_metrics
28from lsst.analysis.tools.interfaces import MetricMeasurementBundle
29from lsst.daf.butler import CollectionType, DataCoordinate
30from lsst.verify import Measurement
33class VerifyToSasquatchTestSuite(unittest.TestCase):
34 def setUp(self):
35 super().setUp()
37 repo = tempfile.TemporaryDirectory()
38 # TemporaryDirectory warns on leaks; addCleanup also keeps the TD from
39 # getting garbage-collected.
40 self.addCleanup(tempfile.TemporaryDirectory.cleanup, repo)
41 self.butler = butlerTests.makeTestRepo(repo.name)
43 butlerTests.addDataIdValue(self.butler, "instrument", "notACam")
44 for visit in [42, 43]:
45 butlerTests.addDataIdValue(self.butler, "visit", visit)
46 for detector in range(4):
47 butlerTests.addDataIdValue(self.butler, "detector", detector)
48 butlerTests.addDatasetType(
49 self.butler,
50 "metricvalue_nopackage_fancyMetric",
51 {"instrument", "visit", "detector"},
52 "MetricValue",
53 )
54 butlerTests.addDatasetType(
55 self.butler,
56 "metricvalue_nopackage_fancierMetric",
57 {"instrument", "visit", "detector"},
58 "MetricValue",
59 )
60 butlerTests.addDatasetType(
61 self.butler, "metricvalue_nopackage_plainMetric", {"instrument"}, "MetricValue"
62 )
63 self.butler.registry.registerCollection("run1", CollectionType.RUN)
64 self.butler.registry.registerCollection("run2", CollectionType.RUN)
66 def _standardize(self, dataId):
67 """Convert an arbitrary data ID to a DataCoordinate."""
68 return DataCoordinate.standardize(dataId, universe=self.butler.dimensions)
70 def test_bundle_metrics_nometrics(self):
71 refs = self.butler.registry.queryDatasets("metricvalue_nopackage_*", collections=...)
72 bundles = _bundle_metrics(self.butler, refs)
73 # MetricMeasurementBundle.equals ignores metadata
74 self.assertDictEqual(bundles, {})
76 def test_bundle_metrics_onemetric(self):
77 m = Measurement("nopackage.fancyMetric", 42.2 * u.s)
78 self.butler.put(
79 m, "metricvalue_nopackage_fancyMetric", run="run1", instrument="notACam", visit=42, detector=2
80 )
81 refs = self.butler.registry.queryDatasets("metricvalue_nopackage_fancyMetric", collections=...)
82 bundles = _bundle_metrics(self.butler, refs)
83 # MetricMeasurementBundle.equals ignores metadata
84 self.assertDictEqual(
85 bundles,
86 {
87 (
88 "run1",
89 "metricvalue_nopackage_fancyMetric",
90 self._standardize({"instrument": "notACam", "visit": 42, "detector": 2}),
91 ): MetricMeasurementBundle({"fancyMetric": [Measurement(m.metric_name.metric, m.quantity)]}),
92 },
93 )
95 def test_bundle_metrics_onemetrictwice(self):
96 m2 = Measurement("nopackage.fancyMetric", 42.2 * u.s)
97 self.butler.put(
98 m2, "metricvalue_nopackage_fancyMetric", run="run1", instrument="notACam", visit=42, detector=2
99 )
100 m1 = Measurement("nopackage.fancyMetric", 43.1 * u.m)
101 self.butler.put(
102 m1, "metricvalue_nopackage_fancyMetric", run="run1", instrument="notACam", visit=43, detector=1
103 )
104 refs = self.butler.registry.queryDatasets("metricvalue_nopackage_fancyMetric", collections=...)
105 bundles = _bundle_metrics(self.butler, refs)
106 # MetricMeasurementBundle.equals ignores metadata
107 self.assertDictEqual(
108 bundles,
109 {
110 (
111 "run1",
112 "metricvalue_nopackage_fancyMetric",
113 self._standardize({"instrument": "notACam", "visit": 42, "detector": 2}),
114 ): MetricMeasurementBundle(
115 {"fancyMetric": [Measurement(m2.metric_name.metric, m2.quantity)]}
116 ),
117 (
118 "run1",
119 "metricvalue_nopackage_fancyMetric",
120 self._standardize({"instrument": "notACam", "visit": 43, "detector": 1}),
121 ): MetricMeasurementBundle(
122 {"fancyMetric": [Measurement(m1.metric_name.metric, m1.quantity)]}
123 ),
124 },
125 )
127 def test_bundle_metrics_threemetrics(self):
128 m2 = Measurement("nopackage.fancyMetric", 42.2 * u.s)
129 self.butler.put(
130 m2, "metricvalue_nopackage_fancyMetric", run="run1", instrument="notACam", visit=42, detector=2
131 )
132 m1 = Measurement("nopackage.fancierMetric", 43.1 * u.m)
133 self.butler.put(
134 m1, "metricvalue_nopackage_fancierMetric", run="run2", instrument="notACam", visit=43, detector=1
135 )
136 m_ = Measurement("nopackage.plainMetric", 127.0 * u.kg)
137 self.butler.put(m_, "metricvalue_nopackage_plainMetric", run="run1", instrument="notACam")
138 refs = self.butler.registry.queryDatasets("metricvalue_nopackage_*", collections=...)
139 bundles = _bundle_metrics(self.butler, refs)
140 # MetricMeasurementBundle.equals ignores metadata
141 self.assertDictEqual(
142 bundles,
143 {
144 (
145 "run1",
146 "metricvalue_nopackage_fancyMetric",
147 self._standardize({"instrument": "notACam", "visit": 42, "detector": 2}),
148 ): MetricMeasurementBundle(
149 {"fancyMetric": [Measurement(m2.metric_name.metric, m2.quantity)]}
150 ),
151 (
152 "run2",
153 "metricvalue_nopackage_fancierMetric",
154 self._standardize({"instrument": "notACam", "visit": 43, "detector": 1}),
155 ): MetricMeasurementBundle(
156 {"fancierMetric": [Measurement(m1.metric_name.metric, m1.quantity)]}
157 ),
158 (
159 "run1",
160 "metricvalue_nopackage_plainMetric",
161 self._standardize({"instrument": "notACam"}),
162 ): MetricMeasurementBundle(
163 {"plainMetric": [Measurement(m_.metric_name.metric, m_.quantity)]}
164 ),
165 },
166 )
168 def test_bundle_metrics_badmetric(self):
169 butlerTests.addDatasetType(
170 self.butler, "metricvalue_nopackage_notAMetric", {"instrument", "visit"}, "StructuredDataDict"
171 )
172 self.butler.put(
173 {"foo": "bar"}, "metricvalue_nopackage_notAMetric", run="run1", instrument="notACam", visit=42
174 )
175 refs = self.butler.registry.queryDatasets("metricvalue_nopackage_notAMetric", collections=...)
176 with self.assertRaises(ValueError):
177 _bundle_metrics(self.butler, refs)