xrd_fit プログラム仕様

xrd_fit.py: X線回折(XRD)シミュレーションおよびフィッティングツール

このモジュールは、xrayutilitiesライブラリを使用して動的理論に基づいたXRDシミュレーションを実行し、 実験データに対して構造パラメータ(組成、緩和度、膜厚)を最適化します。 また、フリンジ解析による膜厚の自動推定機能も備えています。

関連リンク: xrd_fit.py 技術ドキュメント

apply_fix_list(param_sets, fix_list)[ソース]

指定されたパラメータの最適化フラグをオフ(0)に設定します。

詳細説明:

param_sets 内の全てのパラメータセットに対して、fix_list に含まれるパラメータの optid (最適化対象フラグ) を0に設定し、最適化から除外します。

:param : param param_sets: dict: 変更対象のパラメータ辞書 (複数のセットを含む)。 :param : param fix_list: list[str]: 固定するパラメータ名のリスト。

assign_fringe_index_auto(q_vals, dq_est)[ソース]

FFTによる推定周期 dq_est に基づき、各ピークにフリンジ次数 (n) を自動的に割り当てます。

詳細説明:

フリンジのQ値 (q_vals) の差分と推定された周期 (dq_est) を比較し、 最も近い整数倍をフリンジ次数のステップとして採用します。

:param : param q_vals: numpy.ndarray: 検出されたフリンジピークのQ値の配列。 :param : param dq_est: float: FFTによって推定されたフリンジ周期 (Δq)。

戻り値:

各ピークに割り当てられたフリンジ次数 (n) の配列。

戻り値の型:

numpy.ndarray

build_cluster_peak_tables(omega_cut, residual_for_peaks, wavelength, dq_ref, gap_factor)[ソース]

フリンジピークを検出し、検出されたピークをクラスター化し、 各クラスターで線形回帰分析を実行します。

詳細説明:
  1. 残差信号からフリンジピークを検出します。

  2. 検出されたピークのQ値を計算します。

  3. detect_fringe_clusters を使用して、ピークを論理的なクラスターに分割します。

  4. 各クラスター内で assign_fringe_index_auto でフリンジ次数を割り当て、 linear_fit_two_stage で線形回帰を行い、膜厚を推定します。

  5. 検出されたピークの詳細 (all_peak_rows) とクラスターごとの解析結果 (cluster_rows) および回帰結果 (cluster_fit_results) を生成します。

:param : param omega_cut: numpy.ndarray: 角度範囲を限定したomegaの配列 [deg]。 :param : param residual_for_peaks: numpy.ndarray: ピーク検出に使用する残差信号。 :param : param wavelength: float: X線波長 [Å]。 :param : param dq_ref: float: フリンジ周期の参照値 (Δq)。 :param : param gap_factor: float: クラスター分割の閾値を決定するための係数。

戻り値:

  • all_peak_rows: 検出された全ピークの詳細情報。

  • cluster_rows: 各クラスターごとの解析サマリー。

  • cluster_fit_results: 各クラスターの線形回帰の詳細結果。

ピークが検出されない場合は、空のリストとNoneが返されます。

戻り値の型:

tuple[list[dict], list[dict], list[dict]]

build_parser()[ソース]

コマンドライン引数を解析するためのパーサーを構築します。

詳細説明:

この関数はargparseモジュールを使用して、XRDシミュレーション、フィッティング、 および膜厚推定ツールが受け入れるコマンドライン引数を定義します。 各引数にはデフォルト値、選択肢、ヘルプメッセージが含まれます。

戻り値:

設定済みのパーサーオブジェクト。

戻り値の型:

argparse.ArgumentParser

calc_pattern_from_param_set(substrate, film, energy, omega, param_set)[ソース]

パラメータセットを直接渡してシミュレーション強度を計算します。

詳細説明:

param_set から組成、緩和度、膜厚を抽出し、 clamp_values で物理的範囲にクランプした後、モデルを構築し強度をシミュレートします。

:param : param substrate: xu.materials.Crystal: 基板材料オブジェクト。 :param : param film: xu.materials.Crystal: 膜材料オブジェクト。 :param : param energy: float: X線エネルギー [eV]。 :param : param omega: numpy.ndarray: 計算する角度範囲のomega値の配列 [deg]。 :param : param param_set: dict: 評価するパラメータセット。

戻り値:

計算されたXRD強度分布の配列。

戻り値の型:

numpy.ndarray

calc_residual(int_target, int_try, residual_scale='log')[ソース]

ターゲット強度とシミュレーション強度の残差 (L2ノルム) を計算します。

詳細説明:

residual_scale が "log" の場合、強度は対数スケールに変換されてから残差が計算されます。 これにより、強度の低い部分のフィッティング精度を向上させることができます。 "linear" の場合は線形スケールで計算されます。 強度がゼロになることを避けるため、非常に小さいイプシロン値 (eps) が使用されます。

