def test_ex2d_subimage(self): specrange = (0, self.nspec) waverange = self.ww[0], self.ww[-1] flux, fluxivar, R = ex2d_patch(self.image, self.ivar, self.psf, 0, self.nspec, self.ww) border = 0 xmin, xmax, ymin, ymax = self.psf.xyrange(specrange, waverange) xmin = max(0, xmin-border) xmax = min(self.psf.npix_x, xmax+border) ymin = max(0, ymin-border) ymax = min(self.psf.npix_y, ymax+border) xyrange = (xmin, xmax, ymin, ymax) subimg = self.image[ymin:ymax, xmin:xmax] subivar = self.ivar[ymin:ymax, xmin:xmax] subflux, subfluxivar, subR = ex2d_patch(subimg, subivar, self.psf, \ 0, self.nspec, self.ww, xyrange=xyrange) #- First test for allclose as a hint in case the later #- bitwise match test fails self.assertTrue( np.allclose(subflux, flux) ) self.assertTrue( np.allclose(subfluxivar, fluxivar) ) self.assertTrue( np.allclose(subR, R) ) self.assertTrue( np.all(subflux == flux) ) self.assertTrue( np.all(subfluxivar == fluxivar) ) self.assertTrue( np.all(subR == R) )
def test_noiseless_ex2d_sigdecorr(self): specrange = (0, self.nspec) ivar = np.ones(self.ivar.shape) d = ex2d_patch(self.image_orig, ivar, self.psf, 0, self.nspec, self.ww, full_output=True) R = d['R'] flux = d['flux'] #- resolution convolved extracted flux xflux = d['xflux'] #- original extracted flux #- Resolution convolved input photons (flux) rphot = R.dot(self.phot.ravel()).reshape(flux.shape) #- extracted flux projected back to image ximg = self.psf.project(self.ww, xflux, verbose=False) #- Compare inputs to outputs bias = (flux - rphot) / rphot dximg = ximg - self.image_orig self.assertTrue(np.max(np.abs(bias)) < 1e-9) self.assertTrue(np.max(np.abs(dximg)) < 1e-6)
def test_ex2d_patch(self): d = ex2d_patch(self.image, self.ivar, self.psf, 0, self.nspec, self.ww, full_output=True) self.assertEqual(d['flux'].shape, (self.nspec, len(self.ww))) self.assertEqual(d['ivar'].shape, (self.nspec, len(self.ww))) ntot = len(self.ww) * self.nspec self.assertEqual(d['R'].shape, (ntot, ntot))
def test_wave_off_image(self): ww = self.psf.wmin - 5 + np.arange(10) nspec = 2 specrange = [0,nspec] xyrange = self.psf.xyrange(specrange, ww) phot = np.ones([nspec,len(ww)]) img = self.psf.project(ww, phot, xyrange=xyrange) ivar = np.ones(img.shape) flux, fluxivar, R = ex2d_patch(img, ivar, self.psf, 0, self.nspec, ww, xyrange=xyrange) self.assertTrue( np.all(flux == flux) )
def test_ex2d_subimage(self): specrange = (0, self.nspec) waverange = self.ww[0], self.ww[-1] flux, fluxivar, R = ex2d_patch(self.image, self.ivar, self.psf, 0, self.nspec, self.ww) border = 0 xmin, xmax, ymin, ymax = self.psf.xyrange(specrange, waverange) xmin = max(0, xmin-border) xmax = min(self.psf.npix_x, xmax+border) ymin = max(0, ymin-border) ymax = min(self.psf.npix_y, ymax+border) xyrange = (xmin, xmax, ymin, ymax) subimg = self.image[ymin:ymax, xmin:xmax] subivar = self.ivar[ymin:ymax, xmin:xmax] subflux, subfluxivar, subR = ex2d_patch(subimg, subivar, self.psf, \ 0, self.nspec, self.ww, xyrange=xyrange) #- These arrays pass np.allclose, but sometimes fail np.all on edison. #- They should be absolutely identical. Leaving this as failing. self.assertTrue( np.all(subflux == flux) ) self.assertTrue( np.all(subfluxivar == fluxivar) ) self.assertTrue( np.all(subR == R) )
def test_ex2d_chi2(self): from time import time specrange = (0, self.nspec) waverange = (self.ww[0], self.ww[-1]) imgvar = 1/self.ivar xmin, xmax, ymin, ymax = xyrange = self.psf.xyrange(specrange, waverange) for i in range(3): pix = self.image_orig + np.random.normal(scale=np.sqrt(imgvar)) d = ex2d_patch(pix, self.ivar, self.psf, 0, self.nspec, self.ww, full_output=True) flux, ivar, R = d['flux'], d['ivar'], d['R'] rflux = R.dot(self.phot.ravel()).reshape(flux.shape) chi = (flux - rflux) * np.sqrt(ivar) #- loose test, just checking for catastrophic failures self.assertLess(abs(1-np.std(chi)), 0.10)
def test_ex2d_subimage(self): specrange = (0, self.nspec) waverange = self.ww[0], self.ww[-1] flux, fluxivar, R = ex2d_patch(self.image, self.ivar, self.psf, 0, self.nspec, self.ww) border = 0 xmin, xmax, ymin, ymax = self.psf.xyrange(specrange, waverange) xmin = max(0, xmin - border) xmax = min(self.psf.npix_x, xmax + border) ymin = max(0, ymin - border) ymax = min(self.psf.npix_y, ymax + border) xyrange = (xmin, xmax, ymin, ymax) subimg = self.image[ymin:ymax, xmin:xmax] subivar = self.ivar[ymin:ymax, xmin:xmax] subflux, subfluxivar, subR = ex2d_patch(subimg, subivar, self.psf, \ 0, self.nspec, self.ww, xyrange=xyrange) #- These arrays pass np.allclose, but sometimes fail np.all on edison. #- They should be absolutely identical. Leaving this as failing. self.assertTrue(np.all(subflux == flux)) self.assertTrue(np.all(subfluxivar == fluxivar)) self.assertTrue(np.all(subR == R))
def test_noiseless_ex2d_sigdecorr(self): specrange = (0, self.nspec) ivar = np.ones(self.ivar.shape) d = ex2d_patch(self.image_orig, ivar, self.psf, 0, self.nspec, self.ww, full_output=True) R = d['R'] flux = d['flux'] #- resolution convolved extracted flux xflux = d['xflux'] #- original extracted flux #- Resolution convolved input photons (flux) rphot = R.dot(self.phot.ravel()).reshape(flux.shape) #- extracted flux projected back to image ximg = self.psf.project(self.ww, xflux, verbose=False) #- Compare inputs to outputs bias = (flux - rphot)/rphot dximg = ximg - self.image_orig self.assertTrue( np.max(np.abs(bias)) < 1e-9 ) self.assertTrue( np.max(np.abs(dximg)) < 1e-6 )