LSST Applications g07dc498a13+5a531fccd6,g1409bbee79+5a531fccd6,g1a7e361dbc+5a531fccd6,g1fd858c14a+bae9e05889,g28da252d5a+b6acab2954,g33399d78f5+749e2df9f6,g35bb328faa+e55fef2c71,g3bd4b5ce2c+9ee8c95c05,g3c79e8cd92+5ffa104366,g43bc871e57+9a9eb91fab,g53246c7159+e55fef2c71,g60b5630c4e+f9e43d3906,g60ed82cc77+7534bcf0a9,g6e5c4a0e23+f441d97430,g78460c75b0+8427c4cc8f,g786e29fd12+307f82e6af,g8534526c7b+af2545e932,g89139ef638+5a531fccd6,g8b49a6ea8e+f9e43d3906,g9125e01d80+e55fef2c71,g989de1cb63+5a531fccd6,g9a9baf55bd+f1bd1a7c26,g9f33ca652e+c963d5c8aa,gaaedd4e678+5a531fccd6,gabe3b4be73+9c0c3c7524,gb1101e3267+ded3a614ca,gb58c049af0+28045f66fd,gc2fcbed0ba+f9e43d3906,gca43fec769+e55fef2c71,gcf25f946ba+749e2df9f6,gd6cbbdb0b4+784e334a77,gde0f65d7ad+500aeadb5f,ge278dab8ac+25667260f6,geab183fbe5+f9e43d3906,gecb8035dfe+0fa5abcb94,gefa07fa684+89734069dd,gf58bf46354+e55fef2c71,gfe7187db8c+5ee9e055d4,w.2025.02
LSST Data Management Base Package
Loading...
Searching...
No Matches
lsst.meas.base.baseMeasurement.BaseMeasurementTask Class Reference
Inheritance diagram for lsst.meas.base.baseMeasurement.BaseMeasurementTask:
lsst.meas.base.forcedMeasurement.ForcedMeasurementTask lsst.meas.base.sfm.SingleFrameMeasurementTask lsst.ip.diffim.dipoleMeasurement.DipoleMeasurementTask

Public Member Functions

 __init__ (self, algMetadata=None, **kwds)
 
 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

 undeblendedPlugins
 
 keyInvalidPsf
 

Static Public Attributes

 ConfigClass = BaseMeasurementConfig
 
 plugins = None
 
 algMetadata = None
 

Static Protected Attributes

str _DefaultName = "measurement"
 

Detailed Description

Ultimate base class for all measurement tasks.

Parameters
----------
algMetadata : `lsst.daf.base.PropertyList` or `None`
    Will be modified in-place to contain metadata about the plugins being
    run. If `None`, an empty `~lsst.daf.base.PropertyList` will be
    created.
**kwds
    Additional arguments passed to `lsst.pipe.base.Task.__init__`.

Notes
-----
This base class for `SingleFrameMeasurementTask` and
`ForcedMeasurementTask` mostly exists to share code between the two, and
generally should not be used directly.

Definition at line 230 of file baseMeasurement.py.

Constructor & Destructor Documentation

◆ __init__()

lsst.meas.base.baseMeasurement.BaseMeasurementTask.__init__ ( self,
algMetadata = None,
** kwds )

Reimplemented in lsst.meas.base.forcedMeasurement.ForcedMeasurementTask, and lsst.meas.base.sfm.SingleFrameMeasurementTask.

Definition at line 266 of file baseMeasurement.py.

266 def __init__(self, algMetadata=None, **kwds):
267 super(BaseMeasurementTask, self).__init__(**kwds)
268 self.plugins = PluginMap()
269 self.undeblendedPlugins = PluginMap()
270 if algMetadata is None:
271 algMetadata = lsst.daf.base.PropertyList()
272 self.algMetadata = algMetadata
273
Class for storing ordered metadata with comments.

Member Function Documentation

◆ callMeasure()

lsst.meas.base.baseMeasurement.BaseMeasurementTask.callMeasure ( self,
measRecord,
* args,
** kwds )
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 )
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 )
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 )
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)
static
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 )
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

Member Data Documentation

◆ _DefaultName

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

Definition at line 250 of file baseMeasurement.py.

◆ algMetadata

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

Definition at line 259 of file baseMeasurement.py.

◆ ConfigClass

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

Definition at line 249 of file baseMeasurement.py.

◆ keyInvalidPsf

lsst.meas.base.baseMeasurement.BaseMeasurementTask.keyInvalidPsf

Definition at line 336 of file baseMeasurement.py.

◆ plugins

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

Definition at line 252 of file baseMeasurement.py.

◆ undeblendedPlugins

lsst.meas.base.baseMeasurement.BaseMeasurementTask.undeblendedPlugins

Definition at line 269 of file baseMeasurement.py.


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