:param : param int_target: numpy.ndarray: 実験データまたはターゲット強度。 :param : param int_try: numpy.ndarray: 計算データまたは試行強度。 :param : param residual_scale: str: 残差計算に使用するスケール ("log" または "linear")。

戻り値:

計算された残差の総和 (L2ノルムの和)。

戻り値の型:

float

clamp_values(x, relax, thick)[ソース]

組成(x)、緩和度(relax)、膜厚(thick)のパラメータを物理的に妥当な範囲にクランプします。

詳細説明:
  • x は0.0から1.0の範囲に制限されます。

  • relax は0.0から1.0の範囲に制限されます。

  • thick は1.0以上の値に制限されます。

:param : param x: float: 組成比。 :param : param relax: float: 緩和度。 :param : param thick: float: 膜厚 [Å]。

戻り値:

クランプされた (x, relax, thick) の値。

戻り値の型:

tuple[float, float, float]

clone_parameter_set(param_set)[ソース]

指定されたパラメータセットを深くコピーします。

詳細説明:

元のパラメータセットの内容を変更せずに新しい独立した辞書を作成するために使用されます。 これにより、最適化プロセス中にパラメータが不意に変更されるのを防ぎます。

:param : param param_set: dict: コピーするパラメータセット。

戻り値:

コピーされたパラメータセット。

戻り値の型:

dict

detect_fringe_clusters(q_vals, dq_ref, gap_factor=1.6)[ソース]

フリンジの欠損が大きい箇所でデータを分割し、クラスター化します。

詳細説明:

検出されたQ値の差分が参照周期 dq_refgap_factor を掛けた値よりも大きい場合、 その箇所でフリンジピークのシーケンスが途切れていると判断し、データを複数のクラスターに分割します。 これにより、不連続なフリンジパターンでも個別に解析できるようになります。 各クラスターは少なくとも2つのピークを含む必要があります。

:param : param q_vals: numpy.ndarray: 検出されたフリンジピークのQ値の配列。 :param : param dq_ref: float: フリンジ周期の参照値 (FFTから得られた推定値など)。 :param : param gap_factor: float: クラスター分割の閾値を決定するための係数。

戻り値:

各クラスターに属するピークのインデックスの配列のリスト。

戻り値の型:

list[numpy.ndarray]

ensure_valid_savgol(points, order, ndata)[ソース]

Savitzky-Golayフィルタのパラメータがデータ長に対して妥当であることを保証します。

詳細説明:

ウィンドウサイズ points は奇数であり、データ長 ndata を超えないように調整されます。 多項式次数 order はウィンドウサイズ points より小さく調整されます。

:param : param points: int: Savitzky-Golayフィルタのウィンドウ点数。 :param : param order: int: Savitzky-Golayフィルタの多項式次数。 :param : param ndata: int: 入力データの総点数。

戻り値:

調整された (ウィンドウ点数, 多項式次数)。

戻り値の型:

tuple[int, int]

estimate_thickness_from_fft_signal(omega_deg, signal, wavelength, keep_n=5, nq_uniform=4096)[ソース]

信号に対してFFTを行い、主要な周波数成分から膜厚の候補を算出します。

詳細説明:

入力の角度データと信号をq軸に変換し、一様間隔で補間します。 ハニング窓を適用した後、FFTを実行して周波数スペクトルを取得します。 スペクトル中の顕著なピークを検出し、その周波数から膜厚候補を計算します。 複数の候補をスコアの高い順にソートして返します。

:param : param omega_deg: numpy.ndarray: 角度データ [deg]。 :param : param signal: numpy.ndarray: 解析対象の信号 (通常はエンベロープ除去後の残差)。 :param : param wavelength: float: X線波長 [Å]。 :param : param keep_n: int: 保持する膜厚候補の最大数。 :param : param nq_uniform: int: FFTのために一様補間するq軸の点数。

戻り値:

  • candidates_list: 膜厚候補のリスト。各候補は辞書 (method, thick, score, dq, freq)。

  • qz_axis: 一様化されたqz軸。

  • signal_uniform: 一様化された信号。

  • freq_axis: FFTの周波数軸。

  • fft_amplitude: FFTの振幅。

戻り値の型:

tuple[list[dict], numpy.ndarray, numpy.ndarray, numpy.ndarray, numpy.ndarray]

fit_pso(substrate, film, energy, omega, int_target, param_sets, parameter_file, nmaxiter, tol, nparticles, w, c1, c2, yscale='log', residual_scale='log', pso_stall_max=20, pso_spread_rtol=0.01)[ソース]

粒子群最適化 (PSO) を使用してXRDフィッティングを行います。

詳細説明:

この関数は、粒子群最適化アルゴリズムを実装し、複数の「粒子」が解空間を探索します。 各粒子は、自身の最良の位置 (pbest) と群全体の最良の位置 (gbest) に基づいて 速度と位置を更新します。一定期間の改善なし (pso_stall_max) または 粒子の位置の分散が閾値以下になった場合 (pso_spread_rtol) に早期停止します。 最適化の進捗はライブプロットで視覚的に表示され、一定間隔でパラメータがファイルに保存されます。

