Source code for multipie.symmetry_operation.symmetry_operation
"""
SymmetryOperation manages symmetry operation.
"""
from gcoreutils.nsarray import NSArray
from multipie.symmetry_operation.util.symmetry_operation_util import (
to_cartesian,
to_reduced,
to_axial,
reflection_matrix,
rotation_matrix,
rotoinversion_matrix,
)
from multipie.tag.tag_symmetry_operation import TagSymmetryOperation
# ==================================================
[docs]
class SymmetryOperation:
"""
symmetry operation.
Attributes:
tag (TagSymmetryOperation): symmetry-operation tag.
m_polar (NSArray): symmetry-operation matices for polar vector, (3x3:point group) or (4x4:space group).
m_axial (NSArray): symmetry-operation matices for axial vector, (3x3:point group) or (4x4:space group).
"""
# ==================================================
def __init__(self, so_tag, crystal):
"""
initialize the class.
Args:
so_tag (TagSymmetryOperation or str): symmetry-operation tag.
crystal (str): crystal type, (triclinic/monoclinic/orthorhombic/tetragonal/trigonal/hexagonal/cubic).
"""
so_tag = TagSymmetryOperation(str(so_tag))
self.tag = so_tag
"""symmetry-operation tag."""
so = SymmetryOperation._matrix(self.tag, crystal)
self.m_polar = so[0]
"""symmetry-operation matices for polar vector, (3x3:point group) or (4x4:space group)."""
self.m_axial = so[1]
"""symmetry-operation matices for axial vector, (3x3:point group) or (4x4:space group)."""
# ==================================================
def __str__(self):
return str(self.tag)
# ==================================================
def __repr__(self):
return repr(self.tag)
# ==================================================
def latex(self):
return self.tag.latex()
# ==================================================
@classmethod
def _matrix(cls, tag, crystal):
"""
symmetry operation matrix.
Args:
tag (TagSymmetryOperation): tag of symmetry operation.
crystal (str): crystal.
Returns:
- NSArray: symmetry-operation matices for polar vector, (3x3:point group) or (4x4:space group).
- NSArray: symmetry-operation matices for axial vector, (3x3:point group) or (4x4:space group).
"""
axis = NSArray(tag.axis)
axis = to_cartesian(crystal, axis)
if tag.mirror:
h = reflection_matrix(axis)
elif tag.inversion:
h = rotoinversion_matrix(tag.n, axis)
else:
h = rotation_matrix(tag.n, axis)
ha = to_axial(h)
h = to_reduced(crystal, h)
ha = to_reduced(crystal, ha)
if tag.is_point_group():
return h, ha
else:
t = NSArray(tag.t)
h4 = h._pad()
h4[0:3, 3] = t[:]
ha4 = ha._pad()
ha4[0:3, 3] = t[:]
return h4, ha4