CrystFEL における反射についてソースコードを読んだメモ。このエントリはGPLとする。
コードはlibcrystfel/src/reflist.c である。
反射は _refldata 型で表され、これを包む Relection 型の node が Reflist 型の赤黒木に格納されている。木には、同じ指数を持つ反射を複数登録することができる。反射の多重度を考えれば、そうする必要があるのは当然。赤黒木は平衡木であり、アクセスにかかる時間は O(log(N)) である。指定した指数を持つ反射の情報を得るには、
Reflection *find_refl(const RefList *list, signed int h, signed int k, signed int l)
を使う。これは、最初の反射を返すので、次は next_found_refl で辿っていく。この辺はコメント豊富なので省略。
内部的には、指数 (h, k, l) は 10bit ずつパックされて 32bit の int 型のシリアル番号としてインデックスに使われている。signed の 10bit なので、許される指数の範囲は -512 から 511 である。この辺の変換をするマクロが SERIAL とか GET_H などである。
話を _refldata 型に戻す。指数、画像上のスポット位置、強度、位相といったあたりまえの情報に加えて、
double r1; /* First excitation error */ double r2; /* Second excitation error */ double p; /* Partiality */ double L; /* Lorentz factor */ int clamp1; /* Clamp status for r1 */ int clamp2; /* Clamp status for r2 */
などの興味深いパラメータがある。Lorentz因子や partiality はともかく、excitation error とは何であるか。現在、調査中。