:param : param substrate: xu.materials.Crystal: 基板材料オブジェクト。 :param : param film: xu.materials.Crystal: 膜材料オブジェクト。 :param : param energy: float: X線エネルギー [eV]。 :param : param omega: numpy.ndarray: 計算する角度範囲のomega値の配列 [deg]。 :param : param int_target: numpy.ndarray: 実験データ強度。 :param : param param_sets: dict: 初期パラメータ、最適化の進捗がここに保存されます。 :param : param parameter_file: str: パラメータの保存先ファイルパス。 :param : param nmaxiter: int: 最大反復回数。 :param : param tol: float: 収束判定の許容誤差(残差の改善量に対する閾値)。 :param : param nparticles: int: 粒子の総数。 :param : param w: float: PSOの慣性重み。 :param : param c1: float: PSOの自己学習係数。 :param : param c2: float: PSOの社会学習係数。 :param : param yscale: str: プロットのY軸スケール ("linear" または "log")。 :param : param residual_scale: str: 残差計算に使用するスケール ("log" または "linear")。 :param : param pso_stall_max: int: 改善が見られない場合にPSOを停止する最大反復数。 :param : param pso_spread_rtol: float: 粒子の分散に基づく停止条件の相対許容誤差。

戻り値:

最適化されたパラメータセットを含む param_sets 辞書。

戻り値の型:

dict

fit_random(substrate, film, energy, omega, int_target, param_sets, parameter_file, yscale='log', residual_scale='log')[ソース]

ランダムウォーク的な手法でXRDフィッティングを行います。

詳細説明:

現在の最適パラメータセットからランダムに少しずつパラメータを変化させ、 残差が改善されればその新しいパラメータセットを採用するという手順を繰り返します。 一定回数改善が見られない場合や、残差が LIMIT 以下になれば停止します。 最適化の進捗はライブプロットで視覚的に表示されます。

:param : param substrate: xu.materials.Crystal: 基板材料オブジェクト。 :param : param film: xu.materials.Crystal: 膜材料オブジェクト。 :param : param energy: float: X線エネルギー [eV]。 :param : param omega: numpy.ndarray: 計算する角度範囲のomega値の配列 [deg]。 :param : param int_target: numpy.ndarray: 実験データ強度。 :param : param param_sets: dict: 初期パラメータ、最適化の進捗がここに保存されます。 :param : param parameter_file: str: パラメータの保存先ファイルパス。 :param : param yscale: str: プロットのY軸スケール ("linear" または "log")。 :param : param residual_scale: str: 残差計算に使用するスケール ("log" または "linear")。

戻り値:

最適化されたパラメータセットを含む param_sets 辞書。

戻り値の型:

dict

fit_scipy(substrate, film, energy, omega, int_target, param_sets, parameter_file, method_name, nmaxiter, tol, yscale='log', residual_scale='log')[ソース]

SciPyの最適化アルゴリズム(Nelder-Mead, BFGS, CG)を使用してXRDフィッティングを行います。

詳細説明:

scipy.optimize.minimize 関数を利用し、指定された最適化手法でパラメータを調整します。 目的関数は objective_from_param_set で定義されており、物理的な制約へのペナルティを含みます。 最適化の進捗はコールバック関数を通じてライブプロットにリアルタイムで表示され、 一定間隔でパラメータがファイルに保存されます。

:param : param substrate: xu.materials.Crystal: 基板材料オブジェクト。 :param : param film: xu.materials.Crystal: 膜材料オブジェクト。 :param : param energy: float: X線エネルギー [eV]。 :param : param omega: numpy.ndarray: 計算する角度範囲のomega値の配列 [deg]。 :param : param int_target: numpy.ndarray: 実験データ強度。 :param : param param_sets: dict: 初期パラメータ、最適化の進捗がここに保存されます。 :param : param parameter_file: str: パラメータの保存先ファイルパス。 :param : param method_name: str: 使用するSciPy最適化手法の名前 ("nelder-mead", "bfgs", "cg")。 :param : param nmaxiter: int: 最大反復回数。 :param : param tol: float: 収束判定の許容誤差。 :param : param yscale: str: プロットのY軸スケール ("linear" または "log")。 :param : param residual_scale: str: 残差計算に使用するスケール ("log" または "linear")。

戻り値:

最適化されたパラメータセットを含む param_sets 辞書。

戻り値の型:

dict

get_guess_clusters_filename(infile)[ソース]

入力ファイル名に基づいて膜厚推定モードで解析したクラスターの保存用CSVファイル名を生成します。

詳細説明:

入力ファイル名が存在する場合はそのファイル名から拡張子を除いた名前に "-guess-clusters.csv" を追加します。 入力ファイル名が空の場合は "guess-clusters.csv" を返します。

:param : param infile: str: 入力データファイル名。

戻り値:

クラスターデータCSVファイル名。

戻り値の型:

str

get_guess_peaks_filename(infile)[ソース]

入力ファイル名に基づいて膜厚推定モードで検出したピークの保存用CSVファイル名を生成します。

