Coverage for python / lsst / meas / algorithms / starSelector.py: 55%

25 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-04-30 08:57 +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__ = ["BaseStarSelectorConfig", "BaseStarSelectorTask", "starSelectorRegistry"] 

24 

25import abc 

26 

27from lsst.afw.table import Schema 

28import lsst.pex.config as pexConfig 

29import lsst.pipe.base as pipeBase 

30 

31 

32class BaseStarSelectorConfig(pexConfig.Config): 

33 badFlags = pexConfig.ListField( 

34 doc="List of flags which cause a source to be rejected as bad", 

35 dtype=str, 

36 default=[ 

37 "base_PixelFlags_flag_edge", 

38 "base_PixelFlags_flag_nodata", 

39 "base_PixelFlags_flag_interpolatedCenter", 

40 "base_PixelFlags_flag_saturatedCenter", 

41 "base_PixelFlags_flag_crCenter", 

42 "base_PixelFlags_flag_bad", 

43 "base_PixelFlags_flag_interpolated", 

44 ], 

45 ) 

46 

47 

48class BaseStarSelectorTask(pipeBase.Task, metaclass=abc.ABCMeta): 

49 """Base class for star selectors 

50 

51 Register all star selectors with the starSelectorRegistry using: 

52 starSelectorRegistry.register(name, class) 

53 """ 

54 

55 usesMatches = False # Does the star selector use the "matches" argument in the "run method? Few do. 

56 ConfigClass = BaseStarSelectorConfig 

57 _DefaultName = "starSelector" 

58 

59 def __init__(self, schema, **kwds): 

60 # catch code that passed config positionally before schema argument was added 

61 assert isinstance(schema, Schema) 

62 pipeBase.Task.__init__(self, **kwds) 

63 

64 def run(self, exposure, sourceCat, matches=None, isStarField=None): 

65 """Select stars and set a flag field True for stars in the input catalog. 

66 

67 Parameters 

68 ---------- 

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

70 the exposure containing the sources 

71 sourceCat : `lsst.afw.table.SourceCatalog` 

72 catalog of sources that may be stars 

73 matches : `lsst.afw.table.ReferenceMatchVector` or None 

74 astrometric matches; ignored by this star selector. Some star selectors 

75 will ignore this argument, others may require it. See the 

76 usesMatches class variable. 

77 isStarField : `str` 

78 name of flag field to set True for stars, or None to not set a field; 

79 the field is left unchanged for non-stars 

80 

81 Returns 

82 ------- 

83 struct : `lsst.pipe.base.Struct` 

84 Result struct containing: 

85 

86 - starCat catalog of stars that were selected as stars and successfuly made into PSF candidates 

87 (a subset of sourceCat whose records are shallow copies) 

88 """ 

89 result = self.selectStars(exposure=exposure, sourceCat=sourceCat, matches=matches) 

90 

91 if isStarField is not None: 

92 isStarKey = sourceCat.schema[isStarField].asKey() 

93 for star in result.starCat: 

94 star.set(isStarKey, True) 

95 

96 return pipeBase.Struct(starCat=result.starCat) 

97 

98 @abc.abstractmethod 

99 def selectStars(self, exposure, sourceCat, matches=None): 

100 """Return a catalog of stars: a subset of sourceCat whose records are shallow copies 

101 

102 Parameters 

103 ---------- 

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

105 The exposure containing the sources. 

106 sourceCat : `lsst.afw.table.SourceCatalog` 

107 Catalog of sources that may be stars. 

108 matches : `lsst.afw.table.ReferenceMatchVector` or None 

109 astrometric matches; ignored by this star selector. Some star selectors 

110 will ignore this argument, others may require it. See the usesMatches class variable. 

111 

112 Returns 

113 ------- 

114 struct : `lsst.pipe.base.Struct` 

115 Result `~lsst.pipe.base.Struct` containing: 

116 

117 ``starCat`` 

118 Catalog of stars that were selected as stars and successfuly made into PSF candidates 

119 (a subset of sourceCat whose records are shallow copies). 

120 (`lsst.afw.table.SourceCatalog`) 

121 

122 Notes 

123 ----- 

124 Warning: The returned catalog must have records that are shallow copies 

125 (fortunately this is the default behavior when you add a record from one catalog to another); 

126 otherwise the run method cannot set the isStarField flag in the original source catalog. 

127 """ 

128 raise NotImplementedError("BaseStarSelectorTask is abstract, subclasses must override this method") 

129 

130 

131starSelectorRegistry = pexConfig.makeRegistry( 

132 doc="A registry of star selectors (subclasses of BaseStarSelectorTask)", 

133)