DipoleMeasurementTask¶
- 
class lsst.ip.diffim.DipoleMeasurementTask(schema, algMetadata=None, **kwds)¶
- Bases: - lsst.meas.base.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 - This code is dipoleMeasTask.py in the examples directory, and can be run as e.g. - 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). - 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.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: - measureTask.run(diaSources, exposure) - Optionally display debugging information: - # Display dipoles if debug enabled if args.debug: dpa = DipoleAnalysis() dpa.displayDipoles(exposure, diaSources) - Attributes Summary - NOISE_EXPOSURE_ID- NOISE_OFFSET- NOISE_SEED_MULTIPLIER- NOISE_SOURCE- algMetadata- plugins- 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.- emptyMetadata()- Empty (clear) the metadata for this Task and all sub-Tasks. - getFullMetadata()- Get metadata for all tasks. - getFullName()- Get the task name as a hierarchical name including parent task names. - getName()- Get the name of the task. - getTaskDict()- 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'¶
 - 
NOISE_OFFSET= 'NOISE_OFFSET'¶
 - 
NOISE_SEED_MULTIPLIER= 'NOISE_SEED_MULTIPLIER'¶
 - 
NOISE_SOURCE= 'NOISE_SOURCE'¶
 - 
algMetadata= None¶
 - 
plugins= None¶
 - Methods Documentation - 
callMeasure(measRecord, *args, **kwds)¶
- Call - measureon 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<- beginOrderare not executed.- Nonefor no limit.
- endOrder : int
- Ending execution order (exclusive). Measurements with - executionOrder>=- endOrderare not executed.- Nonefor no limit.
 - Others are forwarded to - plugin.measure().
- beginOrder : 
 - 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. 
- measRecord : 
 - 
callMeasureN(measCat, *args, **kwds)¶
- Call - measureNon 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<- 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().
 - 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. 
- measCat : 
 - 
doMeasurement(plugin, measRecord, *args, **kwds)¶
- Call - measureon 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 - 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. 
- plugin : subclass of 
 - 
doMeasurementN(plugin, measCat, *args, **kwds)¶
- Call - measureNon 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 - 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. 
- plugin : subclass of 
 - 
emptyMetadata() → None¶
- Empty (clear) the metadata for this Task and all sub-Tasks. 
 - 
getFullMetadata() → lsst.pipe.base._task_metadata.TaskMetadata¶
- Get metadata for all tasks. - Returns: - metadata : TaskMetadata
- The 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.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.
- metadata : 
 - 
getFullName() → str¶
- 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”.
 
 
- fullName : 
 - 
getTaskDict() → Dict[str, weakref.ReferenceType[lsst.pipe.base.task.Task]]¶
- 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. 
 
- 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) → lsst.pex.config.configurableField.ConfigurableField¶
- Make a - lsst.pex.config.ConfigurableFieldfor this task.- Parameters: - doc : str
- Help text for the field. 
 - Returns: - configurableField : lsst.pex.config.ConfigurableField
- A - ConfigurableFieldfor 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("brief description of task") 
- doc : 
 - 
makeSubtask(name: str, **keyArgs) → None¶
- Create a subtask as a new instance as the - nameattribute 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- ConfigurableFieldor- RegistryField.
- name : 
 - 
run(measCat, exposure, noiseImage=None, exposureId=None, beginOrder=None, endOrder=None)¶
- 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.SourceRecords to be measured (with- lsst.afw.detection.Footprints 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 < beginOrderare not executed.- Nonefor no limit.
- endOrder : float, 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: - 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.SourceRecords to be measured (with- lsst.afw.detection.Footprints 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 < beginOrderare not executed.- Nonefor no limit.
- endOrder : float, optional
- Final execution order (exclusive): measurements with - executionOrder >= endOrderare not executed.- Nonefor no limit.
 
- noiseReplacer : 
 - 
timer(name: str, logLevel: int = 10) → Iterator[None]¶
- Context manager to log performance data for an arbitrary block of code. - Parameters: - See also - timer.logInfo
 - Examples - Creating a timer context: - with self.timer("someCodeToTime"): pass # code to time 
 
-