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循环之前添加了代码。subprocess
是您的subproc
(您需要编辑您的proc
sub以打印距离或返回合适的字符串进行打印)我是否应该插入这些行来代替“push@line,$”;保持代码的其他部分不变?请在添加这些行后发布完整代码。@pradeep pant我在2 for循环之前添加了代码。subprocess
是您的subproc
(您需要编辑proc
sub以打印距离或返回合适的字符串进行打印)