"""tkCIF.pyで読み込んだtkCrystalオブジェクトからpymatgenのStructureオブジェクトを生成するためのユーティリティモジュールです。
tkCrystalオブジェクトのデータ構造をpymatgenが扱うことができるStructureオブジェクトへと変換する機能を提供します。
これにより、tkCIF.pyで読み込んだ結晶構造データをpymatgenエコシステムで利用できるようになります。
:doc:`tkcif2pymatgen_usage`
"""
from pymatgen.core import Lattice, Structure, Species
[ドキュメント]
def tkcrystal_to_pmg_structure(cry):
"""tkCrystalオブジェクトをpymatgenのStructureオブジェクトに変換します。
tkCIF.pyで読み込んだtkCrystalオブジェクトから、結晶の格子パラメータ、原子の種類、
およびその分率座標を抽出し、pymatgenのStructureオブジェクトとして再構築します。
部分占有率が設定されている原子サイトに対しても適切に対応し、
pymatgenのSpeciesオブジェクト形式で表現します(占有率が1.0に近い場合は元素名、
それ以外の場合は辞書形式 `{Element: occupancy}`)。
:param cry: tkCIF.pyで読み込まれたtkCrystalオブジェクト。
LatticeParameters()メソッドとAtomSiteList()メソッドを持ち、
それぞれ格子情報と原子サイト情報を提供する必要があります。
:returns: tkCrystalオブジェクトから生成されたpymatgen.core.Structureオブジェクト。
:rtype: pymatgen.core.Structure
"""
a, b, c, alpha, beta, gamma = cry.LatticeParameters()
lattice = Lattice.from_parameters(a, b, c, alpha, beta, gamma)
species = []
frac_coords = []
atom_sites = cry.AtomSiteList()
for site in atom_sites:
elem = site.AtomNameOnly() # 元素記号 (例: "Al")
occ = site.Occupancy() # 部分占有率
pos = site.Position() # 分率座標 (x,y,z)
# 部分占有を pymatgen の Species に反映
# occ=1.0 → Element("Al"), occ<1.0 → {Element("Al"): occ}
if occ is None or occ >= 0.9999:
sp = elem
else:
sp = {elem: occ}
species.append(sp)
frac_coords.append(pos)
struct = Structure(lattice, species, frac_coords, coords_are_cartesian=False)
return struct