cxi.postrefine の使い方 (試行錯誤中)

cctbx.xfel に含まれる cxi.postrefine の使い方のメモ。たぶん世界初。
Indexing individual stills - cctbx_xfel が参考になる。インストール方法も、この wiki を参照のこと。

画像の変換

まず、画像を pickle 形式に変換する。

cxi.image2pickle *.img

少なくとも、BL-41XU の MX225HE の画像や、MOSFLM のチュートリアルに含まれているデータセット(いずれも MarCCD 形式)では上手くいった。ヘッダの値が正しくない場合は、wiki にあるコマンドライン・オプションを使って、上書きすべし。

指数付けと積分

検出器のゲインを調べて(iMOSFLM の Experiment Settings ダイアログを見るとよい)、

integration.detector_gain=0.87

などと書いた index.phil を作る。

これと変換後の画像を cxi.index で処理する。

cxi.index -d -o index target=index.phil *.pickle

これで、index ディレクトリに int_****.pickle というファイルができる。

マージ

target_space_group=P43212
pixel_size_mm=0.07324
target_unit_cell=78.4,78.4,37.5,90,90,90
run_no=1
d_min=2.5
d_max=100

などと書いた pr.phil を作る。空間群とピクセルサイズ(これは画像ファイルから読んでほしいよね)は、記述がないとメッセージで教えてくれるが、他が抜けていると意味不明なエラーを出して死ぬ。ソースコードを眺めながら、必要なパラメータを特定した。格子定数は cxi.index が出力したものは無視して、ここの値を使うようだ。格子定数は分解能の計算にも使われるので、指定が不適切だと、全ての反射が reject されてしまう。d_min に 0 はダメ。

これで準備完了。

cxi.postrefine input=pr.phil index/int*.pickle

などとすると、run_no で指定した名前のフォルダができて、その中にログとマージ後の mtz ファイルが出力される。最初のパスでとりあえずフレーム間のスケール+マージをして(CrystFEL の process_hkl --scale に相当)、それをリファレンスに使って post-refinement (partialator に相当)が行われる。

しかしながら、

WARNING mod_leastsqr.calc_spot_radius: Rh is woryingly large: 0.131488514426

という警告が大量に出て、ちゃんと動いていないようなので、現在原因追求中。これは、mod_leastsqr.py の find_spot_radius (逆空間での格子点の半径 = mosaicity + divergence + etc を見積もる関数)が出している。

CrystFEL の stream ファイルから、cxi.index が出力するのと同じ形式の pickle ファイルを作るコンバータも書いたが、上の問題があるため、動作確認できていない。第一段階のマージ後の統計値はまともそうなのだが。