24 """Base command-line driver task for forced measurement. Must be inherited to specialize for 25 a specific dataset to be used (see ForcedPhotCcdTask, ForcedPhotCoaddTask). 34 from .references
import MultiBandReferencesTask
35 from .forcedMeasurement
import ForcedMeasurementTask
36 from .applyApCorr
import ApplyApCorrTask
37 from .catalogCalculation
import CatalogCalculationTask
39 __all__ = (
"ForcedPhotImageConfig",
"ForcedPhotImageTask")
43 """!Config class for forced measurement driver task.""" 45 references = lsst.pex.config.ConfigurableField(
46 target=MultiBandReferencesTask,
47 doc=
"subtask to retrieve reference source catalog" 49 measurement = lsst.pex.config.ConfigurableField(
50 target=ForcedMeasurementTask,
51 doc=
"subtask to do forced measurement" 53 coaddName = lsst.pex.config.Field(
54 doc=
"coadd name: typically one of deep or goodSeeing",
58 doApCorr = lsst.pex.config.Field(
61 doc=
"Run subtask to apply aperture corrections" 63 applyApCorr = lsst.pex.config.ConfigurableField(
64 target=ApplyApCorrTask,
65 doc=
"Subtask to apply aperture corrections" 67 catalogCalculation = lsst.pex.config.ConfigurableField(
68 target=CatalogCalculationTask,
69 doc=
"Subtask to run catalogCalculation plugins on catalog" 86 """!A base class for command-line forced measurement drivers. 88 This is a an abstract class, which is the common ancestor for ForcedPhotCcdTask 89 and ForcedPhotCoaddTask. It provides the runDataRef() method that does most of 90 the work, while delegating a few customization tasks to other methods that are 91 overridden by subclasses. 93 This task is not directly usable as a CmdLineTask; subclasses must: 94 - Set the _DefaultName class attribute 95 - Implement makeIdFactory 96 - Implement fetchReferences 97 - (optional) Implement attachFootprints 99 ConfigClass = ForcedPhotImageConfig
100 _DefaultName =
"processImageForcedTask" 102 def __init__(self, butler=None, refSchema=None, **kwds):
103 """Initialize the task. 105 ForcedPhotImageTask takes two keyword arguments beyond the usual CmdLineTask arguments: 106 - refSchema: the Schema of the reference catalog, passed to the constructor of the references 108 - butler: a butler that will be passed to the references subtask to allow it to load its Schema 110 At least one of these arguments must be present; if both are, schema takes precedence. 112 super(lsst.pipe.base.CmdLineTask, self).
__init__(**kwds)
113 self.makeSubtask(
"references", butler=butler, schema=refSchema)
114 if refSchema
is None:
115 refSchema = self.references.schema
116 self.makeSubtask(
"measurement", refSchema=refSchema)
119 if self.config.doApCorr:
120 self.makeSubtask(
"applyApCorr", schema=self.measurement.schema)
121 self.makeSubtask(
'catalogCalculation', schema=self.measurement.schema)
124 """!Measure a single exposure for forced detection for a reference catalog using a dataRef. 126 @param[in] dataRef An lsst.daf.persistence.ButlerDataRef. It is passed to the 127 references subtask to obtain the reference WCS, the getExposure() 128 method (implemented by derived classes) to read the measurement 129 image, and the fetchReferences() method (implemented by derived 130 classes) to get the exposure and load the reference catalog (see 131 the CoaddSrcReferencesTask for more information). The sources are then 132 passed to the writeOutputs() method (implemented by derived classes) 133 which writes the outputs. See derived class documentation for which 134 datasets and data ID keys are used. 135 @param[in] psfCache Size of PSF cache, or None. The size of the PSF cache can have 136 a significant effect upon the runtime for complicated PSF models. 138 refWcs = self.references.getWcs(dataRef)
140 if psfCache
is not None:
141 exposure.getPsf().setCacheSize(psfCache)
144 measCat = self.measurement.generateMeasCat(exposure, refCat, refWcs,
146 self.log.info(
"Performing forced measurement on %s" % (dataRef.dataId,))
151 forcedPhotResult = self.
run(measCat, exposure, refCat, refWcs, exposureId=exposureId)
153 self.
writeOutput(dataRef, forcedPhotResult.measCat)
155 def run(self, measCat, exposure, refCat, refWcs, exposureId=None):
156 """!Measure a single exposure with forced detection for a reference catalog. 158 @param[in] measCat The measurement catalog generated by measurement.generateMeasCat(), 159 based on the sources listed in the reference catalog. 160 @param[in] exposure The measurement image upon which to perform forced detection. 161 @param[in] refCat The reference catalog of sources to measure. 162 @param[in] refWcs The WCS for the references. 163 @param[in] exposureId Optional unique exposureId used for random seed in measurement task. 165 @return result An lsst.pipe.base.Struct containing fields: 166 measCat Source catalog of forced measurement results from measurement.run(). 168 self.measurement.
run(measCat, exposure, refCat, refWcs, exposureId=exposureId)
169 if self.config.doApCorr:
170 self.applyApCorr.
run(
172 apCorrMap=exposure.getInfo().getApCorrMap()
174 self.catalogCalculation.
run(measCat)
176 return lsst.pipe.base.Struct(measCat=measCat)
179 """!Hook for derived classes to define how to make an IdFactory for forced sources. 181 Note that this is for forced source IDs, not object IDs, which are usually handled by 182 the measurement.copyColumns config option. 184 raise NotImplementedError()
187 raise NotImplementedError()
190 """!Hook for derived classes to define how to get references objects. 192 Derived classes should call one of the fetch* methods on the references subtask, 193 but which one they call depends on whether the region to get references for is a 194 easy to describe in patches (as it would be when doing forced measurements on a 195 coadd), or is just an arbitrary box (as it would be for CCD forced measurements). 197 raise NotImplementedError()
200 """!Hook for derived classes to define how to attach Footprints to blank sources prior to measurement 202 Footprints for forced photometry must be in the pixel coordinate system of the image being 203 measured, while the actual detections may start out in a different coordinate system. 205 Subclasses for ForcedPhotImageTask must implement this method to define how those Footprints 208 The default implementation (defined in forcedMeasurement.py) transforms the Footprints from 209 the reference catalog from the refWcs to the exposure's Wcs, which downgrades HeavyFootprints 210 into regular Footprints, destroying deblend information. 212 return self.measurement.attachTransformedFootprints(sources, refCat, exposure, refWcs)
215 """!Read input exposure on which to perform the measurements 217 @param dataRef Data reference from butler. 219 return dataRef.get(self.dataPrefix +
"calexp", immediate=
True)
222 """!Write forced source table 224 @param dataRef Data reference from butler; the forced_src dataset (with self.dataPrefix included) 225 is all that will be modified. 226 @param sources SourceCatalog to save 228 dataRef.put(sources, self.dataPrefix +
"forced_src", flags=lsst.afw.table.SOURCE_IO_NO_FOOTPRINTS)
231 """!Get a dict of Schema catalogs that will be used by this Task. 233 In the case of forced taks, there is only one schema for each type of forced measurement. 234 The dataset type for this measurement is defined in the mapper. 237 catalog.getTable().setMetadata(self.measurement.algMetadata)
238 datasetType = self.dataPrefix +
"forced_src" 239 return {datasetType: catalog}
241 def _getConfigName(self):
242 """!Return the name of the config dataset. Forces config comparison from run-to-run 244 return self.dataPrefix +
"forced_config" 246 def _getMetadataName(self):
247 """!Return the name of the metadata dataset. Forced metadata to be saved 249 return self.dataPrefix +
"forced_metadata" A base class for command-line forced measurement drivers.
def getExposure(self, dataRef)
Read input exposure on which to perform the measurements.
def runDataRef(self, dataRef, psfCache=None)
Measure a single exposure for forced detection for a reference catalog using a dataRef.
def fetchReferences(self, dataRef, exposure)
Hook for derived classes to define how to get references objects.
def run(self, measCat, exposure, refCat, refWcs, exposureId=None)
Measure a single exposure with forced detection for a reference catalog.
def makeIdFactory(self, dataRef)
Hook for derived classes to define how to make an IdFactory for forced sources.
def getExposureId(self, dataRef)
def __init__(self, butler=None, refSchema=None, kwds)
def getSchemaCatalogs(self)
Get a dict of Schema catalogs that will be used by this Task.
def writeOutput(self, dataRef, sources)
Write forced source table.
def attachFootprints(self, sources, refCat, exposure, refWcs, dataRef)
Hook for derived classes to define how to attach Footprints to blank sources prior to measurement...
Config class for forced measurement driver task.