0
|
1 =head1 LICENSE
|
|
2
|
|
3 Copyright (c) 1999-2012 The European Bioinformatics Institute and
|
|
4 Genome Research Limited. All rights reserved.
|
|
5
|
|
6 This software is distributed under a modified Apache license.
|
|
7 For license details, please see
|
|
8
|
|
9 http://www.ensembl.org/info/about/code_licence.html
|
|
10
|
|
11 =head1 CONTACT
|
|
12
|
|
13 Please email comments or questions to the public Ensembl
|
|
14 developers list at <dev@ensembl.org>.
|
|
15
|
|
16 Questions may also be sent to the Ensembl help desk at
|
|
17 <helpdesk@ensembl.org>.
|
|
18
|
|
19 =cut
|
|
20
|
|
21 =head1 NAME
|
|
22
|
|
23 Bio::EnsEMBL::DBSQL::TranslationAdaptor - Provides a means to fetch and store
|
|
24 Translation objects from a database.
|
|
25
|
|
26 =head1 DESCRIPTION
|
|
27
|
|
28 This adaptor provides a means to retrieve and store
|
|
29 Bio::EnsEMBL::Translation objects from/in a database.
|
|
30
|
|
31 Translation objects only truly make sense in the context of their
|
|
32 transcripts so the recommended means to retrieve Translations is
|
|
33 by retrieving the Transcript object first, and then fetching the
|
|
34 Translation.
|
|
35
|
|
36 =head1 SYNOPSIS
|
|
37
|
|
38 use Bio::EnsEMBL::Registry;
|
|
39
|
|
40 Bio::EnsEMBL::Registry->load_registry_from_db(
|
|
41 -host => 'ensembldb.ensembl.org',
|
|
42 -user => 'anonymous'
|
|
43 );
|
|
44
|
|
45 $transcript_adaptor =
|
|
46 Bio::EnsEMBL::Registry->get_adaptor( "human", "core",
|
|
47 "transcript" );
|
|
48
|
|
49 $translation_adaptor =
|
|
50 Bio::EnsEMBL::Registry->get_adaptor( "human", "core",
|
|
51 "translation" );
|
|
52
|
|
53 my $transcript = $transcript_adaptor->fetch_by_dbID(131243);
|
|
54 my $translation =
|
|
55 $translation_adaptor->fetch_by_Transcript($transcript);
|
|
56
|
|
57 print("Translation Start Site: "
|
|
58 . $translation->start_Exon()->stable_id() . " "
|
|
59 . $translation->start()
|
|
60 . "\n" );
|
|
61 print("Translation Stop: "
|
|
62 . $translation->end_Exon()->stable_id() . " "
|
|
63 . $translation->end() );
|
|
64
|
|
65 =head1 METHODS
|
|
66
|
|
67 =cut
|
|
68
|
|
69 package Bio::EnsEMBL::DBSQL::TranslationAdaptor;
|
|
70
|
|
71 use vars qw(@ISA);
|
|
72 use strict;
|
|
73
|
|
74 use Bio::EnsEMBL::DBSQL::BaseAdaptor;
|
|
75 use Bio::EnsEMBL::Translation;
|
|
76 use Bio::EnsEMBL::Utils::Exception qw( throw warning deprecate );
|
|
77 use Bio::EnsEMBL::Utils::Scalar qw( assert_ref );
|
|
78
|
|
79
|
|
80 @ISA = qw( Bio::EnsEMBL::DBSQL::BaseAdaptor );
|
|
81
|
|
82 =head2 fetch_all_alternative_by_Transcript
|
|
83
|
|
84 Arg [1] : Bio::EnsEMBL::Transcript $transcript
|
|
85 Example :
|
|
86
|
|
87 @tl = @{
|
|
88 $translation_adaptor->fetch_all_alternative_by_Transcript(
|
|
89 $transcript)
|
|
90 };
|
|
91
|
|
92 Description: Retrieves all alternative translations associated with a
|
|
93 particular transcript. If no alternative translation is
|
|
94 found, a reference to an empty list is returned.
|
|
95
|
|
96 Returntype : listref of Bio::EnsEMBL::Translation
|
|
97 Exceptions : throw on incorrect argument
|
|
98 Caller : Transcript
|
|
99 Status : Stable
|
|
100
|
|
101 =cut
|
|
102
|
|
103 sub fetch_all_alternative_by_Transcript {
|
|
104 my ( $self, $transcript ) = @_;
|
|
105
|
|
106 assert_ref($transcript, 'Bio::EnsEMBL::Transcript');
|
|
107
|
|
108 my $tl_created_date =
|
|
109 $self->db()->dbc()->from_date_to_seconds('tl.created_date');
|
|
110 my $tl_modified_date =
|
|
111 $self->db()->dbc()->from_date_to_seconds('tl.modified_date');
|
|
112
|
|
113 my $sql =
|
|
114 sprintf( "SELECT tl.translation_id, tl.start_exon_id, "
|
|
115 . "tl.end_exon_id, tl.seq_start, tl.seq_end, "
|
|
116 . "tl.stable_id, tl.version, %s, %s "
|
|
117 . "FROM translation tl "
|
|
118 . "JOIN transcript t "
|
|
119 . "ON (t.transcript_id = tl.transcript_id) "
|
|
120 . "WHERE tl.transcript_id = ? "
|
|
121 . "AND tl.translation_id != t.canonical_translation_id",
|
|
122 $tl_created_date, $tl_modified_date );
|
|
123
|
|
124 my $transcript_id = $transcript->dbID();
|
|
125 my $sth = $self->prepare($sql);
|
|
126 $sth->bind_param( 1, $transcript_id, SQL_INTEGER );
|
|
127
|
|
128 $sth->execute();
|
|
129
|
|
130 my (
|
|
131 $translation_id, $start_exon_id, $end_exon_id,
|
|
132 $seq_start, $seq_end, $stable_id,
|
|
133 $version, $created_date, $modified_date
|
|
134 );
|
|
135
|
|
136 $sth->bind_columns(
|
|
137 \(
|
|
138 $translation_id, $start_exon_id, $end_exon_id,
|
|
139 $seq_start, $seq_end, $stable_id,
|
|
140 $version, $created_date, $modified_date
|
|
141 ) );
|
|
142
|
|
143 # Get all alternative translations.
|
|
144 my $translations = [];
|
|
145 while ( $sth->fetch() ) {
|
|
146 if ( !defined($translation_id) ) { next }
|
|
147
|
|
148 my ( $start_exon, $end_exon );
|
|
149
|
|
150 # this will load all the exons whenever we load the translation
|
|
151 # but I guess thats ok ....
|
|
152
|
|
153 foreach my $exon ( @{ $transcript->get_all_Exons() } ) {
|
|
154 if ( $exon->dbID() == $start_exon_id ) { $start_exon = $exon }
|
|
155 if ( $exon->dbID() == $end_exon_id ) { $end_exon = $exon }
|
|
156 }
|
|
157
|
|
158 if ( !( defined($start_exon) && defined($end_exon) ) ) {
|
|
159 throw(
|
|
160 sprintf(
|
|
161 "Could not find start or end exon in transcript_id=%d\n",
|
|
162 $transcript->dbID() ) );
|
|
163 }
|
|
164
|
|
165 my $translation =
|
|
166 Bio::EnsEMBL::Translation->new_fast( {
|
|
167 'dbID' => $translation_id,
|
|
168 'adaptor' => $self,
|
|
169 'start' => $seq_start,
|
|
170 'end' => $seq_end,
|
|
171 'start_exon' => $start_exon,
|
|
172 'end_exon' => $end_exon,
|
|
173 'stable_id' => $stable_id,
|
|
174 'version' => $version,
|
|
175 'created_date' => $created_date || undef,
|
|
176 'modified_date' => $modified_date || undef,
|
|
177 } );
|
|
178
|
|
179 $translation->transcript($transcript);
|
|
180
|
|
181 push( @{$translations}, $translation );
|
|
182
|
|
183 } ## end while ( $sth->fetch() )
|
|
184
|
|
185 return $translations;
|
|
186 } ## end sub fetch_all_by_Transcript
|
|
187
|
|
188 =head2 fetch_by_Transcript
|
|
189
|
|
190 Arg [1] : Bio::EnsEMBL::Transcript $transcript
|
|
191 Example : $tl = $translation_adaptor->fetch_by_Transcript($transcript);
|
|
192 Description: Retrieves a Translation via its associated transcript.
|
|
193 If the Translation is not found, undef is returned.
|
|
194 Returntype : Bio::EnsEMBL::Translation
|
|
195 Exceptions : throw on incorrect argument
|
|
196 Caller : Transcript
|
|
197 Status : Stable
|
|
198
|
|
199 =cut
|
|
200
|
|
201 sub fetch_by_Transcript {
|
|
202 my ( $self, $transcript ) = @_;
|
|
203
|
|
204 assert_ref( $transcript, 'Bio::EnsEMBL::Transcript' );
|
|
205
|
|
206 my $tl_created_date =
|
|
207 $self->db()->dbc()->from_date_to_seconds('tl.created_date');
|
|
208 my $tl_modified_date =
|
|
209 $self->db()->dbc()->from_date_to_seconds('tl.modified_date');
|
|
210
|
|
211 my $sql =
|
|
212 sprintf( "SELECT tl.translation_id, tl.start_exon_id, "
|
|
213 . "tl.end_exon_id, tl.seq_start, tl.seq_end, "
|
|
214 . "tl.stable_id, tl.version, %s, %s "
|
|
215 . "FROM translation tl "
|
|
216 . "JOIN transcript tr "
|
|
217 . "ON (tl.translation_id = tr.canonical_translation_id) "
|
|
218 . "WHERE tr.transcript_id = ?",
|
|
219 $tl_created_date, $tl_modified_date );
|
|
220
|
|
221 my $transcript_id = $transcript->dbID();
|
|
222 my $sth = $self->prepare($sql);
|
|
223 $sth->bind_param( 1, $transcript_id, SQL_INTEGER );
|
|
224
|
|
225 $sth->execute();
|
|
226
|
|
227 my (
|
|
228 $translation_id, $start_exon_id, $end_exon_id,
|
|
229 $seq_start, $seq_end, $stable_id,
|
|
230 $version, $created_date, $modified_date
|
|
231 ) = $sth->fetchrow_array();
|
|
232 $sth->finish();
|
|
233
|
|
234 if ( !defined($translation_id) ) { return undef }
|
|
235
|
|
236 my ( $start_exon, $end_exon );
|
|
237
|
|
238 # this will load all the exons whenever we load the translation
|
|
239 # but I guess thats ok ....
|
|
240
|
|
241 foreach my $exon ( @{ $transcript->get_all_Exons() } ) {
|
|
242 if ( $exon->dbID() == $start_exon_id ) { $start_exon = $exon }
|
|
243 if ( $exon->dbID() == $end_exon_id ) { $end_exon = $exon }
|
|
244 }
|
|
245
|
|
246 if ( !( defined($start_exon) && defined($end_exon) ) ) {
|
|
247 throw(
|
|
248 sprintf( "Could not find start or end exon in transcript_id=%d\n",
|
|
249 $transcript->dbID() ) );
|
|
250 }
|
|
251
|
|
252 my $translation =
|
|
253 Bio::EnsEMBL::Translation->new_fast( {
|
|
254 'dbID' => $translation_id,
|
|
255 'adaptor' => $self,
|
|
256 'start' => $seq_start,
|
|
257 'end' => $seq_end,
|
|
258 'start_exon' => $start_exon,
|
|
259 'end_exon' => $end_exon,
|
|
260 'stable_id' => $stable_id,
|
|
261 'version' => $version,
|
|
262 'created_date' => $created_date || undef,
|
|
263 'modified_date' => $modified_date || undef,
|
|
264 } );
|
|
265
|
|
266 $translation->transcript($transcript);
|
|
267
|
|
268 return $translation;
|
|
269 } ## end sub fetch_by_Transcript
|
|
270
|
|
271
|
|
272
|
|
273 =head2 fetch_all_by_external_name
|
|
274
|
|
275 Arg [1] : string $external_name
|
|
276 The external identifier for the translation(s) to be
|
|
277 obtained.
|
|
278 Arg [2] : (optional) string $external_db_name
|
|
279 The name of the external database from which the
|
|
280 identifier originates.
|
|
281 Arg [3] : Boolean override. Force SQL regex matching for users
|
|
282 who really do want to find all 'NM%'
|
|
283 Example : my @translations =
|
|
284 @{ $trl_adaptor->fetch_all_by_external_name('BRCA2') };
|
|
285 my @many_translations =
|
|
286 @{ $trl_adaptor->fetch_all_by_external_name('BRCA%') };
|
|
287 Description: Retrieves a list of translations fetched via an
|
|
288 external identifier. Note that this may not be a
|
|
289 particularly useful method, because translations
|
|
290 do not make much sense out of the context of
|
|
291 their transcript. It may be better to use the
|
|
292 TranscriptAdaptor::fetch_all_by_external_name instead.
|
|
293 SQL wildcards % and _ are supported in the $external_name
|
|
294 but their use is somewhat restricted for performance reasons.
|
|
295 Users that really do want % and _ in the first three characters
|
|
296 should use argument 3 to prevent optimisations
|
|
297 Returntype : reference to a list of Translations
|
|
298 Exceptions : none
|
|
299 Caller : general
|
|
300 Status : Medium Risk
|
|
301 : At some time may be deprecated to instead use
|
|
302 : TranscriptAdaptor::fetch_all_by_external_name
|
|
303
|
|
304 =cut
|
|
305
|
|
306 sub fetch_all_by_external_name {
|
|
307 my ( $self, $external_name, $external_db_name, $override ) = @_;
|
|
308
|
|
309 my $entry_adaptor = $self->db->get_DBEntryAdaptor();
|
|
310
|
|
311 my @ids = $entry_adaptor->list_translation_ids_by_extids(
|
|
312 $external_name, $external_db_name, $override );
|
|
313
|
|
314 my $transcript_adaptor = $self->db()->get_TranscriptAdaptor();
|
|
315
|
|
316 my @out;
|
|
317 foreach my $id (@ids) {
|
|
318 my $transcript = $transcript_adaptor->fetch_by_translation_id($id);
|
|
319
|
|
320 if ( defined($transcript) ) {
|
|
321 push @out, $self->fetch_by_Transcript($transcript);
|
|
322 }
|
|
323 }
|
|
324
|
|
325 return \@out;
|
|
326 }
|
|
327
|
|
328 =head2 fetch_all_by_GOTerm
|
|
329
|
|
330 Arg [1] : Bio::EnsEMBL::OntologyTerm
|
|
331 The GO term for which translations should be fetched.
|
|
332
|
|
333 Example: @translations = @{
|
|
334 $translation_adaptor->fetch_all_by_GOTerm(
|
|
335 $go_adaptor->fetch_by_accession('GO:0030326') ) };
|
|
336
|
|
337 Description : Retrieves a list of translations that are
|
|
338 associated with the given GO term, or with any of
|
|
339 its descendent GO terms.
|
|
340
|
|
341 Return type : listref of Bio::EnsEMBL::Translation
|
|
342 Exceptions : Throws of argument is not a GO term
|
|
343 Caller : general
|
|
344 Status : Stable
|
|
345
|
|
346 =cut
|
|
347
|
|
348 sub fetch_all_by_GOTerm {
|
|
349 my ( $self, $term ) = @_;
|
|
350
|
|
351 assert_ref( $term, 'Bio::EnsEMBL::OntologyTerm' );
|
|
352 if ( $term->ontology() ne 'GO' ) {
|
|
353 throw('Argument is not a GO term');
|
|
354 }
|
|
355
|
|
356 my $entryAdaptor = $self->db->get_DBEntryAdaptor();
|
|
357
|
|
358 my %unique_dbIDs;
|
|
359 foreach my $accession ( map { $_->accession() }
|
|
360 ( $term, @{ $term->descendants() } ) )
|
|
361 {
|
|
362 my @ids =
|
|
363 $entryAdaptor->list_translation_ids_by_extids( $accession, 'GO' );
|
|
364 foreach my $dbID (@ids) { $unique_dbIDs{$dbID} = 1 }
|
|
365 }
|
|
366
|
|
367 my @result;
|
|
368 if ( scalar( keys(%unique_dbIDs) ) > 0 ) {
|
|
369 my $transcript_adaptor = $self->db()->get_TranscriptAdaptor();
|
|
370
|
|
371 foreach my $dbID ( sort { $a <=> $b } keys(%unique_dbIDs) ) {
|
|
372 my $transcript =
|
|
373 $transcript_adaptor->fetch_by_translation_id($dbID);
|
|
374 if ( defined($transcript) ) {
|
|
375 push( @result, $self->fetch_by_Transcript($transcript) );
|
|
376 }
|
|
377 }
|
|
378 }
|
|
379
|
|
380 return \@result;
|
|
381 } ## end sub fetch_all_by_GOTerm
|
|
382
|
|
383 =head2 fetch_all_by_GOTerm_accession
|
|
384
|
|
385 Arg [1] : String
|
|
386 The GO term accession for which genes should be
|
|
387 fetched.
|
|
388
|
|
389 Example :
|
|
390
|
|
391 @genes =
|
|
392 @{ $gene_adaptor->fetch_all_by_GOTerm_accession('GO:0030326') };
|
|
393
|
|
394 Description : Retrieves a list of genes that are associated with
|
|
395 the given GO term, or with any of its descendent
|
|
396 GO terms. The genes returned are in their native
|
|
397 coordinate system, i.e. in the coordinate system
|
|
398 in which they are stored in the database. If
|
|
399 another coordinate system is required then the
|
|
400 Gene::transfer or Gene::transform method can be
|
|
401 used.
|
|
402
|
|
403 Return type : listref of Bio::EnsEMBL::Gene
|
|
404 Exceptions : Throws of argument is not a GO term accession
|
|
405 Caller : general
|
|
406 Status : Stable
|
|
407
|
|
408 =cut
|
|
409
|
|
410 sub fetch_all_by_GOTerm_accession {
|
|
411 my ( $self, $accession ) = @_;
|
|
412
|
|
413 if ( $accession !~ /^GO:/ ) {
|
|
414 throw('Argument is not a GO term accession');
|
|
415 }
|
|
416
|
|
417 my $goAdaptor =
|
|
418 Bio::EnsEMBL::Registry->get_adaptor( 'Multi', 'Ontology',
|
|
419 'OntologyTerm' );
|
|
420
|
|
421 my $term = $goAdaptor->fetch_by_accession($accession);
|
|
422
|
|
423 return $self->fetch_all_by_GOTerm($term);
|
|
424 }
|
|
425
|
|
426 =head2 store
|
|
427
|
|
428 Arg [1] : Bio::EnsEMBL::Translation $translation
|
|
429 The translation object to be stored in the database
|
|
430 Example : $transl_id = $translation_adaptor->store($translation);
|
|
431 Description: Stores a translation object in the database
|
|
432 Returntype : int - the new dbID of the stored translation
|
|
433 Exceptions : thrown if the dbID of the start_Exon or end_Exon is not
|
|
434 defined.
|
|
435 thrown if only partial stable id information is present (e.g.
|
|
436 identifier but not version number)
|
|
437 Caller : Transcript::store
|
|
438 Status : Stable
|
|
439
|
|
440 =cut
|
|
441
|
|
442 sub store {
|
|
443 my ( $self, $translation, $transcript_id ) = @_;
|
|
444
|
|
445 my $start_exon = $translation->start_Exon();
|
|
446 my $end_exon = $translation->end_Exon();
|
|
447
|
|
448 if(!$start_exon) {
|
|
449 throw("Translation must define a start_Exon to be stored.");
|
|
450 }
|
|
451
|
|
452 if(!$end_exon) {
|
|
453 throw("Translation must define an end_Exon to be stored.");
|
|
454 }
|
|
455
|
|
456 if(!$start_exon->dbID) {
|
|
457 throw("start_Exon must have a dbID for Translation to be stored.");
|
|
458 }
|
|
459
|
|
460 if(!$end_exon->dbID) {
|
|
461 throw("end_Exon must have a dbID for Translation to be stored.");
|
|
462 }
|
|
463
|
|
464 my $store_translation_sql = qq(
|
|
465 INSERT INTO translation
|
|
466 SET seq_start = ?,
|
|
467 start_exon_id = ?,
|
|
468 seq_end = ?,
|
|
469 end_exon_id = ?,
|
|
470 transcript_id = ?
|
|
471 );
|
|
472
|
|
473 if (defined($translation->stable_id)) {
|
|
474 my $created = $self->db->dbc->from_seconds_to_date($translation->created_date());
|
|
475 my $modified = $self->db->dbc->from_seconds_to_date($translation->modified_date());
|
|
476 $store_translation_sql .= ", stable_id = ?, version = ?, created_date = " . $created . " , modified_date = " . $modified;
|
|
477
|
|
478 }
|
|
479
|
|
480 my $sth = $self->prepare($store_translation_sql);
|
|
481 $sth->bind_param(1,$translation->start,SQL_INTEGER);
|
|
482 $sth->bind_param(2,$translation->start_Exon->dbID,SQL_INTEGER);
|
|
483 $sth->bind_param(3,$translation->end,SQL_INTEGER);
|
|
484 $sth->bind_param(4,$translation->end_Exon->dbID,SQL_INTEGER);
|
|
485 $sth->bind_param(5,$transcript_id,SQL_INTEGER);
|
|
486
|
|
487
|
|
488 if (defined($translation->stable_id)) {
|
|
489
|
|
490 $sth->bind_param(6, $translation->stable_id,SQL_VARCHAR);
|
|
491 my $version = ($translation->version()) ? $translation->version() : 1;
|
|
492 $sth->bind_param(7, $version,SQL_VARCHAR);
|
|
493 }
|
|
494
|
|
495 $sth->execute();
|
|
496
|
|
497 my $transl_dbID = $sth->{'mysql_insertid'};
|
|
498
|
|
499 #
|
|
500 # store object xref mappings to translations
|
|
501 #
|
|
502
|
|
503 my $dbEntryAdaptor = $self->db()->get_DBEntryAdaptor();
|
|
504 # store each of the xrefs for this translation
|
|
505 foreach my $dbl ( @{$translation->get_all_DBEntries} ) {
|
|
506 $dbEntryAdaptor->store( $dbl, $transl_dbID, "Translation", 1 );
|
|
507 }
|
|
508
|
|
509 #storing the protein features associated with the translation
|
|
510 my $pfadaptor = $self->db->get_ProteinFeatureAdaptor();
|
|
511 foreach my $pf(@{$translation->get_all_ProteinFeatures}){
|
|
512 $pfadaptor->store($pf, $transl_dbID);
|
|
513 }
|
|
514
|
|
515 $translation->get_all_Attributes();
|
|
516
|
|
517 # store any translation attributes that are defined
|
|
518 my $attr_adaptor = $self->db->get_AttributeAdaptor();
|
|
519 $attr_adaptor->store_on_Translation($transl_dbID,
|
|
520 $translation->get_all_Attributes());
|
|
521
|
|
522 $translation->dbID($transl_dbID);
|
|
523 $translation->adaptor($self);
|
|
524
|
|
525 return $transl_dbID;
|
|
526 }
|
|
527
|
|
528
|
|
529
|
|
530 =head2 remove
|
|
531
|
|
532 Arg [1] : Bio::EnsEMBL::Translation $translation
|
|
533 Example : $translation_adaptor->remove($translation);
|
|
534 Description: Removes a translation completely from the database, and all
|
|
535 associated information including protein features etc.
|
|
536 Returntype : none
|
|
537 Exceptions : throw on incorrect arguments
|
|
538 warning if translation is not in this database
|
|
539 Caller : TranscriptAdaptor::remove
|
|
540 Status : Stable
|
|
541
|
|
542 =cut
|
|
543
|
|
544 sub remove {
|
|
545 my $self = shift;
|
|
546 my $translation = shift;
|
|
547
|
|
548 if(!ref($translation) || !$translation->isa('Bio::EnsEMBL::Translation')) {
|
|
549 throw("Bio::EnsEMBL::Translation argument expected.");
|
|
550 }
|
|
551
|
|
552 if( !$translation->is_stored($self->db()) ) {
|
|
553 warning("Cannot remove translation " . $translation->dbID() .
|
|
554 ". Is not stored in this database.");
|
|
555 return;
|
|
556 }
|
|
557
|
|
558 # remove athe attributes associated with this translation
|
|
559 my $attrib_adp = $self->db->get_AttributeAdaptor;
|
|
560 $attrib_adp->remove_from_Translation($translation);
|
|
561
|
|
562 # remove all xref associations to this translation
|
|
563 my $dbe_adaptor = $self->db()->get_DBEntryAdaptor();
|
|
564 foreach my $dbe (@{$translation->get_all_DBEntries()}) {
|
|
565 $dbe_adaptor->remove_from_object($dbe, $translation, 'Translation');
|
|
566 }
|
|
567
|
|
568 # remove all protein_features on this translation
|
|
569 my $sth = $self->prepare
|
|
570 ("DELETE FROM protein_feature WHERE translation_id = ?");
|
|
571 $sth->bind_param(1,$translation->dbID,SQL_INTEGER);
|
|
572 $sth->execute();
|
|
573 $sth->finish();
|
|
574
|
|
575 # remove the translation itself
|
|
576
|
|
577 $sth = $self->prepare("DELETE FROM translation WHERE translation_id = ?" );
|
|
578 $sth->bind_param(1,$translation->dbID,SQL_INTEGER);
|
|
579 $sth->execute();
|
|
580 $sth->finish();
|
|
581
|
|
582 $translation->dbID( undef );
|
|
583 $translation->adaptor(undef);
|
|
584
|
|
585 return
|
|
586 }
|
|
587
|
|
588
|
|
589 =head2 list_dbIDs
|
|
590
|
|
591 Arg [1] : none
|
|
592 Example : @translation_ids = @{$translation_adaptor->list_dbIDs()};
|
|
593 Description: Gets an array of internal ids for all translations in the current db
|
|
594 Returntype : list of ints
|
|
595 Exceptions : none
|
|
596 Caller : ?
|
|
597 Status : Stable
|
|
598
|
|
599 =cut
|
|
600
|
|
601 sub list_dbIDs {
|
|
602 my ($self) = @_;
|
|
603
|
|
604 return $self->_list_dbIDs("translation");
|
|
605 }
|
|
606
|
|
607
|
|
608 =head2 list_stable_ids
|
|
609
|
|
610 Arg [1] : none
|
|
611 Example : @transl_stable_ids = @{$transl_adaptor->list_stable_dbIDs()};
|
|
612 Description: Gets an array of stable ids for all translations in the current
|
|
613 db
|
|
614 Returntype : reference to a list of strings
|
|
615 Exceptions : none
|
|
616 Caller : general
|
|
617 Status : Stable
|
|
618
|
|
619 =cut
|
|
620
|
|
621 sub list_stable_ids {
|
|
622 my ($self) = @_;
|
|
623
|
|
624 return $self->_list_dbIDs("translation", "stable_id");
|
|
625 }
|
|
626
|
|
627
|
|
628
|
|
629 =head2 fetch_by_dbID
|
|
630
|
|
631 Arg [1] : int $dbID
|
|
632 The internal identifier of the Translation to obtain
|
|
633 Example : $translation = $translation_adaptor->fetch_by_dbID(1234);
|
|
634 Description: This fetches a Translation object via its internal id.
|
|
635 This is only debatably useful since translations do
|
|
636 not make much sense outside of the context of their
|
|
637 Transcript. Consider using fetch_by_Transcript instead.
|
|
638 Returntype : Bio::EnsEMBL::Translation, or undef if the translation is not
|
|
639 found.
|
|
640 Exceptions : warning if an additional (old style) Transcript argument is
|
|
641 provided
|
|
642 Caller : ?
|
|
643 Status : Stable
|
|
644
|
|
645 =cut
|
|
646
|
|
647 sub fetch_by_dbID {
|
|
648 my ( $self, $dbID, $transcript ) = @_;
|
|
649
|
|
650 if ($transcript) {
|
|
651 deprecate( "Use of fetch_by_dbID "
|
|
652 . "with a Transcript argument is deprecated."
|
|
653 . "Use fetch_by_Transcript instead." );
|
|
654 }
|
|
655
|
|
656 if ( !defined($dbID) ) {
|
|
657 throw("dbID argument is required");
|
|
658 }
|
|
659
|
|
660 my $transcript_adaptor = $self->db()->get_TranscriptAdaptor();
|
|
661 $transcript = $transcript_adaptor->fetch_by_translation_id($dbID);
|
|
662
|
|
663 if ( defined($transcript) ) {
|
|
664 my $translation = $self->fetch_by_Transcript($transcript);
|
|
665
|
|
666 if ( defined($translation) && $translation->dbID()==$dbID ) {
|
|
667 return $translation;
|
|
668 }
|
|
669
|
|
670 my @alt_translations =
|
|
671 @{ $self->fetch_all_alternative_by_Transcript($transcript) };
|
|
672
|
|
673 foreach my $alt_translation (@alt_translations) {
|
|
674 if ( $alt_translation->dbID() == $dbID ) {
|
|
675 return $alt_translation;
|
|
676 }
|
|
677 }
|
|
678 }
|
|
679
|
|
680 return undef;
|
|
681 } ## end sub fetch_by_dbID
|
|
682
|
|
683
|
|
684 =head2 fetch_by_stable_id
|
|
685
|
|
686 Arg [1] : string $stable_id
|
|
687 The stable identifier of the Translation to obtain
|
|
688 Example : $translation = $translation_adaptor->fetch_by_stable_id("ENSP00001");
|
|
689 Description: This fetches a Translation object via its stable id.
|
|
690 This is only debatably useful since translations do
|
|
691 not make much sense outside of the context of their
|
|
692 Transcript. Consider using fetch_by_Transcript instead.
|
|
693 Returntype : Bio::EnsEMBL::Translation or undef if the translation is not
|
|
694 found.
|
|
695 Exceptions : warning if an additional (old style) Transcript argument is
|
|
696 provided
|
|
697 Caller : ?
|
|
698 Status : Stable
|
|
699
|
|
700 =cut
|
|
701
|
|
702 sub fetch_by_stable_id {
|
|
703 my ($self,$stable_id) = @_;
|
|
704
|
|
705 if(!$stable_id) {
|
|
706 throw("stable id argument is required");
|
|
707 }
|
|
708
|
|
709 my $transcript_adaptor = $self->db()->get_TranscriptAdaptor();
|
|
710 my $transcript =
|
|
711 $transcript_adaptor->fetch_by_translation_stable_id($stable_id);
|
|
712
|
|
713 return undef if(!$transcript);
|
|
714
|
|
715 return $self->fetch_by_Transcript($transcript);
|
|
716 }
|
|
717
|
|
718
|
|
719 =head2 fetch_all_by_Transcript_list
|
|
720
|
|
721 Arg [1] : reference to list of Bio::EnsEMBL::Transcripts $transcripts
|
|
722 The list of $transcripts to obtain Translation object for.
|
|
723 Example : @translations = @{$tla->fetch_all_by_Transcript_list([$t1,$t2]);
|
|
724 Description: Fetches all translations associated with the list of transcripts
|
|
725 passed to this method. The passed transcripts will also have
|
|
726 their translation set by this method.
|
|
727 Returntype : Reference to list of Bio::EnsEMBL::Translations
|
|
728 Exceptions : None
|
|
729 Caller : general
|
|
730 Status : Stable
|
|
731
|
|
732 =cut
|
|
733
|
|
734 sub fetch_all_by_Transcript_list {
|
|
735 my ($self,$transcripts) = @_;
|
|
736
|
|
737 if(!defined($transcripts) || ref($transcripts) ne 'ARRAY') {
|
|
738 throw("reference to list of Transcripts argument is required");
|
|
739 }
|
|
740
|
|
741 return [] if(!@$transcripts);
|
|
742
|
|
743 my %trans_hash = map {$_->dbID() => $_} @$transcripts;
|
|
744 my @id_list = keys %trans_hash;
|
|
745
|
|
746 my @out;
|
|
747
|
|
748 # mysql is faster and we ensure that we do not exceed the max query size by
|
|
749 # splitting large queries into smaller queries of 200 ids
|
|
750 my $max_size = 200;
|
|
751
|
|
752 my ( $transcript_id, $translation_id, $start_exon_id, $end_exon_id,
|
|
753 $seq_start, $seq_end, $stable_id, $version,
|
|
754 $created_date, $modified_date );
|
|
755
|
|
756 my %ex_hash;
|
|
757
|
|
758 while(@id_list) {
|
|
759 my @ids;
|
|
760 if(@id_list > $max_size) {
|
|
761 @ids = splice(@id_list, 0, $max_size);
|
|
762 } else {
|
|
763 @ids = splice(@id_list, 0);
|
|
764 }
|
|
765
|
|
766 my $id_str;
|
|
767 if(@ids > 1) {
|
|
768 $id_str = " IN (" . join(',', @ids). ")";
|
|
769 } else {
|
|
770 $id_str = " = " . $ids[0];
|
|
771 }
|
|
772
|
|
773 my $canonical_lookup = $self->dbc()->sql_helper()->execute_into_hash(
|
|
774 -SQL => 'SELECT transcript_id, canonical_translation_id FROM transcript WHERE transcript_id '.$id_str
|
|
775 );
|
|
776
|
|
777 my $created_date = $self->db->dbc->from_date_to_seconds("tl.created_date");
|
|
778 my $modified_date = $self->db->dbc->from_date_to_seconds("tl.modified_date");
|
|
779
|
|
780 my $sth = $self->prepare
|
|
781 ("SELECT tl.transcript_id, tl.translation_id, tl.start_exon_id,
|
|
782 tl.end_exon_id, tl.seq_start, tl.seq_end,
|
|
783 tl.stable_id, tl.version, " . $created_date . "," .
|
|
784 $modified_date .
|
|
785 " FROM translation tl
|
|
786 WHERE tl.transcript_id $id_str");
|
|
787
|
|
788 $sth->execute();
|
|
789
|
|
790 $sth->bind_columns( \$transcript_id, \$translation_id, \$start_exon_id, \$end_exon_id,
|
|
791 \$seq_start, \$seq_end, \$stable_id, \$version,
|
|
792 \$created_date, \$modified_date );
|
|
793
|
|
794 while($sth->fetch()) {
|
|
795 my ($start_exon, $end_exon);
|
|
796
|
|
797 # this will load all the exons whenever we load the translation
|
|
798 # but I guess thats ok ....
|
|
799
|
|
800 my $tr = $trans_hash{$transcript_id};
|
|
801
|
|
802 foreach my $exon (@{$tr->get_all_Exons()}) {
|
|
803 if(!$start_exon && $exon->dbID() == $start_exon_id ) {
|
|
804 $start_exon = $exon;
|
|
805 last if($end_exon);
|
|
806 }
|
|
807
|
|
808 if(!$end_exon && $exon->dbID() == $end_exon_id ) {
|
|
809 $end_exon = $exon;
|
|
810 last if($start_exon);
|
|
811 }
|
|
812 }
|
|
813
|
|
814 unless($start_exon && $end_exon) {
|
|
815 throw("Could not find start or end exon in transcript\n");
|
|
816 }
|
|
817
|
|
818 my $tl = Bio::EnsEMBL::Translation->new
|
|
819 (-dbID => $translation_id,
|
|
820 -seq_start => $seq_start,
|
|
821 -seq_end => $seq_end,
|
|
822 -start_exon => $start_exon,
|
|
823 -end_exon => $end_exon,
|
|
824 -stable_id => $stable_id,
|
|
825 -version => $version,
|
|
826 -created_date => $created_date || undef,
|
|
827 -modified_date => $modified_date || undef);
|
|
828
|
|
829 $tl->adaptor($self);
|
|
830 my $canonical_translation_id = $canonical_lookup->{$transcript_id};
|
|
831 $tr->translation($tl) if $translation_id == $canonical_translation_id;
|
|
832
|
|
833 push @out, $tl;
|
|
834 }
|
|
835 }
|
|
836
|
|
837 return \@out;
|
|
838 }
|
|
839
|
|
840
|
|
841
|
|
842 =head2 fetch_all_by_DBEntry
|
|
843
|
|
844 Description: DEPRECATED, this has been renames fetch_all_by_external_name
|
|
845
|
|
846 =cut
|
|
847
|
|
848 sub fetch_all_by_DBEntry {
|
|
849 my $self = shift;
|
|
850 deprecate("Use fetch_all_by_external_name instead.");
|
|
851 return $self->fetch_all_by_external_name(@_);
|
|
852 }
|
|
853
|
|
854 =head2 get_stable_entry_info
|
|
855
|
|
856 Description: DEPRECATED - This method should no longer be needed. Stable
|
|
857 id info is fetched when the transcript is.
|
|
858
|
|
859 =cut
|
|
860
|
|
861 sub get_stable_entry_info {
|
|
862 my ($self,$translation) = @_;
|
|
863
|
|
864 deprecate( "This method shouldnt be necessary any more" );
|
|
865
|
|
866 unless(defined $translation && ref $translation &&
|
|
867 $translation->isa('Bio::EnsEMBL::Translation') ) {
|
|
868 throw("Needs a Translation object, not a [$translation]");
|
|
869 }
|
|
870
|
|
871 my $sth = $self->prepare("SELECT stable_id, version
|
|
872 FROM translation
|
|
873 WHERE translation_id = ?");
|
|
874 $sth->bind_param(1,$translation->dbID,SQL_INTEGER);
|
|
875 $sth->execute();
|
|
876
|
|
877 my @array = $sth->fetchrow_array();
|
|
878 $translation->{'_stable_id'} = $array[0];
|
|
879 $translation->{'_version'} = $array[1];
|
|
880
|
|
881 return 1;
|
|
882 }
|
|
883
|
|
884 =head2 fetch_all
|
|
885
|
|
886 Example : $translations = $translation_adaptor->fetch_all();
|
|
887 Description : Retrieves all canonical and alternative translations
|
|
888 stored in the database.
|
|
889 Returntype : listref of Bio::EnsEMBL::Translation
|
|
890 Caller : general
|
|
891 Status : At Risk
|
|
892
|
|
893 =cut
|
|
894
|
|
895 sub fetch_all {
|
|
896 my ($self) = @_;
|
|
897 my $transcript_adaptor = $self->db()->get_TranscriptAdaptor();
|
|
898
|
|
899 my @translations;
|
|
900 foreach my $transcript (@{$transcript_adaptor->fetch_all}) {
|
|
901 my $translation = $self->fetch_by_Transcript($transcript);
|
|
902 if ($translation) {
|
|
903 push @translations, $translation;
|
|
904 }
|
|
905 foreach my $alt_translation (@{$self->fetch_all_alternative_by_Transcript($transcript)}) {
|
|
906 push @translations, $alt_translation;
|
|
907 }
|
|
908 }
|
|
909 return \@translations;
|
|
910 }
|
|
911
|
|
912 1;
|