LSSTApplications  17.0+124,17.0+14,17.0+73,18.0.0+37,18.0.0+80,18.0.0-4-g68ffd23+4,18.1.0-1-g0001055+12,18.1.0-1-g03d53ef+5,18.1.0-1-g1349e88+55,18.1.0-1-g2505f39+44,18.1.0-1-g5315e5e+4,18.1.0-1-g5e4b7ea+14,18.1.0-1-g7e8fceb+4,18.1.0-1-g85f8cd4+48,18.1.0-1-g8ff0b9f+4,18.1.0-1-ga2c679d+1,18.1.0-1-gd55f500+35,18.1.0-10-gb58edde+2,18.1.0-11-g0997b02+4,18.1.0-13-gfe4edf0b+12,18.1.0-14-g259bd21+21,18.1.0-19-gdb69f3f+2,18.1.0-2-g5f9922c+24,18.1.0-2-gd3b74e5+11,18.1.0-2-gfbf3545+32,18.1.0-26-g728bddb4+5,18.1.0-27-g6ff7ca9+2,18.1.0-3-g52aa583+25,18.1.0-3-g8ea57af+9,18.1.0-3-gb69f684+42,18.1.0-3-gfcaddf3+6,18.1.0-32-gd8786685a,18.1.0-4-gf3f9b77+6,18.1.0-5-g1dd662b+2,18.1.0-5-g6dbcb01+41,18.1.0-6-gae77429+3,18.1.0-7-g9d75d83+9,18.1.0-7-gae09a6d+30,18.1.0-9-gc381ef5+4,w.2019.45
LSSTDataManagementBasePackage
Public Member Functions | Public Attributes | Static Public Attributes | List of all members
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 lsst.pipe.base.task.Task

Public Member Functions

def run (self, measCat, exposure, noiseImage=None, exposureId=None, beginOrder=None, endOrder=None)
 
def runPlugins (self, noiseReplacer, measCat, exposure, beginOrder=None, endOrder=None)
 
def measure (self, measCat, exposure)
 
def getPluginLogName (self, pluginName)
 
def initializePlugins (self, kwds)
 
def callMeasure (self, measRecord, args, kwds)
 
def doMeasurement (self, plugin, measRecord, args, kwds)
 
def callMeasureN (self, measCat, args, kwds)
 
def doMeasurementN (self, plugin, measCat, args, kwds)
 
def emptyMetadata (self)
 
def getSchemaCatalogs (self)
 
def getAllSchemaCatalogs (self)
 
def getFullMetadata (self)
 
def getFullName (self)
 
def getName (self)
 
def getTaskDict (self)
 
def makeSubtask (self, name, keyArgs)
 
def timer (self, name, logLevel=Log.DEBUG)
 
def makeField (cls, doc)
 
def __reduce__ (self)
 

Public Attributes

 schema
 
 doBlendedness
 
 blendPlugin
 
 undeblendedPlugins
 
 metadata
 
 log
 
 config
 

Static Public Attributes

 ConfigClass = DipoleMeasurementConfig
 
string NOISE_SEED_MULTIPLIER = "NOISE_SEED_MULTIPLIER"
 
string NOISE_SOURCE = "NOISE_SOURCE"
 
string NOISE_OFFSET = "NOISE_OFFSET"
 
string NOISE_EXPOSURE_ID = "NOISE_EXPOSURE_ID"
 
 plugins = None
 
 algMetadata = None
 

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

Notes
-----
The list of badFlags will be used to make a list of keys to check for measurement flags on.  By
default the centroid keys are added to this list

Description

This class provides a default configuration for running Source measurement on image differences.

.. code-block:: py

    class DipoleMeasurementConfig(SingleFrameMeasurementConfig):
        "Measurement of detected diaSources as dipoles"
        def setDefaults(self):
            SingleFrameMeasurementConfig.setDefaults(self)
            self.plugins = ["base_CircularApertureFlux",
                            "base_PixelFlags",
                            "base_SkyCoord",
                            "base_PsfFlux",
                            "ip_diffim_NaiveDipoleCentroid",
                            "ip_diffim_NaiveDipoleFlux",
                            "ip_diffim_PsfDipoleFlux",
                            "ip_diffim_ClassificationDipole",
                            ]
            self.slots.calibFlux = None
            self.slots.modelFlux = None
            self.slots.instFlux = None
            self.slots.shape = None
            self.slots.centroid = "ip_diffim_NaiveDipoleCentroid"
            self.doReplaceWithNoise = False

