ft_exafs_scan プログラム仕様
ft_exafs_scan.py
EXAFSデータのk空間におけるFFT/MEM変換ツールです。
- 入力データ:
Column 0 : k [A^-1] Column 1 : signal, 通常 chi(k), k^2 chi(k) など。
- 主な機能:
EXAFS R軸補正: chi(k) ~ sin(2 k R + phase) に基づき、R = pi * frequency を使用。
変換モード: fft, mem, both のいずれかを選択可能。
FFT出力: real, imag, amplitude, power を選択可能。
ゼロパディング: --npadding オプションで制御(デフォルト 1024)。
k重み付け: --korder オプションで制御。
EXAFSスタイルのハニング窓: --hrange と --hwidth オプションで制御。
- パラメータスキャンオーバーレイ:
--scan_order START STEP N --scan_hmin START STEP N --scan_hmax START STEP N --scan_korder START STEP N --scan_npadding START STEP N
- オプションの正規化:
--normalize none|max
- 使用例:
# 通常のFFT python ft_exafs_scan.py data.xlsx --mode fft --korder 0 --hrange 2 12 --hwidth 0.5
# MEM, 固定次数 20 python ft_exafs_scan.py data.xlsx 20 --mode mem --korder 0 --hrange 2 12 --hwidth 0.5
# MEM次数をスキャン: 10,20,30,40,50 python ft_exafs_scan.py data.xlsx --mode mem --scan_order 10 10 5 --korder 0 --hrange 2 12 --hwidth 0.5
# ハニング窓の幅をスキャン: 0.2,0.4,0.6,0.8,1.0 python ft_exafs_scan.py data.xlsx --mode fft --scan_hwidth 0.2 0.2 5 --korder 0 --hrange 2 12
# 形状比較のために各曲線を最大値1に正規化してスキャン python ft_exafs_scan.py data.xlsx --mode mem --scan_order 20 20 5 --normalize max
- 関連リンク:
- spectrum_.ft_exafs_scan.apply_scan_value(args, scan_param, value, k)[ソース]
渡されたスキャンパラメータの値を args 名前空間に適用し、そのコピーを返します。
- 詳細説明:
元の args オブジェクトを変更しないように、まずコピーを作成します。 次に、`scan_param`に応じて対応する`args`属性に`value`を適用します。 `hrange`が設定されていない場合は、k軸の全範囲で初期化されます。
- パラメータ:
args (argparse.Namespace) -- コマンドライン引数を格納する元の名前空間オブジェクト。
scan_param (str) -- 変更するスキャンパラメータの名前。
k (numpy.ndarray) -- k軸データ。`hrange`の初期化に使用される場合があります。
- 戻り値:
指定されたスキャン値が適用された args 名前空間のコピー。
- 戻り値の型:
- 例外:
ValueError -- 未知のスキャンパラメータが指定された場合に発生します。
- spectrum_.ft_exafs_scan.calc_fft_exafs(signal_used, dk, nfft)[ソース]
EXAFSスタイルのFFTを計算します。
- 詳細説明:
FFTは np.fft.rfft を使用して計算されます。 EXAFSでは chi(k) ~ sin(2 k R + phi) の関係があるため、R軸は R = pi * frequency と定義されます。 積分スケールを模倣するために、FTの結果は dk を乗算されます。 結果として、複素FFT、実数部、虚数部、振幅、パワーが返されます。
- spectrum_.ft_exafs_scan.calc_mem_exafs(signal_used, dk, order, nfft)[ソース]
spectrum.pburg を使用してMEMスペクトルを計算します。
- 詳細説明:
Burg法(spectrum.pburg)を用いて最大エントロピー法 (MEM) スペクトルを計算します。 pburg.frequencies() は cycles/sample の単位で周波数を返すため、 EXAFSのR軸 (R = pi * frequency / dk) に変換されます。
- spectrum_.ft_exafs_scan.estimate_dk(k, rtol=0.001)[ソース]
k軸からk間隔(dk)を推定します。
- 詳細説明:
k軸の隣接する値の差分の平均値からk間隔を推定します。 k軸の均一性を相対標準偏差で評価し、均一でない場合は警告を表示します。 FFT/MEMは均一にサンプリングされたkデータを仮定するため、不均一な場合は注意が必要です。
- パラメータ:
k (numpy.ndarray) -- k軸データ。
rtol (float) -- k間隔の差分の相対標準偏差の許容範囲。この値を超えると警告が表示されます。デフォルトは1e-3。
- 戻り値:
推定されたk間隔と、k間隔の差分の相対標準偏差。
- 戻り値の型:
- 例外:
ValueError -- dkが0の場合に発生します。
- spectrum_.ft_exafs_scan.find_main_peak(R, y, rmin=1e-12)[ソース]
R=0を除外してメインピークを見つけます。
- 詳細説明:
指定されたR軸とyデータから、Rが`rmin`よりも大きい範囲でyの最大値を見つけ、 そのピークのR値とy値を返します。
- spectrum_.ft_exafs_scan.get_active_scan(args)[ソース]
アクティブなスキャンパラメータとその値を取得します。
- 詳細説明:
同時に指定できるスキャンパラメータは1つだけです。 複数のスキャンパラメータが指定された場合、エラーを発生させます。 選択されたスキャンパラメータとそれに対応する値のリストを返します。
- パラメータ:
args (argparse.Namespace) -- コマンドライン引数を格納する名前空間オブジェクト。
- 戻り値:
アクティブなスキャンパラメータの名前と、それに対応する値のリスト。 アクティブなスキャンがない場合は (None, None) を返します。
- 戻り値の型:
- 例外:
ValueError -- 複数のスキャンパラメータが指定された場合、または有効なスキャン値が生成されない場合に発生します。
- spectrum_.ft_exafs_scan.load_xy(infile, sheet=0, xcol=0, ycol=1)[ソース]
.xlsx/.csv/.txt/.datファイルからk軸と信号の列を読み込みます。
- 詳細説明:
指定された入力ファイルパスから、k軸と信号のデータを読み込みます。 ファイル形式はExcel (.xlsx)、CSV (.csv)、テキスト (.txt, .dat) をサポートします。 欠損値 (NaN, Inf) は除去され、データポイントが少ない場合はエラーとなります。 k軸が単調増加でない場合はソートされます。
- パラメータ:
- 戻り値:
k軸データと信号データ。
- 戻り値の型:
tuple[numpy.ndarray, numpy.ndarray]
- 例外:
ValueError -- サポートされていないファイル形式、2Dテーブルでないテキスト入力、 指定された列インデックスが存在しない、有効なデータポイントが少ない、 などの場合に発生します。
- spectrum_.ft_exafs_scan.main()[ソース]
スクリプトのメイン実行関数です。
- 詳細説明:
コマンドライン引数を解析し、データの読み込み、k軸間隔の推定、 FFT/MEM変換の実行、パラメータスキャン処理、結果のExcelファイルへの保存、 およびMatplotlibによる結果のプロットを行います。 エラーが発生した場合は、適切なメッセージを出力し、プログラムを終了します。
- 戻り値:
なし
- 戻り値の型:
None
- spectrum_.ft_exafs_scan.make_hanning_range_window(k, hrange=None, hwidth=0.5)[ソース]
k軸にEXAFSスタイルのハニング窓を作成します。
- 詳細説明:
指定されたk範囲(hrange)と窓幅(hwidth)に基づいて、ハニング窓を生成します。 `hrange`が指定されない場合、すべてのkに対して1.0の窓関数が返されます。 `hwidth`が0の場合、矩形窓が生成されます。 `2.0 * hwidth`が`hrange`の幅よりも大きい場合、`hwidth`は自動調整されます。
- パラメータ:
- 戻り値:
k軸と同じ長さのハニング窓配列。
- 戻り値の型:
numpy.ndarray
- 例外:
ValueError -- `hrange`に2つの異なる値が必要な場合、または`hwidth`が0未満の場合に発生します。
- spectrum_.ft_exafs_scan.make_output_filename(infile, mode, order, korder, scan_param=None)[ソース]
出力Excelファイル名を生成します。
- 詳細説明:
入力ファイル名、変換モード、MEM次数、k重み付け次数、およびオプションのスキャンパラメータに基づいて、 自動的に出力ファイル名を生成します。
- spectrum_.ft_exafs_scan.normalize_curve(y, method='none')[ソース]
プロットや比較のために1つの曲線を正規化します。
- 詳細説明:
`method`が"none"の場合、入力`y`は変更されずに返されます。 `method`が"max"の場合、`y`の有限値の絶対値の最大値で`y`全体を割って正規化します。 これは、MEMスペクトルのスケールがAR次数によって大きく変化する場合の比較に特に有用です。
- パラメータ:
y (numpy.ndarray) -- 正規化する曲線データ。
method (str) -- 正規化方法。"none"または"max"。デフォルトは"none"。
- 戻り値:
正規化された曲線データ。
- 戻り値の型:
numpy.ndarray
- 例外:
ValueError -- `method`が"none"または"max"以外の値の場合に発生します。
- spectrum_.ft_exafs_scan.normalized_label(label, normalize)[ソース]
プロットラベルに正規化タグを追加します。
- 詳細説明:
正規化方法が"max"の場合、元のラベルに / max を追加して返します。 それ以外の正規化方法の場合は、元のラベルをそのまま返します。
- spectrum_.ft_exafs_scan.plot_results(args, k, signal_raw, result, scan_results=None, scan_param=None)[ソース]
入力信号と窓関数、変換結果をプロットします。 スキャン結果が与えられた場合は、その曲線も重ねて表示します。
- 詳細説明:
matplotlibを使用して2つのサブプロットを生成します。 上段のサブプロットは、生の信号、前処理された信号、およびハニング窓関数を表示します。 下段のサブプロットは、FFTまたはMEMの変換結果を表示します。 `scan_results`が提供されている場合、各スキャンにおける変換曲線がオーバーレイされます。 正規化オプション、R軸の範囲制限、対数スケールなどのプロットオプションがサポートされます。 `--savefig`が指定されている場合、プロットは画像ファイルとして保存されます。
- パラメータ:
args (argparse.Namespace) -- コマンドライン引数を格納する名前空間オブジェクト。
k (numpy.ndarray) -- k軸データ。
signal_raw (numpy.ndarray) -- 生の信号データ。
scan_results (Optional[list[dict]]) -- スキャンモードの場合の各スキャン結果のリスト。デフォルトはNone。
scan_param (Optional[str]) -- アクティブなスキャンパラメータの名前。デフォルトはNone。
- 戻り値:
None
- spectrum_.ft_exafs_scan.preprocess_signal(k, signal_raw, korder=0.0, hrange=None, hwidth=0.5, remove_mean=False)[ソース]
k重み付け、オプションの平均減算、ハニング窓を適用して信号を前処理します。
- 詳細説明:
入力された生の信号に、`korder`に基づくk重み付けを適用します。 例えば、入力がchi(k)の場合、`korder=2`を指定するとk^2 chi(k)になります。 その後、`remove_mean`がTrueの場合、k重み付けされた信号から平均値が減算されます。 最後に、`make_hanning_range_window`で作成されたハニング窓が適用され、 変換に使用される最終的な信号が生成されます。
- パラメータ:
- 戻り値:
前処理された信号、k重み付けされた信号、平均値が減算された信号、および適用されたハニング窓。
- 戻り値の型:
tuple[numpy.ndarray, numpy.ndarray, numpy.ndarray, numpy.ndarray]
- spectrum_.ft_exafs_scan.run_transform_for_args(args, k, signal_raw, dk, quiet=False)[ソース]
指定された引数に基づいて、前処理と選択された変換を実行します。
- 詳細説明:
`preprocess_signal`関数を使用して入力信号を前処理します。 次に、`args.mode`に応じてFFT、MEM、または両方の変換を実行します。 MEM変換の場合、`select_ar_order`関数によりARモデルの次数が決定されます。 結果の概要は、`quiet`がFalseの場合にコンソールに出力されます。
- パラメータ:
args (argparse.Namespace) -- コマンドライン引数を格納する名前空間オブジェクト。
k (numpy.ndarray) -- k軸データ。
signal_raw (numpy.ndarray) -- 生の信号データ。
dk (float) -- k軸の平均k間隔。
quiet (bool) -- 結果の概要をコンソールに出力するかどうか。Trueの場合、出力は抑制されます。デフォルトはFalse。
- 戻り値:
変換結果を含む辞書。前処理された信号、FFT/MEM結果、AR次数選択情報などが含まれます。
- 戻り値の型:
- spectrum_.ft_exafs_scan.save_results_excel(outfile, args, k, signal_raw, dk, rel_std_dk, result, scan_results=None, scan_param=None)[ソース]
入力データ、FFT/MEM結果、およびスキャン結果をExcelファイルに保存します。
- 詳細説明:
結果は複数のシートに分割されて保存されます。 - Input シート: 生の信号、前処理された信号、窓関数など。 - FFT シート (FFTモードの場合): R軸、FFTの実数部、虚数部、振幅、パワー。正規化されたデータも含まれます。 - MEM シート (MEMモードの場合): R軸、MEMのPSD。正規化されたデータも含まれます。 - ScanSummary シート (スキャンモードの場合): 各スキャンパラメータ値でのピーク位置やパラメータの詳細。 - ScanCurves シート (スキャンモードの場合): 各スキャンにおける変換曲線のデータ。 - Summary シート: 変換に使用された主要なパラメータと情報。
- パラメータ:
outfile (str) -- 結果を保存するExcelファイルへのパス。
args (argparse.Namespace) -- コマンドライン引数を格納する名前空間オブジェクト。
k (numpy.ndarray) -- k軸データ。
signal_raw (numpy.ndarray) -- 生の信号データ。
dk (float) -- k軸の平均k間隔。
rel_std_dk (float) -- k間隔の差分の相対標準偏差。
scan_results (Optional[list[dict]]) -- スキャンモードの場合の各スキャン結果のリスト。デフォルトはNone。
scan_param (Optional[str]) -- アクティブなスキャンパラメータの名前。デフォルトはNone。
- 戻り値:
None
- spectrum_.ft_exafs_scan.scan_values(start, step, n, integer=False)[ソース]
スキャンパラメータの値を生成します。
- 詳細説明:
開始値 (start)、ステップサイズ (step)、およびステップ数 (n) に基づいて、 等間隔の数値のリストを生成します。`integer`がTrueの場合、値は整数に丸められます。
- spectrum_.ft_exafs_scan.select_ar_order(signal, preset_order=8, max_order=40, order_method='bic')[ソース]
AIC/BICまたは事前設定値に基づいてARモデルの次数を選択します。
- 詳細説明:
自己回帰 (AR) モデルの次数を選択するために、部分自己相関関数 (PACF)、 赤池情報量基準 (AIC)、ベイズ情報量基準 (BIC) を使用します。 PACFは診断情報として表示されますが、主要な次数選択にはAIC/BICが使われます。 `order_method`に基づいて、最適な次数が選択されます。
- パラメータ:
- 戻り値:
選択されたAR次数と、AIC/BICの情報を含む辞書。
- 戻り値の型:
- 例外:
ValueError -- `order_method`がサポートされていない値の場合に発生します。
- spectrum_.ft_exafs_scan.y_from_fft_result(fft_result, fft_plot)[ソース]
FFT結果からプロットに適したR軸とyデータを抽出します。
- 詳細説明:
`fft_plot`引数の値に基づいて、FFTの振幅、パワー、または実数部を返します。