22"""Measurement transformations.
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.
28At construction, the transformation is passed the configuration and name of
29the plugin whose outputs it will be transforming (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
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
44Transformations can be defined in Python or in C++. Python code should inherit
45from `MeasurementTransform`, following its interface.
50from ._measBaseLib
import CentroidResultKey
52__all__ = (
"MeasurementTransform",
"NullTransform",
"PassThroughTransform",
"SimpleCentroidTransform")
56 """Base class for measurement transformations.
60 config : subclass of `BasePluginConfig`
61 The configuration of the measurement plugin whose outputs are being
64 The name of the measurement plugin whose outputs are being
66 mapper : `lsst.afw.table.SchemaMapper`
67 Mapping between the input (pre-transformation) and output
68 (transformed) catalogs.
72 Create transformations by deriving from this class, implementing
73 `__call__()` and (optionally) augmenting `__init__()`.
80 def __call__(self, inputCatalog, outputCatalog, wcs, photoCalib):
90 """Null transform which transfers no data from input to output.
92 This is intended as the default for measurements for which no other
93 transformation is specified.
97 config : subclass of `BasePluginConfig`
98 The configuration of the measurement plugin whose outputs are being
101 The name of the measurement plugin whose outputs are being
103 mapper : `lsst.afw.table.SchemaMapper`
104 Mapping between the input (pre-transformation) and output
105 (transformed) catalogs.
108 def __call__(self, inputCatalog, outputCatalog, wcs, photoCalib):
113 """Copy fields from input to output without transformation.
117 config : subclass of `BasePluginConfig`
118 The configuration of the measurement plugin whose outputs are being
121 The name of the measurement plugin whose outputs are being
123 mapper : `lsst.afw.table.SchemaMapper`
124 Mapping between the input (pre-transformation) and output
125 (transformed) catalogs.
129 MeasurementTransform.__init__(self, config, name, mapper)
130 for key, field
in mapper.getInputSchema().extract(name +
"*").values():
131 mapper.addMapping(key)
133 def __call__(self, inputCatalog, outputCatalog, wcs, photoCalib):
138 """Transform pixel centroid, without uncertainty, to celestial coordinates.
142 config : subclass of `BasePluginConfig`
143 The configuration of the measurement plugin whose outputs are being
146 The name of the measurement plugin whose outputs are being
148 mapper : `lsst.afw.table.SchemaMapper`
149 Mapping between the input (pre-transformation) and output
150 (transformed) catalogs.
154 MeasurementTransform.__init__(self, config, name, mapper)
155 self.
coordKey = CoordKey.addFields(mapper.editOutputSchema(), name,
"Position from " + name)
157 def __call__(self, inputCatalog, outputCatalog, wcs, photoCalib):
159 centroidResultKey = CentroidResultKey(inputCatalog.schema[self.
name])
160 for inSrc, outSrc
in zip(inputCatalog, outputCatalog):
161 self.
coordKey.set(outSrc, wcs.pixelToSky(centroidResultKey.get(inSrc).getCentroid()))