These plugins enabled by default allow the user to test the hypothesis that the Source is a dipole.
This includes a set of measurements derived from intermediate base classes
DipoleCentroidAlgorithm and DipoleFluxAlgorithm.
Their respective algorithm control classes are defined in
DipoleCentroidControl and DipoleFluxControl.
Each centroid and flux measurement will have _neg (negative)
and _pos (positive lobe) fields.

The first set of measurements uses a "naive" alrogithm
for centroid and flux measurements, implemented in
NaiveDipoleCentroidControl and NaiveDipoleFluxControl.
The algorithm uses a naive 3x3 weighted moment around
the nominal centroids of each peak in the Source Footprint.  These algorithms fill the table fields
ip_diffim_NaiveDipoleCentroid* and ip_diffim_NaiveDipoleFlux*

The second set of measurements undertakes a joint-Psf model on the negative
and positive lobe simultaneously. This fit simultaneously solves for the negative and positive
lobe centroids and fluxes using non-linear least squares minimization.
The fields are stored in table elements ip_diffim_PsfDipoleFlux*.

Because this Task is just a config for SingleFrameMeasurementTask, the same result may be acheived by
manually editing the config and running SingleFrameMeasurementTask. For example:

.. code-block:: py

    config = SingleFrameMeasurementConfig()
    config.plugins.names = ["base_PsfFlux",
                            "ip_diffim_PsfDipoleFlux",
                            "ip_diffim_NaiveDipoleFlux",
                            "ip_diffim_NaiveDipoleCentroid",
                            "ip_diffim_ClassificationDipole",
                            "base_CircularApertureFlux",
                            "base_SkyCoord"]

    config.slots.calibFlux = None
    config.slots.modelFlux = None
    config.slots.instFlux = None
    config.slots.shape = None
    config.slots.centroid = "ip_diffim_NaiveDipoleCentroid"
    config.doReplaceWithNoise = False

    schema = afwTable.SourceTable.makeMinimalSchema()
    task = SingleFrameMeasurementTask(schema, config=config)-

Debug variables

The ``lsst.pipe.base.cmdLineTask.CmdLineTask`` command line task interface supports a
flag-d/--debug to import debug.py from your PYTHONPATH.  The relevant contents of debug.py
for this Task include:

.. code-block:: py

    import sys
    import lsstDebug
    def DebugInfo(name):
        di = lsstDebug.getInfo(name)
        if name == "lsst.ip.diffim.dipoleMeasurement":
            di.display = True                 # enable debug output
            di.maskTransparency = 90          # display mask transparency
            di.displayDiaSources = True       # show exposure with dipole results
        return di
    lsstDebug.Info = DebugInfo
    lsstDebug.frame = 1

    config.slots.calibFlux = None
    config.slots.modelFlux = None
    config.slots.gaussianFlux = None
    config.slots.shape = None
    config.slots.centroid = "ip_diffim_NaiveDipoleCentroid"
    config.doReplaceWithNoise = False

This code is dipoleMeasTask.py in the examples directory, and can be run as e.g.

.. code-block:: none

    examples/dipoleMeasTask.py
    examples/dipoleMeasTask.py --debug
    examples/dipoleMeasTask.py --debug --image /path/to/image.fits



Start the processing by parsing the command line, where the user has the option of
enabling debugging output and/or sending their own image for demonstration
(in case they have not downloaded the afwdata package).

.. code-block:: py

    if __name__ == "__main__":
        import argparse
        parser = argparse.ArgumentParser(
            description="Demonstrate the use of SourceDetectionTask and DipoleMeasurementTask")
        parser.add_argument('--debug', '-d', action="store_true", help="Load debug.py?", default=False)
        parser.add_argument("--image", "-i", help="User defined image", default=None)
        args = parser.parse_args()
        if args.debug:
            try:
                import debug
                debug.lsstDebug.frame = 2
            except ImportError as e:
                print(e, file=sys.stderr)
        run(args)

The processing occurs in the run function.  We first extract an exposure from disk or afwdata, displaying
it if requested:

.. code-block:: py

    def run(args):
        exposure = loadData(args.image)
        if args.debug:
            afwDisplay.Display(frame=1).mtv(exposure)

Create a default source schema that we will append fields to as we add more algorithms:

.. code-block:: py

    schema = afwTable.SourceTable.makeMinimalSchema()

