2016-12-15 12 views
1

со ссылкой на вопрос Calculating the distance between atomic coordinates, где входРасчет расстояния в PDB файл

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 
} 

Выход выше код является расстоянием между первым СА вторым, вторым и третьим и так далее ...

Как изменить этот код, чтобы найти расстояние между первым СА до остальной части СА (2, 3, ..) и от второго ЦС до остальной части СА (3, 4, ...) и так далее и только для печати те, которые меньше 5 ангстрем? Я обнаружил, что оператор push @line, $_; должен быть изменен, чтобы увеличить размер массива, но не ясно, как это сделать.

+0

Каков ваш ожидаемый выход? – ssr1012

+0

Gln-HIS "расстояние Значение" Gln-АСН "расстояние Значение" Глны-Гл "расстояние значение" ... HIS-АСН "расстояние Значение" HIS-Glu "расстояние Значение" His-VAL «расстояние значение « ... ... ... ASN-GLU« значение расстояния » ASN-VAL« значение расстояния » ... так далее ... @ ssr1012 –

ответ

3

Чтобы получить пары, прочитайте файл в массиве, @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]);  
    } 
} 
+0

Должен ли я вставлять эти линии вместо« push @line, $ _; «сохранить другие части кода так, как есть? После добавления этих строк отправьте полный код. –

+1

@pradeep pant Я добавил код, предшествующий двум циклам. sub 'process' - ваш подпроцесс (вам нужно будет отредактировать подпрограмму' proc', чтобы печатать расстояния или возвращать подходящую строку для печати) –

3

Может быть попробовать это:

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 

Я надеюсь, что это поможет.