詳細説明:

入力ファイル名が存在する場合はそのファイル名から拡張子を除いた名前に "-guess-peaks.csv" を追加します。 入力ファイル名が空の場合は "guess-peaks.csv" を返します。

:param : param infile: str: 入力データファイル名。

戻り値:

ピークデータCSVファイル名。

戻り値の型:

str

get_optimize_names(param_set)[ソース]

指定されたパラメータセット内で最適化対象(optid=1)となっているパラメータ名のリストを取得します。

:param : param param_set: dict: パラメータセット辞書。

戻り値:

最適化対象のパラメータ名("x", "relax", "thick")のリスト。

戻り値の型:

list[str]

get_param_bounds(name, current_value)[ソース]

特定のパラメータの探索境界(下限と上限)を取得します。

詳細説明:

組成(x)と緩和度(relax)はそれぞれ[0.0, 1.0]に制限されます。 膜厚(thick)は現在の値を基準に相対的な範囲([0.5*current_value, 1.5*current_value])で、 かつ最低1.0Åという制約が適用されます。 これらはPSOアルゴリズムなどでの粒子の位置更新や初期化に利用されます。

:param : param name: str: パラメータ名 ("x", "relax", "thick")。 :param : param current_value: float: そのパラメータの現在の値。

戻り値:

(下限値, 上限値) のタプル。

戻り値の型:

tuple[float, float]

get_parameter_filename(infile)[ソース]

入力ファイル名に基づいてパラメータ保存用のCSVファイル名を生成します。

詳細説明:

入力ファイル名が存在する場合はそのファイル名から拡張子を除いた名前に "-parameters.csv" を追加します。 入力ファイル名が空の場合は "parameters.csv" を返します。

:param : param infile: str: 入力データファイル名。

戻り値:

パラメータCSVファイル名。

戻り値の型:

str

get_pso_parameter_sets(param_sets)[ソース]

DEFAULT_PSO_PREFIX (通常 "pso") で始まるキーを持つパラメータセットを全て取得します。

詳細説明:

これはPSOアルゴリズムで使用される各粒子の位置を初期化または取得するために使用されます。 取得されたセットは、元の辞書から独立したコピーとして提供されます。

:param : param param_sets: dict: 複数のパラメータセットを管理する辞書。

戻り値:

PSO粒子として使用されるパラメータセットのリスト。

戻り値の型:

list[dict]

guess_thickness(substrate, film, energy, omega, intensity, parameter_file, param_sets, guess_low, guess_high, nsmooth_points, nsmooth_order, nguess_keep, cluster_gap_factor=1.6, yscale='log', infile='')[ソース]

XRDフリンジ解析に基づいて膜厚を推定します。解析結果をプロットし、上位候補をパラメータCSVに保存します。

詳細説明:
  1. 指定された角度範囲でXRDデータの一部を切り出します。

  2. Savitzky-Golayフィルタを使用して強度データからエンベロープを除去し、残差信号を抽出します。

  3. 残差信号にFFTを適用し、主要な周波数成分から膜厚の初期候補 (Δq_est) を算出します。

  4. 残差信号からフリンジピークを検出し、Δq_estとギャップ係数に基づいてピークをクラスターに分割します。

  5. 各クラスター内でフリンジ次数を割り当て、線形回帰分析を行い、最終的な膜厚候補を算出します。

  6. 検出されたピーク情報とクラスター情報をCSVファイルに保存します。

  7. FFTと線形回帰の両方から得られた膜厚候補をスコア順にソートし、上位の候補をコンソールに表示します。

  8. 最もスコアの高い膜厚候補をプライマリパラメータセットの膜厚値として設定し、 上位の候補はPSO粒子としてパラメータファイルに保存されます。

  9. 解析の主要なステップ(信号・残差、FFTスペクトル、n-qプロット)を視覚化します。

:param : param substrate: xu.materials.Crystal: 基板材料オブジェクト。 :param : param film: xu.materials.Crystal: 膜材料オブジェクト。 :param : param energy: float: X線エネルギー [eV]。 :param : param omega: numpy.ndarray: 全角度範囲のomega値の配列 [deg]。 :param : param intensity: numpy.ndarray: 全強度データ。 :param : param parameter_file: str: パラメータの保存先ファイルパス。 :param : param param_sets: dict: パラメータセット(推定結果がここに保存されます)。 :param : param guess_low: float: 解析を開始する角度 [deg]。 :param : param guess_high: float: 解析を終了する角度 [deg]。 :param : param nsmooth_points: int: Savitzky-Golayフィルタのウィンドウ点数。 :param : param nsmooth_order: int: Savitzky-Golayフィルタの多項式次数。 :param : param nguess_keep: int: 保持する膜厚候補の数。 :param : param cluster_gap_factor: float: フリンジクラスター判定用のギャップ係数。 :param : param yscale: str: プロットのY軸スケール ("linear" または "log")。 :param : param infile: str: 入力データファイル名(出力ファイル名生成に使用)。

