LSST Applications g044012fb7c+6976b5ec80,g04a91732dc+88a5fc122b,g07dc498a13+7e3c5f68a2,g114c6a66ad+09472d7a76,g1409bbee79+7e3c5f68a2,g1a7e361dbc+7e3c5f68a2,g1fd858c14a+3a43eabc0e,g35bb328faa+fcb1d3bbc8,g3bd4b5ce2c+2647bb081c,g4e0f332c67+5d362be553,g53246c7159+fcb1d3bbc8,g5477a8d5ce+b19c77c7ae,g58d0cdf3ff+4a2e102ff8,g60b5630c4e+09472d7a76,g623d845a50+09472d7a76,g6f0c2978f1+fcf1c0bcd6,g71fabbc107+09472d7a76,g75b6c65c88+d0b1dc44cc,g78460c75b0+2f9a1b4bcd,g786e29fd12+cf7ec2a62a,g7b71ed6315+fcb1d3bbc8,g8852436030+349c7e81d4,g89139ef638+7e3c5f68a2,g9125e01d80+fcb1d3bbc8,g95236ca021+f7a31438ed,g989de1cb63+7e3c5f68a2,g9f33ca652e+f17d666fbc,gaaedd4e678+7e3c5f68a2,gabe3b4be73+1e0a283bba,gb1101e3267+f870f33517,gb58c049af0+f03b321e39,gc99c83e5f0+76d20ab76d,gcf25f946ba+349c7e81d4,gd0fa69b896+f3a65fa83c,gd6cbbdb0b4+c8606af20c,gde0f65d7ad+5bd27d919f,ge278dab8ac+932305ba37,gfba249425e+fcb1d3bbc8,w.2025.07
LSST Data Management Base Package
Loading...
Searching...
No Matches
lsst.ip.diffim.dipoleMeasurement.DipoleMeasurementTask Class Reference
Inheritance diagram for lsst.ip.diffim.dipoleMeasurement.DipoleMeasurementTask:
lsst.meas.base.sfm.SingleFrameMeasurementTask lsst.meas.base.baseMeasurement.BaseMeasurementTask

Public Member Functions

 run (self, measCat, exposure, noiseImage=None, exposureId=None, beginOrder=None, endOrder=None, footprints=None)
 
 runPlugins (self, noiseReplacer, measCat, exposure, beginOrder=None, endOrder=None)
 
 measure (self, measCat, exposure)
 
 initializePlugins (self, **kwds)
 
 callMeasure (self, measRecord, *args, **kwds)
 
 doMeasurement (self, plugin, measRecord, *args, **kwds)
 
 callMeasureN (self, measCat, *args, **kwds)
 
 doMeasurementN (self, plugin, measCat, *args, **kwds)
 

Static Public Member Functions

 getFootprintsFromCatalog (catalog)
 

Public Attributes

 schema = schema
 
bool doBlendedness = True
 
 blendPlugin = self.plugins['base_Blendedness']
 
 undeblendedPlugins = PluginMap()
 
 keyInvalidPsf = schema.find(invalidPsfName).key
 

Static Public Attributes

str NOISE_SEED_MULTIPLIER = "NOISE_SEED_MULTIPLIER"
 
str NOISE_SOURCE = "NOISE_SOURCE"
 
str NOISE_OFFSET = "NOISE_OFFSET"
 
str NOISE_EXPOSURE_ID = "NOISE_EXPOSURE_ID"
 
 ConfigClass = BaseMeasurementConfig
 
 plugins = None
 
 algMetadata = None
 

Static Protected Attributes

str _DefaultName = "measurement"
 

Detailed Description

Measurement of Sources, specifically ones from difference images, for characterization as dipoles

Parameters
----------
sources : 'lsst.afw.table.SourceCatalog'
    Sources that will be measured
badFlags : `list` of `dict`
    A list of flags that will be used to determine if there was a measurement problem

Definition at line 121 of file dipoleMeasurement.py.

Member Function Documentation

◆ callMeasure()

lsst.meas.base.baseMeasurement.BaseMeasurementTask.callMeasure ( self,
measRecord,
* args,
** kwds )
inherited
Call ``measure`` on all plugins and consistently handle exceptions.

