#!/usr/bin/env perl
# Enable Perl warnings
#use strict;
use warnings;
use SOAP::Lite;
use Getopt::Long qw(:config no_ignore_case bundling);
use Data::Dumper;
my ($help, $outfile, $debug, $trace);
my %paramsI = (
"Evalue" => 0.001,
"Identity" => 30.0,
"Overlap" => 80,
);
my %paramsO = ();
GetOptions(
"evalue|E:f" => \$paramsI{"Evalue"},
"identity|I:f" => \$paramsI{"Identity"},
"overlap|X:i" => \$paramsI{"Overlap"},
"stringency|s" => \$paramsO{"Stringency"},
"verbosity|v" => \$paramsO{"Verbose"},
"outfile|O:s" => \$outfile,
"help|h" => \$help,
'debug' => \$debug, # Debug output
'trace' => \$trace, # Show SOAP messages
);
my $NAMESPACE = 'http://www.ebi.ac.uk/WSsas';
my $ENDPOINT = 'http://www.ebi.ac.uk/thornton-srv/databases/cgi-bin/WSsas/WSsas.cgi';
# If required enable SOAP message trace
if ($trace) {
print "Tracing active\n";
SOAP::Lite->import( +trace => 'debug' );
}
if ( $help || !(-f $ARGV[0]) ) {
&usage();
exit;
}
# Get a service proxy and map SOAP faults to exceptions
my $soap = SOAP::Lite
->uri($NAMESPACE)
->proxy($ENDPOINT)
->on_fault(
sub {
my $soap = shift;
my $res = shift;
# Throw an exception for all faults
if ( ref($res) eq '' ) {
die($res);
}
else {
die( $res->faultstring );
}
return new SOAP::SOM;
}
);
my $Sequence;
if (-f $ARGV[0]) {
$Sequence=&read_file($ARGV[0]);
}
my $sequenceData = SOAP::Data->name(Sequence=>$Sequence);
my $paramsIData = SOAP::Data->name(ParametersI=>\%paramsI);
my $paramsOData = SOAP::Data->name(ParametersO=>\%paramsO);
print STDERR "[debug] Submit runFUNCRES\n" if ($debug);
my $results = $soap->runFUNCRES($sequenceData, $paramsIData, $paramsOData);
if($debug) {
print STDERR "[debug] results:\n", Dumper($results);
}
my $myoutput = "";
$myoutput .= ''."\n";
$myoutput .= "\n";
my $i = 0;
foreach my $a ($results->dataof("//runFUNCRESResponse/sas_residue_annotation/features/*")) {
$i ++;
my $feature = $a->value->{'feature_name'};
$myoutput .= "\n";
$myoutput .= "$feature\n";
if ((exists $a->value->{'residues'}) && (exists $a->value->{'residues'}->{'residue'})) {
my $j = 0;
$myoutput .= "\n";
foreach my $b ($results->dataof("//runFUNCRESResponse/sas_residue_annotation/features/[$i]/residues/*")) {
$j ++;
my $residue_i = $b->value->{'residue_index'};
my $residue_n = $b->value->{'residue_name'};
$myoutput .= "\n";
$myoutput .= "$residue_i\n";
$myoutput .= "$residue_n\n";
if ((exists $b->value->{'sourceref'}) && (exists $b->value->{'sourceref'}->{'reference'})) {
$myoutput .= "\n";
my $k = 0;
foreach my $c ($results->dataof("//runFUNCRESResponse/sas_residue_annotation/features/[$i]/residues/[$j]/sourceref/*")) {
$k ++;
$myoutput .= "\n";
my $reference_n = $c->value->{'ref_name'};
my $reference_c = $c->value->{'ref_chain'};
my $reference_i = $c->value->{'ref_index'};
my $reference_r = $c->value->{'ref_residue'};
$myoutput .= "$reference_n\n";
$myoutput .= "$reference_c\n";
$myoutput .= "$reference_i\n";
$myoutput .= "$reference_r\n";
if (exists $c->value->{'annotations'}) {
$myoutput .= "\n";
foreach my $d ($results->dataof("//runFUNCRESResponse/sas_residue_annotation/features/[$i]/residues/[$j]/sourceref/[$k]/annotations/*")) {
my $annotation = $d->value();
$myoutput .= "$annotation\n";
}
$myoutput .= "\n";
}
if (exists $c->value->{'atomic_contacts'}) {
$myoutput .= "\n";
foreach my $d ($results->dataof("//runFUNCRESResponse/sas_residue_annotation/features/[$i]/residues/[$j]/sourceref/[$k]/atomic_contacts/*")) {
$myoutput .= "\n";
my $contact_n = $d->value->{'contact_name'};
my $contact_r = $d->value->{'ref_atom'};
my $contact_p = $d->value->{'partner_atom'};
my $contact_c = $d->value->{'partner_compound'};
$myoutput .= "$contact_n\n";
$myoutput .= "$contact_r\n";
$myoutput .= "$contact_p\n";
$myoutput .= "$contact_c\n";
$myoutput .= "\n";
}
$myoutput .= "\n";
}
$myoutput .= "\n";
}
$myoutput .= "\n";
}
$myoutput .= "\n";
}
$myoutput .= "\n";
}
$myoutput .= "\n";
}
$myoutput .= "\n";
$myoutput .= "\n";
foreach my $source ($results->valueof('//runFUNCRESResponse/sas_residue_annotation/sources/source/')) {
$myoutput .= "\n";
my $source_n = $source->{'source_name'};
my $source_i = $source->{'ref_identity'};
my $source_o = $source->{'ref_overlap'};
my $source_e = $source->{'ref_evalue'};
my $source_p = $source->{'ref_pmid'};
$myoutput .= "$source_n\n";
$myoutput .= "$source_i\n";
$myoutput .= "$source_o\n";
$myoutput .= "$source_e\n";
if ($source_p) {
$myoutput .= "$source_p\n";
}
$myoutput .= "\n";
}
$myoutput .= "\n";
$myoutput .= "\n";
if ($outfile) {
print STDERR "[debug] Write result to $outfile\n" if $debug;
open (OUT, ">$outfile");
print OUT "$myoutput\n";
close OUT;
}
else {
print STDERR "[debug] Get feature_names\n" if $debug;
print "$myoutput";
}
sub read_file {
my $filename = shift;
my $content;
open(FILE, $filename);
while () {
next if (/^>/);
chomp;
s/\*$//;
$content .= $_;
}
close(FILE);
return $content;
}
sub usage {
print STDERR <