逆格子ベクトルを R で確認

逆格子の定義として、結晶学の教科書では外積を使った表現が出てくることが多いが、逆行列を使った表現のほうが「ちょっと実験」するにはコードしやすい。数学的な詳細はまたの機会に触れるとして、簡単に確認してみよう。

以前 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

という具合。