Parameters
----------
measRecord : `lsst.afw.table.SourceRecord`
    The record corresponding to the object being measured. Will be
    updated in-place with the results of measurement.
*args
    Positional arguments forwarded to ``plugin.measure``
**kwds
    Keyword arguments. Two are handled locally:

    beginOrder : `int`
        Beginning execution order (inclusive). Measurements with
        ``executionOrder`` < ``beginOrder`` are not executed. `None`
        for no limit.

    endOrder : `int`
        Ending execution order (exclusive). Measurements with
        ``executionOrder`` >= ``endOrder`` are not executed. `None`
        for no limit.

    Others are forwarded to ``plugin.measure()``.

Notes
-----
This method can be used with plugins that have different signatures;
the only requirement is that ``measRecord`` be the first argument.
Subsequent positional arguments and keyword arguments are forwarded
directly to the plugin.

This method should be considered "protected": it is intended for use by
derived classes, not users.

Definition at line 344 of file baseMeasurement.py.

344 def callMeasure(self, measRecord, *args, **kwds):
345 """Call ``measure`` on all plugins and consistently handle exceptions.
346
347 Parameters
348 ----------
349 measRecord : `lsst.afw.table.SourceRecord`
350 The record corresponding to the object being measured. Will be
351 updated in-place with the results of measurement.
352 *args
353 Positional arguments forwarded to ``plugin.measure``
354 **kwds
355 Keyword arguments. Two are handled locally:
356
357 beginOrder : `int`
358 Beginning execution order (inclusive). Measurements with
359 ``executionOrder`` < ``beginOrder`` are not executed. `None`
360 for no limit.
361
362 endOrder : `int`
363 Ending execution order (exclusive). Measurements with
364 ``executionOrder`` >= ``endOrder`` are not executed. `None`
365 for no limit.
366
367 Others are forwarded to ``plugin.measure()``.
368
369 Notes
370 -----
371 This method can be used with plugins that have different signatures;
372 the only requirement is that ``measRecord`` be the first argument.
373 Subsequent positional arguments and keyword arguments are forwarded
374 directly to the plugin.
375
376 This method should be considered "protected": it is intended for use by
377 derived classes, not users.
378 """
379 beginOrder = kwds.pop("beginOrder", None)
380 endOrder = kwds.pop("endOrder", None)
381 for plugin in self.plugins.iter():
382 if beginOrder is not None and plugin.getExecutionOrder() < beginOrder:
383 continue
384 if endOrder is not None and plugin.getExecutionOrder() >= endOrder:
385 break
386 self.doMeasurement(plugin, measRecord, *args, **kwds)
387

◆ callMeasureN()

lsst.meas.base.baseMeasurement.BaseMeasurementTask.callMeasureN ( self,
measCat,
* args,
** kwds )
inherited
Call ``measureN`` on all plugins and consistently handle exceptions.

Parameters
----------
measCat : `lsst.afw.table.SourceCatalog`
    Catalog containing only the records for the source family to be
    measured, and where outputs should be written.
*args
    Positional arguments forwarded to ``plugin.measure()``
**kwds
    Keyword arguments. Two are handled locally:

    beginOrder:
        Beginning execution order (inclusive): Measurements with
        ``executionOrder`` < ``beginOrder`` are not executed. `None`
        for no limit.
    endOrder:
        Ending execution order (exclusive): measurements with
        ``executionOrder`` >= ``endOrder`` are not executed. `None` for
        no ``limit``.

    Others are are forwarded to ``plugin.measure()``.

Notes
-----
This method can be used with plugins that have different signatures;
the only requirement is that ``measRecord`` be the first argument.
Subsequent positional arguments and keyword arguments are forwarded
directly to the plugin.

This method should be considered "protected": it is intended for use by
derived classes, not users.

Definition at line 436 of file baseMeasurement.py.

