计算PDB文件中的距离

时间:2016-12-15 13:47:34

标签: perl distance pdb calculation

参考问题Calculating the distance between atomic coordinates,输入是

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  

报告为an answer

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
}

上面代码的输出是第一个CA到第二个CA和第二个到第三个之间的距离等等......

如何修改此代码以查找第一个CA与其余CA(2,3,...)之间的距离以及从第二个CA到其余CA(3,4,...)等的距离以及打印只有那些小于5埃的那些? 我发现应该更改push @line, $_;语句以增加数组大小但不清楚如何执行此操作。

2 个答案:

答案 0 :(得分:1)

要获取对,请将文件读入数组@data_array。然后遍历条目。

更新:添加了文件打开并加载@data_array。

open my $fh, '<', 'atom_file.pdb' or die $!;

my @data_array = <$fh>;

close $fh or die $!;

for my $i (0 .. $#data_array) {
    for my $j ($i+1 .. $#data_array) {
        process(@data_array[$i,$j]);    
    }   
}

答案 1 :(得分:1)

可以试试这个:

Default Values

我希望这会对你有所帮助。