23 from builtins
import zip
27 import lsst.coadd.utils
30 from .forcedPhotImage
import ForcedPhotImageConfig, ForcedPhotImageTask
32 __all__ = (
"ForcedPhotCoaddConfig",
"ForcedPhotCoaddTask")
36 footprintDatasetName = lsst.pex.config.Field(
37 doc=
"Dataset (without coadd prefix) that should be used to obtain (Heavy)Footprints for sources. " 38 "Must have IDs that match those of the reference catalog." 39 "If None, Footprints will be generated by transforming the reference Footprints.",
46 ForcedPhotImageTask.ConfigClass.setDefaults(self)
53 self.
measurement.plugins.names |= [
'base_InputCount',
'base_Variance']
54 self.
measurement.plugins[
'base_PixelFlags'].masksFpAnywhere = [
'CLIPPED',
'SENSOR_EDGE',
55 'REJECTED',
'INEXACT_PSF']
56 self.
measurement.plugins[
'base_PixelFlags'].masksFpCenter = [
'CLIPPED',
'SENSOR_EDGE',
57 'REJECTED',
'INEXACT_PSF']
60 ForcedPhotImageTask.ConfigClass.validate(self)
63 raise ValueError(
"Cannot use removePatchOverlaps=True with deblended footprints, as parent " 64 "sources may be rejected while their children are not.")
75 """Get the psfCache setting into ForcedPhotCoaddTask""" 78 return lsst.pipe.base.ButlerInitializedTaskRunner.getTargetList(parsedCmd,
79 psfCache=parsedCmd.psfCache)
84 A command-line driver for performing forced measurement on coadd images 86 This task is a subclass of ForcedPhotImageTask which is specifically for doing forced 87 measurement on a coadd, using as a reference catalog detections which were made on overlapping 88 coadds (i.e. in other bands). 90 The run method (inherited from ForcedPhotImageTask) takes a lsst.daf.persistence.ButlerDataRef 91 argument that corresponds to a coadd image. This is used to provide all the inputs and outputs 93 - A "*Coadd_src" (e.g. "deepCoadd_src") dataset is used as the reference catalog. This not loaded 94 directly from the passed dataRef, however; only the patch and tract are used, while the filter 95 is set by the configuration for the references subtask (see CoaddSrcReferencesTask). 96 - A "*Coadd_calexp" (e.g. "deepCoadd_calexp") dataset is used as the measurement image. Note that 97 this means that ProcessCoaddTask must be run on an image before ForcedPhotCoaddTask, in order 98 to generate the "*Coadd_calexp" dataset. 99 - A "*Coadd_forced_src" (e.g. "deepCoadd_forced_src") dataset will be written with the output 102 In addition to the run method, ForcedPhotCcdTask overrides several methods of ForcedPhotImageTask 103 to specialize it for coadd processing, including makeIdFactory() and fetchReferences(). None of these 104 should be called directly by the user, though it may be useful to override them further in subclasses. 107 ConfigClass = ForcedPhotCoaddConfig
108 RunnerClass = lsst.pipe.base.ButlerInitializedTaskRunner
109 _DefaultName =
"forcedPhotCoadd" 110 dataPrefix =
"deepCoadd_" 113 name = self.config.coaddName +
"Coadd_calexp" 114 return dataRef.get(name)
if dataRef.datasetExists(name)
else None 117 """Create an object that generates globally unique source IDs from per-CCD IDs and the CCD ID. 119 @param dataRef Data reference from butler. The "CoaddId_bits" and "CoaddId" 120 datasets are accessed. The data ID must have tract and patch keys. 127 expBits = dataRef.get(self.config.coaddName +
"CoaddId_bits")
128 expId = int(dataRef.get(self.config.coaddName +
"CoaddId"))
132 return int(dataRef.get(self.config.coaddName +
"CoaddId"))
135 """Return an iterable of reference sources which overlap the exposure 137 @param dataRef Data reference from butler corresponding to the image to be measured; 138 should have tract, patch, and filter keys. 139 @param exposure lsst.afw.image.Exposure to be measured (not used by this implementation) 141 All work is delegated to the references subtask; see CoaddSrcReferencesTask for information 142 about the default behavior. 144 skyMap = dataRef.get(self.
dataPrefix +
"skyMap", immediate=
True)
145 tractInfo = skyMap[dataRef.dataId[
"tract"]]
146 patch = tuple(int(v)
for v
in dataRef.dataId[
"patch"].split(
","))
147 patchInfo = tractInfo.getPatchInfo(patch)
149 references.extend(self.references.fetchInPatches(dataRef, patchList=[patchInfo]))
153 """For coadd forced photometry, we use the deblended HeavyFootprints from the single-band 154 measurements of the same band - because we've guaranteed that the peaks (and hence child sources) 155 will be consistent across all bands before we get to measurement, this should yield reasonable 156 deblending for most sources. It's most likely limitation is that it will not provide good flux 157 upper limits for sources that were not detected in this band but were blended with sources that 160 if self.config.footprintDatasetName
is None:
161 return ForcedPhotImageTask.attachFootprints(self, sources, refCat, exposure, refWcs, dataRef)
162 self.log.info(
"Loading deblended footprints for sources from %s, %s" %
163 (self.config.footprintDatasetName, dataRef.dataId))
164 fpCat = dataRef.get(
"%sCoadd_%s" % (self.config.coaddName, self.config.footprintDatasetName),
166 for refRecord, srcRecord
in zip(refCat, sources):
167 fpRecord = fpCat.find(refRecord.getId())
169 raise LookupError(
"Cannot find Footprint for source %s; please check that %sCoadd_%s " 170 "IDs are compatible with reference source IDs" %
171 (srcRecord.getId(), self.config.coaddName,
172 self.config.footprintDatasetName))
173 srcRecord.setFootprint(fpRecord.getFootprint())
176 def _makeArgumentParser(cls):
177 parser = lsst.pipe.base.ArgumentParser(name=cls.
_DefaultName)
178 parser.add_id_argument(
"--id",
"deepCoadd_forced_src", help=
"data ID, with raw CCD keys + tract",
179 ContainerClass=lsst.coadd.utils.CoaddDataIdContainer)
180 parser.add_argument(
"--psfCache", type=int, default=100, help=
"Size of CoaddPsf cache")
A base class for command-line forced measurement drivers.
static std::shared_ptr< IdFactory > makeSource(RecordId expId, int reserved)
def getExposure(self, dataRef)
def attachFootprints(self, sources, refCat, exposure, refWcs, dataRef)
A command-line driver for performing forced measurement on coadd images.
def makeIdFactory(self, dataRef)
def getExposureId(self, dataRef)
def getTargetList(parsedCmd, kwargs)
Config class for forced measurement driver task.
def fetchReferences(self, dataRef, exposure)