Con referencia a la pregunta Cálculo de la distancia entre coordenadas atómicas, donde la entrada es

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  

Hay una respuesta informada como

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
}

La salida del código anterior es la distancia entre la primera CA a la segunda y la segunda a la tercera y así sucesivamente ...

Cómo modificar este código para encontrar la distancia entre la primera CA al resto de las CA (2, 3, ..) y desde la segunda CA al resto de las CA (3, 4, ..) y así sucesivamente e imprimiendo solo las que es menos de 5 Angstrom? Descubrí que la declaración push @line, $_; debería modificarse para aumentar el tamaño de la matriz, pero no tengo claro cómo hacerlo.

0
pradeep pant 15 dic. 2016 a las 16:47

2 respuestas

La mejor respuesta

Para obtener los pares, lea el archivo en una matriz, @data_array. Luego, recorra las entradas.

Actualización: se agregó la apertura y carga de archivos @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
Chris Charley 16 dic. 2016 a las 17:28

Puede intentar esto:

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

Espero que esto te ayude.

1
ssr1012 16 dic. 2016 a las 07:35