"""
概要: 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()