此文不完全翻译自:Creating protocols with RosettaScripts
大家可能对RosettaScript可能并不陌生,因为Rosetta官网上非常多的教程都是用的脚本,脚本是使用xml
文件来进行的。首先我们来看基本的骨架例子。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <ROSETTASCRIPTS> <SCOREFXNS> </SCOREFXNS> <RESIDUE_SELECTORS> </RESIDUE_SELECTORS> <TASKOPERATIONS> </TASKOPERATIONS> <FILTERS> </FILTERS> <MOVERS> </MOVERS> <APPLY_TO_POSE> </APPLY_TO_POSE> <PROTOCOLS> </PROTOCOLS> <OUTPUT /> </ROSETTASCRIPTS>
|
1.运行脚本
运行脚本非常简单,只要使用rosetta_scripts模块的-parser:protocol
设置即可。
1
| $ROSETTA3/bin/rosetta_scripts.mpi.linuxgccrelease -s 1ubq.pdb -parser:protocol nothing.xml
|
2.注释
在xml文件中只要不是位于<
内的内容,均为注释,例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <ROSETTASCRIPTS> 这是一个注释 <SCOREFXNS> </SCOREFXNS> <RESIDUE_SELECTORS> </RESIDUE_SELECTORS> <TASKOPERATIONS> </TASKOPERATIONS> <FILTERS> </FILTERS> <MOVERS> 这也是一个注释,虽然其位于闭包内,但是其并未位于尖括号内 </MOVERS> <APPLY_TO_POSE> </APPLY_TO_POSE> <PROTOCOLS> </PROTOCOLS> <OUTPUT /> </ROSETTASCRIPTS>
|
3.标签
3.1 标签写法
对于网页xml,有开头标签就必须要有关闭标签,如:
1 2
| <SCOREFXNS> </SCOREFXNS>
|
对于rosetta,若标签之间没有嵌套,则可以直接简写,这与html中的<br/>
类似,如:
这是等价的。
为了阅读方便,往往我们会进行缩进,但是机器阅读的时候是没有必要的,但是要注意的是,命令接受一个逗号分割的列表时,是不能有空格的,例如:
1 2
| <PackRotamers name="pack1" task_operations="task1,task2,task3" /> <PackRotamers name="pack2" task_operations="task2, task2, task3" /> #含有空格,这是不被允许的
|
3.2标签命名
我们在使用编程语言的时候,非常重要的一个基础语法就是变量,通过定义变量能够方便的在多个地方运用变量,例如javascipt:
1 2 3 4 5 6
| //将变量a赋值1 var a=1; var i; for (i=0;i<5;i++){ console.log(a) }
|
rosetta脚本使用这个功能则为在标签内进行命名name
,调用的时候调用该名称进行指定对象。
1 2 3 4 5 6 7
| <MOVERS> <PackRotamers name="pack1" task_operations="task1,task2,task3" /> </MOVERS> 调用名称为pack1的语法 <PROTOCOLS> <Add mover="pack1" /> </PROTOCOLS>
|
3.3输出标签
有时候我们需要将有些计算进行输出,则需要使用<OUTPUT/>
标签,如下面的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <ROSETTASCRIPTS> <SCOREFXNS> <ScoreFunction name="molmech" weights="mm_std_fa_elec_dslf_fa13" /> <ScoreFunction name="r15_cart" weights="ref2015" > <Reweight scoretype="pro_close" weight="0.0" /> <Reweight scoretype="cart_bonded" weight="0.625" /> </ScoreFunction> </SCOREFXNS> <RESIDUE_SELECTORS> </RESIDUE_SELECTORS> <TASKOPERATIONS> </TASKOPERATIONS> <FILTERS> </FILTERS> <MOVERS> </MOVERS> <APPLY_TO_POSE> </APPLY_TO_POSE> <PROTOCOLS> </PROTOCOLS> <OUTPUT scorefxn="r15_cart" /> </ROSETTASCRIPTS>
|
我们首先定义了两个得分函数,分别命名为molmech
与r15_cart
。其中第二个得分权重为ref2015
,并且重新赋权pro_close
与cart_bonded
选项。我们再来看一下<OUTPUT/>
内的内容,其包含scorefxn
表示<SCOREFXNS>
内内容输出,引用的内容为r15_cart
,故molmech
虽然被申明但是不会被输出,仅会输出后面的ScoreFunction的内容。
我们来运行一下:
1
| $ROSETTA3/bin/rosetta_scripts.default.linuxgccrelease -s 1ubq.pdb -parser:protocol scoring.xml -out:prefix scoring_
|
其得到的文件打分项内包含cart_bonded
项,并且没有pro_close
项(因为权限被赋予为0)
3.4 标签设置
有时候我们对标签内的运行进行设置,若有默认值省略则为默认值,但是有一些没有默认值的则必须填写,否则可能会报错。对于boolean设置,则可以填写以下均正确:
1
| 1/0, T/F, Y/N, true/false, on/off
|
3.5.Movers标签
RosettaScript XML的脚本有Movers,翻译为行动器?这是脚本内最为核心的内容
如下有个简单的最小化例子:
1 2 3 4 5 6
| <MOVERS> <MinMover name="min_torsion" scorefxn="molmech" chi="true" bb="1" cartesian="F" > </MinMover> <MinMover name="min_cart" scorefxn="r15_cart" chi="true" bb="1" cartesian="T" > </MinMover> </MOVERS>
|
<MOVERS>
标签内可以运行的设置可以具体参考RosettaScripts-Movers.MinMover
为最小化侧链或者骨架Movers。min_torsion
设置cartesian为false(将会使用默认的torsinal进行最小化),并且使用名为molmech
的打分函数,chi,bb均设置的为true,表示侧链与骨架均进行最小化优化。
3.6 PROTOCOLS标签
PROTOCOL为执行标签,MOVERS标签为设置但是需要PROTOCOL才会执行,其按照先后顺序进行执行,上一个执行的输出会成为下一个执行的输入:
例子
1 2 3
| <PROTOCOLS> <Add mover="min_cart" /> </PROTOCOLS>
|
如上,会执行min_cart
MOVERS标签
3.7 TaskOperations标签
TaskOperations用于定义MOVER
任务
教程中以Repacking为例,首先我们搭基本框架:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <ROSETTASCRIPTS> <SCOREFXNS> <ScoreFunction name="r15" weights="ref2015" /> </SCOREFXNS> <RESIDUE_SELECTORS> </RESIDUE_SELECTORS> <TASKOPERATIONS> </TASKOPERATIONS> <FILTERS> </FILTERS> <MOVERS> <PackRotamersMover name="pack1" scorefxn="r15" /> </MOVERS> <APPLY_TO_POSE> </APPLY_TO_POSE> <PROTOCOLS> <Add mover="pack1" /> </PROTOCOLS> <OUTPUT scorefxn="r15" /> </ROSETTASCRIPTS>
|
进行打分,输出等操作。我们进行一个任务操作:
1 2 3 4 5 6
| ... <TASKOPERATIONS> <RestrictToRepacking name="no_design" /> #未进行设置 <ExtraRotamersGeneric name="extrachi" ex1="1" ex2="1" ex1_sample_level="1" ex2_sample_level="1" /> #此设置了几个内容 </TASKOPERATIONS> ...
|
RestrictToRepacking
这里设置的为仅允许残基repack,而没有设计。ExtraRotamersGeneric
为设置rotamer采样等级,这里设置了chi1
与chi2
,等级均设置为1.
随后我们在<MOVERS>
相关标签内引用
1 2 3 4 5
| ... <MOVERS> <PackRotamersMover name="pack1" scorefxn="r15" task_operations="no_design,extrachi" /> </MOVERS> ...
|
注意的是引用task_operations
没有先后顺序。
3.8 ResidueSelectors标签(残基选择器)
残基选择器顾名思义,就是进行用来选择一系列特定的残基子集,可以将其用于TaskOperations或者RosettaScripts其他位置。
假设我们要进行这样一件repack的事情,我们有一个蛋白,我们仅仅需要将他内部的氨基酸残基进行repack,但是表面残基不进行任何操作,同时我们需要限制其内部的疏水氨基酸残基的repack。这相当于将蛋白分为多个层,此时我们就需要用到残基选择器,需要注意的是残基选择器是有顺序的,这不同于TaskOperations
。
例如我们通过LayerSelector
选择器选择选择核心,边界,表面三层:
1 2 3 4 5
| <RESIDUE_SELECTORS> <Layer name="corelayer" select_core="true" select_boundary="false" select_surface="false" core_cutoff="4.0" /> <Layer name="boundarylayer" select_core="false" select_boundary="true" select_surface="false" core_cutoff="4.0" /> <Layer name="surfacelayer" select_core="false" select_boundary="false" select_surface="true" core_cutoff="4.0" /> </RESIDUE_SELECTORS>
|
我们可以将其选择放入<TASKOPERATIONS>
标签内
1 2 3 4 5 6 7 8
| <TASKOPERATIONS> <OperateOnResidueSubset name="restrict_boundary_to_repack" selector="boundarylayer" > <RestrictToRepackingRLT /> </OperateOnResidueSubset> <OperateOnResidueSubset name="prevent_surface_from_repackin" selector="surfacelayer" > <PreventRepackingRLT /> </OperateOnResidueSubset> </TASKOPERATIONS>
|
同样,我们可以在选择器之间进行操作,使用And
,Or
,Not
,分别对应选择器名称为AndResidueSelector
,OrResidueSelector
,NotResidueSelector
。举个例子:
1 2 3 4 5
| <RESIDUE_SELECTORS> <Layer name="corelayer" select_core="true" select_boundary="false" select_surface="false" core_cutoff="4.0" /> <ResidueName name="select_polar" residue_name3="ASP,GLU,LYS,ARG,HIS,SER,THR,ASN,GLN" /> <And name="polar_and_core" selectors="select_polar,corelayer" /> </RESIDUE_SELECTORS>
|
这样其相当于选择了内层的极性氨基酸残基。
3.9 Filters标签
筛选器主要是用来对采样进行一步筛选。避免在下一步计算的时候白白浪费计算资源。我们来看下面的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <ROSETTASCRIPTS> <SCOREFXNS> <ScoreFunction name="r15" weights="ref2015" /> </SCOREFXNS> <RESIDUE_SELECTORS> </RESIDUE_SELECTORS> <TASKOPERATIONS> <RestrictToRepacking name="repackonly" /> <ExtraRotamersGeneric name="extrachi" ex1="1" ex2="1" ex1_sample_level="1" ex2_sample_level="1" /> </TASKOPERATIONS> <FILTERS> <AtomicDistance name="salt_bridge" residue1="11A" atomtype1="Nlys" residue2="34A" atomtype2="OOC" distance="3.0" /> </FILTERS> <MOVERS> <MinMover name="min" scorefxn="r15" chi="true" bb="true" cartesian="false" /> <PackRotamersMover name="pack" scorefxn="r15" task_operations="repackonly,extrachi"/> </MOVERS> <APPLY_TO_POSE> </APPLY_TO_POSE> <PROTOCOLS> <Add mover="pack" /> <Add filter="salt_bridge" /> <Add mover="min" /> </PROTOCOLS> <OUTPUT scorefxn="r15" /> </ROSETTASCRIPTS>
|
我们需要进行一步pack
,一步mini
,但是在最终结果里面我们需要氨基酸残基11与34之间形成盐桥,如果pack
步骤让11与34氨基酸残基远离,那么mini
步骤很难让他们形成盐桥,最后分析的时候虽然可以抛弃,但是白白浪费了大量计算时间用于pack
不会形成盐桥的结构上,所以可以在此中间加入<FILTERS>
,若不满足此性质的结构均会在能量最小化步骤不使用。
同时筛选器还有一个confidence
参数值得注意,可以使得筛选器改造为评价器。其默认值为”1.0”,表示完全过滤这些结构,若设置为”0.0”,则不会进行过滤,仅会对其值进行计算,如下的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| ... <FILTERS> <AtomicDistance name="salt_bridge" residue1="11A" atomtype1="Nlys" residue2="34A" atomtype2="OOC" distance="3.0" /> <SidechainRmsd name="F45_rmsd" res1_pdb_num="45A" res2_pdb_num="45A" include_backbone="1" confidence="0.0" /> <SidechainRmsd name="Y59_rmsd" res1_pdb_num="59A" res2_pdb_num="59A" include_backbone="1" confidence="0.0" /> </FILTERS> ... <PROTOCOLS> <Add mover="pack" /> <Add filter="salt_bridge" /> <Add mover="min" /> <Add filter="F45_rmsd" /> <Add filter="Y59_rmsd" /> </PROTOCOLS> ...
|
上面这个例子就会在能量最小化的过程中进行F45以及Y59两个氨基酸残基在最小化过程中的RMSD值变化。