4

我试图找出属于两个不同链的两个原子是否会被视为“绑定”。这是基于这样一个事实,即如果距离(欧几里德,可以通过给定的 x、y、z 坐标找到)小于两个原子的范德华力加上 0.5A,则认为它是束缚的。问题是我不明白如何计算每个原子的范德华。因为在 PDB 中,原子名称类似于 CB1、CA 等,而不是单个原子。例如,我知道 N 的 Waals 半径。我可以编写代码来计算原子之间的原子距离,但我没有做范德华部分,这是必不可少的。这是我为从两个链和 PDB 链接中提取信息而编写的代码:

http://www.rcsb.org/pdb/explore.do?structureId=3KUD

a = open('3kud.pdb', 'r') # opening the PDB file
b = a.readlines()  # reading the file line by line
c = [x.strip('\n') for x in b]  # extracting '\n' from each line
d = []
# Creating a function that extract information from the given PDB list(only the ATOM parts)
def pdbread():
    global c # calling c in order to define d based on c.
    global d # empty list that contains all the atoms in the list
    for i in range(len(c)):
        if c[i].startswith('ATOM'):
            d.append(c[i])
        else:
            continue
    return d
print 'The atom part of the given PDB file', pdbread()

w = []  # I, then, splitted the given whole atom list part so that each column could be read on the file.
for i in range(len(d)):
    line = d[i].split()
    w.append(line)
    Chain_A = []
    Chain_B = []
    for z in w:
        if z[4] == 'A':
            Chain_A.append(z)
        if z[4] == 'B':
            Chain_B.append(z)

print 'Splitted form of the atom part of the PDB file', w
print 'Chain A :', Chain_A
print 'Chain B:', Chain_B

我可以在这两个链之间创建 for 循环并比较距离,只要我知道如何计算两个可能相互作用的原子之间的范德华半径。

编辑:我决定继续前进,假设每个原子都是第一个字母,因此 CB、OG1 分别是碳和氧,并且将采用它们的范德华值。尽管如此,我仍然在努力编写代码以在两个链之间创建循环并以 if 'vanderWaalsOfatomOfChainA + vanderWaalsOfatomOfChainB + 0.5' > '他们的距离基于欧几里得公式'的形式计算距离:等等。

编辑:我设法将范德华半径添加到 Chain_A 和 Chain_B 中的每个列表中,这是代码:

for z in w:
    if z[2][0] == 'N':
        z.append(1.55)
    if z[2][0] == 'O':
        z.append(1.52)
    if z[2][0] == 'C':
        z.append(1.7)
    if z[2][0] == 'S':
        z.append(1.8)
    if z[2][0] == 'H':
        z.append(1.2)

但我所需要的只是找出如何为两条链创建一个 for 循环。我的意思是我必须比较 A 和 B 的所有原子。 12. 每个列表中的槽给出范德华半径,我需要计算每个 A 列表的第 12 个加上每个 B 列表的第 12 个加上 0.5 并将其与欧几里得公式!

最终编辑:写了这段代码,但它不起作用!基于这个想法,我必须将Chain_A的每个元素与Chain_B进行比较。

A_binding = []
B_binding = []
for x,y in zip(Chain_A, Chain_B):
    if x[12] + y[12] + 0.5 > sqrt((float(x[6])-float(y[6]))**2 + (float(x[7])-float(y[7]))**2 + (float(x[8])-float(y[8]))**2):
        A_binding.append(x)
        B_binding.append(y)
print A_binding
print B_binding
4

2 回答 2

0

也许这可以帮助你:

原子力场值

您感兴趣的部分是 epsilon_vdw_PDB()[0]。它为您提供所有原子范德华兹值。这个文件来自我最近做的一个项目,是我的老师给的。

顺便说一句,你为什么不做 2 个 for 循环?一个用于链A,另一个用于链B。我没有尝试您的代码,但是A的长度可能与B不同。当您使用zip()时,()中的2个对象的长度必须相等我认为(未验证)。

于 2017-01-14T09:40:57.480 回答
0

通常,使用 4 埃距离截止值来识别相互作用的原子。使用NeighborSearchBio.PDB. 它速度很快,并且会使您的脚本更短。

于 2018-11-16T16:56:58.857 回答