Coverage for python / lsst / meas / base / measurementInvestigationLib.py: 0%

52 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-05-01 08:23 +0000

1# This file is part of meas_base. 

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 

22from collections.abc import Iterable 

23 

24from lsst.afw.table import Schema, SourceCatalog 

25from lsst.meas.base import NoiseReplacer, NoiseReplacerConfig 

26from lsst.meas.base import SingleFrameMeasurementTask as SFMT # noqa N814 

27 

28 

29def rebuildNoiseReplacer(exposure, measCat): 

30 """Recreate the `NoiseReplacer` used in measurement. 

31 

32 Given a measurement catalog and the exposure on which the measurements 

33 were made, reconstruct the `NoiseReplacer` object that was used to mask 

34 out sources during measurement. 

35 

36 Parameters 

37 ---------- 

38 exposure : `lsst.afw.exposure.Exposure` 

39 The image on which measurements were made. 

40 

41 measCat : `lsst.afw.table.SourceCatalog` 

42 Catalog containing the results measurements on each source. 

43 

44 Returns 

45 ------- 

46 noiseReplacer : `NoiseReplacer` 

47 Object used to replace and/or restore sources in the exposure with 

48 deterministic noise. 

49 """ 

50 

51 algMetadata = measCat.getMetadata() 

52 noiseReplacerConf = NoiseReplacerConfig() 

53 noiseReplacerConf.noiseSeedMultiplier = \ 

54 algMetadata.getScalar(SFMT.NOISE_SEED_MULTIPLIER) 

55 noiseReplacerConf.noiseSource = algMetadata.getScalar(SFMT.NOISE_SOURCE) 

56 noiseReplacerConf.noiseOffset = algMetadata.getScalar(SFMT.NOISE_OFFSET) 

57 

58 footprints = {src.getId(): (src.getParent(), src.getFootprint()) 

59 for src in measCat} 

60 

61 try: 

62 exposureId = algMetadata.getScalar(SFMT.NOISE_EXPOSURE_ID) 

63 except Exception: 

64 exposureId = None 

65 

66 noiseReplacer = NoiseReplacer(noiseReplacerConf, exposure, footprints, 

67 exposureId=exposureId) 

68 return noiseReplacer 

69 

70 

71def makeRerunCatalog(schema, oldCatalog, idList, fields=None, 

72 resetParents=True, addParents=False): 

73 """Create a catalog prepopulated with IDs. 

74 

75 This function is used to generate a `~lsst.afw.table.SourceCatalog` 

76 containing blank records with IDs as specified in the ``idList`` 

77 parameter. 

78 

79 This function is primarily used when re-running measurements on a 

80 particular footprint. Specifying IDs in the new measurement catalog which 

81 correspond to IDs in the old catalog makes comparing results much easier. 

82 

83 The ``resetParents`` and ``addParents`` options are needed because 

84 `SingleFrameMeasurementTask.runPlugins` will skip child 

85 objects whose parents are not in the catalog. 

86 

87 Parameters 

88 ---------- 

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

90 Schema used to describe the fields in the resulting catalog. 

91 

92 oldCatalog : `lsst.afw.table.SourceCatalog` 

93 Catalog containing previous measurements. 

94 

95 idList : iterable of `int` 

96 Iterable whose values should be numbers corresponding to measurement 

97 IDs which exist in ``oldCatalog``. 

98 

99 fields : iterable of `str` 

100 Iterable whose entries should be strings corresponding to schema keys 

101 that exist in both the old catalog and input schema. Fields listed 

102 will be copied from the old catalog into the new catalog. 

103 

104 resetParents : `bool` 

105 If `True`, child objects whose parents are not in the ``idList`` 

106 will have their parents reset to zero. 

107 

108 addParents : `bool` 

109 If `True`, parents of child objects will be added to ``idList`` if 

110 they are not already present. 

111 

112 Returns 

113 ------- 

114 measCat : `lsst.afw.table.SourceCatalog` 

115 Catalog prepopulated with entries with the IDs specified. 

116 """ 

117 

118 if not isinstance(schema, Schema): 

119 raise RuntimeError("schema must be an instance of " 

120 "lsst.afw.table.Schema") 

121 

122 if not isinstance(oldCatalog, SourceCatalog): 

123 raise RuntimeError("oldCatalog must be an instance of " 

124 "lsst.afw.table.SourceCatalogiterable") 

125 

126 if fields is None: 

127 fields = [] 

128 if not isinstance(fields, Iterable): 

129 raise RuntimeError("fields list must be an iterable with string" 

130 "elements") 

131 for entry in fields: 

132 if entry not in schema: 

133 schema.addField(oldCatalog.schema.find(entry).field) 

134 

135 if addParents: 

136 newIdList = set() 

137 for srcId in idList: 

138 newIdList.add(srcId) 

139 parentId = oldCatalog.find(srcId).getParent() 

140 if parentId: 

141 newIdList.add(parentId) 

142 idList = newIdList 

143 idList = sorted(idList) 

144 

145 measCat = SourceCatalog(schema) 

146 for srcId in idList: 

147 oldSrc = oldCatalog.find(srcId) 

148 src = measCat.addNew() 

149 src.setId(srcId) 

150 src.setFootprint(oldSrc.getFootprint()) 

151 parent = oldSrc.getParent() 

152 if resetParents and parent and parent not in idList: 

153 parent = 0 

154 src.setParent(parent) 

155 src.setCoord(oldSrc.getCoord()) 

156 for entry in fields: 

157 src[entry] = oldSrc[entry] 

158 return measCat