#! /usr/bin/perl
# We assume that a HMMER3 build tree is in $top_builddir, with binaries in src/ subdir of it
# $top_srcdir is unused: pass "." or $top_builddir
#
# Example:
# mkdir foo-test
# ./x-hmmsearch ~/src/hmmer/trunk/build-icc-mpi . foo-test test.list 1 Pfam-A.seed uniprot/trembl-shuf-1M test.out
#
use Benchmark qw(:hireswallclock) ;
$top_builddir = shift;
$top_srcdir = shift;
$resultdir = shift;
$tblfile = shift;
$nthreads = shift;
$querydb = shift;
$targetdb = shift;
$outfile = shift;
$esl_afetch = "$top_builddir/easel/miniapps/esl-afetch";
$hmmbuild = "$top_builddir/src/hmmbuild";
$hmmsearch = "$top_builddir/src/hmmsearch";
open(OUTFILE,">$outfile") || die "failed to open $outfile";
open(TABLE, "$tblfile") || die "failed to open $tblfile";
$output = `esl-seqstat $targetdb | grep "^Total"`;
if ($?) { die("esl-seqstat failed"); }
if ($output =~ /^Total \# residues:\s+(\d+)/) { $L = $1; }
$n=0;
MSA:
while (
)
{
if (/(\S+)/)
{
$n++;
$msaname = $1;
# Fetch the query MSA (.sto file)
`$esl_afetch -o $resultdir/$msaname.sto $querydb $msaname > /dev/null`;
if ($? != 0) { print "FAILED: $esl_afetch on $msaname\n"; next MSA; }
# Build a model (.hmm file)
$output = `$hmmbuild $resultdir/$msaname.hmm $resultdir/$msaname.sto`;
if ($?) { print("FAILED: $hmmbuild on $msaname\n"); next MSA; }
# We need model length, to calculate normalized Mc/s units
if ($output =~ /^\d+\s+\S+\s+\d+\s+\d+\s+(\d+)/m) { $M = $1; }
# Warmup. (An untimed run, to encourage filesystem to cache the target database.)
if ($n==1) { `$hmmsearch --cpu $nthreads $resultdir/$msaname.hmm $targetdb > /dev/null`; }
# Time hmmsearch (running the requested number of threads)
$t0 = Benchmark->new;
`$hmmsearch --cpu $nthreads $resultdir/$msaname.hmm $targetdb > /dev/null`;
if ($?) { print("FAILED: $hmmsearch on $msaname\n"); next MSA; }
$t1 = Benchmark->new;
# Get the wall clock time.
$td = timediff($t1, $t0);
$walltime = $td->real;
$mcs = $L / 1000000 / $walltime * $M;
printf OUTFILE "%-15s %5d %10.1f %12.2f\n", $msaname, $M, $mcs, $walltime;
unlink "$resultdir/$msaname.sto";
unlink "$resultdir/$msaname.hmm";
}
}
close TABLE;
close OUTFILE;