From e1546321e9abdf72931c353e4a41b69bdea59e76 Mon Sep 17 00:00:00 2001 From: Alessandro Vullo <avullo@ebi.ac.uk> Date: Tue, 28 May 2013 13:30:52 +0000 Subject: [PATCH] Added (private) method _make_stop_codon_features --- modules/Bio/EnsEMBL/Utils/IO/GTFSerializer.pm | 81 ++++++++++++++++--- 1 file changed, 69 insertions(+), 12 deletions(-) diff --git a/modules/Bio/EnsEMBL/Utils/IO/GTFSerializer.pm b/modules/Bio/EnsEMBL/Utils/IO/GTFSerializer.pm index aa5373610f..a681467fb8 100644 --- a/modules/Bio/EnsEMBL/Utils/IO/GTFSerializer.pm +++ b/modules/Bio/EnsEMBL/Utils/IO/GTFSerializer.pm @@ -76,11 +76,10 @@ sub print_feature { sub _make_start_codon_features { my ($self, $trans) = @_; + defined $trans or + throw("Transcript object not defined"); - - if (!$trans->translation) { - return (()); - } + return (()) unless $trans->translation; my @translateable = @{$trans->get_all_translateable_Exons}; @@ -106,14 +105,14 @@ sub _make_start_codon_features { my @startc_feat; my $phase = 0; foreach my $pepgencoord (@pepgencoords) { - push @startc_feat, new Bio::EnsEMBL::SeqFeature( - -seqname => $trans->stable_id, - -source_tag => 'starttrans', - -primary_tag => 'similarity', - -start => $pepgencoord->start, - -end => $pepgencoord->end, - -phase => $phase, - -strand => $translateable[0]->strand); + push @startc_feat, + new Bio::EnsEMBL::SeqFeature(-seqname => $trans->stable_id, + -source_tag => 'starttrans', + -primary_tag => 'similarity', + -start => $pepgencoord->start, + -end => $pepgencoord->end, + -phase => $phase, + -strand => $translateable[0]->strand); $phase = 3 - ($pepgencoord->end - $pepgencoord->start + 1); } if ($translateable[0]->strand == 1) { @@ -121,8 +120,66 @@ sub _make_start_codon_features { } else { @startc_feat = sort {$b->start <=> $a->start } @startc_feat; } + return @startc_feat; } +=head2 _make_stop_codon_features + + Arg [1] : Bio::EnsEMBL::Transcript + Example : + Description: + Returntype : Array + +=cut + +sub _make_stop_codon_features { + my ($self, $trans) = @_; + + defined $trans or + throw("Transcript object not defined"); + + return (()) unless $trans->translation; + + my @translateable = @{$trans->get_all_translateable_Exons}; + + my $cdna_endpos = $trans->cdna_coding_end; + + my @pepgencoords = $trans->cdna2genomic($cdna_endpos-2,$cdna_endpos); + + if(scalar(@pepgencoords) > 3) { + throw(sprintf "Pep end for transcript %s does not map cleanly", $trans->display_id); + } + unless($pepgencoords[0]->isa('Bio::EnsEMBL::Mapper::Coordinate')) { + throw(sprintf "Pep end for transcript %s maps to gap", $trans->display_id); + } + unless($pepgencoords[$#pepgencoords]->isa('Bio::EnsEMBL::Mapper::Coordinate')) { + throw(sprintf "Pep end (end of) for transcript %s maps to gap", $trans->display_id); + } + + my @stopc_feat; + my $phase = 0; + foreach my $pepgencoord (@pepgencoords) { + push @stopc_feat, + new Bio::EnsEMBL::SeqFeature(-seqname => $trans->display_id, + -source_tag => 'endtrans', + -primary_tag => 'similarity', + -start => $pepgencoord->start, + -end => $pepgencoord->end, + -phase => $phase, + -strand => $translateable[0]->strand); + $phase = 3 - ($pepgencoord->end-$pepgencoord->start+1); + } + + if ($translateable[0]->strand == 1) { + @stopc_feat = sort {$a->start <=> $b->start } @stopc_feat; + } else { + @stopc_feat = sort {$b->start <=> $a->start } @stopc_feat; + } + + return @stopc_feat; + +} + 1; -- GitLab