436 def callMeasureN(self, measCat, *args, **kwds):
437 """Call ``measureN`` on all plugins and consistently handle exceptions.
438
439 Parameters
440 ----------
441 measCat : `lsst.afw.table.SourceCatalog`
442 Catalog containing only the records for the source family to be
443 measured, and where outputs should be written.
444 *args
445 Positional arguments forwarded to ``plugin.measure()``
446 **kwds
447 Keyword arguments. Two are handled locally:
448
449 beginOrder:
450 Beginning execution order (inclusive): Measurements with
451 ``executionOrder`` < ``beginOrder`` are not executed. `None`
452 for no limit.
453 endOrder:
454 Ending execution order (exclusive): measurements with
455 ``executionOrder`` >= ``endOrder`` are not executed. `None` for
456 no ``limit``.
457
458 Others are are forwarded to ``plugin.measure()``.
459
460 Notes
461 -----
462 This method can be used with plugins that have different signatures;
463 the only requirement is that ``measRecord`` be the first argument.
464 Subsequent positional arguments and keyword arguments are forwarded
465 directly to the plugin.
466
467 This method should be considered "protected": it is intended for use by
468 derived classes, not users.
469 """
470 beginOrder = kwds.pop("beginOrder", None)
471 endOrder = kwds.pop("endOrder", None)
472 for plugin in self.plugins.iterN():
473 if beginOrder is not None and plugin.getExecutionOrder() < beginOrder:
474 continue
475 if endOrder is not None and plugin.getExecutionOrder() >= endOrder:
476 break
477 self.doMeasurementN(plugin, measCat, *args, **kwds)
478

◆ doMeasurement()

lsst.meas.base.baseMeasurement.BaseMeasurementTask.doMeasurement ( self,
plugin,
measRecord,
* args,
** kwds )
inherited
Call ``measure`` on the specified plugin.

Exceptions are handled in a consistent way.

Parameters
----------
plugin : subclass of `BasePlugin`
    Plugin that will be executed.
measRecord : `lsst.afw.table.SourceRecord`
    The record corresponding to the object being measured. Will be
    updated in-place with the results of measurement.
*args
    Positional arguments forwarded to ``plugin.measure()``.
**kwds
    Keyword arguments forwarded to ``plugin.measure()``.

Notes
-----
This method can be used with plugins that have different signatures;
the only requirement is that ``plugin`` and ``measRecord`` be the first
two arguments.  Subsequent positional arguments and keyword arguments
are forwarded directly to the plugin.

This method should be considered "protected": it is intended for use by
derived classes, not users.

Definition at line 388 of file baseMeasurement.py.

388 def doMeasurement(self, plugin, measRecord, *args, **kwds):
389 """Call ``measure`` on the specified plugin.
390
391 Exceptions are handled in a consistent way.
392
393 Parameters
394 ----------
395 plugin : subclass of `BasePlugin`
396 Plugin that will be executed.
397 measRecord : `lsst.afw.table.SourceRecord`
398 The record corresponding to the object being measured. Will be
399 updated in-place with the results of measurement.
400 *args
401 Positional arguments forwarded to ``plugin.measure()``.
402 **kwds
403 Keyword arguments forwarded to ``plugin.measure()``.
404
405 Notes
406 -----
407 This method can be used with plugins that have different signatures;
408 the only requirement is that ``plugin`` and ``measRecord`` be the first
409 two arguments. Subsequent positional arguments and keyword arguments
410 are forwarded directly to the plugin.
411
412 This method should be considered "protected": it is intended for use by
413 derived classes, not users.
414 """
415 try:
416 plugin.measure(measRecord, *args, **kwds)
417 except FATAL_EXCEPTIONS:
418 raise
419 except MeasurementError as error:
420 self.log.getChild(plugin.name).debug(
421 "MeasurementError in %s.measure on record %s: %s",
422 plugin.name, measRecord.getId(), error)
423 plugin.fail(measRecord, error)
424 except InvalidPsfError as error:
425 self.log.getChild(plugin.name).debug(
426 "InvalidPsfError in %s.measure on record %s: %s",
427 plugin.name, measRecord.getId(), error)
428 measRecord.set(self.keyInvalidPsf, True)
429 plugin.fail(measRecord)
430 except Exception as error:
431 self.log.getChild(plugin.name).warning(
432 "Exception in %s.measure on record %s: %s",
433 plugin.name, measRecord.getId(), error)
434 plugin.fail(measRecord)
435

◆ doMeasurementN()

