Coverage for python/lsst/meas/algorithms/psfDeterminer.py: 83%

16 statements  

« prev     ^ index     » next       coverage.py v7.2.7, created at 2023-07-06 10:39 +0000

1# This file is part of meas_algorithms. 

2# 

3# Developed for the LSST Data Management System. 

4# This product includes software developed by the LSST Project 

5# (https://www.lsst.org). 

6# See the COPYRIGHT file at the top-level directory of this distribution 

7# for details of code ownership. 

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 GNU General Public License 

20# along with this program. If not, see <https://www.gnu.org/licenses/>. 

21 

22__all__ = ["BasePsfDeterminerConfig", "BasePsfDeterminerTask", "psfDeterminerRegistry"] 

23 

24import abc 

25 

26import lsst.pipe.base as pipeBase 

27import lsst.pex.config as pexConfig 

28 

29 

30class BasePsfDeterminerConfig(pexConfig.Config): 

31 """Configuration that is likely to be shared by all PSF determiners 

32 

33 This is fairly sparse; more fields can be moved here once it is clear they are universal. 

34 """ 

35 stampSize = pexConfig.Field[int]( 35 ↛ exitline 35 didn't jump to the function exit

36 doc="Size of the postage stamp (in native pixels) to render the PSF model. Should be odd.", 

37 default=None, 

38 optional=True, 

39 check=lambda x: (x > 0) & (x % 2 == 1), 

40 ) 

41 

42 

43class BasePsfDeterminerTask(pipeBase.Task, metaclass=abc.ABCMeta): 

44 """Base class for PSF determiners 

45 

46 Register all PSF determiners with the psfDeterminerRegistry using: 

47 psfDeterminerRegistry.register(name, class) 

48 

49 Parameters 

50 ---------- 

51 config : `lsst.pexConfig.Config` 

52 Input for configuring the algorithm 

53 schema : `lsst.afw.table.Schema` 

54 Schema used for sources; passing a schema allows the 

55 determiner to reserve a flag field to mark stars used in 

56 PSF measurement, but some PSF determiners ignore this argument. 

57 """ 

58 

59 usesMatches = False # Does the PSF determiner use the "matches" argument in the "run method? Few do. 

60 ConfigClass = BasePsfDeterminerConfig 

61 _DefaultName = "psfDeterminer" 

62 

63 def __init__(self, config, schema=None, **kwds): 

64 pipeBase.Task.__init__(self, config=config, **kwds) 

65 

66 @abc.abstractmethod 

67 def determinePsf(self, exposure, psfCandidateList, metadata=None, flagKey=None): 

68 """Determine a PSF model. 

69 

70 Parameters 

71 ---------- 

72 exposure : `lsst.afw.Exposure` 

73 Exposure containing the psf candidates. 

74 psdCandidateList : `list` [`lsst.meas.algorithms.PsfCandidate`] 

75 A sequence of PSF candidates; typically obtained by 

76 detecting sources and then running them through a star 

77 selector. 

78 metadata : `str`, optional 

79 A place to save interesting items. 

80 flagKey: `lsst.afw.table.Key`, optional 

81 Schema key used to mark sources actually used in PSF determination. 

82 

83 Returns 

84 ------- 

85 psf : `lsst.afw.detection.Psf` 

86 The fit PSF. 

87 cellSet : `lsst.afw.math.SpatialCellSet` 

88 The spatial cell set used to determine the PSF 

89 """ 

90 raise NotImplementedError("BasePsfDeterminerTask is abstract, subclasses must override this method") 

91 

92 

93psfDeterminerRegistry = pexConfig.makeRegistry( 

94 doc="A registry of PSF determiners (subclasses of BasePsfDeterminerTask)", 

95)