Coverage for python/lsst/analysis/tools/atools/photometry.py: 14%
114 statements
« prev ^ index » next coverage.py v7.5.0, created at 2024-04-26 04:06 -0700
« prev ^ index » next coverage.py v7.5.0, created at 2024-04-26 04:06 -0700
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
23__all__ = ("Ap12PsfSkyPlot", "PsfCModelSkyPlot", "PsfCModelScatterPlot", "PsfApRatio")
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
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 = []
50 self.prep.selectors.snSelector = SnSelector()
51 self.prep.selectors.snSelector.fluxType = "{band}_psfFlux"
52 self.prep.selectors.snSelector.threshold = 300
54 self.prep.selectors.starSelector = StarSelector()
55 self.prep.selectors.starSelector.vectorKey = "{band}_extendedness"
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"
65 self.process.buildActions.zStars = ExtinctionCorrectedMagDiff()
66 self.process.buildActions.zStars.magDiff.col1 = "{band}_ap12Flux"
67 self.process.buildActions.zStars.magDiff.col2 = "{band}_psfFlux"
69 self.process.calculateActions.median = MedianAction()
70 self.process.calculateActions.median.vectorKey = "zStars"
72 self.process.calculateActions.mean = MeanAction()
73 self.process.calculateActions.mean.vectorKey = "zStars"
75 self.process.calculateActions.sigmaMad = SigmaMadAction()
76 self.process.calculateActions.sigmaMad.vectorKey = "zStars"
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
86 self.produce.metric.units = {"median": "mmag", "sigmaMad": "mmag", "mean": "mmag"}
88 self.produce.metric.newNames = {
89 "median": "{band}_ap12_psf_diff_median",
90 "mean": "{band}_ap12_psf_diff_mean",
91 "sigmaMad": "{band}_ap12_psf_diff_sigmaMad",
92 }
95class PsfCModelSkyPlot(AnalysisTool):
96 """Creates a skyPlot showing the difference between PSF and CModel mags"""
98 def setDefaults(self):
99 super().setDefaults()
100 self.prep.selectors.flagSelector = CoaddPlotFlagSelector()
101 self.prep.selectors.flagSelector.bands = []
103 self.prep.selectors.snSelector = SnSelector()
104 self.prep.selectors.snSelector.fluxType = "{band}_psfFlux"
105 self.prep.selectors.snSelector.threshold = 300
107 self.prep.selectors.starSelector = StarSelector()
108 self.prep.selectors.starSelector.vectorKey = "{band}_extendedness"
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
118 self.process.buildActions.zStars = MagDiff()
119 self.process.buildActions.zStars.col1 = "{band}_psfFlux"
120 self.process.buildActions.zStars.col2 = "{band}_cModelFlux"
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
131class PsfCModelScatterPlot(AnalysisTool):
132 """Creates a scatterPlot showing the difference between
133 PSF and CModel mags"""
135 def setDefaults(self):
136 super().setDefaults()
137 self.prep.selectors.flagSelector = CoaddPlotFlagSelector()
138 self.prep.selectors.flagSelector.bands = []
140 self.prep.selectors.snSelector = SnSelector()
141 self.prep.selectors.snSelector.fluxType = "{band}_psfFlux"
142 self.prep.selectors.snSelector.threshold = 300
144 self.prep.selectors.starSelector = StarSelector()
145 self.prep.selectors.starSelector.vectorKey = "{band}_extendedness"
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")
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"
159 self.process.calculateActions.median = MedianAction()
160 self.process.calculateActions.median.vectorKey = "yStars"
162 self.process.calculateActions.mean = MeanAction()
163 self.process.calculateActions.mean.vectorKey = "yStars"
165 self.process.calculateActions.sigmaMad = SigmaMadAction()
166 self.process.calculateActions.sigmaMad.vectorKey = "yStars"
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)"
174 self.produce.metric.units = {"median": "mmag", "sigmaMad": "mmag", "mean": "mmag"}
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 }
183class PsfApRatio(AnalysisTool):
184 """Base class for plots or metrics which use PSF/Aperture Ratios."""
186 def setDefaults(self):
187 super().setDefaults()
188 self.process.buildActions.loadVectorPsf = LoadVector()
189 self.process.buildActions.loadVectorAp = LoadVector()
191 # assign keys for PSF and AP Flux
192 self.process.buildActions.loadVectorPsf.vectorKey = "psFlux"
193 self.process.buildActions.loadVectorAp.vectorKey = "apFlux"
195 self.process.calculateActions.fluxRatio = DivideVector(
196 actionA=self.process.buildActions.loadVectorPsf, actionB=self.process.buildActions.loadVectorAp
197 )
199 self.produce.plot = HistPlot()
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")