xrd_fit.py のMarkdownドキュメントを以下に示します。

# ``xrd_fit.py``

## 概要

このスクリプトは、実験的に測定されたX線回折(XRD)パターンと、結晶構造情報ファイル(CIF)から計算された理論的なXRDパターンを比較・分析するためのツールです。主な機能として、パターンプロット、相関分析、オーバーラップチェック、およびLASSO回帰による混合相の定量フィッティングを提供します。

## 詳細説明

本スクリプトは、様々なモードでXRDデータ解析を実行します。

-   ``plot_all``: 実験XRDパターンと各CIF由来の理論XRDパターンを個別のグラフに表示します。
-   ``plot_one``: 実験XRDパターンと各CIF由来の回折ピーク位置を一つのグラフに表示します。
-   ``plot_one2``: 実験XRDパターンと各CIF由来の理論XRDパターンを一つのグラフに表示します。
-   ``overwrap``: 異なるCIFパターン間のオーバーラップ(重なり)を評価します。
-   ``CIFcorrelation``: CIFパターン間の相関係数を評価します。
-   ``correlation``: 実験パターンとCIFパターン間の相関係数を評価します。
-   ``fit``: LASSO回帰を用いて実験パターンを背景とCIFパターンでフィッティングし、各相の寄与を定量化します。

スマアリング(ブロードニング)効果や背景処理もサポートしています。

## 関連リンク

xrd_fit_usage

## 非標準ライブラリ

本プログラムは以下の非標準ライブラリに依存しています。

-   ``tklib``:
    -   ``tklib.tkapplication``
    -   ``tklib.tkfile``
    -   ``tklib.tkutils``
    -   ``tklib.tkvariousdata``
    -   ``tklib.tksci.tksci``
    -   ``tklib.tksci.tkmatrix``
    -   ``tklib.tkcrystal.tkxrd``
    -   ``tklib.tkgraphic.tkplotevent``

## コマンドライン引数

``xrd_fit.py`` は以下のコマンドライン引数を取ります。引数の順序は固定されています。

