逆格子ベクトルを R で確認 - biochem_fan's noteの続きとして10日ほど前にやりかけたまま、盆休みなどで止まってしまっていること。下書きに溜め込んでいても仕方がないので公開しておく。
さきほどと同じ Thaumatin in house のデータセットを使う。
Suggested Solution: 10 P4 penalty: 3 cell: 58.029 58.073 151.393 90.48 90.04 90.33 regularized cell: 58.051 58.051 151.393 90.00 90.00 90.00 Symmetry: tP (Primitive Tetragonal) AMAT is now -0.004362 -0.022340 0.005186 -0.016936 -0.008306 -0.007219 0.020002 -0.011699 -0.004972 CELL is 58.03 58.07 151.39 90.48 90.04 90.33 UMAT is now -0.164166 -0.840467 0.516395 -0.637424 -0.309135 -0.705780 0.752822 -0.445028 -0.484984 Angles are: 99.45 147.19 58.91 129.60 108.01 134.89 41.16 116.43 119.01
AMAT というのは、UB matrix のこと。B が逆格子の基底ベクトルで U は回転行列。
# U が回転行列であることは、行列式が1であることから分かる umat <- matrix(c(-0.164166, -0.840467, 0.516395,-0.637424, -0.309135, -0.705780, 0.752822, -0.445028, -0.484984), 3, 3) apply(umat, 1, function(x)sqrt(sum(x*x))) # 0.9999995 0.9999996 1.0000002 det(umat) # 0.9999993 # UB matrix が逆格子ベクトルを回転した物であることを確認。 # XDS との違いは二点: 波長の項が入っていること、既に転置されていること amat <- matrix(c(-0.004362, -0.022340, 0.005186, -0.016936, -0.008306, -0.007219, 0.020002, -0.011699, -0.004972), 3, 3) real_basis <- solve(amat / 1.5418) # CELL に出ている格子定数と一致することを確認 apply(real_basis, 2, function(x)sqrt(sum(x*x))) # 58.03007 58.07339 151.38842 degree(real_basis[, 2], real_basis[, 3]) # b と c の間が α = 90.48143 degree(real_basis[, 3], real_basis[, 1]) # c と a の間が β = 90.03736 degree(real_basis[, 1], real_basis[, 2]) # a と b の間が γ = 90.33383
さきほどの XDS の場合と比べてみると、
> real_basis [,1] [,2] [,3] [1,] -9.261938 -49.05923 78.17512 [2,] -36.857803 -17.60690 -106.84767 [3,] 43.854398 -25.60679 -73.42127 > xds_real_basis [,1] [,2] [,3] [1,] -37.629 21.380 100.241 [2,] 43.677 25.634 73.468 [3,] -6.639 47.471 -84.820
となっていて、座標系の取り方が違う。また、Thaumatin は空間群 P41212 で点群 422 だから、基底ベクトルの取り方にもそれだけの自由度がある(注意: 自由度があるとはいえ、強度も同じだから、indexing ambiguity は来さない)。
座標系の変換方法は xdsme の https://github.com/legrandp/xdsme/blob/master/XOconv/xds2mos.py に実装がある。
2016/05/04: 少し手入れした。