142 lsst.pipe.base.Task.__init__(self, **kwargs)
144 if self.config.do_measure_ap_corr:
148 namesToCorrect=[self.config.raw_calibflux_name],
151 name = self.config.normalized_calibflux_name
157 doc=f
"Normalized calibration flux from {self.config.raw_calibflux_name}.",
164 doc=f
"Normalized calibration flux error from {self.config.raw_calibflux_name}.",
171 doc=f
"Normalized calibration flux failure flag from {self.config.raw_calibflux_name}.",
174 if self.config.do_set_calib_slot:
175 schema.getAliasMap().set(
"slot_CalibFlux", name)
177 self.makeSubtask(
"fallback_source_selector")
181 def run(self, *, exposure, catalog):
182 """Measure the Normalized calibration flux.
186 exposure : `lsst.afw.image.Exposure`
187 Exposure the normalized calibration flux is measured on.
188 catalog : `lsst.afw.table.SourceCatalog`
189 SourceCatalog containing measurements to be used to compute
190 normalized calibration fluxes. The catalog is modified in-place.
194 Struct : `lsst.pipe.base.Struct`
195 Contains the following:
198 aperture correction map (`lsst.afw.image.ApCorrMap`)
199 that contains two entries for the raw flux field:
200 - flux field (e.g. config.{raw_calibflux_name}_instFlux): 2d model
201 - flux sigma field (e.g. config.{raw_calibflux_name}_instFluxErr): 0 field
203 self.log.info(
"Measuring normalized calibration flux from %s", self.config.raw_calibflux_name)
205 raw_name = self.config.raw_calibflux_name
206 raw_flux_name = raw_name +
"_instFlux"
207 raw_fluxerr_name = raw_name +
"_instFluxErr"
208 norm_name = self.config.normalized_calibflux_name
210 if self.config.do_measure_ap_corr:
214 ap_corr_map = exposure.info.getApCorrMap()
215 if ap_corr_map
is None:
217 "Exposure does not have a valid normalization map; using identity normalization.",
221 ap_corr_field = ap_corr_map.get(raw_flux_name)
222 ap_corr_err_field = ap_corr_map.get(raw_fluxerr_name)
223 if not ap_corr_field
or not ap_corr_err_field:
225 "Exposure aperture correction map is missing %s/%s for normalization; "
226 "using identity normalization.",
236 corrections = ap_corr_field.evaluate(
237 catalog[
"slot_Centroid_x"],
238 catalog[
"slot_Centroid_y"],
241 input_flux_name = raw_flux_name
242 input_fluxerr_name = raw_fluxerr_name
243 input_flag_name = raw_name +
"_flag"
244 output_flux_name = norm_name +
"_instFlux"
245 output_fluxerr_name = norm_name +
"_instFluxErr"
246 output_flag_name = norm_name +
"_flag"
248 if catalog.isContiguous():
249 catalog[output_flux_name] = catalog[input_flux_name] * corrections
250 catalog[output_fluxerr_name] = catalog[input_fluxerr_name] * corrections
252 output_flag = catalog[input_flag_name].copy()
253 output_flag[corrections <= 0.0] =
True
254 catalog[output_flag_name] = output_flag
257 for i, row
in enumerate(catalog):
258 row[output_flux_name] = row[input_flux_name] * corrections[i]
259 row[output_fluxerr_name] = row[input_fluxerr_name] * corrections[i]
261 if row[input_flag_name]
or corrections[i] <= 0.0:
262 row[output_flag_name] =
True
265 ap_corr_map[raw_flux_name] = ap_corr_field
266 ap_corr_map[raw_fluxerr_name] = ap_corr_err_field
268 return lsst.pipe.base.Struct(
269 ap_corr_map=ap_corr_map,
273 """Internal method to do the aperture correction measurement.
275 This measures the aperture correction with the regular task,
276 and if that fails does a fallback median estimate.
280 exposure : `lsst.afw.image.Exposure`
281 Exposure the normalized calibration flux is measured on.
282 This is only used for the bounding box.
283 catalog : `lsst.afw.table.SourceCatalog`
284 SourceCatalog containing measurements to be used to compute
285 normalized calibration flux.
289 ap_corr_field : `lsst.afw.math.ChebyshevBoundedField`
290 Aperture correction field to normalize the calibration flux.
291 ap_corr_err_field : `lsst.afw.math.ChebyshevBoundedField`
292 Aperture correction to adjust the calibration flux error.
294 raw_name = self.config.raw_calibflux_name
297 ap_corr_map = self.measure_ap_corr.
run(
302 ap_corr_field = ap_corr_map.get(raw_name +
"_instFlux")
303 except MeasureApCorrError
as e:
304 self.log.warning(
"Failed to measure full aperture correction for %s with the following error %s",
307 initSel = self.fallback_source_selector.
run(catalog, exposure=exposure).selected
308 sel = (initSel & ~catalog[self.config.raw_calibflux_name +
"_flag"]
309 & ~catalog[self.config.measure_ap_corr.refFluxName +
"_flag"])
311 if (n_sel := sel.sum()) == 0:
314 n_initial_sources=initSel.sum(),
315 n_calib_flux_flag=(initSel & ~catalog[self.config.raw_calibflux_name +
"_flag"]).sum(),
316 n_ref_flux_flag=(initSel
317 & ~catalog[self.config.measure_ap_corr.refFluxName +
"_flag"]).sum()
319 self.log.info(
"Measuring normalized flux correction with %d stars from fallback selector.",
323 catalog[self.config.measure_ap_corr.refFluxName +
"_instFlux"][sel]
324 / catalog[self.config.raw_calibflux_name +
"_instFlux"][sel]
332 if catalog.isContiguous():
333 catalog[
"apcorr_" + raw_name +
"_used"] = sel
335 for i, row
in enumerate(catalog):
336 row[
"apcorr_" + raw_name +
"_used"] = sel[i]
345 return ap_corr_field, ap_corr_err_field