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.gaussianFlux = 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 #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-