1 from __future__
import absolute_import, division, print_function
3 __all__ = [
"DirectMatchConfig",
"DirectMatchTask",
"DirectMatchConfigWithoutLoader"]
6 from lsst.pipe.base
import Task, Struct
7 from lsst.meas.algorithms
import (LoadIndexedReferenceObjectsTask, ScienceSourceSelectorTask,
8 ReferenceSourceSelectorTask)
15 """Configuration for DirectMatchTask when an already-initialized 16 refObjLoader will be passed to this task.""" 17 matchRadius = Field(dtype=float, default=0.25, doc=
"Matching radius, arcsec")
18 sourceSelection = ConfigurableField(target=ScienceSourceSelectorTask,
19 doc=
"Selection of science sources")
20 referenceSelection = ConfigurableField(target=ReferenceSourceSelectorTask,
21 doc=
"Selection of reference sources")
25 """Configuration for DirectMatchTask""" 26 refObjLoader = ConfigurableField(target=LoadIndexedReferenceObjectsTask, doc=
"Load reference objects")
30 """!Simple matching of a source catalog to a reference catalog 32 @anchor DirectMatchTask_ 34 @section meas_astrom_match_Contents Contents 36 - @ref meas_astrom_match_Purpose 37 - @ref meas_astrom_match_Initialize 38 - @ref meas_astrom_match_IO 39 - @ref meas_astrom_match_Config 40 - @ref meas_astrom_match_Example 42 @section meas_astrom_match_Purpose Description 44 Match sources to reference objects. The matching permits no rotation or scaling, 45 but uses the existing sky positions in the source catalog. This is often useful 46 for QA, as it allows validating the pipeline astrometry and photometry against 47 the reference catalog. 49 Note that this DirectMatchTask is not currently suitable for use within the 50 AstrometryTask, as it has a different interface and serves a different purpose. 52 @section meas_astrom_match_Initialize Task initialisation 56 @section meas_astrom_match_IO Invoking the Task 60 @section meas_astrom_match_Config Configuration parameters 62 See @ref DirectMatchConfig 64 @section meas_astrom_match_Example A complete example of using DirectMatchTask 66 config = DirectMatchConfig() 67 task = DirectMatchTask(butler=butler, config=config) 68 matchResults = task.run(catalog) 72 ConfigClass = DirectMatchConfig
73 _DefaultName =
"directMatch" 75 def __init__(self, butler=None, refObjLoader=None, **kwargs):
78 Either a 'butler' or 'refObjLoader' is required. 80 @param butler Data butler, or None 81 @param refObjLoader For loading reference objects (lsst.meas.algorithms.LoadReferenceObjectsTask), or 83 @param kwargs Other keyword arguments required for instantiating a Task (e.g., 'config') 85 Task.__init__(self, **kwargs)
87 if not isinstance(self.config, DirectMatchConfig):
88 raise RuntimeError(
"DirectMatchTask must be initialized with DirectMatchConfig " 89 "if a refObjLoader is not supplied at initialization")
90 self.makeSubtask(
"refObjLoader", butler=butler)
93 self.makeSubtask(
"sourceSelection")
94 self.makeSubtask(
"referenceSelection")
96 def run(self, catalog, filterName=None):
97 """!Load reference objects and match to them 99 @param[in] catalog Catalog to match to (lsst.afw.table.SourceCatalog) 100 @param[in] filterName Name of filter, for loading fluxes (str) 101 @return Struct with matches (lsst.afw.table.SourceMatchVector) and 102 matchMeta (lsst.meas.astrom.MatchMetadata) 105 matchMeta = self.
refObjLoader.getMetadataCircle(circle.center, circle.radius, filterName)
106 emptyResult = Struct(matches=[], matchMeta=matchMeta)
107 sourceSelection = self.sourceSelection.selectSources(catalog)
108 if len(sourceSelection.sourceCat) == 0:
109 self.log.warn(
"No objects selected from %d objects in source catalog", len(catalog))
111 refData = self.
refObjLoader.loadSkyCircle(circle.center, circle.radius, filterName)
112 refCat = refData.refCat
113 refSelection = self.referenceSelection.selectSources(refCat)
114 if len(refSelection.sourceCat) == 0:
115 self.log.warn(
"No objects selected from %d objects in reference catalog", len(refCat))
118 self.config.matchRadius*arcseconds)
119 self.log.info(
"Matched %d from %d/%d input and %d/%d reference sources" %
120 (len(matches), len(sourceSelection.sourceCat), len(catalog),
121 len(refSelection.sourceCat), len(refCat)))
122 return Struct(matches=matches, matchMeta=matchMeta, refCat=refCat, sourceSelection=sourceSelection,
123 refSelection=refSelection)
126 """!Calculate a circle enclosing the catalog 128 @param[in] catalog Catalog we will encircle (lsst.afw.table.SourceCatalog) 129 @return Struct with center (lsst.afw.coord.Coord) and radius (lsst.afw.geom.Angle) 131 coordList = [src.getCoord()
for src
in catalog]
133 radius = max(center.angularSeparation(coord)
for coord
in coordList)
134 return Struct(center=center, radius=radius + self.config.matchRadius*arcseconds)
Simple matching of a source catalog to a reference catalog.
std::vector< Match< typename Cat::Record, typename Cat::Record > > matchRaDec(Cat const &cat, Angle radius, bool symmetric)
def run(self, catalog, filterName=None)
Load reference objects and match to them.
def calculateCircle(self, catalog)
Calculate a circle enclosing the catalog.
std::shared_ptr< Coord > averageCoord(std::vector< std::shared_ptr< Coord const >> const coords, CoordSystem system=UNKNOWN)
def __init__(self, butler=None, refObjLoader=None, kwargs)
Ctor.