Mercurial > repos > mahtabm > ensembl
diff variant_effect_predictor/Bio/EnsEMBL/DB/ExternalFeatureFactoryI.pm @ 0:1f6dce3d34e0
Uploaded
| author | mahtabm |
|---|---|
| date | Thu, 11 Apr 2013 02:01:53 -0400 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/variant_effect_predictor/Bio/EnsEMBL/DB/ExternalFeatureFactoryI.pm Thu Apr 11 02:01:53 2013 -0400 @@ -0,0 +1,301 @@ +=head1 LICENSE + + Copyright (c) 1999-2012 The European Bioinformatics Institute and + Genome Research Limited. All rights reserved. + + This software is distributed under a modified Apache license. + For license details, please see + + http://www.ensembl.org/info/about/code_licence.html + +=head1 CONTACT + + Please email comments or questions to the public Ensembl + developers list at <dev@ensembl.org>. + + Questions may also be sent to the Ensembl help desk at + <helpdesk@ensembl.org>. + +=cut + +=head1 NAME + +Bio::EnsEMBL::DB::ExternalFeatureFactoryI - +Legacy Abstract interface for External Feature +Factories. Bio::EnsEMBL::External::ExternalFeatureAdaptor should be used +instead if possible. + +=head1 SYNOPSIS + + $external_ff = new ImplementingExternalFeatureFactoryClass; + + $database_adaptor = new Bio::EnsEMBL::DBSQL::DBAdaptor( + -host => 'blah', + -dbname => 'other', + -pass => 'pass' + ); + + # alternatively, you can add external databases to an obj once made + $database_adaptor->add_ExternalFeatureFactory($external_ff); + + # now the ExternalFeatureFactory has been added, Ensembl RawContigs + # and Slices will now have ExternalFeatures on them + $contig = + $db_adaptor->get_RawContigAdaptor->fetch_by_name('AC00056.00001'); + @external = @{ $contig->get_all_ExternalFeatures() }; + + # this works on Slices as well + $slice = + $db_adaptor->get_SliceAdaptor->fetch_by_chr_start_end( '12', 10000, + 30000 ); + @external = @{ $slice->get_all_ExternalFeatures() }; + +=head1 DESCRIPTION + +This is a legacy class. It is included only for backwards +compatibility with ExternalFeatureFactories which are presumably +still used to place data into ensembl. It is recommended that if +you wish to create EnsEMBL features externally that you use the +Bio::EnsEMBL::External::ExternalFeatureAdaptor instead. + +This object defines the abstract interface for External Database access +inside Ensembl. The aim is that one can attach an External Database +which will generate Sequence Features and these Sequence Features will +be accessible along side all the internal Ensembl sequence features, for +drawing, EMBL dumping etc. In particular, the external database does not +have to worry about the transformation of the Sequence Feature objects +into VirtualContigs. + +Sequence Features have to be defined in one of two coordinate systems: +Original EMBL/GenBank coordinates of a particular sequnence version or +the Ensembl contig coordinates. This means you have to calculate your +sequence features in one these two coordinate systems + +The methods that have to be implemented are: + + get_External_SeqFeatures_contig( $ensembl_contig_identifier, + $sequence_version, $start, $end ); + + get_External_SeqFeatures_clone( $embl_accession_number, + $sequence_version, $start, $end ); + +The semantics of this method is as follows: + + $ensembl_contig_identifier - the ensembl contig id (external id). + $sequence_version - embl/genbank sequence version + $embl_accession_number - the embl/genbank accession number + +The $start/$end can be ignored, but methods can take advantage of it. +This is so that ensembl can ask for features only on a region of DNA, +and if desired, the external database can respond with features only in +this region, rather than the entire sequence. + +The hope is that the second method could potentially have a very complex +set of mappings of other embl_accession numbers to one embl_accession +number and provide the complex mapping. + +The methods should return Sequence Features with the following spec: + + a) must implement the Bio::SeqFeatureI interface. + + b) must accept "set" calls on + + start,end,strand + + to provide coordinate transformation of the feature. + + c) must be unique in-memory objects, ie, the implementation is not + allowed to cache the sequence feature in its entirity. Two separate + calls to get_External_SeqFeatures_contig must be able to separately + set start,end,strand information without clobbering each other. The + other information, if so wished, can be cached by each SeqFeature + holding onto another object, but this is left to the implementor to + decide on the correct strategy. + + d) must return an unique identifier when called with method id. + +You must implement both functions. In most cases, one function will +always return an empty list, whereas the other function will actually +query the external database. + +The second way of accessing the External Database from Ensembl is using +unique internal identifiers in that database. The method is: + + get_SeqFeature_by_id($id); + +It should return exactly one Sequence Feature object of the same type as +above. + +=head1 METHODS + +=cut + +package Bio::EnsEMBL::DB::ExternalFeatureFactoryI; +use Bio::EnsEMBL::External::ExternalFeatureAdaptor; +use vars qw(@ISA); + +@ISA = ( 'Bio::EnsEMBL::External::ExternalFeatureAdaptor' ); + + +=head2 coordinate_systems + + Arg [1] : none + Example : none + Description: This method is present to make the ExternalFeatureFactory + interface behave as an ExternalFeatureAdaptor. It is for + backwards compatibility. + Returntype : none + Exceptions : none + Caller : internal + +=cut + +sub coordinate_systems { + my $self = shift; + return qw(CONTIG); +} + + +=head2 fetch_all_by_contig_name + + Arg [1] : none + Example : none + Description: This method is present to make the ExternalFeatureFactory + interface behave as an ExternalFeatureAdaptor. It is for + backwards compatibility. + Returntype : none + Exceptions : none + Caller : internal + +=cut + +sub fetch_all_by_contig_name { + my ($self, $contig_name) = @_; + + unless($self->db) { + $self->throw('DB attribute not set. This value must be set for the ' . + 'ExternalFeatureFactory to function correctly'); + } + + my @features = (); + + my $ctg = $self->db->get_RawContigAdaptor->fetch_by_name($contig_name); + my $clone = $ctg->clone; + my $version = $clone->version; + my $ctg_length = $ctg->length; + + #get contig features + push @features, $self->get_Ensembl_SeqFeatures_contig($ctg->name, + $version, + 1, + $ctg_length); + + #get clone features + my $clone_start = $ctg->embl_offset; + my $clone_end = $clone_start + $ctg_length - 1; + my @clone_features = $self->get_Ensembl_SeqFeatures_clone($clone->id, + $version, + $clone_start, + $clone_end); + + #change clone coordinates to contig coordinates + my ($start, $end); + foreach my $f (@clone_features) { + $start = $f->start - $clone_start + 1; + $end = $f->end - $clone_start + 1; + + #skip features outside the contig + next if($end < 1 || $start > $ctg_length); + + $f->start($start); + $f->end($end); + + push @features, $f; + } + + return \@features; +} + +=head2 get_Ensembl_SeqFeatures_contig + + Title : get_Ensembl_SeqFeatures_contig (Abstract) + Usage : + Function: + Example : + Returns : + Args : + + +=cut + +sub get_Ensembl_SeqFeatures_contig{ + my ($self) = @_; + + $self->warn("Abstract method get_External_SeqFeatures_contig " . + "encountered in base class. Implementation failed to complete it"); + +} + +=head2 get_Ensembl_SeqFeatures_clone + + Title : get_Ensembl_SeqFeatures_clone (Abstract) + Usage : + Function: + Example : + Returns : + Args : + + +=cut + +sub get_Ensembl_SeqFeatures_clone{ + my ($self) = @_; + + $self->warn("Abstract method get_Ensembl_SeqFeatures_clone " . + "encountered in base class. Implementation failed to complete it"); + +} + +=head2 get_Ensembl_Genes_clone + + Title : get_Ensembl_Genes_clone + Function: returns Gene objects in clone coordinates from a gene id + Returns : An array of Gene objects + Args : clone id + +=cut + +sub get_Ensembl_Genes_clone { + my $self = @_; + + return; +} + +=head2 get_SeqFeature_by_id + + Title : get_SeqFeature_by_id (Abstract) + Usage : + Function: Return SeqFeature object for any valid unique id + Example : + Returns : + Args : id as determined by the External Database + + +=cut + + +sub get_SeqFeature_by_id { + my ($self) = @_; + $self->warn("Abstract method get_SeqFeature_by_id encountered " . + "in base class. Implementation failed to complete it"); +} + + +1; + + + + + + +
