CrystFEL の積分に関わるデータ構造について

CrystFEL の git にある最新の実装では、論文に書いていない機能もいろいろ盛りこまれているようなので、調査したメモ。自分向けに書いているので、わかりにくい部分があればコメントで質問してほしい。GPLソースコードを引用しているので、このエントリも GPL ということにする。

実装は libcrystfel/src/integration.c にある。2つの構造体が重要。

intcontext (たいてい ic という名前)は、integration context。積分の run に共通するデータ構造。reference_profiles 配列に、プロファイル(複数)が入っている。これは

static void show_reference_profile(struct intcontext *ic, int i)

で出力可能。スポットサイズは w に入っている。

peak_box (たいてい bx という名前)は、1つの反射スポットを表す。反射スポットは、パネル pn の (cfs, css) を角とする座標系((0, 0)-(w - 1, w - 1)の範囲)を持つ。また、背景補正のために a, b, c の3つのパラメータを持つ。MOSFLM 風のモデルで、c が定数項で a, b は、 fs, ss 方向の係数。つまり、座標 (p, q) の背景値は a*p + bx->b*q + bx-> で与えられる。パネルをまたがるような反射スポットは考えられていない。LCLS の検出器は、パネルの4辺とも gap を持つので、これでよいのだろう。指数は、refl に入っている。

static float boxi(struct intcontext *ic, struct peak_box *bx, int p, int q)

は、反射スポット座標系で (p, q) のピクセル値を返す。