22 __all__ = [
"makeMergedSchema", 
"copyIntoCatalog",
 
   23            "matchesToCatalog", 
"matchesFromCatalog", 
"copyAliasMapWithPrefix"]
 
   30 from ._schema 
import Schema
 
   31 from ._schemaMapper 
import SchemaMapper
 
   32 from ._base 
import BaseCatalog
 
   33 from ._table 
import SimpleTable
 
   34 from ._simple 
import SimpleCatalog
 
   35 from ._source 
import SourceCatalog, SourceTable
 
   36 from ._match 
import ReferenceMatch
 
   41 def makeMapper(sourceSchema, targetSchema, sourcePrefix=None, targetPrefix=None):
 
   42     """Create a SchemaMapper between the input source and target schemas. 
   46     sourceSchema : :py:class:`lsst.afw.table.Schema` 
   47         Input source schema that fields will be mapped from. 
   48     targetSchema : :py:class:`lsst.afw.table.Schema` 
   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. 
   57     SchemaMapper : :py:class:`lsst.afw.table.SchemaMapper` 
   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)
 
   72 def makeMergedSchema(sourceSchema, targetSchema, sourcePrefix=None, targetPrefix=None):
 
   73     """Return a schema that is a deep copy of a mapping between source and target schemas. 
   77     sourceSchema : :py:class:`lsst.afw.table.Schema` 
   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. 
   88     schema : :py:class:`lsst.afw.table.Schema` 
   89         Schema that is the result of the mapping between source and target schemas. 
   91     return makeMapper(sourceSchema, targetSchema, sourcePrefix, targetPrefix).getOutputSchema()
 
   94 def 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). 
  103     sourceSchema : :py:class:`lsst.afw.table.Schema`, optional 
  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 
  142     matchMeta : `~lsst.daf.base.PropertySet` 
  143         Metadata for matches (must have .add attribute). 
  147     mergedCatalog : :py:class:`lsst.afw.table.BaseCatalog` 
  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")
 
  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". 
  192     catalog : :py:class:`lsst.afw.table.BaseCatalog` 
  193         Catalog of matches.  Must have schema where reference entries 
  194         are prefixed with "ref_" and source entries are prefixed with 
  196     sourceSlotConfig : `lsst.meas.base.baseMeasurement.SourceSlotConfig`, optional 
  197         Configuration for source slots. 
  201     matches : :py:class:`lsst.afw.table.ReferenceMatch` 
  205         catalog.schema, SimpleTable.makeMinimalSchema(), sourcePrefix=
"ref_")
 
  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):
 
  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 
  231     `lsst.meas.astrom.denormalizeMatches` where prefixes "src_" and 
  232     "ref_" are added to the source and reference field entries, 
  237     inSchema : `lsst.afw.table.Schema` 
  238        The input schema whose `lsst.afw.table.AliasMap` is to be 
  239        copied to ``outSchema``. 
  240     outSchema : `lsst.afw.table.Schema` 
  241        The output schema into which the `lsst.afw.table.AliasMap` 
  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). 
  249     outSchema : `lsst.afw.table.Schema` 
  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)