annotate variant_effect_predictor/Bio/RangeI.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 # $Id: RangeI.pm,v 1.30 2002/11/05 02:55:12 lapp Exp $
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
2 #
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
3 # BioPerl module for Bio::RangeI
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
4 #
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
5 # Cared for by Lehvaslaiho <heikki@ebi.ac.uk>
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
6 #
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
7 # Copyright Matthew Pocock
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
8 #
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
9 # You may distribute this module under the same terms as perl itself
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
10 #
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
11 # POD documentation - main docs before the code
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
12
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
13 =head1 NAME
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
14
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
15 Bio::RangeI - Range interface
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
16
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
17 =head1 SYNOPSIS
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
18
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
19 #Do not run this module directly
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
20
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
21 =head1 DESCRIPTION
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
22
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
23 This provides a standard BioPerl range interface that should be
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
24 implemented by any object that wants to be treated as a range. This
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
25 serves purely as an abstract base class for implementers and can not
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
26 be instantiated.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
27
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
28 Ranges are modeled as having (start, end, length, strand). They use
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
29 Bio-coordinates - all points E<gt>= start and E<lt>= end are within the
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
30 range. End is always greater-than or equal-to start, and length is
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
31 greather than or equal to 1. The behaviour of a range is undefined if
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
32 ranges with negative numbers or zero are used.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
33
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
34 So, in summary:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
35
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
36 length = end - start + 1
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
37 end >= start
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
38 strand = (-1 | 0 | +1)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
39
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
40 =head1 FEEDBACK
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
41
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
42 =head2 Mailing Lists
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
43
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
44 User feedback is an integral part of the evolution of this and other
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
45 Bioperl modules. Send your comments and suggestions preferably to one
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
46 of the Bioperl mailing lists. Your participation is much appreciated.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
47
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
48 bioperl-l@bioperl.org - General discussion
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
49 http://bio.perl.org/MailList.html - About the mailing lists
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
50
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
51 =head2 Reporting Bugs
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
52
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
53 Report bugs to the Bioperl bug tracking system to help us keep track
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
54 the bugs and their resolution. Bug reports can be submitted via email
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
55 or the web:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
56
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
57 bioperl-bugs@bio.perl.org
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
58 http://bugzilla.bioperl.org/
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
59
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
60 =head1 AUTHOR - Heikki Lehvaslaiho
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
61
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
62 Email: heikki@ebi.ac.uk
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
63
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
64 =head1 CONTRIBUTORS
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
65
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
66 Juha Muilu (muilu@ebi.ac.uk)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
67
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
68 =head1 APPENDIX
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
69
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
70 The rest of the documentation details each of the object
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
71 methods. Internal methods are usually preceded with a _
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
72
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
73 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
74
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
75 package Bio::RangeI;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
76
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
77 use strict;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
78 use Carp;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
79 use Bio::Root::RootI;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
80 use vars qw(@ISA);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
81 use integer;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
82 use vars qw( @ISA %STRAND_OPTIONS );
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
83
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
84 @ISA = qw( Bio::Root::RootI );
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
85
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
86 BEGIN {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
87 # STRAND_OPTIONS contains the legal values for the strand options
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
88 %STRAND_OPTIONS = map { $_, '_'.$_ }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
89 (
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
90 'strong', # ranges must have the same strand
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
91 'weak', # ranges must have the same strand or no strand
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
92 'ignore', # ignore strand information
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
93 );
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
94 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
95
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
96 # utility methods
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
97 #
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
98
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
99 # returns true if strands are equal and non-zero
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
100 sub _strong {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
101 my ($r1, $r2) = @_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
102 my ($s1, $s2) = ($r1->strand(), $r2->strand());
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
103
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
104 return 1 if $s1 != 0 && $s1 == $s2;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
105 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
106
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
107 # returns true if strands are equal or either is zero
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
108 sub _weak {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
109 my ($r1, $r2) = @_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
110 my ($s1, $s2) = ($r1->strand(), $r2->strand());
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
111 return 1 if $s1 == 0 || $s2 == 0 || $s1 == $s2;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
112 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
113
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
114 # returns true for any strandedness
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
115 sub _ignore {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
116 return 1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
117 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
118
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
119 # works out what test to use for the strictness and returns true/false
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
120 # e.g. $r1->_testStrand($r2, 'strong')
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
121 sub _testStrand() {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
122 my ($r1, $r2, $comp) = @_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
123 return 1 unless $comp;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
124 my $func = $STRAND_OPTIONS{$comp};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
125 return $r1->$func($r2);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
126 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
127
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
128 =head1 Abstract methods
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
129
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
130 These methods must be implemented in all subclasses.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
131
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
132 =head2 start
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
133
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
134 Title : start
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
135 Usage : $start = $range->start();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
136 Function: get/set the start of this range
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
137 Returns : the start of this range
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
138 Args : optionaly allows the start to be set
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
139 using $range->start($start)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
140
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
141 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
142
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
143 sub start {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
144 shift->throw_not_implemented();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
145 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
146
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
147 =head2 end
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
148
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
149 Title : end
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
150 Usage : $end = $range->end();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
151 Function: get/set the end of this range
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
152 Returns : the end of this range
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
153 Args : optionaly allows the end to be set
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
154 using $range->end($end)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
155
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
156 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
157
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
158 sub end {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
159 shift->throw_not_implemented();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
160 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
161
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
162 =head2 length
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
163
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
164 Title : length
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
165 Usage : $length = $range->length();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
166 Function: get/set the length of this range
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
167 Returns : the length of this range
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
168 Args : optionaly allows the length to be set
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
169 using $range->length($length)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
170
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
171 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
172
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
173 sub length {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
174 shift->throw_not_implemented();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
175 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
176
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
177 =head2 strand
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
178
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
179 Title : strand
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
180 Usage : $strand = $range->strand();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
181 Function: get/set the strand of this range
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
182 Returns : the strandidness (-1, 0, +1)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
183 Args : optionaly allows the strand to be set
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
184 using $range->strand($strand)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
185
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
186 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
187
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
188 sub strand {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
189 shift->throw_not_implemented();
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
190 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
191
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
192 =head1 Boolean Methods
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
193
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
194 These methods return true or false. They throw an error if start and
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
195 end are not defined.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
196
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
197 $range->overlaps($otherRange) && print "Ranges overlap\n";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
198
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
199 =head2 overlaps
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
200
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
201 Title : overlaps
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
202 Usage : if($r1->overlaps($r2)) { do stuff }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
203 Function: tests if $r2 overlaps $r1
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
204 Args : arg #1 = a range to compare this one to (mandatory)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
205 arg #2 = strand option ('strong', 'weak', 'ignore') (optional)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
206 Returns : true if the ranges overlap, false otherwise
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
207
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
208 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
209
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
210 sub overlaps {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
211 my ($self, $other, $so) = @_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
212
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
213 $self->throw("start is undefined") unless defined $self->start;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
214 $self->throw("end is undefined") unless defined $self->end;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
215 $self->throw("not a Bio::RangeI object") unless defined $other &&
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
216 $other->isa('Bio::RangeI');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
217 $other->throw("start is undefined") unless defined $other->start;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
218 $other->throw("end is undefined") unless defined $other->end;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
219
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
220 return
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
221 ($self->_testStrand($other, $so)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
222 and not (
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
223 ($self->start() > $other->end() or
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
224 $self->end() < $other->start() )
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
225 ));
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
226 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
227
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
228 =head2 contains
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
229
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
230 Title : contains
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
231 Usage : if($r1->contains($r2) { do stuff }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
232 Function: tests whether $r1 totally contains $r2
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
233 Args : arg #1 = a range to compare this one to (mandatory)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
234 alternatively, integer scalar to test
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
235 arg #2 = strand option ('strong', 'weak', 'ignore') (optional)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
236 Returns : true if the argument is totaly contained within this range
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
237
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
238 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
239
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
240 sub contains {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
241 my ($self, $other, $so) = @_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
242 $self->throw("start is undefined") unless defined $self->start;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
243 $self->throw("end is undefined") unless defined $self->end;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
244
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
245 if(defined $other && ref $other) { # a range object?
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
246 $other->throw("Not a Bio::RangeI object") unless $other->isa('Bio::RangeI');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
247 $other->throw("start is undefined") unless defined $other->start;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
248 $other->throw("end is undefined") unless defined $other->end;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
249
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
250 return ($self->_testStrand($other, $so) and
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
251 $other->start() >= $self->start() and
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
252 $other->end() <= $self->end());
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
253 } else { # a scalar?
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
254 $self->throw("'$other' is not an integer.\n") unless $other =~ /^[-+]?\d+$/;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
255 return ($other >= $self->start() and $other <= $self->end());
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
256 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
257 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
258
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
259 =head2 equals
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
260
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
261 Title : equals
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
262 Usage : if($r1->equals($r2))
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
263 Function: test whether $r1 has the same start, end, length as $r2
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
264 Args : a range to test for equality
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
265 Returns : true if they are describing the same range
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
266
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
267 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
268
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
269 sub equals {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
270 my ($self, $other, $so) = @_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
271
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
272 $self->throw("start is undefined") unless defined $self->start;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
273 $self->throw("end is undefined") unless defined $self->end;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
274 $other->throw("Not a Bio::RangeI object") unless $other->isa('Bio::RangeI');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
275 $other->throw("start is undefined") unless defined $other->start;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
276 $other->throw("end is undefined") unless defined $other->end;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
277
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
278 return ($self->_testStrand($other, $so) and
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
279 $self->start() == $other->start() and
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
280 $self->end() == $other->end() );
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
281 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
282
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
283 =head1 Geometrical methods
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
284
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
285 These methods do things to the geometry of ranges, and return
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
286 Bio::RangeI compliant objects or triplets (start, stop, strand) from
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
287 which new ranges could be built.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
288
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
289
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
290 =head2 intersection
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
291
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
292 Title : intersection
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
293 Usage : ($start, $stop, $strand) = $r1->intersection($r2)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
294 Function: gives the range that is contained by both ranges
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
295 Args : arg #1 = a range to compare this one to (mandatory)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
296 arg #2 = strand option ('strong', 'weak', 'ignore') (optional)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
297 Returns : undef if they do not overlap,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
298 or the range that they do overlap
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
299 (in an objectlike the calling one)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
300
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
301 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
302
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
303 sub intersection {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
304 my ($self, $other, $so) = @_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
305 return unless $self->_testStrand($other, $so);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
306
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
307 $self->throw("start is undefined") unless defined $self->start;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
308 $self->throw("end is undefined") unless defined $self->end;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
309 $other->throw("Not a Bio::RangeI object") unless $other->isa('Bio::RangeI');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
310 $other->throw("start is undefined") unless defined $other->start;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
311 $other->throw("end is undefined") unless defined $other->end;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
312
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
313 my @start = sort {$a<=>$b}
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
314 ($self->start(), $other->start());
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
315 my @end = sort {$a<=>$b}
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
316 ($self->end(), $other->end());
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
317
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
318 my $start = pop @start;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
319 my $end = shift @end;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
320
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
321 my $union_strand; # Strand for the union range object.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
322
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
323 if($self->strand == $other->strand) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
324 $union_strand = $other->strand;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
325 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
326 $union_strand = 0;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
327 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
328
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
329 if($start > $end) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
330 return undef;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
331 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
332 return $self->new('-start' => $start,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
333 '-end' => $end,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
334 '-strand' => $union_strand
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
335 );
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
336 #return ($start, $end, $union_strand);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
337 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
338 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
339
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
340 =head2 union
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
341
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
342 Title : union
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
343 Usage : ($start, $stop, $strand) = $r1->union($r2);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
344 : ($start, $stop, $strand) = Bio::RangeI->union(@ranges);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
345 my $newrange = Bio::RangeI->union(@ranges);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
346 Function: finds the minimal range that contains all of the ranges
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
347 Args : a range or list of ranges to find the union of
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
348 Returns : the range object containing all of the ranges
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
349
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
350 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
351
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
352 sub union {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
353 my $self = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
354 my @ranges = @_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
355 if(ref $self) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
356 unshift @ranges, $self;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
357 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
358
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
359 my @start = sort {$a<=>$b}
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
360 map( { $_->start() } @ranges);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
361 my @end = sort {$a<=>$b}
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
362 map( { $_->end() } @ranges);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
363
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
364 my $start = shift @start;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
365 while( !defined $start ) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
366 $start = shift @start;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
367 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
368
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
369 my $end = pop @end;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
370
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
371 my $union_strand; # Strand for the union range object.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
372
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
373 foreach(@ranges) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
374 if(! defined $union_strand) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
375 $union_strand = $_->strand;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
376 next;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
377 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
378 if($union_strand ne $_->strand) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
379 $union_strand = 0;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
380 last;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
381 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
382 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
383 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
384 return undef unless $start or $end;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
385 if( wantarray() ) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
386 return ( $start,$end,$union_strand);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
387 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
388 return $self->new('-start' => $start,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
389 '-end' => $end,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
390 '-strand' => $union_strand
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
391 );
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
392 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
393 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
394
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
395 =head2 overlap_extent
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
396
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
397 Title : overlap_extent
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
398 Usage : ($a_unique,$common,$b_unique) = $a->overlap_extent($b)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
399 Function: Provides actual amount of overlap between two different
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
400 ranges.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
401 Example :
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
402 Returns : array of values for
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
403 - the amount unique to a
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
404 - the amount common to both
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
405 - the amount unique to b
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
406 Args : a range
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
407
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
408
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
409 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
410
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
411 sub overlap_extent{
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
412 my ($a,$b) = @_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
413
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
414 $a->throw("start is undefined") unless defined $a->start;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
415 $a->throw("end is undefined") unless defined $a->end;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
416 $b->throw("Not a Bio::RangeI object") unless $b->isa('Bio::RangeI');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
417 $b->throw("start is undefined") unless defined $b->start;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
418 $b->throw("end is undefined") unless defined $b->end;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
419
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
420 my ($au,$bu,$is,$ie);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
421 if( ! $a->overlaps($b) ) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
422 return ($a->length,0,$b->length);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
423 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
424
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
425 if( $a->start < $b->start ) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
426 $au = $b->start - $a->start;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
427 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
428 $bu = $a->start - $b->start;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
429 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
430
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
431 if( $a->end > $b->end ) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
432 $au += $a->end - $b->end;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
433 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
434 $bu += $b->end - $a->end;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
435 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
436 my $intersect = $a->intersection($b);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
437 $ie = $intersect->end;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
438 $is = $intersect->start;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
439
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
440 return ($au,$ie-$is+1,$bu);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
441 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
442
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
443 1;