Create the detection and measurement Tasks, with some minor tweaking of their configs:

.. code-block:: py

        # Create the detection task
    config = SourceDetectionTask.ConfigClass()
    config.thresholdPolarity = "both"
    config.background.isNanSafe = True
    config.thresholdValue = 3
    detectionTask = SourceDetectionTask(config=config, schema=schema)
    # And the measurement Task
    config = DipoleMeasurementTask.ConfigClass()
    config.plugins.names.remove('base_SkyCoord')
    algMetadata = dafBase.PropertyList()
    measureTask = DipoleMeasurementTask(schema, algMetadata, config=config)

Having fully initialied the schema, we create a Source table from it:

.. code-block:: py

    # Create the output table
    tab = afwTable.SourceTable.make(schema)

Run detection:

.. code-block:: py

    # Process the data
    results = detectionTask.run(tab, exposure)

Because we are looking for dipoles, we need to merge the positive and negative detections:

.. code-block:: py

    # Merge the positve and negative sources
    fpSet = results.fpSets.positive
    growFootprint = 2
    fpSet.merge(results.fpSets.negative, growFootprint, growFootprint, False)
    diaSources = afwTable.SourceCatalog(tab)
    fpSet.makeSources(diaSources)
    print("Merged %s Sources into %d diaSources (from %d +ve, %d -ve)" % (len(results.sources),
                                                                      len(diaSources),
                                                                      results.fpSets.numPos,
                                                                      results.fpSets.numNeg))

Finally, perform measurement (both standard and dipole-specialized) on the merged sources:

.. code-block:: py

    measureTask.run(diaSources, exposure)

Optionally display debugging information:

.. code-block:: py

    # Display dipoles if debug enabled
    if args.debug:
        dpa = DipoleAnalysis()
        dpa.displayDipoles(exposure, diaSources)

Definition at line 123 of file dipoleMeasurement.py.

Member Function Documentation

◆ __reduce__()

def lsst.pipe.base.task.Task.__reduce__ (   self)
inherited
Pickler.

Definition at line 373 of file task.py.

373  def __reduce__(self):
374  """Pickler.
375  """
376  return self.__class__, (self.config, self._name, self._parentTask, None)
377 

◆ callMeasure()

def 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 289 of file baseMeasurement.py.

289  def callMeasure(self, measRecord, *args, **kwds):
290  """Call ``measure`` on all plugins and consistently handle exceptions.
291 
292  Parameters
293  ----------
294  measRecord : `lsst.afw.table.SourceRecord`
295  The record corresponding to the object being measured. Will be
296  updated in-place with the results of measurement.
297  *args
298  Positional arguments forwarded to ``plugin.measure``
299  **kwds
300  Keyword arguments. Two are handled locally:
301 
302  beginOrder : `int`
303  Beginning execution order (inclusive). Measurements with
304  ``executionOrder`` < ``beginOrder`` are not executed. `None`
305  for no limit.
306 
307  endOrder : `int`
308  Ending execution order (exclusive). Measurements with
309  ``executionOrder`` >= ``endOrder`` are not executed. `None`
310  for no limit.
311 
312  Others are forwarded to ``plugin.measure()``.
313 
314  Notes
315  -----
316  This method can be used with plugins that have different signatures;
317  the only requirement is that ``measRecord`` be the first argument.
318  Subsequent positional arguments and keyword arguments are forwarded
319  directly to the plugin.
320 
321  This method should be considered "protected": it is intended for use by
322  derived classes, not users.
323  """
324  beginOrder = kwds.pop("beginOrder", None)
325  endOrder = kwds.pop("endOrder", None)
326  for plugin in self.plugins.iter():
327  if beginOrder is not None and plugin.getExecutionOrder() < beginOrder:
328  continue
329  if endOrder is not None and plugin.getExecutionOrder() >= endOrder:
330  break
331  self.doMeasurement(plugin, measRecord, *args, **kwds)
332 

◆ callMeasureN()

def 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 375 of file baseMeasurement.py.

