annotate variant_effect_predictor/Bio/Location/Split.pm @ 0:21066c0abaf5 draft

Uploaded
author willmclaren
date Fri, 03 Aug 2012 10:04:48 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1 # $Id: Split.pm,v 1.35 2002/12/28 03:26:32 lapp Exp $
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
3 # BioPerl module for Bio::Location::SplitLocation
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
4 # Cared for by Jason Stajich <jason@bioperl.org>
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
5 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
6 # Copyright Jason Stajich
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
7 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
8 # You may distribute this module under the same terms as perl itself
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
9 # POD documentation - main docs before the code
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
10
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
11 =head1 NAME
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
12
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
13 Bio::Location::Split - Implementation of a Location on a Sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
14 which has multiple locations (start/end points)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
15
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
16 =head1 SYNOPSIS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
17
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
18 use Bio::Location::Split;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
19
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
20 my $splitlocation = new Bio::Location::Split();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
21 $splitlocation->add_sub_Location(new Bio::Location::Simple(-start=>1,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
22 -end=>30,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
23 -strand=>1));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
24 $splitlocation->add_sub_Location(new Bio::Location::Simple(-start=>50,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
25 -end=>61,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
26 -strand=>1));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
27 my @sublocs = $splitlocation->sub_Location();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
28
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
29 my $count = 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
30 # print the start/end points of the sub locations
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
31 foreach my $location ( sort { $a->start <=> $b->start }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
32 @sublocs ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
33 printf "sub feature %d [%d..%d]\n",
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
34 $count, $location->start,$location->end, "\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
35 $count++;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
36 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
37
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
38 =head1 DESCRIPTION
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
39
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
40 This implementation handles locations which span more than one
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
41 start/end location, or and/or lie on different sequences.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
42
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
43 =head1 FEEDBACK
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
44
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
45 User feedback is an integral part of the evolution of this and other
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
46 Bioperl modules. Send your comments and suggestions preferably to one
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
47 of the Bioperl mailing lists. Your participation is much appreciated.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
48
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
49 bioperl-l@bioperl.org - General discussion
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
50 http://bio.perl.org/MailList.html - About the mailing lists
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
51
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
52 =head2 Reporting Bugs
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
53
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
54 Report bugs to the Bioperl bug tracking system to help us keep track
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
55 the bugs and their resolution. Bug reports can be submitted via email
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
56 or the web:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
57
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
58 bioperl-bugs@bio.perl.org
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
59 http://bugzilla.bioperl.org/
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
60
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
61 =head1 AUTHOR - Jason Stajich
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
62
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
63 Email jason@bioperl.org
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
64
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
65 =head1 APPENDIX
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
66
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
67 The rest of the documentation details each of the object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
68 methods. Internal methods are usually preceded with a _
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
69
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
70 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
71
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
72 # Let the code begin...
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
73
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
74
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
75 package Bio::Location::Split;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
76 use vars qw(@ISA @CORBALOCATIONOPERATOR);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
77 use strict;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
78
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
79 use Bio::Root::Root;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
80 use Bio::Location::SplitLocationI;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
81 use Bio::Location::Atomic;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
82
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
83 @ISA = qw(Bio::Location::Atomic Bio::Location::SplitLocationI );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
84
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
85 BEGIN {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
86 # as defined by BSANE 0.03
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
87 @CORBALOCATIONOPERATOR= ('NONE','JOIN', undef, 'ORDER');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
88 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
89
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
90 sub new {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
91 my ($class, @args) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
92 my $self = $class->SUPER::new(@args);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
93 # initialize
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
94 $self->{'_sublocations'} = [];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
95 my ( $type, $seqid, $locations ) =
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
96 $self->_rearrange([qw(SPLITTYPE
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
97 SEQ_ID
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
98 LOCATIONS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
99 )], @args);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
100 if( defined $locations && ref($locations) =~ /array/i ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
101 $self->add_sub_Location(@$locations);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
102 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
103 $seqid && $self->seq_id($seqid);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
104 $type = lc ($type);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
105 $self->splittype($type || 'JOIN');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
106 return $self;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
107 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
108
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
109 =head2 each_Location
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
110
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
111 Title : each_Location
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
112 Usage : @locations = $locObject->each_Location($order);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
113 Function: Conserved function call across Location:: modules - will
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
114 return an array containing the component Location(s) in
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
115 that object, regardless if the calling object is itself a
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
116 single location or one containing sublocations.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
117 Returns : an array of Bio::LocationI implementing objects
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
118 Args : Optional sort order to be passed to sub_Location()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
119
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
120 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
121
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
122 sub each_Location {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
123 my ($self, $order) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
124 my @locs = ();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
125 foreach my $subloc ($self->sub_Location($order)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
126 # Recursively check to get hierarchical split locations:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
127 push @locs, $subloc->each_Location($order);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
128 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
129 return @locs;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
130 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
131
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
132 =head2 sub_Location
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
133
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
134 Title : sub_Location
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
135 Usage : @sublocs = $splitloc->sub_Location();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
136 Function: Returns the array of sublocations making up this compound (split)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
137 location. Those sublocations referring to the same sequence as
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
138 the root split location will be sorted by start position (forward
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
139 sort) or end position (reverse sort) and come first (before
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
140 those on other sequences).
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
141
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
142 The sort order can be optionally specified or suppressed by the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
143 value of the first argument. The default is no sort.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
144
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
145 Returns : an array of Bio::LocationI implementing objects
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
146 Args : Optionally 1, 0, or -1 for specifying a forward, no, or reverse
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
147 sort order
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
148
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
149 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
150
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
151 sub sub_Location {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
152 my ($self, $order) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
153 $order = 0 unless defined $order;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
154 if( defined($order) && ($order !~ /^-?\d+$/) ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
155 $self->throw("value $order passed in to sub_Location is $order, an invalid value");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
156 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
157 $order = 1 if($order > 1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
158 $order = -1 if($order < -1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
159
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
160 my @sublocs = defined $self->{'_sublocations'} ? @{$self->{'_sublocations'}} : ();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
161
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
162 # return the array if no ordering requested
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
163 return @sublocs if( ($order == 0) || (! @sublocs) );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
164
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
165 # sort those locations that are on the same sequence as the top (`master')
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
166 # if the top seq is undefined, we take the first defined in a sublocation
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
167 my $seqid = $self->seq_id();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
168 my $i = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
169 while((! defined($seqid)) && ($i <= $#sublocs)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
170 $seqid = $sublocs[$i++]->seq_id();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
171 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
172 if((! $self->seq_id()) && $seqid) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
173 $self->warn("sorted sublocation array requested but ".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
174 "root location doesn't define seq_id ".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
175 "(at least one sublocation does!)");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
176 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
177 my @locs = ($seqid ?
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
178 grep { $_->seq_id() eq $seqid; } @sublocs :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
179 @sublocs);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
180 if(@locs) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
181 if($order == 1) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
182 # Schwartzian transforms for performance boost
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
183 @locs = map { $_->[0] }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
184 sort { (defined $a && defined $b) ?
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
185 $a->[1] <=> $b->[1] : $a ? -1 : 1 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
186 map { [$_, $_->start] } @locs;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
187
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
188 } else { # $order == -1
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
189 @locs = map {$_->[0]}
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
190 sort {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
191 (defined $a && defined $b) ?
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
192 $b->[1] <=> $a->[1] : $a ? -1 : 1 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
193 map { [$_, $_->end] } @locs;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
194 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
195 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
196 # push the rest unsorted
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
197 if($seqid) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
198 push(@locs, grep { $_->seq_id() ne $seqid; } @sublocs);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
199 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
200 # done!
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
201 return @locs;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
202 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
203
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
204 =head2 add_sub_Location
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
205
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
206 Title : add_sub_Location
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
207 Usage : $splitloc->add_sub_Location(@locationIobjs);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
208 Function: add an additional sublocation
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
209 Returns : number of current sub locations
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
210 Args : list of Bio::LocationI implementing object(s) to add
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
211
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
212 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
213
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
214 sub add_sub_Location {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
215 my ($self,@args) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
216 my @locs;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
217 foreach my $loc ( @args ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
218 if( !ref($loc) || ! $loc->isa('Bio::LocationI') ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
219 $self->throw("Trying to add $loc as a sub Location but it doesn't implement Bio::LocationI!");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
220 next;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
221 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
222 push @{$self->{'_sublocations'}}, $loc;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
223 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
224
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
225 return scalar @{$self->{'_sublocations'}};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
226 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
227
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
228 =head2 splittype
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
229
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
230 Title : splittype
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
231 Usage : $splittype = $fuzzy->splittype();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
232 Function: get/set the split splittype
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
233 Returns : the splittype of split feature (join, order)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
234 Args : splittype to set
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
235
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
236 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
237
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
238 sub splittype {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
239 my ($self, $value) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
240 if( defined $value || ! defined $self->{'_splittype'} ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
241 $value = 'JOIN' unless( defined $value );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
242 $self->{'_splittype'} = uc ($value);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
243 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
244 return $self->{'_splittype'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
245 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
246
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
247 =head2 is_single_sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
248
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
249 Title : is_single_sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
250 Usage : if($splitloc->is_single_sequence()) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
251 print "Location object $splitloc is split ".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
252 "but only across a single sequence\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
253 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
254 Function: Determine whether this location is split across a single or
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
255 multiple sequences.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
256
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
257 This implementation ignores (sub-)locations that do not define
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
258 seq_id(). The same holds true for the root location.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
259
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
260 Returns : TRUE if all sublocations lie on the same sequence as the root
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
261 location (feature), and FALSE otherwise.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
262 Args : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
263
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
264 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
265
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
266 sub is_single_sequence {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
267 my ($self) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
268
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
269 my $seqid = $self->seq_id();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
270 foreach my $loc ($self->sub_Location(0)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
271 $seqid = $loc->seq_id() if(! $seqid);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
272 if(defined($loc->seq_id()) && ($loc->seq_id() ne $seqid)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
273 return 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
274 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
275 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
276 return 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
277 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
278
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
279 =head1 LocationI methods
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
280
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
281 =head2 strand
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
282
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
283 Title : strand
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
284 Usage : $obj->strand($newval)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
285 Function: For SplitLocations, setting the strand of the container
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
286 (this object) is a short-cut for setting the strand of all
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
287 sublocations.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
288
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
289 In get-mode, checks if no sub-location is remote, and if
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
290 all have the same strand. If so, it returns that shared
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
291 strand value. Otherwise it returns undef.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
292
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
293 Example :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
294 Returns : on get, value of strand if identical between sublocations
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
295 (-1, 1, or undef)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
296 Args : new value (-1 or 1, optional)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
297
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
298
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
299 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
300
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
301 sub strand{
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
302 my ($self,$value) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
303 if( defined $value) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
304 $self->{'strand'} = $value;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
305 # propagate to all sublocs
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
306 foreach my $loc ($self->sub_Location(0)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
307 $loc->strand($value) if ! $loc->is_remote();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
308 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
309 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
310 my ($strand, $lstrand);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
311 foreach my $loc ($self->sub_Location(0)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
312 # we give up upon any location that's remote or doesn't have
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
313 # the strand specified, or has a differing one set than
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
314 # previously seen.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
315 # calling strand() is potentially expensive if the subloc is also
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
316 # a split location, so we cache it
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
317 $lstrand = $loc->strand();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
318 if((! $lstrand) ||
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
319 ($strand && ($strand != $lstrand)) ||
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
320 $loc->is_remote()) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
321 $strand = undef;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
322 last;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
323 } elsif(! $strand) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
324 $strand = $lstrand;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
325 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
326 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
327 return $strand;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
328 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
329 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
330
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
331 =head2 start
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
332
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
333 Title : start
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
334 Usage : $start = $location->start();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
335 Function: get the starting point of the first (sorted) sublocation
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
336 Returns : integer
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
337 Args : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
338
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
339 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
340
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
341 sub start {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
342 my ($self,$value) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
343 if( defined $value ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
344 $self->throw("Trying to set the starting point of a split location, that is not possible, try manipulating the sub Locations");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
345 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
346 return $self->SUPER::start();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
347 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
348
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
349 =head2 end
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
350
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
351 Title : end
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
352 Usage : $end = $location->end();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
353 Function: get the ending point of the last (sorted) sublocation
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
354 Returns : integer
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
355 Args : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
356
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
357 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
358
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
359 sub end {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
360 my ($self,$value) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
361 if( defined $value ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
362 $self->throw("Trying to set the ending point of a split location, that is not possible, try manipulating the sub Locations");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
363 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
364 return $self->SUPER::end();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
365 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
366
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
367 =head2 min_start
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
368
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
369 Title : min_start
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
370 Usage : $min_start = $location->min_start();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
371 Function: get the minimum starting point
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
372 Returns : the minimum starting point from the contained sublocations
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
373 Args : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
374
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
375 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
376
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
377 sub min_start {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
378 my ($self, $value) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
379
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
380 if( defined $value ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
381 $self->throw("Trying to set the minimum starting point of a split location, that is not possible, try manipulating the sub Locations");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
382 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
383 my @locs = $self->sub_Location(1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
384 return $locs[0]->min_start() if @locs;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
385 return undef;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
386 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
387
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
388 =head2 max_start
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
389
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
390 Title : max_start
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
391 Usage : my $maxstart = $location->max_start();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
392 Function: Get maximum starting location of feature startpoint
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
393 Returns : integer or undef if no maximum starting point.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
394 Args : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
395
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
396 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
397
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
398 sub max_start {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
399 my ($self,$value) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
400
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
401 if( defined $value ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
402 $self->throw("Trying to set the maximum starting point of a split location, that is not possible, try manipulating the sub Locations");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
403 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
404 my @locs = $self->sub_Location(1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
405 return $locs[0]->max_start() if @locs;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
406 return undef;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
407 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
408
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
409 =head2 start_pos_type
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
410
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
411 Title : start_pos_type
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
412 Usage : my $start_pos_type = $location->start_pos_type();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
413 Function: Get start position type (ie <,>, ^)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
414 Returns : type of position coded as text
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
415 ('BEFORE', 'AFTER', 'EXACT','WITHIN', 'BETWEEN')
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
416 Args : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
417
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
418 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
419
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
420 sub start_pos_type {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
421 my ($self,$value) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
422
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
423 if( defined $value ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
424 $self->throw("Trying to set the start_pos_type of a split location, that is not possible, try manipulating the sub Locations");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
425 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
426 my @locs = $self->sub_Location();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
427 return ( @locs ) ? $locs[0]->start_pos_type() : undef;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
428 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
429
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
430 =head2 min_end
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
431
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
432 Title : min_end
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
433 Usage : my $minend = $location->min_end();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
434 Function: Get minimum ending location of feature endpoint
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
435 Returns : integer or undef if no minimum ending point.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
436 Args : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
437
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
438 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
439
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
440 sub min_end {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
441 my ($self,$value) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
442
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
443 if( defined $value ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
444 $self->throw("Trying to set the minimum end point of a split location, that is not possible, try manipulating the sub Locations");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
445 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
446 # reverse sort locations by largest ending to smallest ending
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
447 my @locs = $self->sub_Location(-1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
448 return $locs[0]->min_end() if @locs;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
449 return undef;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
450 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
451
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
452 =head2 max_end
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
453
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
454 Title : max_end
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
455 Usage : my $maxend = $location->max_end();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
456 Function: Get maximum ending location of feature endpoint
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
457 Returns : integer or undef if no maximum ending point.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
458 Args : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
459
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
460 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
461
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
462 sub max_end {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
463 my ($self,$value) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
464
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
465 if( defined $value ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
466 $self->throw("Trying to set the maximum end point of a split location, that is not possible, try manipulating the sub Locations");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
467 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
468 # reverse sort locations by largest ending to smallest ending
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
469 my @locs = $self->sub_Location(-1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
470 return $locs[0]->max_end() if @locs;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
471 return undef;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
472 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
473
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
474 =head2 end_pos_type
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
475
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
476 Title : end_pos_type
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
477 Usage : my $end_pos_type = $location->end_pos_type();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
478 Function: Get end position type (ie <,>, ^)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
479 Returns : type of position coded as text
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
480 ('BEFORE', 'AFTER', 'EXACT','WITHIN', 'BETWEEN')
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
481 Args : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
482
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
483 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
484
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
485 sub end_pos_type {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
486 my ($self,$value) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
487
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
488 if( defined $value ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
489 $self->throw("Trying to set end_pos_type of a split location, that is not possible, try manipulating the sub Locations");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
490 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
491 my @locs = $self->sub_Location();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
492 return ( @locs ) ? $locs[0]->end_pos_type() : undef;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
493 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
494
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
495
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
496 =head2 seq_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
497
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
498 Title : seq_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
499 Usage : my $seqid = $location->seq_id();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
500 Function: Get/Set seq_id that location refers to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
501
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
502 We override this here in order to propagate to all sublocations
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
503 which are not remote (provided this root is not remote either)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
504 Returns : seq_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
505 Args : [optional] seq_id value to set
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
506
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
507
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
508 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
509
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
510 sub seq_id {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
511 my ($self, $seqid) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
512
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
513 if(! $self->is_remote()) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
514 foreach my $subloc ($self->sub_Location(0)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
515 $subloc->seq_id($seqid) if ! $subloc->is_remote();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
516 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
517 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
518 return $self->SUPER::seq_id($seqid);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
519 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
520
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
521 =head2 coordinate_policy
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
522
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
523 Title : coordinate_policy
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
524 Usage : $policy = $location->coordinate_policy();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
525 $location->coordinate_policy($mypolicy); # set may not be possible
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
526 Function: Get the coordinate computing policy employed by this object.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
527
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
528 See Bio::Location::CoordinatePolicyI for documentation about
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
529 the policy object and its use.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
530
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
531 The interface *does not* require implementing classes to accept
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
532 setting of a different policy. The implementation provided here
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
533 does, however, allow to do so.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
534
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
535 Implementors of this interface are expected to initialize every
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
536 new instance with a CoordinatePolicyI object. The implementation
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
537 provided here will return a default policy object if none has
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
538 been set yet. To change this default policy object call this
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
539 method as a class method with an appropriate argument. Note that
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
540 in this case only subsequently created Location objects will be
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
541 affected.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
542
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
543 Returns : A Bio::Location::CoordinatePolicyI implementing object.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
544 Args : On set, a Bio::Location::CoordinatePolicyI implementing object.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
545
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
546 =head2 to_FTstring
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
547
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
548 Title : to_FTstring
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
549 Usage : my $locstr = $location->to_FTstring()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
550 Function: returns the FeatureTable string of this location
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
551 Returns : string
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
552 Args : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
553
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
554 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
555
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
556 sub to_FTstring {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
557 my ($self) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
558 my @strs;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
559 foreach my $loc ( $self->sub_Location() ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
560 my $str = $loc->to_FTstring();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
561 # we only append the remote seq_id if it hasn't been done already
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
562 # by the sub-location (which it should if it knows it's remote)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
563 # (and of course only if it's necessary)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
564 if( (! $loc->is_remote) &&
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
565 defined($self->seq_id) && defined($loc->seq_id) &&
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
566 ($loc->seq_id ne $self->seq_id) ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
567 $str = sprintf("%s:%s", $loc->seq_id, $str);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
568 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
569 push @strs, $str;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
570 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
571
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
572 my $str = sprintf("%s(%s)",lc $self->splittype, join(",", @strs));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
573 return $str;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
574 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
575
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
576 # we'll probably need to override the RangeI methods since our locations will
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
577 # not be contiguous.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
578
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
579 1;