xrd_pymatgen.py 技術ドキュメント
プログラムの動作
xrd_pymatgen.py は、結晶構造情報ファイル(CIF)を読み込み、指定されたX線源と2θ(二乗回折角)範囲に基づいて粉末X線回折(PXRD)パターンをシミュレーションし、その結果を視覚化およびデータ出力するPythonプログラムです。
このプログラムの主な機能は以下の通りです。
CIFファイルから結晶構造データをパースします。
Pymatgenライブラリの
XRDCalculatorを使用して、理論的なX線回折ピーク位置と強度を計算します。計算されたピークにガウス関数を適用してブロードニングをシミュレーションし、連続的な回折パターンを生成します。
計算結果をグラフとして表示し、インタラクティブな操作(ピーク情報の表示など)を可能にします。
計算された2θと強度データをExcelファイル(.xlsx)として出力します。
実行ログをテキストファイルとして出力します。
本プログラムは、実験で得られたXRDパターンと比較するための理論パターンを迅速に生成することで、未知の結晶構造の同定や結晶性材料の特性評価を支援することを目的としています。
原理
本プログラムは、Pymatgenライブラリが提供するX線回折計算機能と、ガウス関数を用いたピークブロードニングのシミュレーションに基づいています。
X線回折の基本原理: X線回折はブラッグの法則(Bragg's Law)に従います。結晶の格子面の間隔 \(d\) と入射X線の波長 \(\lambda\) 、そしてX線と格子面のなす角 \(\theta\) の間に以下の関係が成り立ちます。
\[n\lambda = 2d\sin\theta\]ここで \(n\) は回折次数です。X線回折ピークは、この条件が満たされたときに観測されます。
pymatgen.analysis.diffraction.xrd.XRDCalculatorは、結晶構造とX線源の波長から、各結晶面(\(hkl\) 面)に対応する回折角 \(2\theta\) とその強度を計算します。強度は原子散乱因子、構造因子、ローレンツ因子、偏光因子、多重度などを考慮して決定されます。ピークブロードニングのシミュレーション: 理論的に計算される回折ピークはデルタ関数的な線として現れますが、実際のX線回折パターンでは、結晶子のサイズ、ひずみ、装置の分解能などの影響によりピークがブロードニングします。本プログラムでは、このブロードニングをガウス関数で近似してシミュレーションします。
プログラム内で使用されるガウス関数
Gaussian(x, x0, whalf)は以下の形式で定義されています。\[f(x) = \exp\left(-\left(\frac{x - x_0}{a}\right)^2\right)\]ここで \(x_0\) はピーク中心、\(a\) はピークの幅を決定するパラメータです。プログラムコードでは、\(a\) は入力された半値幅
whalfとの関係で以下のように計算されます。\[a = \frac{\text{whalf}}{\sqrt{\ln 2}}\]このガウス関数の半値幅(FWHM, Full Width at Half Maximum) \(w_{FWHM}\) は、一般的に \(w_{FWHM} = 2a\sqrt{\ln 2}\) の関係があります。上記の \(a\) の定義を代入すると、
\[w_{FWHM} = 2 \left(\frac{\text{whalf}}{\sqrt{\ln 2}}\right) \sqrt{\ln 2} = 2 \cdot \text{whalf}\]となります。したがって、プログラムのコマンドライン引数
fwhmで指定される値はGaussian関数のwhalf引数に渡されますが、実際にシミュレートされる回折ピークの半値幅は、指定されたfwhmの 2倍 になります。
必要な非標準ライブラリとインストール方法
このプログラムの実行には、以下の非標準Pythonライブラリが必要です。
numpy: 数値計算のためのライブラリ。scipy: 科学技術計算のためのライブラリ(特にscipy.specialが使用されますが、直接的な関数呼び出しは見られません。numpyと合わせて科学計算の基盤となります)。matplotlib: グラフ描画のためのライブラリ。pymatgen: 材料科学計算のための強力なライブラリ。結晶構造の読み込み、XRD計算などに使用されます。openpyxl: Excelファイルの読み書きに使用されます(tkVariousData().to_excelの内部で利用される可能性があります)。
これらのライブラリは pip コマンドでインストールできます。
pip install numpy scipy matplotlib pymatgen openpyxl
また、このプログラムは tklib というカスタムライブラリに依存しています。このライブラリはPyPIには公開されておらず、別途入手または提供される必要があります。tklib には tkApplication、tkutils、tkVariousData、tkPlotEvent などが含まれており、ファイルパスの処理、コマンドライン引数のパース、Excel出力、グラフイベント処理などに利用されています。本ドキュメントでは、tklib が利用可能であることを前提とします。
必要な入力ファイル
プログラムは以下の入力ファイルを必要とします。
CIF (Crystallographic Information File)
形式: 結晶構造を記述するための標準的なテキストファイル形式です。
内容: 単位格子のパラメータ、原子の種類と位置、空間群などの結晶学的情報を含みます。
ファイル名: コマンドライン引数で指定しない場合、デフォルトで
SrTiO3.cifが使用されます。任意のCIFファイルを指定できます。
CIFファイルの例 (
SrTiO3.cifの一部抜粋を想定):#_chemical_name_common Strontium Titanate #_chemical_formula_sum 'SrTiO3' #_symmetry_space_group_name_H-M 'P m -3 m' #_cell_length_a 3.905 #_cell_length_b 3.905 #_cell_length_c 3.905 #_cell_angle_alpha 90 #_cell_angle_beta 90 #_cell_angle_gamma 90 # #loop_ # _atom_site_label # _atom_site_type_symbol # _atom_site_fract_x # _atom_site_fract_y # _atom_site_fract_z # Sr1 Sr 0.0000 0.0000 0.0000 # Ti1 Ti 0.5000 0.5000 0.5000 # O1 O 0.5000 0.5000 0.0000 # O2 O 0.5000 0.0000 0.5000 # O3 O 0.0000 0.5000 0.5000
生成される出力ファイル
プログラムは以下の出力ファイルを生成します。
ログファイル
ファイル名: 入力CIFファイルの名前を基に自動生成されます。例:
SrTiO3-out.txt({dirname}/{filebody}-out.txtのテンプレートに従います)内容: プログラムの実行中に標準出力に表示される情報(入力パラメータ、計算された回折ピークの一覧、処理状況など)が記録されます。
Excelファイル(XRDスペクトルデータ)
ファイル名: 入力CIFファイルの名前を基に自動生成されます。例:
SrTiO3-pxrd.xlsx({dirname}/{filebody}-pxrd.xlsxのテンプレートに従います)内容: 2θの各点におけるXRDシミュレーションの強度データがシートに出力されます。最初の列が
2Theta (degree)、次の列がIntensityとなります。
グラフウィンドウ
プログラム実行後、シミュレートされたXRDパターンがMatplotlibによって生成されたインタラクティブなウィンドウに表示されます。
このグラフには、連続的なXRDスペクトル(黒線)と、個々の理論的な回折ピーク位置と強度(赤丸)がプロットされます。
tklib.tkgraphic.tkPlotEventを使用しているため、グラフ上でクリックすると、最も近い理論ピークの詳細情報(\(hkl\)、\(d_{hkl}\)、2\(\theta\)、強度、多重度)がコンソールに出力されます。このウィンドウは、手動で画像を保存するオプションを提供します(Matplotlibの標準機能)。プログラム内には直接的なファイル保存コマンドは含まれていません。
コマンドラインでの使用例 (Usage)
xrd_pymatgen.py は、以下の書式でコマンドラインから実行できます。引数を指定しない場合、デフォルト値が使用されます。
python xrd_pymatgen.py [infile] [Xray_source] [Q2min] [Q2max] [Q2step] [fwhm]
引数:
infile(str, 必須):CIF形式の入力ファイルパス。
デフォルト値:
'SrTiO3.cif'
Xray_source(str, 任意):X線源の種類。PymatgenがサポートするX線源の名称(例:
'CuKa1','MoKa','CrKa'など)を指定します。具体的な波長を指定することも可能です(例:'1.54056')。デフォルト値:
'CuKa1'
Q2min(float, 任意):XRDパターンをシミュレーションする2θ範囲の最小値(度)。
デフォルト値:
10.0
Q2max(float, 任意):XRDパターンをシミュレーションする2θ範囲の最大値(度)。
デフォルト値:
80.0
Q2step(float, 任意):XRDパターンを計算する2θのステップ幅(度)。この値が小さいほど、より滑らかなスペクトルが得られますが、計算時間と出力ファイルサイズが増加します。
デフォルト値:
0.02
fwhm(float, 任意):ガウス関数によるピークブロードニングの半値幅(FWHM)の指定値(度)。注意: 前述の「原理」セクションで説明した通り、実際に適用されるピークの半値幅は、この引数で指定された値の2倍になります。
デフォルト値:
0.05
コマンドラインでの具体的な使用例
1. デフォルト設定での実行
SrTiO3.cif が現在のディレクトリに存在することを前提とします。
python xrd_pymatgen.py
実行結果の説明:
SrTiO3-out.txtというログファイルが生成され、標準出力の内容がそこに記録されます。SrTiO3-pxrd.xlsxというExcelファイルが生成され、2θと強度データが保存されます。SrTiO3.cifのXRDパターン(X線源: CuKa1、2θ範囲: 10.0 - 80.0度、FWHMの指定値: 0.05度)が表示されたMatplotlibグラフウィンドウが開きます。
2. X線源を MoKa1 に変更し、特定の2θ範囲で実行
python xrd_pymatgen.py SrTiO3.cif MoKa1 5.0 50.0 0.01 0.1
実行結果の説明:
SrTiO3-out.txtおよびSrTiO3-pxrd.xlsxが生成(または上書き)されます。X線源がモリブデン (MoKa1, 波長約0.70930 Å) に、2θ範囲が5.0度から50.0度まで、ステップ幅が0.01度、FWHMの指定値が0.1度に変更されたXRDパターンが表示されます。これにより、デフォルトのCuKa1に比べてピークが低角度側にシフトし、指定されたFWHMに基づいてピークがブロードニングされたスペクトルが得られます。
3. CIFファイル名を変更し、より広いFWHMで実行
example.cif というファイルが存在し、回折範囲を広げ、FWHMを大きくしたい場合。
python xrd_pymatgen.py example.cif CuKa1 5.0 90.0 0.02 0.2
実行結果の説明:
example-out.txtとexample-pxrd.xlsxが生成されます。example.cifの構造に基づくXRDパターンが、X線源CuKa1、2θ範囲5.0度から90.0度、FWHMの指定値0.2度(実際の半値幅は0.4度)でシミュレート・表示されます。FWHMが大きいため、ピークはより広くなると予想されます。