crystal.symmetrize_pymatgen のソースコード

"""
概要: CIFファイルから結晶構造を読み込み、pymatgenを用いて対称化し、結果をCIFファイルとして出力するスクリプト。

詳細説明:
本スクリプトは、pymatgenライブラリのSpacegroupAnalyzerを使用して、入力されたCIFファイルから結晶構造を読み込み、
その構造を高い対称性を持つ形式に変換(対称化)します。対称化の際には、symprecパラメータによって
原子座標や格子定数の許容誤差を調整できます。
対称化された構造は、新しいCIFファイルとして指定されたパスに保存されます。
コマンドライン引数により、入力ファイル、出力ファイル、symprec値、および終了時の一時停止オプションを設定できます。

関連リンク: :doc:`symmetrize_pymatgen_usage`

:param argv[1]: infile (str)
    対称化する結晶構造が記述された入力CIFファイルのパス。
:param argv[2]: outfile (str, optional)
    対称化された構造を保存する出力CIFファイルのパス。
    指定されない場合、入力ファイル名に基づいて自動生成されます(例: "input.cif" -> "input-symmetrized.cif")。
:param argv[3]: prec (float, optional)
    対称性を検出するための許容誤差 (symprec)。PymatgenのSpacegroupAnalyzerに渡されます。
    デフォルト値は 1.0e-3 です。
:param argv[4]: pause (int, optional)
    スクリプト終了時にユーザーがEnterキーを押すまで一時停止するかどうかを制御します。
    1を設定すると一時停止し、0を設定すると一時停止しません。デフォルト値は 0 です。

:returns: None
    このスクリプトは直接値を返しませんが、指定されたパスに新しいCIFファイルを生成します。
"""
import os
import sys
from pymatgen.core.structure import Structure
from pymatgen.symmetry.analyzer import SpacegroupAnalyzer
from pymatgen.io.cif import CifWriter, CifParser


infile = None
prec = 1.0e-3
pause = 0

if __name__ == "__main__":
    argv = sys.argv
    narg = len(argv)
    if narg >= 2:
        infile = argv[1]
    if narg >= 3:
        outfile = argv[2]
    elif infile is not None:
        dir_path = os.path.dirname(infile)
        filebody, ext = os.path.splitext(infile)
        outfile = os.path.join(dir_path, f"{filebody}-symmetrized.cif")
    if narg >= 4:
        prec = float(argv[3])
    if narg >= 5:
        pause = int(argv[4])


[ドキュメント] def main(): print() print(f"infile: {infile}") print(f"outfile: {outfile}") print(f"prec: {prec}") struct = Structure.from_file(infile, primitive = False) print() print("input structure:") print(struct) symmetry_analyzer = SpacegroupAnalyzer(struct, symprec = prec) #, angle_tolerance = 5.0) symmetrized_structure = symmetry_analyzer.get_symmetrized_structure() print() print("symmetrized_structure:") print(symmetrized_structure) print() print(f"Save the symmetrized structure to [{outfile}]") writer = CifWriter(symmetrized_structure, symprec = prec) #, angle_tolerance = 5.0) writer.write_file(outfile) if pause: input("\nPress ENTER to terminate>>\n")
if __name__ == '__MAIN__': main()