xrd_fit.py は、X線回折 (XRD) データのシミュレーション、読み込み、フィッティング、および膜厚推定を行うためのPythonスクリプトです。xrayutilities ライブラリを用いて動的理論に基づいたXRDシミュレーションを実行し、SciPyの最適化アルゴリズムや独自の粒子群最適化 (PSO) を使用して実験データへのフィッティングを行います。


xrd_fit.py マニュアル

1) プログラムの動作

xrd_fit.py は、コマンドライン引数によって以下の4つの主要なモードで動作します。

  1. sim (シミュレーションモード):

    • 指定された(またはparameters.csvに保存された)膜組成 (x)、緩和度 (relax)、膜厚 (thick) のパラメータに基づき、動的理論によるXRDパターンをシミュレーションします。

    • 入力データファイル (--infile) が指定された場合、シミュレーション結果と入力データを重ねてプロットし比較します。入力データが指定されない場合は、シミュレーション結果のみをプロットします。

  2. read (読み込みモード):

    • 指定された入力データファイル (--infile) から2θ-強度データを読み込み、XRDパターンをプロットします。

  3. fit (フィッティングモード):

    • 入力データファイル (--infile) から実験データを読み込み、シミュレーション結果を実験データにフィッティングすることで、膜のパラメータ(x, relax, thick)を最適化します。

    • フィッティング手法として、以下の選択肢があります:

      • random: ランダム探索による最適化。

      • nelder-mead, bfgs, cg: scipy.optimize.minimize を用いた最適化手法。

      • pso: 独自の粒子群最適化 (Particle Swarm Optimization) 実装。

    • 最適化対象のパラメータは、--fix オプションでカンマ区切りで指定することで固定できます(例: --fix x,relax)。

    • フィッティングの進行状況はMatplotlibによるライブプロットでリアルタイムに可視化されます。

    • PSOモードでは、収束改善が一定期間見られない場合に停止するstall条件と、粒子群の分散が十分に小さくなった場合に停止するspread条件が追加されています。

    • フィッティングの途中および終了時に、現在の最適パラメータは parameters.csv ファイルに保存されます。

  4. guess (膜厚推定モード):

    • 入力データファイル (--infile) からXRDデータを読み込み、サビツキー・ゴレイ (Savitzky-Golay) フィルターによる平滑化と残差解析を行い、フリンジパターンから膜厚の候補を推定します。

    • 推定手法には、フーリエ変換 (FFT) とフリンジピークの線形回帰が含まれます。

    • 推定された膜厚候補は、parameters.csvにフィッティングモードの初期値として利用可能な形式で保存されます。

    • 検出されたピークとクラスター情報は、それぞれguess-peaks.csvguess-clusters.csvに出力されます。

    • 解析結果は、信号、エンベロープ、残差、FFTスペクトル、フリンジ次数とq値のプロットとして表示されます。

共通機能:

  • 材料モデル: 基板と膜の結晶構造はCIF (Crystallographic Information File) 形式で読み込まれ、xrayutilities を用いて動的理論シミュレーションのためのレイヤースタックが構築されます。弾性定数がCIFにない場合、デフォルト値が適用されます。

  • パラメータ管理: parameters.csv ファイルを通じて、xrelaxthick の初期値、最適化対象/固定ステータス、およびPSOの粒子群のパラメータが管理されます。

  • プロット: Matplotlibを用いて、XRDパターン、フィッティング結果、解析結果がGUIウィンドウに表示されます。Y軸スケール (--yscale) や残差スケール (--residual_scale) を指定できます。


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

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

  • numpy: 数値計算

  • matplotlib: グラフ描画

  • xrayutilities: X線回折シミュレーション

  • scipy: 科学技術計算、特に最適化アルゴリズムと信号処理(Savitzky-Golayフィルター、ピーク検出)

インストール方法:

以下のコマンドをターミナルまたはコマンドプロンプトで実行して、必要なライブラリをインストールできます。

pip install numpy matplotlib scipy xrayutilities

3) 必要な入力ファイル

