183 lsst.pipe.base.Task.__init__(self, **kwds)
187 ignoreSet = set(self.config.ignoreList)
188 missingNameSet = ignoreSet - set(apCorrNameSet)
190 self.log.warning(
"Fields in ignoreList that are not in fluxCorrectList: %s",
191 sorted(missingNameSet))
192 for name
in sorted(apCorrNameSet - ignoreSet):
193 if schema
is not None and name +
"_instFlux" not in schema:
198 for name, model
in self.config.proxies.items():
199 if name
in apCorrNameSet:
202 if schema
is not None and name +
"_instFlux" not in schema:
207 def run(self, catalog, apCorrMap):
208 """Apply aperture corrections to a catalog of sources.
212 catalog : `lsst.afw.table.SourceCatalog` or `astropy.table.Table`
213 Catalog of sources. Will be updated in place.
214 apCorrMap : `lsst.afw.image.ApCorrMap`
215 Aperture correction map
219 If you show debug-level log messages then you will see statistics for
220 the effects of aperture correction.
222 self.log.info(
"Applying aperture corrections to %d instFlux fields", len(self.
apCorrInfoDict))
224 self.log.debug(
"Use naive instFlux sigma computation")
226 self.log.debug(
"Use complex instFlux sigma computation that double-counts photon noise "
227 "and thus over-estimates instFlux uncertainty")
230 periodicLog = PeriodicLogger(self.log)
232 if isinstance(catalog, astropy.table.Table):
235 xColumn = self.config.xColumn
236 yColumn = self.config.yColumn
238 for apCorrIndex, apCorrInfo
in enumerate(self.
apCorrInfoDict.values()):
239 apCorrModel = apCorrMap.get(apCorrInfo.modelName)
240 apCorrErrModel = apCorrMap.get(apCorrInfo.modelSigmaName)
241 if None in (apCorrModel, apCorrErrModel):
242 missingNames = [(apCorrInfo.modelName, apCorrInfo.modelSigmaName)[i]
243 for i, model
in enumerate((apCorrModel, apCorrErrModel))
if model
is None]
244 self.log.warning(
"Cannot aperture correct %s because could not find %s in apCorrMap",
245 apCorrInfo.name,
" or ".join(missingNames))
246 catalog[apCorrInfo.apCorrFlagName] = np.ones(len(catalog), dtype=np.bool_)
250 catalog[apCorrInfo.apCorrFlagName] =
True
251 oldFluxFlagState = np.zeros(len(catalog), dtype=np.bool_)
252 if self.config.doFlagApCorrFailures:
253 oldFluxFlagState = catalog[apCorrInfo.fluxFlagName]
254 catalog[apCorrInfo.fluxFlagName] =
True
256 apCorr = apCorrModel.evaluate(catalog[xColumn], catalog[yColumn])
257 if not UseNaiveFluxErr:
258 apCorrErr = apCorrErrModel.evaluate(
263 apCorrErr = np.zeros(len(catalog))
265 if apCorrInfo.doApCorrColumn:
266 catalog[apCorrInfo.apCorrName] = apCorr
267 catalog[apCorrInfo.apCorrErrName] = apCorrErr
270 good = np.isfinite(apCorr) & (apCorr > 0.0) & (apCorrErr >= 0.0)
275 instFlux = catalog[apCorrInfo.instFluxName]
276 instFluxErr = catalog[apCorrInfo.instFluxErrName]
277 catalog[apCorrInfo.instFluxName][good] = instFlux[good]*apCorr[good]
279 catalog[apCorrInfo.instFluxErrName][good] = instFluxErr[good]*apCorr[good]
281 a = instFluxErr[good]/instFlux[good]
282 b = apCorrErr[good]/apCorr[good]
283 err = np.abs(instFlux[good]*apCorr[good])*np.sqrt(a*a + b*b)
284 catalog[apCorrInfo.instFluxErrName][good] = err
286 flags = catalog[apCorrInfo.apCorrFlagName].copy()
288 catalog[apCorrInfo.apCorrFlagName] = flags
289 if self.config.doFlagApCorrFailures:
290 fluxFlags = catalog[apCorrInfo.fluxFlagName].copy()
291 fluxFlags[good] = oldFluxFlagState[good]
292 catalog[apCorrInfo.fluxFlagName] = fluxFlags
295 periodicLog.log(
"Aperture corrections applied to %d fields out of %d",
298 if self.log.isEnabledFor(self.log.DEBUG):
300 apCorrArr = np.asarray([s[apCorrInfo.instFluxName]
for s
in catalog])
301 apCorrErrArr = np.asarray([s[apCorrInfo.instFluxErrName]
for s
in catalog])
302 self.log.debug(
"For instFlux field %r: mean apCorr=%s, stdDev apCorr=%s, "
303 "mean apCorrErr=%s, stdDev apCorrErr=%s for %s sources",
304 apCorrInfo.name, apCorrArr.mean(), apCorrArr.std(),
305 apCorrErrArr.mean(), apCorrErrArr.std(), len(catalog))
308 """Prepare an astropy table for use with this task.
312 table : `astropy.table.Table`
317 `astropy.table.Table`
321 if apCorrInfo.apCorrName
not in table.colnames:
322 table[apCorrInfo.apCorrName] = np.zeros(len(table), dtype=np.float64)
323 if apCorrInfo.apCorrErrName
not in table.colnames:
324 table[apCorrInfo.apCorrErrName] = np.zeros(len(table), dtype=np.float64)
325 if apCorrInfo.apCorrFlagName
not in table.colnames:
326 table[apCorrInfo.apCorrFlagName] = np.zeros(len(table), dtype=bool)
327 if apCorrInfo.fluxFlagName
not in table.colnames:
328 table[apCorrInfo.fluxFlagName] = np.zeros(len(table), dtype=bool)