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()))