Source code for pymatgen.symmetry.site_symmetries
"""
Provides analysis of site symmetries.
"""
import numpy as np
from pymatgen.symmetry.analyzer import SpacegroupAnalyzer as sga
from pymatgen.core.operations import SymmOp
[docs]def get_site_symmetries(struc, precision=0.1):
"""
Get all the point group operations centered on each atomic site
in the form [[point operations of site index 1]...[[point operations of site index N]]]
Args:
struc: Pymatgen structure
precision (float): tolerance to find symmetry operaitons
Return:
list of lists of point operations for each atomic site
"""
pointops = []
# Point symmetries of each atom
for site1 in range(len(struc.sites)):
tempstruc = struc.copy()
# Place the origin of the cell at each atomic site
pointops.append([])
for site2 in range(len(struc.sites)):
tempstruc.replace(
site2,
tempstruc.sites[site2].specie,
tempstruc.frac_coords[site2] - struc.frac_coords[site1],
)
sgastruc = sga(tempstruc, symprec=precision)
ops = sgastruc.get_symmetry_operations(cartesian=True)
for site2 in range(len(ops)):
if all(ops[site2].translation_vector == [0, 0, 0]):
pointops[site1].append(ops[site2])
return pointops
[docs]def get_shared_symmetry_operations(struc, pointops, tol=0.1):
"""
Get all the point group operations shared by a pair of atomic sites
in the form [[point operations of site index 1],[],...,[]]
Args:
struc: Pymatgen structure
pointops: list of point group operations from get_site_symmetries method
Return:
list of lists of shared point operations for each pair of atomic sites
"""
numsites = len(struc)
sharedops = [[0 for x in range(numsites)] for y in range(numsites)]
for site1 in range(numsites):
for site2 in range(numsites):
sharedops[site1][site2] = []
for op1 in range(len(pointops[site1])):
for op2 in range(len(pointops[site2])):
if np.allclose(
pointops[site1][op1].rotation_matrix,
pointops[site2][op2].rotation_matrix,
):
sharedops[site1][site2].append(pointops[site1][op1])
for site1 in range(len(sharedops)):
for site2 in range(len(sharedops[site1])):
uniqueops = []
for ops in range(len(sharedops[site1][site2])):
op = SymmOp.from_rotation_and_translation(
rotation_matrix=sharedops[site1][site2][ops].rotation_matrix,
translation_vec=(0, 0, 0),
tol=tol,
)
if op in uniqueops:
continue
else:
uniqueops.append(op)
sharedops[site1][site2] = uniqueops
return sharedops