22 """Definition and registration of classification plugins. 
   27 import lsst.pex.config
 
   28 from .catalogCalculation 
import CatalogCalculationPluginConfig, CatalogCalculationPlugin
 
   29 from .pluginRegistry 
import register
 
   32     "CatalogCalculationClassificationConfig", 
"CatalogCalculationClassificationPlugin",
 
   37     """Configuration for catalog classification plugin. 
   40     fluxRatio = lsst.pex.config.Field(dtype=float, default=.925, optional=
True,
 
   41                                       doc=
"critical ratio of model to psf flux")
 
   42     modelErrFactor = lsst.pex.config.Field(dtype=float, default=0.0, optional=
True,
 
   43                                            doc=
"correction factor for modelFlux error")
 
   44     psfErrFactor = lsst.pex.config.Field(dtype=float, default=0.0, optional=
True,
 
   45                                          doc=
"correction factor for psfFlux error")
 
   48 @
register(
"base_ClassificationExtendedness")
 
   50     """Plugin which calculates a binary measure of source extendedness. 
   52     Extendedness is based on a simple cut of the ratio of the PSF flux to the 
   57     Because the fluxes on which this algorithm is based on are slot 
   58     measurements, they can be provided by different algorithms, and the 
   59     `~CatalogCalculationClassificationConfig.fluxRatio` threshold used by this 
   60     algorithm should generally be set differently for different algorithms. 
   61     To do this, plot the difference between the PSF magnitude and the model 
   62     magnitude vs. the PSF magnitude, and look for where the cloud of galaxies 
   66     ConfigClass = CatalogCalculationClassificationConfig
 
   72     def __init__(self, config, name, schema, metadata):
 
   73         CatalogCalculationPlugin.__init__(self, config, name, schema, metadata)
 
   75                                               doc=
"Set to 1 for extended sources, 0 for point sources.")
 
   76         self.
keyFlag = schema.addField(name + 
"_flag", type=
"Flag", doc=
"Set to 1 for any fatal failure.")
 
   79         modelFlux = measRecord.getModelInstFlux()
 
   80         psfFlux = measRecord.getPsfInstFlux()
 
   81         modelFluxFlag = (measRecord.getModelFluxFlag()
 
   82                          if measRecord.table.getModelFluxSlot().
isValid()
 
   84         psfFluxFlag = (measRecord.getPsfFluxFlag()
 
   85                        if measRecord.table.getPsfFluxSlot().
isValid()
 
   87         flux1 = self.
config.fluxRatio*modelFlux
 
   88         if self.
config.modelErrFactor != 0:
 
   89             flux1 += self.
config.modelErrFactor*measRecord.getModelInstFluxErr()
 
   91         if not self.
config.psfErrFactor == 0:
 
   92             flux2 += self.
config.psfErrFactor*measRecord.getPsfInstFluxErr()
 
   98         if np.isnan(flux1) 
or np.isnan(flux2) 
or modelFluxFlag 
or psfFluxFlag:
 
  101             measRecord.set(self.
keyProbability, 0.0 
if flux1 < flux2 
else 1.0)
 
  103     def fail(self, measRecord, error=None):
 
  104         measRecord.set(self.
keyFlag, 
True)