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 resultsreturn 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 #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-