DipoleMeasurementTask¶
- class lsst.ip.diffim.DipoleMeasurementTask(schema, algMetadata=None, **kwds)¶
- Bases: - SingleFrameMeasurementTask- Measurement of Sources, specifically ones from difference images, for characterization as dipoles - Parameters:
 - 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. - 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: - 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 - pipetaskcommand line interface supports a flag –debug to import @b debug.py from your PYTHONPATH. The relevant contents of debug.py for this Task include:- 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 - 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). - 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: - 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: - schema = afwTable.SourceTable.makeMinimalSchema() - Create the detection and measurement Tasks, with some minor tweaking of their configs: - # 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: - # Create the output table tab = afwTable.SourceTable.make(schema) - Run detection: - # Process the data results = detectionTask.run(tab, exposure) - Because we are looking for dipoles, we need to merge the positive and negative detections: - # Merge the positve and negative sources fpSet = results.positive growFootprint = 2 fpSet.merge(results.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.numPos, results.numNeg)) - Finally, perform measurement (both standard and dipole-specialized) on the merged sources: - measureTask.run(diaSources, exposure) - Optionally display debugging information: - # Display dipoles if debug enabled if args.debug: dpa = DipoleAnalysis() dpa.displayDipoles(exposure, diaSources) - Attributes Summary - Name by which the noise exposire ID is recorded in metadata ('str'). - Name by which the noise offset is recorded in metadata ('str'). - Name by which the noise seed multiplier is recorded in metadata ('str'). - Name by which the noise source is recorded in metadata ('str'). - Metadata about active plugins ( - lsst.daf.base.PropertyList).- Plugins to be invoked ( - PluginMap).- Methods Summary - callMeasure(measRecord, *args, **kwds)- Call - measureon all plugins and consistently handle exceptions.- callMeasureN(measCat, *args, **kwds)- Call - measureNon all plugins and consistently handle exceptions.- doMeasurement(plugin, measRecord, *args, **kwds)- Call - measureon the specified plugin.- doMeasurementN(plugin, measCat, *args, **kwds)- Call - measureNon the specified plugin.- Empty (clear) the metadata for this Task and all sub-Tasks. - Get metadata for all tasks. - Get the task name as a hierarchical name including parent task names. - getName()- Get the name of the task. - Get a dictionary of all tasks as a shallow copy. - initializePlugins(**kwds)- Initialize plugins (and slots) according to configuration. - makeField(doc)- Make a - lsst.pex.config.ConfigurableFieldfor this task.- makeSubtask(name, **keyArgs)- Create a subtask as a new instance as the - nameattribute of this task.- measure(measCat, exposure)- Backwards-compatibility alias for - run.- run(measCat, exposure[, noiseImage, ...])- Run single frame measurement over an exposure and source catalog. - runPlugins(noiseReplacer, measCat, exposure)- Call the configured measument plugins on an image. - timer(name[, logLevel])- Context manager to log performance data for an arbitrary block of code. - Attributes Documentation - NOISE_EXPOSURE_ID = 'NOISE_EXPOSURE_ID'¶
- Name by which the noise exposire ID is recorded in metadata (‘str’). 
 - NOISE_OFFSET = 'NOISE_OFFSET'¶
- Name by which the noise offset is recorded in metadata (‘str’). 
 - NOISE_SEED_MULTIPLIER = 'NOISE_SEED_MULTIPLIER'¶
- Name by which the noise seed multiplier is recorded in metadata (‘str’). 
 - NOISE_SOURCE = 'NOISE_SOURCE'¶
- Name by which the noise source is recorded in metadata (‘str’). 
 - algMetadata = None¶
- Metadata about active plugins ( - lsst.daf.base.PropertyList).- Contains additional information about active plugins to be saved with the output catalog. Will be filled by subclasses. 
 - plugins = None¶
- Plugins to be invoked ( - PluginMap).- Initially empty, this will be populated as plugins are initialized. It should be considered read-only. 
 - Methods Documentation - callMeasure(measRecord, *args, **kwds)¶
- Call - measureon all plugins and consistently handle exceptions.- Parameters:
- measRecordlsst.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: - beginOrderint
- Beginning execution order (inclusive). Measurements with - executionOrder<- beginOrderare not executed.- Nonefor no limit.
- endOrderint
- Ending execution order (exclusive). Measurements with - executionOrder>=- endOrderare not executed.- Nonefor no limit.
 - Others are forwarded to - plugin.measure().
- beginOrder
 
- measRecord
 - Notes - This method can be used with plugins that have different signatures; the only requirement is that - measRecordbe 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. 
 - callMeasureN(measCat, *args, **kwds)¶