プログラムの動作モードに応じて、以下のファイルが必要になります。

  1. XRDデータファイル (テキスト形式):

    • 指定方法: --infile <ファイル名> オプションでパスを指定します。

    • 内容: 少なくとも2列のデータを含むプレーンテキストファイルです。

      • 1列目: 2θ角度 (度) または ω角度 (度)

      • 2列目: X線強度 (任意単位)

    • :

      32.000  10.2
      32.050  15.5
      32.100  23.8
      ...
      
    • --infile が指定されない場合、sim モードではデフォルトのパラメータでシミュレーションを行い、read, fit, guess モードでは内部で定義されたターゲットパラメータ (TARGET_X, TARGET_RELAX, TARGET_THICK) とスキャン範囲 (TWOTHETA_MIN, TWOTHETA_MAX) に基づいて模擬データを生成して使用します。

  2. 結晶構造情報ファイル (CIF形式):

    • 指定方法:

      • 基板: --substrate_file <ファイル名> (デフォルト: GaN.cif)

      • 膜: --film_file <ファイル名> (デフォルト: AlN.cif)

    • 内容: xrayutilities が結晶構造情報を読み込むためのCIFファイル。弾性定数が含まれていない場合、ヘキサゴナル構造用のデフォルト値が適用されます。

    • これらのファイルはプログラムを実行するディレクトリ、または指定されたパスに存在する必要があります。

  3. パラメータファイル (CSV形式):

    • ファイル名: デフォルトでは parameters.csv です。--infile オプションが指定された場合、その入力ファイル名に基づいて {filebody}-parameters.csv の形式で生成されます (例: data.txt の場合は data-parameters.csv)。

    • 内容: 膜の組成 (x)、緩和度 (relax)、膜厚 (thick) の各パラメータの値と、そのパラメータが最適化対象であるか(optid=1)固定されているか(optid=0)を示す情報が含まれます。

    • プログラム起動時に存在しない場合は、デフォルト値で自動的に作成されます。

    • :

      varname,value,optid
      x,0.0,1
      relax,1.0,1
      thick,1500.0,1
      

      PSOモードでは、複数の粒子(初期値)も保存されることがあります:

      varname,value,optid
      best0:x,0.01,1
      best0:relax,0.05,1
      best0:thick,1450.0,1
      pso0:x,0.005,1
      pso0:relax,0.04,1
      pso0:thick,1400.0,1
      pso1:x,0.015,1
      pso1:relax,0.06,1
      pso1:thick,1500.0,1
      

4) 実行後に生成される出力ファイル

プログラムは、実行モードやオプションに応じて以下のファイルを生成または更新します。

  1. パラメータファイル (CSV形式):

    • ファイル名: parameters.csv (または --infile に基づく {filebody}-parameters.csv)。

    • 生成タイミング: プログラム起動時に存在しない場合に新規作成されます。fit モードでの最適化中、またはguessモードでの初期値更新時に、最新のパラメータ値と最適化対象/固定ステータスが上書き保存されます。

    • 内容: 各パラメータの現在の値と、最適化対象(optid=1)か固定(optid=0)かの情報。PSOモードでは、複数の粒子(初期状態)も保存され、次の実行時の初期状態として利用されます。

  2. 膜厚推定ピークデータ (CSV形式): ( guess モードでのみ生成)

    • ファイル名: guess-peaks.csv (または --infile に基づく {filebody}-guess-peaks.csv)。

    • 生成タイミング: guess モードの実行後に生成されます。

    • 内容: 膜厚推定プロセスで検出されたフリンジピークの詳細な情報。

      • cluster_id: 所属するフリンジクラスターのID。

      • n: フリンジ次数。

      • q: q値 (reciprocal space vector)。

      • 2theta: 2θ角度。

      • used_stage1, used_stage2: 線形回帰の第1/第2ステージでピークが使用されたかどうかを示すブール値。

      • resid_stage1, resid_stage2: 第1/第2ステージの線形回帰からの残差。

  3. 膜厚推定クラスターデータ (CSV形式): ( guess モードでのみ生成)

    • ファイル名: guess-clusters.csv (または --infile に基づく {filebody}-guess-clusters.csv)。

    • 生成タイミング: guess モードの実行後に生成されます。

    • 内容: フリンジクラスターごとの膜厚推定結果。

      • cluster_id: フリンジクラスターのID。

      • npeaks: クラスター内のピーク数。

      • dq_est: q値の差分 (Δq) の推定値。

      • thick_fft: FFT解析から推定された膜厚。

      • thick_reg: 線形回帰から推定された膜厚。

      • confidence: 推定の信頼度(クラスター内のピーク数に基づく)。

  4. プロット画像 (画面表示):

    • 形式: MatplotlibによるGUIウィンドウ。

    • 生成タイミング: sim, read, fit, guess のすべてのモードで、XRDパターン、フィッティングの進捗、または解析結果がリアルタイムまたは最終結果として画面に表示されます。

    • 備考: プログラム自体に画像をファイルとして自動保存する機能は含まれていませんが、MatplotlibのGUIウィンドウから手動で画像を保存することができます。


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

