annotate variant_effect_predictor/Bio/EnsEMBL/Feature.pm @ 0:2bc9b66ada89 draft default tip

Uploaded
author mahtabm
date Thu, 11 Apr 2013 06:29:17 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1 =head1 LICENSE
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
2
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
3 Copyright (c) 1999-2012 The European Bioinformatics Institute and
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
4 Genome Research Limited. All rights reserved.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
5
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
6 This software is distributed under a modified Apache license.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
7 For license details, please see
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
8
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
9 http://www.ensembl.org/info/about/code_licence.html
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
10
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
11 =head1 CONTACT
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
12
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
13 Please email comments or questions to the public Ensembl
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
14 developers list at <dev@ensembl.org>.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
15
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
16 Questions may also be sent to the Ensembl help desk at
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
17 <helpdesk@ensembl.org>.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
18
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
19 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
20
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
21 =head1 NAME
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
22
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
23 Bio::EnsEMBL::Feature - Ensembl specific sequence feature.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
24
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
25 =head1 SYNOPSIS
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
26
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
27 my $feat = new Bio::EnsEMBL::Feature(
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
28 -start => 100,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
29 -end => 220,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
30 -strand => -1,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
31 -slice => $slice -analysis => $analysis
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
32 );
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
33
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
34 my $start = $feat->start();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
35 my $end = $feat->end();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
36 my $strand = $feat->strand();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
37
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
38 # Move the feature to the chromosomal coordinate system
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
39 $feature = $feature->transform('chromosome');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
40
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
41 # Move the feature to a different slice (possibly on another coord
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
42 # system)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
43 $feature = $feature->transfer($new_slice);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
44
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
45 # Project the feature onto another coordinate system possibly across
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
46 # boundaries:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
47 @projection = @{ $feature->project('contig') };
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
48
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
49 # Change the start, end, and strand of the feature in place
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
50 $feature->move( $new_start, $new_end, $new_strand );
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
51
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
52 =head1 DESCRIPTION
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
53
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
54 This is the Base feature class from which all Ensembl features inherit.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
55 It provides a bare minimum functionality that all features require. It
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
56 basically describes a location on a sequence in an arbitrary coordinate
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
57 system.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
58
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
59 =head1 METHODS
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
60
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
61 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
62
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
63
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
64 package Bio::EnsEMBL::Feature;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
65
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
66 use strict;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
67 use warnings;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
68
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
69 use Bio::EnsEMBL::Storable;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
70 use Bio::EnsEMBL::Utils::Argument qw(rearrange);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
71 use Bio::EnsEMBL::Utils::Exception qw(throw deprecate warning);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
72 use Bio::EnsEMBL::Utils::Scalar qw(check_ref assert_ref);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
73 use Bio::EnsEMBL::Slice;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
74 use Bio::EnsEMBL::StrainSlice;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
75 use vars qw(@ISA);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
76
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
77 use Scalar::Util qw(weaken isweak);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
78
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
79 @ISA = qw(Bio::EnsEMBL::Storable);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
80
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
81
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
82 =head2 new
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
83
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
84 Arg [-SLICE]: Bio::EnsEMBL::SLice - Represents the sequence that this
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
85 feature is on. The coordinates of the created feature are
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
86 relative to the start of the slice.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
87 Arg [-START]: The start coordinate of this feature relative to the start
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
88 of the slice it is sitting on. Coordinates start at 1 and
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
89 are inclusive.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
90 Arg [-END] : The end coordinate of this feature relative to the start of
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
91 the slice it is sitting on. Coordinates start at 1 and are
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
92 inclusive.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
93 Arg [-STRAND]: The orientation of this feature. Valid values are 1,-1,0.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
94 Arg [-SEQNAME] : A seqname to be used instead of the default name of the
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
95 of the slice. Useful for features that do not have an
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
96 attached slice such as protein features.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
97 Arg [-dbID] : (optional) internal database id
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
98 Arg [-ADAPTOR]: (optional) Bio::EnsEMBL::DBSQL::BaseAdaptor
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
99 Example : $feature = Bio::EnsEMBL::Feature->new(-start => 1,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
100 -end => 100,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
101 -strand => 1,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
102 -slice => $slice,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
103 -analysis => $analysis);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
104 Description: Constructs a new Bio::EnsEMBL::Feature. Generally subclasses
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
105 of this method are instantiated, rather than this class itself.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
106 Returntype : Bio::EnsEMBL::Feature
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
107 Exceptions : Thrown on invalid -SLICE, -ANALYSIS, -STRAND ,-ADAPTOR arguments
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
108 Caller : general, subclass constructors
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
109 Status : Stable
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
110
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
111 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
112
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
113
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
114 sub new {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
115 my $caller = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
116
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
117 my $class = ref($caller) || $caller;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
118 my ( $start, $end, $strand, $slice, $analysis,$seqname, $dbID, $adaptor ) =
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
119 rearrange(['START','END','STRAND','SLICE','ANALYSIS', 'SEQNAME',
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
120 'DBID', 'ADAPTOR'], @_);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
121 if($slice) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
122 if(!ref($slice) || !($slice->isa('Bio::EnsEMBL::Slice') or $slice->isa('Bio::EnsEMBL::LRGSlice')) ) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
123 throw('-SLICE argument must be a Bio::EnsEMBL::Slice not '.$slice);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
124 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
125 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
126
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
127 if($analysis) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
128 if(!ref($analysis) || !$analysis->isa('Bio::EnsEMBL::Analysis')) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
129 throw('-ANALYSIS argument must be a Bio::EnsEMBL::Analysis not '.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
130 $analysis);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
131 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
132 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
133
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
134 if(defined($strand)) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
135 if(!($strand == 1) && !($strand == -1) && !($strand == 0)) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
136 throw('-STRAND argument must be 1, -1, or 0');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
137 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
138 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
139
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
140 if(defined($start) && defined($end)) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
141 if (($start =~ /\d+/) && ($end =~ /\d+/)) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
142 if($end+1 < $start) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
143 throw(sprintf('Start (%d) must be less than or equal to end+1 (%d)', $start, ($end+1)));
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
144 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
145 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
146 throw('Start and end must be integers');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
147 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
148 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
149
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
150 my $self = bless({'start' => $start,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
151 'end' => $end,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
152 'strand' => $strand,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
153 'slice' => $slice,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
154 'analysis' => $analysis,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
155 'seqname' => $seqname,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
156 'dbID' => $dbID}, $class);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
157
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
158 $self->adaptor($adaptor);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
159 return $self;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
160 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
161
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
162
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
163 =head2 new_fast
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
164
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
165 Arg [1] : hashref to be blessed
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
166 Description: Construct a new Bio::EnsEMBL::Feature using the hashref.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
167 Exceptions : none
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
168 Returntype : Bio::EnsEMBL::Feature
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
169 Caller : general, subclass constructors
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
170 Status : Stable
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
171
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
172 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
173
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
174
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
175 sub new_fast {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
176 my $class = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
177 my $hashref = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
178 my $self = bless $hashref, $class;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
179 weaken($self->{adaptor}) if ( ! isweak($self->{adaptor}) );
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
180 return $self;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
181 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
182
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
183 =head2 start
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
184
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
185 Arg [1] : (optional) int $start
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
186 The start of this feature relative to the start of the slice
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
187 that it is on.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
188 Example : $start = $feat->start()
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
189 Description: Getter/Setter for the start of this feature relative to the
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
190 start of the slice it is on. Note that negative values, or
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
191 values exceeding the length of the slice are permitted.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
192 Start must be less than or equal to the end regardless of the
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
193 strand. Coordinate values start at 1 and are inclusive.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
194 Returntype : int
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
195 Exceptions : none
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
196 Caller : general
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
197 Status : Stable
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
198
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
199 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
200
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
201 sub start {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
202 my ( $self, $value ) = @_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
203
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
204 if ( defined($value) ) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
205 $self->{'start'} = $value;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
206 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
207
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
208 return $self->{'start'};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
209 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
210
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
211
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
212
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
213 =head2 end
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
214
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
215 Arg [1] : (optional) int $end
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
216 Example : $end = $feat->end();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
217 Description: Getter/Setter for the end of this feature relative to the
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
218 start of the slice that it is on. Note that negative values,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
219 of values exceeding the length of the slice are permitted. End
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
220 must be greater than or equal to start regardless of the strand.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
221 Coordinate values start at 1 and are inclusive.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
222 Returntype : int
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
223 Exceptions : none
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
224 Caller : general
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
225 Status : Stable
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
226
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
227 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
228
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
229 sub end {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
230 my ( $self, $value ) = @_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
231
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
232 if ( defined($value) ) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
233 $self->{'end'} = $value;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
234 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
235
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
236 return $self->{'end'};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
237 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
238
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
239
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
240
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
241
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
242 =head2 strand
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
243
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
244 Arg [1] : (optional) int $strand
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
245 Example : $feat->strand(-1);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
246 Description: Getter/Setter for the strand of this feature relative to the
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
247 slice it is on. 0 is an unknown or non-applicable strand.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
248 -1 is the reverse (negative) strand and 1 is the forward
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
249 (positive) strand. No other values are permitted.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
250 Returntype : int
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
251 Exceptions : thrown if an invalid strand argument is passed
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
252 Caller : general
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
253 Status : Stable
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
254
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
255 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
256
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
257 sub strand {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
258 my ( $self, $strand ) = @_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
259
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
260 if ( defined($strand) ) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
261 if ( $strand != 0 && $strand != 1 && $strand != -1 ) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
262 throw('strand argument must be 0, -1 or 1');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
263 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
264
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
265 $self->{'strand'} = $strand;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
266 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
267
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
268 return $self->{'strand'};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
269 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
270
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
271 =head2 move
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
272
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
273 Arg [1] : int start
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
274 Arg [2] : int end
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
275 Arg [3] : (optional) int strand
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
276 Example : None
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
277 Description: Sets the start, end and strand in one call rather than in
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
278 3 seperate calls to the start(), end() and strand() methods.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
279 This is for convenience and for speed when this needs to be
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
280 done within a tight loop.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
281 Returntype : none
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
282 Exceptions : Thrown is invalid arguments are provided
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
283 Caller : general
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
284 Status : Stable
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
285
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
286 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
287
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
288 sub move {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
289 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
290
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
291 throw('start and end arguments are required') if(@_ < 2);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
292
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
293 my $start = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
294 my $end = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
295 my $strand = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
296
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
297 if(defined($start) && defined($end) && $end < $start) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
298 throw('start must be less than or equal to end');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
299 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
300 if(defined($strand) && $strand != 0 && $strand != -1 && $strand != 1) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
301 throw('strand must be 0, -1 or 1');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
302 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
303
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
304 $self->{'start'} = $start;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
305 $self->{'end'} = $end;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
306 $self->{'strand'} = $strand if(defined($strand));
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
307 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
308
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
309
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
310
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
311 =head2 length
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
312
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
313 Arg [1] : none
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
314 Example : $length = $feat->length();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
315 Description: Returns the length of this feature
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
316 Returntype : Integer
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
317 Exceptions : Throws if end < start and the feature is not on a
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
318 circular slice
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
319 Caller : general
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
320 Status : Stable
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
321
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
322 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
323
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
324 sub length {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
325 my ($self) = @_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
326
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
327 if ( $self->{'end'} < $self->{'start'} ) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
328 # if circular, we can work out the length of an origin-spanning
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
329 # feature using the size of the underlying region.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
330 if ( $self->slice() && $self->slice()->is_circular() ) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
331 my $len =
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
332 $self->slice()->seq_region_length() -
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
333 ( $self->{'start'} - $self->{'end'} ) + 1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
334 return $len;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
335 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
336 throw( "Cannot determine length of non-circular feature "
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
337 . "where start > end" );
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
338 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
339 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
340
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
341 return $self->{'end'} - $self->{'start'} + 1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
342 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
343
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
344 =head2 analysis
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
345
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
346 Arg [1] : (optional) Bio::EnsEMBL::Analysis $analysis
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
347 Example : $feature->analysis(new Bio::EnsEMBL::Analysis(...))
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
348 Description: Getter/Setter for the analysis that is associated with
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
349 this feature. The analysis describes how this feature
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
350 was derived.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
351 Returntype : Bio::EnsEMBL::Analysis
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
352 Exceptions : thrown if an invalid argument is passed
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
353 Caller : general
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
354 Status : Stable
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
355
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
356 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
357
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
358 sub analysis {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
359 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
360
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
361 if(@_) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
362 my $an = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
363 if(defined($an) && (!ref($an) || !$an->isa('Bio::EnsEMBL::Analysis'))) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
364 throw('analysis argument must be a Bio::EnsEMBL::Analysis');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
365 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
366 $self->{'analysis'} = $an;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
367 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
368
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
369 return $self->{'analysis'};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
370 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
371
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
372
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
373
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
374 =head2 slice
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
375
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
376 Arg [1] : (optional) Bio::EnsEMBL::Slice $slice
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
377 Example : $seqname = $feature->slice()->name();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
378 Description: Getter/Setter for the Slice that is associated with this
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
379 feature. The slice represents the underlying sequence that this
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
380 feature is on. Note that this method call is analagous to the
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
381 old SeqFeature methods contig(), entire_seq(), attach_seq(),
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
382 etc.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
383 Returntype : Bio::EnsEMBL::Slice
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
384 Exceptions : thrown if an invalid argument is passed
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
385 Caller : general
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
386 Status : Stable
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
387
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
388 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
389
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
390 sub slice {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
391 my ( $self, $slice ) = @_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
392
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
393 if ( defined($slice) ) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
394 if ( !check_ref( $slice, 'Bio::EnsEMBL::Slice' )
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
395 && !check_ref( $slice, 'Bio::EnsEMBL::LRGSlice' ) )
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
396 {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
397 throw('slice argument must be a Bio::EnsEMBL::Slice');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
398 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
399
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
400 $self->{'slice'} = $slice;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
401 } elsif ( @_ > 1 ) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
402 delete($self->{'slice'});
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
403 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
404
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
405 return $self->{'slice'};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
406 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
407
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
408 =head2 equals
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
409
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
410 Arg [1] : Bio::EnsEMBL::Feature object
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
411 Example : if ($featureA->equals($featureB)) { ... }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
412 Description : Compares two features using various criteria. The
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
413 test for eqality goes through the following list and
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
414 terminates at the first true match:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
415
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
416 1. If the two features are the same object, they are
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
417 equal.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
418 2. If they are of different types (e.g., transcript
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
419 and gene), they are *not* equal.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
420 3. If they both have dbIDs: if these are the same,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
421 then they are equal, otherwise not.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
422 4. If they both have slices and analysis objects:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
423 if the analysis dbIDs are the same and the
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
424 seq_region_id are the same, along with
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
425 seq_region_start and seq_region_end, then they are
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
426 equal, otherwise not.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
427
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
428 If none of the above is able to determine equality,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
429 undef is returned.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
430
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
431 Return type : tri-Boolean (0, 1, undef = "unknown")
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
432
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
433 Exceptions : Thrown if a non-feature is passed as the argument.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
434
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
435 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
436
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
437 sub equals {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
438 my ( $self, $feature ) = @_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
439
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
440 # If the features are the same object, they are equal.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
441 if ( !defined($feature) ) { return 0 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
442 if ( $self eq $feature ) { return 1 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
443
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
444 assert_ref( $feature, 'Bio::EnsEMBL::Feature' );
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
445
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
446 # If the features have different types, they are *not* equal.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
447 if ( ref($self) ne ref($feature) ) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
448 return 0;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
449 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
450
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
451 # If the features has the same dbID, they are equal.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
452 if ( defined( $self->dbID() ) && defined( $feature->dbID() ) ) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
453 if ( $self->dbID() == $feature->dbID() ) { return 1 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
454 else { return 0 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
455 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
456
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
457 # We now know that one of the features do not have a dbID.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
458
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
459 # If the features have the same start, end, strand and seq_region_id,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
460 # and analysis_id, they are equal.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
461 if (
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
462 ( defined( $self->analysis() ) && defined( $feature->analysis() ) )
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
463 && ( defined( $self->slice() ) && defined( $feature->slice() ) ) )
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
464 {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
465 if ( ( $self->start() == $feature->start() ) &&
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
466 ( $self->end() == $feature->end() ) &&
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
467 ( $self->strand() == $feature->strand() ) &&
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
468 ( $self->slice()->get_seq_region_id() ==
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
469 $feature->slice()->get_seq_region_id() ) &&
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
470 ( $self->analysis()->dbID() == $feature->analysis()->dbID() ) )
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
471 {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
472 return 1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
473 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
474 else { return 0 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
475 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
476
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
477 # We now know that one of the features does not have either analysis
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
478 # or slice.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
479
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
480 # We don't know if the features are equal. This happens if they are
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
481 # not the same object but are of the same type, and one of them lacks
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
482 # dbID, and if there aren't slice and analysis objects attached to
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
483 # them both.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
484 return undef;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
485 } ## end sub equals
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
486
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
487
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
488 =head2 transform
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
489
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
490 Arg [1] : string $coord_system
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
491 The coord system to transform this feature to.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
492 Arg [2] : string $version (optional)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
493 The version of the coord system to transform this feature to.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
494 Example : $feature = $feature->transform('contig');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
495 next if(!defined($feature));
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
496 Description: Returns a copy of this feature, but converted to a different
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
497 coordinate system. The converted feature will be placed on a
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
498 slice which spans an entire sequence region of the new
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
499 coordinate system. If the requested coordinate system is the
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
500 same coordinate system it is simply placed on a slice which
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
501 spans the entire seq_region (as opposed to the original slice
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
502 which may have only partially covered the seq_region).
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
503
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
504 If a feature spans a boundary in the new coordinate system,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
505 undef is returned instead.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
506
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
507 For example, transforming an exon in contig coordinates to one
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
508 in chromosomal coodinates will place the exon on a slice of an
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
509 entire chromosome.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
510 Returntype : Bio::EnsEMBL::Feature (or undef)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
511 Exceptions : thrown if an invalid coordinate system is provided
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
512 warning if Feature is not attached to a slice
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
513 Caller : general, transfer()
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
514 Status : Stable
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
515
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
516 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
517
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
518 sub transform {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
519 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
520 my $cs_name = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
521 my $cs_version = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
522 my $to_slice = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
523
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
524 #
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
525 # For backwards compatibility check if the arguments are old style args
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
526 #
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
527 if(!$cs_name || ref($cs_name)) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
528 deprecate('Calling transform without a coord system name is deprecated.');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
529 return $self->_deprecated_transform($cs_name);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
530 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
531
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
532 my $slice = $self->{'slice'};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
533
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
534 if(!$slice) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
535 warning("Feature cannot be transformed without attached slice.");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
536 return undef;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
537 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
538
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
539 if(!$slice->adaptor()) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
540 warning("Feature cannot be transformed without adaptor on" .
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
541 " attached slice.");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
542 return undef;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
543 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
544
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
545 #use db from slice since this feature may not yet be stored in a database
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
546 my $db = $slice->adaptor->db();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
547 my $cs = $db->get_CoordSystemAdaptor->fetch_by_name($cs_name, $cs_version);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
548 my $current_cs = $slice->coord_system();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
549
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
550 if(!$current_cs) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
551 warning("Feature cannot be transformed without CoordSystem on " .
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
552 "attached slice.");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
553 return undef;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
554 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
555
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
556 if(!$cs) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
557 throw("Cannot transform to unknown coordinate system " .
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
558 "[$cs_name $cs_version]\n");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
559 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
560
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
561 # if feature is already in the requested coordinate system, we can just
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
562 # return a copy
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
563 if( $cs->equals( $current_cs ) && $slice->start() == 1 &&
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
564 $slice->strand() == 1 ) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
565 my $new_feature;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
566 %$new_feature = %$self;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
567 bless $new_feature, ref $self;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
568 return $new_feature;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
569 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
570 my $projection;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
571 if(defined($to_slice)){
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
572 $projection = $self->project_to_slice( $to_slice ); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
573 else{
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
574 $projection = $self->project( $cs_name, $cs_version );
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
575 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
576
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
577 if(@$projection == 0){
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
578 return undef;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
579 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
580 if( @$projection != 1 and !defined($to_slice)) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
581 # warn "MORE than one projection and NO slice specified ";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
582 # warn "from ".$self->slice->name." to $cs_name, $cs_version\n";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
583 return undef;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
584 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
585 my $index = 0;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
586 if(defined($to_slice)){
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
587 my $found = 0;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
588 my $i = 0;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
589 foreach my $proj (@{$projection}) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
590 my $slice = $proj->[2];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
591 if($to_slice->get_seq_region_id eq $slice->get_seq_region_id){
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
592 $found =1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
593 $index = $i;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
594 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
595 $i++;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
596 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
597 if(!$found){
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
598 if(@$projection != 1){
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
599 if(@$projection == 0){
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
600 warn "number of mappings is ".@$projection."\n";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
601 warn "could not project feature ".ref($self)." from ".$self->slice->seq_region_name." to ".$to_slice->seq_region_name."\n";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
602 warn "In the region of ".$self->slice->start." <-> ".$self->slice->end."\n";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
603 warn "feat start=".($self->slice->start+$self->start)."\tend=".($self->slice->start+$self->end)."\n";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
604 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
605 else{
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
606 foreach my $proj (@{$projection}) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
607 my $slice = $proj->[2];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
608 warn "available slice ".$slice->seq_regon_name."\n";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
609 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
610 warn "MORE than one projection and none to slice specified (".$to_slice->seq_region_name.")\n";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
611 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
612 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
613 else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
614 foreach my $proj (@{$projection}) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
615 warn "Mapping is to ".$proj->[2]->seq_region_name."\n";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
616 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
617 warn "One projection but none to slice specified\n";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
618 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
619 return undef;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
620 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
621 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
622
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
623 my $p_slice = $projection->[$index]->[2];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
624 my $slice_adaptor = $db->get_SliceAdaptor;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
625 $slice = $slice_adaptor->fetch_by_region($p_slice->coord_system()->name(),
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
626 $p_slice->seq_region_name(),
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
627 undef, #start
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
628 undef, #end
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
629 1, #strand
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
630 $p_slice->coord_system()->version);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
631
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
632 my $new_feature;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
633 %$new_feature = %$self;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
634 bless $new_feature, ref $self;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
635 $new_feature->{'start'} = $p_slice->start();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
636 $new_feature->{'end'} = $p_slice->end();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
637 $new_feature->{'strand'} =
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
638 ($self->{'strand'} == 0) ? 0 : $p_slice->strand();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
639 $new_feature->{'slice'} = $slice;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
640 return $new_feature;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
641
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
642 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
643
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
644
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
645
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
646 =head2 transfer
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
647
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
648 Arg [1] : Bio::EnsEMBL::Slice $slice
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
649 The slice to transfer this feature to
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
650 Example : $feature = $feature->transfer($slice);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
651 next if(!defined($feature));
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
652 Description: Returns a copy of this feature which has been shifted onto
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
653 another slice.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
654
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
655 If the new slice is in a different coordinate system the
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
656 feature is transformed first and then placed on the slice.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
657 If the feature would be split across a coordinate system
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
658 boundary or mapped to a gap undef is returned instead.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
659
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
660 If the feature cannot be placed on the provided slice because
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
661 it maps to an entirely different location, undef is returned
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
662 instead.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
663
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
664 Returntype : Bio::EnsEMBL::Feature (or undef)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
665 Exceptions : throw on incorrect argument
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
666 throw if feature does not have attached slice
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
667 Caller : general, transform()
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
668 Status : Stable
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
669
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
670 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
671
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
672
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
673 sub transfer {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
674 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
675 my $slice = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
676
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
677 if(!$slice || !ref($slice) || (!$slice->isa('Bio::EnsEMBL::Slice') && !$slice->isa('Bio::EnsEMBL::LRGSlice'))) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
678 throw('Slice argument is required');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
679 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
680
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
681 #make a shallow copy of the feature to be transfered
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
682 my $feature;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
683 %{$feature} = %{$self};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
684 bless $feature, ref($self);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
685 weaken $feature->{adaptor};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
686
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
687 my $current_slice = $self->{'slice'};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
688
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
689 if(!$current_slice) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
690 warning("Feature cannot be transfered without attached slice.");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
691 return undef;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
692 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
693
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
694 my $cur_cs = $current_slice->coord_system();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
695 my $dest_cs = $slice->coord_system();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
696
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
697 #if we are not in the same coord system a transformation step is needed first
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
698 if(!$dest_cs->equals($cur_cs)) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
699 $feature = $feature->transform($dest_cs->name, $dest_cs->version, $slice);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
700 return undef if(!defined($feature));
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
701 $current_slice = $feature->{'slice'};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
702 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
703
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
704 # feature went to entirely different seq_region
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
705 if($current_slice->seq_region_name() ne $slice->seq_region_name()) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
706 return undef;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
707 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
708
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
709 #if the current feature positions are not relative to the start of the
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
710 #seq region, convert them so they are
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
711 my $cur_slice_start = $current_slice->start();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
712 my $cur_slice_strand = $current_slice->strand();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
713 if($cur_slice_start != 1 || $cur_slice_strand != 1) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
714 my $fstart = $feature->{'start'};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
715 my $fend = $feature->{'end'};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
716
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
717 if($cur_slice_strand == 1) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
718 $feature->{'start'} = $fstart + $cur_slice_start - 1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
719 $feature->{'end'} = $fend + $cur_slice_start - 1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
720 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
721 my $cur_slice_end = $current_slice->end();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
722 $feature->{'start'} = $cur_slice_end - $fend + 1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
723 $feature->{'end'} = $cur_slice_end - $fstart + 1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
724 $feature->{'strand'} *= -1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
725 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
726 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
727
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
728 my $fstart = $feature->{'start'};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
729 my $fend = $feature->{'end'};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
730
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
731 #convert to destination slice coords
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
732 if($slice->strand == 1) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
733 $feature->{'start'} = $fstart - $slice->start() + 1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
734 $feature->{'end'} = $fend - $slice->start() + 1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
735 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
736 $feature->{'start'} = $slice->end() - $fend + 1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
737 $feature->{'end'} = $slice->end() - $fstart + 1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
738 $feature->{'strand'} *= -1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
739 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
740
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
741 $feature->{'slice'} = $slice;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
742
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
743 return $feature;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
744 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
745
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
746 =head2 project_to_slice
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
747
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
748 Arg [1] : slice to project to
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
749
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
750
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
751 Example :
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
752 my $clone_projection = $feature->project_to_slice($slice);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
753
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
754 foreach my $seg (@$clone_projection) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
755 my $clone = $seg->to_Slice();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
756 print "Features current coords ", $seg->from_start, '-',
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
757 $seg->from_end, " project onto clone coords " .
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
758 $clone->seq_region_name, ':', $clone->start, '-', $clone->end,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
759 $clone->strand, "\n";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
760 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
761 Description: Returns the results of 'projecting' this feature onto another
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
762 slice . This is useful to see where a feature
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
763 would lie in a coordinate system in which it
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
764 crosses a boundary.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
765
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
766 This method returns a reference to a list of
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
767 Bio::EnsEMBL::ProjectionSegment objects.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
768 ProjectionSegments are blessed arrays and can also be used as
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
769 triplets [from_start,from_end,to_Slice]. The from_start and
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
770 from_end are the coordinates relative to the feature start.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
771 For example, if a feature is current 100-200bp on a slice
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
772 then the triplets returned might be:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
773 [1,50,$slice1],
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
774 [51,101,$slice2]
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
775
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
776 The to_Slice is a slice spanning the region on the requested
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
777 coordinate system that this feature projected to.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
778
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
779 If the feature projects entirely into a gap then a reference to
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
780 an empty list is returned.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
781
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
782 Returntype : listref of Bio::EnsEMBL::ProjectionSegments
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
783 which can also be used as [$start,$end,$slice] triplets
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
784 Exceptions : slice does not have an adaptor
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
785 Caller : general
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
786 Status : At Risk
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
787
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
788 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
789
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
790 sub project_to_slice {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
791 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
792 my $to_slice = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
793 my $slice = $self->{'slice'};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
794
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
795 if(!$slice) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
796 warning("Feature cannot be projected without attached slice.");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
797 return [];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
798 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
799
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
800
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
801 #get an adaptor from the attached slice because this feature may not yet
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
802 #be stored and may not have its own adaptor
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
803 my $slice_adaptor = $slice->adaptor();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
804
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
805 if(!$slice_adaptor) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
806 throw("Cannot project feature because associated slice does not have an " .
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
807 " adaptor");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
808 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
809
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
810 my $strand = $self->strand() * $slice->strand();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
811 #fetch by feature always gives back forward strand slice:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
812 $slice = $slice_adaptor->fetch_by_Feature($self);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
813 $slice = $slice->invert if($strand == -1);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
814 return $slice->project_to_slice($to_slice);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
815 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
816
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
817
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
818 =head2 project
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
819
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
820 Arg [1] : string $name
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
821 The name of the coordinate system to project this feature onto
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
822 Arg [2] : string $version (optional)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
823 The version of the coordinate system (such as 'NCBI34') to
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
824 project this feature onto
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
825 Example :
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
826 my $clone_projection = $feature->project('clone');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
827
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
828 foreach my $seg (@$clone_projection) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
829 my $clone = $seg->to_Slice();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
830 print "Features current coords ", $seg->from_start, '-',
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
831 $seg->from_end, " project onto clone coords " .
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
832 $clone->seq_region_name, ':', $clone->start, '-', $clone->end,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
833 $clone->strand, "\n";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
834 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
835 Description: Returns the results of 'projecting' this feature onto another
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
836 coordinate system. This is useful to see where a feature
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
837 would lie in a coordinate system in which it
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
838 crosses a boundary.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
839
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
840 This method returns a reference to a list of
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
841 Bio::EnsEMBL::ProjectionSegment objects.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
842 ProjectionSegments are blessed arrays and can also be used as
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
843 triplets [from_start,from_end,to_Slice]. The from_start and
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
844 from_end are the coordinates relative to the feature start.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
845 For example, if a feature is current 100-200bp on a slice
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
846 then the triplets returned might be:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
847 [1,50,$slice1],
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
848 [51,101,$slice2]
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
849
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
850 The to_Slice is a slice spanning the region on the requested
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
851 coordinate system that this feature projected to.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
852
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
853 If the feature projects entirely into a gap then a reference to
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
854 an empty list is returned.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
855
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
856 Returntype : listref of Bio::EnsEMBL::ProjectionSegments
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
857 which can also be used as [$start,$end,$slice] triplets
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
858 Exceptions : slice does not have an adaptor
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
859 Caller : general
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
860 Status : Stable
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
861
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
862 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
863
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
864 sub project {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
865 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
866 my $cs_name = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
867 my $cs_version = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
868
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
869 my $slice = $self->{'slice'};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
870
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
871 if(!$slice) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
872 warning("Feature cannot be projected without attached slice.");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
873 return [];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
874 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
875
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
876
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
877 #get an adaptor from the attached slice because this feature may not yet
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
878 #be stored and may not have its own adaptor
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
879 my $slice_adaptor = $slice->adaptor();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
880
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
881 if(!$slice_adaptor) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
882 throw("Cannot project feature because associated slice does not have an " .
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
883 " adaptor");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
884 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
885
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
886 my $strand = $self->strand() * $slice->strand();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
887 #fetch by feature always gives back forward strand slice:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
888 $slice = $slice_adaptor->fetch_by_Feature($self);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
889 $slice = $slice->invert if($strand == -1);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
890 return $slice->project($cs_name, $cs_version);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
891 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
892
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
893
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
894
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
895 =head2 seqname
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
896
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
897 Arg [1] : (optional) $seqname
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
898 Example : $seqname = $feat->seqname();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
899 Description: Getter/Setter for the name of the sequence that this feature
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
900 is on. Normally you can get away with not setting this value
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
901 and it will default to the name of the slice on which this
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
902 feature is on. It is useful to set this value on features which
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
903 do not ordinarily sit on features such as ProteinFeatures which
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
904 sit on peptides.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
905 Returntype : string
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
906 Exceptions : none
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
907 Caller : general
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
908 Status : Stable
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
909
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
910 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
911
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
912 sub seqname {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
913 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
914
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
915 if(@_) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
916 $self->{'seqname'} = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
917 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
918
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
919 if(!$self->{'seqname'} && $self->slice()) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
920 return $self->slice->name();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
921 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
922
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
923 return $self->{'seqname'};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
924 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
925
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
926
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
927
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
928
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
929 =head2 display_id
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
930
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
931 Arg [1] : none
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
932 Example : print $f->display_id();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
933 Description: This method returns a string that is considered to be
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
934 the 'display' identifier. It is overridden by subclasses to
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
935 return an appropriate value for objects of that particular
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
936 class. If no appropriate display id is available an empty
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
937 string is returned instead.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
938 Returntype : string
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
939 Exceptions : none
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
940 Caller : web drawing code
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
941 Status : Stable
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
942
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
943 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
944
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
945 sub display_id {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
946 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
947 return '';
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
948 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
949
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
950
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
951 =head2 feature_Slice
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
952
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
953 Args : none
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
954 Example : $slice = $feature->feature_Slice()
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
955 Description: This is a convenience method to return a slice that covers the
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
956 Area of this feature. The feature start will be at 1 on it, and
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
957 it will have the length of this feature.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
958 Returntype : Bio::EnsEMBL::Slice or undef if this feature has no attached
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
959 Slice.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
960 Exceptions : warning if Feature does not have attached slice.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
961 Caller : web drawing code
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
962 Status : Stable
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
963
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
964 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
965
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
966 sub feature_Slice {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
967 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
968
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
969 my $slice = $self->slice();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
970
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
971 if(!$slice) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
972 warning('Cannot obtain Feature_Slice for feature without attached slice');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
973 return undef;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
974 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
975
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
976 if($slice->isa("Bio::EnsEMBL::StrainSlice")){
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
977 return Bio::EnsEMBL::StrainSlice->new
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
978 (-seq_region_name => $slice->seq_region_name,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
979 -seq_region_length => $slice->seq_region_length,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
980 -coord_system => $slice->coord_system,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
981 -start => $self->seq_region_start(),
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
982 -end => $self->seq_region_end(),
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
983 -strand => $self->seq_region_strand(),
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
984 -adaptor => $slice->adaptor(),
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
985 -strain_name => $slice->strain_name());
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
986 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
987 else{
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
988 return Bio::EnsEMBL::Slice->new
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
989 (-seq_region_name => $slice->seq_region_name,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
990 -seq_region_length => $slice->seq_region_length,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
991 -coord_system => $slice->coord_system,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
992 -start => $self->seq_region_start(),
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
993 -end => $self->seq_region_end(),
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
994 -strand => $self->seq_region_strand(),
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
995 -adaptor => $slice->adaptor());
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
996 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
997 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
998
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
999
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1000 =head2 seq_region_name
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1001
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1002 Arg [1] : none
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1003 Example : print $feature->seq_region_name();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1004 Description: Gets the name of the seq_region which this feature is on.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1005 Returns undef if this Feature is not on a slice.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1006 Returntype : string or undef
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1007 Exceptions : none
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1008 Caller : general
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1009 Status : Stable
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1010
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1011 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1012
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1013 sub seq_region_name {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1014 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1015 my $slice = $self->{'slice'};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1016
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1017 return ($slice) ? $slice->seq_region_name() : undef;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1018 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1019
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1020
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1021 =head2 seq_region_length
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1022
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1023 Arg [1] : none
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1024 Example : print $feature->seq_region_length();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1025 Description: Returns the length of the seq_region which this feature is on
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1026 Returns undef if this Feature is not on a slice.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1027 Returntype : int (unsigned) or undef
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1028 Exceptions : none
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1029 Caller : general
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1030 Status : Stable
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1031
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1032 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1033
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1034
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1035 sub seq_region_length {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1036 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1037 my $slice = $self->{'slice'};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1038
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1039 return ($slice) ? $slice->seq_region_length() : undef;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1040 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1041
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1042
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1043 =head2 seq_region_strand
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1044
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1045 Arg [1] : none
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1046 Example : print $feature->seq_region_strand();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1047 Description: Returns the strand of the seq_region which this feature is on
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1048 (i.e. feature_strand * slice_strand)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1049 Returns undef if this Feature is not on a slice.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1050 Returntype : 1,0,-1 or undef
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1051 Exceptions : none
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1052 Caller : general
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1053 Status : Stable
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1054
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1055 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1056
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1057
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1058 sub seq_region_strand {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1059 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1060 my $slice = $self->{'slice'};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1061
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1062 return ($slice) ? $slice->strand() * $self->{'strand'} : undef;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1063 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1064
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1065
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1066 =head2 seq_region_start
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1067
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1068 Arg [1] : none
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1069 Example : print $feature->seq_region_start();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1070 Description: Convenience method which returns the absolute start of this
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1071 feature on the seq_region, as opposed to the relative (slice)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1072 position.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1073
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1074 Returns undef if this feature is not on a slice.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1075 Returntype : int or undef
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1076 Exceptions : none
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1077 Caller : general
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1078 Status : Stable
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1079
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1080 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1081
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1082 sub seq_region_start {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1083 my ($self) = @_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1084
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1085 my $slice = $self->slice();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1086
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1087 if ( defined($slice) ) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1088 my $start;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1089
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1090 if ( $slice->strand() == 1 ) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1091 if ( defined( $self->start() ) ) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1092 if ($self->start < 0 && $slice->is_circular) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1093 $start = $slice->seq_region_length + $self->start;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1094 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1095 $start = $slice->start() + $self->start() - 1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1096 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1097 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1098 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1099 if ( defined( $self->end() ) ) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1100 $start = $slice->end() - $self->end() + 1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1101 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1102 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1103
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1104 if ( defined($start)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1105 && $slice->is_circular()
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1106 && $start > $slice->seq_region_length() )
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1107 {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1108 $start -= $slice->seq_region_length();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1109 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1110
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1111 return $start;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1112 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1113
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1114 return undef;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1115 } ## end sub seq_region_start
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1116
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1117
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1118 =head2 seq_region_end
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1119
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1120 Arg [1] : none
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1121 Example : print $feature->seq_region_end();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1122 Description: Convenience method which returns the absolute end of this
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1123 feature on the seq_region, as opposed to the relative (slice)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1124 position.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1125
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1126 Returns undef if this feature is not on a slice.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1127 Returntype : int or undef
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1128 Exceptions : none
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1129 Caller : general
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1130 Status : Stable
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1131
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1132 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1133
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1134 sub seq_region_end {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1135 my ($self) = @_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1136
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1137 my $slice = $self->slice();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1138
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1139 if ( defined($slice) ) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1140 my $end;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1141
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1142 if ( $slice->strand() == 1 ) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1143 if ( defined( $self->end() ) ) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1144 $end = $slice->start() + $self->end() - 1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1145 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1146 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1147 if ( defined( $self->start() ) ) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1148 $end = $slice->end() - $self->start() + 1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1149 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1150 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1151
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1152 if ( defined($end)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1153 && $slice->is_circular()
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1154 && $end > $slice->seq_region_length() )
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1155 {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1156 $end -= $slice->seq_region_length();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1157 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1158
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1159 return $end;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1160 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1161
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1162 return undef;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1163 } ## end sub seq_region_end
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1164
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1165
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1166 =head2 coord_system_name
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1167
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1168 Arg [1] : none
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1169 Example : print $feature->coord_system_name()
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1170 Description: Gets the name of the coord_system which this feature is on.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1171 Returns undef if this Feature is not on a slice.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1172 Returntype : string or undef
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1173 Exceptions : none
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1174 Caller : general
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1175 Status : Stable
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1176
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1177 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1178
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1179 sub coord_system_name {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1180 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1181 my $slice = $self->{'slice'};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1182 return ($slice) ? $slice->coord_system_name() : undef;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1183 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1184
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1185
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1186 =head2 seq
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1187
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1188 Args : none
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1189 Example : my $dna_sequence = $simple_feature->seq();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1190 Description: Returns the dna sequence from the attached slice and
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1191 attached database that overlaps with this feature.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1192 Returns undef if there is no slice or no database.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1193 Returns undef if this feature is unstranded (i.e. strand=0).
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1194 Returntype : undef or string
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1195 Exceptions : warning if this feature is not stranded
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1196 Caller : general
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1197 Status : Stable
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1198
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1199 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1200
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1201
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1202 sub seq {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1203 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1204
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1205 if( ! defined $self->{'slice'} ) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1206 return undef;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1207 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1208
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1209 if(!$self->strand()) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1210 warning("Cannot retrieve sequence for unstranded feature.");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1211 return undef;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1212 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1213
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1214 return $self->{'slice'}->subseq($self->start(), $self->end(),
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1215 $self->strand());
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1216
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1217 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1218
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1219
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1220
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1221
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1222 =head2 get_all_alt_locations
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1223
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1224 Arg [1] : none
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1225 Example : @features = @{$feature->get_all_alt_locations()};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1226 foreach $f (@features) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1227 print $f->slice->seq_region_name,' ',$f->start, $f->end,"\n";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1228 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1229
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1230 Description: Retrieves shallow copies of this feature in its alternate
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1231 locations. A feature can be considered to have multiple
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1232 locations when it sits on a alternative structural haplotype
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1233 or when it is on a pseudo autosomal region. Most features will
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1234 just return a reference to an empty list though.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1235 The features returned by this method will be on a slice which
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1236 covers the entire alternate region.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1237
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1238 Currently this method does not take into account alternate
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1239 locations on the alternate locations (e.g. a reference
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1240 sequence may have multiple alternate haplotypes. Asking
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1241 for alternate locations of a feature on one of the alternate
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1242 haplotypes will give you back the reference location, but not
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1243 locations on the other alternate haplotypes).
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1244
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1245 Returntype : listref of features of the same type of this feature.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1246 Exceptions : none
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1247 Caller : general
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1248 Status : Stable
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1249
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1250 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1251
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1252 sub get_all_alt_locations {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1253 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1254 my $return_all = shift || 0;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1255
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1256 my $slice = $self->{'slice'} or return [];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1257 my $sa = $slice->adaptor() or return [];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1258
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1259 # get slice of entire region
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1260 $slice = $sa->fetch_by_seq_region_id($slice->get_seq_region_id);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1261
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1262 my $axfa = $sa->db->get_AssemblyExceptionFeatureAdaptor();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1263 my $axfs = $axfa->fetch_all_by_Slice($slice);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1264
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1265 my (@haps, @alt);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1266
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1267 foreach my $axf (@$axfs) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1268 if(uc($axf->type()) eq 'HAP') {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1269 push @haps, $axf;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1270 } elsif(uc($axf->type()) =~ 'PAR') {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1271 push @alt, $axf;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1272 } elsif( $axf->type() eq "PATCH_FIX"){
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1273 push @haps, $axf;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1274 } elsif( $axf->type() eq "PATCH_FIX REF"){
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1275 push @haps, $axf if $return_all > 0 ;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1276 } elsif( $axf->type() eq "HAP REF" ) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1277 push @haps, $axf if $return_all > 0 ;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1278 # do nothing when you are on REF
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1279 } elsif( $axf->type() eq "PATCH_NOVEL"){
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1280 push @haps, $axf;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1281 }elsif( $axf->type() eq "PATCH_NOVEL REF"){
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1282 push @haps, $axf if $return_all > 0 ;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1283 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1284 warning("Unknown exception feature type ". $axf->type()."- ignoring.");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1285 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1286 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1287
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1288 # regions surrounding hap are those of interest, not hap itself
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1289 # convert hap alt. exc. features to regions around haps instead
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1290 foreach my $h (@haps) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1291 my $haslice = $h->alternate_slice();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1292 my $hacs = $haslice->coord_system();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1293
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1294 if($h->start() > 1 && $haslice->start() > 1) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1295 my $aslice = $sa->fetch_by_region($hacs->name(),
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1296 $haslice->seq_region_name(),
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1297 1,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1298 $haslice->start()-1,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1299 $haslice->strand(),
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1300 $hacs->version());
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1301
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1302 push @alt, Bio::EnsEMBL::AssemblyExceptionFeature->new
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1303 (-start => 1,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1304 -end => $h->start()-1,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1305 -alternate_slice => $aslice);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1306 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1307
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1308 if($h->end() < $slice->seq_region_length() &&
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1309 $haslice->end < $haslice->seq_region_length()) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1310 my $aslice = $sa->fetch_by_region($hacs->name(),
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1311 $haslice->seq_region_name(),
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1312 $haslice->end()+1,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1313 $haslice->seq_region_length(),
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1314 $haslice->strand(),
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1315 $hacs->version());
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1316
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1317 push @alt, Bio::EnsEMBL::AssemblyExceptionFeature->new
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1318 (-start => $h->end() + 1,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1319 -end => $slice->seq_region_length(),
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1320 -alternate_slice => $aslice);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1321 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1322 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1323
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1324
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1325 # check if exception regions contain our feature
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1326
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1327 my @features;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1328
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1329 foreach my $axf (@alt) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1330 # ignore other region if feature is not entirely on it
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1331 next if($self->seq_region_start() < $axf->start() ||
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1332 $self->seq_region_end() > $axf->end());
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1333
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1334 # quick shallow copy of the feature
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1335 my $f;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1336 %$f = %$self;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1337 bless $f, ref($self);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1338
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1339 my $aslice = $axf->alternate_slice();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1340
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1341 # position feature on entire slice of other region
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1342 $f->{'start'} = $f->seq_region_start() - $axf->start() + $aslice->start();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1343 $f->{'end'} = $f->seq_region_end() - $axf->start() + $aslice->start();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1344 $f->{'strand'} *= $aslice->strand();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1345
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1346 $f->{'slice'} = $sa->fetch_by_seq_region_id($aslice->get_seq_region_id());
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1347
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1348 push @features, $f;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1349 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1350
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1351 return \@features;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1352 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1353
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1354
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1355 =head2 overlaps
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1356
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1357 Arg [1] : Bio::EnsEMBL::Feature $f
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1358 The other feature you want to check overlap with this feature
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1359 for.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1360 Description: This method does a range comparison of this features start and
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1361 end and compares it with another features start and end. It will
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1362 return true if these ranges overlap and the features are on the
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1363 same seq_region.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1364 Returntype : TRUE if features overlap, FALSE if they don't
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1365 Exceptions : warning if features are on different seq_regions
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1366 Caller : general
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1367 Status : Stable
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1368
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1369 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1370
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1371 sub overlaps {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1372 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1373 my $f = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1374
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1375 my $sr1_name = $self->seq_region_name;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1376 my $sr2_name = $f->seq_region_name;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1377
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1378 if ($sr1_name and $sr2_name and ($sr1_name ne $sr2_name)) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1379 warning("Bio::EnsEMBL::Feature->overlaps(): features are on different seq regions.");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1380 return undef;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1381 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1382
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1383 return ($self->seq_region_end >= $f->seq_region_start and $self->seq_region_start <= $f->seq_region_end);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1384 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1385
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1386
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1387 =head2 get_overlapping_Genes
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1388
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1389 Description: Get all the genes that overlap this feature.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1390 Returntype : list ref of Bio::EnsEMBL::Gene
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1391 Caller : general
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1392 Status : UnStable
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1393
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1394 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1395
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1396 sub get_overlapping_Genes{
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1397 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1398
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1399 my $slice = $self->feature_Slice;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1400 return $slice->get_all_Genes();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1401 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1402
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1403 # query for absolute nearest.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1404 # select x.display_label, g.gene_id, g.seq_region_start, ABS(cast((32921638 - g.seq_region_end) as signed)) as 'dist' from gene g, xref x where g.display_xref_id = x.xref_id and seq_region_id = 27513 order by ABS(cast((32921638 - g.seq_region_end) as signed)) limit 10;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1405
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1406 =head2 get_nearest_Gene
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1407
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1408 Description: Get all the nearest gene to the feature
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1409 Returntype : Bio::EnsEMBL::Gene
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1410 Caller : general
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1411 Status : UnStable
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1412
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1413 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1414
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1415 sub get_nearest_Gene {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1416 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1417 my $stranded = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1418 my $stream = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1419
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1420 my $ga = Bio::EnsEMBL::Registry->get_adaptor($self->adaptor->db->species,"core","Gene");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1421
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1422 return $ga->fetch_nearest_Gene_by_Feature($self, $stranded, $stream);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1423
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1424 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1425
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1426 =head2 summary_as_hash
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1427
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1428 Example : $feature_summary = $feature->summary_as_hash();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1429 Description : Retrieves a textual summary of this Feature.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1430 Should be overidden by subclasses for specific tweaking
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1431 Returns : hashref of arrays of descriptive strings
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1432 Status : Intended for internal use
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1433 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1434
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1435 sub summary_as_hash {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1436 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1437 my %summary;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1438 $summary{'ID'} = $self->display_id;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1439 $summary{'start'} = $self->seq_region_start;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1440 $summary{'end'} = $self->seq_region_end;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1441 $summary{'strand'} = $self->strand;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1442 $summary{'seq_region_name'} = $self->seq_region_name;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1443 return \%summary;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1444 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1445
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1446 =head2 species
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1447
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1448 Example : $feature->species();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1449 Description : Shortcut to the feature's DBAdaptor and returns its species name
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1450 Returntype : String the species name
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1451 Exceptions : Thrown if there is no attached adaptor
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1452 Caller : Webcode
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1453
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1454 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1455
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1456 sub species {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1457 my ($self) = @_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1458 throw "Can only call this method if you have attached an adaptor" if ! $self->adaptor();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1459 return $self->adaptor()->db()->species();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1460 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1461
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1462
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1463 ##############################################
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1464 # Methods included for backwards compatibility
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1465 ##############################################
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1466
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1467
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1468 =head2 contig
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1469
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1470 This method is deprecated and included for backwards compatibility only.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1471 Use slice() instead
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1472 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1473 sub contig {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1474 deprecate('Use slice() instead');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1475 slice(@_);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1476 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1477
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1478
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1479
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1480 =head2 sub_SeqFeature
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1481
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1482 This method is deprecated and only for genebuild backwards compatibility.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1483 Avoid using it if possible
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1484 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1485 sub sub_SeqFeature{
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1486 my ($self) = @_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1487 return @{$self->{'_gsf_sub_array'}} if($self->{'_gsf_sub_array'});
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1488 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1489
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1490 =head2 add_sub_SeqFeature
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1491
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1492 This method is deprecated and only for genebuild backwards compatibility.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1493 Avoid using it if possible
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1494 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1495 sub add_sub_SeqFeature{
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1496 my ($self,$feat,$expand) = @_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1497 my ($p, $f, $l) = caller;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1498 if( $expand eq 'EXPAND' ) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1499 # if this doesn't have start/end set - forget it!
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1500 if( ! $self->start && ! $self->end ) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1501
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1502 $self->start($feat->start());
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1503 $self->end($feat->end());
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1504 $self->strand($feat->strand);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1505 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1506 if( $feat->start < $self->start ) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1507 $self->start($feat->start);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1508 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1509
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1510 if( $feat->end > $self->end ) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1511 $self->end($feat->end);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1512 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1513 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1514 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1515 if($self->start > $feat->start || $self->end < $feat->end) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1516 throw("$feat is not contained within parent feature, " .
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1517 "and expansion is not valid");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1518 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1519 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1520
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1521 push(@{$self->{'_gsf_sub_array'}},$feat);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1522 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1523
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1524 =head2 flush_sub_SeqFeature
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1525
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1526 This method is deprecated and only for genebuild backwards compatibility.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1527 Avoid using it isf possible
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1528 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1529 sub flush_sub_SeqFeature {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1530 my ($self) = @_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1531 $self->{'_gsf_sub_array'} = [];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1532 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1533
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1534
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1535 sub _deprecated_transform {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1536 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1537 my $arg = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1538
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1539 if(!$arg) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1540 warning("Calling transform() with no arguments is deprecated.\n".
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1541 "A coordinate system name argument should be used instead.\n".
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1542 "You probably wanted transform('seqlevel') or transform('contig').");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1543 return $self->transform('seqlevel');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1544 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1545
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1546 if(ref($arg) eq 'Bio::EnsEMBL::Slice') {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1547 if($arg->{'empty'}) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1548 warning("Calling transform with an empty slice is deprecated.\n" .
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1549 "A coordinate system name argument should be used instead.\n".
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1550 "You probably wanted transform('chromosome') or " .
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1551 "transform('toplevel')");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1552 return $self->transform('toplevel');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1553 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1554 warning("Calling transform with a slice is deprecated.\n" .
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1555 "Use the transfer method instead");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1556 return $self->transfer($arg);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1557 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1558
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1559 warning("Calling transform with a [".ref($arg)."] arg is no longer " .
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1560 "(or never was) supported. Doing nothing instead.");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1561
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1562 return $self;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1563 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1564
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1565
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1566 =head2 id
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1567
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1568 This method is deprecated and only included for backwards compatibility.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1569 Use display_id, hseqname, dbID or stable_id instead
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1570
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1571 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1572
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1573 sub id {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1574 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1575 deprecate("id method is not used - use display_id instead");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1576 return $self->{'stable_id'} if($self->{'stable_id'});
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1577 return $self->{'hseqname'} if($self->{'hseqname'});
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1578 return $self->{'seqname'} if($self->{'seqname'});
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1579 return $self->{'dbID'};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1580 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1581
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1582 1;