Coverage for tests/test_buildSpatialKernelVisitor.py: 17%
111 statements
« prev ^ index » next coverage.py v6.5.0, created at 2022-12-23 02:18 -0800
« prev ^ index » next coverage.py v6.5.0, created at 2022-12-23 02:18 -0800
1import unittest
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
11logUtils.trace_set_at("lsst.ip.diffim", 4)
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
19class DiffimTestCases(unittest.TestCase):
21 def setUp(self):
22 self.config = ipDiffim.ImagePsfMatchTask.ConfigClass()
23 self.config.kernel.name = "AL"
24 self.subconfig = self.config.kernel.active
26 self.ps = pexConfig.makePropertySet(self.subconfig)
27 self.size = 51
29 def tearDown(self):
30 del self.ps
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
42 def testNoBg(self):
43 self.runNoBg(0)
44 self.runNoBg(1)
45 self.runNoBg(2)
47 def runNoBg(self, sko):
48 basisList = ipDiffim.makeKernelBasisList(self.subconfig)
49 self.ps['spatialKernelOrder'] = sko
50 self.ps['fitForBackground'] = False
52 bbox = geom.Box2I(geom.Point2I(0, 0),
53 geom.Extent2I(self.size*10, self.size*10))
55 bsikv = ipDiffim.BuildSingleKernelVisitorF(basisList, self.ps)
56 bspkv = ipDiffim.BuildSpatialKernelVisitorF(basisList, bbox, self.ps)
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)
64 bspkv.solveLinearEquation()
65 sk, sb = bspkv.getSolutionPair()
67 # Kernel
68 if sko == 0:
69 # Specialization for speedup
70 spatialKernelSolution = sk.getKernelParameters()
72 # One term for each basis function
73 self.assertEqual(len(spatialKernelSolution), len(basisList))
75 else:
76 spatialKernelSolution = sk.getSpatialParameters()
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)
88 # Background
89 spatialBgSolution = sb.getParameters()
90 nBgTerms = 1
91 self.assertEqual(len(spatialBgSolution), nBgTerms)
93 def testModelType(self):
94 bbox = geom.Box2I(geom.Point2I(10, 10),
95 geom.Extent2I(10, 10))
96 basisList = ipDiffim.makeKernelBasisList(self.subconfig)
98 self.ps["spatialModelType"] = "polynomial"
99 ipDiffim.BuildSpatialKernelVisitorF(basisList, bbox, self.ps)
101 self.ps["spatialModelType"] = "chebyshev1"
102 ipDiffim.BuildSpatialKernelVisitorF(basisList, bbox, self.ps)
104 try:
105 self.ps["spatialModelType"] = "foo"
106 ipDiffim.BuildSpatialKernelVisitorF(basisList, bbox, self.ps)
107 except Exception:
108 pass
109 else:
110 self.fail()
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)
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
125 bbox = geom.Box2I(geom.Point2I(0, 0),
126 geom.Extent2I(self.size*10, self.size*10))
128 bsikv = ipDiffim.BuildSingleKernelVisitorF(basisList, self.ps)
129 bspkv = ipDiffim.BuildSpatialKernelVisitorF(basisList, bbox, self.ps)
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)
137 bspkv.solveLinearEquation()
138 sk, sb = bspkv.getSolutionPair()
140 # Kernel
141 if sko == 0:
142 # Specialization for speedup
143 spatialKernelSolution = sk.getKernelParameters()
145 # One term for each basis function
146 self.assertEqual(len(spatialKernelSolution), len(basisList))
148 else:
149 spatialKernelSolution = sk.getSpatialParameters()
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)
161 # Background
162 spatialBgSolution = sb.getParameters()
163 nBgTerms = int(0.5 * (bgo + 1) * (bgo + 2))
164 self.assertEqual(len(spatialBgSolution), nBgTerms)
167#####
169class TestMemory(lsst.utils.tests.MemoryTestCase):
170 pass
173def setup_module(module):
174 lsst.utils.tests.init()
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()