Skip to content

Commit

Permalink
Add Yaml support for pixelization schemes
Browse files Browse the repository at this point in the history
  • Loading branch information
timj committed Jul 8, 2020
1 parent c3f5256 commit 39fa3ae
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 0 deletions.
42 changes: 42 additions & 0 deletions python/lsst/sphgeom/_yaml.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,15 @@
from .ellipse import Ellipse
from .circle import Circle
from .box import Box
from .htmPixelization import HtmPixelization
from .q3cPixelization import Q3cPixelization
from .mq3cPixelization import Mq3cPixelization

YamlLoaders = (yaml.Loader, yaml.CLoader, yaml.FullLoader, yaml.SafeLoader, yaml.UnsafeLoader)


# Regions

def region_representer(dumper, data):
"""Represent a sphgeom region object in a form suitable for YAML.
Expand All @@ -59,3 +64,40 @@ def region_constructor(loader, node):

for loader in YamlLoaders:
yaml.add_constructor(f"lsst.sphgeom.{region_class.__name__}", region_constructor, Loader=loader)


# Pixelization schemes

def pixel_representer(dumper, data):
"""Represent a pixelization in YAML
Stored as the pixelization level in a mapping with a single key
``level``.
"""
return dumper.represent_mapping(f"lsst.sphgeom.{type(data).__name__}",
{"level": data.getLevel()})


def pixel_constructor(loader, node):
"""Construct a pixelization object from YAML.
"""
mapping = loader.construct_mapping(node)

className = node.tag
pixelMap = {"lsst.sphgeom.Q3cPixelization": Q3cPixelization,
"lsst.sphgeom.Mq3cPixelization": Mq3cPixelization,
"lsst.sphgeom.HtmPixelization": HtmPixelization,
}

if className not in pixelMap:
raise RuntimeError(f"Encountered unexpected class {className} associated with"
" sphgeom pixelization YAML constructor")

return pixelMap[className](mapping["level"])


# All the pixelization schemes use the same approach with getLevel
for pixelSchemeCls in (HtmPixelization, Q3cPixelization, Mq3cPixelization):
yaml.add_representer(pixelSchemeCls, pixel_representer)
for loader in YamlLoaders:
yaml.add_constructor(f"lsst.sphgeom.{pixelSchemeCls.__name__}", pixel_constructor, Loader=loader)
6 changes: 6 additions & 0 deletions tests/test_HtmPixelization.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#

import pickle
import yaml
import unittest

from lsst.sphgeom import Angle, Circle, HtmPixelization, RangeSet, UnitVector3d, ConvexPolygon
Expand Down Expand Up @@ -89,6 +90,11 @@ def test_pickle(self):
b = pickle.loads(pickle.dumps(a))
self.assertEqual(a, b)

def test_yaml(self):
a = HtmPixelization(20)
b = yaml.safe_load(yaml.dump(a))
self.assertEqual(a, b)


if __name__ == '__main__':
unittest.main()
6 changes: 6 additions & 0 deletions tests/test_Mq3cPixelization.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#

import pickle
import yaml
import unittest

from lsst.sphgeom import (Angle, Circle, Mq3cPixelization, RangeSet,
Expand Down Expand Up @@ -93,6 +94,11 @@ def test_pickle(self):
b = pickle.loads(pickle.dumps(a))
self.assertEqual(a, b)

def test_yaml(self):
a = Mq3cPixelization(20)
b = yaml.safe_load(yaml.dump(a))
self.assertEqual(a, b)


if __name__ == '__main__':
unittest.main()
6 changes: 6 additions & 0 deletions tests/test_Q3cPixelization.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#

import pickle
import yaml
import unittest

from lsst.sphgeom import Angle, Circle, Q3cPixelization, RangeSet, UnitVector3d
Expand Down Expand Up @@ -80,6 +81,11 @@ def test_pickle(self):
b = pickle.loads(pickle.dumps(a))
self.assertEqual(a, b)

def test_yaml(self):
a = Q3cPixelization(20)
b = yaml.safe_load(yaml.dump(a))
self.assertEqual(a, b)


if __name__ == '__main__':
unittest.main()

0 comments on commit 39fa3ae

Please sign in to comment.