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

18 statements  

« prev     ^ index     » next       coverage.py v6.4.4, created at 2022-09-03 04:00 -0700

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 

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

25 

26import abc 

27 

28import lsst.pipe.base as pipeBase 

29import lsst.pex.config as pexConfig 

30 

31 

32class BasePsfDeterminerConfig(pexConfig.Config): 

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

34 

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

36 """ 

37 kernelSize = pexConfig.Field( 

38 doc="radius of the kernel to create, relative to the square root of the stellar quadrupole moments", 

39 dtype=float, 

40 default=10.0, 

41 ) 

42 kernelSizeMin = pexConfig.Field( 

43 doc="Minimum radius of the kernel", 

44 dtype=int, 

45 default=25, 

46 ) 

47 kernelSizeMax = pexConfig.Field( 

48 doc="Maximum radius of the kernel", 

49 dtype=int, 

50 default=45, 

51 ) 

52 

53 

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

55 """Base class for PSF determiners 

56 

57 Register all PSF determiners with the psfDeterminerRegistry using: 

58 psfDeterminerRegistry.register(name, class) 

59 

60 Parameters 

61 ---------- 

62 config : `lsst.pexConfig.Config` 

63 Input for configuring the algorithm 

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

65 Schema used for sources; passing a schema allows the 

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

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

68 """ 

69 

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

71 ConfigClass = BasePsfDeterminerConfig 

72 _DefaultName = "psfDeterminer" 

73 

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

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

76 

77 @abc.abstractmethod 

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

79 """Determine a PSF model. 

80 

81 Parameters 

82 ---------- 

83 exposure : `lsst.afw.Exposure` 

84 Exposure containing the psf candidates. 

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

86 A sequence of PSF candidates; typically obtained by 

87 detecting sources and then running them through a star 

88 selector. 

89 metadata : `str` 

90 A place to save interesting items. 

91 

92 Returns 

93 ------- 

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

95 The fit PSF. 

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

97 The spatial cell set used to determine the PSF 

98 """ 

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

100 

101 

102psfDeterminerRegistry = pexConfig.makeRegistry( 

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

104)