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