Coverage for tests/test_BestSeeingWcsSelectImages.py: 20%
125 statements
« prev ^ index » next coverage.py v6.4.2, created at 2022-07-17 08:57 +0000
« prev ^ index » next coverage.py v6.4.2, created at 2022-07-17 08:57 +0000
1#
2# LSST Data Management System
3# Copyright 2018 University of Washington
4#
5# This product includes software developed by the
6# LSST Project (http://www.lsst.org/).
7#
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
10# the Free Software Foundation, either version 3 of the License, or
11# (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the LSST License Statement and
19# the GNU General Public License along with this program. If not,
20# see <http://www.lsstcorp.org/LegalNotices/>.
21#
23import unittest
24import unittest.mock
25import numpy as np
27import lsst.utils.tests
28import lsst.afw.image
29import lsst.daf.persistence
30import lsst.geom
31import lsst.afw.geom
32from lsst.pipe.tasks import selectImages
35class BestSeeingWcsSelectImagesTest(lsst.utils.tests.TestCase):
37 def setUp(self):
38 self.config = selectImages.BestSeeingWcsSelectImageConfig()
39 self.plateScale = 0.2 # arcseconds/pixel
40 # define an avgFwhm that is in the config's FWHM range
41 self.avgFwhm = np.mean([self.config.minPsfFwhm, self.config.maxPsfFwhm])
42 self.dataId = "visit=mock"
44 def makeDataId(self, fwhm):
45 """Provide convenience function for dataId mangling.
46 Parameters
47 ----------
48 fwhm: float
49 FWHM in arcseconds of image to be mocked.
50 """
51 return f'{self.dataId} fwhm={fwhm}'
53 def localSetUp(self, mockFWHMs=None):
54 """Set up test inputs with mocked variable seeing images.
56 Parameters
57 ----------
58 mockFWHMs : iterable or `None`
59 FWHM in arcseconds of images to be mocked.
60 """
61 if mockFWHMs is not None:
62 self.mockFWHMs = mockFWHMs
63 else:
64 self.mockFWHMs = []
66 def mockDeterminantRadii():
67 return [f / np.sqrt(8.*np.log(2.)) for f in self.mockFWHMs]
69 self.calexp = unittest.mock.Mock(spec=lsst.afw.image.ExposureD)
70 self.calexp.getPsf.return_value.computeShape.return_value.getDeterminantRadius.side_effect \
71 = mockDeterminantRadii()
72 self.calexp.getWcs.return_value.getPixelScale.return_value.asArcseconds.side_effect \
73 = [self.plateScale for f in self.mockFWHMs]
74 self.dataRef = unittest.mock.Mock(spec=lsst.daf.persistence.ButlerDataRef, dataId=self.dataId)
75 self.dataRef.get.return_value = self.calexp
77 point1 = lsst.geom.SpherePoint(0, 0, lsst.geom.degrees)
78 point2 = lsst.geom.SpherePoint(2, 0, lsst.geom.degrees)
79 point3 = lsst.geom.SpherePoint(0, 2, lsst.geom.degrees)
81 self.coordList = [point1, point2, point3]
83 center = lsst.geom.SpherePoint(1, 1, lsst.geom.degrees)
84 rotateAxis = lsst.geom.SpherePoint(0, 0, lsst.geom.degrees)
85 rotateAngle = 0*lsst.geom.degrees
86 dims = lsst.geom.Extent2I(3600, 3600)
87 scale = 0.5*lsst.geom.arcseconds
89 crpix = lsst.geom.Point2D(lsst.geom.Extent2D(dims)*0.5)
90 center = center.rotated(rotateAxis, rotateAngle)
91 cdMatrix = lsst.afw.geom.makeCdMatrix(scale=scale)
92 wcs = lsst.afw.geom.makeSkyWcs(crpix=crpix, crval=center, cdMatrix=cdMatrix)
93 self.bbox = lsst.geom.Box2I(lsst.geom.Point2I(0, 0), lsst.geom.Point2I(dims[0], dims[1]))
95 self.selectList = []
96 for fwhm in self.mockFWHMs:
97 # encode the FWHM in the dataId
98 dataRef = unittest.mock.Mock(spec=lsst.daf.persistence.ButlerDataRef,
99 dataId=self.makeDataId(fwhm))
100 dataRef.get.return_value = self.calexp
101 # also create a new attribute to store the fwhm since side_effect
102 # can only be called once per value
103 dataRef.fwhm = fwhm
104 selectStruct = selectImages.SelectStruct(dataRef, wcs, self.bbox)
105 self.selectList.append(selectStruct)
107 def testConfigNImagesGTZero(self):
108 """Test that the config requests 0 or more images.
109 """
110 self.assertGreater(self.config.nImagesMax, 0)
112 def testConfigPsfFwhmRangeIsValid(self):
113 """Test that the minimum PSF FWHM is greater than zero
114 and less than the maximum.
115 """
116 self.assertGreaterEqual(self.config.minPsfFwhm, 0)
117 self.assertGreater(self.config.maxPsfFwhm, self.config.minPsfFwhm)
119 def testNoInputImages(self):
120 """Test that providing no images returns nothing.
121 """
122 self.localSetUp(mockFWHMs=[])
123 task = selectImages.BestSeeingWcsSelectImagesTask(config=self.config)
124 result = task.runDataRef(self.dataRef, self.coordList, selectDataList=self.selectList)
125 self.assertEqual(len(result.exposureInfoList), 0)
127 def testSelectOne(self):
128 """Test that configs requesting one image return one image.
129 """
130 self.config.nImagesMax = 1
131 self.localSetUp(mockFWHMs=[self.avgFwhm for i in range(self.config.nImagesMax)])
132 task = selectImages.BestSeeingWcsSelectImagesTask(config=self.config)
133 result = task.runDataRef(self.dataRef, self.coordList, selectDataList=self.selectList)
134 self.assertEqual(len(result.exposureInfoList), 1)
135 self.assertEqual(result.exposureInfoList[0].dataId, self.makeDataId(self.avgFwhm))
136 self.assertEqual(result.dataRefList[0].fwhm, self.avgFwhm)
138 def testSelectDefault(self):
139 """Test that the default configuration is self-consistent.
140 """
141 self.localSetUp(mockFWHMs=[self.avgFwhm for i in range(self.config.nImagesMax)])
142 task = selectImages.BestSeeingWcsSelectImagesTask(config=self.config)
143 result = task.runDataRef(self.dataRef, self.coordList, selectDataList=self.selectList)
144 self.assertEqual(len(result.exposureInfoList), self.config.nImagesMax)
145 for dataRef in result.dataRefList:
146 self.assertEqual(dataRef.fwhm, self.avgFwhm)
148 def testNImagesLessThanNMax(self):
149 """Test case of input selectDataList shorter than nImagesMax.
150 """
151 self.config.nImagesMax = 5
152 self.localSetUp(mockFWHMs=[self.avgFwhm for i in range(3)])
153 task = selectImages.BestSeeingWcsSelectImagesTask(config=self.config)
154 result = task.runDataRef(self.dataRef, self.coordList, selectDataList=self.selectList)
155 self.assertEqual(len(result.exposureInfoList), 3)
156 for dataRef in result.dataRefList:
157 self.assertEqual(dataRef.fwhm, self.avgFwhm)
159 def testNImagesGreaterThanNMax(self):
160 """Test case of input selectDataList greater than nImagesMax.
161 """
162 self.localSetUp(mockFWHMs=[self.avgFwhm for i in range(self.config.nImagesMax+3)])
163 task = selectImages.BestSeeingWcsSelectImagesTask(config=self.config)
164 result = task.runDataRef(self.dataRef, self.coordList, selectDataList=self.selectList)
165 self.assertEqual(len(result.exposureInfoList), self.config.nImagesMax)
166 for dataRef in result.dataRefList:
167 self.assertEqual(dataRef.fwhm, self.avgFwhm)
169 def testFwhmSelection(self):
170 """Test that minimum and maximum FWHM selections work.
171 """
172 self.config.minPsfFwhm = 1.0*self.plateScale
173 self.config.maxPsfFwhm = 1.5*self.plateScale
174 self.config.nImagesMax = 10
175 mockFWHMs = [0.5, 1.0, 1.25, 1.5, 2.0]
176 self.localSetUp(mockFWHMs=mockFWHMs)
177 task = selectImages.BestSeeingWcsSelectImagesTask(config=self.config)
178 result = task.runDataRef(self.dataRef, self.coordList, selectDataList=self.selectList)
179 self.assertEqual(len(result.exposureInfoList), 3)
180 for i, fwhm in enumerate([1.0, 1.25, 1.5]):
181 self.assertEqual(result.exposureInfoList[i].dataId, self.makeDataId(fwhm))
182 self.assertEqual(result.dataRefList[i].fwhm, fwhm)
184 def testBestSeeingFwhmSelection(self):
185 """Test that the selection picks the best seeing images.
186 """
187 self.config.minPsfFwhm = 1.0*self.plateScale
188 self.config.maxPsfFwhm = 1.5*self.plateScale
189 self.config.nImagesMax = 3
190 mockFWHMs = [0.5, 1.0, 1.1, 1.2, 1.25, 1.3, 1.4, 1.5, 2.0]
191 self.localSetUp(mockFWHMs=mockFWHMs)
192 task = selectImages.BestSeeingWcsSelectImagesTask(config=self.config)
193 result = task.runDataRef(self.dataRef, self.coordList, selectDataList=self.selectList)
194 self.assertEqual(len(result.exposureInfoList), self.config.nImagesMax)
195 for i, fwhm in enumerate([1.0, 1.1, 1.2]):
196 self.assertEqual(result.exposureInfoList[i].dataId, self.makeDataId(fwhm))
197 self.assertEqual(result.dataRefList[i].fwhm, fwhm)
199 def testSelectDefaultMakeDataRefListIsFalse(self):
200 """Test appropriate behavior for makeDataRefList = False.
201 """
202 self.localSetUp(mockFWHMs=[self.avgFwhm for i in range(self.config.nImagesMax)])
203 task = selectImages.BestSeeingWcsSelectImagesTask(config=self.config)
204 result = task.runDataRef(self.dataRef, self.coordList,
205 selectDataList=self.selectList, makeDataRefList=False)
206 self.assertIsNone(result.dataRefList)
209class MyMemoryTestCase(lsst.utils.tests.MemoryTestCase):
210 pass
213def setup_module(module):
214 lsst.utils.tests.init()
217if __name__ == "__main__": 217 ↛ 218line 217 didn't jump to line 218, because the condition on line 217 was never true
218 lsst.utils.tests.init()
219 unittest.main()