210 def run(self, measCat, exposure, noiseImage=None, exposureId=None, beginOrder=None, endOrder=None):
211 r"""Run single frame measurement over an exposure and source catalog.
215 measCat : `lsst.afw.table.SourceCatalog`
216 Catalog to be filled with the results of measurement. Must contain
217 all the `lsst.afw.table.SourceRecord`\ s to be measured (with
218 `lsst.afw.detection.Footprint`\ s attached), and have a schema
219 that is a superset of ``self.schema``.
220 exposure : `lsst.afw.image.ExposureF`
221 Image containing the pixel data to be measured together with
222 associated PSF, WCS, etc.
223 noiseImage : `lsst.afw.image.ImageF`, optional
224 Can be used to specify the a predictable noise replacement field
225 for testing purposes.
226 exposureId : `int`, optional
227 Unique exposure identifier used to calculate the random number
228 generator seed during noise replacement.
229 beginOrder : `float`, optional
230 Start execution order (inclusive): measurements with
231 ``executionOrder < beginOrder`` are not executed. `None` for no
233 endOrder : `float`, optional
234 Final execution order (exclusive): measurements with
235 ``executionOrder >= endOrder`` are not executed. `None` for no
238 assert measCat.getSchema().contains(self.
schema)
239 footprints = {measRecord.getId(): (measRecord.getParent(), measRecord.getFootprint())
240 for measRecord
in measCat}
248 if self.config.doReplaceWithNoise:
249 noiseReplacer =
NoiseReplacer(self.config.noiseReplacer, exposure, footprints,
250 noiseImage=noiseImage, log=self.log, exposureId=exposureId)
251 algMetadata = measCat.getMetadata()
252 if algMetadata
is not None:
256 if exposureId
is not None:
261 self.
runPlugins(noiseReplacer, measCat, exposure, beginOrder, endOrder)
263 def runPlugins(self, noiseReplacer, measCat, exposure, beginOrder=None, endOrder=None):
264 r"""Call the configured measument plugins on an image.
268 noiseReplacer : `NoiseReplacer`
269 Used to fill sources not being measured with noise.
270 measCat : `lsst.afw.table.SourceCatalog`
271 Catalog to be filled with the results of measurement. Must contain
272 all the `lsst.afw.table.SourceRecord`\ s to be measured (with
273 `lsst.afw.detection.Footprint`\ s attached), and have a schema
274 that is a superset of ``self.schema``.
275 exposure : `lsst.afw.image.ExposureF`
276 Image containing the pixel data to be measured together with
277 associated PSF, WCS, etc.
278 beginOrder : `float`, optional
279 Start execution order (inclusive): measurements with
280 ``executionOrder < beginOrder`` are not executed. `None` for no
282 endOrder : `float`, optional
283 Final execution order (exclusive): measurements with
284 ``executionOrder >= endOrder`` are not executed. `None` for no
289 measParentCat = measCat.getChildren(0)
291 nMeasCat =
len(measCat)
292 nMeasParentCat =
len(measParentCat)
293 self.log.
info(
"Measuring %d source%s (%d parent%s, %d child%s) ",
294 nMeasCat, (
"" if nMeasCat == 1
else "s"),
295 nMeasParentCat, (
"" if nMeasParentCat == 1
else "s"),
296 nMeasCat - nMeasParentCat, (
"" if nMeasCat - nMeasParentCat == 1
else "ren"))
299 periodicLog = PeriodicLogger(self.log)
301 childrenIter = measCat.getChildren([measParentRecord.getId()
for measParentRecord
in measParentCat])
302 for parentIdx, (measParentRecord, measChildCat)
in enumerate(
zip(measParentCat, childrenIter)):
307 for measChildRecord
in measChildCat:
308 noiseReplacer.insertSource(measChildRecord.getId())
309 self.
callMeasure(measChildRecord, exposure, beginOrder=beginOrder, endOrder=endOrder)
312 self.
blendPlugin.cpp.measureChildPixels(exposure.getMaskedImage(), measChildRecord)
314 noiseReplacer.removeSource(measChildRecord.getId())
317 noiseReplacer.insertSource(measParentRecord.getId())
318 self.
callMeasure(measParentRecord, exposure, beginOrder=beginOrder, endOrder=endOrder)
321 self.
blendPlugin.cpp.measureChildPixels(exposure.getMaskedImage(), measParentRecord)
324 self.
callMeasureN(measParentCat[parentIdx:parentIdx+1], exposure,
325 beginOrder=beginOrder, endOrder=endOrder)
326 self.
callMeasureN(measChildCat, exposure, beginOrder=beginOrder, endOrder=endOrder)
327 noiseReplacer.removeSource(measParentRecord.getId())
329 periodicLog.log(
"Measurement complete for %d parents (and their children) out of %d",
330 parentIdx + 1, nMeasParentCat)
337 for sourceIndex, source
in enumerate(measCat):
341 periodicLog.log(
"Undeblended measurement complete for %d sources out of %d",
342 sourceIndex + 1, nMeasCat)
347 for source
in measCat:
348 self.
blendPlugin.cpp.measureParentPixels(exposure.getMaskedImage(), source)