以下に、Pythonスクリプト xrd_pymatgen.py のSphinx(MyST)でビルド可能なMarkdownドキュメントを作成します。

# ``xrd_pymatgen.py`` ドキュメント

## 概要

``xrd_pymatgen.py`` は、Pymatgenライブラリを使用して結晶のX線回折(``XRD``)パターンをシミュレーションし、結果をプロット・保存するPythonスクリプトです。

本スクリプトは、``CIF`` ファイルから結晶構造を読み込み、指定されたX線源(例: ``CuKa1``)と2θ範囲で ``XRD`` パターンを計算します。計算された個々の回折ピークに対してガウス関数を適用し、指定された半値半幅 (``FWHM``) でスムージングされたスペクトルを生成します。

結果の回折ピーク情報と生成されたスペクトルデータは、標準出力、指定されたログファイル、およびExcelファイルに保存されます。また、計算されたスペクトルと個々のピークは ``matplotlib`` によってプロットされ、視覚的に表示されます。コマンドライン引数により、入力 ``CIF`` ファイル、X線源、2θの最小値・最大値・ステップ、``FWHM`` などを柔軟に設定できます。

関連リンク:
*   Pymatgen XRDCalculator ドキュメント: https://pymatgen.org/pymatgen.analysis.diffraction.xrd.html
*   Pymatgenチュートリアル(Qiita): https://qiita.com/ojiya/items/1b154c3698cff91c8a2b
*   Pymatgen XRDソースコード (GitHub): https://github.com/materialsproject/pymatgen/blob/v2023.5.10/pymatgen/analysis/diffraction/xrd.py

## 非標準ライブラリ

本スクリプトは以下の非標準ライブラリを使用しています。

*   ``numpy``: 数値計算を行うための基盤ライブラリ。
*   ``scipy``: 科学技術計算ライブラリ。特に ``scipy.special`` は使用されていませんが、インポートされています。
*   ``matplotlib``: グラフ描画ライブラリ。特に ``matplotlib.pyplot`` が使用されます。
*   ``pymatgen``: 材料科学のためのPythonオープンソースライブラリ。
    *   ``pymatgen.core.periodic_table.Element``
    *   ``pymatgen.io.cif.CifParser``
    *   ``pymatgen.core.structure.Structure``
    *   ``pymatgen.core.lattice.Lattice``
    *   ``pymatgen.analysis.diffraction.xrd.XRDCalculator``
    *   ``pymatgen.analysis.diffraction.xrd.WAVELENGTHS``
    *   ``pymatgen.analysis.diffraction.tem.TEMCalculator`` (現在コードでは使用されていません)
    *   ``pymatgen.analysis.diffraction.neutron.NDCalculator`` (現在コードでは使用されていません)
*   ``tklib``: Tkinterベースのアプリケーション開発を補助するユーティリティライブラリ。
    *   ``tklib.tkapplication.tkApplication``
    *   ``tklib.tkutils.terminate``
    *   ``tklib.tkutils.pint`` (現在コードでは使用されていません)
    *   ``tklib.tkutils.pfloat`` (現在コードでは使用されていません)
    *   ``tklib.tkutils.getarg``
    *   ``tklib.tkutils.getintarg`` (現在コードでは使用されていません)
    *   ``tklib.tkutils.getfloatarg``
    *   ``tklib.tkvariousdata.tkVariousData``
    *   ``tklib.tkgraphic.tkplotevent.tkPlotEvent``

## スクリプトの実行方法

本スクリプトはコマンドライン引数を受け入れ、シミュレーションパラメータを柔軟に設定できます。

### コマンドライン引数

引数の位置と内容は以下の通りです。

1.  **入力ファイル名**: ``CIF`` 形式の結晶構造ファイル。デフォルトは ``SrTiO3.cif``。
2.  **X線源**: X線の種類。デフォルトは ``CuKa1``。利用可能なX線源は ``pymatgen`` の ``WAVELENGTHS`` で定義されています。
3.  **2θ最小値**: 2θの最小角度(度)。デフォルトは ``10.0``。
4.  **2θ最大値**: 2θの最大角度(度)。デフォルトは ``80.0``。
5.  **2θステップ**: 2θの計算ステップ(度)。デフォルトは ``0.02``。
6.  **FWHM**: ガウス関数の半値半幅(``FWHM``、度)。デフォルトは ``0.05``。

