逆格子の定義として、結晶学の教科書では外積を使った表現が出てくることが多いが、逆行列を使った表現のほうが「ちょっと実験」するにはコードしやすい。数学的な詳細はまたの機会に触れるとして、簡単に確認してみよう。
以前 in-house の R-AXIS IV で取得した Thaumatin のデータセットを XDS で処理した。CORRECT.LP を見ると、
COORDINATES OF UNIT CELL A-AXIS -37.629 43.677 -6.639 COORDINATES OF UNIT CELL B-AXIS 21.380 25.634 47.471 COORDINATES OF UNIT CELL C-AXIS 100.241 73.468 -84.820 REC. CELL PARAMETERS 0.017232 0.017232 0.006646 90.000 90.000 90.000 UNIT CELL PARAMETERS 58.032 58.032 150.467 90.000 90.000 90.000
となっている。"COORDINATES OF UNIT CELL X-AXIS" というのが、実空間の格子ベクトルだ。これを R に読み込ませて確認する。
# 実空間の格子ベクトルを縦に並べた行列を作る real_basis <- matrix(c(-37.629, 43.677, -6.639, 21.380, 25.634, 47.471, 100.241, 73.468, -84.820), 3, 3, byrow=F) # 二つのベクトルの間の角度を返す関数 degree <- function (a, b) {acos(sum(a * b) / sqrt(sum(a*a)) / sqrt(sum(b*b))) / pi * 180} # 実空間の格子定数 UNIT CELL PARAMETERS と一致することを確認 apply(real_basis, 2, function(x)sqrt(sum(x*x))) # 58.03187 58.03191 150.46673 degree(real_basis[, 2], real_basis[, 3]) # b と c の間が α = 90.00088 degree(real_basis[, 3], real_basis[, 1]) # c と a の間が β = 90.00039 degree(real_basis[, 1], real_basis[, 2]) # a と b の間が γ = 89.99991 # 逆格子ベクトルを求める rec_basis <- t(solve(real_basis)) # REC. CELL PARAMETERS と一致することを確認 apply(rec_basis, 2, function(x)sqrt(sum(x*x))) # 0.017231910 0.017231900 0.006645987 degree(rec_basis[, 2], rec_basis[, 3]) # α = 89.99961 degree(rec_basis[, 3], rec_basis[, 1]) # β = 90.00009 degree(rec_basis[, 1], rec_basis[, 2]) # γ = 89.99912
という具合。