Fhkl.py
1. 概要
Fhkl.py は、X線回折に関連する原子散乱因子、異常散乱因子、結晶構造因子の計算および表示を行うPythonスクリプトです。
このスクリプトは以下の機能を提供します。
指定された原子の原子散乱因子 (ASF) のプロット
指定された原子の異常散乱因子スペクトルのプロット
CIFファイルから読み込んだ結晶の構造因子 (
Fhkl) の計算と表示CIFファイルから読み込んだ結晶構造情報の表示
実行モードはコマンドライン引数またはスクリプト内のグローバル変数で制御されます。
関連リンク:
:doc:Fhkl_usage
2. 前提条件
本スクリプトを実行するには、Python 3 がインストールされている必要があります。 また、後述の「9. 非標準ライブラリ」に記載されているライブラリが別途必要です。
3. インストール方法
Python: Python 3 がシステムにインストールされていることを確認してください。
非標準ライブラリ: 以下のライブラリは
pipコマンドを使用してインストールできます。pip install numpy scipy matplotlib
tklib:tklibは本スクリプトが依存するカスタムライブラリです。コードからはそのインストール方法は確認できません。
4. 使用方法
a. スクリプトの実行
本スクリプトはコマンドラインインターフェース (CLI) から実行します。 実行モードやパラメータはコマンドライン引数として渡すか、スクリプト内のグローバル変数を直接編集することで設定できます。
b. コマンドライン引数
Fhkl.py は以下のモードをサポートしており、それぞれ異なる引数を取ります。
モード
asf(Atomic Form Factor): 指定された原子の原子散乱因子関数をプロットします。python Fhkl.py asf target_atom xray_source smin smax ns s_value plot_scale
例:
python Fhkl.py asf Ni CuKa1 0.0 20.0 31 0.1 linear
引数の説明:
target_atom: 対象となる原子の記号 (例:Ni)。デフォルト値:Ni。xray_source: X線源の名前 (例:CuKa1) または波長 (nm)。デフォルト値:CuKa1。smin: 散乱ベクトルの最小値 (nm^-1)。型:float。デフォルト値:0.0。smax: 散乱ベクトルの最大値 (nm^-1)。型:float。デフォルト値:20.0。ns: 散乱ベクトルの計算点数。型:int。デフォルト値:31。s_value: 特定の散乱ベクトル値 (nm^-1)。型:float。デフォルト値:0.1。plot_scale: プロットのY軸スケール (linearまたはlog)。デフォルト値:linear。
モード
anom(Anomalous Scattering Factor): 指定された原子の異常散乱因子スペクトルをプロットします。python Fhkl.py anom target_atom wl_min wl_max wl_value plot_scale
例:
python Fhkl.py anom Ni None None None linear
引数の説明:
target_atom: 対象となる原子の記号 (例:Ni)。デフォルト値:Ni。wl_min: プロットする波長範囲の最小値 (nm)。型:floatまたはNone。デフォルト値:None。wl_max: プロットする波長範囲の最大値 (nm)。型:floatまたはNone。デフォルト値:None。wl_value: 特定の波長値 (nm)。型:floatまたはNone。デフォルト値:None。plot_scale: プロットのY軸スケール (linearまたはlog)。デフォルト値:linear。
モード
F(Crystal Structure Factor): 指定されたCIFファイルの結晶構造因子を計算し、表示します。python Fhkl.py F CIF_file xray_source h k l
例:
python Fhkl.py F test.cif CuKa1 5 1 3
引数の説明:
CIF_file: 入力CIFファイル名。デフォルト値:test.cif。xray_source: X線源の名前 (例:CuKa1) または波長 (nm)。デフォルト値:CuKa1。h,k,l: ミラー指数の値。型:int。デフォルト値:5, 1, 3。
モード
inf(Crystal Structure Information): 指定されたCIFファイルの結晶構造情報を表示します。python Fhkl.py inf CIF_file
例:
python Fhkl.py inf test.cif
引数の説明:
CIF_file: 入力CIFファイル名。デフォルト値:test.cif。
c. 設定
スクリプト内のグローバル変数を直接編集することで、デフォルトの動作を変更できます。
# mode: 'asf', 'anom', 'F', 'inf'
mode = 'asf'
# X-ray
target_atom = 'Ni'
xray_source = 'CuKa1'
wavelength = {
'MoKa1': 0.070926 # nm
, 'MoKa2': 0.071354
, 'MoKa' : 0.071069
, 'CuKa1': 0.15405
, 'CuKa2': 0.15443
, 'CuKa' : 0.15418
, 'CuKb1': 0.13810
, 'CuKb2': 0.13922
, 'CuKb' : 0.13847
}
# CIF file configuration
ciffile = 'test.cif'
single = 1
findvalidstructure = 1
# scattering vector (s = sin Q / lambda) plot range
smin = 0.0
smax = 20.0
ns = 31
# s value to plot asf(s)
s_value = 0.1
# Wavelength plot range for anomolous scattering factor
WLmin = None
WLmax = None
# wavelength to calculate atomic form factor and anomolous scattering factor
wl_value = None
# Miller index to calculate Fhkl
hkl = [5, 1, 3]
# graph configuration
figuresize = (8, 4)
scale = 'linear'
5. プログラム構造
スクリプトの実行は、if __name__ == "__main__": ブロック内の main() 関数から開始されます。
main() 関数はまず updatevars() を呼び出し、コマンドライン引数を解析してグローバル変数を更新します。
その後、グローバル変数 mode の値に応じて、以下のいずれかの関数が実行されます。
mode == 'asf':asf()を呼び出し、原子散乱因子を計算・プロットします。mode == 'anom':anom()を呼び出し、異常散乱因子を計算・プロットします。mode == 'F':exec_Fhkl()を呼び出し、結晶構造因子を計算・表示します。mode == 'inf':inf()を呼び出し、結晶構造情報を表示します。
各モードの処理関数は、tklib の結晶構造関連クラス (tkCIF, tkCrystal, tkAtomType) を利用して、必要な計算やデータ取得を行います。
グラフのプロットには matplotlib.pyplot が使用されます。
6. グローバル変数
スクリプト内で定義されている主要なグローバル変数を以下に示します。
debug: デバッグレベル。デフォルト値は0。mode: 実行モードを制御する文字列。取りうる値は'asf','anom','F','inf'。デフォルト値は'asf'。target_atom: 原子散乱因子および異常散乱因子計算の対象となる原子の記号。デフォルト値は'Ni'。xray_source: X線源の名前 (例:'CuKa1') または波長 (nm)。デフォルト値は'CuKa1'。wavelength: 既知のX線源名に対応する波長 (nm) を格納する辞書。ciffile: 結晶構造因子計算や情報表示に使用するCIFファイル名。デフォルト値は'test.cif'。single: CIFファイル処理における単一構造の扱いに関するフラグ (具体的な動作はコードからは確認できません)。デフォルト値は1。findvalidstructure: CIFファイルから有効な構造を見つけるためのフラグ。デフォルト値は1。smin: 原子散乱因子プロットにおける散乱ベクトルs = sin(\Theta) / \lambdaの最小値 (nm^-1)。型:float。デフォルト値は0.0。smax: 原子散乱因子プロットにおける散乱ベクトルs = sin(\Theta) / \lambdaの最大値 (nm^-1)。型:float。デフォルト値は20.0。ns: 原子散乱因子プロットにおける散乱ベクトルの計算点数。型:int。デフォルト値は31。s_value: 原子散乱因子プロットでマークされる特定の散乱ベクトルsの値 (nm^-1)。型:float。デフォルト値は0.1。WLmin: 異常散乱因子スペクトルプロットにおける波長範囲の最小値 (nm)。型:floatまたはNone。デフォルト値はNone。WLmax: 異常散乱因子スペクトルプロットにおける波長範囲の最大値 (nm)。型:floatまたはNone。デフォルト値はNone。wl_value: 異常散乱因子プロットでマークされる特定の波長値 (nm)。型:floatまたはNone。デフォルト値はNone。hkl: 結晶構造因子計算の対象となるミラー指数[h, k, l]。型:list[int]。デフォルト値は[5, 1, 3]。figuresize: グラフの図のサイズ (幅, 高さ) を指定するタプル (インチ)。型:tuple[int, int]。デフォルト値は(8, 4)。scale: グラフのY軸スケール ('linear'または'log')。デフォルト値は'linear'。
7. 関数
本スクリプトで定義されている主要な関数を以下に示します。
usage()
スクリプトの利用方法とコマンドライン引数の例を標準出力に表示します。
各モード (asf, anom, F, inf) の使用例と、それに続く引数のフォーマットが出力されます。
updatevars()
コマンドライン引数に基づいてグローバル変数を更新します。
sys.argv から引数を解析し、mode, ciffile, target_atom, xray_source, smin, smax, ns, s_value, WLmin, WLmax, wl_value, hkl, scale などのグローバル変数の値を上書きします。
無効なモードが指定された場合はエラーメッセージを表示し、スクリプトを終了します。
cal_Fhkl()
指定された結晶構造とX線源に基づいて、ミラー指数範囲内の結晶構造因子を計算します。
:param cry: 結晶構造情報を持つ :py:class:tkCrystal オブジェクト。
:param xray_source: X線源の名前(例: 'CuKa1')または波長(nm)。 :py:class:str | :py:class:float
:returns: 各ミラー指数に対する回折情報と結晶構造因子を含む辞書のリスト。各辞書は 'hkl' (tuple), 'dhkl' (float), 'Q2' (float), 'Fhkl' (complex) のキーを持ちます。
hmin から hmax、kmin から kmax、lmin から lmax の範囲 (それぞれ -4 から 4) で全てのミラー指数について、回折角、散乱ベクトル、2θ角、原子散乱因子、そして結晶構造因子 Fhkl を計算します。計算結果は2θ角でソートされて返されます。
cal_Fhkl_single()
指定されたミラー指数とX線源について、結晶構造因子を計算しプロットします。
:param cry: 結晶構造情報を持つ :py:class:tkCrystal オブジェクト。
:param hkl: 計算対象のミラー指数 [h, k, l]。 :py:class:list\ [:py:class:int]
:param xray_source: X線源の名前(例: 'CuKa1')または波長(nm)。 :py:class:str | :py:class:float
:returns: None
特定のミラー指数 hkl に対して回折角、散乱ベクトル、2θ角、そして結晶構造因子 Fhkl を計算します。
また、指定された散乱ベクトル範囲で各原子種の原子散乱因子を計算し、グラフとして表示します。
計算された Fhkl の値も標準出力に出力されます。グラフ表示後、ユーザーの入力を待ちます。
exec_Fhkl()
CIFファイルから結晶構造を読み込み、指定されたミラー指数に対する結晶構造因子を計算し表示します。
グローバル変数 ciffile, xray_source, hkl を使用して、CIFファイルを解析し、結晶構造情報を取得します。
その後、cal_Fhkl_single() 関数を呼び出して結晶構造因子を計算し、結果を標準出力に表示し、原子散乱因子のグラフをプロットします。
anom()
指定された原子の異常散乱因子スペクトルを計算し、グラフとして表示します。
グローバル変数 target_atom, WLmin, WLmax, wl_value, scale を使用します。
tkAtomType オブジェクトから異常散乱因子のデータを読み込み、指定された波長範囲でスペクトルをプロットします。
特定の波長 wl_value における異常散乱因子の値も表示します。
グラフ表示後、ユーザーの入力を待ちます。
asf()
指定された原子の原子散乱因子 (Atomic Scattering Factor, ASF) を計算し、グラフとして表示します。
グローバル変数 target_atom, xray_source, smin, smax, ns, s_value, scale を使用します。
tkAtomType オブジェクトから原子散乱因子のデータを読み込み、指定された散乱ベクトル s の範囲で ASF を計算し、プロットします。
特定の s_value における ASF の値も表示します。
グラフ表示後、ユーザーの入力を待ちます。
inf()
指定されたCIFファイルから結晶構造情報を読み込み、その詳細を標準出力に表示します。
グローバル変数 ciffile, single, findvalidstructure を使用します。
CIFファイルを読み込み、tkCIF オブジェクトと tkCrystal オブジェクトが提供する Print() および PrintInf() メソッドを呼び出して、読み込まれた結晶構造に関する詳細情報(格子パラメータ、原子の種類、原子サイトなど)を出力します。
main()
スクリプトのメインエントリポイントです。コマンドライン引数に基づいて処理モードを選択し実行します。
updatevars() を呼び出してコマンドライン引数を解析し、グローバル変数 mode に応じて asf(), anom(), exec_Fhkl(), inf() のいずれかの関数を実行します。
無効なモードが指定された場合はエラーメッセージを表示し、終了します。
8. 入出力
a. 入力ファイル
CIFファイル: 結晶構造情報を含むファイルです。デフォルトでは
test.cifが使用されます。コマンドライン引数で別のファイルを指定することも可能です。原子散乱因子データベース:
tklib.tkcrystal.tkatomtypeが利用する原子散乱因子のデータファイル(例えば、AtomType.ReadASFParameters()やAtomType.ReadAnomalousScatteringFactor()で読み込まれるデータ)。コードからは具体的なファイル名やフォーマットは確認できませんが、tkatomtypeオブジェクトが内部的にデータを管理していると推測されます。
b. 出力
標準出力:
スクリプトの実行状況、コマンドライン引数の解析結果、およびグローバル変数の設定値が表示されます。
計算された原子散乱因子 (
ASF) の値、異常散乱因子の値、結晶構造因子の値など、計算結果の詳細な数値データが出力されます。CIFファイルから読み込まれた結晶構造に関する情報(格子パラメータ、原子の種類、原子サイトの座標など)が表示されます。
グラフ:
matplotlib.pyplotを使用して、以下のグラフが生成され、画面に表示されます。原子散乱因子 (
ASF) のプロット: 散乱ベクトルs = sin(\Theta) / \lambdaに対する原子散乱因子f(s)の実数部。異常散乱因子スペクトルのプロット: 波長に対する異常散乱因子の実数部
f'と虚数部f''。 グラフは表示後、ユーザーがENTERキーを押すまで開いたままになります。
9. 非標準ライブラリ
本スクリプトは以下の非標準ライブラリに依存しています。
tklib:tklib.tkfile: ファイル操作ユーティリティを提供すると推測されますが、本スクリプトでは直接使用されていません。tklib.tkutils: ユーティリティ関数 (IsDir(),IsFile(),terminate(),pint(),pfloat(),getarg(),getintarg(),getfloatarg()) を提供します。tklib.tkcrystal.tkcif: CIF (Crystallographic Information File) ファイルの読み込みと解析を行うクラス (tkCIF) を提供します。tklib.tkcrystal.tkcrystal: 結晶構造情報を取り扱うクラス (tkCrystal) を提供します。結晶構造因子Fhkl()の計算や回折角DiffractionAngle()の計算機能を含みます。tklib.tkcrystal.tkatomtype: 原子に関する情報(原子番号、原子質量、電荷、原子散乱因子など)を取り扱うクラス (tkAtomType) を提供します。
numpy: 数値計算を効率的に行うためのライブラリです。本スクリプトでは配列操作や数学関数 (exp,log,sin,cos,tan,arcsin,arccos,arctan,pi) に使用されています。scipy: 科学技術計算ライブラリです。本スクリプトではscipy.interpolate.interp1dがインポートされていますが、コード中では直接使用されている箇所は確認できません。matplotlib: グラフ描画ライブラリです。本スクリプトではmatplotlib.pyplot(plt) を用いて、原子散乱因子と異常散乱因子のグラフをプロットしています。
10. ライセンス
本スクリプトのライセンス情報はコードからは確認できません。
11. 著者
本スクリプトの著者情報はコードからは確認できません。