27 from .forcedPhotImage
import ForcedPhotImageConfig, ForcedPhotImageTask
29 __all__ = (
"ForcedPhotCoaddConfig",
"ForcedPhotCoaddTask")
34 doc=
"Dataset (without coadd prefix) that should be used to obtain (Heavy)Footprints for sources. " 35 "Must have IDs that match those of the reference catalog." 36 "If None, Footprints will be generated by transforming the reference Footprints.",
45 doc=
"Should be set to True if fake sources have been inserted into the input data." 49 ForcedPhotImageTask.ConfigClass.setDefaults(self)
56 self.
measurement.plugins.names |= [
'base_InputCount',
'base_Variance']
57 self.
measurement.plugins[
'base_PixelFlags'].masksFpAnywhere = [
'CLIPPED',
'SENSOR_EDGE',
58 'REJECTED',
'INEXACT_PSF']
59 self.
measurement.plugins[
'base_PixelFlags'].masksFpCenter = [
'CLIPPED',
'SENSOR_EDGE',
60 'REJECTED',
'INEXACT_PSF']
63 ForcedPhotImageTask.ConfigClass.validate(self)
66 raise ValueError(
"Cannot use removePatchOverlaps=True with deblended footprints, as parent " 67 "sources may be rejected while their children are not.")
71 """Get the psfCache setting into ForcedPhotCoaddTask""" 74 return lsst.pipe.base.ButlerInitializedTaskRunner.getTargetList(parsedCmd,
75 psfCache=parsedCmd.psfCache)
79 """A command-line driver for performing forced measurement on coadd images. 83 In addition to the run method, `ForcedPhotCcdTask` overrides several 84 methods of `ForcedPhotImageTask` to specialize it for coadd processing, 85 including `~ForcedPhotImageTask.makeIdFactory` and 86 `~ForcedPhotImageTask.fetchReferences`. None of these should be called 87 directly by the user, though it may be useful to override them further in 91 ConfigClass = ForcedPhotCoaddConfig
93 _DefaultName =
"forcedPhotCoadd" 94 dataPrefix =
"deepCoadd_" 99 name =
"fakes_" + self.
config.coaddName +
"Coadd_calexp" 101 name = self.
config.coaddName +
"Coadd_calexp" 103 return dataRef.get(name)
if dataRef.datasetExists(name)
else None 106 """Create an object that generates globally unique source IDs. 108 Source IDs are created based on a per-CCD ID and the ID of the CCD 113 dataRef : `lsst.daf.persistence.ButlerDataRef` 114 Butler data reference. The "CoaddId_bits" and "CoaddId" datasets 115 are accessed. The data ID must have tract and patch keys. 124 expBits = dataRef.get(self.
config.coaddName +
"CoaddId_bits")
125 expId =
int(dataRef.get(self.
config.coaddName +
"CoaddId"))
129 return int(dataRef.get(self.
config.coaddName +
"CoaddId"))
132 """Return an iterable of reference sources which overlap the exposure. 136 dataRef : `lsst.daf.persistence.ButlerDataRef` 137 Butler data reference corresponding to the image to be measured; 138 should have tract, patch, and filter keys. 140 exposure : `lsst.afw.image.Exposure` 145 All work is delegated to the references subtask; see 146 `CoaddSrcReferencesTask` for information about the default behavior. 148 skyMap = dataRef.get(self.
dataPrefix +
"skyMap", immediate=
True)
149 tractInfo = skyMap[dataRef.dataId[
"tract"]]
150 patch = tuple(
int(v)
for v
in dataRef.dataId[
"patch"].split(
","))
151 patchInfo = tractInfo.getPatchInfo(patch)
153 references.extend(self.references.fetchInPatches(dataRef, patchList=[patchInfo]))
157 r"""Attach Footprints to source records. 159 For coadd forced photometry, we use the deblended "heavy" 160 `~lsst.afw.detection.Footprint`\ s from the single-band measurements 161 of the same band - because we've guaranteed that the peaks (and hence 162 child sources) will be consistent across all bands before we get to 163 measurement, this should yield reasonable deblending for most sources. 164 It's most likely limitation is that it will not provide good flux 165 upper limits for sources that were not detected in this band but were 166 blended with sources that were. 168 if self.
config.footprintDatasetName
is None:
169 return ForcedPhotImageTask.attachFootprints(self, sources, refCat, exposure, refWcs, dataRef)
170 self.
log.
info(
"Loading deblended footprints for sources from %s, %s" %
171 (self.
config.footprintDatasetName, dataRef.dataId))
172 fpCat = dataRef.get(
"%sCoadd_%s" % (self.
config.coaddName, self.
config.footprintDatasetName),
174 for refRecord, srcRecord
in zip(refCat, sources):
175 fpRecord = fpCat.find(refRecord.getId())
177 raise LookupError(
"Cannot find Footprint for source %s; please check that %sCoadd_%s " 178 "IDs are compatible with reference source IDs" %
179 (srcRecord.getId(), self.
config.coaddName,
180 self.
config.footprintDatasetName))
181 srcRecord.setFootprint(fpRecord.getFootprint())
184 def _makeArgumentParser(cls):
186 parser.add_id_argument(
"--id",
"deepCoadd_forced_src", help=
"data ID, with raw CCD keys + tract",
188 parser.add_argument(
"--psfCache", type=int, default=100, help=
"Size of CoaddPsf cache")
static std::shared_ptr< IdFactory > makeSource(RecordId expId, int reserved)
Return an IdFactory that includes another, fixed ID in the higher-order bits.
def getExposure(self, dataRef)
def attachFootprints(self, sources, refCat, exposure, refWcs, dataRef)
def makeIdFactory(self, dataRef)
def getExposureId(self, dataRef)
def getTargetList(parsedCmd, kwargs)
def fetchReferences(self, dataRef, exposure)