lsst.afw
g3a5ebb7d8a+28b83bf6a5
Toggle main menu visibility
Loading...
Searching...
No Matches
python
lsst
afw
table
_match.py
Go to the documentation of this file.
1
# This file is part of afw.
2
#
3
# Developed for the LSST Data Management System.
4
# This product includes software developed by the LSST Project
5
# (https://www.lsst.org).
6
# See the COPYRIGHT file at the top-level directory of this distribution
7
# for details of code ownership.
8
#
9
# This program is free software: you can redistribute it and/or modify
10
# it under the terms of the GNU General Public License as published by
11
# the Free Software Foundation, either version 3 of the License, or
12
# (at your option) any later version.
13
#
14
# This program is distributed in the hope that it will be useful,
15
# but WITHOUT ANY WARRANTY; without even the implied warranty of
16
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
# GNU General Public License for more details.
18
#
19
# You should have received a copy of the GNU General Public License
20
# along with this program. If not, see <https://www.gnu.org/licenses/>.
21
22
__all__ = [
"SimpleMatch"
,
"ReferenceMatch"
,
"SourceMatch"
,
"clone"
,
"matchCls"
,
"packMatches"
]
23
24
import
numpy
as
np
25
26
from
._base
import
BaseCatalog
27
from
._schema
import
Schema
28
from
._table
import
SimpleMatch, ReferenceMatch, SourceMatch
29
30
31
def
__repr__(self):
# noqa: N807
32
return
"Match(%s,\n %s,\n %g)"
% \
33
(repr(self.first), repr(self.second), self.distance)
34
35
36
def
__str__(self):
# noqa: N807
37
def
sourceRaDec(s):
38
if
hasattr(s,
"getRa"
)
and
hasattr(s,
"getDec"
):
39
return
" RA,Dec=(%g,%g) deg"
% (s.getRa().asDegrees(), s.getDec().asDegrees())
40
return
""
41
42
def
sourceXy(s):
43
if
hasattr(s,
"getX"
)
and
hasattr(s,
"getY"
):
44
return
" x,y=(%g,%g)"
% (s.getX(), s.getY())
45
return
""
46
47
def
sourceStr(s):
48
return
s.__class__.__name__ + (
"(id %d"
% s.getId()) + sourceRaDec(s) + sourceXy(s) +
")"
49
50
return
"Match(%s, %s, dist %g)"
% (sourceStr(self.first), sourceStr(self.second), self.distance,)
51
52
53
def
__getitem__(self, i):
# noqa: N807
54
"""Treat a Match as a tuple of length 3: (first, second, distance)"""
55
if
i > 2
or
i < -3:
56
raise
IndexError(i)
57
if
i < 0:
58
i += 3
59
if
i == 0:
60
return
self.first
61
elif
i == 1:
62
return
self.second
63
else
:
64
return
self.distance
65
66
67
def
__setitem__(self, i, val):
# noqa: N807
68
"""Treat a Match as a tuple of length 3: (first, second, distance)"""
69
if
i > 2
or
i < -3:
70
raise
IndexError(i)
71
if
i < 0:
72
i += 3
73
if
i == 0:
74
self.first = val
75
elif
i == 1:
76
self.second = val
77
else
:
78
self.distance = val
79
80
81
def
__len__(self):
# noqa: N807
82
return
3
83
84
85
def
clone
(self):
86
return
self.__class__(self.first, self.second, self.distance)
87
88
89
# Pickling support disabled for this type (see testSourceMatch comment for reasoning)
90
# def __getstate__(self):
91
# return self.first, self.second, self.distance
92
#
93
#
94
# def __setstate__(self, state):
95
# self.__init__(*state)
96
97
98
for
matchCls
in
(SimpleMatch, ReferenceMatch, SourceMatch):
99
matchCls.__repr__ = __repr__
100
matchCls.__str__ = __str__
101
matchCls.__getitem__ = __getitem__
102
matchCls.__setitem__ = __setitem__
103
matchCls.__len__ = __len__
104
matchCls.clone = clone
105
# matchCls.__getstate__ = __getstate__
106
# matchCls.__setstate__ = __setstate__
107
108
109
def
packMatches
(matches):
110
"""Make a catalog of matches from a sequence of matches.
111
112
The catalog contains three fields:
113
- first: the ID of the first source record in each match
114
- second: the ID of the second source record in each match
115
- distance: the distance of each match
116
117
Parameters
118
----------
119
matches :
120
Sequence of matches, typically of type SimpleMatch,
121
ReferenceMatch or SourceMatch. Each element must support:
122
`.first.getId()`->int, `.second.getId()->int` and
123
`.distance->float`.
124
125
Returns
126
-------
127
result :
128
The catalog of matches.
129
130
Notes
131
-----
132
This pure python implementation exists as a historical artifact
133
related to SWIG limitations. It might be practical to wrap the
134
overloaded C++ functions with pybind11, but there didn't seem much
135
point.
136
"""
137
schema =
Schema
()
138
outKey1 = schema.addField(
"first"
, type=np.int64,
139
doc=
"ID for first source record in match."
)
140
outKey2 = schema.addField(
"second"
, type=np.int64,
141
doc=
"ID for second source record in match."
)
142
keyD = schema.addField(
"distance"
, type=np.float64,
143
doc=
"Distance between matches sources."
)
144
result =
BaseCatalog
(schema)
145
result.table.preallocate(len(matches))
146
for
match
in
matches:
147
record = result.addNew()
148
record.set(outKey1, match.first.getId())
149
record.set(outKey2, match.second.getId())
150
record.set(keyD, match.distance)
151
return
result
lsst::afw::table._schema.Schema
Definition
_schema.py:91
lsst::afw::table::CatalogT< BaseRecord >
lsst::afw::table._match.clone
clone
Definition
_match.py:104
lsst::afw::table._match.packMatches
packMatches(matches)
Definition
_match.py:109
Generated on
for lsst.afw by
1.17.0