#KAMO
KAMO (Katappashikara Atsumeta data wo Manual yorimoiikanjide Okaeshisuru) systemは,(高分子)単結晶X線回折データの自動処理&マージのために開発中のプログラムです. 基本的にXDS packageのフロントエンドという形態を取りますが,オプションでDIALSやAimlessも使用可能(になる予定)です. 現在のところ,small wedgeデータ(5-10°/結晶)の自動処理・マージを主眼に開発しています.
SPring-8でのオンラインデータ解析のために設計されていますが,ローカルのデータに対しても使えるようになっています(但し多くのケースが未テストです).
本マニュアルは2015-12-18現在のものです.
以下のプログラム・ライブラリを使用しています.
- CCTBX with CBFlib (動作上必須)
- wxPython 2.8, Matplotlib 1.3, Networkx, Numpy, SciPy (動作上必須)
- XDS
- CCP4 (BLEND, Pointless, Aimless, Ctruncate)
- R (BLEND, CCクラスタリングに必要) with rjson
- DIALS (完全には未対応)
KAMOはまだ発展途上のプログラムです.インタフェース面や機能面などで,多くの欠陥・バグがありますので,何か不具合に気づかれたり,ご要望などありましたら,決して遠慮せず開発者までご連絡ください.
このマニュアルもまだ不足してる点が多いですが,とりあえず公開します.
起動した場所の下(サブディレクトリを含む)にあるデータを処理します.
特定のサブディレクトリのみを対象にしたいときは,include_dir=hoge-1111-\*
という感じでディレクトリ名を指定する(複数指定可)か,あるいは対象ディレクトリ名が書かれたリストファイルを与えます.
-
例1: BL32XUでsmall wedge
kamo bl=32xu
-
例2: BL41XUで通常(1 or 数結晶でコンプリート)データ測定
kamo bl=41xu small_wedges=false
-
例3: BL32XUでZoo (自動データ収集)を使ったとき
kamo bl=32xu mode=zoo
-
例4: ローカルにあるデータを処理(ディレクトリを直接探索.上記の場合はBSSのログからデータセットの場所を探索)
kamo bl=other
-h
オプションを付けるとヘルプ&全パラメータリストが見れます.
過去のデータを処理する際は例えばdate=2015-12-31
とすると,指定日の2日前から指定日までのデータを探索します(デフォルトはdate=today
).
起動すると自動的にデータセットを探索し,処理を開始します.
処理結果は,workdir=
で指定した場所(デフォルト:_kamoproc/)に,同じディレクトリ構造で,prefix_startimage-endimage/という名前のディレクトリができ,その下がXDS/DIALSの実行場所になっています.たとえば以下のような感じです.
~/151126_BL32XU/
│
└ mydata/ <- ここでKAMOを起動したとする
├ sample1/
│ ├ data1_000{001..180}.img
│ └ data2_000{001..360}.img
├ sample2/
│ ├ data3_000{001..180}.img
│ └ data4_000{001..360}.img
│
└ _kamoproc/ <- これが自動的に作られる (workdir=オプションで変更可)
├ sample1/ <- 同じツリー構造が作られる
│ ├ data1_1-180/ <- これがデータ処理の作業ディレクトリ
│ └ data2_1-360/
└ sample2/
├ data3_1-180/
└ data4_1-360/
テーブルのカラムの説明は以下のとおりです.カラムをクリックすることでソートできます.
カラム名 | 説明 |
---|---|
Path | データセットの相対パス |
Sample ID | Unipuck ID (Well ID) |
Wavelength | 波長 (A) |
TotalPhi | トータルの振動幅(°) |
DeltaPhi | 1枚あたりの振動幅(°) |
Cstatus | data collectionのステータス(never/running/finished) |
Pstatus | data processingのステータス(never/running/giveup/finished) |
Cmpl. | データセットのCompleteness |
SG | 空間群 |
Resn. | 分解能リミットの推定値 (small_wedges=trueの時はピークサーチの結果から,falseのときはCORRECT.LPの分解能100分割のテーブルでI/sigmaが1を切るところ) |
- マージ対象のデータにチェックを入れ(失敗してるものを含んでもエラーにはなりません),
Multi merge strategy
のボタンを押し,少し待つ - 同じ格子(reindexも考慮して同じ格子になるもの)がグループ化され,データセットの数でソートされる
- マージするグループと対称性を選ぶ.対称性は,一番頻度の高いものがデフォルトで選択されているが,既知の場合はそれを選ぶ.
- Proceedボタンを押し,ターミナル画面を見る.指定した対称性と異なる対称で処理されたデータを,指定した対称で処理しなおしている
- "Do It Yourself!"と表示されたら完了.Reindex operatorが存在する場合は表示されるので,留意する(
kamo.resolve_indexing_ambiguity
を使って解決できます) - ターミナルで指示された場所に移動し,スクリプトを修正・実行する. スクリプト(merge_blend.sh)は以下のようになっている
# settings
dmin=2.8 # resolution
anomalous=false # true or false
# _______/setting
kamo.multi_merge \
workdir=blend_${dmin}A_framecc_b \
lstin=formerge.lst d_min=${dmin} anomalous=${anomalous} \
program=xscale xscale.reference=bmin \
reject_method=framecc+lpstats rejection.lpstats.stats=em.b \
clustering=blend blend.min_cmpl=90 blend.min_redun=2 blend.max_LCV=None blend.max_aLCV=None
- このスクリプトを実行すると,まずBLENDによる格子定数に基づいた階層的クラスタリングが行われ,見つかったクラスタのうちcompletenessが90%以上・redundancy 2以上になるクラスタすべてについて,マージを試みる.まず単純にxscaleでマージ(run_01/)し,そのマージ結果とのCCを計算することで悪いフレームを見つける.悪いフレームを除いてマージした結果(run_02/)から,error modelのbを基準にOutlierを検出し,悪いデータセットを除いてマージした結果がrun_03/に保存される.これが最終結果となる.各結果のディレクトリ/ccp4にはmtzおよびctruncateとphenix.xtirageのログも保存される.
- 処理完了後,作業ディレクトリ(blend_*/)以下のreport.htmlをブラウザで表示すれば全最終結果の統計値を一望できる.結果を受けて,場合によっては分解能リミットを変えて再実行する.精密化に使うクラスタの選び方は,だいたいCC1/2が最大になるものを選べば問題ないと思われる(フィードバックお待ちしています).
P6やP4など,あるいはP2でもβ~90°の場合など,格子の対称性が空間群の対称性よりも高い場合,index ambiguityが生じます.複数の結晶を用いる場合,これを揃えておかなければなりません.
この作業は,上記のマージの前に行う必要があります.ただし,上記の作業中でReindex operatorが表示されなかったときは必要ありません.
kamo.resolve_indexing_ambiguity formerge.lst
とすると,必要に応じてreindexを行い,formerge_reindexed.lstを出力します.
kamo.multi_mergeの際にはlstin=formerge_reindexed.lst
を指定して下さい.
デフォルトはmethod=selective_breeding
で,Kabschによる"Selective Breeding"アルゴリズムを使用します.これはReferenceデータを必要としません.同じくRefererenceデータを必要としないmethod=brehm_diederichs
(Algorithm 2 in Brehm and Diederichs paper)も選択可能です.
Referenceデータに合わせたい場合は,method=reference
を選択し,reference_file=
にReferenceのMTZファイルを与えてください.
2つのモードがある
- BSSのログファイルからJob情報を検索(オンライン解析用)
- サブディレクトリを掘って探索(ファイルシステムのアクセス速度に依存)
bl=other
を指定すると後者のモードになる.
前者の場合は,date=
の指定とあわせて,BSSのログファイルを探索する.よって,ファイルやディレクトリがリネームor移動されているとデータセットが発見できない.
XDSを使って処理を行う.基本的にgenerate_XDS.INPと同じ内容のXDS.INPを用いるが,指数付けには全フレームを用いる. また,指数付け失敗時には,以下のことを検討する.
- IDXREF.LPの差ベクトルクラスタリングの結果から格子が半分になっていると思われる場合は,倍にして試す
- 既知の格子定数&対称性が与えられている場合は,その利用を試す
対称性の判断は,まずINTEGRATE.HKLに対してpointlessを実行し,次にXDS_ASCII.HKLに対しても実行する.両者で判断が一致しない場合,ISaが大きい方を採用する.
高分解能カットオフはユーザが決めるべきとの立場を取るが,あまりにノイズの多い高角をスケーリングに含めると結果が適切にならないため,細かく切ったシェルでCC1/2が0.5を下回るところで分解能を切り,そのスケール結果をXDS_ASCII.HKL/CORRECT.LPとしている(GUIにはその結果が表示される).分解能を切ってないXDS_ASCII_fullres.HKL/CORRECT_fullres.LPは別に保存される.
small_wedges=true
のときは,CORRECTで経験的補正を行わない(つまりスケーリングを行わない;対称反射の数が少なすぎるため)バージョンの出力も作成(XDS_ASCII.HKL_noscale)し,マージの際にはそれが使われる.XDS_ASCII.HKL/XDS_ASCII_fullres.HKLの方は通常どおりスケーリング済みのものになっている.
以下の処理が行われます.
- 選択されたデータを,P1の格子でお互いに比較し,等価なものであるかどうかを調べる
- 等価なもの同士を繋いでいき,グループ分けを行う
- 各グループごとに,格子対称(格子定数から許される最大の対称性)を調べ,そのサブグループを選択可能な対称性として列挙する
- 各wedgeごとに推定された対称性の頻度も表示する
- ユーザがグループ番号と対称性を選択すると,各ファイル(XDS_ASCII.HKL_noscale)をその対称性の格子に変換する(reindexおよび格子定数の変換を行う).
- Index ambiguityが存在するかどうかを調べ,存在する場合はユーザに通知する.
種々のオプションがありますが,基本的な流れは以下のとおりです.
- 格子定数またはデータ間相関係数を用いて階層的クラスタリングを行い,見つかった各クラスタに対してマージを試みる.
- 対象ファイルをXSCALEを使ってスケール&マージ (run_01)
- bad frameの検出&除去 (run_02)
- bad datasetの検出&除去 (run_03)
BLENDまたはデータセット間CCを用いたクラスタリングが可能です.BLENDについては本家のマニュアル・論文を参照のこと.
clustering=cc
とすると,CCを用いたクラスタリングを利用できます.さらに,cc_clustering.b_scale=
でWilson-Bによるスケーリングを行うかどうか,cc_clustering.use_normalized=
で規格化構造因子を用いるかどうかを選択できます(true/false).
cc_clustering.d_min=
でCCの計算に使用する分解能リミットを制限できます.今のところ単純にRのhclust()関数を使っており,他のすべてのデータと共通反射を持つデータしかクラスタリングに用いることができないため,対称性の低い結晶の場合での使用は現実的ではありません.
全データをマージした結果と,各フレーム上強度とのCCを計算し,CCの悪いフレームを捨てる(reject_method=framecc
).
デフォルトではrejection.framecc.method=tukey rejection.framecc.iqr_coeff=1.5
になっており,Tukeyの基準(1.5*IQR)で悪いフレームを検出する.例えばrejection.framecc.method=abs rejection.framecc.abs_cutoff=0.9
とすることで,絶対的な閾値を設定することも可能.
XSCALE.LPの統計値からbad datasetを検出する(reject_method=lpstats
).
デフォルトの挙動では,error modelのbからTukeyの方法でOutlierを検出する(rejection.lpstats.stats=em.b rejection.lpstats.iqr_coeff=1.5
).rejection.lpstats.stats=
にはem.b
の他,pairwise_cc
およびbfactor
が選択可能である.pairwise_cc
はデータセット間のCCを悪くしているデータセットを除くもので,デフォルトでは0.8以下になるデータセットを除くようになっている(rejection.lpstats.pwcc.method=abs rejection.lpstats.pwcc.abs_cutoff=0.8
)が,Tukeyの方法を選ぶこともできる.
主に,最終的なOverall B-factorに影響を及ぼします.XSCALEでは最初に書いたINPUT_FILE=がリファレンスになる仕様ですが,KAMOのデフォルトではxscale.reference=bmin
になっており,Bが最も小さい,つまり(XSCALEでは)最も分解能に対するfall-offが小さい(高分解能まで強度が出ている)ものをリファレンスにします.
全部にチェックを入れたいときは"Check all"ボタンを押すと,全部にチェックが入ります. また,1つチェックを入れて,Shiftキーを押しながらもう1つにチェックを入れると,間にあるもの全てにチェックが入ります.
KAMOを起動するときに,たとえば
kamo known.unit_cell=10,20,30,90,90,90 known.space_group=p222
という形で格子定数を与えることができます(必ずspace_groupとセットで与えてください). 格子定数は指数付けの時の事前情報として使われ,また,一致しない場合はデータ処理が行われません. この方法だと全処理対象に対して同じ格子定数を用いますので,複数種類のデータがあるときは気をつけて下さい.
該当イメージが存在するディレクトリに,kamo_override.config
というファイルを用意すると,処理開始時にそこから情報を読んで使用します.以下の例のように書いて下さい.上書きする必要の無い情報は書かないで下さい.
wavelength= 1
distance= 100
orgx= 2500
orgy= 2500
osc_range= 0.1
rotation_axis= -1 0 0
run_03/ccp4/xscale.mtzを使って下さい.run_03/が無いときは,run_*のうち一番数字が大きいディレクトリが最終サイクルです.
まず,依存関係をすべて導入してください (R, CCP4, XDS).
次に,INSTALL.mdに従って環境構築を行いますが,難しければ,以下のPHENIXを使った方法が簡単です.
- CCP4, R (rjson packageも含め), XDSをインストールする
- PHENIX-1.10以上をインストールする
- networkxをphenix.pythonから使えるようにする
- https://pypi.python.org/packages/source/n/networkx/networkx-1.11.tar.gz をダウンロード
tar xvf networkx-1.11.tar.gz
cd networkx-1.11; phenix.python setup.py install
- scipyをphenix.pythonから使えるようにする
- https://github.com/scipy/scipy/releases/download/v0.18.1/scipy-0.18.1.tar.gz をダウンロード
tar xvf scipy-0.18.1.tar.gz
cd scipy-0.18.1; phenix.python setup.py install
- (blasあるいはlapackが無いと言われたら,パッケージマネージャ等を用いて導入のこと)
- 以下のコマンドを実行する(yamtbxをcloneする場所はどこでも良いので,適当に読み替えて下さい)
cd $HOME
git clone https://github.com/keitaroyam/yamtbx.git
cd $PHENIX/modules
ln -s ~/yamtbx/yamtbx .
cd ../build
libtbx.configure yamtbx
KAMOセットアップ後,
kamo.test_installation
を実行することで必要なパッケージがインストールされているかどうか確認できます.
基本的には上記と一緒ですが,
kamo bl=other log_root=~/kamo-log/ [batch.sge_pe_name=par]
のように,log_root=
に書き込み権限のあるディレクトリを指定して下さい.
また,SGEのparallel environment (qsub -pe の後に書く文字列)を上記のように指定して下さい(デフォルト: par).SGEの環境が無く,ローカルコンピュータのみで動かすときは,
kamo bl=other log_root=~/kamo-log/ batch.engine=sh batch.sh_max_jobs=8
として,同時に動かす最大ジョブ数を指定して下さい.
また,reverse-phiでは無いビームライン(SPring-8以外のビームラインは大体該当)では,reverse_phi=false
を必ず指定して下さい.縦置きゴニオなどには未対応です.
日付はGitHub公開時
- 2017-01-18
- yamtbx.beam_direction_plot: 複合格子の場合におかしくなるバグを修正
- 2016-12-26
- kamo.multi_merge:
space_group=
オプションを追加(マージ時に使用).指定がない場合Pointlessの結果をmtzに反映 - kamo.multi_merge: 出力MTZにMULTIPLICITYカラムを追加
- qsubするスクリプトの先頭でcdするように変更(bashrcなどでcdしている場合に,適切にcdされなかったバグを修正)
- 2016-12-06
- GUI:
exclude_ice_resolutions=
オプションを追加.プロットがMacで更新されないバグを修正 - XSCALE実行後の処理を高速化(ファイル名の置換)
- kamo.resolve_indexing_ambiguity:
reference_label=
が与えられてない場合にクラッシュするバグを修正 - kamo.test_installation: Adxvのチェックを追加
- 2016-10-05
auto_frame_exclude_spot_based=
オプションを追加.最初と最後でセンタリングが外れているなど反射が写っていないフレームを含むデータに有効(かも).- 2016-07-18
- XDS/XSCALE実行時にRAMディスクまたは一時ディレクトリを使用するオプションを追加(デフォルト)
- 対称性でグルーピングする際,頻度計算に格子定数も考慮するよう変更(同じ空間群で異なるa,b,cがある場合に区別される)
- OSX (phenix-1.10.1環境下?)におけるバグ(Multi mergeでProceedしても先に進まない)を修正
- KAMOのHTML report作成の軽微なバグを修正
- 非SGE環境でkamo.multi_mergeが実行できないバグを修正
- LCVとaLCVを実際にマージされた結晶の格子定数から計算するように変更
- phenix.xtriageのログのパースを修正.Anisotropyをmax(B_cart)-min(B_cart)と定義.