24 from __future__
import print_function
25 import lsst.pex.config
as pexConfig
26 import lsst.pex.exceptions
as pexExceptions
27 import lsst.pipe.base
as pipeBase
28 import lsst.daf.base
as dafBase
29 import lsst.afw.geom
as afwGeom
30 import lsst.afw.math
as afwMath
31 import lsst.afw.table
as afwTable
32 from lsst.meas.algorithms
import SourceMeasurementTask
37 doDeblend = pexConfig.Field(dtype=bool, default=
True, doc=
"Deblend sources?")
38 doMeasurement = pexConfig.Field(dtype=bool, default=
True, doc=
"Measure sources?")
39 doWriteSources = pexConfig.Field(dtype=bool, default=
True, doc=
"Write sources?")
40 doWriteHeavyFootprintsInSources = pexConfig.Field(dtype=bool, default=
False,
41 doc=
"Include HeavyFootprint data in source table?")
43 sourceOutputFile = pexConfig.Field(
44 dtype=str, default=
None, doc=
"Write sources to given filename (default: use butler)", optional=
True)
46 deblend = pexConfig.ConfigurableField(
47 target=SourceDeblendTask,
48 doc=
"Split blended sources into their components",
50 measurement = pexConfig.ConfigurableField(
51 target=SourceMeasurementTask,
52 doc=
"Final source measurement on low-threshold detections",
57 ConfigClass = DeblendAndMeasureConfig
58 _DefaultName =
"deblendAndMeasure" 64 pipeBase.CmdLineTask.__init__(self, **kwargs)
67 def run(self, dataRef):
68 self.log.info(
"Processing %s" % (dataRef.dataId))
69 calexp = dataRef.get(
'calexp')
70 srcs = dataRef.get(
'src')
71 print(
'Calexp:', calexp)
78 mapper = afwTable.SchemaMapper(srcs.getSchema())
80 mapper.addMinimalSchema(srcs.getSchema(),
True)
81 schema = mapper.getOutputSchema()
83 if self.config.doDeblend:
84 self.makeSubtask(
"deblend", schema=schema)
85 if self.config.doMeasurement:
86 self.makeSubtask(
"measurement", schema=schema, algMetadata=self.
algMetadata)
91 if src.getParent() == 0:
94 outsources = afwTable.SourceCatalog(schema)
95 outsources.reserve(len(parents))
96 outsources.extend(parents, mapper=mapper)
98 print(len(srcs),
'sources before deblending')
100 if self.config.doDeblend:
101 self.deblend.
run(calexp, srcs)
103 if self.config.doMeasurement:
104 self.measurement.
run(calexp, srcs)
106 if srcs
is not None and self.config.doWriteSources:
107 sourceWriteFlags = (0
if self.config.doWriteHeavyFootprintsInSources
108 else afwTable.SOURCE_IO_NO_HEAVY_FOOTPRINTS)
109 print(
'Writing "src" outputs')
110 if self.config.sourceOutputFile:
111 srcs.writeFits(self.config.sourceOutputFile, flags=sourceWriteFlags)
113 dataRef.put(srcs,
'src', flags=sourceWriteFlags)
115 if __name__ ==
'__main__':
116 DeblendAndMeasureTask.parseAndRun()
def __init__(self, kwargs)
def writeConfig(self, args, kwargs)
algMetadata
FIXME – this whole mapping business is very fragile – it seems to fail, eg, if you don't set "-c d...