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 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
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
67 Mapping between the input (pre-transformation) and output
68 (transformed) catalogs.
72 Create transformations by deriving
from this
class, implementing
80 def __call__(self, inputCatalog, outputCatalog, wcs, photoCalib):
81 raise NotImplementedError()
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
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
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
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()))
A mapping between the keys of two Schemas, used to copy data between them.
Reports attempts to exceed implementation-defined length limits for some classes.
daf::base::PropertySet * set