Coverage for python/lsst/analysis/tools/analysisParts/diffMatched.py: 41%
44 statements
« prev ^ index » next coverage.py v7.2.3, created at 2023-04-21 10:05 +0000
« prev ^ index » next coverage.py v7.2.3, created at 2023-04-21 10:05 +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
23__all__ = ("MatchedRefCoaddTool", "MatchedRefCoaddDiffMagTool", "MatchedRefCoaddDiffPositionTool")
25from lsst.pex.config import ChoiceField
27from ..actions.vector.selectors import GalaxySelector, StarSelector
28from ..actions.vector.vectorActions import (
29 ConstantValue,
30 DivideVector,
31 DownselectVector,
32 LoadVector,
33 MagColumnNanoJansky,
34 SubtractVector,
35 VectorSelector,
36)
37from ..interfaces import AnalysisTool
40class MatchedRefCoaddTool(AnalysisTool):
41 """Base tool for matched-to-reference metrics/plots on coadds.
43 Metrics/plots are expected to use the reference magnitude and
44 require separate star/galaxy/all source selections.
46 Notes
47 -----
48 The tool does not use a standard coadd flag selector, because
49 it is expected that the matcher has been configured to select
50 appropriate candidates (and stores a match_candidate column).
51 """
53 def setDefaults(self):
54 super().setDefaults()
55 self.process.buildActions.fluxes_ref = LoadVector(vectorKey="refcat_flux_{band}")
56 # TODO: Why won't vectorKey="fluxes_ref" work?
57 # Does it need to be a filterAction?
58 self.process.buildActions.mags_ref = MagColumnNanoJansky(
59 vectorKey=self.process.buildActions.fluxes_ref.vectorKey
60 )
62 # Select any finite extendedness (but still exclude NaNs)
63 self.process.buildActions.allSelector = StarSelector(
64 vectorKey="refExtendedness", extendedness_maximum=1.0
65 )
66 self.process.buildActions.galaxySelector = GalaxySelector(vectorKey="refExtendedness")
67 self.process.buildActions.starSelector = StarSelector(vectorKey="refExtendedness")
69 self.process.filterActions.xAll = DownselectVector(
70 vectorKey="mags_ref", selector=VectorSelector(vectorKey="allSelector")
71 )
72 self.process.filterActions.xGalaxies = DownselectVector(
73 vectorKey="mags_ref", selector=VectorSelector(vectorKey="galaxySelector")
74 )
75 self.process.filterActions.xStars = DownselectVector(
76 vectorKey="mags_ref", selector=VectorSelector(vectorKey="starSelector")
77 )
80class MatchedRefCoaddDiffMagTool(MatchedRefCoaddTool):
81 """Base tool for diffs between reference and measured coadd mags.
83 Notes
84 -----
85 The default model flux is cModel.
86 """
88 def matchedRefDiffContext(self):
89 self.process.buildActions.diff = SubtractVector(
90 actionA=MagColumnNanoJansky(
91 vectorKey=self.process.buildActions.fluxes_meas.vectorKey, returnMillimags=True
92 ),
93 actionB=DivideVector(
94 actionA=self.process.buildActions.mags_ref,
95 # To convert to mmag
96 actionB=ConstantValue(value=1e-3),
97 ),
98 )
100 def matchedRefChiContext(self):
101 self.process.buildActions.diff = DivideVector(
102 actionA=SubtractVector(
103 actionA=LoadVector(vectorKey=self.process.buildActions.fluxes_meas.vectorKey),
104 actionB=LoadVector(vectorKey=self.process.buildActions.fluxes_ref.vectorKey),
105 ),
106 actionB=LoadVector(vectorKey=f"{self.process.buildActions.fluxes_meas.vectorKey}Err"),
107 )
109 def setDefaults(self):
110 super().setDefaults()
112 self.process.buildActions.fluxes_meas = LoadVector(vectorKey="{band}_cModelFlux")
113 self.process.filterActions.yAll = DownselectVector(
114 vectorKey="diff", selector=VectorSelector(vectorKey="allSelector")
115 )
116 self.process.filterActions.yGalaxies = DownselectVector(
117 vectorKey="diff", selector=VectorSelector(vectorKey="galaxySelector")
118 )
119 self.process.filterActions.yStars = DownselectVector(
120 vectorKey="diff", selector=VectorSelector(vectorKey="starSelector")
121 )
124class MatchedRefCoaddDiffPositionTool(MatchedRefCoaddTool):
125 """Base tool for diffs between reference and measured coadd astrometry."""
127 variable = ChoiceField[str](
128 doc="The astrometric variable to compute metrics for",
129 allowed={
130 "x": "x",
131 "y": "y",
132 },
133 optional=False,
134 )
136 # TODO: Determine if this can be put back into setDefaults w/o this:
137 # lsst.pex.config.config.FieldValidationError:
138 # Field 'process.buildActions.pos_meas.vectorKey' failed validation:
139 # Required value cannot be None
140 def _setPos(self):
141 self.process.buildActions.pos_meas = LoadVector(vectorKey=self.variable)
142 self.process.buildActions.pos_ref = LoadVector(vectorKey=f"refcat_{self.variable}")
144 def matchedRefDiffContext(self):
145 self._setPos()
146 self.process.buildActions.diff = SubtractVector(
147 actionA=self.process.buildActions.pos_meas,
148 actionB=self.process.buildActions.pos_ref,
149 )
151 def matchedRefChiContext(self):
152 self._setPos()
153 self.process.buildActions.diff = DivideVector(
154 actionA=SubtractVector(
155 actionA=self.process.buildActions.pos_meas,
156 actionB=self.process.buildActions.pos_ref,
157 ),
158 actionB=LoadVector(vectorKey=f"{self.process.buildActions.pos_meas.vectorKey}Err"),
159 )
161 def setDefaults(self):
162 super().setDefaults()
164 self.process.filterActions.yAll = DownselectVector(
165 vectorKey="diff", selector=VectorSelector(vectorKey="allSelector")
166 )
167 self.process.filterActions.yGalaxies = DownselectVector(
168 vectorKey="diff", selector=VectorSelector(vectorKey="galaxySelector")
169 )
170 self.process.filterActions.yStars = DownselectVector(
171 vectorKey="diff", selector=VectorSelector(vectorKey="starSelector")
172 )