Coverage for tests/test_overscanCorrection.py : 11%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1#
2# LSST Data Management System
3# Copyright 2008, 2009, 2010 LSST Corporation.
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 numpy as np
26import lsst.utils.tests
27import lsst.geom
28import lsst.afw.image as afwImage
29import lsst.ip.isr as ipIsr
32class IsrTestCases(lsst.utils.tests.TestCase):
34 def setUp(self):
35 self.overscanKeyword = "BIASSEC"
37 def tearDown(self):
38 del self.overscanKeyword
40 def updateConfigFromKwargs(self, config, **kwargs):
41 """Common config from keywords.
42 """
43 fitType = kwargs.get('fitType', None)
44 if fitType:
45 config.overscan.fitType = fitType
47 order = kwargs.get('order', None)
48 if order:
49 config.overscan.order = order
51 def checkOverscanCorrectionY(self, **kwargs):
52 bbox = lsst.geom.Box2I(lsst.geom.Point2I(0, 0),
53 lsst.geom.Point2I(9, 12))
54 maskedImage = afwImage.MaskedImageF(bbox)
55 maskedImage.set(10, 0x0, 1)
57 dataBox = lsst.geom.Box2I(lsst.geom.Point2I(0, 0), lsst.geom.Extent2I(10, 10))
58 dataImage = afwImage.MaskedImageF(maskedImage, dataBox)
60 # these should be functionally equivalent
61 bbox = lsst.geom.Box2I(lsst.geom.Point2I(0, 10),
62 lsst.geom.Point2I(9, 12))
63 biassec = '[1:10,11:13]'
64 overscan = afwImage.MaskedImageF(maskedImage, bbox)
65 overscan.set(2, 0x0, 1)
66 exposure = afwImage.ExposureF(maskedImage, None)
67 metadata = exposure.getMetadata()
68 metadata.setString(self.overscanKeyword, biassec)
70 config = ipIsr.IsrTask.ConfigClass()
71 self.updateConfigFromKwargs(config, **kwargs)
73 isrTask = ipIsr.IsrTask(config=config)
74 isrTask.overscan.run(dataImage.getImage(), overscan.getImage())
76 height = maskedImage.getHeight()
77 width = maskedImage.getWidth()
78 for j in range(height):
79 for i in range(width):
80 if j >= 10:
81 self.assertEqual(maskedImage.image[i, j, afwImage.LOCAL], 0)
82 else:
83 self.assertEqual(maskedImage.image[i, j, afwImage.LOCAL], 8)
85 def checkOverscanCorrectionX(self, **kwargs):
86 bbox = lsst.geom.Box2I(lsst.geom.Point2I(0, 0),
87 lsst.geom.Point2I(12, 9))
88 maskedImage = afwImage.MaskedImageF(bbox)
89 maskedImage.set(10, 0x0, 1)
91 dataBox = lsst.geom.Box2I(lsst.geom.Point2I(0, 0), lsst.geom.Extent2I(10, 10))
92 dataImage = afwImage.MaskedImageF(maskedImage, dataBox)
94 # these should be functionally equivalent
95 bbox = lsst.geom.Box2I(lsst.geom.Point2I(10, 0),
96 lsst.geom.Point2I(12, 9))
97 biassec = '[11:13,1:10]'
98 overscan = afwImage.MaskedImageF(maskedImage, bbox)
99 overscan.set(2, 0x0, 1)
101 exposure = afwImage.ExposureF(maskedImage, None)
102 metadata = exposure.getMetadata()
103 metadata.setString(self.overscanKeyword, biassec)
105 config = ipIsr.IsrTask.ConfigClass()
106 self.updateConfigFromKwargs(config, **kwargs)
108 isrTask = ipIsr.IsrTask(config=config)
109 isrTask.overscan.run(dataImage, overscan.getImage())
111 height = maskedImage.getHeight()
112 width = maskedImage.getWidth()
113 for j in range(height):
114 for i in range(width):
115 if i >= 10:
116 self.assertEqual(maskedImage.image[i, j, afwImage.LOCAL], 0)
117 else:
118 self.assertEqual(maskedImage.image[i, j, afwImage.LOCAL], 8)
120 def checkOverscanCorrectionSineWave(self, **kwargs):
121 """vertical sine wave along long direction"""
123 # Full image: (500,100)
124 longAxis = 500
125 shortAxis = 100
126 overscanWidth = 30
128 bbox = lsst.geom.Box2I(lsst.geom.Point2I(0, 0),
129 lsst.geom.Point2I(shortAxis-1, longAxis-1))
130 maskedImage = afwImage.MaskedImageF(bbox)
131 maskedImage.set(50.0, 0x0, 1)
133 # vertical sine wave along long direction
134 x = np.linspace(0, 2*3.14159, longAxis)
135 a, w = 15, 50*3.14159
136 sineWave = 20 + a*np.sin(w*x)
137 sineWave = sineWave.astype(int)
139 fullImage = np.repeat(sineWave, shortAxis).reshape((longAxis, shortAxis))
140 maskedImage.image.array += fullImage
142 # data part of the full image: (500,70)
143 dataBox = lsst.geom.Box2I(lsst.geom.Point2I(0, 0), lsst.geom.Extent2I(shortAxis-overscanWidth,
144 longAxis))
145 dataImage = afwImage.MaskedImageF(maskedImage, dataBox)
146 # these should be functionally equivalent
147 bbox = lsst.geom.Box2I(lsst.geom.Point2I(shortAxis-overscanWidth, 0),
148 lsst.geom.Point2I(shortAxis-1, longAxis-1))
149 biassec = '[1:500,71:100]'
150 overscan = afwImage.MaskedImageF(maskedImage, bbox)
151 overscan.image.array -= 50.0 # subtract initial pedestal
153 exposure = afwImage.ExposureF(maskedImage, None)
154 metadata = exposure.getMetadata()
155 metadata.setString(self.overscanKeyword, biassec)
157 ipIsr.overscanCorrection(dataImage, overscan.getImage(), **kwargs)
159 height = maskedImage.getHeight()
160 width = maskedImage.getWidth()
162 for j in range(height):
163 for i in range(width):
164 if i >= 70:
165 self.assertEqual(maskedImage.image[i, j, afwImage.LOCAL], 0.0)
166 else:
167 self.assertEqual(maskedImage.image[i, j, afwImage.LOCAL], 50.0)
169 def test_MedianPerRowOverscanCorrection(self):
170 self.checkOverscanCorrectionY(fitType="MEDIAN_PER_ROW")
171 self.checkOverscanCorrectionY(fitType="MEDIAN_PER_ROW")
172 self.checkOverscanCorrectionSineWave(fitType="MEDIAN_PER_ROW")
174 def test_MedianOverscanCorrection(self):
175 self.checkOverscanCorrectionY(fitType="MEDIAN")
176 self.checkOverscanCorrectionX(fitType="MEDIAN")
178 def checkPolyOverscanCorrectionX(self, **kwargs):
179 bbox = lsst.geom.Box2I(lsst.geom.Point2I(0, 0),
180 lsst.geom.Point2I(12, 9))
181 maskedImage = afwImage.MaskedImageF(bbox)
182 maskedImage.set(10, 0x0, 1)
184 dataBox = lsst.geom.Box2I(lsst.geom.Point2I(0, 0), lsst.geom.Extent2I(10, 10))
185 dataImage = afwImage.MaskedImageF(maskedImage, dataBox)
186 # these should be functionally equivalent
187 bbox = lsst.geom.Box2I(lsst.geom.Point2I(10, 0),
188 lsst.geom.Point2I(12, 9))
189 overscan = afwImage.MaskedImageF(maskedImage, bbox)
190 overscan.set(2, 0x0, 1)
191 for i in range(bbox.getDimensions()[1]):
192 for j, off in enumerate([-0.5, 0.0, 0.5]):
193 overscan.image[j, i, afwImage.LOCAL] = 2+i+off
195 config = ipIsr.IsrTask.ConfigClass()
196 self.updateConfigFromKwargs(config, **kwargs)
198 isrTask = ipIsr.IsrTask(config=config)
199 isrTask.overscan.run(dataImage, overscan.getImage())
201 height = maskedImage.getHeight()
202 width = maskedImage.getWidth()
203 for j in range(height):
204 for i in range(width):
205 if i == 10:
206 self.assertEqual(maskedImage.image[i, j, afwImage.LOCAL], -0.5)
207 elif i == 11:
208 self.assertEqual(maskedImage.image[i, j, afwImage.LOCAL], 0)
209 elif i == 12:
210 self.assertEqual(maskedImage.image[i, j, afwImage.LOCAL], 0.5)
211 else:
212 self.assertEqual(maskedImage.image[i, j, afwImage.LOCAL], 10 - 2 - j)
214 def checkPolyOverscanCorrectionY(self, **kwargs):
215 bbox = lsst.geom.Box2I(lsst.geom.Point2I(0, 0),
216 lsst.geom.Point2I(9, 12))
217 maskedImage = afwImage.MaskedImageF(bbox)
218 maskedImage.set(10, 0x0, 1)
220 dataBox = lsst.geom.Box2I(lsst.geom.Point2I(0, 0), lsst.geom.Extent2I(10, 10))
221 dataImage = afwImage.MaskedImageF(maskedImage, dataBox)
223 # these should be functionally equivalent
224 bbox = lsst.geom.Box2I(lsst.geom.Point2I(0, 10),
225 lsst.geom.Point2I(9, 12))
226 overscan = afwImage.MaskedImageF(maskedImage, bbox)
227 overscan.set(2, 0x0, 1)
228 for i in range(bbox.getDimensions()[0]):
229 for j, off in enumerate([-0.5, 0.0, 0.5]):
230 overscan.image[i, j, afwImage.LOCAL] = 2+i+off
232 config = ipIsr.IsrTask.ConfigClass()
233 self.updateConfigFromKwargs(config, **kwargs)
235 isrTask = ipIsr.IsrTask(config=config)
236 isrTask.overscan.run(dataImage, overscan.getImage())
238 height = maskedImage.getHeight()
239 width = maskedImage.getWidth()
240 for j in range(height):
241 for i in range(width):
242 if j == 10:
243 self.assertEqual(maskedImage.image[i, j, afwImage.LOCAL], -0.5)
244 elif j == 11:
245 self.assertEqual(maskedImage.image[i, j, afwImage.LOCAL], 0)
246 elif j == 12:
247 self.assertEqual(maskedImage.image[i, j, afwImage.LOCAL], 0.5)
248 else:
249 self.assertEqual(maskedImage.image[i, j, afwImage.LOCAL], 10 - 2 - i)
251 def testPolyOverscanCorrection(self):
252 for fitType in ("POLY", "CHEB", "LEG"):
253 self.checkPolyOverscanCorrectionX(fitType=fitType)
254 self.checkPolyOverscanCorrectionY(fitType=fitType)
256 def testSplineOverscanCorrection(self):
257 for fitType in ("NATURAL_SPLINE", "CUBIC_SPLINE", "AKIMA_SPLINE"):
258 self.checkPolyOverscanCorrectionX(fitType=fitType, order=5)
259 self.checkPolyOverscanCorrectionY(fitType=fitType, order=5)
262class MemoryTester(lsst.utils.tests.MemoryTestCase):
263 pass
266def setup_module(module):
267 lsst.utils.tests.init()
270if __name__ == "__main__": 270 ↛ 271line 270 didn't jump to line 271, because the condition on line 270 was never true
271 lsst.utils.tests.init()
272 unittest.main()