计算原子坐标之间的距离

发布于 2021-01-29 15:01:10

我有一个文本文件,如下所示

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进行此计算?

关注者
0
被浏览
82
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    如果您的数据用空格隔开,那么简单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/而不是' '



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看