diff --git a/modules/Bio/EnsEMBL/Utils/IO/GTFSerializer.pm b/modules/Bio/EnsEMBL/Utils/IO/GTFSerializer.pm index 1da9d38b9ceb3a6e8075b89bdf7c1fa3968332bc..aa5373610f896bde7602ecc895254c32588917d0 100644 --- a/modules/Bio/EnsEMBL/Utils/IO/GTFSerializer.pm +++ b/modules/Bio/EnsEMBL/Utils/IO/GTFSerializer.pm @@ -32,6 +32,7 @@ package Bio::EnsEMBL::Utils::IO::GTFSerializer; use strict; use warnings; +use Bio::EnsEMBL::SeqFeature; use Bio::EnsEMBL::Utils::Exception; use Bio::EnsEMBL::Utils::IO::FeatureSerializer; use Bio::EnsEMBL::Utils::Scalar qw/check_ref/; @@ -64,4 +65,64 @@ sub print_feature { } +=head2 _make_start_codon_features + + Arg [1] : Bio::EnsEMBL::Transcript + Example : + Description: + Returntype : Array + +=cut + +sub _make_start_codon_features { + my ($self, $trans) = @_; + + + if (!$trans->translation) { + return (()); + } + + my @translateable = @{$trans->get_all_translateable_Exons}; + + my @pepgencoords = $trans->pep2genomic(1,1); + + # cdna can come padded these days so allow gap at the start + if($pepgencoords[0]->isa('Bio::EnsEMBL::Mapper::Gap')){ + shift @pepgencoords; + } + + if(scalar(@pepgencoords) > 3) { + throw(sprintf "Pep start for transcript %s does not map cleanly", $trans->display_id); + } + + unless($pepgencoords[0]->isa('Bio::EnsEMBL::Mapper::Coordinate')) { + throw(sprintf "Pep start for transcript %s maps to gap", $trans->display_id); + } + unless($pepgencoords[$#pepgencoords]->isa('Bio::EnsEMBL::Mapper::Coordinate')) { + throw(sprintf "Pep start (end of) for transcript %s maps to gap", $trans->display_id); + } + + @translateable = @{$trans->get_all_translateable_Exons}; + 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); + $phase = 3 - ($pepgencoord->end - $pepgencoord->start + 1); + } + if ($translateable[0]->strand == 1) { + @startc_feat = sort {$a->start <=> $b->start } @startc_feat; + } else { + @startc_feat = sort {$b->start <=> $a->start } @startc_feat; + } + return @startc_feat; + +} + 1;