375  def callMeasureN(self, measCat, *args, **kwds):
376  """Call ``measureN`` on all plugins and consistently handle exceptions.
377 
378  Parameters
379  ----------
380  measCat : `lsst.afw.table.SourceCatalog`
381  Catalog containing only the records for the source family to be
382  measured, and where outputs should be written.
383  *args
384  Positional arguments forwarded to ``plugin.measure()``
385  **kwds
386  Keyword arguments. Two are handled locally:
387 
388  beginOrder:
389  Beginning execution order (inclusive): Measurements with
390  ``executionOrder`` < ``beginOrder`` are not executed. `None`
391  for no limit.
392  endOrder:
393  Ending execution order (exclusive): measurements with
394  ``executionOrder`` >= ``endOrder`` are not executed. `None` for
395  no ``limit``.
396 
397  Others are are forwarded to ``plugin.measure()``.
398 
399  Notes
400  -----
401  This method can be used with plugins that have different signatures;
402  the only requirement is that ``measRecord`` be the first argument.
403  Subsequent positional arguments and keyword arguments are forwarded
404  directly to the plugin.
405 
406  This method should be considered "protected": it is intended for use by
407  derived classes, not users.
408  """
409  beginOrder = kwds.pop("beginOrder", None)
410  endOrder = kwds.pop("endOrder", None)
411  for plugin in self.plugins.iterN():
412  if beginOrder is not None and plugin.getExecutionOrder() < beginOrder:
413  continue
414  if endOrder is not None and plugin.getExecutionOrder() >= endOrder:
415  break
416  self.doMeasurementN(plugin, measCat, *args, **kwds)
417 

◆ doMeasurement()

def 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 333 of file baseMeasurement.py.

333  def doMeasurement(self, plugin, measRecord, *args, **kwds):
334  """Call ``measure`` on the specified plugin.
335 
336  Exceptions are handled in a consistent way.
337 
338  Parameters
339  ----------
340  plugin : subclass of `BasePlugin`
341  Plugin that will be executed.
342  measRecord : `lsst.afw.table.SourceRecord`
343  The record corresponding to the object being measured. Will be
344  updated in-place with the results of measurement.
345  *args
346  Positional arguments forwarded to ``plugin.measure()``.
347  **kwds
348  Keyword arguments forwarded to ``plugin.measure()``.
349 
350  Notes
351  -----
352  This method can be used with plugins that have different signatures;
353  the only requirement is that ``plugin`` and ``measRecord`` be the first
354  two arguments. Subsequent positional arguments and keyword arguments
355  are forwarded directly to the plugin.
356 
357  This method should be considered "protected": it is intended for use by
358  derived classes, not users.
359  """
360  try:
361  plugin.measure(measRecord, *args, **kwds)
362  except FATAL_EXCEPTIONS:
363  raise
364  except MeasurementError as error:
365  lsst.log.Log.getLogger(self.getPluginLogName(plugin.name)).debug(
366  "MeasurementError in %s.measure on record %s: %s"
367  % (plugin.name, measRecord.getId(), error))
368  plugin.fail(measRecord, error)
369  except Exception as error:
370  lsst.log.Log.getLogger(self.getPluginLogName(plugin.name)).debug(
371  "Exception in %s.measure on record %s: %s"
372  % (plugin.name, measRecord.getId(), error))
373  plugin.fail(measRecord)
374 
static Log getLogger(Log const &logger)
Definition: Log.h:760

◆ doMeasurementN()

def 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 418 of file baseMeasurement.py.

418  def doMeasurementN(self, plugin, measCat, *args, **kwds):
419  """Call ``measureN`` on the specified plugin.
420 
421  Exceptions are handled in a consistent way.
422 
423  Parameters
424  ----------
425  plugin : subclass of `BasePlugin`
426  Plugin that will be executed.
427  measCat : `lsst.afw.table.SourceCatalog`
428  Catalog containing only the records for the source family to be
429  measured, and where outputs should be written.
430  *args
431  Positional arguments forwarded to ``plugin.measureN()``.
432  **kwds
433  Keyword arguments forwarded to ``plugin.measureN()``.
434 
435  Notes
436  -----
437  This method can be used with plugins that have different signatures;
438  the only requirement is that the ``plugin`` and ``measCat`` be the
439  first two arguments. Subsequent positional arguments and keyword
440  arguments are forwarded directly to the plugin.
441 
442  This method should be considered "protected": it is intended for use by
443  derived classes, not users.
444  """
445  try:
446  plugin.measureN(measCat, *args, **kwds)
447  except FATAL_EXCEPTIONS:
448  raise
449 
450  except MeasurementError as error:
451  for measRecord in measCat:
452  lsst.log.Log.getLogger(self.getPluginLogName(plugin.name)).debug(
453  "MeasurementError in %s.measureN on records %s-%s: %s"
454  % (plugin.name, measCat[0].getId(), measCat[-1].getId(), error))
455  plugin.fail(measRecord, error)
456  except Exception as error:
457  for measRecord in measCat:
458  plugin.fail(measRecord)
459  lsst.log.Log.getLogger(self.getPluginLogName(plugin.name)).debug(
460  "Exception in %s.measureN on records %s-%s: %s"
461  % (plugin.name, measCat[0].getId(), measCat[-1].getId(), error))
462 
static Log getLogger(Log const &logger)
Definition: Log.h:760

