[DAS] Ensembl via SOAP
Lincoln Stein
lstein@cshl.org
Wed, 5 Jun 2002 12:33:20 -0400
My experience with SOAP::Lite has been that it is non-trivial to work
backwards from the Perl object model to the XSL. I ended up writing an
axis-equivalent in Perl so that I could watch the objects on the wire and
reverse-engineering it from there.
Lincoln
On Wednesday 05 June 2002 08:34, Brian wrote:
> Yeah,
>
> We have lot's of experience writing serializers and
> deserialiaers...If you need exaples you can look at OmniGene's omnitide
> package. There are about 20 (d/s)erializers checked in.
>
> as an aside we had the crazy idea of writing serializers for
> biojava objects but looked at the amount of work involved and thought that
> we'd have more support to do this.
>
> Is anyone else interested in helping write sers/desers for
> biojava/bioperl objects??
>
> I think we'd need to talk about the object model and then write
> the XSD's. From their we could use castor or jaxb or axis (I'd rather do
> axis) to get the objects flowing back and forth over the wire...Let me
> know...We are very interested in doing this with a partner.
>
> Best,
>
> -B
>
> On Wed, 5 Jun 2002, Tony Cox wrote:
> > On Wed, 5 Jun 2002, Brian Gilman wrote:
> >
> > +>This is great!!
> > +>
> > +> Do you need help with a java implementation?? I'd be willing to
> > +>help you out in a week or so...
> >
> > Hi Brian,
> >
> > Help would be welcome - as I mentioned below I got a java client working
> > but I fell over on having to write an object deserializer. Hopefully you
> > could pick it up there...?
> >
> > Tony
> >
> >
> > +>
> > +> -B
> > +>
> > +>-----------------------
> > +>Brian Gilman <gilmanb@genome.wi.mit.edu>
> > +>Group Leader Medical & Population Genetics Dept.
> > +>MIT/Whitehead Inst. Center for Genome Research
> > +>One Kendall Square, Bldg. 300 / Cambridge, MA 02139-1561 USA
> > +>phone +1 617 252 1069 / fax +1 617 252 1902
> > +>
> > +>
> > +>On Wed, 5 Jun 2002, Tony Cox wrote:
> > +>
> > +>>
> > +>> I've been playing over the weekend with SOAP access to Ensembl
> > objects. I have a +>> test server running that can handle queries.
> > +>>
> > +>>
> > +>> Nutshell:
> > +>> =========
> > +>>
> > +>>
> > +>> use SOAP::Lite +autodispatch =>
> > +>> uri => 'Bio::EnsEMBL::Remote::Object',
> > +>> proxy =>
> > 'http://services.ensembl.org:7070/cgi-bin/ensembl_rpcrouter'; +>>
> > +>> my $trans =
> > +>>
> > Bio::EnsEMBL::Remote::Object->new('type'=>'transcript','id'=>'ENST0000022
> >5283'); +>> print $trans->seq(), "\n";
> > +>> print $trans->translate(), "\n";
> > +>>
> > +>>
> > +>>
> > +>> It is a pretty niave implementation but allows fairly reasonable
> > access to +>> Ensembl objects via RPC. A remote "proxy" class takes care
> > of creating and +>> manipulating ensembl objects on the server side and
> > allows you to make direct +>> calls locally. General id/start/end type
> > calls all work. Since ensembl objects +>> are all intimately tied to DB
> > connections which all goes horribly wrong over +>> SOAP the proxy object
> > takes care creating these connections as necessary on the +>> server.
> > Calls that returns an object have been changed to return an ID - which
> > +>> can be used to create a remote object. I've only done the main stuff
> > - features, +>> SNPs etc, are missing
> > +>>
> > +>> The good thing is that you don't need any local databases or even
> > ensembl code, +>> just a working copy of SOAP::Lite from CPAN. The bad
> > thing is that it is pretty +>> __slow__ at the moment. The server is not
> > running under mod_perl so most of the +>> response time is taken up in
> > module compilation and XML transport. I'll try to +>> get it running
> > under mod_perl and with transport compression enabled. +>>
> > +>> I don't see this as an interface of choice for the bioinformatician!
> > - it is too +>> slow and anyway they will have the "real" ensembl code to
> > turn to. This is much +>> more of a lightweight interface for
> > conveniently fetching sequences, genes etc +>> where speed is not a
> > critical issue, and the convenience of a simple programming +>> interface
> > is the important factor.
> > +>>
> > +>> I'd be very interested to see interoperability tested. I did write a
> > very small +>> java client to make requests but rapidly got out of my
> > depth when having to +>> write a deserializer for the remote object.
> > After looking into the Omnigene code +>> I see how these work but I'm
> > rather hoping that somebody on the omnigene team +>> might have a go at
> > doing this.
> > +>>
> > +>> Following is a simple script that provides examples of manipulating
> > remote +>> objects. You "get" a remote object on the server be creating a
> > new +>> Bio::EnsEMBL::Remote::Object and giving a it a type and ID. At
> > the moment you +>> can only fetch virtualcontigs, genes, transcripts,
> > exons, clones, contigs and +>> translations (peptides). By the magic of
> > "autodispatch", if you get a "thingy" +>> back, you can just treat it as
> > a normal object and make calls on it. Perl's +>> autoloader will try and
> > satisfy calls that are not overloaded in the remote +>> object (I know
> > this sucks). If they are simple get/property calls they will +>> probably
> > work - if the call returns an object/objects, bad things will probably
> > +>> happen. Trying to write to the object may work (I havn't tried it)
> > but is likely +>> not to be a useful thing to do! Remember this is a
> > transaction-type system where +>> all the responses need to be marshalled
> > before transport takes place so it will +>> not "stream" data to you as
> > if it were a socket-style connection. +>>
> > +>> In the event of an error, you usually end up with undef (the code is
> > pretty raw +>> at the moment). If you really want you can track down
> > errors, use the following +>> block:
> > +>>
> > +>> if(SOAP::Lite->self->call->fault) {
> > +>> print "Fault code: ", SOAP::Lite->self->call->faultcode,
> > "\n"; +>> print "Fault string: ",
> > SOAP::Lite->self->call->faultstring, "\n"; +>> print "Fault
> > detail: ", SOAP::Lite->self->call->faultdetail, "\n"; +>> print
> > "Fault actor: ", SOAP::Lite->self->call->faultactor, "\n"; +>>
> > exit;
> > +>> }
> > +>>
> > +>>
> > +>> comments and suggestions welcome,
> > +>>
> > +>> cheers
> > +>>
> > +>> Tony
> > +>>
> > +>>
> > +>>
> > +>>
> > +>>
> > +>>
> > +>> To try the server out enable one or more of the following blocks:
> > +>>
> > +>>
> > +>> #!/usr/local/bin/perl
> > +>>
> > +>> package MySoapClient;
> > +>>
> > +>> use strict;
> > +>> use SOAP::Lite +autodispatch =>
> > +>> uri => 'Bio::EnsEMBL::Remote::Object',
> > +>> proxy =>
> > 'http://services.ensembl.org:7070/cgi-bin/ensembl_rpcrouter'; +>>
> > +>> if(1){
> > +>> my @g = (qw(ENSG00000131591 BRCA1));
> > +>> foreach my $g (@g){
> > +>> print "Getting gene: $g...\n";
> > +>> $g =
> > Bio::EnsEMBL::Remote::Object->new('type'=>'gene','id'=>$g); +>>
> > print "\tGene ID: ", $g->id(), "\n";
> > +>> foreach my $t ($g->transcripts()){
> > +>> my $t =
> > +>> Bio::EnsEMBL::Remote::Object->new('type'=>'transcript','id'=>$t);
> > +>> print "\t\tTranscript ID: ", $t->id(), "\n";
> > +>> print "\t\tTranscript length: ", $t->length(), "\n";
> > +>> #print "\t\tTranscript seq: ", $t->seq(), "\n";
> > +>> print "\t\tTranscript protein: ", $t->translate(), "\n";
> > +>> }
> > +>> }
> > +>> }
> > +>>
> > +>> if(0){
> > +>> print "Getting remote clone AP000869...\n";
> > +>> my $cl =
> > +>> Bio::EnsEMBL::Remote::Object->new('type'=>'clone','id'=>'AP000869');
> > +>> print "Clone: ", $cl->embl_id(), "\n";
> > +>> print "Version: ", $cl->version(), "\n";
> > +>>
> > +>> foreach my $c ($cl->contigs()){
> > +>> my $c =
> > Bio::EnsEMBL::Remote::Object->new('type'=>'contig','id'=>$c); +>>
> > my $id = $c->id();
> > +>> if($c->is_static_golden()){
> > +>> print "\tContig ID: $id (golden)\n";
> > +>> print "\tContig length: ", $c->length(), "\n";
> > +>> print "\tContig is golden?: yes\n";
> > +>> print "\t\tContig global start: ",
> > $c->static_golden_start(), "\n"; +>> print "\t\tContig global
> > end: ", $c->static_golden_end(), "\n"; +>> print
> > "\t\tContig global ori: ", $c->static_golden_ori(), "\n"; +>>
> > #print "\tContig seq: ", $c->seq(), "\n";
> > +>> } else {
> > +>> print "\tContig ID: $id (non-golden)\n";
> > +>> }
> > +>> }
> > +>> }
> > +>>
> > +>>
> > +>> if(0){
> > +>> my $chr = 1;
> > +>> my $start = 100000;
> > +>> my $end = 200000;
> > +>> print "Getting remote virtualcontig for $chr, $start-$end...\n";
> > +>> my $v =
> > +>>
> > Bio::EnsEMBL::Remote::Object->new('type'=>'virtualcontig','chr'=>$chr,
> > +>> 'start'=>$start, 'end'=>$end);
> > +>> print "Virtual contig ID: ", $v->id(), "\n";
> > +>> print "Virtual contig length: ", $v->length(), "\n";
> > +>> print "Virtual contig chromosome: ", $v->_chr_name(), "\n";
> > +>> print "Virtual contig chromosome length: ",
> > $v->fetch_chromosome_length(), +>> "\n";
> > +>>
> > +>> foreach my $g ($v->genes()){
> > +>> $g =
> > Bio::EnsEMBL::Remote::Object->new('type'=>'gene','id'=>$g); +>>
> > print "\tGene ID: ", $g->id(), "\n";
> > +>> foreach my $t ($g->transcripts()){
> > +>> my $t =
> > +>> Bio::EnsEMBL::Remote::Object->new('type'=>'transcript','id'=>$t);
> > +>> print "\t\tTranscript ID: ", $t->id(), "\n";
> > +>> print "\t\tTranscript length: ", $t->length(), "\n";
> > +>> #print "\t\tTranscript seq: ", $t->seq(), "\n";
> > +>> #print "\t\tTranscript protein: ", $t->translate(), "\n";
> > +>> foreach my $e ($t->exons()){
> > +>> my $e =
> > +>> Bio::EnsEMBL::Remote::Object->new('type'=>'exon','id'=>$e);
> > +>> print "\t\t\tExon ID: ", $e->id(), "\n";
> > +>> print "\t\t\tExon start: ", $e->ori_start(), "\n";
> > +>> print "\t\t\tExon end: ", $e->ori_end(), "\n";
> > +>> print "\t\t\tExon strand: ", $e->strand(), "\n";
> > +>> print "\t\t\tExon seq: ", $e->seq(), "\n";
> > +>> }
> > +>> }
> > +>>
> > +>> }
> > +>> }
> > +>>
> > +>> if(0){
> > +>> my $p = "ENSP00000223439";
> > +>> print "Getting remote peptide $p...\n";
> > +>> my $p =
> > Bio::EnsEMBL::Remote::Object->new('type'=>'translation','id'=>$p); +>>
> > print $p->seq();
> > +>> }
> > +>>
> > +>>
> > +>>
> > +>>
> > +>> ******************************************************
> > +>> Tony Cox Email:avc@sanger.ac.uk
> > +>> Sanger Institute WWW:www.sanger.ac.uk
> > +>> Wellcome Trust Genome Campus Webmaster
> > +>> Hinxton Tel: +44 1223 834244
> > +>> Cambs. CB10 1SA Fax: +44 1223 494919
> > +>> ******************************************************
> > +>>
> > +>> _______________________________________________
> > +>> DAS mailing list
> > +>> DAS@biodas.org
> > +>> http://biodas.org/mailman/listinfo/das
> > +>>
> > +>
> >
> > ******************************************************
> > Tony Cox Email:avc@sanger.ac.uk
> > Sanger Institute WWW:www.sanger.ac.uk
> > Wellcome Trust Genome Campus Webmaster
> > Hinxton Tel: +44 1223 834244
> > Cambs. CB10 1SA Fax: +44 1223 494919
> > ******************************************************
> >
> > _______________________________________________
> > DAS mailing list
> > DAS@biodas.org
> > http://biodas.org/mailman/listinfo/das
--
========================================================================
Lincoln D. Stein Cold Spring Harbor Laboratory
lstein@cshl.org Cold Spring Harbor, NY
========================================================================