LSST Applications  21.0.0-172-gfb10e10a+18fedfabac,22.0.0+297cba6710,22.0.0+80564b0ff1,22.0.0+8d77f4f51a,22.0.0+a28f4c53b1,22.0.0+dcf3732eb2,22.0.1-1-g7d6de66+2a20fdde0d,22.0.1-1-g8e32f31+297cba6710,22.0.1-1-geca5380+7fa3b7d9b6,22.0.1-12-g44dc1dc+2a20fdde0d,22.0.1-15-g6a90155+515f58c32b,22.0.1-16-g9282f48+790f5f2caa,22.0.1-2-g92698f7+dcf3732eb2,22.0.1-2-ga9b0f51+7fa3b7d9b6,22.0.1-2-gd1925c9+bf4f0e694f,22.0.1-24-g1ad7a390+a9625a72a8,22.0.1-25-g5bf6245+3ad8ecd50b,22.0.1-25-gb120d7b+8b5510f75f,22.0.1-27-g97737f7+2a20fdde0d,22.0.1-32-gf62ce7b1+aa4237961e,22.0.1-4-g0b3f228+2a20fdde0d,22.0.1-4-g243d05b+871c1b8305,22.0.1-4-g3a563be+32dcf1063f,22.0.1-4-g44f2e3d+9e4ab0f4fa,22.0.1-42-gca6935d93+ba5e5ca3eb,22.0.1-5-g15c806e+85460ae5f3,22.0.1-5-g58711c4+611d128589,22.0.1-5-g75bb458+99c117b92f,22.0.1-6-g1c63a23+7fa3b7d9b6,22.0.1-6-g50866e6+84ff5a128b,22.0.1-6-g8d3140d+720564cf76,22.0.1-6-gd805d02+cc5644f571,22.0.1-8-ge5750ce+85460ae5f3,master-g6e05de7fdc+babf819c66,master-g99da0e417a+8d77f4f51a,w.2021.48
LSST Data Management Base Package
installGaussianPsf.py
Go to the documentation of this file.
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 
25 import math
26 
27 import lsst.pex.config as pexConfig
28 import lsst.pipe.base as pipeBase
29 from lsst.meas.algorithms import SingleGaussianPsf
30 
31 FwhmPerSigma = 2.0*math.sqrt(2.0*math.log(2.0))
32 
33 
34 class 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.widthwidth % 2 == 0:
52  raise RuntimeError("width=%s must be odd" % (self.widthwidth,))
53 
54 
55 class 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 model.
60  """
61  ConfigClass = InstallGaussianPsfConfig
62  _DefaultName = "installSimplePsfModel"
63 
64  def run(self, exposure):
65  """Set exposure's PSF to a simple PSF model
66 
67  The sigma and width of the new simple PSF model matches the sigma and width of the current model,
68  if any, else the config parameters are used.
69 
70  Parameters
71  ----------
72  exposure : `lsst.afw.image.Exposure`
73  Exposure in which to replace or add the PSF model.
74  """
75  if exposure.hasPsf():
76  psfModel = exposure.getPsf()
77  psfSigma = psfModel.computeShape().getDeterminantRadius()
78  width, height = psfModel.computeImage().getDimensions()
79  else:
80  psfSigma = self.config.fwhm / FwhmPerSigma
81  width = height = self.config.width
82 
83  if psfSigma <= 0:
84  raise RuntimeError("psfSigma = %s <= 0" % (psfSigma,))
85 
86  self.log.debug("installing a simple Gaussian PSF model with width=%s, height=%s, FWHM=%0.3f",
87  width, height, psfSigma*FwhmPerSigma)
88  psfModel = SingleGaussianPsf(width, height, psfSigma)
89  exposure.setPsf(psfModel)
Represent a PSF as a circularly symmetrical Gaussian.
Fit spatial kernel using approximate fluxes for candidates, and solving a linear system of equations.