LSST Applications g0fba68d861+5616995c1c,g1ebb85f214+2420ccdea7,g1fd858c14a+44c57a1f81,g21d47ad084+8e51fce9ac,g262e1987ae+1a7d68eb3b,g2cef7863aa+3bd8df3d95,g35bb328faa+fcb1d3bbc8,g36ff55ed5b+2420ccdea7,g47891489e3+5c6313fe9a,g53246c7159+fcb1d3bbc8,g646c943bdb+dbb9921566,g67b6fd64d1+5c6313fe9a,g6bd32b75b5+2420ccdea7,g74acd417e5+37fc0c974d,g786e29fd12+cf7ec2a62a,g86c591e316+6e13bcb9e9,g87389fa792+1e0a283bba,g89139ef638+5c6313fe9a,g90f42f885a+fce05a46d3,g9125e01d80+fcb1d3bbc8,g93e38de9ac+5345a64125,g95a1e89356+47d08a1cc6,g97be763408+bba861c665,ga9e4eb89a6+85210110a1,gb0b61e0e8e+1f27f70249,gb58c049af0+f03b321e39,gb89ab40317+5c6313fe9a,gc4e39d7843+4e09c98c3d,gd16ba4ae74+5402bcf54a,gd8ff7fe66e+2420ccdea7,gd9a9a58781+fcb1d3bbc8,gdab6d2f7ff+37fc0c974d,gde280f09ee+604b327636,ge278dab8ac+50e2446c94,ge410e46f29+5c6313fe9a,gef3c2e6661+6b480e0fb7,gf67bdafdda+5c6313fe9a,gffca2db377+fcb1d3bbc8,v29.2.0.rc1
LSST Data Management Base Package
Loading...
Searching...
No Matches
directMatch.py
Go to the documentation of this file.
2__all__ = ["DirectMatchConfig", "DirectMatchTask", "DirectMatchConfigWithoutLoader"]
3
4from lsst.pex.config import Config, Field, ConfigurableField, ConfigField
5from lsst.pipe.base import Task, Struct
6from lsst.meas.algorithms import (LoadReferenceObjectsConfig, ScienceSourceSelectorTask,
7 ReferenceSourceSelectorTask)
8import lsst.afw.table as afwTable
9from lsst.geom import arcseconds, averageSpherePoint
10
11
13 """Configuration for `DirectMatchTask` when an already-initialized
14 ``refObjLoader`` will be passed to this task.
15 """
16 matchRadius = Field(dtype=float, default=0.25, doc="Matching radius, arcsec")
17 sourceSelection = ConfigurableField(target=ScienceSourceSelectorTask,
18 doc="Selection of science sources")
19 referenceSelection = ConfigurableField(target=ReferenceSourceSelectorTask,
20 doc="Selection of reference sources")
21
22
24 """Configuration for `DirectMatchTask`.
25 """
26 refObjLoader = ConfigField(dtype=LoadReferenceObjectsConfig,
27 doc="Configuration of reference object loader")
28
29
30class DirectMatchTask(Task):
31 """Simple, brute force matching of a source catalog to a reference catalog.
32
33 Parameters
34 ----------
35 butler : `None`
36 Compatibility parameter. Should not be used.
37 refObjLoader : `lsst.meas.algorithms.ReferenceObjectLoader` or `None`
38 A reference object loader object; gen3 pipeline tasks will pass `None`
39 and call `setRefObjLoader` in `runQuantum`.
40 **kwargs
41 Other keyword arguments required for instantiating a Task (such as
42 ``config``).
43 """
44 ConfigClass = DirectMatchConfig
45 _DefaultName = "directMatch"
46
47 def __init__(self, refObjLoader=None, **kwargs):
48 Task.__init__(self, **kwargs)
49 self.refObjLoader = refObjLoader
50 self.makeSubtask("sourceSelection")
51 self.makeSubtask("referenceSelection")
52
53 def setRefObjLoader(self, refObjLoader):
54 """Set the reference object loader for the task.
55
56 Parameters
57 ----------
58 refObjLoader : `lsst.meas.algorithms.ReferenceObjectLoader`
59 An instance of a reference object loader.
60 """
61 self.refObjLoader = refObjLoader
62
63 def run(self, catalog, filterName=None, epoch=None):
64 """Load reference objects and match to them.
65
66 Parameters
67 ----------
68 catalog : `lsst.afw.table.SourceCatalog`
69 Catalog to match.
70 filterName : `str`
71 Name of filter loading fluxes.
72 epoch : `astropy.time.Time` or `None`
73 Epoch to which to correct proper motion and parallax, or `None` to
74 not apply such corrections.
75
76 Returns
77 -------
78 result : `lsst.pipe.base.Struct`
79 Result struct with components:
80
81 ``matches``
82 Matched sources with associated reference
83 (`lsst.afw.table.SourceMatchVector`).
84 ``matchMeta``
85 Match metadata (`lsst.meas.astrom.MatchMetadata`).
86 """
87 if self.refObjLoader is None:
88 raise RuntimeError("Running matcher task with no refObjLoader set in __ini__ or setRefObjLoader")
89 circle = self.calculateCircle(catalog)
90 matchMeta = self.refObjLoader.getMetadataCircle(circle.center, circle.radius, filterName, epoch=epoch)
91 emptyResult = Struct(matches=[], matchMeta=matchMeta)
92 sourceSelection = self.sourceSelection.run(catalog)
93 if len(sourceSelection.sourceCat) == 0:
94 self.log.warning("No objects selected from %d objects in source catalog", len(catalog))
95 return emptyResult
96 refData = self.refObjLoader.loadSkyCircle(circle.center, circle.radius, filterName, epoch=epoch)
97 refCat = refData.refCat
98 refSelection = self.referenceSelection.run(refCat)
99 if len(refSelection.sourceCat) == 0:
100 self.log.warning("No objects selected from %d objects in reference catalog", len(refCat))
101 return emptyResult
102 matches = afwTable.matchRaDec(refSelection.sourceCat, sourceSelection.sourceCat,
103 self.config.matchRadius*arcseconds)
104 self.log.info("Matched %d from %d/%d input and %d/%d reference sources",
105 len(matches), len(sourceSelection.sourceCat), len(catalog),
106 len(refSelection.sourceCat), len(refCat))
107 return Struct(matches=matches, matchMeta=matchMeta, refCat=refCat, sourceSelection=sourceSelection,
108 refSelection=refSelection)
109
110 def calculateCircle(self, catalog):
111 """Calculate a circle enclosing the catalog.
112
113 Parameters
114 ----------
115 catalog : `lsst.afw.table.SourceCatalog`
116 Catalog to encircle.
117
118 Returns
119 -------
120 result : `lsst.pipe.base.Struct`
121 Result struct with components:
122
123 ``center``
124 ICRS center coordinate (`lsst.afw.geom.SpherePoint`).
125 ``radius``
126 Radius of the circle (`lsst.geom.Angle`).
127 """
128 coordList = [src.getCoord() for src in catalog]
129 center = averageSpherePoint(coordList)
130 radius = max(center.separation(coord) for coord in coordList)
131 return Struct(center=center, radius=radius + self.config.matchRadius*arcseconds)
__init__(self, refObjLoader=None, **kwargs)
run(self, catalog, filterName=None, epoch=None)
std::vector< Match< typename Cat1::Record, typename Cat2::Record > > matchRaDec(Cat1 const &cat1, Cat2 const &cat2, lsst::geom::Angle radius, MatchControl const &mc=MatchControl())
Compute all tuples (s1,s2,d) where s1 belings to cat1, s2 belongs to cat2 and d, the distance between...
Definition Match.cc:158