Coverage for python/lsst/analysis/tools/atools/photometry.py: 14%

114 statements  

« prev     ^ index     » next       coverage.py v7.4.3, created at 2024-02-24 11:21 +0000

1# This file is part of analysis_tools. 

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/>. 

21from __future__ import annotations 

22 

23__all__ = ("Ap12PsfSkyPlot", "PsfCModelSkyPlot", "PsfCModelScatterPlot", "PsfApRatio") 

24 

25from ..actions.plot.histPlot import HistPanel, HistPlot 

26from ..actions.plot.scatterplotWithTwoHists import ScatterPlotStatsAction, ScatterPlotWithTwoHists 

27from ..actions.plot.skyPlot import SkyPlot 

28from ..actions.scalar.scalarActions import MeanAction, MedianAction, SigmaMadAction 

29from ..actions.vector import ( 

30 CoaddPlotFlagSelector, 

31 ConvertFluxToMag, 

32 DivideVector, 

33 ExtinctionCorrectedMagDiff, 

34 LoadVector, 

35 MagDiff, 

36 SnSelector, 

37 StarSelector, 

38) 

39from ..interfaces import AnalysisTool 

40 

41 

42class Ap12PsfSkyPlot(AnalysisTool): 

43 def setDefaults(self): 

44 super().setDefaults() 

45 self.prep.selectors.flagSelector = CoaddPlotFlagSelector() 

46 # Set this to an empty list to look at the band 

47 # the plot is being made in. 

48 self.prep.selectors.flagSelector.bands = [] 

49 

50 self.prep.selectors.snSelector = SnSelector() 

51 self.prep.selectors.snSelector.fluxType = "{band}_psfFlux" 

52 self.prep.selectors.snSelector.threshold = 300 

53 

54 self.prep.selectors.starSelector = StarSelector() 

55 self.prep.selectors.starSelector.vectorKey = "{band}_extendedness" 

56 

57 # TODO: Can we make these defaults somewhere? 

58 self.process.buildActions.xStars = LoadVector() 

59 self.process.buildActions.xStars.vectorKey = "coord_ra" 

60 self.process.buildActions.yStars = LoadVector() 

61 self.process.buildActions.yStars.vectorKey = "coord_dec" 

62 self.process.buildActions.starStatMask = SnSelector() 

63 self.process.buildActions.starStatMask.fluxType = "{band}_psfFlux" 

64 

65 self.process.buildActions.zStars = ExtinctionCorrectedMagDiff() 

66 self.process.buildActions.zStars.magDiff.col1 = "{band}_ap12Flux" 

67 self.process.buildActions.zStars.magDiff.col2 = "{band}_psfFlux" 

68 

69 self.process.calculateActions.median = MedianAction() 

70 self.process.calculateActions.median.vectorKey = "zStars" 

71 

72 self.process.calculateActions.mean = MeanAction() 

73 self.process.calculateActions.mean.vectorKey = "zStars" 

74 

75 self.process.calculateActions.sigmaMad = SigmaMadAction() 

76 self.process.calculateActions.sigmaMad.vectorKey = "zStars" 

77 

78 self.produce.plot = SkyPlot() 

79 self.produce.plot.plotTypes = ["stars"] 

80 self.produce.plot.plotName = "{band}_ap12-psf" 

81 self.produce.plot.xAxisLabel = "R.A. (degrees)" 

82 self.produce.plot.yAxisLabel = "Dec. (degrees)" 

83 self.produce.plot.zAxisLabel = "Ap 12 - PSF [mag]" 

84 self.produce.plot.plotOutlines = False 

85 

86 self.produce.metric.units = {"median": "mmag", "sigmaMad": "mmag", "mean": "mmag"} 

87 

88 self.produce.metric.newNames = { 

89 "median": "{band}_ap12-psf_median", 

90 "mean": "{band}_ap12-psf_mean", 

91 "sigmaMad": "{band}_ap12-psf_sigmaMad", 

92 } 

93 

94 

95class PsfCModelSkyPlot(AnalysisTool): 

96 """Creates a skyPlot showing the difference between PSF and CModel mags""" 

97 

98 def setDefaults(self): 

99 super().setDefaults() 

100 self.prep.selectors.flagSelector = CoaddPlotFlagSelector() 

101 self.prep.selectors.flagSelector.bands = [] 

102 

103 self.prep.selectors.snSelector = SnSelector() 

104 self.prep.selectors.snSelector.fluxType = "{band}_psfFlux" 

105 self.prep.selectors.snSelector.threshold = 300 

106 

107 self.prep.selectors.starSelector = StarSelector() 

108 self.prep.selectors.starSelector.vectorKey = "{band}_extendedness" 

109 

110 self.process.buildActions.xStars = LoadVector() 

111 self.process.buildActions.xStars.vectorKey = "coord_ra" 

112 self.process.buildActions.yStars = LoadVector() 

