技術ドキュメント: atominf_xrayutilities.py

プログラムの動作

atominf_xrayutilities.py は、多層薄膜構造のX線反射率(XRR)シミュレーションを行うためのPythonプログラムです。主に以下の機能を提供します。

  • 多層薄膜構造の定義: 化学組成、密度、厚さ、表面粗さを指定して、基板と複数の薄膜層からなるサンプル構造を定義します。組成は化学式文字列で指定するほか、CIFファイルパスで指定することも可能です。

  • 分子量計算: 定義された各層の化学組成に基づいて分子量を計算し、標準出力に表示します。CIFファイルが指定された場合は、そこから化学式と密度を抽出し、分子量も計算します。

  • XRRシミュレーション: 定義された多層構造に対し、X線源(デフォルトではCu Kα1)を用いたスペキュラー反射率(Specular Reflectivity)をシミュレーションします。

  • 結果の可視化: シミュレーション結果である反射率曲線を\(2\theta\)(2シータ)の関数としてプロットし、グラフィカルユーザーインターフェース(GUI)ウィンドウに表示します。

このプログラムは、実験データの解析や、特定の薄膜構造設計におけるXRR応答の予測に役立ちます。

原理

このプログラムは、X線反射率(XRR)の基本的な物理原理に基づいています。XRRは、物質表面や界面の密度、厚さ、粗さを非破壊で評価する手法です。

