此文不完全翻译自:
大家可能对 RosettaScript 可能并不陌生,因为 Rosetta 官网上非常多的教程都是用的脚本,脚本是使用
xml
文件来进行的。首先我们来看基本的骨架例子。
<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
设置即可。
$ROSETTA3/bin/rosetta_scripts.mpi.linuxgccrelease -s 1ubq.pdb -parser:protocol nothing.xml
2.注释
在 xml 文件中只要不是位于
<
内的内容,均为注释,例如:
<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,有开头标签就必须要有关闭标签,如:
<SCOREFXNS>
SCOREFXNS>
对于 rosetta,若标签之间没有嵌套,则可以直接简写,这与 html 中的
类似,如:
<SCOREFXNS/>
这是等价的。为了阅读方便,往往我们会进行缩进,但是机器阅读的时候是没有必要的,但是要注意的是,命令接受一个逗号分割的列表时,是不能有空格的,例如:
#含有空格,这是不被允许的
3.2 标签命名
我们在使用编程语言的时候,非常重要的一个基础语法就是变量,通过定义变量能够方便的在多个地方运用变量,例如 javascipt:
var a=1;
var i;
for (i=0;i<5;i++){
console.log(a)
}
rosetta 脚本使用这个功能则为在标签内进行命名
name
,调用的时候调用该名称进行指定对象。
<MOVERS>
<PackRotamers name="pack1" task_operations="task1,task2,task3" />
MOVERS>
调用名称为pack1的语法
<PROTOCOLS>
<Add mover="pack1" />
PROTOCOLS>
3.3 输出标签
有时候我们需要将有些计算进行输出,则需要使用
标签,如下面的例子:
<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
选项。我们再来看一下
内的内容,其包含
scorefxn
表示
内内容输出,引用的内容为
r15_cart
,故
molmech
虽然被申明但是不会被输出,仅会输出后面的 ScoreFunction 的内容。我们来运行一下:
$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/0, T/F, Y/N, true/false, on/off
3.5.Movers 标签
RosettaScript XML 的脚本有 Movers,翻译为行动器?这是脚本内最为核心的内容
如下有个简单的最小化例子:
<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>
标签内可以运行的设置可以具体参考
.
MinMover
为最小化侧链或者骨架 Movers。
min_torsion
设置 cartesian 为 false(将会使用默认的 torsinal 进行最小化),并且使用名为
molmech
的打分函数,chi,bb 均设置的为 true,表示侧链与骨架均进行最小化优化。
3.6 PROTOCOLS 标签
PROTOCOL 为执行标签,MOVERS 标签为设置但是需要 PROTOCOL 才会执行,其按照先后顺序进行执行,上一个执行的输出会成为下一个执行的输入:
例子
<PROTOCOLS>
<Add mover="min_cart" />
PROTOCOLS>
如上,会执行
min_cart
MOVERS 标签
3.7 TaskOperations 标签
TaskOperations 用于定义
MOVER
任务
教程中以 Repacking 为例,首先我们搭基本框架:
<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>
进行打分,输出等操作。我们进行一个任务操作:
...
<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>
<PackRotamersMover name="pack1" scorefxn="r15" task_operations="no_design,extrachi" />
MOVERS>
...
注意的是引用
task_operations
没有先后顺序。
3.8 ResidueSelectors 标签(残基选择器)
残基选择器顾名思义,就是进行用来选择一系列特定的残基子集,可以将其用于 TaskOperations 或者 RosettaScripts 其他位置。假设我们要进行这样一件 repack 的事情,我们有一个蛋白,我们仅仅需要将他内部的氨基酸残基进行 repack,但是表面残基不进行任何操作,同时我们需要限制其内部的疏水氨基酸残基的 repack。这相当于将蛋白分为多个层,此时我们就需要用到残基选择器,需要注意的是残基选择器是有顺序的,这不同于
TaskOperations
。例如我们通过
LayerSelector
选择器选择选择核心,边界,表面三层:
<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>
<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
。举个例子:
<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 标签
筛选器主要是用来对采样进行一步筛选。避免在下一步计算的时候白白浪费计算资源。我们来看下面的例子:
<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
不会形成盐桥的结构上,所以可以在此中间加入
,若不满足此性质的结构均会在能量最小化步骤不使用。同时筛选器还有一个
confidence
参数值得注意,可以使得筛选器改造为评价器。其默认值为"1.0",表示完全过滤这些结构,若设置为"0.0",则不会进行过滤,仅会对其值进行计算,如下的例子:
...
<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 值变化。