113 self.process.buildActions.yStars.vectorKey = "coord_dec" 

114 self.process.buildActions.starStatMask = SnSelector() 

115 self.process.buildActions.starStatMask.fluxType = "{band}_psfFlux" 

116 self.process.buildActions.starStatMask.threshold = 300 

117 

118 self.process.buildActions.zStars = MagDiff() 

119 self.process.buildActions.zStars.col1 = "{band}_psfFlux" 

120 self.process.buildActions.zStars.col2 = "{band}_cModelFlux" 

121 

122 self.produce.plot = SkyPlot() 

123 self.produce.plot.plotTypes = ["stars"] 

124 self.produce.plot.plotName = "{band}_psf-cModel" 

125 self.produce.plot.xAxisLabel = "R.A. (degrees)" 

126 self.produce.plot.yAxisLabel = "Dec. (degrees)" 

127 self.produce.plot.zAxisLabel = "PSF - cModel [mmag]" 

128 self.produce.plot.plotOutlines = False 

129 

130 

131class PsfCModelScatterPlot(AnalysisTool): 

132 """Creates a scatterPlot showing the difference between 

133 PSF and CModel mags""" 

134 

135 def setDefaults(self): 

136 super().setDefaults() 

137 self.prep.selectors.flagSelector = CoaddPlotFlagSelector() 

138 self.prep.selectors.flagSelector.bands = [] 

139 

140 self.prep.selectors.snSelector = SnSelector() 

141 self.prep.selectors.snSelector.fluxType = "{band}_psfFlux" 

142 self.prep.selectors.snSelector.threshold = 300 

143 

144 self.prep.selectors.starSelector = StarSelector() 

145 self.prep.selectors.starSelector.vectorKey = "{band}_extendedness" 

146 

147 self.process.buildActions.xStars = ConvertFluxToMag() 

148 self.process.buildActions.xStars.vectorKey = "{band}_psfFlux" 

149 self.process.buildActions.yStars = MagDiff() 

150 self.process.buildActions.yStars.col1 = "{band}_psfFlux" 

151 self.process.buildActions.yStars.col2 = "{band}_cModelFlux" 

152 self.process.buildActions.patch = LoadVector(vectorKey="patch") 

153 

154 self.process.calculateActions.stars = ScatterPlotStatsAction(vectorKey="yStars") 

155 self.process.calculateActions.stars.lowSNSelector.fluxType = "{band}_psfFlux" 

156 self.process.calculateActions.stars.highSNSelector.fluxType = "{band}_psfFlux" 

157 self.process.calculateActions.stars.fluxType = "{band}_psfFlux" 

158 

159 self.process.calculateActions.median = MedianAction() 

160 self.process.calculateActions.median.vectorKey = "yStars" 

161 

162 self.process.calculateActions.mean = MeanAction() 

163 self.process.calculateActions.mean.vectorKey = "yStars" 

164 

165 self.process.calculateActions.sigmaMad = SigmaMadAction() 

166 self.process.calculateActions.sigmaMad.vectorKey = "yStars" 

167 

168 self.produce.plot = ScatterPlotWithTwoHists() 

169 self.produce.plot.plotTypes = ["stars"] 

170 self.produce.plot.xAxisLabel = "PSF Magnitude (Mag)" 

171 self.produce.plot.yAxisLabel = "PSF - cModel [mmag]" 

172 self.produce.plot.magLabel = "PSF Magnitude (mag)" 

173 

174 self.produce.metric.units = {"median": "mmag", "sigmaMad": "mmag", "mean": "mmag"} 

175 

176 self.produce.metric.newNames = { 

177 "median": "{band}_psf_cModel_diff_median", 

178 "mean": "{band}_psf_cModel_diff_mean", 

179 "sigmaMad": "{band}_psf_cModel_diff_sigmaMad", 

180 } 

181 

182 

183class PsfApRatio(AnalysisTool): 

184 """Base class for plots or metrics which use PSF/Aperture Ratios.""" 

185 

186 def setDefaults(self): 

187 super().setDefaults() 

188 self.process.buildActions.loadVectorPsf = LoadVector() 

189 self.process.buildActions.loadVectorAp = LoadVector() 

190 

191 # assign keys for PSF and AP Flux 

192 self.process.buildActions.loadVectorPsf.vectorKey = "psFlux" 

193 self.process.buildActions.loadVectorAp.vectorKey = "apFlux" 

194 

195 self.process.calculateActions.fluxRatio = DivideVector( 

196 actionA=self.process.buildActions.loadVectorPsf, actionB=self.process.buildActions.loadVectorAp 

197 ) 

198 

199 self.produce.plot = HistPlot() 

200 

201 self.produce.panels["panel_flux"] = HistPanel() 

202 self.produce.panels["panel_flux"].label = "Psf/Ap Ratio" 

203 self.produce.panels["panel_flux"].hists = dict(fluxRatioMetric="Ratio")