Coverage for python/lsst/meas/algorithms/installGaussianPsf.py: 49%

27 statements  

« prev     ^ index     » next       coverage.py v6.4.4, created at 2022-09-03 08:48 +0000

1# 

2# LSST Data Management System 

3# 

4# Copyright 2008-2017 AURA/LSST. 

5# 

6# This product includes software developed by the 

7# LSST Project (http://www.lsst.org/). 

8# 

9# This program is free software: you can redistribute it and/or modify 

10# it under the terms of the GNU General Public License as published by 

11# the Free Software Foundation, either version 3 of the License, or 

12# (at your option) any later version. 

13# 

14# This program is distributed in the hope that it will be useful, 

15# but WITHOUT ANY WARRANTY; without even the implied warranty of 

16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 

17# GNU General Public License for more details. 

18# 

19# You should have received a copy of the LSST License Statement and 

20# the GNU General Public License along with this program. If not, 

21# see <https://www.lsstcorp.org/LegalNotices/>. 

22# 

23__all__ = ["InstallGaussianPsfConfig", "InstallGaussianPsfTask"] 

24 

25import math 

26 

27import lsst.pex.config as pexConfig 

28import lsst.pipe.base as pipeBase 

29from lsst.meas.algorithms import SingleGaussianPsf 

30 

31FwhmPerSigma = 2.0*math.sqrt(2.0*math.log(2.0)) 

32 

33 

34class InstallGaussianPsfConfig(pexConfig.Config): 

35 """Config for InstallGaussianPsfTask 

36 """ 

37 fwhm = pexConfig.Field( 

38 dtype=float, 

39 default=1.5 * FwhmPerSigma, 

40 doc="Estimated FWHM of simple Gaussian PSF model, in pixels. " 

41 "Ignored if input exposure has a PSF model." 

42 ) 

43 width = pexConfig.RangeField( 

44 dtype=int, 

45 doc="Width and height of PSF model, in pixels. Must be odd.", 

46 default=11, 

47 min=1, 

48 ) 

49 

50 def validate(self): 

51 if self.width % 2 == 0: 

52 raise RuntimeError("width=%s must be odd" % (self.width,)) 

53 

54 

55class InstallGaussianPsfTask(pipeBase.Task): 

56 """Install a Gaussian PSF model in an exposure. 

57 

58 If the exposure already has a PSF model then the new model 

59 has the same sigma and size (width and height in pixels) of the existing 

60 model. 

61 """ 

62 ConfigClass = InstallGaussianPsfConfig 

63 _DefaultName = "installSimplePsfModel" 

64 

65 def run(self, exposure): 

66 """Set exposure's PSF to a simple PSF model 

67 

68 The sigma and width of the new simple PSF model matches the sigma and 

69 width of the current model, if any, else the config parameters are used. 

70 

71 Parameters 

72 ---------- 

73 exposure : `lsst.afw.image.Exposure` 

74 Exposure in which to replace or add the PSF model. 

75 """ 

76 if exposure.hasPsf(): 

77 psfModel = exposure.getPsf() 

78 psfSigma = psfModel.computeShape(psfModel.getAveragePosition()).getDeterminantRadius() 

79 width, height = psfModel.computeImage(psfModel.getAveragePosition()).getDimensions() 

80 else: 

81 psfSigma = self.config.fwhm / FwhmPerSigma 

82 width = height = self.config.width 

83 

84 if psfSigma <= 0: 

85 raise RuntimeError("psfSigma = %s <= 0" % (psfSigma,)) 

86 

87 self.log.debug("installing a simple Gaussian PSF model with width=%s, height=%s, FWHM=%0.3f", 

88 width, height, psfSigma*FwhmPerSigma) 

89 psfModel = SingleGaussianPsf(width, height, psfSigma) 

90 exposure.setPsf(psfModel)