|
20 | 20 | from abc import ABC, abstractmethod
|
21 | 21 | from collections import defaultdict
|
22 | 22 | from fnmatch import fnmatch
|
23 |
| -from typing import TYPE_CHECKING, Literal, cast, get_args |
| 23 | +from typing import TYPE_CHECKING, Literal, cast, get_args, overload |
24 | 24 |
|
25 | 25 | import numpy as np
|
26 | 26 | from monty.dev import deprecated
|
|
43 | 43 | from pymatgen.electronic_structure.core import Magmom
|
44 | 44 | from pymatgen.symmetry.maggroups import MagneticSpaceGroup
|
45 | 45 | from pymatgen.util.coord import all_distances, get_angle, lattice_points_in_supercell
|
| 46 | +from pymatgen.util.due import Doi, due |
46 | 47 |
|
47 | 48 | if TYPE_CHECKING:
|
48 | 49 | from collections.abc import Callable, Iterable, Iterator, Sequence
|
49 | 50 | from typing import Any, ClassVar, SupportsIndex, TypeAlias
|
50 | 51 |
|
| 52 | + import moyopy |
51 | 53 | import pandas as pd
|
| 54 | + import spglib |
52 | 55 | from ase import Atoms
|
53 | 56 | from ase.calculators.calculator import Calculator
|
54 | 57 | from ase.io.trajectory import Trajectory
|
@@ -3338,6 +3341,61 @@ def to_conventional(self, **kwargs) -> Structure:
|
3338 | 3341 | """
|
3339 | 3342 | return self.to_cell("conventional", **kwargs)
|
3340 | 3343 |
|
| 3344 | + @overload |
| 3345 | + def get_symmetry_dataset(self, backend: Literal["moyopy"], **kwargs) -> moyopy.MoyoDataset: ... |
| 3346 | + |
| 3347 | + @due.dcite( |
| 3348 | + Doi("10.1080/27660400.2024.2384822"), |
| 3349 | + description="Spglib: a software library for crystal symmetry search", |
| 3350 | + ) |
| 3351 | + @overload |
| 3352 | + def get_symmetry_dataset(self, backend: Literal["spglib"], **kwargs) -> spglib.SpglibDataset: ... |
| 3353 | + |
| 3354 | + def get_symmetry_dataset( |
| 3355 | + self, backend: Literal["moyopy", "spglib"] = "spglib", **kwargs |
| 3356 | + ) -> moyopy.MoyoDataset | spglib.SpglibDataset: |
| 3357 | + """Get a symmetry dataset from the structure using either moyopy or spglib backend. |
| 3358 | +
|
| 3359 | + If using the spglib backend (default), please cite: |
| 3360 | +
|
| 3361 | + Togo, A., Shinohara, K., & Tanaka, I. (2024). Spglib: a software library for crystal |
| 3362 | + symmetry search. Science and Technology of Advanced Materials: Methods, 4(1), 2384822-2384836. |
| 3363 | + https://doi.org/10.1080/27660400.2024.2384822 |
| 3364 | +
|
| 3365 | + Args: |
| 3366 | + backend ("moyopy" | "spglib"): Which symmetry analysis backend to use. |
| 3367 | + Defaults to "spglib". |
| 3368 | + **kwargs: Additional arguments passed to the respective backend's constructor. |
| 3369 | + For spglib, these are passed to SpacegroupAnalyzer (e.g. symprec, angle_tolerance). |
| 3370 | + For moyopy, these are passed to MoyoDataset constructor. |
| 3371 | +
|
| 3372 | + Returns: |
| 3373 | + MoyoDataset | SpglibDataset: Symmetry dataset from the chosen backend. |
| 3374 | +
|
| 3375 | + Raises: |
| 3376 | + ImportError: If the requested backend is not installed. |
| 3377 | + ValueError: If an invalid backend is specified. |
| 3378 | + """ |
| 3379 | + if backend == "moyopy": |
| 3380 | + try: |
| 3381 | + import moyopy |
| 3382 | + import moyopy.interface |
| 3383 | + except ImportError: |
| 3384 | + raise ImportError("moyopy is not installed. Run pip install moyopy.") |
| 3385 | + |
| 3386 | + # Convert structure to MoyoDataset format |
| 3387 | + moyo_cell = moyopy.interface.MoyoAdapter.from_structure(self) |
| 3388 | + return moyopy.MoyoDataset(cell=moyo_cell, **kwargs) |
| 3389 | + |
| 3390 | + if backend == "spglib": |
| 3391 | + from pymatgen.symmetry.analyzer import SpacegroupAnalyzer |
| 3392 | + |
| 3393 | + sga = SpacegroupAnalyzer(self, **kwargs) |
| 3394 | + return sga.get_symmetry_dataset() |
| 3395 | + |
| 3396 | + valid_backends = ("moyopy", "spglib") |
| 3397 | + raise ValueError(f"Invalid {backend=}, must be one of {valid_backends}") |
| 3398 | + |
3341 | 3399 |
|
3342 | 3400 | class IMolecule(SiteCollection, MSONable):
|
3343 | 3401 | """Basic immutable Molecule object without periodicity. Essentially a
|
|
0 commit comments