Source code for asdf_astropy.converters.transform.rotations

from .core import TransformConverterBase, parameter_to_value


[docs] class Rotate3DConverter(TransformConverterBase): """ ASDF support for serializing rotation models that use the rotate3d tag. """ tags = ("tag:stsci.edu:asdf/transform/rotate3d-*",) types = ( "astropy.modeling.rotations.RotateNative2Celestial", "astropy.modeling.rotations.RotateCelestial2Native", "astropy.modeling.rotations.EulerAngleRotation", )
[docs] def to_yaml_tree_transform(self, model, tag, ctx): from astropy.modeling import rotations if isinstance(model, rotations.RotateNative2Celestial): node = { "phi": parameter_to_value(model.lon), "theta": parameter_to_value(model.lat), "psi": parameter_to_value(model.lon_pole), "direction": "native2celestial", } elif isinstance(model, rotations.RotateCelestial2Native): node = { "phi": parameter_to_value(model.lon), "theta": parameter_to_value(model.lat), "psi": parameter_to_value(model.lon_pole), "direction": "celestial2native", } else: node = { "phi": parameter_to_value(model.phi), "theta": parameter_to_value(model.theta), "psi": parameter_to_value(model.psi), "direction": model.axes_order, } return node
[docs] def from_yaml_tree_transform(self, node, tag, ctx): from astropy.modeling import rotations if node["direction"] == "native2celestial": return rotations.RotateNative2Celestial(node["phi"], node["theta"], node["psi"]) if node["direction"] == "celestial2native": return rotations.RotateCelestial2Native(node["phi"], node["theta"], node["psi"]) return rotations.EulerAngleRotation(node["phi"], node["theta"], node["psi"], axes_order=node["direction"])
[docs] class RotationSequenceConverter(TransformConverterBase): """ ASDF support for serializing rotation sequence models. """ tags = ("tag:stsci.edu:asdf/transform/rotate_sequence_3d-*",) types = ( "astropy.modeling.rotations.RotationSequence3D", "astropy.modeling.rotations.SphericalRotationSequence", )
[docs] def to_yaml_tree_transform(self, model, tag, ctx): from astropy.modeling import rotations node = {"angles": list(model.angles.value)} node["axes_order"] = model.axes_order if isinstance(model, rotations.SphericalRotationSequence): node["rotation_type"] = "spherical" elif isinstance(model, rotations.RotationSequence3D): node["rotation_type"] = "cartesian" else: msg = f"Cannot serialize model of type {type(model)}" raise TypeError(msg) return node
[docs] def from_yaml_tree_transform(self, node, tag, ctx): from astropy.modeling import rotations angles = node["angles"] axes_order = node["axes_order"] rotation_type = node["rotation_type"] if rotation_type == "cartesian": return rotations.RotationSequence3D(angles, axes_order=axes_order) if rotation_type == "spherical": return rotations.SphericalRotationSequence(angles, axes_order=axes_order) msg = f"Unrecognized rotation_type: {rotation_type}" raise ValueError(msg)