サイトアイコン sciencompass

PythonでX線回折波形のシミュレーション(2)

PythonでX線回折波形を解析するためのパッケージ、xrayutilitiesを紹介します。
前回の記事では、X線回折波形の解析の準備として、結晶構造を定義する方法について紹介しました。
今回は定義した結晶構造に対して、構造因子や回折点、回折波形の計算方法について説明します。

前回の記事

Pythonでは科学計算ライブラリが充実していることはみなさんご存じのことだと思います。その豊富なライブラリを活用して様々な数値計算にPythonが使われています。今回は、ちょっとマイナーなX線回折波形をシミュレーションするためのパッケージを見つけたので、その内容と使い方をご紹介します。(半分は自分用のメモです。)X線回折計算用のパッケージ:xrayutilitiesX線回折の解析用に作られたプログラムで、回折点や回折波形、逆格子マップなどの計算をすることができます。実験データの波形にフィッティングするための関数も用意...
PythonでX線回折波形のシミュレーション(1) - sciencompass

構造因子の計算

X線回折を解析するために、避けては通れないのが構造因子の計算です。構造因子は次の数式であらわされます。

Python初心者の私にはこの数式の計算を自分で実装することはできないので、xrayutilitiesで用意されている関数を使って計算してみましょう。

例えば、GaNの(001), (002), (004)の構造因子を計算するプログラムは次の通りです。
※GaNWZは自分で定義した結晶構造で、詳細は前回の記事を参考にしてください。

# defining material and experimental setup
en= 8048 # eV (CuKa)
# calculate the structure factor for GaN (001) (002) (004)
hkllist = [[0, 0, 1], [0, 0, 2], [0, 0, 4]]
for hkl in hkllist:
qvec = GaNWZ.Q(hkl)
F = GaNWZ.StructureFactor(qvec, en)
print(" |F| = %8.3f" % numpy.abs(F))

計算結果は、0, 49.113, 29.869となります。こんな簡単に計算できるなんて、、、

逆格子回折点の計算

逆格子マップを測定するときにどの逆格子点が測定可能か、事前に調べることで効率的に実験を進めることができます。
(逆格子マップ測定にかかる時間の長さに頭を抱えた人は多いはず)
けれど、逆格子点の計算は少々面倒。。。
そんな葛藤を吹き飛ばしてくれるのがxrayutilities!
逆格子点の計算も簡単に行うことができる(すごく便利!)
例えば、GaN, AlNの逆格子点を計算してみよう。

mat1 = GaNWZ
mat2 = AlNWZ
hxrd1 = xu.HXRD(mat1.Q(1, 0, 0), mat1.Q(0, 0, 1))
ax, h1 = xu.materials.show_reciprocal_space_plane(mat1, hxrd1, ttmax=180)
hxrd2 = xu.HXRD(mat2.Q(1, 0, 0), mat2.Q(0, 0, 1))
ax, h2 = xu.materials.show_reciprocal_space_plane(mat2, hxrd2, ax=ax)

たったこれだけで、下図のような逆格子点が描画できる。

2Θ-ωスキャンの波形を計算

積層構造の回折波形を計算することもできます。
※一つ注意事項としては、Dynamical Diffraction Modelでないと、薄層は計算できないようです。

# global parameters
wavelength = xu.wavelength('CuKa1')
offset = 0 # angular offset of the zero position of the data
#X線の波長と測定時のオフセットの設定
# set up LayerStack for simulation:GaN/AlGaN(~20nm)
lGaN = xu.simpack.Layer(GaN, inf)
lAlGaN = xu.simpack.Layer(AlGaN, 150, relaxation=1)
pstack = xu.simpack.PseudomorphicStack001('list', lGaN, lAlGaN)

まずは、積層構造を上記のように定義する。
後述の通り、回折波形を計算する際に測定面を指定する(hkl)。

twotheta=np.linspace(32,38,200)
md = xu.simpack.DynamicalModel(pstack, energy=en, resolution_width=0.0001)
Idyn = md.simulate(twotheta/2, hkl=(0, 0, 2))

plt.plot(twotheta/2,Idyn)
plt.yscale('log')
plt.show()

これでX線回折波形の計算ができるので、あとは実験データに対して、フィッティングする関数を作成すれば、実験データの解析を行うことができる。

ライブラリのインポート

上記のプログラムを実行するにあたって、最初に読み込むべきライブラリは次の通りです。

import matplotlib.pyplot as plt
import xrayutilities as xu
import numpy
from matplotlib.pylab import *

場合によっては使わないものもあるかもしれませんが、上記のプログラムを試される際にはこの通りに最初に宣言しておけば、問題ありません。

モバイルバージョンを終了