crystal.cif_inf_pymatgen のソースコード

"""
CIFファイルから結晶構造情報を読み込み、pymatgenを用いて解析・表示するスクリプト。

概要:
    本スクリプトは、指定されたCIFファイルから結晶構造データを読み込み、
    pymatgenライブラリの機能を用いて、その構造に関する詳細な情報を解析し、標準出力に表示します。
    具体的には、空間群の情報、格子定数、対称操作、原子サイトの座標と組成などが含まれます。
    また、元の構造に加え、対称化された構造の解析結果も提示します。

詳細説明:
    1.  コマンドライン引数またはデフォルト設定に基づいて入力CIFファイルパスを決定します。
    2.  `tklib.tkApplication` を使用して、標準出力に加え、ログファイルへの出力リダイレクトを設定します。
    3.  pymatgenの`Structure.from_file`メソッドでCIFファイルを読み込み、`Structure`オブジェクトを作成します。
    4.  作成された`Structure`オブジェクトについて、`print_inf`関数を呼び出して詳細情報を表示します。
    5.  `SpacegroupAnalyzer`を用いて構造を対称化し、その対称化された`Structure`オブジェクトについても
        同様に`print_inf`関数で詳細情報を表示します。
    6.  表示される情報には、空間群のシンボルと番号、対称操作の行列、格子定数、格子ベクトル、
        単位胞体積、独立なサイトおよび全サイトの原子種、分数座標、占有率が含まれます。

関連リンク:
    :doc:`cif_inf_pymatgen_usage`
"""
from pprint import pprint
import re

from pymatgen.io.cif import CifParser
from pymatgen.symmetry.analyzer import SpacegroupAnalyzer
from pymatgen.core.structure import Structure
from pymatgen.core.lattice import Lattice
from pymatgen.core.periodic_table import Element


from tklib.tkapplication import tkApplication
from tklib.tkutils import terminate, pint, pfloat, getarg, getintarg, getfloatarg


infile = 'SrTiO3.cif'


app    = tkApplication()
infile      = getarg( 1, infile)


#==========================================
# Main prgram
#==========================================







[ドキュメント] def main(): """ プログラムの主要な実行フローを定義します。 概要: 指定されたCIFファイルを読み込み、元の構造と対称化された構造の両方について詳細情報を表示します。 詳細説明: 1. 入力CIFファイル名からログファイル名と対称化されたCIFファイルの出力パスを生成します。 2. 標準出力をログファイルにもリダイレクトします。 3. 入力CIFファイルを`pymatgen.core.structure.Structure`オブジェクトとして読み込みます。 4. 読み込んだ元の構造の情報を`print_inf`関数を使って表示します。 5. `SpacegroupAnalyzer`を使用して構造を対称化し、その対称化された構造の情報を`print_inf`関数を使って表示します。 6. プログラムの実行終了時に一時停止します。 :returns: None """ logfile = app.replace_path(infile, template = ["{dirname}", "{filebody}-out.txt"]) print(f"Open logfile [{logfile}]") app.redirect(targets = ["stdout", logfile], mode = 'w') convCIFfile = app.replace_path(infile, template = ["{dirname}", "{filebody}-symmetrized.cif"]) print("") print(f"input: {infile}") print(f"log file: {logfile}") print(f"output symmetrized CIF file: {convCIFfile}") print("") print(f"Read [{infile}]") structure = Structure.from_file(infile) print("") print("Structure as original input:") print_inf(structure) print("") print("Symmetrized structure:") analyzer = SpacegroupAnalyzer(structure) symmetrized_structure = analyzer.get_symmetrized_structure() print_inf(symmetrized_structure) app.terminate(pause = True)
if __name__ == "__main__": main()