fit_vbo_xps.py 技術ドキュメント
プログラムの動作
fit_vbo_xps.py は、XPS (X-ray Photoelectron Spectroscopy) の価電子帯スペクトルを解析するためのPythonスクリプトです。主な目的は、フィルムと基板が混在するサンプルの価電子帯スペクトルを、純粋なフィルムおよび純粋な基板の参照スペクトルを用いてフィッティングすることです。これにより、各成分の寄与度、およびそれぞれのエネルギーシフトを決定し、最終的に価電子帯オフセット (VBO: Valence Band Offset) を算出します。
このプログラムは以下の課題を解決します。
混合スペクトルの成分分離: フィルムと基板の混合スペクトルから、それぞれの成分の形状と強度を特定します。
エネルギーシフトの定量化: 測定された混合スペクトルと参照スペクトル間の結合エネルギー軸におけるずれ(エネルギーシフト)を独立して定量化します。
多項式バックグラウンドの除去: スペクトルに含まれるバックグラウンド成分を多項式でモデル化し、フィッティングから除去します。
価電子帯オフセットの算出: 参照スペクトルのVBM (Valence Band Maximum) 位置が既知の場合、フィッティングで得られたエネルギーシフトを用いてVBOを算出します。
原理
プログラムは、以下のモデル式に基づいて混合スペクトル \(I_{mix}(E)\) をフィッティングします。
各項の意味は以下の通りです。
\(I_{mix}(E)\): 測定された混合スペクトル。\(E\) は結合エネルギー。
\(I_{film}(E')\): 純粋なフィルムの参照スペクトル。
\(I_{sub}(E'')\): 純粋な基板の参照スペクトル。
\(A_f\): フィルム成分の振幅(強度)係数。
\(A_s\): 基板成分の振幅(強度)係数。
\(dE_f\): フィルム成分のエネルギーシフト。フィルム参照スペクトルが \(dE_f\) だけシフトされて混合スペクトルに寄与します。
\(dE_s\): 基板成分のエネルギーシフト。基板参照スペクトルが \(dE_s\) だけシフトされて混合スペクトルに寄与します。
\(\text{PolynomialBackground}(E)\): 多項式で表現されるバックグラウンド成分。次数はコマンドライン引数 (
--bg-order) で指定可能(0次、1次、2次)。
フィッティングは、scipy.optimize.minimize 関数の Nelder-Mead メソッドを使用して行われます。これは、勾配情報を使用しない直接探索法であり、この種のスペクトルフィッティング問題に対してしばしば安定した結果をもたらします。
損失関数 (--loss 引数で指定) は以下のいずれかを選択できます。
linear: \(L_2\) ノルム (最小二乗法) に対応し、残差の二乗平均を最小化します。soft_l1: ロバストなPseudo-Huber損失に似た損失関数で、外れ値の影響を軽減します。logcosh: \( \log(\cosh(x)) \) 関数に基づくロバストな損失関数で、soft_l1と同様に外れ値に強い特性を持ちます。
また、--loss-on-log オプションが有効な場合、線形残差ではなく、ログ強度比 ( \( \log(I_{fit}/I_{obs}) \) ) を最小化します。これは、強度が非常に低い領域での相対的な誤差を重視する場合に有用です。
パラメータの初期値はコマンドライン引数で与えられます。また、Nelder-Meadは非制約最適化手法であるため、--shift-limit や amp-min/amp-max で定義されるパラメータのソフトバウンドの外側に解が逸脱しないよう、目的関数にペナルティ項が追加されています。
フィッティングが完了すると、主要な出力として \(dE_f - dE_s\) の値が報告されます。
さらに、参照スペクトルのVBM位置 (\(VBM_{film,ref}\), \(VBM_{sub,ref}\)) が与えられた場合 (--vbm-film-ref, --vbm-sub-ref)、以下のようにVBOが計算されます。
この \(VBO_{BE}\) は結合エネルギー軸上でのVBM位置の差を示し、一般的にVBOと認識されます。スクリプトでは、結合エネルギー軸とエネルギー軸の符号規約の違いに注意を促すため、その負の値も出力されます。
データ処理のステップ:
スペクトルデータの読み込み: 指定されたパスからExcel (xlsx/xlsm) またはCSV/TXT/DATファイルとしてスペクトルデータを読み込みます。
データクリーンアップ: 無効な数値 (
NaN,inf) を除去し、X軸(結合エネルギー)でソートし、重複するX値はY値の平均を取って結合します。クロッピング: 参照スペクトルは
--ref-xminと--ref-xmaxで、混合スペクトルのフィッティング範囲は--fit-xminと--fit-xmaxで指定された範囲にクロッピングされます。補間関数の作成: フィルムおよび基板の参照スペクトルに対して、補間関数 (
scipy.interpolate.interp1d) を作成します。これにより、フィッティング中にシフトした参照スペクトルの強度を任意の結合エネルギー値で評価できます。範囲外の値は--outside-fillで指定された値で埋められます。
必要な非標準ライブラリとインストール方法
このプログラムの実行には以下の非標準ライブラリが必要です。
numpypandasmatplotlibscipyopenpyxl(Excelファイルを読み込むためにpandasが内部的に使用)
これらのライブラリは、以下の pip コマンドでまとめてインストールできます。
pip install numpy pandas matplotlib scipy openpyxl
必要な入力ファイル
fit_vbo_xps.py は、以下の3種類の入力スペクトルファイルを必要とします。
フィルム参照スペクトル (
--film): 純粋なフィルムのXPS価電子帯スペクトルデータ。基板参照スペクトル (
--substrate): 純粋な基板のXPS価電子帯スペクトルデータ。混合スペクトル (
--mix): フィルムと基板が混在するサンプルのXPS価電子帯スペクトルデータ。
ファイル形式:
Microsoft Excelファイル (
.xlsx,.xlsm)CSV、TXT、またはDATファイル (
.csv,.txt,.dat)
データ構造: 各ファイルは、結合エネルギー軸データ(X列)と強度データ(Y列)を含む必要があります。
X列: コマンドライン引数
--x-colで指定された0-basedインデックスの列 (デフォルト:0)Y列: コマンドライン引数
--y-colで指定された0-basedインデックスの列 (デフォルト:2)シート: Excelファイルの場合、
--sheet引数でシート名または0-basedインデックスを指定できます (デフォルト:0)。注意: コードはファイルの最初の空白行をスキップするように設計されています。
生成される出力ファイル
プログラムは、指定された --output-stem 引数 (デフォルト: xps_vbo) をプレフィックスとして、以下のファイルを生成します。
フィッティング結果CSVファイル (
[output_stem]_fit.csv):フィッティング範囲内の結合エネルギー (E)
観測された混合スペクトルの強度 (I_mix_obs)
フィッティングされた混合スペクトルの強度 (I_mix_fit)
フィッティングされたフィルム成分の強度 (I_film_part)
フィッティングされた基板成分の強度 (I_substrate_part)
フィッティングされたバックグラウンドの強度 (I_background)
残差 (residual = I_mix_fit - I_mix_obs)
サマリーテキストファイル (
[output_stem]_summary.txt):使用された入力ファイル名
フィッティング範囲
最適化されたパラメータ(\(dE_{film}\), \(dE_{substrate}\), \(A_{film}\), \(A_{substrate}\))
エネルギーシフト差 (\(dE_{film} - dE_{sub}\))
RMSE (二乗平均平方根誤差) および NRMSE (正規化RMSE)
最適化の目的関数値、成功状態、メッセージ
多項式バックグラウンドの係数
--vbm-film-refおよび--vbm-sub-refが指定された場合は、VBMおよびVBOの値も含まれます。
フィッティング結果プロット (
[output_stem]_fit.png):観測された混合スペクトル、フィッティング結果、フィルム成分、基板成分、バックグラウンドが1つのグラフにプロットされます。
X軸は「Energy / Binding energy (eV)」、Y軸は「Intensity」です。
正規化入力スペクトル比較プロット (
[output_stem]_input_normalized.png):入力されたフィルム参照、基板参照、混合スペクトルが、指定された正規化モード (
--norm-mode) で正規化されて比較プロットされます。フィッティング範囲 (
--fit-xmin,--fit-xmax) が縦線で示されます。X軸は「Energy / Binding energy (eV)」、Y軸は「Normalized intensity」です。
コマンドラインでの使用例 (Usage)
基本的な使用方法は以下の通りです。
python fit_vbo_xps.py --film <film_file> --substrate <substrate_file> --mix <mixed_file> [options]
必須引数:
--film <path>: フィルム参照スペクトルファイルへのパス--substrate <path>: 基板参照スペクトルファイルへのパス--mix <path>: 混合スペクトルファイルへのパス
主なオプション:
--fit-xmin <float>: フィッティングに使用する最小結合エネルギー (eV)--fit-xmax <float>: フィッティングに使用する最大結合エネルギー (eV)--show <0|1>: プロットウィンドウを表示するかどうか (デフォルト:1)--save <0|1>: プロット画像を保存するかどうか (デフォルト:1)--output-stem <str>: 出力ファイルの基本名 (デフォルト:xps_vbo)--vbm-film-ref <float>: フィルム参照のVBM位置 (eV)。VBO計算に使用。--vbm-sub-ref <float>: 基板参照のVBM位置 (eV)。VBO計算に使用。--bg-order <0|1|2>: 多項式バックグラウンドの次数 (デフォルト:1)--amp-sub0 <float>: 基板成分の初期振幅 (デフォルト:0.1)--shift-film0 <float>: フィルム成分の初期エネルギーシフト (デフォルト:0.0)--shift-sub0 <float>: 基板成分の初期エネルギーシフト (デフォルト:0.0)
コマンドラインでの具体的な使用例
ここでは、スクリプトの3重引用符で示された例に基づき、具体的な実行例とその結果を説明します。
シナリオ: Bi2OS2膜とp-Si基板のHAXPES測定から得られた混合スペクトルを、それぞれの参照スペクトルを用いて解析し、VBOを求めます。フィッティング範囲は -2.5 eV から 8 eV とし、初期の基板振幅を 1.0 に設定します。
実行コマンド:
python fit_vbo_xps.py ^
--film Bi2OS2100nm_20260508-1_Bi2OS2_pSi_HAXPES_fit_YBPS100_VBwideY2-deconvoluted_point13.xlsm ^
--substrate n-Si_20260508-1_Bi2OS2_pSi_HAXPES_fit_YNS_VBnarrowY-Si-deconvoluted_point10.xlsm ^
--mix TOA90_20260508-1_Bi2OS2_pSi_HAXPES_fit_YBPS25-90_VBwideY2-deconvoluted_point13.xlsm ^
--fit-xmin -2.5 --fit-xmax 8 ^
--show 1 --amp-sub0 1.0 ^
--vbm-film-ref 0.5 --vbm-sub-ref 0.1 --output-stem my_xps_fit
注: Windows環境では行継続記号 ^ を使用しますが、Linux/macOSでは \ を使用します。
実行結果の説明:
このコマンドを実行すると、以下のような情報がコンソールに出力され、ファイルが生成されます。
コンソール出力の例:
film : Bi2OS2100nm_...point13.xlsm, n=XXX, x=[..., ...]
substrate: n-Si_20260508...point10.xlsm, n=YYY, x=[..., ...]
mix : TOA90_20260508...point13.xlsm, n=ZZZ, x=[..., ...]
Optimizer: scipy.optimize.minimize(method='Nelder-Mead')
Nelder-Mead convergence
Iter/Eval output is from the callback; S is the objective value including penalties.
Parameters: dEf, dEs [eV], Af, As
Initial S=0.12345678 dEf=0.000000 dEs=0.000000 Af=1.000000 As=1.000000
Iter 10 Eval 120 S=0.01234567 Best=0.01234567 dEf=-0.123456 dEs=0.012345 Af=0.876543 As=0.987654
...
Final S=0.00001234 nit=500 nfev=800 dEf=-0.150012 dEs=0.005321 Af=0.751234 As=0.897654
Optimized parameters
dE_film = -0.15001234 eV
dE_substrate = 0.00532145 eV
dE_film-dE_sub = -0.15533379 eV
A_film = 0.75123456
A_substrate = 0.89765432
RMSE = 0.00012345
NRMSE = 0.00000123
objective = 0.00001234
success = True
message = Optimization terminated successfully.
VBM / offset
VBM_film_fit_BE = 0.34998766 eV (0.5 + -0.15001234)
VBM_sub_fit_BE = 0.10532145 eV (0.1 + 0.00532145)
VBO_BE = 0.24466621 eV (= film BE - substrate BE)
opposite sign = -0.24466621 eV
Output
fit csv : my_xps_fit_fit.csv
summary : my_xps_fit_summary.txt
fit plot : my_xps_fit_fit.png
normalized plot: my_xps_fit_input_normalized.png
この出力から、フィルム成分と基板成分の最適化されたエネルギーシフト、それぞれの振幅、そしてそれらの差が dE_film-dE_sub として示されます。--vbm-film-ref と --vbm-sub-ref を指定したため、VBMおよびVBOの値も計算され、結合エネルギー軸上でのVBOが 0.24466621 eV であること、その逆符号が -0.24466621 eV であることが分かります。
生成されるファイル:
my_xps_fit_fit.csv: フィッティング範囲内の全てのスペクトルデータ(観測、フィッティング、各成分、残差)がCSV形式で保存されます。例えば、フィッティングされた混合スペクトルと観測スペクトルを比較したり、各成分の寄与を詳細に調べたりするのに利用できます。my_xps_fit_summary.txt: 最適化されたパラメータやVBOなどの重要な結果がテキスト形式でまとめられます。研究ノートや報告書に結果を記述する際の基礎情報として活用できます。my_xps_fit_fit.png: 混合スペクトルとそのフィッティング結果、そしてフィルム・基板成分およびバックグラウンドの各曲線が重ねてプロットされた画像ファイルです。視覚的にフィッティングの良さを評価するのに役立ちます。my_xps_fit_input_normalized.png: 入力された3つのスペクトルが正規化されて比較された画像ファイルです。異なるスペクトル間の相対的な形状やVBM位置の違いを概観するのに便利です。--fit-xminと--fit-xmaxで指定されたフィッティング範囲が縦線で示されます。