LSST Applications g0b6bd0c080+a72a5dd7e6,g1182afd7b4+2a019aa3bb,g17e5ecfddb+2b8207f7de,g1d67935e3f+06cf436103,g38293774b4+ac198e9f13,g396055baef+6a2097e274,g3b44f30a73+6611e0205b,g480783c3b1+98f8679e14,g48ccf36440+89c08d0516,g4b93dc025c+98f8679e14,g5c4744a4d9+a302e8c7f0,g613e996a0d+e1c447f2e0,g6c8d09e9e7+25247a063c,g7271f0639c+98f8679e14,g7a9cd813b8+124095ede6,g9d27549199+a302e8c7f0,ga1cf026fa3+ac198e9f13,ga32aa97882+7403ac30ac,ga786bb30fb+7a139211af,gaa63f70f4e+9994eb9896,gabf319e997+ade567573c,gba47b54d5d+94dc90c3ea,gbec6a3398f+06cf436103,gc6308e37c7+07dd123edb,gc655b1545f+ade567573c,gcc9029db3c+ab229f5caf,gd01420fc67+06cf436103,gd877ba84e5+06cf436103,gdb4cecd868+6f279b5b48,ge2d134c3d5+cc4dbb2e3f,ge448b5faa6+86d1ceac1d,gecc7e12556+98f8679e14,gf3ee170dca+25247a063c,gf4ac96e456+ade567573c,gf9f5ea5b4d+ac198e9f13,gff490e6085+8c2580be5c,w.2022.27
LSST Data Management Base Package
transforms.py
Go to the documentation of this file.
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
22"""Measurement transformations.
23
24When a measurement plugin is run, it provides raw, uncalibrated outputs such
25as pixel positions. A transformation may be run as a post-processing step to
26convert those outputs to calibrated quantities, such as celestial coordinates.
27
28At construction, the transformation is passed the configuration and name of
29the plugin whose outputs it will be transformaing (all fields in the input
30table produced by that plugin will have their field names prefixed by the
31plugin name) and a `~lsst.afw.table.SchemaMapper` which holds the schemata for
32the input and output catalogs and which may be used to directly map fields
33between the catalogs.
34
35When a transformer is called, it is handed a `~lsst.afw.table.SourceCatalog`
36containing the measurements to be transformed, a `~lsst.afw.table.BaseCatalog`
37in which to store results, and information about the WCS and calibration of
38the data. It may be safely assumed that both are contiguous in memory, thus a
39``ColumnView`` may be used for efficient processing. If the transformation is
40not possible, it should be aborted by throwing an exception; if this happens,
41the caller should assume that the contents of the output catalog are
42inconsistent.
43
44Transformations can be defined in Python or in C++. Python code should inherit
45from `MeasurementTransform`, following its interface.
46"""
47
48from lsst.afw.table import CoordKey
49from lsst.pex.exceptions import LengthError
50from . import CentroidResultKey
51
52__all__ = ("MeasurementTransform", "NullTransform", "PassThroughTransform", "SimpleCentroidTransform")
53
54
56 """Base class for measurement transformations.
57
58 Parameters
59 ----------
60 config : subclass of `BasePluginConfig`
61 The configuration of the measurement plugin whose outputs are being
62 transformed.
63 name : `str`
64 The name of the measurement plugin whose outputs are being
65 transformed.
67 Mapping between the input (pre-transformation) and output
68 (transformed) catalogs.
69
70 Notes
71 -----
72 Create transformations by deriving from this class, implementing
73 `__call__()` and (optionally) augmenting `__init__()`.
74 """
75
76 def __init__(self, config, name, mapper):
77 self.namename = name
78 self.configconfig = config
79
80 def __call__(self, inputCatalog, outputCatalog, wcs, photoCalib):
81 raise NotImplementedError()
82
83 @staticmethod
84 def _checkCatalogSize(cat1, cat2):
85 if len(cat1) != len(cat2):
86 raise LengthError("Catalog size mismatch")
87
88
90 """Null transform which transfers no data from input to output.
91
92 This is intended as the default for measurements for which no other
93 transformation is specified.
94
95 Parameters
96 ----------
97 config : subclass of `BasePluginConfig`
98 The configuration of the measurement plugin whose outputs are being
99 transformed.
100 name : `str`
101 The name of the measurement plugin whose outputs are being
102 transformed.
104 Mapping between the input (pre-transformation) and output
105 (transformed) catalogs.
106 """
107
108 def __call__(self, inputCatalog, outputCatalog, wcs, photoCalib):
109 self._checkCatalogSize_checkCatalogSize(inputCatalog, outputCatalog)
110
111
113 """Copy fields from input to output without transformation.
114
115 Parameters
116 ----------
117 config : subclass of `BasePluginConfig`
118 The configuration of the measurement plugin whose outputs are being
119 transformed.
120 name : `str`
121 The name of the measurement plugin whose outputs are being
122 transformed.
124 Mapping between the input (pre-transformation) and output
125 (transformed) catalogs.
126 """
127
128 def __init__(self, config, name, mapper):
129 MeasurementTransform.__init__(self, config, name, mapper)
130 for key, field in mapper.getInputSchema().extract(name + "*").values():
131 mapper.addMapping(key)
132
133 def __call__(self, inputCatalog, outputCatalog, wcs, photoCalib):
134 self._checkCatalogSize_checkCatalogSize(inputCatalog, outputCatalog)
135
136
138 """Transform pixel centroid, without uncertainty, to celestial coordinates.
139
140 Parameters
141 ----------
142 config : subclass of `BasePluginConfig`
143 The configuration of the measurement plugin whose outputs are being
144 transformed.
145 name : `str`
146 The name of the measurement plugin whose outputs are being
147 transformed.
149 Mapping between the input (pre-transformation) and output
150 (transformed) catalogs.
151 """
152
153 def __init__(self, config, name, mapper):
154 MeasurementTransform.__init__(self, config, name, mapper)
155 self.coordKeycoordKey = CoordKey.addFields(mapper.editOutputSchema(), name, "Position from " + name)
156
157 def __call__(self, inputCatalog, outputCatalog, wcs, photoCalib):
158 self._checkCatalogSize_checkCatalogSize(inputCatalog, outputCatalog)
159 centroidResultKey = CentroidResultKey(inputCatalog.schema[self.namename])
160 for inSrc, outSrc in zip(inputCatalog, outputCatalog):
161 self.coordKeycoordKey.set(outSrc, wcs.pixelToSky(centroidResultKey.get(inSrc).getCentroid()))
A mapping between the keys of two Schemas, used to copy data between them.
Definition: SchemaMapper.h:21
def __init__(self, config, name, mapper)
Definition: transforms.py:76
def __call__(self, inputCatalog, outputCatalog, wcs, photoCalib)
Definition: transforms.py:80
def __call__(self, inputCatalog, outputCatalog, wcs, photoCalib)
Definition: transforms.py:108
def __init__(self, config, name, mapper)
Definition: transforms.py:128
def __call__(self, inputCatalog, outputCatalog, wcs, photoCalib)
Definition: transforms.py:133
def __call__(self, inputCatalog, outputCatalog, wcs, photoCalib)
Definition: transforms.py:157
def __init__(self, config, name, mapper)
Definition: transforms.py:153
Reports attempts to exceed implementation-defined length limits for some classes.
Definition: Runtime.h:76
daf::base::PropertySet * set
Definition: fits.cc:912