我有两种类型的文件: 答:包含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")
此代码有效,但仅部分有效。 ---我找到蛋白质残基的最终目标是足够接近这一簇分子(结合位点)。我可以使用可视化软件检查我的结果,并且我的代码找到的残留物远远少于应有的残留物。 ----
我无法弄清楚问题出在哪里。你可以帮帮我吗? 谢谢!
答案 0 :(得分:1)
您的代码非常混乱,我可以看到一些错误。
您在minimum
循环之外使用for
,因此只写入其最后一个值。
此外,您计算minimum
的方式很奇怪。 szamok
未使用,x
也未使用(因为您在列表表达式中使用了另一个x
),因此for
周围的minimum = ...
个循环都无用。< / p>
另一个可疑的事情是str(dist_float)
。您正在将float列表转换为字符串。这将为您提供列表的字符串表示形式,而不是字符串列表。这不仅没用,而且也是错误的,因为当它拆分后它不会给你预期的结果。
假设i
和j
代表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