187 lsst.pipe.base.Task.__init__(self, **kwds)
191 ignoreSet = set(self.config.ignoreList)
192 missingNameSet = ignoreSet - set(apCorrNameSet)
194 self.log.warning(
"Fields in ignoreList that are not in fluxCorrectList: %s",
195 sorted(missingNameSet))
196 for name
in sorted(apCorrNameSet - ignoreSet):
197 if schema
is not None and name +
"_instFlux" not in schema:
202 for name, model
in self.config.proxies.items():
203 if name
in apCorrNameSet:
206 if schema
is not None and name +
"_instFlux" not in schema:
211 def run(self, catalog, apCorrMap):
212 """Apply aperture corrections to a catalog of sources.
216 catalog : `lsst.afw.table.SourceCatalog` or `astropy.table.Table`
217 Catalog of sources. Will be updated in place.
218 apCorrMap : `lsst.afw.image.ApCorrMap`
219 Aperture correction map
223 If you show debug-level log messages then you will see statistics for
224 the effects of aperture correction.
226 self.log.info(
"Applying aperture corrections to %d instFlux fields", len(self.
apCorrInfoDict))
228 self.log.debug(
"Use naive instFlux sigma computation")
230 self.log.debug(
"Use complex instFlux sigma computation that double-counts photon noise "
231 "and thus over-estimates instFlux uncertainty")
234 periodicLog = PeriodicLogger(self.log)
236 if isinstance(catalog, astropy.table.Table):
239 xColumn = self.config.xColumn
240 yColumn = self.config.yColumn
242 for apCorrIndex, apCorrInfo
in enumerate(self.
apCorrInfoDict.values()):
243 apCorrModel = apCorrMap.get(apCorrInfo.modelName)
244 apCorrErrModel = apCorrMap.get(apCorrInfo.modelSigmaName)
245 if None in (apCorrModel, apCorrErrModel):
246 missingNames = [(apCorrInfo.modelName, apCorrInfo.modelSigmaName)[i]
247 for i, model
in enumerate((apCorrModel, apCorrErrModel))
if model
is None]
248 self.log.warning(
"Cannot aperture correct %s because could not find %s in apCorrMap",
249 apCorrInfo.name,
" or ".join(missingNames))
250 catalog[apCorrInfo.apCorrFlagName] = np.ones(len(catalog), dtype=np.bool_)
254 catalog[apCorrInfo.apCorrFlagName] =
True
255 oldFluxFlagState = np.zeros(len(catalog), dtype=np.bool_)
256 if self.config.doFlagApCorrFailures:
257 oldFluxFlagState = catalog[apCorrInfo.fluxFlagName]
258 catalog[apCorrInfo.fluxFlagName] =
True
260 apCorr = apCorrModel.evaluate(catalog[xColumn], catalog[yColumn])
261 if not UseNaiveFluxErr:
262 apCorrErr = apCorrErrModel.evaluate(
267 apCorrErr = np.zeros(len(catalog))
269 if apCorrInfo.doApCorrColumn:
270 catalog[apCorrInfo.apCorrName] = apCorr
271 catalog[apCorrInfo.apCorrErrName] = apCorrErr
274 good = np.isfinite(apCorr) & (apCorr > 0.0) & (apCorrErr >= 0.0)
279 instFlux = catalog[apCorrInfo.instFluxName]
280 instFluxErr = catalog[apCorrInfo.instFluxErrName]
281 catalog[apCorrInfo.instFluxName][good] = instFlux[good]*apCorr[good]
283 catalog[apCorrInfo.instFluxErrName][good] = instFluxErr[good]*apCorr[good]
285 a = instFluxErr[good]/instFlux[good]
286 b = apCorrErr[good]/apCorr[good]
287 err = np.abs(instFlux[good]*apCorr[good])*np.sqrt(a*a + b*b)
288 catalog[apCorrInfo.instFluxErrName][good] = err
290 flags = catalog[apCorrInfo.apCorrFlagName].copy()
292 catalog[apCorrInfo.apCorrFlagName] = flags
293 if self.config.doFlagApCorrFailures:
294 fluxFlags = catalog[apCorrInfo.fluxFlagName].copy()
295 fluxFlags[good] = oldFluxFlagState[good]
296 catalog[apCorrInfo.fluxFlagName] = fluxFlags
299 periodicLog.log(
"Aperture corrections applied to %d fields out of %d",
302 if self.log.isEnabledFor(self.log.DEBUG):
304 apCorrArr = np.asarray([s[apCorrInfo.instFluxName]
for s
in catalog])
305 apCorrErrArr = np.asarray([s[apCorrInfo.instFluxErrName]
for s
in catalog])
306 self.log.debug(
"For instFlux field %r: mean apCorr=%s, stdDev apCorr=%s, "
307 "mean apCorrErr=%s, stdDev apCorrErr=%s for %s sources",
308 apCorrInfo.name, apCorrArr.mean(), apCorrArr.std(),
309 apCorrErrArr.mean(), apCorrErrArr.std(), len(catalog))
312 """Prepare an astropy table for use with this task.
316 table : `astropy.table.Table`
321 `astropy.table.Table`
325 if apCorrInfo.apCorrName
not in table.colnames:
326 table[apCorrInfo.apCorrName] = np.zeros(len(table), dtype=np.float64)
327 if apCorrInfo.apCorrErrName
not in table.colnames:
328 table[apCorrInfo.apCorrErrName] = np.zeros(len(table), dtype=np.float64)
329 if apCorrInfo.apCorrFlagName
not in table.colnames:
330 table[apCorrInfo.apCorrFlagName] = np.zeros(len(table), dtype=bool)
331 if apCorrInfo.fluxFlagName
not in table.colnames:
332 table[apCorrInfo.fluxFlagName] = np.zeros(len(table), dtype=bool)