def testPersistence(self): im = ExposureF(10, 10) im.setPsf(self.psf) self.assertEqual(im.getPsf(), self.psf) with lsst.utils.tests.getTempFilePath(".fits") as tmpFile: im.writeFits(tmpFile) newIm = ExposureF(tmpFile) self.assertEqual(newIm.getPsf(), im.getPsf())
def testPersistence(self): for pgp in self.pgps: assert cppLib.isPersistable(pgp) im = ExposureF(10, 10) im.setPsf(pgp) self.assertEqual(im.getPsf(), pgp) with lsst.utils.tests.getTempFilePath(".fits") as tmpFile: im.writeFits(tmpFile) newIm = ExposureF(tmpFile) self.assertEqual(newIm.getPsf(), im.getPsf())
def readFits(cls, path): """Read an external detrended image and create an LSST Exposure object from it. Any significant processing (e.g. pixel interpolation) should probably be done in a ExternalIsrTask instead of here so it can be done once and saved, instead of being done every time the image is loaded. THIS METHOD IS INCOMPLETE; IT MUST BE MODIFIED ACCORDING TO THE FORMAT OF THE DATA BEING LOADED. """ directory, filename = os.path.split(path) match = cls.EXTERNAL_REGEX.match(filename) camera = cls.getCameraFromVisit(match.group("visit")) # Customize the code below based on the camera determined above. # To support more than one camera it may be useful to delegate # to other methods that are specific to certain cameras. # Read the actual image in from the given path using e.g. astropy, # and use it to fill in various arrays below. bbox = Box2I(Point2I(0, 0), Extent2I(..., ...)) # width, height result = ExposureF(bbox) # main image, as a [y, x] numpy.float32 array result.image.array = ... # variance image, as a [y, x] numpy.float32 array result.variance.array = ... # This example includes masking NaN pixels as NO_DATA and pixels above # 1E5 counts as SAT. External information about where bad pixels # should be preferred when available, and obviously that saturation # threshold is just an example (saturation should actually be # determined before flat-fielding, of course). # Interpolating these bad pixels is handled by ExternalIsrTask. noDataBitMask = result.mask.getPlaneBitMask("NO_DATA") satBitMask = result.mask.getPlaneBitMask("SAT") result.mask.array |= noDataBitMask * np.isnan(result.image.array) result.mask.array |= satBitMask * (result.image.array > 1E5) # If you have a better guess at the PSF, we can find a way to use it. # But it'd be a good idea to at least put this in with a guess at the # seeing (RMS in pixels). result.setPsf(SingleGaussianPsf(seeingRMS)) # Add a guess for the WCS, in this case assuming it's in the FITS # header of the first HDU. Need to have something here, even if it # isn't very good (e.g. whatever comes from the telescope). metadata = readMetadata(filename) wcs = SkyWcs(metadata) result.setWcs(wcs) return result
def testMatchSingleGaussianPsf(self): """Test InstallGaussianPsfTask when the input exposure has a single Gaussian PSF.""" config = InstallGaussianPsfTask.ConfigClass() task = InstallGaussianPsfTask(config=config) for desWidth, desHeight, desSigma in ( (21, 23, 1.2), (23, 25, 3.5), ): exposure = ExposureF(100, 100) inPsf = SingleGaussianPsf(desWidth, desHeight, desSigma) exposure.setPsf(inPsf) task.run(exposure=exposure) self.assertTrue(exposure.hasPsf()) psf = exposure.getPsf() psfIm = psf.computeImage() self.assertEqual(psfIm.getWidth(), desWidth) self.assertEqual(psfIm.getHeight(), desHeight) self.assertAlmostEqual(psf.computeShape().getDeterminantRadius(), desSigma, delta=1e-3)
def testMatchSingleGaussianPsf(self): """Test InstallGaussianPsfTask when the input exposure has a single Gaussian PSF """ config = InstallGaussianPsfTask.ConfigClass() task = InstallGaussianPsfTask(config=config) for desWidth, desHeight, desSigma in ( (21, 23, 1.2), (23, 25, 3.5), ): exposure = ExposureF(100, 100) inPsf = SingleGaussianPsf(desWidth, desHeight, desSigma) exposure.setPsf(inPsf) task.run(exposure=exposure) self.assertTrue(exposure.hasPsf()) psf = exposure.getPsf() psfIm = psf.computeImage() self.assertEqual(psfIm.getWidth(), desWidth) self.assertEqual(psfIm.getHeight(), desHeight) self.assertAlmostEqual(psf.computeShape().getDeterminantRadius(), desSigma, delta=1e-3)
def testMatchDoubleGaussianPsf(self): """Test InstallGaussianPsfTask when the input exposure has a DoubleGaussian PSF.""" config = InstallGaussianPsfTask.ConfigClass() task = InstallGaussianPsfTask(config=config) for doubleGaussParms in ( # width, height, inner sigma, outer sigma, outer/inner peak amplitude (21, 23, 1.2, 3.5, 0.02), (23, 25, 3.5, 9.0, 0.02), ): exposure = ExposureF(100, 100) inPsf = DoubleGaussianPsf(*doubleGaussParms) exposure.setPsf(inPsf) desWidth, desHeight, innerSigma = doubleGaussParms[0:3] task.run(exposure=exposure) self.assertTrue(exposure.hasPsf()) psf = exposure.getPsf() psfIm = psf.computeImage() self.assertEqual(psfIm.getWidth(), desWidth) self.assertEqual(psfIm.getHeight(), desHeight) self.assertAlmostEqual(psf.computeShape().getDeterminantRadius(), innerSigma, delta=0.1)
def testMatchDoubleGaussianPsf(self): """Test InstallGaussianPsfTask when the input exposure has a DoubleGaussian PSF """ config = InstallGaussianPsfTask.ConfigClass() task = InstallGaussianPsfTask(config=config) for doubleGaussParms in ( # width, height, inner sigma, outer sigma, outer/inner peak amplitude (21, 23, 1.2, 3.5, 0.02), (23, 25, 3.5, 9.0, 0.02), ): exposure = ExposureF(100, 100) inPsf = DoubleGaussianPsf(*doubleGaussParms) exposure.setPsf(inPsf) desWidth, desHeight, innerSigma = doubleGaussParms[0:3] task.run(exposure=exposure) self.assertTrue(exposure.hasPsf()) psf = exposure.getPsf() psfIm = psf.computeImage() self.assertEqual(psfIm.getWidth(), desWidth) self.assertEqual(psfIm.getHeight(), desHeight) self.assertAlmostEqual(psf.computeShape().getDeterminantRadius(), innerSigma, delta=0.1)