### 実行例

```bash
python xrd_pymatgen.py SrTiO3.cif CuKa1 10.0 80.0 0.02 0.05

上記はすべての引数を明示的に指定した例です。引数を省略した場合、対応するデフォルト値が使用されます。

python xrd_pymatgen.py my_structure.cif MoKa1

入力

入力ファイルは CIF (Crystallographic Information File) 形式の結晶構造データです。 スクリプトは CifParser を使用してこのファイルを解析します。

  • ファイル形式: CIF

  • デフォルトファイル名: SrTiO3.cif (コマンドライン引数で変更可能)

出力

スクリプトは以下の情報を出力します。

  • 標準出力 / ログファイル: 計算プロセス、パラメータ、回折ピークの詳細情報が標準出力および指定されたログファイルに出力されます。

    • ログファイル名: 入力 CIF ファイル名に基づいて自動生成されます (例: SrTiO3-out.txt)。

  • Excelファイル: 計算されたスムージングされた XRD スペクトルデータがExcelファイルに保存されます。

    • ファイル名: 入力 CIF ファイル名に基づいて自動生成されます (例: SrTiO3-pxrd.xlsx)。

    • 内容: 2列構成で、1列目に 2Theta (degree)、2列目に Intensity が含まれます。

  • グラフウィンドウ: matplotlib を用いて、計算されたスムージングされた XRD スペクトルと個々の回折ピークがプロットされたウィンドウが表示されます。

    • タイトル: infile - source: Xray_source

    • X軸: (度)

    • Y軸: Intensity

    • インタラクティブ機能: プロットイベントハンドラ (tkPlotEvent) により、カーソル位置のデータ情報(Q2, dhkl, hkl, multiplicity, Intensity)が表示される機能が提供されます。

関数

Gaussian(x, x0, whalf)

ガウス関数を計算します。

概要: ピークの中心と半値半幅を用いてガウス分布の値を計算します。 この関数は XRD パターンシミュレーションにおいて、各回折ピークの形状を表現するために使用されます。

引数:

  • x (float または numpy.ndarray): ガウス関数を評価する点または点の配列。

  • x0 (float): ガウス関数のピーク中心(位置)。

  • whalf (float): ガウス関数の半値半幅 (FWHM)。

戻り値:

  • float または numpy.ndarray: xにおけるガウス関数の値。

ガウス関数の定義:

I(x) = \exp \left( - \left( \frac{x - x_0}{a} \right)^2 \right)

ここで、awhalf / 0.832554611 です。

main()

XRD パターンシミュレーションのメイン処理を実行します。

概要: CIF ファイルから結晶構造を読み込み、X線回折パターンを計算して可視化・保存します。

引数: None (コマンドライン引数から設定を読み込みます)

戻り値: None

全体的な処理フロー

main() 関数内で、以下の順序で処理が実行されます。

  1. アプリケーション初期化と引数解析:

    • tkApplication() オブジェクトを初期化します。

    • コマンドライン引数を解析し、入力 CIF ファイル名 (infile)、X線源 (Xray_source)、2θ範囲 (Q2min, Q2max, Q2step)、FWHM (fwhm) などのパラメータを設定します。

  2. ログファイルと出力ファイルパスの設定:

    • ログファイル (logfile) および出力Excelファイル (outxlsxfile) のパスを入力ファイル名に基づいて生成します。

    • 標準出力をログファイルにもリダイレクトします。

  3. パラメータの表示:

    • 設定された入力ファイル、ログファイル、出力Excelファイル、X線源、2θ範囲、FWHM などの詳細情報を標準出力に表示します。

    • X線源が文字列の場合、pymatgenWAVELENGTHS 辞書から対応する波長を検索し表示します。

  4. 結晶構造の読み込み:

    • CifParser(infile) を使用して指定された CIF ファイルを解析します。

    • parser.get_structures() から結晶構造オブジェクト (mat) を取得します。

  5. 回折ピークの計算:

    • XRDCalculator(wavelength = Xray_source) を用いて XRD 計算機を初期化します。

    • xrd.get_pattern(mat, two_theta_range = (...)) を呼び出し、指定された2θ範囲で回折ピークデータ (diffractions) を計算します。この際、計算範囲はユーザー指定の Q2min, Q2maxdQ2 を加減した範囲に拡張されます。

    • 計算された回折ピークの2θ角度 (Q2)、面間隔 (dhkl)、ミラー指数 (hkl)、多重度 (mul)、強度 (Int) を抽出します。

  6. 回折ピーク情報の表示:

    • 計算された回折ピークの数と各ピークの詳細(hkl、m、dhkl、2Theta、Intensity)を標準出力に表示します。

  7. スムージングされたスペクトルの計算:

    • Q2min から Q2max までの2θ範囲を Q2step 間隔でサンプリングした配列 (xQ2) を生成します。

    • 各回折ピークに対し、中心位置と FWHM を用いて Gaussian() 関数を適用し、スペクトル (xrd_cal) を累積的に構築します。

  8. Excelファイルへの保存:

    • tkVariousData().to_excel() を使用して、計算された xQ2xrd_cal データをExcelファイルに保存します。

  9. プロット:

    • matplotlib.pyplot を用いてプロットウィンドウとサブプロットを生成します。

    • スムージングされた XRD スペクトル (xQ2, xrd_cal) を黒線でプロットします。

    • 個々の回折ピーク (Q2, Int) を赤い丸マーカーでプロットします。

    • tkPlotEvent を使用してインタラクティブなイベントハンドラを登録し、カーソル位置のデータ情報表示を可能にします。

    • X軸、Y軸のラベルとタイトルを設定し、レイアウトを調整します。

    • プロットを表示 (plt.pause(0.1)) します。

    • 現在、コード内の mode 変数による xrd.plot_structures()nd.plot_structures()tem.get_plot_2d() の呼び出し部分はコメントアウトされており、実行されません。

  10. スクリプトの終了:

    • app.terminate(pause = True) を呼び出し、ユーザーがキーを押すまでスクリプトを一時停止して終了します。

定数・グローバル変数

スクリプト内で定義されている主要な定数およびグローバル変数は以下の通りです。コマンドライン引数によってこれらのデフォルト値を上書きできます。

  • infile (str): 入力 CIF ファイルのパス。

    • デフォルト値: 'SrTiO3.cif'

  • WAVELENGTHS (dict): pymatgenXRDCalculator で定義されている既知のX線源とその波長(オングストローム)の辞書。コメントアウトされていますが、X線源の波長検索に使用される可能性があります。

    # WAVELENGTHS = {
    #     "CuKa": 1.54184,
    #     "CuKa2": 1.54439,
    #     "CuKa1": 1.54056,
    #     "CuKb1": 1.39222,
    #     "MoKa": 0.71073,
    #     "MoKa2": 0.71359,
    #     "MoKa1": 0.70930,
    #     "MoKb1": 0.63229,
    #     "CrKa": 2.29100,
    #     "CrKa2": 2.29361,
    #     "CrKa1": 2.28970,
    #     "CrKb1": 2.08487,
    #     "FeKa": 1.93735,
    #     "FeKa2": 1.93998,
    #     "FeKa1": 1.93604,
    #     "FeKb1": 1.75661,
    #     "CoKa": 1.79026,
    #     "CoKa2": 1.79285,
    #     "CoKa1": 1.78896,
    #     "CoKb1": 1.63079,
    #     "AgKa": 0.560885,
    #     "AgKa2": 0.563813,
    #     "AgKa1": 0.559421,
    #     "AgKb1": 0.497082,
    # }
    
  • Xray_source (str): 使用するX線源の名称。

    • デフォルト値: 'CuKa1'

  • Q2min (float): 2θの最小角度(度)。

    • デフォルト値: 10.0

  • Q2max (float): 2θの最大角度(度)。

    • デフォルト値: 80.0

  • Q2step (float): 2θの計算ステップ(度)。

    • デフォルト値: 0.02

  • fwhm (float): ガウス関数の半値半幅 (FWHM、度)。

    • デフォルト値: 0.05

  • figsize (tuple): matplotlib のプロット図のサイズ(インチ)。

    • デフォルト値: (8, 4)

  • fontsize (int): プロットのフォントサイズ。

    • デフォルト値: 12