22__all__ = [
"makeMergedSchema",
"copyIntoCatalog",
23 "matchesToCatalog",
"matchesFromCatalog",
"copyAliasMapWithPrefix",
30from ._schema
import Schema
31from ._schemaMapper
import SchemaMapper
32from ._base
import BaseCatalog
33from ._table
import SimpleTable
34from ._simple
import SimpleCatalog
35from ._source
import SourceCatalog, SourceTable
36from ._match
import ReferenceMatch
41def makeMapper(sourceSchema, targetSchema, sourcePrefix=None, targetPrefix=None):
42 """Create a SchemaMapper between the input source and target schemas.
47 Input source schema that fields will be mapped
from.
49 Target schema that fields will be mapped to.
50 sourcePrefix : `str`, optional
51 If set, only those keys
with that prefix will be mapped.
52 targetPrefix : `str`, optional
53 If set, prepend it to the mapped (target) key name.
58 Mapping between source
and target schemas.
61 for key, field
in sourceSchema:
62 keyName = field.getName()
63 if sourcePrefix
is not None:
64 if not keyName.startswith(sourcePrefix):
67 keyName = field.getName().replace(sourcePrefix,
"", 1)
68 m.addMapping(key, (targetPrefix
or "") + keyName)
73 """Return a schema that is a deep copy of a mapping between source and target schemas.
78 Input source schema that fields will be mapped
from.
79 targetSchema : :py:
class:`lsst.afw.atable.Schema`
80 Target schema that fields will be mapped to.
81 sourcePrefix : `str`, optional
82 If set, only those keys
with that prefix will be mapped.
83 targetPrefix : `str`, optional
84 If set, prepend it to the mapped (target) key name.
89 Schema that
is the result of the mapping between source
and target schemas.
91 return makeMapper(sourceSchema, targetSchema, sourcePrefix, targetPrefix).getOutputSchema()
94def copyIntoCatalog(catalog, target, sourceSchema=None, sourcePrefix=None, targetPrefix=None):
95 """Copy entries from one Catalog into another.
99 catalog : :py:class:`lsst.afw.table.base.Catalog`
100 Source catalog to be copied
from.
101 target : :py:
class:`lsst.afw.table.base.Catalog`
102 Target catalog to be copied to (edited
in place).
104 Schema of source catalog.
105 sourcePrefix : `str`, optional
106 If set, only those keys
with that prefix will be copied.
107 targetPrefix : `str`, optional
108 If set, prepend it to the copied (target) key name
112 target : :py:
class:`lsst.afw.table.base.Catalog`
113 Target catalog that
is edited
in place.
115 if sourceSchema
is None:
116 sourceSchema = catalog.schema
118 targetSchema = target.schema
119 target.reserve(len(catalog))
120 for i
in range(len(target), len(catalog)):
123 if len(catalog) != len(target):
124 raise RuntimeError(f
"Length mismatch: {len(catalog)} vs {len(target)}")
126 m =
makeMapper(sourceSchema, targetSchema, sourcePrefix, targetPrefix)
127 for rFrom, rTo
in zip(catalog, target):
132 """Denormalise matches into a Catalog of "unpacked matches".
136 matches : `~lsst.afw.table.match.SimpleMatch`
137 Unpacked matches, i.e. a list of Match objects whose schema
138 has "first" and "second" attributes which, resepectively,
139 contain the reference
and source catalog entries,
and a
140 "distance" field (the measured distance between the reference
143 Metadata
for matches (must have .add attribute).
148 Catalog of matches (
with ``ref_``
and ``src_`` prefix identifiers
for
149 referece
and source entries, respectively, including alias
150 maps
from reference
and source catalogs)
152 if len(matches) == 0:
153 raise RuntimeError(
"No matches provided.")
155 refSchema = matches[0].first.getSchema()
156 srcSchema = matches[0].second.getSchema()
160 srcSchema, mergedSchema, targetPrefix=
"src_")
165 distKey = mergedSchema.addField(
166 "distance", type=np.float64, doc=
"Distance between ref and src")
168 mergedCatalog = BaseCatalog(mergedSchema)
170 sourceSchema=refSchema, targetPrefix=
"ref_")
172 sourceSchema=srcSchema, targetPrefix=
"src_")
173 for m, r
in zip(matches, mergedCatalog):
174 r.set(distKey, m.distance)
178 catalogName = os.path.basename(getPackageDir(
"astrometry_net_data"))
180 catalogName =
"NOT_SET"
181 matchMeta.add(
"REFCAT", catalogName)
182 mergedCatalog.getTable().setMetadata(matchMeta)
188 """Generate a list of ReferenceMatches from a Catalog of "unpacked matches".
193 Catalog of matches. Must have schema where reference entries
194 are prefixed
with ``ref_``
and source entries are prefixed
with
197 Configuration
for source slots.
205 catalog.schema, SimpleTable.makeMinimalSchema(), sourcePrefix="ref_")
206 refCatalog = SimpleCatalog(refSchema)
210 catalog.schema, SourceTable.makeMinimalSchema(), sourcePrefix=
"src_")
214 if sourceSlotConfig
is not None:
215 sourceSlotConfig.setupSchema(srcCatalog.schema)
218 distKey = catalog.schema.find(
"distance").key
219 for ref, src, cat
in zip(refCatalog, srcCatalog, catalog):
220 matches.append(ReferenceMatch(ref, src, cat[distKey]))
226 """Copy an alias map from one schema into another.
228 This copies the alias map of one schema into another, optionally
229 prepending a prefix to both the "from" and "to" names of the alias
230 (the example use case here
is for the
"match" catalog created by
232 ``ref_`` are added to the source
and reference field entries,
239 copied to ``outSchema``.
242 from ``inSchema``
is to be copied (modified
in place).
243 prefix : `str`, optional
244 An optional prefix to add to both the
"from" and "to" names
245 of the alias (default
is an empty string).
250 The output schema
with the alias mappings
from `inSchema`
253 for k, v
in inSchema.getAliasMap().
items():
254 outSchema.getAliasMap().
set(prefix + k, prefix + v)
260 """Apply a numpy index array to an afw Catalog
266 indices : `numpy.ndarray` of `int`
269 Whether or not to make a deep copy of the original catalog.
274 Reindexed catalog. Records are shallow copies of those
in ``catalog``.
276 new = SourceCatalog(catalog.table.clone() if deep
else catalog.table)
277 records = [catalog[int(ii)]
for ii
in indices]
278 new.extend(records, deep=deep)
std::vector< SchemaItem< Flag > > * items
Mapping class that holds aliases for a Schema.
Defines the fields and offsets for a table.
A mapping between the keys of two Schemas, used to copy data between them.
Class for storing generic metadata.
daf::base::PropertySet * set
def makeMergedSchema(sourceSchema, targetSchema, sourcePrefix=None, targetPrefix=None)
def makeMapper(sourceSchema, targetSchema, sourcePrefix=None, targetPrefix=None)
def matchesToCatalog(matches, matchMeta)
def reindexCatalog(catalog, indices, deep=True)
def copyAliasMapWithPrefix(inSchema, outSchema, prefix="")
def matchesFromCatalog(catalog, sourceSlotConfig=None)
def copyIntoCatalog(catalog, target, sourceSchema=None, sourcePrefix=None, targetPrefix=None)
Lightweight representation of a geometric match between two records.