22 from __future__
import absolute_import, division, print_function
24 __all__ = [
'RefMatchConfig',
'RefMatchTask']
26 from lsst.afw.image.utils
import getDistortedWcs
27 import lsst.afw.geom
as afwGeom
28 import lsst.afw.math
as afwMath
29 import lsst.pex.config
as pexConfig
30 import lsst.pipe.base
as pipeBase
31 from .matchOptimisticB
import MatchOptimisticBTask
32 from .display
import displayAstrometry
33 from .
import makeMatchStatistics
37 matcher = pexConfig.ConfigurableField(
38 target=MatchOptimisticBTask,
39 doc=
"reference object/source matcher",
41 matchDistanceSigma = pexConfig.RangeField(
42 doc=
"the maximum match distance is set to "
43 " mean_match_distance + matchDistanceSigma*std_dev_match_distance; " +
44 "ignored if not fitting a WCS",
60 """!Match an input source catalog with objects from a reference catalog
64 ConfigClass = RefMatchConfig
65 _DefaultName =
"calibrationBaseClass"
67 def __init__(self, refObjLoader, schema=None, **kwargs):
68 """!Construct a RefMatchTask
70 @param[in] refObjLoader A reference object loader object
71 @param[in] schema ignored; available for compatibility with an older astrometry task
72 @param[in] kwargs additional keyword arguments for pipe_base Task.\_\_init\_\_
74 pipeBase.Task.__init__(self, **kwargs)
76 self.makeSubtask(
"matcher")
80 """!Load reference objects overlapping an exposure and match to sources detected on that exposure
82 @param[in] exposure exposure that the sources overlap
83 @param[in] sourceCat catalog of sources detected on the exposure (an lsst.afw.table.SourceCatalog)
85 @return an lsst.pipe.base.Struct with these fields:
86 - refCat reference object catalog of objects that overlap the exposure (with some margin)
87 (an lsst::afw::table::SimpleCatalog)
88 - matches a list of lsst.afw.table.ReferenceMatch
89 - matchMeta metadata needed to unpersist matches (an lsst.daf.base.PropertyList)
91 @note ignores config.matchDistanceSigma
94 debug = lsstDebug.Info(__name__)
98 loadRes = self.refObjLoader.loadPixelBox(
101 filterName=expMd.filterName,
104 matchMeta = self.refObjLoader.getMetadataBox(
107 filterName=expMd.filterName,
111 matchRes = self.matcher.matchObjectsToSources(
112 refCat=loadRes.refCat,
115 refFluxField=loadRes.fluxField,
116 match_tolerance=
None,
121 "Found %d matches with scatter = %0.3f +- %0.3f arcsec; " %
122 (len(matchRes.matches), distStats.distMean.asArcseconds(), distStats.distStdDev.asArcseconds())
126 frame = int(debug.frame)
128 refCat=loadRes.refCat,
130 matches=matchRes.matches,
137 return pipeBase.Struct(
138 refCat=loadRes.refCat,
139 matches=matchRes.matches,
143 def _computeMatchStatsOnSky(self, matchList):
144 """Compute on-sky radial distance statistics for a match list
146 @param[in] matchList list of matches between reference object and sources;
147 the distance field is the only field read and it must be set to distance in radians
149 @return a pipe_base Struct containing these fields:
150 - distMean clipped mean of on-sky radial separation
151 - distStdDev clipped standard deviation of on-sky radial separation
152 - maxMatchDist distMean + self.config.matchDistanceSigma*distStdDev
155 distMean = distStatsInRadians.getValue(afwMath.MEANCLIP)*afwGeom.radians
156 distStdDev = distStatsInRadians.getValue(afwMath.STDEVCLIP)*afwGeom.radians
157 return pipeBase.Struct(
159 distStdDev=distStdDev,
160 maxMatchDist=distMean + self.config.matchDistanceSigma*distStdDev,
163 def _getExposureMetadata(self, exposure):
164 """!Extract metadata from an exposure
166 @return an lsst.pipe.base.Struct containing the following exposure metadata:
167 - bbox: parent bounding box
168 - wcs: WCS (an lsst.afw.image.Wcs)
169 - calib calibration (an lsst.afw.image.Calib), or None if unknown
170 - filterName: name of filter, or None if unknown
172 exposureInfo = exposure.getInfo()
173 filterName = exposureInfo.getFilter().getName()
or None
174 if filterName ==
"_unknown_":
176 return pipeBase.Struct(
177 bbox=exposure.getBBox(),
178 wcs=getDistortedWcs(exposureInfo, log=self.log),
179 calib=exposureInfo.getCalib()
if exposureInfo.hasCalib()
else None,
180 filterName=filterName,
afw::math::Statistics makeMatchStatistics(std::vector< MatchT > const &matchList, int const flags, afw::math::StatisticsControl const &sctrl=afw::math::StatisticsControl())
Compute statistics of the distance field of a match list.
def __init__
Construct a RefMatchTask.
def loadAndMatch
Load reference objects overlapping an exposure and match to sources detected on that exposure...
def _computeMatchStatsOnSky
Match an input source catalog with objects from a reference catalog.
def _getExposureMetadata
Extract metadata from an exposure.