Python计算多个坐标之间的最小距离

时间:2016-09-07 12:08:13

标签: python coordinates distance bioinformatics

我有两种类型的文件: 答:包含1206行坐标(xyz) - 一个蛋白质链 B:包含114行坐标(xyz) - 一串分子

我想做以下事情: 对于A的每一行,计算距离B的每一行的距离。所以我得到每条A线的114距离值。但是我不需要它们全部,只是每条A线的最短距离。所以期望的输出: 一个1206行的文件,每行包含一个值:最短距离。 保持文件A的原始顺序很重要。

我的代码:

import os
import sys
import numpy as np



outdir = r'E:\MTA\aminosavak_tavolsag\tavolsagok'
for dirname, dirnames, filenames in os.walk(r'E:\MTA\aminosavak_tavolsag\receptorok'):
    for path, dirs, files in os.walk(r'E:\MTA\aminosavak_tavolsag\kotohely'):
        for filename in filenames:
            for fileok in files:
                if filename == fileok:
                    with open(os.path.join(outdir, filename) , "a+") as f:
                        data_ligand = np.loadtxt(os.path.join(path, fileok))
                        data_rec = np.loadtxt(os.path.join(dirname, filename))

                        for i in data_rec:
                            for j in data_ligand:

                                dist = np.linalg.norm(i - j)

                                dist_float = dist.tolist()  
                                dist_str = str(dist_float)
                                dist_list = dist_str.split()
                                for szamok in dist_list:
                                    for x in range(len(dist_list)):
                                        minimum = min([float(x) for x in dist_list])

                            f.write(str(minimum) + "\r\n")

此代码有效,但仅部分有效。 ---我找到蛋白质残基的最终目标是足够接近这一簇分子(结合位点)。我可以使用可视化软件检查我的结果,并且我的代码找到的残留物远远少于应有的残留物。 ----

我无法弄清楚问题出在哪里。你可以帮帮我吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

您的代码非常混乱,我可以看到一些错误。

您在minimum循环之外使用for,因此只写入其最后一个值。

此外,您计算minimum的方式很奇怪。 szamok未使用,x也未使用(因为您在列表表达式中使用了另一个x),因此for周围的minimum = ...个循环都无用。< / p>

另一个可疑的事情是str(dist_float)。您正在将float列表转换为字符串。这将为您提供列表的字符串表示形式,而不是字符串列表。这不仅没用,而且也是错误的,因为当它拆分后它不会给你预期的结果。

假设ij代表A和B的数据行,我会像这样重写代码的结尾:

...
data_ligand = np.loadtxt(os.path.join(path, fileok))
data_rec = np.loadtxt(os.path.join(dirname, filename))

for i in data_rec:
    min_dist = min(np.linalg.norm(i - j) for j in data_ligand)
    f.write("{}\r\n".format(min_dist))  # easier than `str(min_dist)` to customize format