以下は、xrd_fit.py の様々な使用例です。

# ------------------------------------------------------------
# 1. シミュレーションモード (--mode sim)
# ------------------------------------------------------------
# parameters.csvのパラメータでXRDパターンをシミュレートし、logスケールで表示
python xrd_fit.py --mode sim --yscale log

# 実験データファイル 'experimental_data.txt' とシミュレーション結果を比較表示
python xrd_fit.py --mode sim --infile experimental_data.txt

# ------------------------------------------------------------
# 2. データ読み込みモード (--mode read)
# ------------------------------------------------------------
# 入力データファイル 'experimental_data.txt' からXRDパターンを読み込み、プロット
python xrd_fit.py --mode read --infile experimental_data.txt

# 線形スケールでプロット
python xrd_fit.py --mode read --infile experimental_data.txt --yscale linear

# ------------------------------------------------------------
# 3. フィッティングモード (--mode fit)
# ------------------------------------------------------------
# Nelder-Mead法でフィッティングし、"thick"パラメータを固定
python xrd_fit.py --mode fit --method nelder-mead --fix thick --infile experimental_data.txt

# ランダム探索法でフィッティングし、"x"と"relax"パラメータを固定
# (注意: コードでは'alx'ではなく'x'を使用)
python xrd_fit.py --mode fit --method random --fix x,relax --infile experimental_data.txt

# PSO (粒子群最適化) でフィッティング
python xrd_fit.py --mode fit --method pso --infile experimental_data.txt

# PSOでY軸と残差スケールを線形に設定
python xrd_fit.py --mode fit --method pso --yscale linear --residual_scale linear --infile experimental_data.txt

# PSOのパラメータを調整 (粒子数20、慣性重み0.7、認知係数1.4、社会係数1.6)
python xrd_fit.py --mode fit --method pso --pso_nparticles 20 --pso_w 0.7 --pso_c1 1.4 --pso_c2 1.6 --infile experimental_data.txt

# PSOの停止条件を調整 (改善がない最大反復数10、粒子分散の相対許容誤差0.1)
python xrd_fit.py --mode fit --method pso --pso_stall_max 10 --pso_spread_rtol 0.1 --infile experimental_data.txt

# BFGS法でフィッティング
python xrd_fit.py --mode fit --method bfgs --infile experimental_data.txt

# 共役勾配法 (CG) でフィッティング
python xrd_fit.py --mode fit --method cg --infile experimental_data.txt

# ------------------------------------------------------------
# 4. 膜厚推定モード (--mode guess)
# ------------------------------------------------------------
# 入力データファイル 'experimental_data.txt' から膜厚を推定
python xrd_fit.py --mode guess --infile experimental_data.txt

# 膜厚推定の探索範囲を角度で指定 (16.0度 から 17.3度)
python xrd_fit.py --mode guess --guess_low 16.0 --guess_high 17.3 --infile experimental_data.txt

# Savitzky-Golayフィルターのパラメータを調整 (ウィンドウサイズ41、次数4)
python xrd_fit.py --mode guess --nsmooth_points 41 --nsmooth_order 4 --infile experimental_data.txt

# 推定結果から上位10個の膜厚候補を保持
python xrd_fit.py --mode guess --nguess_keep 10 --infile experimental_data.txt

# フリンジクラスター検出のギャップ係数を調整
python xrd_fit.py --mode guess --cluster_gap_factor 2.0 --infile experimental_data.txt

# ------------------------------------------------------------
# 5. 共通オプション
# ------------------------------------------------------------
# 基板と膜のCIFファイルを指定 (デフォルト: GaN.cif, AlN.cif)
python xrd_fit.py --mode sim --substrate_file MySubstrate.cif --film_file MyFilm.cif

# 最大反復回数と最適化の許容誤差を設定
python xrd_fit.py --mode fit --method pso --nmaxiter 5000 --tol 1e-8 --infile experimental_data.txt