sub blast_filets { my ($PF_READ, $PF_WRITE); my $pid = open2($PF_READ, $PF_WRITE, $PROFIT) or die "Couldn't open pipe to profit. $!"; my $filets1 = $_[0]; my $filets2 = $_[1]; my $range1 = $_[2]; my $range2 = $_[3] || $range1; my @rmsd = (); my $count = 0; if ( @$range1 != @$range2 ) { die "Ranges do not have equivalent zone sizes."; } foreach my $f1 ( @$filets1 ) { print "REFERENCE $f1\n" if $VERBOSE >= 3; print $PF_WRITE "REFERENCE $f1\n"; foreach my $f2 ( @$filets2 ) { if ( $VERBOSE >= 3 ) { print "MOBILE $f2\n"; print "ZONE CLEAR\n"; print "ATOMS CA\n"; foreach my $i ( 0..$#$range1 ) { print "ZONE $range1->[$i][0]-$range1->[$i][1]" . ":$range2->[$i][0]-$range2->[$i][1]\n"; } print "FIT\n"; } print $PF_WRITE "MOBILE $f2\n"; print $PF_WRITE "ZONE CLEAR\n"; print $PF_WRITE "ATOMS CA\n"; foreach my $i ( 0..$#$range1 ) { print $PF_WRITE "ZONE $range1->[$i][0]-$range1->[$i][1]" . ":$range2->[$i][0]-$range2->[$i][1]\n"; } print $PF_WRITE "FIT\n"; print $PF_WRITE "\n\n\n\n\n\n\n\n\n\n"; } } print $PF_WRITE "QUIT\n"; my $result ; #print "Reading results\n"; while ( defined ($result = readline($PF_READ))) { #print "RESULT = $result\n" if $VERBOSE >= 2; if ($result =~ /RMS: ([\d\.]+)/m) { #print "Rmsd = $1\n"; push @rmsd, $1; $count++; } elsif ( $result =~ /Error/i ) { print "Error: $result\n"; } } my $result_wait = waitpid($pid, 0); if ( $result_wait != $pid ) { die "Waitpid returned $result_wait instead of $pid. $?."; } #print "DONE WITH RMSD\n"; my ( $rmsd, $stddev ) = Utility::Mean_and_Stddev (@rmsd); return ($rmsd, $stddev, $count, \@rmsd); }