Perl 在PDB文件中计算距离

Perl 在PDB文件中计算距离,perl,distance,pdb,calculation,Perl,Distance,Pdb,Calculation,关于问题,输入在哪里 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    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  
有报道称

使用严格;
使用警告;
我的@line;
而(){
按@line,$#将行添加到缓冲区
下一步如果@line<2;#跳过,除非缓冲区已满
打印过程(@line),“\n”#处理和打印
shift@line;#移除使用过的线路
}
子过程{
my@a=拆分“”,shift;#第1行
my@b=拆分“”,shift;#第2行
my$x=($a[6]-$b[6])#计算差异
my$y=($a[7]-$b[7]);
my$z=($a[8]-$b[8]);
my$dist=sprintf“%.1f”#设置数字格式
sqrt($x**2+$y**2+$z**2);#进行计算
返回“$a[3]-$b[3]\t$dist”#返回要打印的字符串
}
上述代码的输出是第一个CA到第二个CA和第二个CA到第三个CA之间的距离,依此类推

如何修改此代码以查找第一个CA到其余CA(2,3,…)之间的距离,以及从第二个CA到其余CA(3,4,…)之间的距离,依此类推,并仅打印小于5埃的CA?
我发现
push@line,$\
语句应该被修改以增加数组大小,但不清楚如何做。

要获得对,请将文件读入数组,
@data\u array
。然后在条目上循环

更新:添加了文件打开和加载@data\u数组

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]);    
    }   
}

打开我的$fh,”要获取对,请将文件读入数组,
@data\u array
。然后在条目上循环

更新:添加了文件打开和加载@data\u数组

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]);    
    }   
}
打开我的$fh,可以尝试以下操作:

use strict;
use warnings;

my @alllines = ();
while(<DATA>) {  push(@alllines, $_);  }

#Each Current line
for(my $i=0; $i<=$#alllines+1; $i++)
{
    #Each Next line 
    for(my $j=$i+1; $j<=$#alllines; $j++)
    {
        if($alllines[$i])
        {
            #Split the line into tab delimits
            my ($line1_tb_1,$line1_tb_2,$line1_tb_3) = split /\t/, $alllines[$i];
            print "Main_Line: $line1_tb_1\t$line1_tb_2\t$line1_tb_3";
            if($alllines[$j])
            {
                #Split the line into tab delimits
                my ($line_nxt_tb1,$line_nxt_tb2,$line_nxt_tb3) = split /\t/, $alllines[$j];

                print "Next_Line: $line_nxt_tb1\t$line_nxt_tb2\t$line_nxt_tb3";

                #Do it your coding/regex here
            }
        }
        #system 'pause'; Testing Purpose!!!
    }
}

__DATA__
tab1    123 456
tab2    789 012
tab3    345 678
tab4    901 234
tab5    567 890
使用严格;
使用警告;
我的@alllines=();
while(){push(@alllines,$)}
#每条电流线
对于(我的$i=0;$i)可以尝试以下方法:

use strict;
use warnings;

my @alllines = ();
while(<DATA>) {  push(@alllines, $_);  }

#Each Current line
for(my $i=0; $i<=$#alllines+1; $i++)
{
    #Each Next line 
    for(my $j=$i+1; $j<=$#alllines; $j++)
    {
        if($alllines[$i])
        {
            #Split the line into tab delimits
            my ($line1_tb_1,$line1_tb_2,$line1_tb_3) = split /\t/, $alllines[$i];
            print "Main_Line: $line1_tb_1\t$line1_tb_2\t$line1_tb_3";
            if($alllines[$j])
            {
                #Split the line into tab delimits
                my ($line_nxt_tb1,$line_nxt_tb2,$line_nxt_tb3) = split /\t/, $alllines[$j];

                print "Next_Line: $line_nxt_tb1\t$line_nxt_tb2\t$line_nxt_tb3";

                #Do it your coding/regex here
            }
        }
        #system 'pause'; Testing Purpose!!!
    }
}

__DATA__
tab1    123 456
tab2    789 012
tab3    345 678
tab4    901 234
tab5    567 890
使用严格;
使用警告;
我的@alllines=();
while(){push(@alllines,$)}
#每条电流线

对于(my$i=0;$i您的预期输出是什么?GLN-HIS“距离值”GLN-ASN“距离值”GLN-GLU“距离值”…HIS-ASN“距离值”HIS-GLU“距离值”HIS-VAL“距离值”…ASN-GLU“距离值”ASN-VAL“距离值”…等等…@SSR1012您的预期输出是什么?GLN-HIS“距离值”GLN-ASN“距离值”GLN-GLU“距离值”…HIS-ASN“距离值”HIS-GLU“距离值”HIS-VAL“距离值”…ASN-GLU“距离值”ASN-VAL“距离值”…依此类推…@SSR1012我应该插入这些行来代替“推送@行,$\;“保持代码的其他部分不变?请在添加这些行后发布完整代码。@pradeep pant I在2 for循环之前添加了代码。sub
process
是您的sub
proc
(您需要编辑您的
proc
sub以打印距离或返回合适的字符串进行打印)我是否应该插入这些行来代替“push@line,$”;保持代码的其他部分不变?请在添加这些行后发布完整代码。@pradeep pant我在2 for循环之前添加了代码。sub
process
是您的sub
proc
(您需要编辑
proc
sub以打印距离或返回合适的字符串进行打印)