本文暂时主要讨论使用Hollow1生成点群然后使用PyMOL可视化。

Hollow是以Python编写的程序,技术上在Python2/3上都能运行,由于依赖少,甚至能在pypy上运行。 按照宣传,为了提高速度,建议在pypy上运行

正常来说不应该是把热点函数写成C语言吗(摊手)

官网下载程序源代码,解压后进入目录hollow-1.3。 由于是使用默认设置,无特殊约束,因此假设我们的目标蛋白文件是4f5d.pdb的话, 命令行输入如下命令即可:

python3 hollow.py 4f5d.pdb

不出意外的话会得到新文件4f5d-hollow.pdb,使用PyMOL打开可以得到如下:

raw result

可以看到不仅是我们所需要的空腔(图中中心位置的点云),亦有其他腔体被计算得到。为了不失一般性, 接下来不对hollow的参数调整,而进一步使用聚类方法移除不需要的腔体。 由于hollow生成的文件是pdb文件,而广义上讲pdb文件算是一个定宽文件,因此总是可以通过pandas包打开, 例如已经造好的一个轮子, 就可以整合到我们的代码中,下面的代码采取DBSCAN法

import pandas as pd
import numpy as np
from sklearn import cluster
import matplotlib.pyplot as plt
def read_pdb(pdb_path):
    colspecs = [(0, 6), (6, 11), (12, 16), (16, 17), (17, 20), (21, 22), (22, 26),
                (26, 27), (30, 38), (38, 46), (46, 54), (54, 60), (60, 66), (76, 78),
                (78, 80)]

    names = ['ATOM', 'serial', 'name', 'altloc', 'resname', 'chainid', 'resseq',
             'icode', 'x', 'y', 'z', 'occupancy', 'tempfactor', 'element', 'charge']

    return pd.read_fwf(pdb_path, names=names, colspecs=colspecs)
df = read_pdb('4f5d-h.pdb')
df[['x','y','z']]

x y z
0 7.687 -13.743 -6.878
1 7.687 -13.243 -6.378
2 7.687 -12.743 -5.878
3 7.687 -12.743 -5.378
4 7.687 -12.243 -4.878
... ... ... ...
20937 69.687 -24.243 1.122
20938 70.187 -30.243 3.622
20939 70.187 -25.743 -0.378
20940 70.187 -25.743 0.122
20941 70.187 -25.243 0.622

20942 rows × 3 columns

df.iloc[8330]
ATOM            ATOM
serial          8331
name               O
altloc           NaN
resname          HOH
chainid            A
resseq          8331
icode            NaN
x             30.187
y            -20.243
z              3.622
occupancy          0
tempfactor         0
element          NaN
charge           NaN
Name: 8330, dtype: object
x = [0.1*i + .6 for i in range(50)]
y = []
z = []
for i in x:
    clt = cluster.DBSCAN(eps=i)
    clt.fit(df[['x','y','z']])
    y.append(max(clt.labels_))
    z.append(np.count_nonzero(clt.labels_ == clt.labels_[8330]))
plt.plot(x,y,x,z)
[<matplotlib.lines.Line2D at 0x7f730a76a240>,
 <matplotlib.lines.Line2D at 0x7f730a76a2b0>]

png

clt = cluster.DBSCAN(eps=1.)
clt.fit(df[['x','y','z']])
ind = np.argwhere(clt.labels_==clt.labels_[8330])
with open('4f5d-h.pdb') as src:
    with open('4f5d-h-cluster.pdb','w+') as dst: 
        for idx, line in enumerate(src.readlines()):
            if idx in ind:
                dst.write(line)

接下来就得到了4f5d-h-cluster.pdb,同样丢进PyMOL就可以看到

Cluster


  1. HOLLOW: Generating Accurate Representations of Channel and Interior Surfaces in Molecular Structures Bosco K. Ho and Franz Gruswitz. BMC Structural Biology (2008) 8:49. ↩︎