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 Bio::EnsEMBL::Intron - A class representing an Intron
|
|
22
|
|
23 =head1 SYNOPSIS
|
|
24
|
|
25 $intron = Bio::EnsEMBL::Intron->new( exon1, exon2, $analysis );
|
|
26
|
|
27 =cut
|
|
28
|
|
29
|
|
30 package Bio::EnsEMBL::Intron;
|
|
31 use strict;
|
|
32 use warnings;
|
|
33
|
|
34 use Bio::EnsEMBL::Utils::Exception qw( warning throw );
|
|
35
|
|
36 use base qw(Bio::EnsEMBL::Feature);
|
|
37
|
|
38 =head2 new
|
|
39
|
|
40 Arg [1] : Bio::EnsEMBL::Exon The 5' exon for the intron; required
|
|
41 Arg [2] : Bio::EnsEMBL::Exon The 3' exon for the intron; required
|
|
42 Arg [3] : Bio::EnsEMBL::Analysis Analysis to link to this Intron
|
|
43 Example : $intron = new Bio::EnsEMBL::Intron($exon1, $exon2)
|
|
44 Description: Create an Intron object from two exons and an optional analysis
|
|
45 Returntype : Bio::EnsEMBL::Intron
|
|
46 Exceptions : exons not on the same strand or slice.
|
|
47 Caller : general
|
|
48 Status : Stable
|
|
49
|
|
50 =cut
|
|
51
|
|
52 sub new {
|
|
53 my ( $proto, $e1, $e2, $analysis ) = @_;
|
|
54
|
|
55 my $class = ref $proto || $proto;
|
|
56
|
|
57 my $self = $class->SUPER::new();
|
|
58
|
|
59 if ( $e1->strand() == -1 ) {
|
|
60 $self->{'end'} = $e1->start() - 1;
|
|
61 $self->{'start'} = $e2->end() + 1;
|
|
62 } else {
|
|
63 $self->{'start'} = $e1->end() + 1;
|
|
64 $self->{'end'} = $e2->start() - 1;
|
|
65 }
|
|
66
|
|
67 if ( $e1->strand() != $e2->strand() ) {
|
|
68 # throw("Exons on different strand. Not allowed");
|
|
69 } else {
|
|
70 $self->{'strand'} = $e1->strand();
|
|
71 }
|
|
72
|
|
73 if ( $e1->slice() ne $e2->slice() ) {
|
|
74 if ( ( $e1->slice()->seq_region_name() ne
|
|
75 $e2->slice()->seq_region_name() )
|
|
76 && ( $e1->slice()->coord_system_name() ne
|
|
77 $e2->slice()->coord_system_name() ) )
|
|
78 {
|
|
79 throw("Exons on different slices. Not allowed");
|
|
80 } else {
|
|
81 warning("Exons have different slice references to the same seq_region");
|
|
82 }
|
|
83 } else {
|
|
84 $self->{'slice'} = $e1->slice();
|
|
85 }
|
|
86
|
|
87 if($analysis) {
|
|
88 $self->analysis($analysis);
|
|
89 }
|
|
90
|
|
91 $self->{'prev'} = $e1;
|
|
92 $self->{'next'} = $e2;
|
|
93
|
|
94 return $self;
|
|
95 } ## end sub new
|
|
96
|
|
97 =head2 length
|
|
98
|
|
99 Args : none
|
|
100 Example : $length = $intron->length();
|
|
101 Description: Returns the length of this intron
|
|
102 Returntype : Integer
|
|
103 Exceptions : none
|
|
104 Caller : general
|
|
105 Status : Stable
|
|
106
|
|
107 =cut
|
|
108
|
|
109 sub length {
|
|
110 my ($self) = @_;
|
|
111
|
|
112 # TODO: Introns on circular slices, see Feature.pm but allow for
|
|
113 # zero-length introns.
|
|
114
|
|
115 return $self->{'end'} - $self->{'start'} + 1;
|
|
116 }
|
|
117
|
|
118
|
|
119 =head2 prev_Exon
|
|
120
|
|
121 Args : none
|
|
122 Example : $exon = $intron->prev_Exon
|
|
123 Description: Returns the exon before this Intron
|
|
124 Returntype : Bio::EnsEMBL::Exon
|
|
125 Exceptions : none
|
|
126 Caller : general
|
|
127 Status : Stable
|
|
128
|
|
129 =cut
|
|
130
|
|
131 sub prev_Exon {
|
|
132 my ($self) = shift;
|
|
133
|
|
134 return $self->{'prev'};
|
|
135 }
|
|
136
|
|
137
|
|
138 =head2 next_Exon
|
|
139
|
|
140 Args : none
|
|
141 Example : $exon = $intron->next_Exon
|
|
142 Description: Returns the exon after this Intron
|
|
143 Returntype : Bio::EnsEMBL::Exon
|
|
144 Exceptions : none
|
|
145 Caller : general
|
|
146 Status : Stable
|
|
147
|
|
148 =cut
|
|
149
|
|
150 sub next_Exon {
|
|
151 my ($self) = shift;
|
|
152
|
|
153 return $self->{'next'};
|
|
154 }
|
|
155
|
|
156 =head2 is_splice_canonical
|
|
157
|
|
158 Example : my $canonical = $intron->is_splice_canonical();
|
|
159 Description : Indicates if the splice site is considered normal. This means
|
|
160 splice site variants equal to (D == donor, A == acceptor)
|
|
161 GT (D) => AG (A)
|
|
162 AT (D) => AC (A)
|
|
163 GC (D) => AG (A)
|
|
164 Returntype : Boolean indicating if the splice was as expected
|
|
165 Exceptions : See splice_seq
|
|
166
|
|
167 =cut
|
|
168
|
|
169 sub is_splice_canonical {
|
|
170 my ($self) = @_;
|
|
171 my $splice = join q{}, @{$self->splice_seq()};
|
|
172 my $canonical = {
|
|
173 'GTAG' => 1, 'ATAC' => 1, 'GCAG' => 1
|
|
174 }->{$splice};
|
|
175 return $canonical || 0;
|
|
176 }
|
|
177
|
|
178 =head2 splice_seq
|
|
179
|
|
180 Example : my ($donor, $acceptor) = @{$intron->splice_seq};
|
|
181 Description : Get the donor and acceptor splice sites for this intron
|
|
182 Returntype : ArrayRef[String] The donor and acceptor sequences as Strings
|
|
183 Exceptions : Thrown if a feature Slice cannot be found
|
|
184
|
|
185 =cut
|
|
186
|
|
187 sub splice_seq {
|
|
188 my ($self) = @_;
|
|
189 my $slice = $self->feature_Slice();
|
|
190 throw "Cannot retrieve feature_Slice() for this Intron" unless $slice;
|
|
191 my $length = $self->length();
|
|
192 my $donor_seq = uc($slice->subseq(1,2));
|
|
193 my $acceptor_seq = uc($slice->subseq($length - 1, $length));
|
|
194 return [$donor_seq, $acceptor_seq];
|
|
195 }
|
|
196
|
|
197 1;
|
|
198
|
|
199
|