24 "NumberSciSourcesMetricTask",
"NumberSciSourcesMetricConfig",
25 "FractionDiaSourcesToSciSourcesMetricTask",
"FractionDiaSourcesToSciSourcesMetricConfig",
29 import astropy.units
as u
31 from lsst.pipe.base
import Struct, PipelineTaskConnections, connectionTypes
32 from lsst.verify
import Measurement
33 from lsst.verify.gen2tasks
import register
34 from lsst.verify.tasks
import MetricTask, MetricComputationError
38 PipelineTaskConnections,
39 dimensions={
"Instrument",
"Exposure",
"Detector"}):
40 sources = connectionTypes.Input(
41 doc=
"The catalog of science sources.",
43 storageClass=
"SourceCatalog",
44 dimensions={
"Instrument",
"Exposure",
"Detector"},
49 MetricTask.ConfigClass,
50 pipelineConnections=NumberSciSourcesMetricConnections):
56 """Task that computes the number of cataloged science sources. 58 _DefaultName =
"numSciSources" 59 ConfigClass = NumberSciSourcesMetricConfig
61 def run(self, sources):
62 """Count the number of science sources. 66 sources : `lsst.afw.table.SourceCatalog` or `None` 67 A science source catalog, which may be empty or `None`. 71 result : `lsst.pipe.base.Struct` 72 A `~lsst.pipe.base.Struct` containing the following component: 75 the total number of science sources (`lsst.verify.Measurement` 78 if sources
is not None:
79 nSciSources = len(sources)
82 self.log.info(
"Nothing to do: no catalogs found.")
84 return Struct(measurement=meas)
88 return "ip_diffim.numSciSources" 92 PipelineTaskConnections,
93 dimensions={
"Instrument",
"Exposure",
"Detector"},
94 defaultTemplates={
"coaddName":
"deep"}):
95 sciSources = connectionTypes.Input(
96 doc=
"The catalog of science sources.",
98 storageClass=
"SourceCatalog",
99 dimensions={
"Instrument",
"Exposure",
"Detector"},
101 diaSources = connectionTypes.Input(
102 doc=
"The catalog of DIASources.",
103 name=
"{coaddName}Diff_diaSrc",
104 storageClass=
"SourceCatalog",
105 dimensions={
"Instrument",
"Exposure",
"Detector"},
109 class FractionDiaSourcesToSciSourcesMetricConfig(
110 MetricTask.ConfigClass,
111 pipelineConnections=FractionDiaSourcesToSciSourcesMetricConnections):
115 @
register(
"fracDiaSourcesToSciSources")
116 class FractionDiaSourcesToSciSourcesMetricTask(MetricTask):
117 """Task that computes the ratio of difference image sources to science 118 sources in an image, visit, etc. 120 _DefaultName =
"fracDiaSourcesToSciSources" 121 ConfigClass = FractionDiaSourcesToSciSourcesMetricConfig
123 def run(self, sciSources, diaSources):
124 """Compute the ratio of DIASources to science sources. 128 sciSources : `lsst.afw.table.SourceCatalog` or `None` 129 A science source catalog, which may be empty or `None`. 130 diaSources : `lsst.afw.table.SourceCatalog` or `None` 131 A DIASource catalog for the same unit of processing 136 result : `lsst.pipe.base.Struct` 137 A `~lsst.pipe.base.Struct` containing the following component: 140 the ratio (`lsst.verify.Measurement` or `None`) 142 if diaSources
is not None and sciSources
is not None:
143 nSciSources = len(sciSources)
144 nDiaSources = len(diaSources)
145 metricName = self.getOutputMetricName(self.config)
146 if nSciSources <= 0.0:
147 raise MetricComputationError(
148 "No science sources found; ratio of DIASources to science sources ill-defined.")
150 meas = Measurement(metricName, nDiaSources / nSciSources * u.dimensionless_unscaled)
152 self.log.info(
"Nothing to do: no catalogs found.")
154 return Struct(measurement=meas)
157 def getOutputMetricName(cls, config):
158 return "ip_diffim.fracDiaSourcesToSciSources"
def getOutputMetricName(cls, config)