"""
Reads a .cif file into an MDMC molecule, optionally ignoring symmetry data.
Adapted from https://wiki.fysik.dtu.dk/ase/_modules/ase/io/cif.html#read_cif.
"""
from ase.io.cif import parse_cif
from MDMC.MD.ase.convert import ASE_to_MDMC
from MDMC.readers.configurations.ase import ASEReader
from MDMC.readers.configurations.conf_reader import ConfigurationReader
[docs]
class CIFReader(ConfigurationReader):
"""
Reads a .cif file into a list of MDMC Atoms.
"""
extension = 'cif'
[docs]
def parse(self, **settings: dict) -> None:
"""
Parse a .cif file into a list of MDMC Atoms,
optionally ignoring symmetry data.
Parameters
----------
settings:
ignore_symmetry: bool, default True
Whether to read or ignore symmetry data.
"""
if settings.get('ignore_symmetry', True):
images = []
for block in parse_cif(self.file):
if not block.has_structure():
continue
# this is the only place where we differ from ase.io.cif.read_cif:
# just get the unsymmetrised structure rather than symmetrising it
atoms = block.get_unsymmetrized_structure()
images.append(atoms)
atoms = list(images)[0]
self._atoms = ASE_to_MDMC(atoms)
else: # else, this is just the standard ASE cif parsing
reader = ASEReader(self.file_name)
with reader:
reader.parse()
self._atoms = reader.atoms