戻り値:

更新されたパラメータセットを含む param_sets 辞書。

戻り値の型:

dict

initialize(parser)[ソース]

コマンドライン引数を解析し、結果を返します。

:param : param parser: argparse.ArgumentParserオブジェクト。

戻り値:

argparse.Namespace: 解析された引数を含むオブジェクト。

linear_fit_two_stage(n_vals, q_vals)[ソース]

フリンジ次数 (n) と q 値の関係を2段階の線形回帰で解析し、傾きから膜厚を求めます。

詳細説明:
  1. 全てのピークデータを用いて線形回帰を行い、初期の残差と標準偏差を計算します。

  2. 初期残差が標準偏差の2倍を超える外れ値を除外し、残りのデータで再度線形回帰を行います。

  3. 最終的な回帰の傾き (dq/dn) から、膜厚 (Thickness = 2π / (dq/dn)) を計算します。

:param : param n_vals: numpy.ndarray: フリンジ次数の配列。 :param : param q_vals: numpy.ndarray: 対応するQ値の配列。

戻り値:

解析結果を含む辞書。ピークが2つ未満の場合はNone。
  • coef1: 1段階目の回帰係数。

  • coef2: 2段階目の回帰係数。

  • used_stage1: 1段階目で使用されたピークのブール配列。

  • used_stage2: 2段階目で使用されたピークのブール配列。

  • resid_stage1: 1段階目の残差。

  • resid_stage2: 2段階目の残差。

  • thickness: 計算された膜厚 [Å]。

戻り値の型:

dict or None

main(args)[ソース]

コマンドライン引数に基づき、XRDシミュレーション、データ読み込み、フィッティング、または膜厚推定を実行します。

詳細説明:

この関数は、プログラムのエントリポイントであり、以下の処理フローに従います。 1. 基板と膜の材料モデルを準備します。 2. パラメータファイルから初期パラメータを読み込み、固定パラメータを適用して保存します。 3. args.mode に応じて、以下のいずれかの操作を実行します。

  • "read": 2theta-intensityデータを読み込み、プロットします。

  • "sim": 指定されたパラメータでXRDパターンをシミュレートし、プロットします。

    入力ファイルがある場合は実験データと比較してプロットします。

  • "guess": フリンジ解析に基づいて膜厚を推定し、結果をプロットしてパラメータファイルを更新します。

  • "fit": 指定された最適化手法 (random, nelder-mead, bfgs, cg, pso) を使用して、

    実験データにフィッティングを行い、パラメータを最適化します。 フィッティングの進捗はライブプロットで表示されます。

:param : param args: argparse.Namespace: コマンドライン引数をパースした結果のオブジェクト。

make_default_parameter_set()[ソース]

単一のパラメータセット(組成、緩和度、膜厚)の初期辞書を作成します。

詳細説明:

各パラメータには 'value' (現在の値) と 'optid' (最適化対象フラグ: 1=対象, 0=固定) が含まれます。 初期値は定数 TRY_X, TRY_RELAX, TRY_THICK から取得され、 全て最適化対象として設定されます。

戻り値:

初期値と最適化フラグを含むパラメータ辞書。

例: {"x": {"value": 0.0, "optid": 1}, ...}

戻り値の型:

dict[str, dict[str, float or int]]

make_default_parameter_sets()[ソース]

デフォルトのプライマリパラメータセットを含む、複数のパラメータセットを管理する辞書を作成します。

詳細説明:

DEFAULT_PRIMARY_SET (通常 'best0') というキーで、 make_default_parameter_set() で生成された初期パラメータセットを保持します。 これは、複数の最適化粒子や候補を管理する際に基盤となる構造を提供します。

戻り値:

デフォルトのプライマリセットを含むパラメータ辞書全体の構造。

戻り値の型:

dict[str, dict]

make_initial_simplex(param_set, optimize_names)[ソース]

Nelder-Mead最適化法のための初期シンプレックスを生成します。

詳細説明:

初期シンプレックスは、optimize_names で指定された最適化対象パラメータの 現在の値 (param_set) を中心に、N+1個の頂点を持つ形状として生成されます。 各パラメータに対して、現在の値から大きく離れた値を設定した頂点を生成することで、 初期探索空間をカバーします。

:param : param param_set: dict: 基準となる初期パラメータセット。 :param : param optimize_names: list[str]: 最適化対象のパラメータ名のリスト。

戻り値:

Nelder-Mead法のための初期シンプレックス。各行が1つの頂点を表します。

戻り値の型:

numpy.ndarray

make_live_plot(omega, int_target, int_init, title, yscale='log')[ソース]

フィッティングの進捗を表示するためのインタラクティブなライブプロットを作成します。

詳細説明:

初期の実験データ (int_target) と初期シミュレーション結果 (int_init) を表示し、 フィッティング中に更新される CurrentFit のためのラインオブジェクトを準備します。 また、現在のパラメータや残差を表示するためのテキストボックスも作成します。

