annotate variant_effect_predictor/Bio/RangeI.pm @ 3:d30fa12e4cc5 default tip

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