POVME3(待完善)
POVME3 : https://github.com/POVME/POVME3
Install
官方给出的安装方式是使用miniconda(不过他给的是miniconda2,不知道3行不行:
wget https://repo.continuum.io/miniconda/Miniconda2-latest-Linux-x86_64.sh
bash Miniconda2-latest-Linux-x86_64.sh -b -p miniconda2
. miniconda2/etc/profile.d/conda.sh
conda activate base
pip install povme
以后每次运行 povme 都需要打开 base 这个环境(当然你也可以一开始就命名成一个你喜欢的名字。
Direction
POVME3可以用来计算生物大分子(一般是蛋白质)特定空腔的体积。目前只接受 .pdb
作为输入,因此如果要计算一系列体系的体积(比如 gromacs 产生的 .xtc
),就需要提前合并或者转化成 .pdb
格式;在 gromacs 中可以这么做:
gmx trjconv -s md_0_1.tpr -f md_0_1.xtc -o md_0_1.pdb -pbc nojump # -fit rot+trans
当然你也可以配合-b -e -skip
等来对轨迹进行截取(最好是调整到合适的帧数,我这边用一核预处理+计算大概是 2 min/帧);而且,必须要消除周期性、平动和转动。
POVME 运行还需要一个配置文件 .ini
,这个文件包含空腔体积判定设置和其他输入输出设置,具体内容见后;当我们执行程序时,需要在环境中进入待计算文件所在文件夹,假设配置文件叫sample_input.ini
并且输入的.pdb
已经设置为md_0_1.pdb
,通过以下指令进行运算:
python POVME3.py sample_input.ini
然后就会产生一个新文件夹,运算结束后里面会有一个包含所有帧对应空腔体积的文档以及该 .pdb
对应产生的 .pdb.npy
文件,后者可以用于后续的聚类分析。
下面介绍一下 .ini 文件的内容,重点在于那些如何让程序知道你想计算哪个口袋,以及这个口袋的范围怎么判定的设置(前面带有¥的选项(在写 .ini 的时候不要把¥加进去)):
用固定点定义口袋 sample_input.ini
配置文件 sample_input.ini 内容如下(各选项注释附后):
# First, we need to define a point field that entirely encompasses all trajectory pockets.
GridSpacing 1.0
InclusionSphere 65.0 98.0 50.0 16.0
InclusionSphere -100.0 -100.0 -100.0 10.0
InclusionBox 100.0 100.0 100.0 10.0 10.0 10.0
InclusionCylinder 65.0 98.0 50.0 1.0 1.0 1.0 16.0 10.0
ExclusionSphere -100.0 -100.0 -100.0 10.0
ExclusionBox 100.0 100.0 100.0 10.0 10.0 10.0
# Saving and loading the POVME points of the pocket-encompassing region(optional).
SavePoints true
LoadPointsFilename points.pdb.npy
# Load the PDB trajectory file
PDBFileName md_0_1.pdb
# Tell POVME how to identify points that are within the binding pocket.
DistanceCutoff 1.09
ConvexHullExclusion first
SeedSphere 67.0 102.0 57.0 4.0
ContiguousPointsCriteria 3
# Tell POVME how to perform the calculations.
NumProcessors 1
# Tell POVME how to save the output
OutputFilenamePrefix ./POVME_test_run/example_
CompressOutput false
GridSpacing: 相邻格点之间的距离,单位为埃。降低这个数字可以提高精度,但会牺牲计算时间。
¥InclusionSphere: 在某处添加一个包含口袋的球形的点阵区域。以InclusionSphere 65.0 98.0 50.0 16.0
为例:(65.0 98.00 50.0)为球体中心,半径为16.0,(65.0 98.00 50.0)是 sample_input.ini 中提到的 PDB 轨迹文件酶活性位点的位置。第二个InclusionSphere
设置将添加第二个球体,此球体仅用于演示目的(不会起到计算作用,当然如果你确实同时有第二个需要计算的口袋,那么就把它设置为相应的坐标和半径)。点(-100.0 -100.0 -100.0 -100.0)实际上离 4NSS.pdb 蛋白结构很远。
¥InclusionBox: 在某处添加一个包含口袋的矩形六面体(长方体)的点阵区域。例如:InclusionBox 100.0 100.0 100.0 10.0 10.0 10.0
分别以 x、y 和 z 坐标的(100.0 100.0 100.0)为中心,延伸边长为10埃。同样,这个盒子离 4NSS 很远结构,此处(不代表你不能使用这个形状)仅用于演示目的。
¥InclusionCylinder: 在某处添加一个包含口袋的圆柱体的点阵区域。例如:InclusionCylinder 65.0 98.0 50.0 1.0 1.0 1.0 16.0 10.0
以(65.0 98.0 50.0)为中心,其轴沿向量[1.0 1.0 1.0],半径为16.0埃,高度为10.0埃。
¥ExclusionSphere: 移除功能,用法类似于InclusionSphere
。
¥ExclusionBox: 移除功能,用法类似于InclusionBox
。
SavePoints: 你可以选择将点阵保存到 PDB 文件。但是确定一组合适的球体和长方体的添加或移除点阵来定义口袋可能会非常麻烦。不使用上述指令的另一种方法是: 定义初始几何形状,使用类似 VMD 的程序将该几何形状和蛋白质可视化,然后根据需要迭代添加新的包含和排除区域。此外,如果点阵包含许多点,则生成该点阵可能需要大量计算。如果要将同一点阵用于多个 POVME 运行,使用已保存的点阵副本而不是从头开始重复生成,会更有效(当然,你得确保该点阵对应的口袋位置一致)。请注意,POVME 还保存了一个 NPY 文件,该文件包含与 PDB 文件相同的数据,但可以在后续 POVME 运行中更快地加载。点阵 PDB 文件将保存到 {PREFIX}point_field.pdb(请参阅下面的 OutputFilenamePrefix
)。此外,如果指定连续的口袋种子区域(请参见下面的 ContigousPocketSeedSphere
和 ContigousPocketSeedBox
),POVME 还会将这些点保存到 {PREFIX}contigous_pocket_seed_points.pdb。
LoadPointsFilename: 如果不想使用上面的指令(InclusionSphere
之类)生成点阵,你可以选择加载已有点阵。请注意,您应该使用 .pdb.npy 文件,而不是 .pdb 文件。
PDBFileName: 加载 PDB 轨迹文件。
DistanceCutoff: 在任何受体原子范德华表面这个距离内的任何点都不会被视为口袋体积的一部分。1.09埃为默认值,因为这是氢原子的范德华半径。
¥ConvexHullExclusion: 凸包是一种确定口袋在蛋白质外部的“结束”位置的方法,位于凸包外的(点阵)包含区域部分将会被去除。在以前的版本中,凸包将针对每帧重新计算,但这会导致显著的数值噪声,因为蛋白质在不同帧的运动可能会从根本上重新定义凸包。通过在此处提供 first
或 max
选项,可以在所有帧中使用一致的凸包。first
将第一帧的凸包应用于所有其他帧,max
在同时叠加的所有帧周围绘制一个凸包(在大轨迹上可能需要较长时间)。为了重现之前的行为(如果你想复现谋篇论文的数据而它用的是 POVME2),可以使用 each
选项。任何其他选项都将停用凸包排除法(但建议输入为 none
)。
¥SeedSphere: 上面定义的包含口袋的点阵可能至少在轨迹的某些帧中包含多个口袋。您可以指示 POVME 删除与用户定义的 contiguous pocket seed region 不相邻的任何点。该区域通常只是放置在您感兴趣的主口袋中心的一个小球体,它告诉 POVME 要测量哪个口袋。如果未指定此类区域,POVME 将计算包含口袋的点阵覆盖的所有口袋的总体积,即使它们不是连续的。
¥ContiguousPointsCriteria: 如果两个口袋体积至少共享此数量的相邻点,则认为它们是“连续的”。请注意,彼此“斜对角”的点被视为相邻。
NumProcessors: POVME可以在基于Unix的系统上使用多个处理器,在此设置所使用的的核数(尽管只是将不同帧均分给不同核来进行相对独立的计算)。
OutputFilenamePrefix POVME 输出的所有文件都将以该前缀开头。POVME会自动创建任何所需的目录(如./POVME_test_run/example_
中为 ./POVME_test_run/)。
CompressOutput: 如果磁盘空间不足,POVME 可以使用 gz 压缩自动压缩所有输出文件。
——————————————————————————
借助配体定义口袋 ligand_sample.ini
而且,POVME 3.0 现在允许用户使用配体残基名称定义口袋的包含区域。然后将以加载的 PDB 轨迹中配体原子3埃以内的所有网格点定义口袋。注意,这个残基名称必须与输入 PDB 轨迹中给定的名称匹配。
# POVME 3.0 Sample Input File
# First, we need to define a point field that entirely encompasses all trajectory pockets.
GridSpacing 1.0
DefinePocketByLigand adp
# Load the PDB trajectory file
PDBFileName 1BYQ_every250.pdb
# Tell POVME how to identify points that are within the binding pocket.
DistanceCutoff 1.09
ConvexHullExclusion none
ContiguousPointsCriteria 3
# Tell POVME how to perform the calculations.
NumProcessors 1
# Tell POVME how to save the output
OutputFilenamePrefix ./POVME_test_run/POVME_
CompressOutput false
DefinePocketByLigand: 相应残基名称。其余内容与sample_input.ini
相同。
Examples
Basic example
通过这些指令获取该例所需文件并进入相应文件夹:
git clone https://github.com/POVME/POVME.git
cd POVME/POVME/examples/basic_example/
通过以下指令进行运算:
python POVME3.py sample_input.ini
此示例是使用一个位于特定位置的球体对空腔进行框选(具体设置方法见sample_input.ini
设置)。POVME运行所需的最小输入是输入轨迹名称和包含区域。在体积计算完成后,同时生成一个*_volume_trajectory.pdb
,你可以使用VMD可视化这个,它代表这POVME自动选定出的体积范围。在VMD中通过以下命令打开这个输出:
vmd -m POVME_test_run/example_volume_trajectory.pdb 4NSS.pdb
在VMD的 Graphics–>Representations 菜单下,使用 VDW 显示 0:POVME_volume_trajectory.pdb
(并考虑将“球体比例”值减少到0.3左右)。
Ligand-defined inclusion region example
运行操作与上一例完全相同。
Clustering
(这部分教程在 POVME/POVME/packages/clustering/README 里面,看着原始文献里做出来结果挺不错的(下图来自 POVME3 原始文献 http://dx.doi.org/10.1021/acs.jctc.7b00500),但是这个教程写得有点简略,而且从2017年发布之后就再没更新过;本人还没有尝试过进行这个 workflow,如果有更深层次的需求最好自己去看一看源码,下面是翻译和一些笔记)
在进行聚类之前,你需要获得你所希望 clustering 的口袋体积的 .npy 文件(可以在上两例找到获得方法),然后按照这个流程进行:
- 运行 binding_site_overlap.py,如
python binding_site_overlap.py -f *.npy
,将会输出 Tanimoto 和 Tversky 计算的相似度矩阵。 - 运行 cluster.py,所需输入为:来自 binding_site_overlap.py 的 indexMapToFrames.csv、binding_site_overlap.py生成的 csv 文件 (Tanimoto 或 Tversky 之一)、期望得到的簇数;指令输入如
python cluster.py indexMapToFrames.csv 2 POVME_Tanimoto_matrix.csv
;将会输出 frames_centroid.csv,其包含了每个帧的聚集位置。
对于 cluster.py,还有一些细致的选项:
-m
: 口袋重叠矩阵(由 binding_site_overlap.py 生成);
-t
: .npy 文件前缀和其原始 pdb 文件/轨迹之间的映射,用冒号分隔,可以重复使用。例如:-t 1BYQ:./trajectories/1BYQ.pdb -t 1UYF:./trajectories/1UYF.pdb
;
-T
: 包含一系列-t
参数的文件;
-i
: 将口袋重叠矩阵映射到各帧编号的索引文件,需要返回集群代表;
--kmeans
: 使用 kmeans 群集而不是分级(hierarchical);
-n
: 手动设置簇数。否则,Kelley罚分 将计算出最佳数量;
-N
: 为 Kelley罚分 可得的簇数设置 min
、min:max
或 min:max:skip
值;如果 -n
-N
均未输入,则计算从 1 到 maxKPClusters 的 nClusters 的Kelley惩罚(maxKPClusters 为 75(你也可以到 cluster.py 里面调整这个数值)与 所用于聚类的帧数 中较小值);
-o
: 指定输出前缀;
-m
: 将所有帧输出到集群子目录(不仅仅是集群代表(cluster reps));
使用方式例如 cluster.py -m POVME_Tanimoto_matrix_.npy -i indexMapToFrames.csv -t POVME_:../../POVME/examples/POVME_example/4NSS.pdb