◆ emptyMetadata()

def lsst.pipe.base.task.Task.emptyMetadata (   self)
inherited
Empty (clear) the metadata for this Task and all sub-Tasks.

Definition at line 153 of file task.py.

153  def emptyMetadata(self):
154  """Empty (clear) the metadata for this Task and all sub-Tasks.
155  """
156  for subtask in self._taskDict.values():
157  subtask.metadata = dafBase.PropertyList()
158 
Class for storing ordered metadata with comments.
Definition: PropertyList.h:68

◆ getAllSchemaCatalogs()

def lsst.pipe.base.task.Task.getAllSchemaCatalogs (   self)
inherited
Get schema catalogs for all tasks in the hierarchy, combining the results into a single dict.

Returns
-------
schemacatalogs : `dict`
    Keys are butler dataset type, values are a empty catalog (an instance of the appropriate
    lsst.afw.table Catalog type) for all tasks in the hierarchy, from the top-level task down
    through all subtasks.

Notes
-----
This method may be called on any task in the hierarchy; it will return the same answer, regardless.

The default implementation should always suffice. If your subtask uses schemas the override
`Task.getSchemaCatalogs`, not this method.

Definition at line 188 of file task.py.

188  def getAllSchemaCatalogs(self):
189  """Get schema catalogs for all tasks in the hierarchy, combining the results into a single dict.
190 
191  Returns
192  -------
193  schemacatalogs : `dict`
194  Keys are butler dataset type, values are a empty catalog (an instance of the appropriate
195  lsst.afw.table Catalog type) for all tasks in the hierarchy, from the top-level task down
196  through all subtasks.
197 
198  Notes
199  -----
200  This method may be called on any task in the hierarchy; it will return the same answer, regardless.
201 
202  The default implementation should always suffice. If your subtask uses schemas the override
203  `Task.getSchemaCatalogs`, not this method.
204  """
205  schemaDict = self.getSchemaCatalogs()
206  for subtask in self._taskDict.values():
207  schemaDict.update(subtask.getSchemaCatalogs())
208  return schemaDict
209 

◆ getFullMetadata()

def lsst.pipe.base.task.Task.getFullMetadata (   self)
inherited
Get metadata for all tasks.

Returns
-------
metadata : `lsst.daf.base.PropertySet`
    The `~lsst.daf.base.PropertySet` keys are the full task name. Values are metadata
    for the top-level task and all subtasks, sub-subtasks, etc..

Notes
-----
The returned metadata includes timing information (if ``@timer.timeMethod`` is used)
and any metadata set by the task. The name of each item consists of the full task name
with ``.`` replaced by ``:``, followed by ``.`` and the name of the item, e.g.::

    topLevelTaskName:subtaskName:subsubtaskName.itemName

using ``:`` in the full task name disambiguates the rare situation that a task has a subtask
and a metadata item with the same name.

Definition at line 210 of file task.py.

210  def getFullMetadata(self):
211  """Get metadata for all tasks.
212 
213  Returns
214  -------
215  metadata : `lsst.daf.base.PropertySet`
216  The `~lsst.daf.base.PropertySet` keys are the full task name. Values are metadata
217  for the top-level task and all subtasks, sub-subtasks, etc..
218 
219  Notes
220  -----
221  The returned metadata includes timing information (if ``@timer.timeMethod`` is used)
222  and any metadata set by the task. The name of each item consists of the full task name
223  with ``.`` replaced by ``:``, followed by ``.`` and the name of the item, e.g.::
224 
225  topLevelTaskName:subtaskName:subsubtaskName.itemName
226 
227  using ``:`` in the full task name disambiguates the rare situation that a task has a subtask
228  and a metadata item with the same name.
229  """
230  fullMetadata = dafBase.PropertySet()
231  for fullName, task in self.getTaskDict().items():
232  fullMetadata.set(fullName.replace(".", ":"), task.metadata)
233  return fullMetadata
234 
std::vector< SchemaItem< Flag > > * items
Class for storing generic metadata.
Definition: PropertySet.h:67

