"""
VESTA関連データ、特に元素情報を扱うモジュール。
VESTAで用いられる元素情報ファイル (elements.ini) から原子の基本情報を読み込み、
管理するためのクラス `tkVESTA` を定義します。
このモジュールは、物質シミュレーションや可視化アプリケーションにおいて、
原子のプロパティを簡単に取得・利用するための基盤を提供します。
:doc:`tkvesta_usage`
"""
import os
from tklib.tkprogvars import VESTADBDir
from tklib.tkutils import pint, pfloat
[ドキュメント]
class tkVESTA():
"""
VESTAの元素データや関連情報を管理するためのクラス。
元素の名前、原子番号、原子半径、ファンデルワールス半径、イオン半径、表示色などの情報を
辞書形式で保持し、容易にアクセスできるようにします。
"""
def __init__(self, path = None, print_level = 1):
"""
tkVESTAクラスの新しいインスタンスを初期化します。
指定されたパスからVESTAの元素データを読み込み、`atom_dict` 属性に格納します。
`path`がNoneでない場合、モジュールレベルの `read_VESTA_elements` 関数を呼び出して
データを読み込もうとします。
:param path: str, 元素データファイルへのパス。Noneの場合、インスタンスは初期化されますが、
データは読み込まれません。
:param print_level: int, メッセージの表示レベル。1の場合、読み込みメッセージが表示されます。
"""
self.path = path
self.print_level = print_level
self.atom_dict = None
if path is not None:
# 注意: ここで呼び出されている `read_VESTA_elements` は、
# このクラスのメソッドではなく、外部(グローバルスコープ)の関数を指しています。
self.atom_dict = read_VESTA_elements(path, print_level = print_level)
[ドキュメント]
def read_VESTA_elements(self, path = None, print_level = 1):
"""
VESTA形式の元素データファイルから原子情報を読み込みます。
このメソッドは、指定されたパスのファイル、またはデフォルトの `elements.ini` から
原子の様々なプロパティ(原子番号、半径、色など)を読み込み、辞書形式で返します。
ファイルが存在しない場合やパスが指定されていない場合はNoneを返します。
:param path: str, 元素データファイルへのパス。Noneの場合、デフォルトで
`VESTADBDir` ディレクトリ内の `elements.ini` を使用します。
:param print_level: int, メッセージの表示レベル。1の場合、ファイルからの読み込み時に
コンソールにメッセージが表示されます。
:returns: dict or None, 読み込んだ原子データを含む辞書。
辞書のキーは原子名(str)、値は各原子の詳細情報(dict)。
詳細情報のdictは 'Z' (float), 'atom_name' (str), 'ratom' (float),
'rvdw' (float), 'rion' (float), 'color' ([float, float, float])
をキーに持ちます。ファイルが存在しない場合はNone。
"""
if path is None: path = os.path.join(VESTADBDir, 'elements.ini')
if print_level:
print(f"\nread_VESTA_elements(): Read atom data from [{path}]")
if path is None or not os.path.exists(path): return None
atom_dict = {}
fp = open(path, "r")
for line in fp:
a = line.split()
atom_name = a[1]
_inf = {
"Z": pfloat(a[0]),
"atom_name": atom_name,
"ratom": pfloat(a[2]),
"rvdw" : pfloat(a[3]),
"rion" : pfloat(a[4]),
"color": [pfloat(a[5]), pfloat(a[6]), pfloat(a[7])],
}
atom_dict[atom_name] = _inf
fp.close()
return atom_dict