lsst.meas.base.baseMeasurement.BaseMeasurementTask.doMeasurementN ( self,
plugin,
measCat,
* args,
** kwds )
inherited
Call ``measureN`` on the specified plugin.

Exceptions are handled in a consistent way.

Parameters
----------
plugin : subclass of `BasePlugin`
    Plugin that will be executed.
measCat : `lsst.afw.table.SourceCatalog`
    Catalog containing only the records for the source family to be
    measured, and where outputs should be written.
*args
    Positional arguments forwarded to ``plugin.measureN()``.
**kwds
    Keyword arguments forwarded to ``plugin.measureN()``.

Notes
-----
This method can be used with plugins that have different signatures;
the only requirement is that the ``plugin`` and ``measCat`` be the
first two arguments. Subsequent positional arguments and keyword
arguments are forwarded directly to the plugin.

This method should be considered "protected": it is intended for use by
derived classes, not users.

Definition at line 479 of file baseMeasurement.py.

479 def doMeasurementN(self, plugin, measCat, *args, **kwds):
480 """Call ``measureN`` on the specified plugin.
481
482 Exceptions are handled in a consistent way.
483
484 Parameters
485 ----------
486 plugin : subclass of `BasePlugin`
487 Plugin that will be executed.
488 measCat : `lsst.afw.table.SourceCatalog`
489 Catalog containing only the records for the source family to be
490 measured, and where outputs should be written.
491 *args
492 Positional arguments forwarded to ``plugin.measureN()``.
493 **kwds
494 Keyword arguments forwarded to ``plugin.measureN()``.
495
496 Notes
497 -----
498 This method can be used with plugins that have different signatures;
499 the only requirement is that the ``plugin`` and ``measCat`` be the
500 first two arguments. Subsequent positional arguments and keyword
501 arguments are forwarded directly to the plugin.
502
503 This method should be considered "protected": it is intended for use by
504 derived classes, not users.
505 """
506 try:
507 plugin.measureN(measCat, *args, **kwds)
508 except FATAL_EXCEPTIONS:
509 raise
510
511 except MeasurementError as error:
512 self.log.getChild(plugin.name).debug(
513 "MeasurementError in %s.measureN on records %s-%s: %s",
514 plugin.name, measCat[0].getId(), measCat[-1].getId(), error)
515 for measRecord in measCat:
516 plugin.fail(measRecord, error)
517 except InvalidPsfError as error:
518 self.log.getChild(plugin.name).debug(
519 "InvalidPsfError in %s.measureN on records %s-%s: %s",
520 plugin.name, measCat[0].getId(), measCat[-1].getId(), error)
521 for measRecord in measCat:
522 measRecord.set(self.keyInvalidPsf, True)
523 plugin.fail(measRecord, error)
524 except Exception as error:
525 self.log.getChild(plugin.name).warning(
526 "Exception in %s.measureN on records %s-%s: %s",
527 plugin.name, measCat[0].getId(), measCat[-1].getId(), error)
528 for measRecord in measCat:
529 plugin.fail(measRecord)
530

◆ getFootprintsFromCatalog()

lsst.meas.base.baseMeasurement.BaseMeasurementTask.getFootprintsFromCatalog ( catalog)
staticinherited
Get a set of footprints from a catalog, keyed by id.

Parameters
----------
catalog : `lsst.afw.table.SourceCatalog`
    Catalog with `lsst.afw.detection.Footprint`s attached.

Returns
-------
footprints : `dict` [`int`: (`int`, `lsst.afw.detection.Footprint`)]
    Dictionary of footprint, keyed by id number, with a tuple of
    the parent id and footprint.

Definition at line 532 of file baseMeasurement.py.

532 def getFootprintsFromCatalog(catalog):
533 """Get a set of footprints from a catalog, keyed by id.
534
535 Parameters
536 ----------
537 catalog : `lsst.afw.table.SourceCatalog`
538 Catalog with `lsst.afw.detection.Footprint`s attached.
539
540 Returns
541 -------
542 footprints : `dict` [`int`: (`int`, `lsst.afw.detection.Footprint`)]
543 Dictionary of footprint, keyed by id number, with a tuple of
544 the parent id and footprint.
545 """
546 return {measRecord.getId(): (measRecord.getParent(), measRecord.getFootprint())
547 for measRecord in catalog}

