我有一个文本文件,如下所示
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) .
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进行此计算?
如果您的数据用空格隔开,那么简单split就可以完成这项工作。缓冲线以顺序比较它们。
split
use strict; use warnings; my @line; while (<>) { push @line, $_; # add line to buffer next if @line < 2; # skip unless buffer is full print proc(@line), "\n"; # process and print shift @line; # remove used line } sub proc { my @a = split ' ', shift; # line 1 my @b = split ' ', shift; # line 2 my $x = ($a[6]-$b[6]); # calculate the diffs my $y = ($a[7]-$b[7]); my $z = ($a[8]-$b[8]); my $dist = sprintf "%.1f", # format the number sqrt($x**2+$y**2+$z**2); # do the calculation return "$a[3]-$b[3]\t$dist"; # return the string for printing }
输出(带有示例数据):
GLN-HIS 3.8 HIS-ASN 3.8 ASN-GLU 3.9 GLU-VAL 3.8
如果您的数据以制表符分隔,则可以分割/\t/而不是' '。
/\t/
' '