#!/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 <