| 引数番号 | 変数名        | 型      | 説明                                                    | デフォルト値          |
| :------- | :------------ | :------ | :------------------------------------------------------ | :-------------------- |
| 1        | ``mode``      | str     | 実行モード (``plot``, ``overwrap``, ``fit`` など)     | ``plot``              |
| 2        | ``plugin_dir`` | str     | プラグインディレクトリのパス                            | ``filter``            |
| 3        | ``infile``    | str     | 入力実験XRDデータファイルのパス                         | ``*.txt``             |
| 4        | ``cif_files`` | str     | CIFファイル群へのパスまたはワイルドカード               | ``data/*.*``          |
| 5        | ``wavelength`` | str     | X線波長の種類 (例: ``CuKa``)                            | ``CuKa``              |
| 6        | ``xmin``      | float   | 2$\theta$の最小値                                       | ``20.0``              |
| 7        | ``xmax``      | float   | 2$\theta$の最大値                                       | ``120.0``             |
| 8        | ``xstep``     | float   | 2$\theta$のステップ幅                                   | ``0.02``              |
| 9        | ``fwhm``      | float   | 回折ピークの半値幅 (FWHM)                               | ``0.2``               |
| 10       | ``Gfraction`` | float   | ガウス成分の割合 (0.0:ローレンツ, 1.0:ガウス)           | ``0.5``               |
| 11       | ``fwhm_smear`` | float   | スマアリングに用いるFWHM                                | ``0.0``               |
| 12       | ``Gfraction_smear`` | float   | スマアリングに用いるガウス成分の割合                    | ``0.0``               |
| 13       | ``yscale``    | str     | Y軸のスケール (``linear`` または ``log``)             | ``linear``            |
| 14       | ``BGorder``   | int     | 背景多項式の次数                                       | ``3``                 |
| 15       | ``alpha``     | float   | LASSO回帰の正則化パラメータ                           | ``0.1``               |

## グローバルパラメータ

スクリプト内で定義されているグローバルパラメータは以下の通りです。

-   ``module_names``: ロードされたモジュール名のリスト (初期値: 空リスト ``[]``)。
-   ``modules``: ロードされたモジュールオブジェクトのリスト (初期値: 空リスト ``[]``)。
-   ``markers``: プロットに使用するマーカーシンボルのリスト。
    -   ``['o', 's', '+', 'x', 'D', 'v', '^', '<', '>', '8', 'h', 'H']``
-   ``colors``: プロットに使用する色のリスト。
    -   ``['black', 'red', 'blue', 'darkgreen', 'darkorange', 'hotpink', 'lightgreen', 'cyan', 'yellow', 'magenta', 'chocolate', 'navy', 'slategray', 'olive']``
-   ``figsize``: 標準のフィギュアサイズ。
    -   ``(12, 8)``
-   ``figsize_one``: 単一プロット用のフィギュアサイズ。
    -   ``(10, 6)``
-   ``figsize_coeff``: 係数プロット用のフィギュアサイズ。
    -   ``(8, 6)``
-   ``fontsize``: プロットのフォントサイズ。
    -   ``12``
-   ``legend_fontsize``: 凡例のフォントサイズ。
    -   ``8``
-   ``legend_fontsize_one``: 単一プロットの凡例のフォントサイズ。
    -   ``12``

## 関数説明

### ``usage()``

コマンドライン引数の使い方を表示する。

**詳細説明:**
アプリケーションとパラメータオブジェクトから利用方法文字列を取得し、整形して標準出力に出力する。

**引数:**
-   ``app``: ``tkApplication`` のインスタンス。
-   ``cparams``: 設定パラメータを保持するオブジェクト。

**戻り値:**
なし

### ``initialize()``

アプリケーションのパラメータを初期値で設定する。

**詳細説明:**
デバッグフラグ、プラグインディレクトリ、モード、入力ファイルパス、CIFファイルパス、X線波長、2$\theta$範囲、FWHM、ガウス比率、Yスケール、背景次数、LASSOのalphaなどの初期値を設定する。

**引数:**
-   ``app``: ``tkApplication`` のインスタンス。
-   ``cparams``: 設定パラメータを保持するオブジェクト。

**戻り値:**
なし

### ``update_vars()``

コマンドライン引数に基づいて設定パラメータを更新する。

**詳細説明:**
``sys.argv`` から引数を取得し、``cparams`` オブジェクトの対応する属性に設定する。数値型引数は適切な型に変換される。

**引数:**
-   ``app``: ``tkApplication`` のインスタンス。
-   ``cparams``: 設定パラメータを保持するオブジェクト。

**戻り値:**
なし

### ``read_file()``

指定されたパスのファイルを読み込み、その内容を処理する。

**詳細説明:**
登録されているモジュールを順に試行し、ファイルのタイプを判別する。ファイルタイプが一致したモジュールを使用してデータを読み込み、必要に応じて変換する。

**引数:**
-   ``path``: str. 読み込むファイルのパス。
-   ``app``: ``tkApplication`` のインスタンス。
-   ``cparams``: 設定パラメータを保持するオブジェクト。

**戻り値:**
tuple. (``module``, ``inf``). ``module`` はファイルを読み込んだモジュールオブジェクト、``inf`` は読み込まれたデータを含む辞書。ファイルが読み込めない場合は (``None``, ``None``).

### ``read_all_files()``

入力XRDファイルとすべてのCIFファイルを読み込む。

**詳細説明:**
``cparams.infile`` で指定された入力XRDファイルを読み込み、その2$\theta$範囲に基づいて解析範囲を調整する。``cparams.cif_files`` で指定されたマスクに一致するCIFファイルをすべて読み込み、変換処理を行う。``input_only`` が ``True`` の場合、入力ファイルのみを読み込む。

**引数:**
-   ``app``: ``tkApplication`` のインスタンス。
-   ``cparams``: 設定パラメータを保持するオブジェクト。
-   ``input_only``: bool. ``True`` の場合、入力ファイルのみを読み込む。

**戻り値:**
dict. 読み込まれたモジュールとデータを含む辞書。キーは ``"module_input"``, ``"module_cif"``, ``"inf_input"``, ``"inf_cif_list"``。

### ``max_none()``

``None`` 値を含むリストまたはイテラブルの最大値を返す。

**詳細説明:**
入力されたリスト ``x`` の要素から ``None`` を除外し、残りの数値の最大値を計算する。数値要素が一つもない場合は、非常に小さい負の値を返す。

**引数:**
-   ``x``: list or iterable. 数値と ``None`` を含むリストまたはイテラブル。

**戻り値:**
float. 最大値。

### ``min_none()``

``None`` 値を含むリストまたはイテラブルの最小値を返す。

**詳細説明:**
入力されたリスト ``x`` の要素から ``None`` を除外し、残りの数値の最小値を計算する。数値要素が一つもない場合は、非常に大きい正の値を返す。

**引数:**
-   ``x``: list or iterable. 数値と ``None`` を含むリストまたはイテラブル。

**戻り値:**
float. 最小値。

### ``normalize_none()``

``None`` 値を含むリストの要素を指定された範囲に正規化する。

**詳細説明:**
リスト ``l`` の数値要素を ``[vmin, vmax]`` の範囲から ``[Amin, Amax]`` の範囲に線形変換して正規化する。``vmin`` または ``vmax`` が指定されない場合は、リスト内の ``None`` 以外の要素から自動的に計算される。``None`` 値は変更されない。

**引数:**
-   ``l``: list. 数値と ``None`` を含むリスト。
-   ``Amin``: float. 正規化後の最小値。デフォルトは ``0.0``。
-   ``Amax``: float. 正規化後の最大値。デフォルトは ``1.0``。
-   ``vmin``: float, optional. 元データの最小値。指定しない場合は自動計算。
-   ``vmax``: float, optional. 元データの最大値。指定しない場合は自動計算。

**戻り値:**
list. 正規化されたリスト。

### ``normalize()``

数値リストの要素を指定された範囲に正規化する。

**詳細説明:**
リスト ``l`` の要素を ``[vmin, vmax]`` の範囲から ``[Amin, Amax]`` の範囲に線形変換して正規化する。``vmin`` または ``vmax`` が指定されない場合は、リスト内の要素から自動的に計算される。入力リストが ``None`` の場合は ``None`` を返す。

**引数:**
-   ``l``: list. 数値のリスト。
-   ``Amin``: float. 正規化後の最小値。デフォルトは ``0.0``。
-   ``Amax``: float. 正規化後の最大値。デフォルトは ``1.0``。
-   ``vmin``: float, optional. 元データの最小値。指定しない場合は自動計算。
-   ``vmax``: float, optional. 元データの最大値。指定しない場合は自動計算。

**戻り値:**
list or None. 正規化されたリスト、または入力が ``None`` の場合は ``None``。

### ``plot_all()``

実験XRDパターンとCIFからの理論パターンを個別のサブプロットに表示する。

**詳細説明:**
入力された実験XRDパターンを最上段のサブプロットに表示し、その後、読み込まれた各CIFファイルから計算されたXRDパターンをそれぞれ異なるサブプロットに表示する。各理論パターンには回折ピーク位置もプロットされる。すべてのプロットは共通の2$\theta$軸を共有する。

**引数:**
-   ``inf``: dict. 読み込まれたデータを含む辞書。
-   ``app``: ``tkApplication`` のインスタンス。
-   ``cparams``: 設定パラメータを保持するオブジェクト。

**戻り値:**
なし

### ``plot_input()``

入力された実験XRDパターンのみをプロットする。

**詳細説明:**
``inf`` から実験XRDデータを取得し、一つのグラフにプロットする。Y軸のスケールは ``cparams.yscale`` に従う。

**引数:**
-   ``inf``: dict. 読み込まれたデータを含む辞書。
-   ``app``: ``tkApplication`` のインスタンス。
-   ``cparams``: 設定パラメータを保持するオブジェクト。

**戻り値:**
なし

### ``plot_one()``

実験XRDパターンとCIFからの回折ピーク位置を同じグラフに表示する。

**詳細説明:**
入力された実験XRDパターンと、読み込まれた各CIFファイルから計算された回折ピーク位置(強度は正規化)を同一のグラフにプロットする。これにより、実験パターンと各結晶相のピーク位置の関係を一度に確認できる。

**引数:**
-   ``inf``: dict. 読み込まれたデータを含む辞書。
-   ``app``: ``tkApplication`` のインスタンス。
-   ``cparams``: 設定パラメータを保持するオブジェクト。

**戻り値:**
なし

### ``plot_one2()``

実験XRDパターンとCIFからの理論XRDパターンを同じグラフに表示する。

**詳細説明:**
入力された実験XRDパターンと、読み込まれた各CIFファイルから計算された理論XRDパターン(ブロードニング適用済み)を同一のグラフにプロットする。これにより、実験パターンと各結晶相の回折プロファイルの形状を一度に比較できる。

**引数:**
-   ``inf``: dict. 読み込まれたデータを含む辞書。
-   ``app``: ``tkApplication`` のインスタンス。
-   ``cparams``: 設定パラメータを保持するオブジェクト。

**戻り値:**
なし

### ``convolution()``

データ ``y`` を指定された ``filter`` で畳み込む。

**詳細説明:**
離散的な畳み込み演算を実行し、``y`` の各点において ``filter`` を適用して平滑化された(またはブロードニングされた)データ ``yc`` を生成する。``nskip`` パラメータで畳み込みの計算間隔を制御し、結果のデータ点数を減らすことができる。

**引数:**
-   ``x``: list or array. x座標のリスト。
-   ``y``: list or array. 畳み込み対象のy座標のリスト。
-   ``filter``: list or array. 畳み込みに使用するフィルタの配列。
-   ``nskip``: int. 畳み込み計算をスキップする間隔。1の場合、すべての点で計算する。

**戻り値:**
tuple. (``_x``, ``_y``). 畳み込み後のx座標とy座標のリスト。``y`` が ``None`` の場合は ``None`` を返す。

### ``collect_data()``

フィッティングや相関分析のために、実験および理論XRDデータを収集・前処理する。

**詳細説明:**
入力された実験XRDデータと各CIFファイルから計算された理論XRDデータを統一された2$\theta$範囲に補間し、スマアリング(畳み込み)と正規化を適用する。さらに、背景多項式のための基底関数も準備する。

**引数:**
-   ``inf``: dict. 読み込まれたデータを含む辞書。
-   ``app``: ``tkApplication`` のインスタンス。
-   ``cparams``: 設定パラメータを保持するオブジェクト。
-   ``is_print``: bool. 処理の詳細をコンソールに出力するかどうか。

**戻り値:**
tuple. (``Q2_list``, ``yobs_infile``, ``ysim_infile``, ``bg_names``, ``bg_list``, ``sample_names``, ``ycif_list``, ``labels_train``, ``x_train``)。
-   ``Q2_list``: list. 共通の2$\theta$座標のリスト。
-   ``yobs_infile``: list. 前処理された実験XRD強度データ。
-   ``ysim_infile``: list or None. 前処理されたシミュレーションXRD強度データ(存在する場合)。
-   ``bg_names``: list. 背景多項式のラベルのリスト。
-   ``bg_list``: list. 背景多項式の基底関数(レジェンドル多項式)のリスト。
-   ``sample_names``: list. CIFファイルから取得した試料名またはファイルボディ名のリスト。
-   ``ycif_list``: list. 各CIFファイルから計算され前処理された理論XRD強度データのリスト。
-   ``labels_train``: list. 学習データ(``x_train``)の各列に対応するラベルのリスト。
-   ``x_train``: list. 学習データとなる背景多項式と理論XRD強度のリスト。

### ``check_overwrap()``

異なるCIFファイル由来のXRDパターン間のオーバーラップ(重なり)をチェックし、可視化する。

**詳細説明:**
各CIFファイルの回折ピークが、他のCIFファイルから生成された回折パターンとどの程度重なっているかを計算し、その結果をプロットする。これにより、複数の結晶相が混在する場合に、各相のピークが互いに干渉する度合いを評価できる。

**引数:**
-   ``inf``: dict. 読み込まれたデータを含む辞書。
-   ``app``: ``tkApplication`` のインスタンス。
-   ``cparams``: 設定パラメータを保持するオブジェクト。

**戻り値:**
なし

### ``CIF_correlation()``

CIFファイルから生成されたXRDパターン間の相関係数を計算し、可視化する。

**詳細説明:**
すべてのCIFファイルから生成された理論XRDパターン間の相関係数を計算し、結果をテキストで出力する。また、各CIFパターンと入力実験パターンとの相関係数を、スマアリングFWHMを変化させながらプロットし、最も相関の高いスマアリング条件や、異なる相間の類似性を評価する。

**引数:**
-   ``inf``: dict. 読み込まれたデータを含む辞書。
-   ``app``: ``tkApplication`` のインスタンス。
-   ``cparams``: 設定パラメータを保持するオブジェクト。

**戻り値:**
なし

### ``correlation()``

入力された実験XRDパターンとCIFファイルから生成された理論パターンとの相関係数を計算し、可視化する。

**詳細説明:**
実験XRDパターンと、読み込まれた各CIFファイルから計算された理論XRDパターン間の相関係数を計算し、結果をテキストで出力する。さらに、これらの相関係数をスマアリングFWHMを変化させながらプロットし、最も相関の高い相や適切なスマアリング条件を評価する。

**引数:**
-   ``inf``: dict. 読み込まれたデータを含む辞書。
-   ``app``: ``tkApplication`` のインスタンス。
-   ``cparams``: 設定パラメータを保持するオブジェクト。

**戻り値:**
なし

### ``fit()``

LASSO回帰を用いて実験XRDパターンを背景とCIF由来の理論パターンでフィッティングする。

**詳細説明:**
実験XRDパターンを目的変数、背景多項式と各CIFファイルから計算された理論XRDパターンを説明変数として、LASSO回帰を実行する。異なる ``alpha`` 値での係数変化とRMSEの変化をプロットし、最終的に指定された ``alpha`` 値でのフィッティング結果(係数、RMSE、MAV)とフィッティングされたパターンをプロットで表示する。

**引数:**
-   ``inf``: dict. 読み込まれたデータを含む辞書。
-   ``app``: ``tkApplication`` のインスタンス。
-   ``cparams``: 設定パラメータを保持するオブジェクト。

**戻り値:**
なし

### ``main()``

メイン関数。XRD解析スクリプトのエントリポイント。

**詳細説明:**
アプリケーションの初期化、パラメータの読み込みと更新、プラグインモジュールのロード、および指定されたモードに応じたXRD解析処理(プロット、相関分析、フィッティングなど)を実行する。処理のログはファイルにも出力される。

**戻り値:**
なし

## 入出力仕様

### 入力ファイル

-   **実験XRDデータファイル**:
    -   コマンドライン引数 ``infile`` で指定されるファイル(例: ``*.txt``)。
    -   ファイル形式は ``plugin_dir`` で指定されたディレクトリ内のプラグインモジュールによって自動的に判別され、読み込まれます。
    -   通常、2$\theta$値と強度値を含むテキストファイルが想定されます。
-   **CIFファイル**:
    -   コマンドライン引数 ``cif_files`` で指定されるファイル群(例: ``data/*.*``)。
    -   結晶構造情報ファイル(CIF形式)であり、回折ピークの計算に利用されます。
    -   ファイル形式はプラグインモジュールによって判別されます。

### 出力ファイル

-   **ログファイル**:
    -   入力ファイル名に基づいて自動生成されます(例: ``{filebody}-out.txt``)。
    -   スクリプトの実行ログ、パラメータ、計算結果の概要などがテキスト形式で記録されます。
-   **グラフィカル出力**:
    -   ``matplotlib`` を用いて生成されるプロットが画面上に表示されます。これには、XRDパターン、回折ピーク位置、オーバーラップ、相関係数、フィッティング結果などが含まれます。
    -   画像ファイルとしての出力機能は、コードからは確認できません。表示されたプロットを手動で保存することは可能です。

## 使用例

```bash
python xrd_fit.py plot_all  {infile} {wavelength} {xmin} {xmax} {xstep} {fwhm} {yscale} {BGorder} {alpha}
python xrd_fit.py plot_one  {infile} {wavelength} {xmin} {xmax} {xstep} {fwhm} {yscale} {BGorder} {alpha}
python xrd_fit.py plot_one2 {infile} {wavelength} {xmin} {xmax} {xstep} {fwhm} {yscale} {BGorder} {alpha}
python xrd_fit.py fit       {infile} {wavelength} {xmin} {xmax} {xstep} {fwhm} {yscale} {BGorder} {alpha}