symmetrize_pymatgen.py ダウンロード/コピー
symmetrize_pymatgen.py をダウンロード
symmetrize_pymatgen.py
symmetrize_pymatgen.py
1"""
2概要: CIFファイルから結晶構造を読み込み、pymatgenを用いて対称化し、結果をCIFファイルとして出力するスクリプト。
3
4詳細説明:
5本スクリプトは、pymatgenライブラリのSpacegroupAnalyzerを使用して、入力されたCIFファイルから結晶構造を読み込み、
6その構造を高い対称性を持つ形式に変換(対称化)します。対称化の際には、symprecパラメータによって
7原子座標や格子定数の許容誤差を調整できます。
8対称化された構造は、新しいCIFファイルとして指定されたパスに保存されます。
9コマンドライン引数として、入力CIFファイルのパス (infile)、出力CIFファイルのパス (outfile)、
10対称性の許容誤差 (prec)、終了時の一時停止オプション (pause) を指定できます。
11outfile が指定されない場合は infile に基づいて自動生成され、prec のデフォルト値は 1.0e-3、
12pause のデフォルト値は 0 です。
13
14関連リンク:
15 symmetrize_pymatgen_usage
16"""
17import os
18import sys
19from pymatgen.core.structure import Structure
20from pymatgen.symmetry.analyzer import SpacegroupAnalyzer
21from pymatgen.io.cif import CifWriter, CifParser
22
23
24infile = None
25prec = 1.0e-3
26pause = 0
27
28if __name__ == "__main__":
29 argv = sys.argv
30 narg = len(argv)
31 if narg >= 2:
32 infile = argv[1]
33 if narg >= 3:
34 outfile = argv[2]
35 elif infile is not None:
36 dir_path = os.path.dirname(infile)
37 filebody, ext = os.path.splitext(infile)
38 outfile = os.path.join(dir_path, f"{filebody}-symmetrized.cif")
39 if narg >= 4:
40 prec = float(argv[3])
41 if narg >= 5:
42 pause = int(argv[4])
43
44
45def main():
46 """
47 概要: メイン処理を実行し、結晶構造の対称化とファイル出力を行います。
48
49 詳細説明:
50 コマンドライン引数から設定された infile、outfile、prec の値を出力し、
51 指定された infile から結晶構造を読み込みます。
52 pymatgen.symmetry.analyzer.SpacegroupAnalyzer を使用して構造を対称化し、
53 結果として得られた対称化された構造を outfile にCIF形式で保存します。
54 pause が 1 に設定されている場合、スクリプト終了前にユーザーからの入力を待ちます。
55
56 戻り値:
57 :returns: なし。この関数は直接値を返しません。
58 :rtype: None
59 """
60 print()
61 print(f"infile: {infile}")
62 print(f"outfile: {outfile}")
63 print(f"prec: {prec}")
64
65 struct = Structure.from_file(infile, primitive = False)
66 print()
67 print("input structure:")
68 print(struct)
69
70 symmetry_analyzer = SpacegroupAnalyzer(struct, symprec = prec) #, angle_tolerance = 5.0)
71 symmetrized_structure = symmetry_analyzer.get_symmetrized_structure()
72 print()
73 print("symmetrized_structure:")
74 print(symmetrized_structure)
75
76 print()
77 print(f"Save the symmetrized structure to [{outfile}]")
78 writer = CifWriter(symmetrized_structure, symprec = prec) #, angle_tolerance = 5.0)
79 writer.write_file(outfile)
80
81 if pause: input("\nPress ENTER to terminate>>\n")
82
83
84if __name__ == '__MAIN__':
85 main()