Raw content of Bio::EnsEMBL::Analysis::Tools::GeneBuildUtils::ExonUtils
=head1 NAME
Bio::EnsEMBL::Analysis::Tools::GeneBuildUtils::ExonUtils - utilities for transcript objects
=head1 SYNOPSIS
use Bio::EnsEMBL::Analysis::Tools::GeneBuildUtils::ExonUtils qw(Exon_info);
or
use Bio::EnsEMBL::Analysis::Tools::GeneBuildUtils::ExonUtils
to get all methods
=head1 DESCRIPTION
All methods in this class should take a Bio::EnsEMBL::Exon
object as their first argument.
The methods provided should carry out some standard
functionality for said objects such as printing info or
transfering evidence
=head1 CONTACT
please send any questions to ensembl-dev@ebi.ac.uk
=head1 METHODS
the rest of the documention details the exported static
class methods
=cut
package Bio::EnsEMBL::Analysis::Tools::GeneBuildUtils::ExonUtils;
use strict;
use warnings;
use Exporter;
use Bio::EnsEMBL::Utils::Exception qw(verbose throw warning
stack_trace_dump);
use Bio::EnsEMBL::Analysis::Tools::GeneBuildUtils qw(coord_string id);
use Bio::EnsEMBL::Analysis::Tools::GeneBuildUtils::EvidenceUtils qw(print_Evidence clone_Evidence);
use Bio::EnsEMBL::Analysis::Tools::GeneBuildUtils::IntronUtils qw(get_splice_sites);
use Bio::EnsEMBL::Exon;
use Bio::EnsEMBL::Analysis::Tools::Logger qw(logger_info);
use vars qw (@ISA @EXPORT);
@ISA = qw(Exporter);
@EXPORT = qw(
print_Exon
clone_Exon
Exon_info
exon_length_less_than_maximum
transfer_supporting_evidence
get_upstream_Intron
get_downstream_Intron
get_upstream_splice_sites
get_downstream_splice_sites
create_Exon
validate_Exon_coords
);
=head2 print_Exon
Arg [1] : Bio::EnsEMBL::Exon
Arg [2] : string, indent (\t) to tag infront of printed
Function : print information about given exon and
associated evidence
Returntype: none
Exceptions: throws if not passed a first argument
Example :
=cut
sub print_Exon{
my ($exon, $indent ) = @_;
$indent = "" if(!$indent);
throw("Must be passed an exon") if(!$exon);
print Exon_info($exon, $indent)."\n";
foreach my $evidence(@{$exon->get_all_supporting_features}){
my $evidence_indent = $indent."\t";
print_Evidence($evidence, $evidence_indent);
}
}
=head2 Exon_info
Arg [1] : Bio::EnsEMBL::Exon
Arg [2] : indent, string
Function : returns a string with info about exon in it
Returntype: string
Exceptions: throws if not passed a first argument
Example :
=cut
sub Exon_info{
my ($exon, $indent) = @_;
throw("Must be passed an exon") if(!$exon);
$indent = '' if(!$indent);
my $coord_string = coord_string($exon);
my $id = id($exon);
return $indent."EXON: ".$id." ".$coord_string." ".
$exon->phase." ".$exon->end_phase." ".
$exon->length;
}
=head2 clone_Exon
Arg [1] : Bio::EnsEMBL::Exon
Function : produces a whole new exon object identical
to the object passed
Returntype: Bio::EnsEMBL::Exon
Exceptions: none
Example :
=cut
sub clone_Exon{
my ($exon) = @_;
my @sfs;
foreach my $sf(@{$exon->get_all_supporting_features}){
my $newsf = clone_Evidence($sf);
push(@sfs, $newsf);
}
my $newexon = create_Exon($exon->start, $exon->end, $exon->phase, $exon->end_phase,
$exon->strand, $exon->analysis, \@sfs, $exon->dbID,
$exon->slice, $exon->stable_id, $exon->version);
return $newexon;
}
sub create_Exon{
my ($start, $end, $phase, $end_phase, $strand, $analysis, $sfs, $dbID, $slice, $stable_id, $version) = @_;
my $newexon = Bio::EnsEMBL::Exon->new();
$newexon->start ($start);
$newexon->end ($end);
$newexon->phase ($phase);
$newexon->end_phase ($end_phase);
$newexon->strand ($strand);
$newexon->analysis ($analysis);
$newexon->dbID ($dbID);
$newexon->slice ($slice);
$newexon->stable_id ($stable_id);
$newexon->version ($version);
foreach my $sf(@$sfs){
$newexon->add_supporting_features($sf);
}
return $newexon;
}
=head2 exon_length_less_than_maximum
Arg [1] : Bio::EnsEMBL::Exon
Arg [2] : int, max length
Function : checks if exon is longer than specified length
Returntype: boolean, 0 for longer, 1 for shorter
Exceptions: none
Example :
=cut
sub exon_length_less_than_maximum{
my ($exon, $max_length) = @_;
if($exon->length >= $max_length){
warning(id($exon)." is longer than max length ".
$max_length);
return 0;
}
return 1;
}
=head2 transfer_supporting_evidence
Arg [1] : Bio::EnsEMBL::Exon
Arg [2] : Bio::EnsEMBL::Exon
Function : transfer evidence from the first exon to the
second exon
Returntype: Bio::EnsEMBL::Exon
Exceptions:
Example :
=cut
#Note this method modifies the target exon which is_
#passed in
sub transfer_supporting_evidence{
my ($source_exon, $target_exon) = @_;
my %target_evidence;
my %source_evidence;
foreach my $sf
(@{$target_exon->get_all_supporting_features}){
my $unique_id = $sf->start."-".$sf->end."-".
$sf->strand."-".$sf->hseqname."-".$sf->cigar_string;
$target_evidence{$unique_id} = $sf;
}
foreach my $sf
(@{$source_exon->get_all_supporting_features}){
my $unique_id = $sf->start."-".$sf->end."-".
$sf->strand."-".$sf->hseqname."-".$sf->cigar_string;
if(!$target_evidence{$unique_id}){
$source_evidence{$unique_id} = $sf;
}
}
foreach my $sf(values(%source_evidence)){
logger_info("Adding ".$sf->hseqname." to the target exon");
$target_exon->add_supporting_features($sf);
}
return $target_exon;
}
sub validate_Exon_coords{
my ($exon, $allow_negative_start) = @_;
throw("Must pass ExonUtils::validate_Exon_coords an exon ") if(!$exon);
if(!$allow_negative_start && ($exon->start < 0)){
warning(id($exon)." ".$exon->start." is less than zero");
return 0;
}
elsif($exon->start > $exon->end){
warning(id($exon)." ".$exon->start." is greater than ".$exon->end);
return 0;
}
return 1;
}
=head2 Intron methods
Arg [1] : Bio::EnsEMBL::Exon
Arg [2] : Bio::EnsEMBL::Transcript
Function : these methods get either intron objects or splice site pairs
on the basis of a give exon and transcript
Returntype: either Bio::EnsEMBL::Intron or 2 strings. Note the 5" most exon will give
no upstream intron/splice sites and the 3" most exon will give no downstream
Exceptions:
Example :
=cut
sub get_upstream_Intron{
my ($exon, $transcript) = @_;
foreach my $intron(@{$transcript->get_Introns}){
if($exon eq $intron->next_Exon){
return $intron;
}
}
return undef;
}
sub get_downstream_Intron{
my ($exon, $transcript) = @_;
foreach my $intron(@{$transcript->get_Introns}){
if($exon eq $intron->prev_Exon){
return $intron;
}
}
return undef;
}
sub get_upstream_splice_sites{
my ($exon, $transcript) = @_;
my $upstream_intron = get_upstream_Intron($exon, $transcript);
if($upstream_intron){
return get_splice_sites($upstream_intron);
}else{
return undef;
}
}
sub get_downstream_splice_sites{
my ($exon, $transcript) = @_;
my $downstream_intron = get_downstream_Intron($exon, $transcript);
if($downstream_intron){
return get_splice_sites($downstream_intron);
}else{
return undef;
}
}
1;