DipoleMeasurementTask

class lsst.ip.diffim.DipoleMeasurementTask(schema, algMetadata=None, **kwds)

Bases: lsst.meas.base.sfm.SingleFrameMeasurementTask

! @anchor DipoleMeasurementTask

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

@section ip_diffim_dipolemeas_Contents Contents

  • @ref ip_diffim_dipolemeas_Purpose
  • @ref ip_diffim_dipolemeas_Initialize
  • @ref ip_diffim_dipolemeas_IO
  • @ref ip_diffim_dipolemeas_Config
  • @ref ip_diffim_dipolemeas_Metadata
  • @ref ip_diffim_dipolemeas_Debug
  • @ref ip_diffim_dipolemeas_Example

#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

@section ip_diffim_dipolemeas_Purpose Description

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

These default plugins include: @dontinclude dipoleMeasurement.py @skip class DipoleMeasurementConfig @until self.doReplaceWithNoise

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 SourceMeasurementTask, the same result may be acheived by manually editing the config and running SourceMeasurementTask. For example:

@code 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)

task.run(sources, exposure) @endcode

#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

@section ip_diffim_dipolemeas_Initialize Task initialization

@copydoc __init__

#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

@section ip_diffim_dipolemeas_IO Invoking the Task

@copydoc run

#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

@section ip_diffim_dipolemeas_Config Configuration parameters

See @ref DipoleMeasurementConfig

#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

@section ip_diffim_dipolemeas_Metadata Quantities set in Metadata

No specific values are set in the Task metadata. However, the Source schema are modified to store the results of the dipole-specific measurements.

#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

@section ip_diffim_dipolemeas_Debug Debug variables

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

@code{.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 # ds9 mask transparency di.displayDiaSources = True # show exposure with dipole results

return di

lsstDebug.Info = DebugInfo lsstDebug.frame = 1

@endcode

#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

@section ip_diffim_dipolemeas_Example A complete example of using DipoleMeasurementTask

This code is dipoleMeasTask.py in the examples directory, and can be run as @em e.g. @code examples/dipoleMeasTask.py examples/dipoleMeasTask.py –debug examples/dipoleMeasTask.py –debug –image /path/to/image.fits @endcode

@dontinclude dipoleMeasTask.py 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). @skip main @until run

@dontinclude dipoleMeasTask.py The processing occurs in the run function. We first extract an exposure from disk or afwdata, displaying it if requested: @skip args @until mtv

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

Create the detection and measurement Tasks, with some minor tweaking of their configs: @skip Create @until measureTask

Having fully initialied the schema, we create a Source table from it: @skip output @until SourceTable

Run detection: @skip Process @until detectionTask

Because we are looking for dipoles, we need to merge the positive and negative detections: @skip Merge @until numNeg

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

Optionally display debugging information: @skip Display @until displayDipoles #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-