"""
概要:
    seekpathライブラリを用いて、指定された結晶構造の高対称k点経路とバンド構造計算用のk点リストを生成・表示します。

詳細説明:
    本スクリプトは、CIFファイルから結晶構造を読み込み、pymatgenを使用してプリミティブセルに変換します。
    その後、変換された構造情報をseekpathライブラリが要求する形式に整形し、以下の処理を実行します。
    結晶構造のブラベ格子に基づいて標準的な高対称k点経路を特定し、特定された高対称点の座標を表示します。
    さらに、バンド構造計算に利用可能な、経路上の明示的なk点リストを生成します。

    デフォルトでは 'ZnO.cif' を入力ファイルとして使用しますが、
    コマンドライン引数で別のCIFファイルを指定することも可能です。
    例: python kpath_seekpath.py structure.cif

関連リンク:
    kpath_seekpath_usage
"""
# Y. Hinuma, G. Pizzi, Y. Kumagai, F. Oba, I. Tanaka, "Band structure diagram paths based on crystallography," Computational Materials Science 128, 140 (2017).

import sys
import numpy as np
from pymatgen.core import Structure
import seekpath

infile = 'ZnO.cif'

if __name__ == "__main__":
    if len(sys.argv) > 1:
        infile = sys.argv[1]


def main():
    """
    概要:
        指定されたCIFファイルから結晶構造を読み込み、k点経路を計算して出力します。
    詳細説明:
        入力CIFファイルからpymatgenのStructureオブジェクトを生成し、プリミティブセルに変換します。
        変換された構造情報を用いて、seekpathライブラリから標準的な高対称k点経路と
        その座標を取得し、標準出力に表示します。
        k点経路のセグメントと高対称点の分数座標が出力されます。
    引数:
        なし。スクリプト起動時のコマンドライン引数またはデフォルトで設定されたinfile変数を参照します。
    戻り値:
        なし。結果を標準出力に表示します。
    """
    structure = Structure.from_file(infile)
    prim = structure.get_primitive_structure()

    cell = prim.lattice.matrix
    positions = prim.frac_coords
    atomic_numbers = [site.specie.Z for site in prim]

    spglib_cell = (cell, positions, atomic_numbers)

# 標準的なk pathを取得
    result = seekpath.get_path(spglib_cell)

    print("\n=== 経路 ===")
    for seg in result['path']:
        print(" → ".join(seg))

    print("\n=== 高対称点座標 ===")
    for k, v in result['point_coords'].items():
        print(f"{k:3s} : {v}")

# バンド構造計算用のk点リストを取得
    explicit = seekpath.get_explicit_k_path(spglib_cell, result['path'])

#print("\n=== k点リスト (分率座標) ===")
#for kp, label in zip(explicit['explicit_kpoints_rel'], explicit['explicit_kpoints_labels']):
#    print(f"{label:6s} : {kp}")

#print("\n=== k点リスト (絶対座標) ===")
#for kp, label in zip(explicit['explicit_kpoints_abs'], explicit['explicit_kpoints_labels']):
#    print(f"{label:6s} : {kp}")

#print("\n=== 線形座標 (プロット用x軸) ===")
#print(explicit['explicit_kpoints_linearcoord'])


if __name__ == '__MAIN__':
    main()