◆ getFullName()

def lsst.pipe.base.task.Task.getFullName (   self)
inherited
Get the task name as a hierarchical name including parent task names.

Returns
-------
fullName : `str`
    The full name consists of the name of the parent task and each subtask separated by periods.
    For example:

    - The full name of top-level task "top" is simply "top".
    - The full name of subtask "sub" of top-level task "top" is "top.sub".
    - The full name of subtask "sub2" of subtask "sub" of top-level task "top" is "top.sub.sub2".

Definition at line 235 of file task.py.

235  def getFullName(self):
236  """Get the task name as a hierarchical name including parent task names.
237 
238  Returns
239  -------
240  fullName : `str`
241  The full name consists of the name of the parent task and each subtask separated by periods.
242  For example:
243 
244  - The full name of top-level task "top" is simply "top".
245  - The full name of subtask "sub" of top-level task "top" is "top.sub".
246  - The full name of subtask "sub2" of subtask "sub" of top-level task "top" is "top.sub.sub2".
247  """
248  return self._fullName
249 

◆ getName()

def lsst.pipe.base.task.Task.getName (   self)
inherited
Get the name of the task.

Returns
-------
taskName : `str`
    Name of the task.

See also
--------
getFullName

Definition at line 250 of file task.py.

250  def getName(self):
251  """Get the name of the task.
252 
253  Returns
254  -------
255  taskName : `str`
256  Name of the task.
257 
258  See also
259  --------
260  getFullName
261  """
262  return self._name
263 

◆ getPluginLogName()

def lsst.meas.base.baseMeasurement.BaseMeasurementTask.getPluginLogName (   self,
  pluginName 
)
inherited

Definition at line 239 of file baseMeasurement.py.

239  def getPluginLogName(self, pluginName):
240  return self.log.getName() + '.' + pluginName
241 

◆ getSchemaCatalogs()

def lsst.pipe.base.task.Task.getSchemaCatalogs (   self)
inherited
Get the schemas generated by this task.

Returns
-------
schemaCatalogs : `dict`
    Keys are butler dataset type, values are an empty catalog (an instance of the appropriate
    `lsst.afw.table` Catalog type) for this task.

Notes
-----

.. warning::

   Subclasses that use schemas must override this method. The default implemenation returns
   an empty dict.

This method may be called at any time after the Task is constructed, which means that all task
schemas should be computed at construction time, *not* when data is actually processed. This
reflects the philosophy that the schema should not depend on the data.

Returning catalogs rather than just schemas allows us to save e.g. slots for SourceCatalog as well.

See also
--------
Task.getAllSchemaCatalogs

Definition at line 159 of file task.py.

159  def getSchemaCatalogs(self):
160  """Get the schemas generated by this task.
161 
162  Returns
163  -------
164  schemaCatalogs : `dict`
165  Keys are butler dataset type, values are an empty catalog (an instance of the appropriate
166  `lsst.afw.table` Catalog type) for this task.
167 
168  Notes
169  -----
170 
171  .. warning::
172 
173  Subclasses that use schemas must override this method. The default implemenation returns
174  an empty dict.
175 
176  This method may be called at any time after the Task is constructed, which means that all task
177  schemas should be computed at construction time, *not* when data is actually processed. This
178  reflects the philosophy that the schema should not depend on the data.
179 
180  Returning catalogs rather than just schemas allows us to save e.g. slots for SourceCatalog as well.
181 
182  See also
183  --------
184  Task.getAllSchemaCatalogs
185  """
186  return {}
187 

◆ getTaskDict()

def lsst.pipe.base.task.Task.getTaskDict (   self)
inherited
Get a dictionary of all tasks as a shallow copy.

Returns
-------
taskDict : `dict`
    Dictionary containing full task name: task object for the top-level task and all subtasks,
    sub-subtasks, etc..

Definition at line 264 of file task.py.

264  def getTaskDict(self):
265  """Get a dictionary of all tasks as a shallow copy.
266 
267  Returns
268  -------
269  taskDict : `dict`
270  Dictionary containing full task name: task object for the top-level task and all subtasks,
271  sub-subtasks, etc..
272  """
273  return self._taskDict.copy()
274 
def getTaskDict(config, taskDict=None, baseName="")

◆ initializePlugins()

def 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 242 of file baseMeasurement.py.

