I have triplicate simulations of several homologs of a protein. The goal is to compare the structures at certain time ranges across all simulations and record statistics (avg, min, stddev of RMSD) in different subgroups. Oh, and over different zones for alignment. I imagine almost every protein simulation group has written something similar at one point or another, and now it's my turn. :)
Right not the code is very specific for my situation, but I'm planning to generalize it for my lab after I understand the results a little better. I don't know if it would generalize well past that... over half the code is just parsing through which PDBs I have, giving them titles, organizing timepoints, etc... The part that deals with profit is basically one loop and one subroutine.
I'll be happy to email a copy to you if you're interested, but I don't think you'll find it very enlightening. Here's the core subroutine. $filets are lists of PDBs to be compared. $ranges are the zones to use corresponding to each set. All the hard stuff is the bookkeeping, which will sadly be very user dependent.
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);
}
Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
Read Where should I post X? if you're not absolutely sure you're posting in the right place.
Please read these before you post! —
Posts may use any of the Perl Monks Approved HTML tags:
- a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
| |
For: |
|
Use: |
| & | | & |
| < | | < |
| > | | > |
| [ | | [ |
| ] | | ] |
Link using PerlMonks shortcuts! What shortcuts can I use for linking?
See Writeup Formatting Tips and other pages linked from there for more info.