metricsMaskPlanes = lsst.pex.config.ListField(
dtype=str,
doc="List of mask planes to include in metrics",
default=('BAD', 'CLIPPED', 'CR', 'DETECTED', 'DETECTED_NEGATIVE', 'EDGE',
'INEXACT_PSF', 'INJECTED', 'INJECTED_TEMPLATE', 'INTRP', 'NOT_DEBLENDED',
'NO_DATA', 'REJECTED', 'SAT', 'SAT_TEMPLATE', 'SENSOR_EDGE', 'STREAK', 'SUSPECT',
'UNMASKEDNAN',
),
)
metricSources = pexConfig.ConfigurableField(
target=SkyObjectsTask,
doc="Generate QA metric sources",
)
def setDefaults(self):
self.metricSources.avoidMask = ["NO_DATA", "EDGE"]
class SpatiallySampledMetricsTask(lsst.pipe.base.PipelineTask):
ConfigClass = SpatiallySampledMetricsConfig
_DefaultName = "spatiallySampledMetrics"
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.makeSubtask("metricSources")
self.schema = afwTable.SourceTable.makeMinimalSchema()
self.schema.addField(
"x", "F",
"X location of the metric evaluation.",
units="pixel")
self.schema.addField(
"y", "F",
"Y location of the metric evaluation.",
units="pixel")
self.metricSources.skySourceKey = self.schema.addField("sky_source", type="Flag",
doc="Metric evaluation objects.")
self.schema.addField(
"source_density", "F",
"Density of diaSources at location.",
units="count/degree^2")
self.schema.addField(
"dipole_density", "F",
"Density of dipoles at location.",
units="count/degree^2")
self.schema.addField(
"dipole_direction", "F",
"Mean dipole orientation.",
units="radian")
self.schema.addField(
"dipole_separation", "F",
"Mean dipole separation.",
units="pixel")
self.schema.addField(
"template_value", "F",
"Median of template at location.",
units="nJy")
self.schema.addField(
"template_variance", "F",
"Median of template variance at location.",
units="nJy^2")
self.schema.addField(
"science_value", "F",
"Median of science at location.",
units="nJy")
self.schema.addField(
"science_variance", "F",
"Median of science variance at location.",
units="nJy^2")
self.schema.addField(
"diffim_value", "F",
"Median of diffim at location.",
units="nJy")
self.schema.addField(
"diffim_variance", "F",
"Median of diffim variance at location.",
units="nJy^2")
self.schema.addField(
"diffim_chi2PerPix", "F",
"Robust normalized noise of diffim at location:"
" (1.4826*MAD(image))^2 / median(variance), evaluated on background"
" pixels (DETECTED, DETECTED_NEGATIVE, BAD, SAT, EDGE, NO_DATA excluded)."
" Expected ~1.0 for a well-decorrelated diffim; values >>1 indicate"
" residual structure, <<1 indicates over-estimated variance.")
self.schema.addField(
"science_psfSize", "F",
"Width of the science image PSF at location.",
units="pixel")
self.schema.addField(
"template_psfSize", "F",
"Width of the template image PSF at location.",
units="pixel")
for maskPlane in self.config.metricsMaskPlanes:
self.schema.addField(
"%s_mask_fraction"%maskPlane.lower(), "F",
"Fraction of pixels with %s mask"%maskPlane
)
self.schema.addField(
"psfMatchingKernel_sum", "F",
"PSF matching kernel sum at location.")
self.schema.addField(
"psfMatchingKernel_dx", "F",
"PSF matching kernel centroid offset in x at location.",
units="pixel")
self.schema.addField(
"psfMatchingKernel_dy", "F",
"PSF matching kernel centroid offset in y at location.",
units="pixel")
self.schema.addField(
"psfMatchingKernel_length", "F",
"PSF matching kernel centroid offset module.",
units="arcsecond")
self.schema.addField(
"psfMatchingKernel_position_angle", "F",
"PSF matching kernel centroid offset position angle.",
units="radian")
self.schema.addField(
"psfMatchingKernel_direction", "F",
"PSF matching kernel centroid offset direction in detector plane.",
units="radian")
self.schema.addField(
"psfMatchingKernel_residualNorm", "F",
"Shape-only PSF match residual at location:"
"L2 norm of (K-convolved template PSF - science PSF),"
" relative to the science PSF L2 norm. Larger values indicate worse"
" PSF matching. Assumes the kernel was solved to convolve the template.")
@timeMethod
def run(self, science, template, difference, diaSources, psfMatchingKernel):
Definition at line 224 of file computeSpatiallySampledMetrics.py.