With reference to the question Calculating the distance between atomic coordinates, where the input is
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
there is an answer reported as
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 }
The output of above code is the distance between the first CA to the second one and second to third and so on...
How to modify this code to find the distance between first CA to rest of the CAs (2, 3, ..) and from second CA to rest of the CAs (3, 4, ..) and so on and printing only those which is less then 5 Angstrom?
I found that push @line, $_;
statement should be altered to increase the array size but not clear how to do that.