Coverage for tests/test_buildSpatialKernelVisitor.py: 17%

111 statements  

« prev     ^ index     » next       coverage.py v6.5.0, created at 2023-02-12 11:24 +0000

1import unittest 

2 

3 

4import lsst.utils.tests 

5import lsst.afw.image as afwImage 

6import lsst.geom as geom 

7import lsst.ip.diffim as ipDiffim 

8import lsst.utils.logging as logUtils 

9import lsst.pex.config as pexConfig 

10 

11logUtils.trace_set_at("lsst.ip.diffim", 4) 

12 

13# This tests the basics of the BuildSpatialKernelVisitor. E.g. that 

14# it makes the right size solution. For more complex behaviors such 

15# as reducing a delta function basis set into a Pca basis set, look at 

16# FitSpatialKernelFromCandidates.py 

17 

18 

19class DiffimTestCases(unittest.TestCase): 

20 

21 def setUp(self): 

22 self.config = ipDiffim.ImagePsfMatchTask.ConfigClass() 

23 self.config.kernel.name = "AL" 

24 self.subconfig = self.config.kernel.active 

25 

26 self.ps = pexConfig.makePropertySet(self.subconfig) 

27 self.size = 51 

28 

29 def tearDown(self): 

30 del self.ps 

31 

32 def makeCandidate(self, kSum, x, y): 

33 mi1 = afwImage.MaskedImageF(geom.Extent2I(self.size, self.size)) 

34 mi1.getVariance().set(1.0) # avoid NaNs 

35 mi1[self.size//2, self.size//2, afwImage.LOCAL] = (1, 0x0, 1) 

36 mi2 = afwImage.MaskedImageF(geom.Extent2I(self.size, self.size)) 

37 mi2.getVariance().set(1.0) # avoid NaNs 

38 mi2[self.size//2, self.size//2, afwImage.LOCAL] = (kSum, 0x0, kSum) 

39 kc = ipDiffim.makeKernelCandidate(x, y, mi1, mi2, self.ps) 

40 return kc 

41 

42 def testNoBg(self): 

43 self.runNoBg(0) 

44 self.runNoBg(1) 

45 self.runNoBg(2) 

46 

47 def runNoBg(self, sko): 

48 basisList = ipDiffim.makeKernelBasisList(self.subconfig) 

49 self.ps['spatialKernelOrder'] = sko 

50 self.ps['fitForBackground'] = False 

51 

52 bbox = geom.Box2I(geom.Point2I(0, 0), 

53 geom.Extent2I(self.size*10, self.size*10)) 

54 

55 bsikv = ipDiffim.BuildSingleKernelVisitorF(basisList, self.ps) 

56 bspkv = ipDiffim.BuildSpatialKernelVisitorF(basisList, bbox, self.ps) 

57 

58 for x in range(1, self.size, 10): 

59 for y in range(1, self.size, 10): 

60 cand = self.makeCandidate(1.0, x, y) 

61 bsikv.processCandidate(cand) 

62 bspkv.processCandidate(cand) 

63 

64 bspkv.solveLinearEquation() 

65 sk, sb = bspkv.getSolutionPair() 

66 

67 # Kernel 

68 if sko == 0: 

69 # Specialization for speedup 

70 spatialKernelSolution = sk.getKernelParameters() 

71 

72 # One term for each basis function 

73 self.assertEqual(len(spatialKernelSolution), len(basisList)) 

74 

75 else: 

76 spatialKernelSolution = sk.getSpatialParameters() 

77 

78 nSpatialTerms = int(0.5 * (sko + 1) * (sko + 2)) 

79 # One model for each basis function 

80 self.assertEqual(len(spatialKernelSolution), len(basisList)) 

81 # First basis has no spatial variation 

82 for i in range(1, nSpatialTerms): 

83 self.assertEqual(spatialKernelSolution[0][i], 0.) 

84 # All bases have correct number of terms 

85 for i in range(len(spatialKernelSolution)): 

86 self.assertEqual(len(spatialKernelSolution[i]), nSpatialTerms) 

87 

88 # Background 

89 spatialBgSolution = sb.getParameters() 

90 nBgTerms = 1 

91 self.assertEqual(len(spatialBgSolution), nBgTerms) 

92 

93 def testModelType(self): 

94 bbox = geom.Box2I(geom.Point2I(10, 10), 

95 geom.Extent2I(10, 10)) 

96 basisList = ipDiffim.makeKernelBasisList(self.subconfig) 

97 

98 self.ps["spatialModelType"] = "polynomial" 

99 ipDiffim.BuildSpatialKernelVisitorF(basisList, bbox, self.ps) 

100 

101 self.ps["spatialModelType"] = "chebyshev1" 

102 ipDiffim.BuildSpatialKernelVisitorF(basisList, bbox, self.ps) 

103 

104 try: 

105 self.ps["spatialModelType"] = "foo" 

106 ipDiffim.BuildSpatialKernelVisitorF(basisList, bbox, self.ps) 

107 except Exception: 

108 pass 

109 else: 

110 self.fail() 

111 

112 def testAlSpatialModel(self): 

113 self.runAlSpatialModel(0, 0) 

114 self.runAlSpatialModel(1, 0) 

115 self.runAlSpatialModel(0, 1) 

116 self.runAlSpatialModel(1, 1) 

117 self.runAlSpatialModel(2, 2) 

118 

119 def runAlSpatialModel(self, sko, bgo): 

120 basisList = ipDiffim.makeKernelBasisList(self.subconfig) 

121 self.ps['spatialKernelOrder'] = sko 

122 self.ps['spatialBgOrder'] = bgo 

123 self.ps['fitForBackground'] = True 

124 

125 bbox = geom.Box2I(geom.Point2I(0, 0), 

126 geom.Extent2I(self.size*10, self.size*10)) 

127 

128 bsikv = ipDiffim.BuildSingleKernelVisitorF(basisList, self.ps) 

129 bspkv = ipDiffim.BuildSpatialKernelVisitorF(basisList, bbox, self.ps) 

130 

131 for x in range(1, self.size, 10): 

132 for y in range(1, self.size, 10): 

133 cand = self.makeCandidate(1.0, x, y) 

134 bsikv.processCandidate(cand) 

135 bspkv.processCandidate(cand) 

136 

137 bspkv.solveLinearEquation() 

138 sk, sb = bspkv.getSolutionPair() 

139 

140 # Kernel 

141 if sko == 0: 

142 # Specialization for speedup 

143 spatialKernelSolution = sk.getKernelParameters() 

144 

145 # One term for each basis function 

146 self.assertEqual(len(spatialKernelSolution), len(basisList)) 

147 

148 else: 

149 spatialKernelSolution = sk.getSpatialParameters() 

150 

151 nSpatialTerms = int(0.5 * (sko + 1) * (sko + 2)) 

152 # One model for each basis function 

153 self.assertEqual(len(spatialKernelSolution), len(basisList)) 

154 # First basis has no spatial variation 

155 for i in range(1, nSpatialTerms): 

156 self.assertEqual(spatialKernelSolution[0][i], 0.) 

157 # All bases have correct number of terms 

158 for i in range(len(spatialKernelSolution)): 

159 self.assertEqual(len(spatialKernelSolution[i]), nSpatialTerms) 

160 

161 # Background 

162 spatialBgSolution = sb.getParameters() 

163 nBgTerms = int(0.5 * (bgo + 1) * (bgo + 2)) 

164 self.assertEqual(len(spatialBgSolution), nBgTerms) 

165 

166 

167##### 

168 

169class TestMemory(lsst.utils.tests.MemoryTestCase): 

170 pass 

171 

172 

173def setup_module(module): 

174 lsst.utils.tests.init() 

175 

176 

177if __name__ == "__main__": 177 ↛ 178line 177 didn't jump to line 178, because the condition on line 177 was never true

178 lsst.utils.tests.init() 

179 unittest.main()