:param : param omega: numpy.ndarray: 角度軸 (omega) の配列 [deg]。 :param : param int_target: numpy.ndarray: 実験データ強度。 :param : param int_init: numpy.ndarray: 初期シミュレーション強度。 :param : param title: str: プロットのタイトル。 :param : param yscale: str: Y軸のスケール ("linear" または "log")。デフォルトは "log"。

戻り値:

(Figureオブジェクト, Axesオブジェクト, CurrentFitのLine2Dオブジェクト, テキストボックスのTextオブジェクト)。

戻り値の型:

tuple[matplotlib.figure.Figure, matplotlib.axes.Axes, matplotlib.lines.Line2D, matplotlib.text.Text]

make_scan_axis()[ソース]

XRDシミュレーション用のデフォルトの角度軸 (2theta, omega) を生成します。

詳細説明:

TWOTHETA_MIN から TWOTHETA_MAX の範囲で NPOINTS の数の2theta角度を生成し、 それに対応するomega角度 (2thetaの半分) を計算します。

戻り値:

(2theta角度の配列 [deg], omega角度の配列 [deg])。

戻り値の型:

tuple[numpy.ndarray, numpy.ndarray]

model(substrate, film, x, relax, thick, energy)[ソース]

指定されたパラメータで動的XRDシミュレーションモデルを構築します。

詳細説明:

X-rayUtilitiesの Layer オブジェクトと PseudomorphicStack001 を使用して、 基板と膜からなるスタックの動的理論モデルを定義します。 膜は基板と膜の合金であり、組成 x、緩和度 relax、膜厚 thick を持ちます。

:param : param substrate: xu.materials.Crystal: 基板材料オブジェクト。 :param : param film: xu.materials.Crystal: 膜材料オブジェクト(合金のもう一方の端成分)。 :param : param x: float: 合金の組成比 (0.0 から 1.0)。 :param : param relax: float: 膜の緩和度 (0.0 は完全擬似格子、1.0 は完全緩和)。 :param : param thick: float: 膜の厚さ [Å]。 :param : param energy: float: X線エネルギー [eV]。

戻り値:

構築された動的理論モデル。

戻り値の型:

xrayutilities.simpack.DynamicalModel

objective_from_param_set(substrate, film, energy, omega, int_target, param_set, residual_scale='log')[ソース]

最適化に使用する目的関数を計算します。残差に加えて物理的境界外へのペナルティを含みます。

詳細説明:

param_set からパラメータを抽出し、シミュレーションを実行して強度を計算します。 計算された強度とターゲット強度との残差を calc_residual で求めます。 また、組成(x)、緩和度(relax)、膜厚(thick)が物理的に妥当な範囲 (x:[0,1], relax:[0,1], thick>0) を逸脱した場合、 大きなペナルティが追加され、最適化がこれらの制約内で解を見つけるように誘導されます。

:param : param substrate: xu.materials.Crystal: 基板材料オブジェクト。 :param : param film: xu.materials.Crystal: 膜材料オブジェクト。 :param : param energy: float: X線エネルギー [eV]。 :param : param omega: numpy.ndarray: 計算する角度範囲のomega値の配列 [deg]。 :param : param int_target: numpy.ndarray: 実験データまたはターゲット強度。 :param : param param_set: dict: 評価するパラメータセット。 :param : param residual_scale: str: 残差計算に使用するスケール ("log" または "linear")。

戻り値:

ペナルティ込みの残差の総和。

戻り値の型:

float

pack_optimize_values(param_set, optimize_names)[ソース]

最適化対象のパラメータの値をNumPy配列にパックします。

:param : param param_set: dict: 基準となるパラメータセット。 :param : param optimize_names: list[str]: 最適化対象のパラメータ名のリスト。

戻り値:

最適化対象のパラメータ値を含むNumPy配列。

戻り値の型:

numpy.ndarray

parameter_set_to_values(param_set)[ソース]

パラメータセット辞書から組成(x)、緩和度(relax)、膜厚(thick)のタプルを抽出します。

:param : param param_set: dict: パラメータセット辞書。

戻り値:

(x, relax, thick) の値のタプル。

戻り値の型:

tuple[float, float, float]

parse_fix_list(fix_str)[ソース]

固定パラメータの文字列をリストに変換します。

詳細説明:

カンマ区切りの文字列を受け取り、各パラメータ名を小文字に変換し、 空白を除去したリストとして返します。空の文字列は空のリストを返します。

:param : param fix_str: str: カンマ区切りのパラメータ名文字列(例: "x,relax")。

戻り値:

小文字に統一された固定するパラメータ名のリスト。

戻り値の型:

list[str]

plot_xrd(omega, intensity_list, labels, title, yscale='log', text_lines=None, wait=False)[ソース]

複数のXRDパターンをプロットし表示します。

詳細説明:

与えられたomega軸と複数の強度配列をプロットします。 各強度配列には対応するラベルが付けられます。 Y軸のスケール("linear"または"log")とプロットのタイトルを設定できます。 追加のテキスト行をプロット領域に表示することも可能です。