◆ initializePlugins()

lsst.meas.base.baseMeasurement.BaseMeasurementTask.initializePlugins ( self,
** kwds )
inherited
Initialize plugins (and slots) according to configuration.

Parameters
----------
**kwds
    Keyword arguments forwarded directly to plugin constructors.

Notes
-----
Derived class constructors should call this method to fill the
`plugins` attribute and add corresponding output fields and slot
aliases to the output schema.

In addition to the attributes added by `BaseMeasurementTask.__init__`,
a ``schema``` attribute holding the output schema must be present
before this method is called.

Keyword arguments are forwarded directly to plugin constructors,
allowing derived classes to use plugins with different signatures.

Definition at line 274 of file baseMeasurement.py.

274 def initializePlugins(self, **kwds):
275 """Initialize plugins (and slots) according to configuration.
276
277 Parameters
278 ----------
279 **kwds
280 Keyword arguments forwarded directly to plugin constructors.
281
282 Notes
283 -----
284 Derived class constructors should call this method to fill the
285 `plugins` attribute and add corresponding output fields and slot
286 aliases to the output schema.
287
288 In addition to the attributes added by `BaseMeasurementTask.__init__`,
289 a ``schema``` attribute holding the output schema must be present
290 before this method is called.
291
292 Keyword arguments are forwarded directly to plugin constructors,
293 allowing derived classes to use plugins with different signatures.
294 """
295 # Make a place at the beginning for the centroid plugin to run first
296 # (because it's an OrderedDict, adding an empty element in advance
297 # means it will get run first when it's reassigned to the actual
298 # Plugin).
299 if self.config.slots.centroid is not None:
300 self.plugins[self.config.slots.centroid] = None
301 # Init the plugins, sorted by execution order. At the same time add to
302 # the schema
303 for executionOrder, name, config, PluginClass in sorted(self.config.plugins.apply()):
304 # Pass logName to the plugin if the plugin is marked as using it
305 # The task will use this name to log plugin errors, regardless.
306 if getattr(PluginClass, "hasLogName", False):
307 self.plugins[name] = PluginClass(config, name, metadata=self.algMetadata,
308 logName=self.log.getChild(name).name, **kwds)
309 else:
310 self.plugins[name] = PluginClass(config, name, metadata=self.algMetadata, **kwds)
311
312 # In rare circumstances (usually tests), the centroid slot not be
313 # coming from an algorithm, which means we'll have added something we
314 # don't want to the plugins map, and we should remove it.
315 if self.config.slots.centroid is not None and self.plugins[self.config.slots.centroid] is None:
316 del self.plugins[self.config.slots.centroid]
317 # Initialize the plugins to run on the undeblended image
318 for executionOrder, name, config, PluginClass in sorted(self.config.undeblended.apply()):
319 undeblendedName = self.config.undeblendedPrefix + name
320 if getattr(PluginClass, "hasLogName", False):
321 self.undeblendedPlugins[name] = PluginClass(config, undeblendedName,
322 metadata=self.algMetadata,
323 logName=self.log.getChild(undeblendedName).name,
324 **kwds)
325 else:
326 self.undeblendedPlugins[name] = PluginClass(config, undeblendedName,
327 metadata=self.algMetadata, **kwds)
328
329 if "schemaMapper" in kwds:
330 schema = kwds["schemaMapper"].editOutputSchema()
331 else:
332 schema = kwds["schema"]
333
334 invalidPsfName = "base_InvalidPsf_flag"
335 if invalidPsfName in schema:
336 self.keyInvalidPsf = schema.find(invalidPsfName).key
337 else:
338 self.keyInvalidPsf = schema.addField(
339 invalidPsfName,
340 type="Flag",
341 doc="Invalid PSF at this location.",
342 )
343

◆ measure()

lsst.meas.base.sfm.SingleFrameMeasurementTask.measure ( self,
measCat,
exposure )
inherited
Backwards-compatibility alias for `run`.

Definition at line 361 of file sfm.py.

361 def measure(self, measCat, exposure):
362 """Backwards-compatibility alias for `run`.
363 """
364 self.run(measCat, exposure)

◆ run()

lsst.meas.base.sfm.SingleFrameMeasurementTask.run ( self,
measCat,
exposure,
noiseImage = None,
exposureId = None,
beginOrder = None,
endOrder = None,
footprints = None )
inherited
Run single frame measurement over an exposure and source catalog.

    Parameters
    ----------
    measCat : `lsst.afw.table.SourceCatalog`
        Catalog to be filled with the results of measurement. Must contain
        all the `lsst.afw.table.SourceRecord`\ s to be measured (with
        `lsst.afw.detection.Footprint`\ s attached), and have a schema
        that is a superset of ``self.schema``.
    exposure : `lsst.afw.image.ExposureF`
        Image containing the pixel data to be measured together with
        associated PSF, WCS, etc.
    noiseImage : `lsst.afw.image.ImageF`, optional
        Can be used to specify the a predictable noise replacement field
        for testing purposes.
    exposureId : `int`, optional
        Unique exposure identifier used to calculate the random number
        generator seed during noise replacement.
    beginOrder : `float`, optional
        Start execution order (inclusive): measurements with
        ``executionOrder < beginOrder`` are not executed. `None` for no
        limit.
    endOrder : `float`, optional
        Final execution order (exclusive): measurements with
        ``executionOrder >= endOrder`` are not executed. `None` for no
        limit.
    footprints : `dict` {`int`: `lsst.afw.detection.Footprint`}, optional
        List of footprints to use for noise replacement. If this is not
        supplied then the footprints from the measCat are used.

Definition at line 209 of file sfm.py.

218 ):
219 r"""Run single frame measurement over an exposure and source catalog.
220
221 Parameters
222 ----------
223 measCat : `lsst.afw.table.SourceCatalog`
224 Catalog to be filled with the results of measurement. Must contain
225 all the `lsst.afw.table.SourceRecord`\ s to be measured (with
226 `lsst.afw.detection.Footprint`\ s attached), and have a schema
227 that is a superset of ``self.schema``.
228 exposure : `lsst.afw.image.ExposureF`
229 Image containing the pixel data to be measured together with
230 associated PSF, WCS, etc.
231 noiseImage : `lsst.afw.image.ImageF`, optional
232 Can be used to specify the a predictable noise replacement field
233 for testing purposes.
234 exposureId : `int`, optional
235 Unique exposure identifier used to calculate the random number
236 generator seed during noise replacement.
237 beginOrder : `float`, optional
238 Start execution order (inclusive): measurements with
239 ``executionOrder < beginOrder`` are not executed. `None` for no
240 limit.
241 endOrder : `float`, optional
242 Final execution order (exclusive): measurements with
243 ``executionOrder >= endOrder`` are not executed. `None` for no
244 limit.
245 footprints : `dict` {`int`: `lsst.afw.detection.Footprint`}, optional
246 List of footprints to use for noise replacement. If this is not
247 supplied then the footprints from the measCat are used.
248 """
249 assert measCat.getSchema().contains(self.schema)
250 if footprints is None:
251 footprints = self.getFootprintsFromCatalog(measCat)
252
253 # noiseReplacer is used to fill the footprints with noise and save
254 # heavy footprints of the source pixels so that they can be restored
255 # one at a time for measurement. After the NoiseReplacer is
256 # constructed, all pixels in the exposure.getMaskedImage() which
257 # belong to objects in measCat will be replaced with noise
258
259 if self.config.doReplaceWithNoise:
260 noiseReplacer = NoiseReplacer(self.config.noiseReplacer, exposure, footprints,
261 noiseImage=noiseImage, log=self.log, exposureId=exposureId)
262 algMetadata = measCat.getMetadata()
263 if algMetadata is not None:
264 algMetadata.addInt(self.NOISE_SEED_MULTIPLIER, self.config.noiseReplacer.noiseSeedMultiplier)
265 algMetadata.addString(self.NOISE_SOURCE, self.config.noiseReplacer.noiseSource)
266 algMetadata.addDouble(self.NOISE_OFFSET, self.config.noiseReplacer.noiseOffset)
267 if exposureId is not None:
268 algMetadata.addLong(self.NOISE_EXPOSURE_ID, exposureId)
269 else:
270 noiseReplacer = DummyNoiseReplacer()
271
272 self.runPlugins(noiseReplacer, measCat, exposure, beginOrder, endOrder)
273

◆ runPlugins()

lsst.meas.base.sfm.SingleFrameMeasurementTask.runPlugins ( self,
noiseReplacer,
measCat,
exposure,
beginOrder = None,
endOrder = None )
inherited
Call the configured measument plugins on an image.

Parameters
----------
noiseReplacer : `NoiseReplacer`
    Used to fill sources not being measured with noise.
measCat : `lsst.afw.table.SourceCatalog`
    Catalog to be filled with the results of measurement. Must contain
    all the `lsst.afw.table.SourceRecord`\ s to be measured (with
    `lsst.afw.detection.Footprint`\ s attached), and have a schema
    that is a superset of ``self.schema``.
exposure : `lsst.afw.image.ExposureF`
    Image containing the pixel data to be measured together with
    associated PSF, WCS, etc.
beginOrder : `float`, optional
    Start execution order (inclusive): measurements with
    ``executionOrder < beginOrder`` are not executed. `None` for no
    limit.
endOrder : `float`, optional
    Final execution order (exclusive): measurements with
    ``executionOrder >= endOrder`` are not executed. `None` for no
    limit.

Definition at line 274 of file sfm.py.

274 def runPlugins(self, noiseReplacer, measCat, exposure, beginOrder=None, endOrder=None):
275 r"""Call the configured measument plugins on an image.
276
277 Parameters
278 ----------
279 noiseReplacer : `NoiseReplacer`
280 Used to fill sources not being measured with noise.
281 measCat : `lsst.afw.table.SourceCatalog`
282 Catalog to be filled with the results of measurement. Must contain
283 all the `lsst.afw.table.SourceRecord`\ s to be measured (with
284 `lsst.afw.detection.Footprint`\ s attached), and have a schema
285 that is a superset of ``self.schema``.
286 exposure : `lsst.afw.image.ExposureF`
287 Image containing the pixel data to be measured together with
288 associated PSF, WCS, etc.
289 beginOrder : `float`, optional
290 Start execution order (inclusive): measurements with
291 ``executionOrder < beginOrder`` are not executed. `None` for no
292 limit.
293 endOrder : `float`, optional
294 Final execution order (exclusive): measurements with
295 ``executionOrder >= endOrder`` are not executed. `None` for no
296 limit.
297 """
298 # First, create a catalog of all parentless sources. Loop through all
299 # the parent sources, first processing the children, then the parent.
300 measParentCat = measCat.getChildren(0)
301
302 nMeasCat = len(measCat)
303 nMeasParentCat = len(measParentCat)
304 self.log.info("Measuring %d source%s (%d parent%s, %d child%s) ",
305 nMeasCat, ("" if nMeasCat == 1 else "s"),
306 nMeasParentCat, ("" if nMeasParentCat == 1 else "s"),
307 nMeasCat - nMeasParentCat, ("" if nMeasCat - nMeasParentCat == 1 else "ren"))
308
309 # Wrap the task logger into a period logger
310 periodicLog = PeriodicLogger(self.log)
311
312 childrenIter = measCat.getChildren([measParentRecord.getId() for measParentRecord in measParentCat])
313 for parentIdx, (measParentRecord, measChildCat) in enumerate(zip(measParentCat, childrenIter)):
314 # first get all the children of this parent, insert footprint in
315 # turn, and measure
316 # TODO: skip this loop if there are no plugins configured for
317 # single-object mode
318 for measChildRecord in measChildCat:
319 noiseReplacer.insertSource(measChildRecord.getId())
320 self.callMeasure(measChildRecord, exposure, beginOrder=beginOrder, endOrder=endOrder)
321
322 if self.doBlendedness:
323 self.blendPlugin.cpp.measureChildPixels(exposure.getMaskedImage(), measChildRecord)
324
325 noiseReplacer.removeSource(measChildRecord.getId())
326
327 # Then insert the parent footprint, and measure that
328 noiseReplacer.insertSource(measParentRecord.getId())
329 self.callMeasure(measParentRecord, exposure, beginOrder=beginOrder, endOrder=endOrder)
330
331 if self.doBlendedness:
332 self.blendPlugin.cpp.measureChildPixels(exposure.getMaskedImage(), measParentRecord)
333
334 # Finally, process both parent and child set through measureN
335 self.callMeasureN(measParentCat[parentIdx:parentIdx+1], exposure,
336 beginOrder=beginOrder, endOrder=endOrder)
337 self.callMeasureN(measChildCat, exposure, beginOrder=beginOrder, endOrder=endOrder)
338 noiseReplacer.removeSource(measParentRecord.getId())
339 # Log a message if it has been a while since the last log.
340 periodicLog.log("Measurement complete for %d parents (and their children) out of %d",
341 parentIdx + 1, nMeasParentCat)
342
343 # When done, restore the exposure to its original state
344 noiseReplacer.end()
345
346 # Undeblended plugins only fire if we're running everything
347 if endOrder is None:
348 for sourceIndex, source in enumerate(measCat):
349 for plugin in self.undeblendedPlugins.iter():
350 self.doMeasurement(plugin, source, exposure)
351 # Log a message if it has been a while since the last log.
352 periodicLog.log("Undeblended measurement complete for %d sources out of %d",
353 sourceIndex + 1, nMeasCat)
354
355 # Now we loop over all of the sources one more time to compute the
356 # blendedness metrics
357 if self.doBlendedness:
358 for source in measCat:
359 self.blendPlugin.cpp.measureParentPixels(exposure.getMaskedImage(), source)
360

Member Data Documentation

◆ _DefaultName

str lsst.meas.base.baseMeasurement.BaseMeasurementTask._DefaultName = "measurement"
staticprotectedinherited

Definition at line 250 of file baseMeasurement.py.

◆ algMetadata

lsst.meas.base.baseMeasurement.BaseMeasurementTask.algMetadata = None
staticinherited

Definition at line 259 of file baseMeasurement.py.

◆ blendPlugin

lsst.meas.base.sfm.SingleFrameMeasurementTask.blendPlugin = self.plugins['base_Blendedness']
inherited

Definition at line 204 of file sfm.py.

◆ ConfigClass

lsst.meas.base.baseMeasurement.BaseMeasurementTask.ConfigClass = BaseMeasurementConfig
staticinherited

Definition at line 249 of file baseMeasurement.py.

◆ doBlendedness

bool lsst.meas.base.sfm.SingleFrameMeasurementTask.doBlendedness = True
inherited

Definition at line 203 of file sfm.py.

◆ keyInvalidPsf

lsst.meas.base.baseMeasurement.BaseMeasurementTask.keyInvalidPsf = schema.find(invalidPsfName).key
inherited

Definition at line 336 of file baseMeasurement.py.

◆ NOISE_EXPOSURE_ID

lsst.meas.base.sfm.SingleFrameMeasurementTask.NOISE_EXPOSURE_ID = "NOISE_EXPOSURE_ID"
staticinherited

Definition at line 191 of file sfm.py.

◆ NOISE_OFFSET

lsst.meas.base.sfm.SingleFrameMeasurementTask.NOISE_OFFSET = "NOISE_OFFSET"
staticinherited

Definition at line 187 of file sfm.py.

◆ NOISE_SEED_MULTIPLIER

lsst.meas.base.sfm.SingleFrameMeasurementTask.NOISE_SEED_MULTIPLIER = "NOISE_SEED_MULTIPLIER"
staticinherited

Definition at line 179 of file sfm.py.

◆ NOISE_SOURCE

lsst.meas.base.sfm.SingleFrameMeasurementTask.NOISE_SOURCE = "NOISE_SOURCE"
staticinherited

Definition at line 183 of file sfm.py.

◆ plugins

lsst.meas.base.baseMeasurement.BaseMeasurementTask.plugins = None
staticinherited

Definition at line 252 of file baseMeasurement.py.

◆ schema

lsst.meas.base.sfm.SingleFrameMeasurementTask.schema = schema
inherited

Definition at line 197 of file sfm.py.

◆ undeblendedPlugins

lsst.meas.base.baseMeasurement.BaseMeasurementTask.undeblendedPlugins = PluginMap()
inherited

Definition at line 269 of file baseMeasurement.py.


The documentation for this class was generated from the following file: