Coverage for tests/test_biasAndDarkCorrection.py: 17%
106 statements
« prev ^ index » next coverage.py v7.2.1, created at 2023-03-12 21:22 -0700
« prev ^ index » next coverage.py v7.2.1, created at 2023-03-12 21:22 -0700
1#
2# LSST Data Management System
3# Copyright 2008-2017 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
25import lsst.utils.tests
26import lsst.geom
27import lsst.afw.image as afwImage
28import lsst.ip.isr as ipIsr
31class IsrTestCases(unittest.TestCase):
33 def setUp(self):
34 self.pmin = lsst.geom.Point2I(1, 1)
35 self.pmax = lsst.geom.Point2I(10, 10)
36 self.meanCountsKeyword = "IMMODE"
37 self.filenameKeyword = "filename"
39 def tearDown(self):
40 del self.pmin
41 del self.pmax
42 del self.meanCountsKeyword
43 del self.filenameKeyword
45 def testBias(self):
46 maskedImage = afwImage.MaskedImageF(lsst.geom.Box2I(self.pmin, self.pmax))
47 maskedImage.getImage().set(10)
49 bias = afwImage.MaskedImageF(lsst.geom.Box2I(self.pmin, self.pmax))
50 bias.getImage().set(1)
51 biasexposure = afwImage.ExposureF(bias, None)
52 bmetadata = biasexposure.getMetadata()
53 bmetadata.setDouble(self.meanCountsKeyword, 1.)
54 bmetadata.setString(self.filenameKeyword, 'Unittest Bias')
56 ipIsr.biasCorrection(maskedImage, biasexposure.getMaskedImage())
58 height = maskedImage.getHeight()
59 width = maskedImage.getWidth()
60 for j in range(height):
61 for i in range(width):
62 self.assertEqual(maskedImage.image[i, j, afwImage.LOCAL], 9)
64 def doDark(self, scaling):
65 maskedImage = afwImage.MaskedImageF(lsst.geom.Box2I(self.pmin, self.pmax))
66 maskedImage.getImage().set(10)
68 dark = afwImage.MaskedImageF(lsst.geom.Box2I(self.pmin, self.pmax))
69 dark.getImage().set(1)
70 darkexposure = afwImage.ExposureF(dark, None)
71 dmetadata = darkexposure.getMetadata()
72 dmetadata.setString(self.filenameKeyword, 'Unittest Dark')
74 ipIsr.darkCorrection(maskedImage, darkexposure.getMaskedImage(), 1., scaling)
76 height = maskedImage.getHeight()
77 width = maskedImage.getWidth()
78 for j in range(height):
79 for i in range(width):
80 self.assertAlmostEqual(maskedImage.image[i, j, afwImage.LOCAL], 10 - 1./scaling, 5)
82 def testDark1(self):
83 self.doDark(scaling=10)
85 def testDark2(self):
86 self.doDark(scaling=0.1)
88 def testDark3(self):
89 self.doDark(scaling=3.7)
91 def testDarkWithDarktime(self):
92 darkTime = 128.0
93 nan = float("NAN")
95 exp = afwImage.ExposureF(1, 1)
96 exp.getMaskedImage().getImage().set(1.0)
97 exp.getMaskedImage().getMask().set(0)
98 exp.getMaskedImage().getVariance().set(1.0)
100 dark = afwImage.ExposureF(1, 1)
101 dark.getMaskedImage().getImage().set(1.0/darkTime)
102 dark.getMaskedImage().getMask().set(0)
103 dark.getMaskedImage().getVariance().set(0.0)
104 dark.getInfo().setVisitInfo(afwImage.VisitInfo())
106 task = ipIsr.IsrTask()
108 # No darktime set in at least one of the inputs
109 exp.getInfo().setVisitInfo(afwImage.VisitInfo(darkTime=nan))
110 dark.getInfo().setVisitInfo(afwImage.VisitInfo(darkTime=nan))
111 with self.assertRaises(RuntimeError):
112 task.darkCorrection(exp, dark)
113 exp.getInfo().setVisitInfo(afwImage.VisitInfo(darkTime=nan))
114 dark.getInfo().setVisitInfo(afwImage.VisitInfo(darkTime=1.0))
115 with self.assertRaises(RuntimeError):
116 task.darkCorrection(exp, dark)
118 # With darktime set
119 exp.getInfo().setVisitInfo(afwImage.VisitInfo(darkTime=darkTime))
120 dark.getInfo().setVisitInfo(afwImage.VisitInfo(darkTime=1.0))
121 task.darkCorrection(exp, dark)
123 self.assertEqual(exp.image[0, 0, afwImage.LOCAL], 0.0)
124 self.assertEqual(exp.mask[0, 0, afwImage.LOCAL], 0)
125 self.assertEqual(exp.variance[0, 0, afwImage.LOCAL], 1.0)
126 self.assertEqual(exp.getInfo().getVisitInfo().getDarkTime(), darkTime) # Hasn't been modified
128 def testDarkWithDarktimeNan(self):
129 darkTime = 128.0
130 nan = float("NAN")
132 exp = afwImage.ExposureF(1, 1)
133 exp.getMaskedImage().getImage().set(1.0)
134 exp.getMaskedImage().getMask().set(0)
135 exp.getMaskedImage().getVariance().set(1.0)
137 dark = afwImage.ExposureF(1, 1)
138 dark.getMaskedImage().getImage().set(1.0/darkTime)
139 dark.getMaskedImage().getMask().set(0)
140 dark.getMaskedImage().getVariance().set(0.0)
141 dark.getInfo().setVisitInfo(afwImage.VisitInfo())
143 task = ipIsr.IsrTask()
145 # scale with darkScale=1 if the dark has darkTime=NaN.
146 exp.getInfo().setVisitInfo(afwImage.VisitInfo(darkTime=darkTime))
147 dark.getInfo().setVisitInfo(afwImage.VisitInfo(darkTime=nan))
148 task.darkCorrection(exp, dark)
150 self.assertEqual(exp.image[0, 0, afwImage.LOCAL], 0.0)
151 self.assertEqual(exp.mask[0, 0, afwImage.LOCAL], 0)
152 self.assertEqual(exp.variance[0, 0, afwImage.LOCAL], 1.0)
153 self.assertEqual(exp.getInfo().getVisitInfo().getDarkTime(), darkTime) # Hasn't been modified
156class MemoryTester(lsst.utils.tests.MemoryTestCase):
157 pass
160def setup_module(module):
161 lsst.utils.tests.init()
164if __name__ == "__main__": 164 ↛ 165line 164 didn't jump to line 165, because the condition on line 164 was never true
165 lsst.utils.tests.init()
166 unittest.main()