test_lsq_latt2 プログラム仕様

lsq_latt2.py スクリプトのフルシステムテストモジュール。

さまざまな結晶系(三斜晶、単斜晶、直方晶、正方晶、立方晶、三方晶、六方晶) に対して、格子定数計算プログラム lsq_latt2.py が正しく動作するかを検証します。 結晶の反射データ(2θ)をシミュレートし、ノイズを付加した後、 lsq_latt2.py を実行し、その出力結果を期待される値と比較します。

関連リンク: test_lsq_latt2.py

class XRD.test_lsq_latt2.CellCase(ls: int, name: str, a: float, b: float, c: float, alpha: float, beta: float, gamma: float)

ベースクラス: object

テストケースとして使用する結晶セルの情報を保持するデータクラス。

理論的な格子定数と結晶系タイプを定義します。

a: float

実格子定数 a (Å).

alpha: float

実格子定数 α (度).

b: float

実格子定数 b (Å).

beta: float

実格子定数 β (度).

c: float

実格子定数 c (Å).

gamma: float

実格子定数 γ (度).

ls: int

lsq_latt2.py におけるLSパラメータ(結晶系タイプコード).

name: str

"triclinic").

Type:

結晶系の名称(例

class XRD.test_lsq_latt2.FitResult(a: float, b: float, c: float, alpha: float, beta: float, gamma: float)

ベースクラス: object

lsq_latt2.py の実行結果として得られた格子定数を保持するデータクラス。

解析された格子定数を含みます。

a: float

解析された実格子定数 a (Å).

alpha: float

解析された実格子定数 α (度).

b: float

解析された実格子定数 b (Å).

beta: float

解析された実格子定数 β (度).

c: float

解析された実格子定数 c (Å).

gamma: float

解析された実格子定数 γ (度).

XRD.test_lsq_latt2.all_cases() List[CellCase]

テスト対象の全ての結晶系とそれに対応する理論的な格子定数リストを返します。

各 CellCase オブジェクトは、lsq_latt2.py の LS パラメータと 対応する結晶系の名前、そして格子定数を含みます。

戻り値:

事前に定義された CellCase オブジェクトのリスト。

XRD.test_lsq_latt2.build_input_text(title: str, ls: int, wavelength: float, peaks: List[Tuple[int, int, int, float, float]], ip: int = 1) str

lsq_latt2.py プログラムへの入力ファイルコンテンツを生成します。

タイトル、LSパラメータ、波長、およびミラー指数とノイズ付き2θ値のリストを 指定されたフォーマットで文字列として構築します。

パラメータ:
  • title -- 入力ファイルのタイトル行。

  • ls -- 結晶系タイプコード (LSパラメータ)。

  • wavelength -- X線波長 (Å)。

  • peaks -- (h, k, l, 理論2θ, ノイズ付き2θ) のタプルのリスト。

  • ip -- 解析オプション (通常 1)。

戻り値:

lsq_latt2.py が読み込むためのフォーマットされた入力文字列。

XRD.test_lsq_latt2.cell_metric(cell: CellCase) List[List[float]]

結晶セルの格子定数から実格子の計量テンソル (G) を計算します。

計量テンソルは、格子定数 a, b, c と角度 alpha, beta, gamma から導出されます。 このテンソルは逆格子空間の計算に用いられます。

パラメータ:

cell -- 格子定数情報を含む CellCase オブジェクト。

戻り値:

3x3 の計量テンソル行列。

XRD.test_lsq_latt2.cell_to_dict(cell: CellCase | FitResult) dict

CellCase または FitResult オブジェクトの格子定数属性を辞書に変換します。

パラメータ:

cell -- 変換する CellCase または FitResult オブジェクト。

戻り値:

格子定数名 (a, b, c, alpha, beta, gamma) をキーとする辞書。

XRD.test_lsq_latt2.d_spacing(cell: CellCase, h: int, k: int, l: int) float

指定された結晶面 (hkl) の面間隔 (d値) を計算します。

実格子の計量テンソルから逆格子の計量テンソルを導出し、 それを用いて面間隔の逆数の二乗 (1/d^2) を計算します。

パラメータ:
  • cell -- 格子定数情報を含む CellCase オブジェクト。

  • h -- ミラー指数 h。

  • k -- ミラー指数 k。

  • l -- ミラー指数 l。

戻り値:

面間隔 d (Å)。

例外:

ValueError -- 計算された 1/d^2 が非正の場合。

XRD.test_lsq_latt2.deg2rad(x: float) float

度をラジアンに変換します。

パラメータ:

x -- 角度(度)。

戻り値:

角度(ラジアン)。

XRD.test_lsq_latt2.format_case_report(expected: CellCase, got: FitResult, abs_err: dict, rel_err: dict, issue: str) str

個々のテストケースの結果レポートを整形して文字列として返します。

期待値、出力値、各パラメータの絶対誤差と相対誤差、そして特定された問題点を 読みやすい形式で表示します。

パラメータ:
  • expected -- 期待される格子定数を含む CellCase オブジェクト。

  • got -- lsq_latt2.py から得られた FitResult オブジェクト。

  • abs_err -- 各パラメータの絶対誤差の辞書。

  • rel_err -- 各パラメータの相対誤差の辞書。

  • issue -- infer_issue 関数によって生成された問題点の説明文字列。

戻り値:

整形されたレポート文字列。

XRD.test_lsq_latt2.generate_reflections(cell: CellCase, wavelength: float, n_lines: int = 15, noise_sigma_deg: float = 0.02, hmax: int = 6, twotheta_min: float = 10.0, twotheta_max: float = 140.0, seed: int = 1234) List[Tuple[int, int, int, float, float]]

指定された結晶セルに対してX線回折ピークをシミュレートし、ノイズを付加します。

ミラー指数 (hkl) の範囲内で可能な反射を全て計算し、 2θ角でソートした後、指定された数のピークを選択します。 選択されたピークの 2θ 値にはガウスノイズが追加されます。 同一の 2θ が発生するピークは重複を除去します(小数点以下3桁で丸めて判定)。

パラメータ:
  • cell -- 基となる格子定数情報を含む CellCase オブジェクト。

  • wavelength -- 使用するX線波長 (Å)。

  • n_lines -- 生成する反射ピークの数。

  • noise_sigma_deg -- 2θ 値に加えるノイズの標準偏差(度)。

  • hmax -- ミラー指数 (h, k, l) の最大絶対値。

  • twotheta_min -- 考慮する 2θ の最小値(度)。

  • twotheta_max -- 考慮する 2θ の最大値(度)。

  • seed -- 乱数生成器のシード値。

戻り値:

(h, k, l, 理論2θ, ノイズ付き2θ) のタプルのリスト。

例外:

RuntimeError -- 指定された範囲内で十分な数のピークが生成できなかった場合。

XRD.test_lsq_latt2.infer_issue(expected: CellCase, got: FitResult, abs_err: dict, rel_err: dict) str

フィット結果の誤差から、考えられる問題点を推測します。

特に三方晶系 (trigonal) の場合、長さパラメータが sqrt(3) 倍になっている可能性をチェックします。 それ以外の場合は、最も誤差が大きいパラメータ(長さまたは角度)を特定します。

パラメータ:
  • expected -- 期待される格子定数を含む CellCase オブジェクト。

  • got -- lsq_latt2.py から得られた FitResult オブジェクト。

  • abs_err -- 各パラメータの絶対誤差の辞書。

  • rel_err -- 各パラメータの相対誤差の辞書。

戻り値:

問題点に関する説明文字列。

XRD.test_lsq_latt2.inv3(m: List[List[float]]) List[List[float]]

3x3 行列の逆行列を計算します。

サラスの公式を用いて行列式を計算し、各要素の余因子を求めて逆行列を構築します。 行列式がほぼゼロの場合、特異行列としてエラーを発生させます。

パラメータ:

m -- 3x3 の浮動小数点数行列。

戻り値:

入力行列の逆行列。

例外:

ValueError -- 行列が特異である(行列式がほぼゼロ)場合。

XRD.test_lsq_latt2.judge_diffs(expected: CellCase, got: FitResult) tuple[bool, dict, dict]

期待される格子定数とフィット結果の間の差を評価します。

絶対誤差と相対誤差を計算し、定義された許容範囲内にあるかどうかを判定します。 - a, b, c の絶対誤差は 0.05 Å 未満 - alpha, beta, gamma の絶対誤差は 1.0 度 未満

パラメータ:
  • expected -- 期待される格子定数を含む CellCase オブジェクト。

  • got -- lsq_latt2.py から得られた FitResult オブジェクト。

戻り値:

(テスト結果がOKかどうかの真偽値, 絶対誤差の辞書, 相対誤差の辞書)。

XRD.test_lsq_latt2.main() int

lsq_latt2.py スクリプトのフルシステムテストを実行するメイン関数。

コマンドライン引数を解析し、定義済みの全ての結晶系テストケースをループして実行します。 各テストケースについて、反射データを生成し、lsq_latt2.py を実行し、結果を解析・評価します。 最後に、全テストケースのサマリーを表示し、失敗したケースを詳細に報告します。 一時作業ディレクトリの管理(作成と削除)も行います。

戻り値:

全てのテストが成功した場合は 0、失敗したテストがある場合は 1、 スクリプトが見つからない場合は 2 を返します。

XRD.test_lsq_latt2.parse_output_file(outfile: Path) FitResult

lsq_latt2.py の出力ファイルを解析し、フィットされた格子定数を抽出します。

新しい出力フォーマット("[Direct lattice constants / 実格子定数]" ブロック)と、 古い出力フォーマット("Direct cell constant" ブロック)の両方に対応しています。 適切なブロックが見つからない場合、エラーを発生させます。

パラメータ:

outfile -- lsq_latt2.py の出力ファイルへのパス。

戻り値:

解析された格子定数を含む FitResult オブジェクト。

例外:

RuntimeError -- 出力ファイルから格子定数ブロックを解析できなかった場合。

XRD.test_lsq_latt2.run_one_case(lsq_script: Path, workdir: Path, cell: CellCase, wavelength: float, n_lines: int, noise_sigma_deg: float, seed: int) tuple[bool, FitResult | None, dict | None, dict | None, str]

単一の結晶系テストケースを実行します。

一時ディレクトリ内にテストケース固有のサブディレクトリを作成し、 反射データを生成して lsq_latt2.py への入力ファイルを構築します。 lsq_latt2.py を subprocess として実行し、その出力ファイルを解析して、 期待される結果と比較します。

パラメータ:
  • lsq_script -- テスト対象の lsq_latt2.py スクリプトへのパス。

  • workdir -- 一時作業ディレクトリのルートパス。

  • cell -- テスト対象の CellCase オブジェクト。

  • wavelength -- シミュレーションに使用するX線波長 (Å)。

  • n_lines -- 生成する反射ピークの数。

  • noise_sigma_deg -- ピークに加えるノイズの標準偏差(度)。

  • seed -- 反射ピーク生成に使用する乱数シード。

戻り値:

(テストが成功したかの真偽値, フィット結果の FitResult オブジェクトまたは None, 絶対誤差の辞書または None, 相対誤差の辞書または None, エラーまたは問題点の説明文字列)。

XRD.test_lsq_latt2.two_theta_from_d(d: float, wavelength: float) float | None

面間隔 (d) とX線波長から回折角 2θ を計算します。

ブラッグの法則 (nλ = 2d sinθ) を用いて計算します。 arcsin の引数が有効な範囲 (0 < x < 1) にない場合、None を返します。

パラメータ:
  • d -- 面間隔 (Å)。

  • wavelength -- X線波長 (Å)。

戻り値:

回折角 2θ(度)、または None(計算不能な場合)。