Exemple #1
0
    def testEigenValues(self):
        kc1 = self.makeCandidate(1, 0.0, 0.0)
        kc1.build(self.kList)

        kc2 = self.makeCandidate(2, 0.0, 0.0)
        kc2.build(self.kList)

        kc3 = self.makeCandidate(3, 0.0, 0.0)
        kc3.build(self.kList)

        imagePca = ipDiffim.KernelPcaD()
        kpv = ipDiffim.KernelPcaVisitorF(imagePca)
        kpv.processCandidate(kc1)
        kpv.processCandidate(kc2)
        kpv.processCandidate(kc3)

        imagePca.analyze()
        eigenImages = imagePca.getEigenImages()
        eigenValues = imagePca.getEigenValues()

        # took in 3 images
        self.assertEqual(len(eigenImages), 3)
        self.assertEqual(len(eigenValues), 3)

        # all the same shape, only 1 eigenvalue
        self.assertAlmostEqual(eigenValues[0], 1.0)
        self.assertAlmostEqual(eigenValues[1], 0.0)
        self.assertAlmostEqual(eigenValues[2], 0.0)
    def testRejection(self):
        # we need to construct a candidate whose shape does not
        # match the underlying basis
        #
        # so lets just make a kernel list with all the power in
        # the center, but the candidate requires some off center
        # power
        kc1 = self.makeCandidate(1, 0.0, 0.0)
        kc2 = self.makeCandidate(2, 0.0, 0.0)
        kc3 = self.makeCandidate(3, 0.0, 0.0)
        bskv1 = ipDiffim.BuildSingleKernelVisitorF(self.kList, self.ps)
        bskv1.processCandidate(kc1)
        bskv1.processCandidate(kc2)
        bskv1.processCandidate(kc3)

        imagePca = ipDiffim.KernelPcaD()
        kpv = ipDiffim.KernelPcaVisitorF(imagePca)
        kpv.processCandidate(kc1)
        kpv.processCandidate(kc2)
        kpv.processCandidate(kc3)
        kpv.subtractMean()
        imagePca.analyze()
        eigenKernels = []
        eigenKernels.append(kpv.getEigenKernels()[0])
        self.assertEqual(len(eigenKernels), 1)

        # bogus candidate
        mi1 = afwImage.MaskedImageF(geom.Extent2I(self.size, self.size))
        mi1.getVariance().set(0.1)
        mi1[self.size // 2, self.size // 2, afwImage.LOCAL] = (1, 0x0, 1)
        mi2 = afwImage.MaskedImageF(geom.Extent2I(self.size, self.size))
        mi2.getVariance().set(0.1)
        # make it high enough to make the mean resids large
        mi2[self.size // 3, self.size // 3,
            afwImage.LOCAL] = (self.size**2, 0x0, 1)
        kc4 = ipDiffim.makeKernelCandidate(0, 0, mi1, mi2, self.ps)
        self.assertEqual(kc4.getStatus(), afwMath.SpatialCellCandidate.UNKNOWN)

        # process with eigenKernels
        bskv2 = ipDiffim.BuildSingleKernelVisitorF(eigenKernels, self.ps)
        bskv2.setSkipBuilt(False)
        bskv2.processCandidate(kc1)
        bskv2.processCandidate(kc2)
        bskv2.processCandidate(kc3)
        bskv2.processCandidate(kc4)

        self.assertEqual(bskv2.getNProcessed(), 4)
        self.assertEqual(bskv2.getNRejected(), 1)

        self.assertEqual(kc1.getStatus(), afwMath.SpatialCellCandidate.GOOD)
        self.assertEqual(kc2.getStatus(), afwMath.SpatialCellCandidate.GOOD)
        self.assertEqual(kc3.getStatus(), afwMath.SpatialCellCandidate.GOOD)
        self.assertEqual(kc4.getStatus(), afwMath.SpatialCellCandidate.BAD)
Exemple #3
0
    def testMeanSubtraction(self):
        kc1 = self.makeCandidate(1, 0.0, 0.0)
        kc1.build(self.kList)

        kc2 = self.makeCandidate(2, 0.0, 0.0)
        kc2.build(self.kList)

        kc3 = self.makeCandidate(3, 0.0, 0.0)
        kc3.build(self.kList)

        imagePca = ipDiffim.KernelPcaD()
        kpv = ipDiffim.KernelPcaVisitorF(imagePca)
        kpv.processCandidate(kc1)
        kpv.processCandidate(kc2)
        kpv.processCandidate(kc3)
        kpv.subtractMean()  # subtract it *from* imagePca

        imagePca.analyze()
        eigenImages = imagePca.getEigenImages()
        eigenValues = imagePca.getEigenValues()

        # took in 3 images
        self.assertEqual(len(eigenImages), 3)
        self.assertEqual(len(eigenValues), 3)

        # all the same shape, mean subtracted, so *no* eigenvalues
        self.assertAlmostEqual(eigenValues[0], 0.0)
        self.assertAlmostEqual(eigenValues[1], 0.0)
        self.assertAlmostEqual(eigenValues[2], 0.0)

        # finally, since imagePca normalizes by the sum, this should
        # have central pixel value 1.0 and the rest 0.0
        imageMean = kpv.returnMean()
        rows = imageMean.getHeight()
        cols = imageMean.getWidth()
        for y in range(rows):
            for x in range(cols):
                if x == cols // 2 and y == rows // 2:
                    self.assertAlmostEqual(imageMean[x, y, afwImage.LOCAL],
                                           1.0)
                else:
                    self.assertAlmostEqual(imageMean[x, y, afwImage.LOCAL],
                                           0.0)
Exemple #4
0
    def testImagePca(self):
        # Test out the ImagePca behavior
        kc1 = self.makeCandidate(1, 0.0, 0.0)
        kc1.build(self.kList)
        kc2 = self.makeCandidate(2, 0.0, 0.0)
        kc2.build(self.kList)
        kc3 = self.makeCandidate(3, 0.0, 0.0)
        kc3.build(self.kList)

        imagePca = ipDiffim.KernelPcaD()
        kpv = ipDiffim.KernelPcaVisitorF(imagePca)
        kpv.processCandidate(kc1)
        kpv.processCandidate(kc2)
        kpv.processCandidate(kc3)

        imagePca.analyze()
        eigenImages = imagePca.getEigenImages()
        # NOTE : this needs to be changed once ticket #1649 is resolved
        for i in range(len(eigenImages)):
            for j in range(i, len(eigenImages)):
                print i, j, afwImage.innerProduct(eigenImages[i], eigenImages[j])
Exemple #5
0
    def testVisit(self, nCell = 3):
        imagePca = ipDiffim.KernelPcaD()
        kpv = ipDiffim.makeKernelPcaVisitor(imagePca)

        sizeCellX = self.policy.get("sizeCellX")
        sizeCellY = self.policy.get("sizeCellY")
        
        kernelCellSet = afwMath.SpatialCellSet(afwGeom.Box2I(afwGeom.Point2I(0,
                                                                             0),
                                                             afwGeom.Extent2I(sizeCellX * nCell,
                                                                              sizeCellY * nCell)),
                                               sizeCellX,
                                               sizeCellY)
        
        for candX in range(nCell):
            for candY in range(nCell):
                if candX == nCell // 2 and candY == nCell // 2:
                    kc = self.makeCandidate(100.0,
                                            candX * sizeCellX + sizeCellX // 2,
                                            candY * sizeCellY + sizeCellY // 2)
                else:
                    kc = self.makeCandidate(1.0,
                                            candX * sizeCellX + sizeCellX // 2,
                                            candY * sizeCellY + sizeCellY // 2)
                kc.build(self.kList)
                kernelCellSet.insertCandidate(kc)

        kernelCellSet.visitCandidates(kpv, 1)
        imagePca.analyze()
        eigenImages = imagePca.getEigenImages()
        eigenValues = imagePca.getEigenValues()

        # took in 3 images
        self.assertEqual(len(eigenImages), nCell * nCell)
        self.assertEqual(len(eigenValues), nCell * nCell)

        # all the same shape, only 1 eigenvalue
        self.assertAlmostEqual(eigenValues[0], 1.0)
        self.assertAlmostEqual(eigenValues[1], 0.0)
        self.assertAlmostEqual(eigenValues[2], 0.0)
Exemple #6
0
    def testWithThreeBases(self):
        kc1 = self.makeCandidate(1, 0.0, 0.0)
        kc2 = self.makeCandidate(2, 0.0, 0.0)
        kc3 = self.makeCandidate(3, 0.0, 0.0)
        bskv1 = ipDiffim.BuildSingleKernelVisitorF(self.kList, self.policy)
        bskv1.processCandidate(kc1)
        bskv1.processCandidate(kc2)
        bskv1.processCandidate(kc3)
        self.assertEqual(bskv1.getNProcessed(), 3)

        # make sure orig solution is the current one
        soln1_1 = kc1.getKernelSolution(ipDiffim.KernelCandidateF.ORIG).getId()
        soln2_1 = kc2.getKernelSolution(ipDiffim.KernelCandidateF.ORIG).getId()
        soln3_1 = kc3.getKernelSolution(ipDiffim.KernelCandidateF.ORIG).getId()
        self.assertEqual(soln1_1, kc1.getKernelSolution(ipDiffim.KernelCandidateF.RECENT).getId())
        self.assertEqual(soln2_1, kc2.getKernelSolution(ipDiffim.KernelCandidateF.RECENT).getId())
        self.assertEqual(soln3_1, kc3.getKernelSolution(ipDiffim.KernelCandidateF.RECENT).getId())

        # do pca basis; visit manually since visitCandidates is still broken
        imagePca = ipDiffim.KernelPcaD()
        kpv = ipDiffim.KernelPcaVisitorF(imagePca)
        kpv.processCandidate(kc1)
        kpv.processCandidate(kc2)
        kpv.processCandidate(kc3)
        kpv.subtractMean()
        imagePca.analyze()
        eigenKernels = []
        eigenKernels.append(kpv.getEigenKernels()[0])
        self.assertEqual(len(eigenKernels), 1)  # the other eKernels are 0.0 and you can't get their coeffs!

        # do twice to mimic a Pca loop
        bskv2 = ipDiffim.BuildSingleKernelVisitorF(eigenKernels, self.policy)
        bskv2.setSkipBuilt(False)
        bskv2.processCandidate(kc1)
        bskv2.processCandidate(kc2)
        bskv2.processCandidate(kc3)
        self.assertEqual(bskv2.getNProcessed(), 3)

        soln1_2 = kc1.getKernelSolution(ipDiffim.KernelCandidateF.PCA).getId()
        soln2_2 = kc2.getKernelSolution(ipDiffim.KernelCandidateF.PCA).getId()
        soln3_2 = kc3.getKernelSolution(ipDiffim.KernelCandidateF.PCA).getId()
        # pca is recent
        self.assertEqual(soln1_2, kc1.getKernelSolution(ipDiffim.KernelCandidateF.RECENT).getId())
        self.assertEqual(soln2_2, kc2.getKernelSolution(ipDiffim.KernelCandidateF.RECENT).getId())
        self.assertEqual(soln3_2, kc3.getKernelSolution(ipDiffim.KernelCandidateF.RECENT).getId())
        # orig is still orig
        self.assertEqual(soln1_1, kc1.getKernelSolution(ipDiffim.KernelCandidateF.ORIG).getId())
        self.assertEqual(soln2_1, kc2.getKernelSolution(ipDiffim.KernelCandidateF.ORIG).getId())
        self.assertEqual(soln3_1, kc3.getKernelSolution(ipDiffim.KernelCandidateF.ORIG).getId())
        # pca is not orig
        self.assertNotEqual(soln1_2, soln1_1)
        self.assertNotEqual(soln2_2, soln2_1)
        self.assertNotEqual(soln3_2, soln3_1)

        # do twice to mimic a Pca loop
        bskv3 = ipDiffim.BuildSingleKernelVisitorF(eigenKernels, self.policy)
        bskv3.setSkipBuilt(False)
        bskv3.processCandidate(kc1)
        bskv3.processCandidate(kc2)
        bskv3.processCandidate(kc3)
        self.assertEqual(bskv3.getNProcessed(), 3)

        soln1_3 = kc1.getKernelSolution(ipDiffim.KernelCandidateF.PCA).getId()
        soln2_3 = kc2.getKernelSolution(ipDiffim.KernelCandidateF.PCA).getId()
        soln3_3 = kc3.getKernelSolution(ipDiffim.KernelCandidateF.PCA).getId()
        # pca is recent
        self.assertEqual(soln1_3, kc1.getKernelSolution(ipDiffim.KernelCandidateF.RECENT).getId())
        self.assertEqual(soln2_3, kc2.getKernelSolution(ipDiffim.KernelCandidateF.RECENT).getId())
        self.assertEqual(soln3_3, kc3.getKernelSolution(ipDiffim.KernelCandidateF.RECENT).getId())
        # pca is not previous pca
        self.assertNotEqual(soln1_2, soln1_3)
        self.assertNotEqual(soln2_2, soln2_3)
        self.assertNotEqual(soln3_2, soln3_3)
Exemple #7
0
    def testGaussian(self, size=51):
        gaussFunction = afwMath.GaussianFunction2D(2, 3)
        gaussKernel = afwMath.AnalyticKernel(size, size, gaussFunction)

        imagePca1 = ipDiffim.KernelPcaD()  # mean subtract
        imagePca2 = ipDiffim.KernelPcaD()  # don't mean subtract
        kpv1 = ipDiffim.KernelPcaVisitorF(imagePca1)
        kpv2 = ipDiffim.KernelPcaVisitorF(imagePca2)

        kRefIm = None

        for i in range(100):
            kImage1 = afwImage.ImageD(gaussKernel.getDimensions())
            gaussKernel.computeImage(kImage1, False)
            kImage1 *= 10000  # to get some decent peak source counts
            kImage1 += 10  # to get some sky background noise

            if kRefIm is None:
                kRefIm = kImage1

            kImage1 = diffimTools.makePoissonNoiseImage(kImage1)
            kImage2 = afwImage.ImageD(kImage1, True)

            imagePca1.addImage(kImage1, 1.0)
            imagePca2.addImage(kImage2, 1.0)

        kpv1.subtractMean()

        imagePca1.analyze()
        imagePca2.analyze()

        pcaBasisList1 = kpv1.getEigenKernels()
        pcaBasisList2 = kpv2.getEigenKernels()

        eVal1 = imagePca1.getEigenValues()
        eVal2 = imagePca2.getEigenValues()

        # First term is far more signficant without mean subtraction
        self.assertGreater(eVal2[0], eVal1[0])

        # Last term basically zero with mean subtraction
        self.assertAlmostEqual(eVal1[-1], 0.0)

        # Extra image with mean subtraction
        self.assertEqual(len(pcaBasisList1), (len(eVal1) + 1))

        # Same shape
        self.assertEqual(len(pcaBasisList2), len(eVal2))

        # Mean kernel close to kRefIm
        kImageM = afwImage.ImageD(gaussKernel.getDimensions())
        pcaBasisList1[0].computeImage(kImageM, False)
        for y in range(kRefIm.getHeight()):
            for x in range(kRefIm.getWidth()):
                self.assertLess(
                    abs(kRefIm[x, y, afwImage.LOCAL] -
                        kImageM[x, y, afwImage.LOCAL]) /
                    kRefIm[x, y, afwImage.LOCAL], 0.2)

        # First mean-unsubtracted Pca kernel close to kRefIm (normalized to peak of 1.0)
        kImage0 = afwImage.ImageD(gaussKernel.getDimensions())
        pcaBasisList2[0].computeImage(kImage0, False)
        maxVal = afwMath.makeStatistics(kRefIm,
                                        afwMath.MAX).getValue(afwMath.MAX)
        kRefIm /= maxVal
        for y in range(kRefIm.getHeight()):
            for x in range(kRefIm.getWidth()):
                self.assertLess(
                    abs(kRefIm[x, y, afwImage.LOCAL] -
                        kImage0[x, y, afwImage.LOCAL]) /
                    kRefIm[x, y, afwImage.LOCAL], 0.2)