Hide keyboard shortcuts

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# 

22 

23import unittest 

24import numpy as np 

25 

26import lsst.utils.tests 

27import lsst.geom 

28import lsst.afw.image as afwImage 

29import lsst.ip.isr as ipIsr 

30 

31 

32class IsrTestCases(lsst.utils.tests.TestCase): 

33 

34 def setUp(self): 

35 self.overscanKeyword = "BIASSEC" 

36 

37 def tearDown(self): 

38 del self.overscanKeyword 

39 

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 

46 

47 order = kwargs.get('order', None) 

48 if order: 

49 config.overscan.order = order 

50 

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) 

56 

57 dataBox = lsst.geom.Box2I(lsst.geom.Point2I(0, 0), lsst.geom.Extent2I(10, 10)) 

58 dataImage = afwImage.MaskedImageF(maskedImage, dataBox) 

59 

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) 

69 

70 config = ipIsr.IsrTask.ConfigClass() 

71 self.updateConfigFromKwargs(config, **kwargs) 

72 

73 isrTask = ipIsr.IsrTask(config=config) 

74 isrTask.overscan.run(dataImage.getImage(), overscan.getImage()) 

75 

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) 

84 

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) 

90 

91 dataBox = lsst.geom.Box2I(lsst.geom.Point2I(0, 0), lsst.geom.Extent2I(10, 10)) 

92 dataImage = afwImage.MaskedImageF(maskedImage, dataBox) 

93 

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) 

100 

101 exposure = afwImage.ExposureF(maskedImage, None) 

102 metadata = exposure.getMetadata() 

103 metadata.setString(self.overscanKeyword, biassec) 

104 

105 config = ipIsr.IsrTask.ConfigClass() 

106 self.updateConfigFromKwargs(config, **kwargs) 

107 

108 isrTask = ipIsr.IsrTask(config=config) 

109 isrTask.overscan.run(dataImage, overscan.getImage()) 

110 

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) 

119 

120 def checkOverscanCorrectionSineWave(self, **kwargs): 

121 """vertical sine wave along long direction""" 

122 

123 # Full image: (500,100) 

124 longAxis = 500 

125 shortAxis = 100 

126 overscanWidth = 30 

127 

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) 

132 

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) 

138 

139 fullImage = np.repeat(sineWave, shortAxis).reshape((longAxis, shortAxis)) 

140 maskedImage.image.array += fullImage 

141 

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 

152 

153 exposure = afwImage.ExposureF(maskedImage, None) 

154 metadata = exposure.getMetadata() 

155 metadata.setString(self.overscanKeyword, biassec) 

156 

157 ipIsr.overscanCorrection(dataImage, overscan.getImage(), **kwargs) 

158 

159 height = maskedImage.getHeight() 

160 width = maskedImage.getWidth() 

161 

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) 

168 

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") 

173 

174 def test_MedianOverscanCorrection(self): 

175 self.checkOverscanCorrectionY(fitType="MEDIAN") 

176 self.checkOverscanCorrectionX(fitType="MEDIAN") 

177 

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) 

183 

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 

194 

195 config = ipIsr.IsrTask.ConfigClass() 

196 self.updateConfigFromKwargs(config, **kwargs) 

197 

198 isrTask = ipIsr.IsrTask(config=config) 

199 isrTask.overscan.run(dataImage, overscan.getImage()) 

200 

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) 

213 

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) 

219 

220 dataBox = lsst.geom.Box2I(lsst.geom.Point2I(0, 0), lsst.geom.Extent2I(10, 10)) 

221 dataImage = afwImage.MaskedImageF(maskedImage, dataBox) 

222 

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 

231 

232 config = ipIsr.IsrTask.ConfigClass() 

233 self.updateConfigFromKwargs(config, **kwargs) 

234 

235 isrTask = ipIsr.IsrTask(config=config) 

236 isrTask.overscan.run(dataImage, overscan.getImage()) 

237 

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) 

250 

251 def testPolyOverscanCorrection(self): 

252 for fitType in ("POLY", "CHEB", "LEG"): 

253 self.checkPolyOverscanCorrectionX(fitType=fitType) 

254 self.checkPolyOverscanCorrectionY(fitType=fitType) 

255 

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) 

260 

261 

262class MemoryTester(lsst.utils.tests.MemoryTestCase): 

263 pass 

264 

265 

266def setup_module(module): 

267 lsst.utils.tests.init() 

268 

269 

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()