我有一个文本文件,如下所示
ATOM 920 CA GLN A 203 39.292 -13.354 17.416 1.00 55.76 C
ATOM 929 CA HIS A 204 38.546 -15.963 14.792 1.00 29.53 C
ATOM 939 CA ASN A 205 39.443 -17.018 11.206 1.00 54.49 C
ATOM 947 CA GLU A 206 41.454 -13.901 10.155 1.00 26.32 C
ATOM 956 CA VAL A 207 43.664 -14.041 13.279 1.00 40.65 C
.
.
.
ATOM 963 CA GLU A 208 45.403 -17.443 13.188 1.00 40.25 C
我想计算两个α-碳原子之间的距离,即计算第一个和第二个原子之间的距离,然后计算第二个和第三个原子之间的距离,依此类推。。。。。两个原子之间的距离可以表示为:distance = sqrt((x1-x2)^2+(y1-y2)^2+(z1-z2)^2) .
第7、8和9列分别表示x、y和z坐标。我需要打印距离和相应的剩余对(第4列),如下所示。(距离值不是实数)
GLN-HIS 4.5
HIS-ASN 3.2
ASN-GLU 2.5
如何使用perl或python进行计算?
不要在空白处拆分
这里给出的其他答案提出了一个错误的假设——坐标将以空格分隔。根据PDB specification of ^{} ,这是而不是必要的情况:PDB记录值是由列索引指定的,并且可以相互流动。例如,第一个
ATOM
记录如下:但这也是完全正确的:
更好的方法
由于列指定的索引以及PDB文件中可能出现的其他问题的数量,您不应该编写自己的解析器。PDB格式很混乱,需要处理很多特殊情况和格式错误的文件。相反,使用已经为您编写的解析器。
我喜欢Biopython的
PDB.PDBParser
。它将把结构解析为Python对象,并提供方便的特性。如果您更喜欢Perl,请查看BioPerl。PDB.Residue
对象允许按名称对原子进行键控访问,并且PDB.Atom
对象重载-
运算符以返回两个原子之间的距离。我们可以使用它来编写简洁明了的代码:代码
假设您的数据在“atoms.txt”中,这将逐行读取并将条目拆分为一个列表:
现在为每个列表提取所需的列,并计算距离等(记住python中的列表是基于零的)。
如果数据用空白分隔,那么一个简单的
split
就可以完成这项工作。对行进行缓冲以按顺序进行比较。输出(带有示例数据):
如果数据是制表符分隔的,则可以在
/\t/
而不是' '
上拆分。相关问题 更多 >
编程相关推荐