此文不完全翻译自: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值变化。