順次追記予定
注: Coot 0.9.8.92以上 (CCP4 8.0.016以上)を使ってください.0.9.8.6は核酸単体,0.9.8.7-8は核酸-タンパク複合体の精密化に深刻なバグがあります.0.9.8.91でもDNA-SERやDNA-TYRに由来する問題あり.
base pair & stacking restraints
LIBGを使う
CCP4に含まれているプログラムLIBGで作製したrestraintをCootに読ませて使うことができる. LIBGの文献は以下を参照
- Brown et al. “Tools for macromolecular model building and refinement into electron cryo-microscopy reconstructions” Acta Cryst. (2015). D71, 136-153
- Kovalevskiy et al. “Overview of refinement procedures within REFMAC5: utilizing data from different sources” Acta Cryst. (2018). D74, 215-227
注: mmCIFの読み込みバグがCCP4 8.0.011で修正されているので,当バージョンの使用を推奨.
使い方は libg
と打てば表示される.PDBファイルを使う場合は
libg -p input.pdb -o libg.txt
とするとRefmacのexternal restraintsが記述されたlibg.txtが作られる. 以下は2zm5を使った例 (抜粋):
exte dist first chain C resi 23 ins . atom N6 second chain C resi 12 ins . atom O4 value 2.94 sigma 0.15 type 1
exte dist first chain C resi 23 ins . atom N1 second chain C resi 12 ins . atom N3 value 2.84 sigma 0.1 type 1
exte torsion first chain C resi 23 ins . atom C2 second chain C resi 23 ins . atom N1 third chain C resi 12 ins . atom N3 fourth chain C resi 12 ins . atom C4 value 180 sigma 15 type 1
...
exte stac plan 1 firs resi 10 ins . chai C atoms { C1' N9 C8 N7 C5 C6 O6 N1 C2 N2 N3 C4 } plan 2 firs resi 11 ins . chai C atoms { C1' N1 C2 O2 N3 C4 N4 C5 C6 } dist 3.4 sddi 0.2 sdan 6.0 type 1
...
塩基対の水素結合に対して結合距離制約(exte dist)が,塩基のスタッキングに対して平面間角度と距離の制約(exte stac)が作られる. 記法についてはrefmac keywords (version 5.5.0026 and later)を参照.
このファイルはRefmacに読ませて使えるが(servalcatの場合は --keyword_file
で指定する),Cootに読ませる場合は
- Calculate - Modules - Restraints でRestraintsメニューを出現させる
- Restraints - Read Refmac Extra Restraintsを選択,上記で作成したファイル(libg.txt)を指定する
上手く読めていればこのFig. 8dのように表示されるはず.
ちなみにPython scriptingで読ませたい場合は
add_refmac_extra_restraints(imol, "libg.txt")
塩基対が崩れすぎている場合,LIBGが認識してくれない可能性がある. その場合は以下の方法で手動で設定できるが,Ideal RNA (or DNA)から置き直したほうが早いかも
手動で設定する
塩基対は,
- Calculate - Modules - Restraints でRestraintsメニューを出現させる
- Restraints - RNA A form bond restraints または DNA B form bond restraints を選択
- 塩基対を組ませたい残基を1つずつクリック (計2回)
で設定できる.紛らわしい名前をしているが,ソースを読む限り,塩基の原子間距離の制約を設定しているだけなので,A formやB formになるわけではない(主鎖の制約ではない).
スタッキングは,
- Restraints - Add Parallel Planes Restraintを選択
- スタッキングさせたい残基を1つずつクリック (計2回)
で塩基平面の平行性を保つ制約が設定できる.実装は上記ソースから user_defined_add_planes_restraint()
を参照.
この方法だとDNA-RNA heteroduplexの塩基対を組ませることができない.この機能自体変えてもらうほうが良いように思うが,とりあえず以下のスクリプトを適当な名前(.py)で保存してCalculate - Run Scriptから実行すればRestraintsメニューに"base pair restraints"が出現するので,これで組めるようになるはず.
# original: https://github.com/pemsley/coot/blob/refinement/python/user_define_restraints.py
def add_base_restraint(imol, spec_1, spec_2, atom_name_1, atom_name_2, dist):
add_extra_bond_restraint(imol,
spec_1[2],
spec_1[3],
spec_1[4],
atom_name_1,
spec_1[6],
spec_2[2],
spec_2[3],
spec_2[4],
atom_name_2,
spec_2[6],
dist, 0.035)
def a_u_restraints(spec_1, spec_2):
imol = spec_1[1]
add_base_restraint(imol, spec_1, spec_2, " N6 ", " O4 ", 3.12)
add_base_restraint(imol, spec_1, spec_2, " N1 ", " N3 ", 3.05)
add_base_restraint(imol, spec_1, spec_2, " C2 ", " O2 ", 3.90)
add_base_restraint(imol, spec_1, spec_2, " N3 ", " O2 ", 5.12)
add_base_restraint(imol, spec_1, spec_2, " C6 ", " O4 ", 3.92)
add_base_restraint(imol, spec_1, spec_2, " C4 ", " C6 ", 8.38)
def g_c_restraints(spec_1, spec_2):
imol = spec_1[1]
add_base_restraint(imol, spec_1, spec_2, " N6 ", " O4 ", 3.12)
add_base_restraint(imol, spec_1, spec_2, " N1 ", " N3 ", 3.04)
add_base_restraint(imol, spec_1, spec_2, " N2 ", " O2 ", 3.14)
add_base_restraint(imol, spec_1, spec_2, " C4 ", " N1 ", 7.73)
add_base_restraint(imol, spec_1, spec_2, " C5 ", " C5 ", 7.21)
def user_defined_base_pair():
res_name_from_atom_spec = lambda x: residue_name(*x[1:5])
def make_restr(*args):
spec_1 = args[0]
spec_2 = args[1]
res_name_1 = res_name_from_atom_spec(spec_1)
res_name_2 = res_name_from_atom_spec(spec_2)
print("DEBUG:: have resnames", res_name_1, res_name_2)
if (res_name_1 in ("G", "DG") and res_name_2 in ("C", "DC")):
g_c_restraints(spec_1, spec_2)
if (res_name_1 in ("C", "DC") and res_name_2 in ("G", "DG")):
g_c_restraints(spec_2, spec_1)
if (res_name_1 in ("A", "DA") and res_name_2 in ("U", "DT")):
a_u_restraints(spec_1, spec_2)
if (res_name_1 in ("U", "DT") and res_name_2 in ("A", "DA")):
a_u_restraints(spec_2, spec_1)
user_defined_click_py(2, make_restr)
menu = coot_menubar_menu("Restraints")
add_simple_coot_menu_menuitem(menu, "base pair restraints...", lambda func: user_defined_base_pair())
二重らせんのフィッティング
- モデルを置きたい場所の中心あたりに移動
- Calculate - Other Modelling Tools - DNA & RNA modelsを選択
- RNA/DNA, A/B form, double strandedを選択し配列を入力
- モデルが出現するので,Morph - Jiggle-fit This Molecule (Simple)を実行.マップにはまればOK.はまらなければ何度か繰り返す.ダメなときはRotate Translate Zoneで場所を動かす(回転は全探索されるので問題ない)
(Morphメニューが無いときはFile - CurlewからMorphをインストールする.Refineメニューもこのあとで使うので,無い場合はChain Refineもインストールする)
大まかにモデルが合ったら,精密化する.分解能が十分良いな普通にすれば問題ないが,分解能が悪いときは以下の方法で行う方が良い.
まず構造を極力維持させるために,self-restraintsを設定する
- Calculate - Modules - Restraints でRestraintsメニューを出現させる
- Restraints - Generate All-Molecule Self Restraints 4.3
もし二重らせんモデルを既存のモデルにマージした上で行いたい場合は,マージ後,Calculate - Scripting - Pythonから
chains = ["A", "B"]
imol = 0
all_res = sum([residues_in_chain(imol, x) for x in chains], [])
generate_local_self_restraints_by_residues(imol, all_res, 4.3)
とする.chainsのIDは二重らせんのものに,imolはその分子番号(Display Managerから確認)に置き換えること.
次に実際に精密化.特に電顕SPAのマップのときは,最初にWeightを適切に調整すること. 右上のR/RCボタンからRefinement Weight横のEstimateボタンを押し,実際に適当な場所でsphere refine等を行ってから"Bonds:“の値が0.5-1.0程度に収まるところを探す(この精密化はキャンセルすること). また,self-restraintsのGeman-McClure alpha (More Controlにあり)はデフォルトが0.01だが,R/RCを開くまでは1になっている罠があるので注意.
モデルをマージしていなければ,Refine - All-atom Refineする.マージ済みで二重らせんだけrefineしたいときは,Calculate - Scripting - Pythonから
refine_residues(imol, all_res)
とする(上記のscriptでall_resを設定済みの前提.必要なときは上のscriptの1-3行目をもう一度実行する). もしモデルが変形しすぎるときは上記Geman-McClure alphaを小さくする.逆に,もう少し変形して欲しいときは大きくする.
二重らせんモデルの理想化
上記の方法で置くCootの二重らせんモデルは,実はあまり理想的な状態ではない(なお,以前はIdeal RNAみたいな名前だったが,それを指摘したらIdealの名前だけ削られてしまった). モデルをもう少し理想化してから精密化することも可能である. 要望があり次第書きます.
フラグメントのフィッティング
RNA FRABASE http://rnafrabase.cs.put.poznan.pl/ で配列や二次構造でフラグメントの3次元座標が検索できる.低分解能のマップに結構ぴったりはまってくれたりして嬉しい