Mercurial > repos > mahtabm > ensembl
diff variant_effect_predictor/Bio/EnsEMBL/DBSQL/ProteinFeatureAdaptor.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/DBSQL/ProteinFeatureAdaptor.pm Thu Apr 11 02:01:53 2013 -0400 @@ -0,0 +1,371 @@ +=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::DBSQL::ProteinFeatureAdaptor + +=head1 SYNOPSIS + + use Bio::EnsEMBL::Registry; + + Bio::EnsEMBL::Registry->load_registry_from_db( + -host => 'ensembldb.ensembl.org', + -user => 'anonymous' + ); + + $pfa = Bio::EnsEMBL::Registry->get_adaptor( "human", "core", + "proteinfeature" ); + + my @prot_feats = @{ $pfa->fetch_all_by_translation_id(1231) }; + + my $prot_feat = $pfa->fetch_by_dbID(523); + +=head1 METHODS + +=cut + + +package Bio::EnsEMBL::DBSQL::ProteinFeatureAdaptor; + +use strict; + +use Bio::EnsEMBL::DBSQL::BaseAdaptor; +use Bio::EnsEMBL::ProteinFeature; +use Bio::EnsEMBL::Utils::Exception qw(throw deprecate warning); + +use vars qw(@ISA); +@ISA = qw(Bio::EnsEMBL::DBSQL::BaseAdaptor); + + +=head2 fetch_all_by_translation_id + + Arg [1] : int $transl + the internal id of the translation corresponding to protein + whose features are desired + Example : @prot_feats = + @{ $prot_feat_adaptor->fetch_by_translation_id(1234) }; + Description: Gets all protein features present on a peptide using the + translations internal identifier. This method will return + an unsorted list of all protein_feature types. The feature + types may be distinguished using the logic name attribute of + the attached analysis objects. + Returntype : listref of Bio::EnsEMBL::ProteinFeatures + Exceptions : none + Caller : ? + Status : Stable + +=cut + +sub fetch_all_by_translation_id { + my($self,$translation_id) = @_; + + if(!$translation_id) { + throw("translation_id argument is required\n"); + } + + my @features; + my $analysis_adaptor = $self->db()->get_AnalysisAdaptor(); + + my $sth = $self->prepare + ("SELECT protein_feature_id, p.seq_start, p.seq_end, p.analysis_id, " . + " p.score, p.perc_ident, p.evalue, p.hit_start, p.hit_end, " . + " p.hit_name, x.display_label, i.interpro_ac " . + "FROM protein_feature p " . + "LEFT JOIN interpro AS i ON p.hit_name = i.id " . + "LEFT JOIN xref AS x ON x.dbprimary_acc = i.interpro_ac " . + "WHERE p.translation_id = ?"); + + $sth->bind_param(1,$translation_id,SQL_INTEGER); + $sth->execute(); + + while( my $row = $sth->fetchrow_arrayref) { + my ($dbID, $start, $end, $analysisid, $score, $perc_id, $evalue, $hstart, + $hend,$hid,$desc, $interpro_ac) = @$row; + + my $analysis = $analysis_adaptor->fetch_by_dbID($analysisid); + + if(!$analysis) { + warning("Analysis with dbID=$analysisid does not exist\n" . + "but is referenced by ProteinFeature $dbID"); + } + + my $feat = Bio::EnsEMBL::ProteinFeature->new + (-DBID => $dbID, + -ADAPTOR => $self, + -SEQNAME => $translation_id, + -START => $start, + -END => $end, + -ANALYSIS => $analysis, + -PERCENT_ID => $perc_id, + -P_VALUE => $evalue, + -SCORE => $score, + -HSTART => $hstart, + -HEND => $hend, + -HSEQNAME => $hid, + -IDESC => $desc, + -INTERPRO_AC => $interpro_ac); + + push(@features,$feat); + } + + $sth->finish(); + + return \@features; +} + + +=head2 fetch_by_dbID + + Arg [1] : int $protfeat_id + the unique database identifier of the protein feature to obtain + Example : my $feature = $prot_feat_adaptor->fetch_by_dbID(); + Description: Obtains a protein feature object via its unique id + Returntype : Bio::EnsEMBL::ProteinFeauture + Exceptions : none + Caller : ? + Status : Stable + +=cut + +sub fetch_by_dbID{ + my ($self,$protfeat_id) = @_; + + my $sth = $self->prepare( + "SELECT p.seq_start, p.seq_end, p.analysis_id, " . + " p.score, p.perc_ident, p.evalue, " . + " p.hit_start, p.hit_end, p.hit_name, " . + " x.display_label, i.interpro_ac " . + "FROM protein_feature p " . + "LEFT JOIN interpro AS i ON p.hit_name = i.id " . + "LEFT JOIN xref AS x ON x.dbprimary_acc = i.interpro_ac " . + "WHERE p.protein_feature_id = ?"); + + $sth->bind_param(1,$protfeat_id,SQL_INTEGER); + my $res = $sth->execute(); + + if($sth->rows == 0) { + $sth->finish(); + return undef; + } + + my ($start, $end, $analysis_id, $score, $perc_ident, $pvalue, $hstart, + $hend, $hseqname, $idesc, $interpro_ac) = $sth->fetchrow_array(); + + $sth->finish(); + + my $analysis = $self->db->get_AnalysisAdaptor->fetch_by_dbID($analysis_id); + + return Bio::EnsEMBL::ProteinFeature->new + (-ADAPTOR => $self, + -DBID => $protfeat_id, + -START => $start, + -END => $end, + -HSTART => $hstart, + -HEND => $hend, + -HSEQNAME => $hseqname, + -ANALYSIS => $analysis, + -SCORE => $score, + -P_VALUE => $pvalue, + -PERCENT_ID => $perc_ident, + -IDESC => $idesc, + -INTERPRO_AC => $interpro_ac); +} + + + + +=head2 store + + Arg [1] : Bio::EnsEMBL::ProteinFeature $feature + The feature to be stored + Arg [2] : int $translation_id + + Example : $protein_feature_adaptor->store($protein_feature); + Description: Stores a protein feature in the database + Returntype : int - the new internal identifier of the stored protein feature + Exceptions : thrown if arg is not a Bio::EnsEMBL: + Caller : none + Status : Stable + +=cut + +sub store { + my ($self,$feature, $translation_id) = @_; + + if(!ref($feature) || !$feature->isa('Bio::EnsEMBL::ProteinFeature')) { + throw("ProteinFeature argument is required"); + } + + if(!$translation_id) { + deprecate("Calling ProteinFeatureAdaptor without a translation_id is " . + "deprecated. Pass a translation_id argument rather than " . + "setting the ProteinFeature seqname to be the translation " . + "id"); + $translation_id = $feature->seqname(); + } + + my $db = $self->db(); + + if($feature->is_stored($db)) { + warning("ProteinFeature " . $feature->dbID() . " is already stored in " . + "this database - not storing again"); + } + + my $analysis = $feature->analysis(); + if (!defined($analysis)) { + throw("Feature doesn't have analysis. Can't write to database"); + } + + if(!$analysis->is_stored($db)) { + $db->get_AnalysisAdaptor->store($analysis); + } + + my $sth = + $self->prepare("INSERT INTO protein_feature " . + " SET translation_id = ?, " . + " seq_start = ?, ". + " seq_end = ?, ". + " analysis_id = ?, ". + " hit_start = ?, ". + " hit_end = ?, ". + " hit_name = ?, ". + " score = ?, ". + " perc_ident = ?, ". + " evalue = ?"); + + $sth->bind_param(1,$translation_id,SQL_INTEGER); + $sth->bind_param(2,$feature->start,SQL_INTEGER); + $sth->bind_param(3,$feature->end,SQL_INTEGER); + $sth->bind_param(4,$analysis->dbID,SQL_INTEGER); + $sth->bind_param(5,$feature->hstart,SQL_INTEGER); + $sth->bind_param(6,$feature->hend,SQL_INTEGER); + $sth->bind_param(7,$feature->hseqname,SQL_VARCHAR); + $sth->bind_param(8,$feature->score,SQL_DOUBLE); + $sth->bind_param(9,$feature->percent_id,SQL_FLOAT); + $sth->bind_param(10,$feature->p_value,SQL_DOUBLE); + + $sth->execute(); + + my $dbID = $sth->{'mysql_insertid'}; + + $feature->adaptor($self); + $feature->dbID($dbID); + + $sth->finish(); + + return $dbID; +} + + + +sub fetch_by_translation_id { + deprecate("Use fetch_all_by_translation_id instead."); + fetch_all_by_translation_id(@_); +} + +sub fetch_all_by_feature_and_dbID { + my $self = shift; + my $feature = shift; + my $translation_id = shift; + deprecate("Use fetch_all_by_translation_id instead."); + + print STDERR "translation_id = $translation_id feature = $feature\n"; + + my $features = $self->fetch_all_by_translation_id($translation_id); + + my @out; + foreach my $f (@$features) { + my $logic_name = lc($f->analysis->logic_name()); + print STDERR "LOGIC_NAME = $logic_name | FEATURE = $feature\n"; + push(@out, $f) if($logic_name eq lc($feature)); + } + + return \@out; +} + + +sub save { + + my ($self, $features) = @_; + + my @feats = @$features; + throw("Must call save with features") if( scalar(@feats) == 0 ); + +# my @tabs = $self->_tables; +# my ($tablename) = @{$tabs[0]}; + my $tablename = 'protein_feature'; + + my $db = $self->db(); + my $analysis_adaptor = $db->get_AnalysisAdaptor(); + + my $sql = qq{INSERT INTO $tablename (translation_id, seq_start, seq_end, hit_start, hit_end, hit_name, analysis_id, score, evalue, perc_ident, external_data) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}; + + my $sth = $self->prepare($sql); + + foreach my $feat ( @feats ) { + if( !ref $feat || !$feat->isa("Bio::EnsEMBL::ProteinFeature") ) { + throw("feature must be a Bio::EnsEMBL::ProteinFeature,". " not a [".ref($feat)."]."); + } + + if($feat->is_stored($db)) { + warning("ProteinFeature [".$feat->dbID."] is already stored" . + " in this database."); + next; + } + + my $hstart = defined $feat->hstart ? $feat->hstart : $feat->start ; + my $hend = defined $feat->hend ? $feat->hend : $feat->end; + + if(!defined($feat->analysis)) { + throw("An analysis must be attached to the features to be stored."); + } + + #store the analysis if it has not been stored yet + if(!$feat->analysis->is_stored($db)) { + $analysis_adaptor->store($feat->analysis()); + } + + my $original = $feat; + my $extra_data = $feat->extra_data ? $self->dump_data($feat->extra_data) : ''; + + $sth->bind_param(1,$feat->translation_id,SQL_INTEGER); + $sth->bind_param(2,$feat->start,SQL_INTEGER); + $sth->bind_param(3,$feat->end,SQL_INTEGER); + $sth->bind_param(4,$hstart,SQL_INTEGER); + $sth->bind_param(5,$hend,SQL_INTEGER); + $sth->bind_param(6,$feat->hseqname,SQL_VARCHAR); + $sth->bind_param(7,$feat->analysis->dbID,SQL_INTEGER); + $sth->bind_param(8,$feat->score,SQL_DOUBLE); + $sth->bind_param(9,$feat->p_value,SQL_DOUBLE); + $sth->bind_param(10,$feat->percent_id,SQL_FLOAT); + $sth->bind_param(11,$extra_data,SQL_LONGVARCHAR); + + $sth->execute(); + $original->dbID($sth->{'mysql_insertid'}); + $original->adaptor($self); + } + + $sth->finish(); +} + + +1; +