此文不完全翻译自: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
<SCOREFXNS/>

这是等价的。
为了阅读方便,往往我们会进行缩进,但是机器阅读的时候是没有必要的,但是要注意的是,命令接受一个逗号分割的列表时,是不能有空格的,例如:

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>

我们首先定义了两个得分函数,分别命名为molmechr15_cart。其中第二个得分权重为ref2015,并且重新赋权pro_closecart_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采样等级,这里设置了chi1chi2,等级均设置为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>

同样,我们可以在选择器之间进行操作,使用AndOrNot,分别对应选择器名称为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值变化。