:param : param omega: numpy.ndarray: 角度軸 (omega) の配列 [deg]。 :param : param intensity_list: list[numpy.ndarray]: プロットする強度配列のリスト。 :param : param labels: list[str]: 各強度配列に対応する凡例ラベルのリスト。 :param : param title: str: プロットのタイトル。 :param : param yscale: str: Y軸のスケール ("linear" または "log")。デフォルトは "log"。 :param : param text_lines: list[str] or None: プロット内に表示する追加テキスト行のリスト。 :param : param wait: bool: プロットウィンドウが閉じるまで待機するかどうか。Trueの場合、

ウィンドウが閉じられるまでプログラムの実行がブロックされます。

prepare_materials(substrate_file, film_file)[ソース]

CIFファイルから基板と膜の材料オブジェクトを準備し、弾性定数を設定します。

詳細説明:

指定されたCIFファイルパスからX-rayUtilitiesの Crystal オブジェクトをロードします。 材料がHexagonal対称性を持つことを確認し、もし弾性テンソルが定義されていない場合は デフォルトの六方晶系弾性定数を割り当てて、歪み計算が続行できるようにします。 ファイルが見つからない場合や読み込みエラーが発生した場合は、プログラムを終了します。

:param : param substrate_file: str: 基板のCIFファイルパス。 :param : param film_file: str: 膜のCIFファイルパス。

戻り値:

(substrate, film) の材料オブジェクト。

戻り値の型:

tuple[xrayutilities.materials.Crystal, xrayutilities.materials.Crystal]

randomize_param_set_for_pso(base_param_set, optimize_names)[ソース]

PSOの初期化のために、最適化対象のパラメータをランダムな値に設定した新しいパラメータセットを生成します。

詳細説明:

base_param_set をクローンし、optimize_names に含まれる各パラメータについて、 get_param_bounds で定義された範囲内で一様乱数を用いて値を設定します。

:param : param base_param_set: dict: 基準となるパラメータセット(最適化対象外の値を保持するために使用)。 :param : param optimize_names: list[str]: ランダム化する最適化対象のパラメータ名のリスト。

戻り値:

ランダム化された最適化対象パラメータを持つ新しいパラメータセット。

戻り値の型:

dict

read_data(infile, substrate, film, energy)[ソース]

XRDデータファイルを読み込むか、ファイルが指定されていない場合は模擬データを生成します。

詳細説明:

infile が空文字列の場合、TARGET_X, TARGET_RELAX, TARGET_THICK で定義されたターゲットパラメータを使用して模擬XRDパターンを生成します。 infile が指定されている場合は、read_text_data を呼び出してファイルを読み込みます。

:paramparam infile: str: 2theta-intensityデータを含むテキストファイルへのパス。

空の場合は模擬データを生成します。

:param : param substrate: xu.materials.Crystal: 基板材料オブジェクト。 :param : param film: xu.materials.Crystal: 膜材料オブジェクト。 :param : param energy: float: X線エネルギー [eV]。

戻り値:

(2theta角度の配列 [deg], omega角度の配列 [deg], 強度値の配列)。

戻り値の型:

tuple[numpy.ndarray, numpy.ndarray, numpy.ndarray]

read_parameters(parameter_file)[ソース]

CSVファイルからパラメータ設定を読み込みます。ファイルが存在しない場合はデフォルト値を返します。

詳細説明:

指定されたCSVファイルからパラメータ名、値、最適化IDを読み込み、 make_default_parameter_sets の形式に沿った辞書構造を構築します。 CSVファイルのヘッダーが不正な場合や、ファイルが空の場合は、警告を出力し デフォルトのパラメータセットを返します。

:param : param parameter_file: str: パラメータCSVファイルへのパス。

戻り値:

読み込まれたパラメータセットの辞書。

ファイルが存在しない場合や無効な場合は、デフォルトのパラメータセットが返されます。

戻り値の型:

dict[str, dict]

read_text_data(infile)[ソース]

テキストファイルから2列データ (2theta, intensity) を読み込みます。

詳細説明:

指定されたテキストファイルから数値データを読み込み、 1列目を2theta角度、2列目を強度として解釈します。 ファイルが存在しない場合や、フォーマットが不正な場合はエラーで終了します。 omega角度は2thetaの半分として計算されます。

:param : param infile: str: 2theta-intensityデータを含むテキストファイルへのパス。

戻り値:

(2theta角度の配列 [deg], omega角度の配列 [deg], 強度値の配列)。

戻り値の型:

tuple[numpy.ndarray, numpy.ndarray, numpy.ndarray]

replace_pso_parameter_sets(param_sets, candidate_sets)[ソース]

PSOモード用の粒子パラメータセットを更新します。

詳細説明:

param_sets からPSO関連の既存のパラメータセットを削除し、 candidate_sets から新しいPSO粒子パラメータセットを追加します。 PSOのプレフィックスを持たないセットは保持されます。

:param : param param_sets: dict: 現在の全てのパラメータセット。 :param : param candidate_sets: list[dict]: PSOの新しい粒子パラメータセットのリスト。

