LSST Applications  21.0.0-172-gfb10e10a+18fedfabac,22.0.0+297cba6710,22.0.0+80564b0ff1,22.0.0+8d77f4f51a,22.0.0+a28f4c53b1,22.0.0+dcf3732eb2,22.0.1-1-g7d6de66+2a20fdde0d,22.0.1-1-g8e32f31+297cba6710,22.0.1-1-geca5380+7fa3b7d9b6,22.0.1-12-g44dc1dc+2a20fdde0d,22.0.1-15-g6a90155+515f58c32b,22.0.1-16-g9282f48+790f5f2caa,22.0.1-2-g92698f7+dcf3732eb2,22.0.1-2-ga9b0f51+7fa3b7d9b6,22.0.1-2-gd1925c9+bf4f0e694f,22.0.1-24-g1ad7a390+a9625a72a8,22.0.1-25-g5bf6245+3ad8ecd50b,22.0.1-25-gb120d7b+8b5510f75f,22.0.1-27-g97737f7+2a20fdde0d,22.0.1-32-gf62ce7b1+aa4237961e,22.0.1-4-g0b3f228+2a20fdde0d,22.0.1-4-g243d05b+871c1b8305,22.0.1-4-g3a563be+32dcf1063f,22.0.1-4-g44f2e3d+9e4ab0f4fa,22.0.1-42-gca6935d93+ba5e5ca3eb,22.0.1-5-g15c806e+85460ae5f3,22.0.1-5-g58711c4+611d128589,22.0.1-5-g75bb458+99c117b92f,22.0.1-6-g1c63a23+7fa3b7d9b6,22.0.1-6-g50866e6+84ff5a128b,22.0.1-6-g8d3140d+720564cf76,22.0.1-6-gd805d02+cc5644f571,22.0.1-8-ge5750ce+85460ae5f3,master-g6e05de7fdc+babf819c66,master-g99da0e417a+8d77f4f51a,w.2021.48
LSST Data Management Base Package
_yaml.py
Go to the documentation of this file.
1 # This file is part of sphgeom.
2 #
3 # Developed for the LSST Data Management System.
4 # This product includes software developed by the LSST Project
5 # (http://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 <http://www.gnu.org/licenses/>.
21 
22 """Add support for YAML serialization of regions."""
23 
24 __all__ = ()
25 
26 # YAML representers and constructors are only useful if yaml itself can
27 # be imported. If yaml can not be imported then there is no reason to
28 # break the entire module import of sphgeom.
29 try:
30  import yaml
31 except ImportError:
32  yaml = None
33 
34 from ._sphgeom import (
35  Box,
36  Circle,
37  ConvexPolygon,
38  Ellipse,
39  HtmPixelization,
40  Mq3cPixelization,
41  Region,
42  Q3cPixelization,
43 )
44 
45 from ._healpixPixelization import HealpixPixelization
46 
47 
48 if yaml:
49  try:
50  # CLoader is not always available
51  from yaml import CLoader
52  except ImportError:
53  CLoader = None
54 
55  YamlLoaders = (yaml.Loader, yaml.FullLoader, yaml.SafeLoader, yaml.UnsafeLoader)
56  if CLoader is not None:
57  YamlLoaders += (CLoader,)
58 
59 
60 # Regions
61 
62 def region_representer(dumper, data):
63  """Represent a sphgeom region object in a form suitable for YAML.
64 
65  Stores the region as a mapping with a single ``encoded`` key
66  storing the hex encoded byte string.
67  """
68  encoded = data.encode()
69  return dumper.represent_mapping(f"lsst.sphgeom.{type(data).__name__}",
70  {"encoded": encoded.hex()})
71 
72 
73 def region_constructor(loader, node):
74  """Construct a sphgeom region from YAML"""
75  mapping = loader.construct_mapping(node)
76  encoded = bytes.fromhex(mapping["encoded"])
77  # The generic Region base class can instantiate a region of the
78  # correct type.
79  return Region.decode(encoded)
80 
81 
82 # Register all the region classes with the same constructor and representer
83 if yaml:
84  for region_class in (ConvexPolygon, Ellipse, Circle, Box):
85  yaml.add_representer(region_class, region_representer)
86 
87  for loader in YamlLoaders:
88  yaml.add_constructor(f"lsst.sphgeom.{region_class.__name__}", region_constructor, Loader=loader)
89 
90 
91 # Pixelization schemes
92 
93 def pixel_representer(dumper, data):
94  """Represent a pixelization in YAML
95 
96  Stored as the pixelization level in a mapping with a single key
97  ``level``.
98  """
99  return dumper.represent_mapping(f"lsst.sphgeom.{type(data).__name__}",
100  {"level": data.getLevel()})
101 
102 
103 def pixel_constructor(loader, node):
104  """Construct a pixelization object from YAML.
105  """
106  mapping = loader.construct_mapping(node)
107 
108  className = node.tag
109  pixelMap = {"lsst.sphgeom.Q3cPixelization": Q3cPixelization,
110  "lsst.sphgeom.Mq3cPixelization": Mq3cPixelization,
111  "lsst.sphgeom.HtmPixelization": HtmPixelization,
112  "lsst.sphgeom.HealpixPixelization": HealpixPixelization,
113  }
114 
115  if className not in pixelMap:
116  raise RuntimeError(f"Encountered unexpected class {className} associated with"
117  " sphgeom pixelization YAML constructor")
118 
119  return pixelMap[className](mapping["level"])
120 
121 
122 # All the pixelization schemes use the same approach with getLevel
123 if yaml:
124  for pixelSchemeCls in (HtmPixelization, Q3cPixelization, Mq3cPixelization, HealpixPixelization):
125  yaml.add_representer(pixelSchemeCls, pixel_representer)
126  for loader in YamlLoaders:
127  yaml.add_constructor(f"lsst.sphgeom.{pixelSchemeCls.__name__}", pixel_constructor, Loader=loader)
def pixel_representer(dumper, data)
Definition: _yaml.py:93
def region_representer(dumper, data)
Definition: _yaml.py:62