XRRシミュレーションの主要な原理は以下の通りです。

  1. 屈折率: X線が物質に入射する際、物質の電子密度によってわずかに屈折します。この現象は複素屈折率 \(n = 1 - \delta - i\beta\) で記述されます。ここで \(\delta\) は分散項、\(\beta\) は吸収項を表します。これらの値は、物質の原子組成、密度、入射X線エネルギーに依存します。 $\(\delta = \frac{r_e \lambda^2}{2\pi} \sum_j n_j f_j^0\)\( \)\(\beta = \frac{r_e \lambda^2}{2\pi} \sum_j n_j \mu_j\)\( ここで \)r_e\( は古典電子半径、\)\lambda\( はX線波長、\)n_j\( は単位体積あたりの原子種 \)j\( の数、\)f_j^0\( は原子散乱因子、\) \mu_j $ は原子吸収係数です。

  2. フレネル反射: X線が異なる屈折率を持つ2つの層の界面に入射すると、一部は反射し、一部は透過します。この反射の振幅はフレネル反射係数で与えられます。反射は入射角が非常に小さい(グラージング角)場合に強くなります。

  3. 多層構造: 複数の層からなる薄膜構造の場合、各界面での反射と透過が繰り返され、これらが干渉し合います。この干渉効果によって、XRR曲線には振動(キージングフリンジ)が現れます。層の厚さ、密度、粗さがこの振動の周期と強度に影響を与えます。xrayutilities ライブラリは、Parrattの再帰法などのアルゴリズムを用いて、多層構造全体の反射率を効率的に計算します。

  4. 界面粗さ: 理想的な平坦な界面ではなく、実際の界面には粗さ(ラフネス)が存在します。粗さは反射強度を減少させ、特に高角度側で顕著になります。これは通常、デバイ・ウォラー因子やエラスコ因子などの項をフレネル反射係数に導入することでモデル化されます。 $\( R_{rough} = R_{ideal} \cdot \exp\left( -4 k_z k_z' \sigma^2 \right) \)\( ここで \)k_z\( は入射波の垂直成分、\)k_z'\( は反射波の垂直成分、\)\sigma$ はRMS粗さです。

  5. 分子量計算: pymatgen ライブラリは、入力された化学式または結晶構造ファイル(CIF)から、各原子の原子量を基に分子量を計算します。

本プログラムでは、xrayutilities.simpack.SpecularReflectivityModel がこれらの原理に基づき、指定された多層構造とX線エネルギーに対して反射率を計算します。

必要な非標準ライブラリとインストール方法

本プログラムの実行には、以下の非標準Pythonライブラリが必要です。

  • xrayutilities: X線回折および反射率シミュレーションの中核ライブラリ。

  • pymatgen: 結晶構造、組成、および関連する物性計算のためのライブラリ。

  • matplotlib: データのプロットと可視化に使用されます。

  • numpy: 数値計算を効率的に行うための基本ライブラリ。

これらのライブラリは、以下のコマンドを使用してインストールできます。

pip install xrayutilities pymatgen matplotlib numpy

必要な入力ファイル

本プログラムは、デフォルトでは外部入力ファイルを直接読み込む設計にはなっていません。しかし、layer_stackcomposition キーの値として .cif 拡張子を持つファイルパスを指定することで、結晶構造情報を読み込むことができます。

1. コード内の設定: プログラムの実行には、ソースコード内の main() 関数で定義されている layer_stack および substrate 変数の設定が必須です。これらの変数は辞書のリスト(layer_stack)および辞書(substrate)として、各層および基板の以下の情報を持ちます。

  • composition (str): 化学組成式 (例: "TiO2", "Si") またはCIFファイルへのパス (例: "sample.cif")。

  • density_gcm3 (float): 密度(g/cm³)。composition がCIFファイルの場合、この値が0.0以下であればCIFファイルから密度が自動的に読み込まれます。

  • thickness_nm (float): 層の厚さ(nm)。基板には適用されず、"inf"(無限大)として扱われます。

  • roughness_A (float): 界面のRMS粗さ(Å)。

2. CIFファイル(オプション): composition にCIFファイルパスが指定された場合、プログラムはそのファイルを読み込み、結晶構造情報(化学式、密度)を抽出します。CIFファイルは、Crystallographic Information File 形式に準拠している必要があります。

例:sample.cif の内容(抜粋)

# ... (CIF形式のデータ) ...
_chemical_formula_sum          'Ti2 O4'
_cell_length_a                 13.626
_cell_length_b                 13.626
_cell_length_c                 11.838
_cell_angle_alpha              90.00
_cell_angle_beta               90.00
_cell_angle_gamma              90.00
_cell_volume                   2192.1
_cell_formula_units_Z          8
# ...

pymatgen ライブラリは、このファイルから _chemical_formula_sum や格子定数(セル長、セル角度、セル体積)および単位胞あたりの化学式単位数 _cell_formula_units_Z を用いて、化学式と密度を導出します。

生成される出力ファイル

atominf_xrayutilities.py は、現在のバージョンではディスクにファイルを生成して保存する機能は持っていません。

プログラムの実行結果として、以下の情報が標準出力(コンソール)とグラフィカルユーザーインターフェース(GUI)ウィンドウに表示されます。

  1. 標準出力:

    • 各層およびCIFファイルから読み込まれた組成の化学式と分子量(g/mol)が表示されます。

    各層の化学組成と分子量:
      TiO2: 79.866 g/mol
      Al2O3: 101.961 g/mol
      SiO2: 60.084 g/mol
    
  2. グラフィカル出力:

    • シミュレートされたXRR曲線が matplotlib を用いて描画され、GUIウィンドウとして表示されます。

    • 横軸は \(2\theta\) (deg)、縦軸は反射率(対数スケール)です。

    • ウィンドウのタイトルは "Multilayer XRR Simulation" です。

    • このプロットは、ユーザーが手動で保存オプションを選択しない限り、一時的な表示に留まります。

コマンドラインでの使用例 (Usage)

atominf_xrayutilities.py はコマンドライン引数を取らないため、Pythonインタープリタを使用して直接実行します。

プログラムを動作させるには、まずソースコード内の main() 関数に記述されている layer_stacksubstrate の設定を、シミュレーションしたい多層構造に合わせて編集する必要があります。

python atominf_xrayutilities.py

コマンドラインでの具体的な使用例

例1: デフォルト設定の実行

プログラムをデフォルト設定のまま実行します。

1. プログラムコード(抜粋):

layer_stack = [
    {"composition": "TiO2",  "density_gcm3": 4.23, "thickness_nm": 50.0,  "roughness_A": 0.5},
    {"composition": "Al2O3", "density_gcm3": 3.95, "thickness_nm": 30.0,  "roughness_A": 0.5},
    {"composition": "SiO2",  "density_gcm3": 2.20, "thickness_nm": 100.0, "roughness_A": 0.5},
]
substrate = {"composition": "Si", "density_gcm3": 2.33, "roughness_A": 0.5}

2. 実行コマンド:

python atominf_xrayutilities.py

3. 実行結果: 標準出力には、各層の分子量が表示されます。

各層の化学組成と分子量:
  TiO2: 79.866 g/mol
  Al2O3: 101.961 g/mol
  SiO2: 60.084 g/mol

同時に、以下のようなXRRシミュレーション結果を示すグラフウィンドウが表示されます。

(グラフウィンドウの簡単な説明)

  • タイトル: "Multilayer XRR Simulation"

  • 横軸: \(2\theta\) (deg)

  • 縦軸: Reflectivity (対数スケール)

  • 3層(TiO2/Al2O3/SiO2)がSi基板上にある構造の反射率曲線が示されます。

例2: CIFファイルを使用した層の定義

layer_stack 内でCIFファイルを指定して、その結晶構造情報から層の組成と密度を取得する例です。

1. 準備: sample.cif という名前のCIFファイルを用意し、プログラムと同じディレクトリに配置します。 (例: sample.cif がTiO2の構造情報を含み、密度計算可能なデータを持つと仮定)

2. プログラムコードの変更(抜粋): main() 関数内の layer_stack を以下のように変更します。元の TiO2 の行をコメントアウトし、sample.cif を使用する行のコメントアウトを解除します。

layer_stack = [
    # {"composition": "TiO2",  "density_gcm3": 4.23, "thickness_nm": 50.0,  "roughness_A": 0.5},
    {"composition": "sample.cif", "density_gcm3": 0.0, "thickness_nm": 10.0, "roughness_A": 0.5},
    {"composition": "Al2O3", "density_gcm3": 3.95, "thickness_nm": 30.0,  "roughness_A": 0.5},
    {"composition": "SiO2",  "density_gcm3": 2.20, "thickness_nm": 100.0, "roughness_A": 0.5},
]
substrate = {"composition": "Si", "density_gcm3": 2.33, "roughness_A": 0.5}

この例では density_gcm30.0 に設定しているため、sample.cif から密度が自動的に読み込まれて使用されます。

3. 実行コマンド:

python atominf_xrayutilities.py

4. 実行結果: 標準出力には、sample.cif から読み込まれた化学式と分子量が表示されます。

各層の化学組成と分子量:
  sample.cif (TiO2): 79.866 g/mol  # sample.cifの内容により(TiO2)の部分は変化します
  Al2O3: 101.961 g/mol
  SiO2: 60.084 g/mol

XRRシミュレーション結果を示すグラフウィンドウは、sample.cif で定義された層を反映した曲線に更新されて表示されます。