戻り値:

PSO粒子パラメータが更新された新しいパラメータセット辞書。

戻り値の型:

dict

save_guess_cluster_csv(outfile, cluster_rows)[ソース]

膜厚推定モードで解析したクラスター(膜厚候補)情報をCSVファイルに保存します。

:param : param outfile: str: 保存先ファイルパス。 :param : param cluster_rows: list[dict]: クラスター情報を含む辞書のリスト。

各辞書は cluster_id, npeaks, dq_est, thick_fft, thick_reg, confidence のキーを持つと期待されます。

save_guess_peak_csv(outfile, peak_rows)[ソース]

膜厚推定モードで検出したピーク情報をCSVファイルに保存します。

:param : param outfile: str: 保存先ファイルパス。 :param : param peak_rows: list[dict]: ピーク情報を含む辞書のリスト。

各辞書は cluster_id, n, q, twotheta, used_stage1, used_stage2, resid_stage1, resid_stage2 のキーを持つと期待されます。

save_parameters(parameter_file, param_sets)[ソース]

現在のパラメータセットをCSVファイルに書き出します。

詳細説明:

param_sets 辞書に格納されている全てのパラメータ(複数のセットを含む)を、 "varname", "value", "optid" のヘッダーを持つCSV形式で指定されたファイルに保存します。 各パラメータ名は set_name:varname の形式で保存されます。

:param : param parameter_file: str: パラメータを保存するファイルパス。 :param : param param_sets: dict[str, dict]: 保存するパラメータデータ。

set_best_parameter_set(param_sets, param_set)[ソース]

現在の最良のパラメータセットを param_sets 辞書内の DEFAULT_PRIMARY_SET キーに保存します。

詳細説明:

これにより、最適化の進捗に合わせて最良の解が常に追跡され、 プログラムの実行終了時や中断時に最新の最良パラメータが保存されます。

:param : param param_sets: dict: 複数のパラメータセットを管理する辞書。 :param : param param_set: dict: 最良とみなされる単一のパラメータセット。

show_final_live_plot_wait(fig)[ソース]

ライブプロットを非インタラクティブモードに切り替え、ウィンドウが閉じるまで待機します。

詳細説明:

最適化が完了した後、最終結果を表示したプロットウィンドウを ユーザーが手動で閉じるまで保持します。

:param : param fig: matplotlib.figure.Figure: 待機するFigureオブジェクト。

simulate(dyn_model, omega)[ソース]

動的理論モデルを使用してXRD強度分布を計算します。

:param : param dyn_model: xu.simpack.DynamicalModel: 計算に使用する構築済みモデル。 :param : param omega: numpy.ndarray: 計算する角度範囲のomega値の配列 [deg]。

戻り値:

計算されたXRD強度分布の配列。

戻り値の型:

numpy.ndarray

unpack_optimize_values(base_param_set, optimize_names, xvec)[ソース]

NumPy配列の値を、指定されたパラメータ名の順序に従って元のパラメータ辞書形式に戻します。

詳細説明:

base_param_set をクローンし、optimize_names の順序で xvec の値で更新します。 これにより、最適化ルーチンから返された値をパラメータセットに適用できます。

:param : param base_param_set: dict: 基準となるパラメータセット(最適化対象外の値を保持するために使用)。 :param : param optimize_names: list[str]: 最適化対象のパラメータ名のリスト。 :param : param xvec: numpy.ndarray: 最適化によって得られたパラメータ値の配列。

戻り値:

更新されたパラメータセット。

戻り値の型:

dict

update_live_plot(fig, line_fit, text_box, omega, int_fit, text_lines)[ソース]

作成済みのライブプロットの内容を更新します。

詳細説明:

CurrentFit のラインデータを新しいフィッティング強度 (int_fit) で更新し、 テキストボックスの内容を text_lines で更新してプロットを再描画します。 これにより、最適化の進捗がリアルタイムで視覚的に確認できます。

:param : param fig: matplotlib.figure.Figure: 更新するFigureオブジェクト。 :param : param line_fit: matplotlib.lines.Line2D: CurrentFit のLine2Dオブジェクト。 :param : param text_box: matplotlib.text.Text: 更新するテキストボックスのTextオブジェクト。 :param : param omega: numpy.ndarray: 角度軸 (omega) の配列 [deg]。 :param : param int_fit: numpy.ndarray: 現在のフィッティング強度。 :param : param text_lines: list[str]: テキストボックスに表示するテキスト行のリスト。

update_rrange(res)[ソース]

残差値に基づいて、ランダム探索の探索範囲 (rrange) を動的に調整します。

詳細説明:

残差が大きい場合は探索範囲を広げ、小さい場合は狭めることで、 最適化の効率を向上させます。残差が5.0より大きい場合は0.5を返し、 それ以外の場合は残差の1/10を返します。

:param : param res: float: 現在の残差値。

戻り値:

更新された探索範囲の係数。

戻り値の型:

float