1 from builtins
import zip
29 from .forcedPhotImage
import ForcedPhotImageConfig, ForcedPhotImageTask
31 __all__ = (
"ForcedPhotCoaddConfig",
"ForcedPhotCoaddTask")
35 footprintDatasetName = lsst.pex.config.Field(
36 doc=
"Dataset (without coadd prefix) that should be used to obtain (Heavy)Footprints for sources. "
37 "Must have IDs that match those of the reference catalog."
38 "If None, Footprints will be generated by transforming the reference Footprints.",
45 ForcedPhotImageTask.ConfigClass.setDefaults(self)
49 self.measurement.copyColumns[
"id"] =
"id"
50 self.measurement.copyColumns[
"parent"] =
"parent"
51 self.references.removePatchOverlaps =
False
54 ForcedPhotImageTask.ConfigClass.validate(self)
56 and self.references.removePatchOverlaps):
57 raise ValueError(
"Cannot use removePatchOverlaps=True with deblended footprints, as parent "
58 "sources may be rejected while their children are not.")
70 A command-line driver for performing forced measurement on coadd images
72 This task is a subclass of ForcedPhotImageTask which is specifically for doing forced
73 measurement on a coadd, using as a reference catalog detections which were made on overlapping
74 coadds (i.e. in other bands).
76 The run method (inherited from ForcedPhotImageTask) takes a lsst.daf.persistence.ButlerDataRef
77 argument that corresponds to a coadd image. This is used to provide all the inputs and outputs
79 - A "*Coadd_src" (e.g. "deepCoadd_src") dataset is used as the reference catalog. This not loaded
80 directly from the passed dataRef, however; only the patch and tract are used, while the filter
81 is set by the configuration for the references subtask (see CoaddSrcReferencesTask).
82 - A "*Coadd_calexp" (e.g. "deepCoadd_calexp") dataset is used as the measurement image. Note that
83 this means that ProcessCoaddTask must be run on an image before ForcedPhotCoaddTask, in order
84 to generate the "*Coadd_calexp" dataset.
85 - A "*Coadd_forced_src" (e.g. "deepCoadd_forced_src") dataset will be written with the output
88 In addition to the run method, ForcedPhotCcdTask overrides several methods of ForcedPhotImageTask
89 to specialize it for coadd processing, including makeIdFactory() and fetchReferences(). None of these
90 should be called directly by the user, though it may be useful to override them further in subclasses.
93 ConfigClass = ForcedPhotCoaddConfig
94 RunnerClass = lsst.pipe.base.ButlerInitializedTaskRunner
95 _DefaultName =
"forcedPhotCoadd"
96 dataPrefix =
"deepCoadd_"
99 name = self.config.coaddName +
"Coadd_calexp"
100 return dataRef.get(name)
if dataRef.datasetExists(name)
else None
103 """Create an object that generates globally unique source IDs from per-CCD IDs and the CCD ID.
105 @param dataRef Data reference from butler. The "CoaddId_bits" and "CoaddId"
106 datasets are accessed. The data ID must have tract and patch keys.
113 expBits = dataRef.get(self.config.coaddName +
"CoaddId_bits")
114 expId = int(dataRef.get(self.config.coaddName +
"CoaddId"))
118 return int(dataRef.get(self.config.coaddName +
"CoaddId"))
121 """Return an iterable of reference sources which overlap the exposure
123 @param dataRef Data reference from butler corresponding to the image to be measured;
124 should have tract, patch, and filter keys.
125 @param exposure lsst.afw.image.Exposure to be measured (not used by this implementation)
127 All work is delegated to the references subtask; see CoaddSrcReferencesTask for information
128 about the default behavior.
130 skyMap = dataRef.get(self.
dataPrefix +
"skyMap", immediate=
True)
131 tractInfo = skyMap[dataRef.dataId[
"tract"]]
132 patch = tuple(int(v)
for v
in dataRef.dataId[
"patch"].split(
","))
133 patchInfo = tractInfo.getPatchInfo(patch)
135 references.extend(self.references.fetchInPatches(dataRef, patchList=[patchInfo]))
139 """For coadd forced photometry, we use the deblended HeavyFootprints from the single-band
140 measurements of the same band - because we've guaranteed that the peaks (and hence child sources)
141 will be consistent across all bands before we get to measurement, this should yield reasonable
142 deblending for most sources. It's most likely limitation is that it will not provide good flux
143 upper limits for sources that were not detected in this band but were blended with sources that
146 if self.config.footprintDatasetName
is None:
147 return ForcedPhotImageTask.attachFootprints(self, sources, refCat, exposure, refWcs, dataRef)
148 self.log.info(
"Loading deblended footprints for sources from %s, %s" %
149 (self.config.footprintDatasetName, dataRef.dataId))
150 fpCat = dataRef.get(
"%sCoadd_%s" % (self.config.coaddName, self.config.footprintDatasetName),
152 for refRecord, srcRecord
in zip(refCat, sources):
153 fpRecord = fpCat.find(refRecord.getId())
155 raise LookupError(
"Cannot find Footprint for source %s; please check that %sCoadd_%s "
156 "IDs are compatible with reference source IDs" %
157 (srcRecord.getId(), self.config.coaddName,
158 self.config.footprintDatasetName))
159 srcRecord.setFootprint(fpRecord.getFootprint())
163 parser = lsst.pipe.base.ArgumentParser(name=cls._DefaultName)
164 parser.add_id_argument(
"--id",
"deepCoadd_forced_src", help=
"data ID, with raw CCD keys + tract",
165 ContainerClass=lsst.coadd.utils.CoaddDataIdContainer)
Custom catalog class for record/table subclasses that are guaranteed to have an ID, and should generally be sorted by that ID.
A command-line driver for performing forced measurement on coadd images.
tuple footprintDatasetName
static boost::shared_ptr< IdFactory > makeSource(RecordId expId, int reserved)
Return an IdFactory that includes another, fixed ID in the higher-order bits.