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 MetricTask, register
34 from lsst.verify.tasks
import 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"},
50 MetricTask.ConfigClass,
51 pipelineConnections=NumberSciSourcesMetricConnections):
57 """Task that computes the number of cataloged science sources. 59 _DefaultName =
"numSciSources" 60 ConfigClass = NumberSciSourcesMetricConfig
62 def run(self, sources):
63 """Count the number of science sources. 67 sources : iterable of `lsst.afw.table.SourceCatalog` 68 A collection of science source catalogs, one for each unit of 69 processing to be incorporated into this metric. Its elements may 70 be `None` to represent missing data. 74 result : `lsst.pipe.base.Struct` 75 A `~lsst.pipe.base.Struct` containing the following component: 78 the total number of science sources (`lsst.verify.Measurement` 83 for catalog
in sources:
84 if catalog
is not None:
85 nSciSources += len(catalog)
91 self.log.info(
"Nothing to do: no catalogs found.")
93 return Struct(measurement=meas)
97 return "ip_diffim.numSciSources" 101 PipelineTaskConnections,
102 dimensions={
"Instrument",
"Exposure",
"Detector"},
103 defaultTemplates={
"coaddName":
"deep"}):
104 sciSources = connectionTypes.Input(
105 doc=
"The catalog of science sources.",
107 storageClass=
"SourceCatalog",
108 dimensions={
"Instrument",
"Exposure",
"Detector"},
111 diaSources = connectionTypes.Input(
112 doc=
"The catalog of DIASources.",
113 name=
"{coaddName}Diff_diaSrc",
114 storageClass=
"SourceCatalog",
115 dimensions={
"Instrument",
"Exposure",
"Detector"},
120 class FractionDiaSourcesToSciSourcesMetricConfig(
121 MetricTask.ConfigClass,
122 pipelineConnections=FractionDiaSourcesToSciSourcesMetricConnections):
126 @
register(
"fracDiaSourcesToSciSources")
127 class FractionDiaSourcesToSciSourcesMetricTask(MetricTask):
128 """Task that computes the ratio of difference image sources to science 129 sources in an image, visit, etc. 131 _DefaultName =
"fracDiaSourcesToSciSources" 132 ConfigClass = FractionDiaSourcesToSciSourcesMetricConfig
134 def run(self, sciSources, diaSources):
135 """Compute the ratio of DIASources to science sources. 139 sciSources : iterable of `lsst.afw.table.SourceCatalog` 140 A collection of science source catalogs, one for each unit of 141 processing to be incorporated into this metric. Its elements may 142 be `None` to represent missing data. 143 diaSources : iterable of `lsst.afw.table.SourceCatalog` 144 A collection of difference imaging catalogs similar to 149 result : `lsst.pipe.base.Struct` 150 A `~lsst.pipe.base.Struct` containing the following component: 153 the ratio (`lsst.verify.Measurement` or `None`) 159 for sciCatalog, diaCatalog
in zip(sciSources, diaSources):
160 if diaCatalog
is not None and sciCatalog
is not None:
161 nSciSources += len(sciCatalog)
162 nDiaSources += len(diaCatalog)
166 metricName = self.getOutputMetricName(self.config)
167 if nSciSources <= 0.0:
168 raise MetricComputationError(
169 "No science sources found; ratio of DIASources to science sources ill-defined.")
170 meas = Measurement(metricName, 0.0 * u.dimensionless_unscaled)
172 meas = Measurement(metricName, nDiaSources / nSciSources * u.dimensionless_unscaled)
174 self.log.info(
"Nothing to do: no catalogs found.")
176 return Struct(measurement=meas)
179 def getOutputMetricName(cls, config):
180 return "ip_diffim.fracDiaSourcesToSciSources"
def getOutputMetricName(cls, config)