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