242  def initializePlugins(self, **kwds):
243  """Initialize plugins (and slots) according to configuration.
244 
245  Parameters
246  ----------
247  **kwds
248  Keyword arguments forwarded directly to plugin constructors.
249 
250  Notes
251  -----
252  Derived class constructors should call this method to fill the
253  `plugins` attribute and add corresponding output fields and slot
254  aliases to the output schema.
255 
256  In addition to the attributes added by `BaseMeasurementTask.__init__`,
257  a ``schema``` attribute holding the output schema must be present
258  before this method is called.
259 
260  Keyword arguments are forwarded directly to plugin constructors,
261  allowing derived classes to use plugins with different signatures.
262  """
263  # Make a place at the beginning for the centroid plugin to run first (because it's an OrderedDict,
264  # adding an empty element in advance means it will get run first when it's reassigned to the
265  # actual Plugin).
266  if self.config.slots.centroid is not None:
267  self.plugins[self.config.slots.centroid] = None
268  # Init the plugins, sorted by execution order. At the same time add to the schema
269  for executionOrder, name, config, PluginClass in sorted(self.config.plugins.apply()):
270  # Pass logName to the plugin if the plugin is marked as using it
271  # The task will use this name to log plugin errors, regardless.
272  if hasattr(PluginClass, "hasLogName") and PluginClass.hasLogName:
273  self.plugins[name] = PluginClass(config, name, metadata=self.algMetadata,
274  logName=self.getPluginLogName(name), **kwds)
275  else:
276  self.plugins[name] = PluginClass(config, name, metadata=self.algMetadata, **kwds)
277 
278  # In rare circumstances (usually tests), the centroid slot not be coming from an algorithm,
279  # which means we'll have added something we don't want to the plugins map, and we should
280  # remove it.
281  if self.config.slots.centroid is not None and self.plugins[self.config.slots.centroid] is None:
282  del self.plugins[self.config.slots.centroid]
283  # Initialize the plugins to run on the undeblended image
284  for executionOrder, name, config, PluginClass in sorted(self.config.undeblended.apply()):
285  undeblendedName = self.config.undeblendedPrefix + name
286  self.undeblendedPlugins[name] = PluginClass(config, undeblendedName, metadata=self.algMetadata,
287  **kwds)
288 

◆ makeField()

def lsst.pipe.base.task.Task.makeField (   cls,
  doc 
)
inherited
Make a `lsst.pex.config.ConfigurableField` for this task.

Parameters
----------
doc : `str`
    Help text for the field.

Returns
-------
configurableField : `lsst.pex.config.ConfigurableField`
    A `~ConfigurableField` for this task.

Examples
--------
Provides a convenient way to specify this task is a subtask of another task.

Here is an example of use::

    class OtherTaskConfig(lsst.pex.config.Config)
aSubtask = ATaskClass.makeField("a brief description of what this task does")

Definition at line 329 of file task.py.

329  def makeField(cls, doc):
330  """Make a `lsst.pex.config.ConfigurableField` for this task.
331 
332  Parameters
333  ----------
334  doc : `str`
335  Help text for the field.
336 
337  Returns
338  -------
339  configurableField : `lsst.pex.config.ConfigurableField`
340  A `~ConfigurableField` for this task.
341 
342  Examples
343  --------
344  Provides a convenient way to specify this task is a subtask of another task.
345 
346  Here is an example of use::
347 
348  class OtherTaskConfig(lsst.pex.config.Config)
349  aSubtask = ATaskClass.makeField("a brief description of what this task does")
350  """
351  return ConfigurableField(doc=doc, target=cls)
352 

◆ makeSubtask()

def lsst.pipe.base.task.Task.makeSubtask (   self,
  name,
  keyArgs 
)
inherited
Create a subtask as a new instance as the ``name`` attribute of this task.

Parameters
----------
name : `str`
    Brief name of the subtask.
keyArgs
    Extra keyword arguments used to construct the task. The following arguments are automatically
    provided and cannot be overridden:

    - "config".
    - "parentTask".

Notes
-----
The subtask must be defined by ``Task.config.name``, an instance of pex_config ConfigurableField
or RegistryField.

Definition at line 275 of file task.py.

