CrystFEL の反射に関わるデータ構造について

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 とは何であるか。現在、調査中。