24 Test utility code for shapelets library; here so it can be used
25 in multiple test scripts and tests in downstream packages.
27 from __future__
import absolute_import, division, print_function
28 from builtins
import zip
29 from builtins
import range
37 import lsst.utils.tests
39 import lsst.afw.geom.ellipses
46 v = numpy.zeros(n, dtype=float)
52 z = numpy.zeros((y.size, x.size), dtype=float)
53 e = function.evaluate()
54 for i, py
in enumerate(y):
55 for j, px
in enumerate(x):
56 z[i, j] = e(float(px), float(py))
61 center = lsst.afw.geom.Point2D()
63 center = lsst.afw.geom.Point2D(numpy.random.randn(), numpy.random.randn())
65 ellipse = lsst.afw.geom.ellipses.Ellipse(
66 lsst.afw.geom.ellipses.Axes(
67 float(numpy.random.uniform(low=1, high=2)),
68 float(numpy.random.uniform(low=1, high=2)),
69 float(numpy.random.uniform(low=0, high=numpy.pi))
75 result.setEllipse(ellipse)
76 result.getEllipse().scale(scale)
82 for n
in range(nComponents):
83 components.append(ShapeletTestCase.makeRandomShapeletFunction(ellipse=ellipse))
87 atolEllipse=1E-14, atolCoeff=1E-14):
88 self.assertEqual(a.getOrder(), b.getOrder())
89 self.assertEqual(a.getBasisType(), b.getBasisType())
90 self.assertFloatsAlmostEqual(a.getEllipse().getParameterVector(),
91 b.getEllipse().getParameterVector(),
92 rtol=rtolEllipse, atol=atolEllipse)
93 self.assertFloatsAlmostEqual(a.getCoefficients(), b.getCoefficients(),
94 rtol=rtolCoeff, atol=atolCoeff)
98 for s
in msf.getComponents():
99 if not numpy.allclose(s.getCoefficients(), 0.0):
100 params = tuple(s.getEllipse().getParameterVector()) + tuple(s.getCoefficients())
101 keep.append((params, s))
103 keep.sort(key=
lambda t: t[0])
104 for params, s
in keep:
109 atolEllipse=1E-14, atolCoeff=1E-14):
113 self.assertEqual(len(a.getComponents()), len(b.getComponents()))
114 for sa, sb
in zip(a.getComponents(), b.getComponents()):
116 atolEllipse=atolEllipse, atolCoeff=atolCoeff)
119 gx, gy = numpy.meshgrid(x, y)
121 dipole = lsst.afw.geom.Point2D((gx * z).sum() / m, (gy * z).sum() / m)
124 quadrupole = lsst.afw.geom.ellipses.Quadrupole(
125 (gx**2 * z).sum() / m,
126 (gy**2 * z).sum() / m,
127 (gx * gy * z).sum() / m
129 imageMoments = lsst.afw.geom.ellipses.Ellipse(quadrupole, dipole)
130 shapeletMoments = function.evaluate().computeMoments()
131 self.assertFloatsAlmostEqual(imageMoments.getCenter().getX(),
132 shapeletMoments.getCenter().getX(), rtol=1E-3)
133 self.assertFloatsAlmostEqual(imageMoments.getCenter().getY(),
134 shapeletMoments.getCenter().getY(), rtol=1E-3)
135 self.assertFloatsAlmostEqual(imageMoments.getCore().getIxx(),
136 shapeletMoments.getCore().getIxx(), rtol=1E-3)
137 self.assertFloatsAlmostEqual(imageMoments.getCore().getIyy(),
138 shapeletMoments.getCore().getIyy(), rtol=1E-3)
139 self.assertFloatsAlmostEqual(imageMoments.getCore().getIxy(),
140 shapeletMoments.getCore().getIxy(), rtol=1E-3)
141 integral = numpy.trapz(numpy.trapz(z, gx, axis=1), y, axis=0)
142 self.assertFloatsAlmostEqual(integral, function.evaluate().integrate(), rtol=1E-3)
145 bbox = lsst.afw.geom.Box2I(lsst.afw.geom.Point2I(-50, -50), lsst.afw.geom.Point2I(50, 50))
146 i1 = lsst.afw.image.ImageD(bbox)
147 f1.evaluate().addToImage(i1)
148 self.assertFloatsAlmostEqual(i1.getArray().sum(), f1.evaluate().integrate(), rtol=1E-3)
149 i2 = lsst.afw.image.ImageD(bbox)
150 f2.evaluate().addToImage(i2)
151 self.assertFloatsAlmostEqual(i2.getArray().sum(), f2.evaluate().integrate(), rtol=1E-3)
152 fc1 = f1.convolve(f2)
153 fc2 = f2.convolve(f1)
154 ic1 = lsst.afw.image.ImageD(bbox)
155 fc1.evaluate().addToImage(ic1)
156 ic2 = lsst.afw.image.ImageD(bbox)
157 fc2.evaluate().addToImage(ic2)
158 self.assertFloatsAlmostEqual(ic1.getArray(), ic2.getArray())
159 out = lsst.afw.image.ImageD(bbox)
161 print(
"Skipping convolution test; scipy could not be imported.")
167 scipy.ndimage.convolve(i1.getArray(), i2.getArray(), output=out.getArray(),
168 mode=
"constant", cval=0.0)
169 self.assertFloatsAlmostEqual(out.getArray(), ic1.getArray(), rtol=1E-4, atol=1E-5)
170 self.assertFloatsAlmostEqual(out.getArray(), ic2.getArray(), rtol=1E-4, atol=1E-5)
int computeSize(int order)
Return the size of the coefficient vector for the given order.
def simplifyMultiShapeletFunction
def makeRandomMultiShapeletFunction
A multi-scale shapelet function.
def makeRandomShapeletFunction
def compareMultiShapeletFunctions
def compareShapeletFunctions
A 2-d function defined by an expansion onto a Gauss-Laguerre or Gauss-Hermite basis.