22 """Measurement transformations.
24 When a measurement plugin is run, it provides raw, uncalibrated outputs such
25 as pixel positions. A transformation may be run as a post-processing step to
26 convert those outputs to calibrated quantities, such as celestial coordinates.
28 At construction, the transformation is passed the configuration and name of
29 the plugin whose outputs it will be transformaing (all fields in the input
30 table produced by that plugin will have their field names prefixed by the
31 plugin name) and a `~lsst.afw.table.SchemaMapper` which holds the schemata for
32 the input and output catalogs and which may be used to directly map fields
35 When a transformer is called, it is handed a `~lsst.afw.table.SourceCatalog`
36 containing the measurements to be transformed, a `~lsst.afw.table.BaseCatalog`
37 in which to store results, and information about the WCS and calibration of
38 the 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
40 not possible, it should be aborted by throwing an exception; if this happens,
41 the caller should assume that the contents of the output catalog are
44 Transformations can be defined in Python or in C++. Python code should inherit
45 from `MeasurementTransform`, following its interface.
50 from .
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):
81 raise NotImplementedError()
84 def _checkCatalogSize(cat1, cat2):
85 if len(cat1) != len(cat2):
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()))