def read_cif(filename): """ read the cif, mainly for pyxtal cif output Be cautious in using it to read other cif files Args: filename: path of the structure file Return: pyxtal structure """ species = [] coords = [] with open(filename, 'r') as f: lines = f.readlines() for i, line in enumerate(lines): if line.startswith('_symmetry_Int_Tables_number'): sg = int(line.split()[-1]) elif line.startswith('_cell_length_a'): a = float(lines[i].split()[-1]) b = float(lines[i+1].split()[-1]) c = float(lines[i+2].split()[-1]) alpha = float(lines[i+3].split()[-1]) beta = float(lines[i+4].split()[-1]) gamma = float(lines[i+5].split()[-1]) elif line.startswith('_symmetry_cell_setting'): lat_type = line.split()[-1] elif line.startswith('_symmetry_space_group_name_H-M '): symbol = line.split()[-1] if eval(symbol) in ["Pn", "P21/n", "C2/n"]: diag = True else: diag = False elif line.find('_atom_site') >= 0: s = i while True: s += 1 if lines[s].find('_atom_site') >= 0: pass elif len(lines[s].split()) <= 3: break else: tmp = lines[s].split() pos = [float(tmp[-4]), float(tmp[-3]), float(tmp[-2])] species.append(tmp[0]) coords.append(pos) break wp0 = Group(sg)[0] lattice = Lattice.from_para(a, b, c, alpha, beta, gamma, lat_type) sites = [] for specie, coord in zip(species, coords): pt, wp, _ = WP_merge(coord, lattice.matrix, wp0, tol=0.1) sites.append(atom_site(wp, pt, specie, diag)) return lattice, sites
from pymatgen.core.structure import Molecule import pymatgen.analysis.structure_matcher as sm from pymatgen.symmetry.analyzer import SpacegroupAnalyzer from pymatgen.core.operations import SymmOp from pyxtal import pyxtal from pyxtal.lattice import Lattice from pyxtal.symmetry import Group, Wyckoff_position, get_wyckoffs from pyxtal.wyckoff_site import WP_merge from pyxtal.XRD import Similarity from pyxtal.operations import get_inverse cif_path = resource_filename("pyxtal", "database/cifs/") l0 = Lattice.from_matrix([[4.08, 0, 0], [0, 9.13, 0], [0, 0, 5.50]]) l1 = Lattice.from_matrix([[4.08, 0, 0], [0, 9.13, 0], [0, 0, 5.50]]) l2 = Lattice.from_para(4.08, 9.13, 5.50, 90, 90, 90) l3 = Lattice.from_para(4.08, 7.13, 5.50, 90, 38, 90, ltype="monoclinic") wp1 = Wyckoff_position.from_group_and_index(36, 0) wp2 = Wyckoff_position.from_group_and_index(36, "4a") class TestGroup(unittest.TestCase): def test_list_wyckoff_combinations(self): g = Group(64) a1, _ = g.list_wyckoff_combinations([4, 2]) self.assertTrue(a1 is None) a2, _ = g.list_wyckoff_combinations([4, 8], quick=False) self.assertTrue(len(a2) == 8) class TestOptLat(unittest.TestCase):