Coverage for tests/test_gaussianPsf.py : 18%

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
# This file is part of meas_algorithms. # # Developed for the LSST Data Management System. # This product includes software developed by the LSST Project # (https://www.lsst.org). # See the COPYRIGHT file at the top-level directory of this distribution # for details of code ownership. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see <https://www.gnu.org/licenses/>.
else: import lsst.afw.display as afwDisplay afwDisplay.setDefaultMaskTransparency(75)
"""Test SingleGaussianPsf and DoubleGaussianPsf.
This test case may be extended to cover any new classes derived from KernelPsf. """ FWHM = 5 self.ksize = 25 # size of desired kernel sigma = FWHM/(2*math.sqrt(2*math.log(2))) self.psfDg = measAlg.DoubleGaussianPsf(self.ksize, self.ksize, sigma, 1, 0.1) self.psfSg = measAlg.SingleGaussianPsf(self.ksize, self.ksize, sigma)
del self.psfDg del self.psfSg
"""Test the computation of the PSF's image at a point."""
for psf in [self.psfDg, self.psfSg]: ccdXY = lsst.geom.Point2D(0, 0) kIm = psf.computeImage(ccdXY)
if False: afwDisplay.Display(frame=1).mtv(kIm, title=self._testMethodName + ": kIm")
self.assertEqual(kIm.getWidth(), self.ksize) kIm = psf.computeImage(ccdXY) self.assertAlmostEqual(afwMath.makeStatistics(kIm, afwMath.SUM).getValue(), 1.0)
"""Test the computation of the PSF's image at a point. """ ccdXY = lsst.geom.Point2D(0, 0) for psf in [self.psfDg, self.psfSg]: kIm = psf.computeImage(ccdXY) self.assertEqual(kIm.getWidth(), self.ksize) self.assertAlmostEqual(afwMath.makeStatistics(kIm, afwMath.SUM).getValue(), 1.0)
"""Test the creation of the dgPsf's kernel. """ for psf in [self.psfDg, self.psfSg]: kIm = afwImage.ImageD(psf.getKernel().getDimensions()) psf.getKernel().computeImage(kIm, False)
self.assertEqual(kIm.getWidth(), self.ksize) self.assertAlmostEqual(afwMath.makeStatistics(kIm, afwMath.SUM).getValue(), 1.0)
if False: afwDisplay.Display(frame=2).mtv(kIm, title=self._testMethodName + ": kIm")
"""Test parameters of dgPsfs, both valid and not. """ sigma1, sigma2, b = 1, 0, 0 # sigma2 may be 0 iff b == 0 measAlg.DoubleGaussianPsf(self.ksize, self.ksize, sigma1, sigma2, b)
def badSigma1(): sigma1 = 0 measAlg.DoubleGaussianPsf(self.ksize, self.ksize, sigma1, sigma2, b)
with self.assertRaises(pexExceptions.DomainError): badSigma1()
def badSigma2(): sigma2, b = 0, 1 measAlg.DoubleGaussianPsf(self.ksize, self.ksize, sigma1, sigma2, b)
with self.assertRaises(pexExceptions.DomainError): badSigma2()
"""Test parameters of sgPsfs, both valid and not. """ sigma = 1. measAlg.SingleGaussianPsf(self.ksize, self.ksize, sigma)
def badSigma1(): sigma = 0 measAlg.SingleGaussianPsf(self.ksize, self.ksize, sigma)
with self.assertRaises(pexExceptions.DomainError): badSigma1()
"""Test returning a realisation of the dgPsf. """ for psf in [self.psfSg, self.psfDg]: xcen = psf.getKernel().getWidth()//2 ycen = psf.getKernel().getHeight()//2
stamps = [] trueCenters = [] for x, y in ([10, 10], [9.4999, 10.4999], [10.5001, 10.5001]): fx, fy = x - int(x), y - int(y) if fx >= 0.5: fx -= 1.0 if fy >= 0.5: fy -= 1.0
im = psf.computeImage(lsst.geom.Point2D(x, y)).convertF()
stamps.append(im.Factory(im, True)) trueCenters.append([xcen + fx, ycen + fy])
if display: mos = afwDisplay.utils.Mosaic() # control mosaics disp = afwDisplay.Display(frame=0) disp.mtv(mos.makeMosaic(stamps), title=self._testMethodName + ": mosaic")
for i in range(len(trueCenters)): bbox = mos.getBBox(i)
disp.dot("+", bbox.getMinX() + xcen, bbox.getMinY() + ycen, ctype=afwDisplay.RED, size=1) disp.dot("+", bbox.getMinX() + trueCenters[i][0], bbox.getMinY() + trueCenters[i][1])
disp.dot("%.2f, %.2f" % (trueCenters[i][0], trueCenters[i][1]), bbox.getMinX() + xcen, bbox.getMinY() + 2)
"""Test creating a Psf from a Kernel. """ x, y = 10.4999, 10.4999 ksize = 15 sigma1 = 1 # # Make a PSF from that kernel # kPsf = measAlg.KernelPsf(afwMath.AnalyticKernel(ksize, ksize, afwMath.GaussianFunction2D(sigma1, sigma1)))
kIm = kPsf.computeImage(lsst.geom.Point2D(x, y)) # # And now via the dgPsf model # dgPsf = measAlg.DoubleGaussianPsf(ksize, ksize, sigma1) dgIm = dgPsf.computeImage(lsst.geom.Point2D(x, y)) # # Check that they're the same # diff = type(kIm)(kIm, True) diff -= dgIm stats = afwMath.makeStatistics(diff, afwMath.MAX | afwMath.MIN) self.assertAlmostEqual(stats.getValue(afwMath.MAX), 0.0, places=16) self.assertAlmostEqual(stats.getValue(afwMath.MIN), 0.0, places=16)
for pad in [-2, 4, 0]: resizedKPsf = kPsf.resized(ksize + pad, ksize + pad) self.assertEqual(resizedKPsf.computeBBox().getDimensions(), lsst.geom.Extent2I(ksize + pad, ksize + pad)) self.assertEqual(resizedKPsf.getKernel().getKernelParameters(), kPsf.getKernel().getKernelParameters()) self._compareKernelImages(kPsf, resizedKPsf) if display: mos = afwDisplay.utils.Mosaic() mos.setBackground(-0.1) afwDisplay.Display(frame=1).mtv(mos.makeMosaic([kIm, dgIm, diff], mode="x"), title=self._testMethodName + ": mosaic")
"""Test that resized Single and Double Gaussian PSFs have same model parameters, but new kernel dimensions. """
for lengthNew in [1, 11, 99]: # Test Double Gaussian psfResized = self.psfDg.resized(lengthNew, lengthNew) self.assertEqual(psfResized.getSigma1(), self.psfDg.getSigma1()) self.assertEqual(psfResized.getSigma2(), self.psfDg.getSigma2()) self.assertEqual(psfResized.getB(), self.psfDg.getB()) self._compareKernelImages(psfResized, self.psfDg)
self.assertEqual(psfResized.getKernel().getWidth(), lengthNew) self.assertEqual(psfResized.getKernel().getHeight(), lengthNew)
# Test Single Gaussian Parameters psfResized = self.psfSg.resized(lengthNew, lengthNew) self.assertEqual(psfResized.getSigma(), self.psfSg.getSigma()) self._compareKernelImages(psfResized, self.psfSg)
self.assertEqual(psfResized.getKernel().getWidth(), lengthNew) self.assertEqual(psfResized.getKernel().getHeight(), lengthNew)
"""Test that overlapping portions of kernel images are identical. """ im1 = psf1.computeKernelImage() im2 = psf2.computeKernelImage() bboxIntersection = im1.getBBox() bboxIntersection.clip(im2.getBBox()) im1Intersection = afwImage.ImageD(im1, bboxIntersection) im2Intersection = afwImage.ImageD(im2, bboxIntersection) scale1 = im1.getArray().sum()/im1Intersection.getArray().sum() scale2 = im2.getArray().sum()/im2Intersection.getArray().sum() im1Arr = scale1*im1Intersection.getArray() im2Arr = scale2*im2Intersection.getArray() self.assertTrue(np.allclose(im1Arr, im2Arr), "kernel images %s, %s do not match" % (im1Arr, im2Arr))
"""Test that computeBBox returns same bbox as kernel. """ for psf in [self.psfDg, self.psfSg]: self.assertEqual(psf.computeBBox(), psf.getKernel().getBBox())
lsst.utils.tests.init()
lsst.utils.tests.init() unittest.main() |