2024-05-15 (Wed)

CrystFEL 0.11 の Millepede ファイルの形式について

CrystFEL 0.11 のジオメトリ精密化では Millepede を使うようになっているが、そこに gradient を渡すための .bin ファイルの様式が Millepede のマニュアルにも書いていないので、CrystFEL のソースコードを読んで調べた。

一つの .bin ファイルには複数の結晶に由来する情報が連続して入っている。各結晶データの頭には int32 で要素数が書いてある。そこから 2 を引いて半分にしたのを N とすると、{[要素数 (N + 1) x 2 を表す int32] 0 [要素数 N の float32 配列] 0 [要素数 N の int32 配列]} という構造になっており、これが結晶の数だけ繰り返される。

Float32 配列は、{residual [local parameter についての gradient の配列] ESD [global parameter についての gradient の配列]} という内容になっている。どれが何に対する微分か区別するため、要素数 N の int32 配列のほうに変数の ID が入っている。

Local parameter は 1, 2, 3, ... 9 という ID で、その結晶の逆格子ベクトル asx, asy, asz, ... の 9 個。

Global parameter は 各 detector hierarchy における並進 trans_x/y/z と回転 rot_x/y/z であり、

the global gradient IDs, which are a hierarchical serial number, e.g. 4020X = 2nd subgroup of 4th group. X is the direction of the gradient (1-3 = x,y,z translation, 4-6 = x,y,z rotation) and all six should appear for every measurement.
https://github.com/taw10/crystfel/issues/13#issuecomment-2107020849

という具合に上位の桁(100 ごとに見る)でパネルやグループ番号が分かる。

ID 0 は特殊な意味を持ち、local parameter と global parameter の境目を表す。ここには、residual と ESD が入っている。

実際に int array を見てみるとこんな感じ:

# 1 つ目の strong spot, fast scan coordinate について
0 (residual), 1, 2, 3, 4, 5, 6, 7, 8, 9 (9 つの逆格子ベクトルに対応)
0 (esd), 601, 602, 603, 604, 605, 606 (panel 6 の並進xyzとxyz周りの回転), 1, 2, 3, 4, 5, 6 (検出器全体の並進と回転)
# 1 つ目の strong spot, slow scan coordinate について同様
0 (residual), 1, 2, 3, 4, 5, 6, 7, 8, 9 (9 つの逆格子ベクトルに対応)
0 (esd), 601, 602, 603, 604, 605, 606 (panel 6 の並進xyzとxyz周りの回転), 1, 2, 3, 4, 5, 6 (検出器全体の並進と回転)
# 1 つ目の strong spot の excitation error (Ewald sphere offset)
0 (residual), 1, 2, 3, 4, 5, 6, 7, 8, 9 (9 つの逆格子ベクトルに対応)
0 (esd)
# Excitation error は spot xy に無関係なので、パネルのジオメトリについての微分がないことに注意。
# この後は、2 つ目の strong spot, fast scan coordinate について同様に続く。
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
0, 701, 702, 703, 704, 705, 706, 1, 2, 3, 4, 5, 6, ...

2 つ目の strong spot は 7 つ目のパネルに載っていることも分かる。

この点を実装し、複数の bin ファイルから RMSD を計算するものを作った。

読んだ