- Call - measureNon all plugins and consistently handle exceptions.- Parameters:
- measCatlsst.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<- beginOrderare not executed.- Nonefor no limit.
- endOrder:
- Ending execution order (exclusive): measurements with - executionOrder>=- endOrderare not executed.- Nonefor no- limit.
 - Others are are forwarded to - plugin.measure().
 
- measCat
 - Notes - This method can be used with plugins that have different signatures; the only requirement is that - measRecordbe 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. 
 - doMeasurement(plugin, measRecord, *args, **kwds)¶
- Call - measureon the specified plugin.- Exceptions are handled in a consistent way. - Parameters:
- pluginsubclass of BasePlugin
- Plugin that will be executed. 
- measRecordlsst.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().
 
- pluginsubclass of 
 - Notes - This method can be used with plugins that have different signatures; the only requirement is that - pluginand- measRecordbe 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. 
 - doMeasurementN(plugin, measCat, *args, **kwds)¶
- Call - measureNon the specified plugin.- Exceptions are handled in a consistent way. - Parameters:
- pluginsubclass of BasePlugin
- Plugin that will be executed. 
- measCatlsst.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().
 
- pluginsubclass of 
 - Notes - This method can be used with plugins that have different signatures; the only requirement is that the - pluginand- measCatbe 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. 
 - getFullMetadata() TaskMetadata¶
- Get metadata for all tasks. - Returns:
- metadataTaskMetadata
- The keys are the full task name. Values are metadata for the top-level task and all subtasks, sub-subtasks, etc. 
 
- metadata
 - Notes - The returned metadata includes timing information (if - @timer.timeMethodis 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.
 - getFullName() str¶
- Get the task name as a hierarchical name including parent task names. - Returns:
- fullNamestr
- 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”. 
 
 
- fullName
 
 - getTaskDict() Dict[str, ReferenceType[Task]]¶
- Get a dictionary of all tasks as a shallow copy. - Returns:
- taskDictdict
- Dictionary containing full task name: task object for the top-level task and all subtasks, sub-subtasks, etc. 
 
- taskDict
 
 - initializePlugins(**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 - pluginsattribute 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. 
 - classmethod makeField(doc: str) ConfigurableField¶
- Make a - lsst.pex.config.ConfigurableFieldfor this task.- Parameters:
- docstr
- Help text for the field. 
 
- doc
- Returns:
- configurableFieldlsst.pex.config.ConfigurableField
- A - ConfigurableFieldfor this task.
 
- configurableField
 - 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("brief description of task") 
 - makeSubtask(name: str, **keyArgs: Any) None¶
- Create a subtask as a new instance as the - nameattribute of this task.- Parameters:
- namestr
- 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”. 
 
 
- name
 - Notes - The subtask must be defined by - Task.config.name, an instance of- ConfigurableFieldor- RegistryField.
 - run(measCat, exposure, noiseImage=None, exposureId=None, beginOrder=None, endOrder=None)¶
- Run single frame measurement over an exposure and source catalog. - Parameters:
- measCatlsst.afw.table.SourceCatalog
- Catalog to be filled with the results of measurement. Must contain all the - lsst.afw.table.SourceRecords to be measured (with- lsst.afw.detection.Footprints attached), and have a schema that is a superset of- self.schema.
- exposurelsst.afw.image.ExposureF
- Image containing the pixel data to be measured together with associated PSF, WCS, etc. 
- noiseImagelsst.afw.image.ImageF, optional
- Can be used to specify the a predictable noise replacement field for testing purposes. 
- exposureIdint, optional
- Unique exposure identifier used to calculate the random number generator seed during noise replacement. 
- beginOrderfloat, optional
- Start execution order (inclusive): measurements with - executionOrder < beginOrderare not executed.- Nonefor no limit.
- endOrderfloat, optional
- Final execution order (exclusive): measurements with - executionOrder >= endOrderare not executed.- Nonefor no limit.
 
- measCat
 
 - runPlugins(noiseReplacer, measCat, exposure, beginOrder=None, endOrder=None)¶
- Call the configured measument plugins on an image. - Parameters:
- noiseReplacerNoiseReplacer
- Used to fill sources not being measured with noise. 
- measCatlsst.afw.table.SourceCatalog
- Catalog to be filled with the results of measurement. Must contain all the - lsst.afw.table.SourceRecords to be measured (with- lsst.afw.detection.Footprints attached), and have a schema that is a superset of- self.schema.
- exposurelsst.afw.image.ExposureF
- Image containing the pixel data to be measured together with associated PSF, WCS, etc. 
- beginOrderfloat, optional
- Start execution order (inclusive): measurements with - executionOrder < beginOrderare not executed.- Nonefor no limit.
- endOrderfloat, optional
- Final execution order (exclusive): measurements with - executionOrder >= endOrderare not executed.- Nonefor no limit.
 
- noiseReplacer