275  def makeSubtask(self, name, **keyArgs):
276  """Create a subtask as a new instance as the ``name`` attribute of this task.
277 
278  Parameters
279  ----------
280  name : `str`
281  Brief name of the subtask.
282  keyArgs
283  Extra keyword arguments used to construct the task. The following arguments are automatically
284  provided and cannot be overridden:
285 
286  - "config".
287  - "parentTask".
288 
289  Notes
290  -----
291  The subtask must be defined by ``Task.config.name``, an instance of pex_config ConfigurableField
292  or RegistryField.
293  """
294  taskField = getattr(self.config, name, None)
295  if taskField is None:
296  raise KeyError("%s's config does not have field %r" % (self.getFullName(), name))
297  subtask = taskField.apply(name=name, parentTask=self, **keyArgs)
298  setattr(self, name, subtask)
299 

◆ measure()

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

Definition at line 337 of file sfm.py.

337  def measure(self, measCat, exposure):
338  """Backwards-compatibility alias for `run`.
339  """
340  self.run(measCat, exposure)
341 
def measure(mi, x, y, size, statistic, stats)
Definition: fringe.py:473

◆ run()

def lsst.meas.base.sfm.SingleFrameMeasurementTask.run (   self,
  measCat,
  exposure,
  noiseImage = None,
  exposureId = None,
  beginOrder = None,
  endOrder = 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.

Definition at line 207 of file sfm.py.

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

◆ runPlugins()

def 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 260 of file sfm.py.

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

◆ timer()

def lsst.pipe.base.task.Task.timer (   self,
  name,
  logLevel = Log.DEBUG 
)
inherited
Context manager to log performance data for an arbitrary block of code.

Parameters
----------
name : `str`
    Name of code being timed; data will be logged using item name: ``Start`` and ``End``.
logLevel
    A `lsst.log` level constant.

Examples
--------
Creating a timer context::

    with self.timer("someCodeToTime"):
pass  # code to time

See also
--------
timer.logInfo

Definition at line 301 of file task.py.

301  def timer(self, name, logLevel=Log.DEBUG):
302  """Context manager to log performance data for an arbitrary block of code.
303 
304  Parameters
305  ----------
306  name : `str`
307  Name of code being timed; data will be logged using item name: ``Start`` and ``End``.
308  logLevel
309  A `lsst.log` level constant.
310 
311  Examples
312  --------
313  Creating a timer context::
314 
315  with self.timer("someCodeToTime"):
316  pass # code to time
317 
318  See also
319  --------
320  timer.logInfo
321  """
322  logInfo(obj=self, prefix=name + "Start", logLevel=logLevel)
323  try:
324  yield
325  finally:
326  logInfo(obj=self, prefix=name + "End", logLevel=logLevel)
327 
def logInfo(obj, prefix, logLevel=Log.DEBUG)
Definition: timer.py:62

Member Data Documentation

◆ algMetadata

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

Definition at line 224 of file baseMeasurement.py.

◆ blendPlugin

lsst.meas.base.sfm.SingleFrameMeasurementTask.blendPlugin
inherited

Definition at line 202 of file sfm.py.

◆ config

lsst.pipe.base.task.Task.config
inherited

Definition at line 149 of file task.py.

◆ ConfigClass

lsst.ip.diffim.dipoleMeasurement.DipoleMeasurementTask.ConfigClass = DipoleMeasurementConfig
static

Definition at line 343 of file dipoleMeasurement.py.

◆ doBlendedness

lsst.meas.base.sfm.SingleFrameMeasurementTask.doBlendedness
inherited

Definition at line 201 of file sfm.py.

◆ log

lsst.pipe.base.task.Task.log
inherited

Definition at line 148 of file task.py.

◆ metadata

lsst.pipe.base.task.Task.metadata
inherited

Definition at line 121 of file task.py.

◆ NOISE_EXPOSURE_ID

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

Definition at line 189 of file sfm.py.

◆ NOISE_OFFSET

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

Definition at line 185 of file sfm.py.

◆ NOISE_SEED_MULTIPLIER

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

Definition at line 177 of file sfm.py.

◆ NOISE_SOURCE

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

Definition at line 181 of file sfm.py.

◆ plugins

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

Definition at line 217 of file baseMeasurement.py.

◆ schema

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

Definition at line 195 of file sfm.py.

◆ undeblendedPlugins

lsst.meas.base.baseMeasurement.BaseMeasurementTask.undeblendedPlugins
inherited

Definition at line 234 of file baseMeasurement.py.


The documentation for this class was generated from the following file:
  • /j/snowflake/release/lsstsw/stack/Linux64/ip_diffim/18.1.0-14-g259bd21+21/python/lsst/ip/diffim/dipoleMeasurement.py