annotate variant_effect_predictor/Bio/Location/Fuzzy.pm @ 1:d6778b5d8382 draft default tip

Deleted selected files
author willmclaren
date Fri, 03 Aug 2012 10:05:43 -0400
parents 21066c0abaf5
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1 # $Id: Fuzzy.pm,v 1.24 2002/12/01 00:05:20 jason Exp $
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
3 # BioPerl module for Bio::Location::Fuzzy
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::Fuzzy - Implementation of a Location on a Sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
14 which has unclear start and/or end locations
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::Fuzzy;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
19 my $fuzzylocation = new Bio::Location::Fuzzy(-start => '<30',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
20 -end => 90,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
21 -location_type => '.');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
22
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
23 print "location string is ", $fuzzylocation->to_FTstring(), "\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
24 print "location is of the type ", $fuzzylocation->location_type, "\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
25
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
26 =head1 DESCRIPTION
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
27
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
28 This module contains the necessary methods for representing a
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
29 Fuzzy Location, one that does not have clear start and/or end points.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
30 This will initially serve to handle features from Genbank/EMBL feature
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
31 tables that are written as 1^100 meaning between bases 1 and 100 or
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
32 E<lt>100..300 meaning it starts somewhere before 100. Advanced
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
33 implementations of this interface may be able to handle the necessary
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
34 logic of overlaps/intersection/contains/union. It was constructed to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
35 handle fuzzy locations that can be represented in Genbank/EMBL.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
36
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
37 =head1 FEEDBACK
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
38
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
39 User feedback is an integral part of the evolution of this and other
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
40 Bioperl modules. Send your comments and suggestions preferably to one
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
41 of the Bioperl mailing lists. Your participation is much appreciated.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
42
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
43 bioperl-l@bioperl.org - General discussion
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
44 http://bio.perl.org/MailList.html - About the mailing lists
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
45
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
46 =head2 Reporting Bugs
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
47
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
48 Report bugs to the Bioperl bug tracking system to help us keep track
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
49 the bugs and their resolution. Bug reports can be submitted via email
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
50 or the web:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
51
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
52 bioperl-bugs@bio.perl.org
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
53 http://bugzilla.bioperl.org/
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
54
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
55 =head1 AUTHOR - Jason Stajich
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
56
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
57 Email jason@bioperl.org
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
58
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
59 =head1 APPENDIX
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
60
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
61 The rest of the documentation details each of the object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
62 methods. Internal methods are usually preceded with a _
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
63
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
64 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
65
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
66 # Let the code begin...
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
67
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
68 package Bio::Location::Fuzzy;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
69 use vars qw(@ISA );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
70 use strict;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
71
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
72 use Bio::Location::FuzzyLocationI;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
73 use Bio::Location::Atomic;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
74
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
75 @ISA = qw(Bio::Location::Atomic Bio::Location::FuzzyLocationI );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
76
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
77 BEGIN {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
78 use vars qw( %FUZZYCODES %FUZZYPOINTENCODE %FUZZYRANGEENCODE
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
79 @LOCATIONCODESBSANE );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
80
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
81 @LOCATIONCODESBSANE = (undef, 'EXACT', 'WITHIN', 'BETWEEN',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
82 'BEFORE', 'AFTER');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
83
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
84 %FUZZYCODES = ( 'EXACT' => '..', # Position is 'exact
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
85 # Exact position is unknown, but is within the range specified, ((1.2)..100)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
86 'WITHIN' => '.',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
87 # 1^2
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
88 'BETWEEN' => '^',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
89 # <100
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
90 'BEFORE' => '<',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
91 # >10
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
92 'AFTER' => '>');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
93
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
94 # The following regular expressions map to fuzzy location types. Every
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
95 # expression must match the complete encoded point string, and must
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
96 # contain two groups identifying min and max. Empty matches are automatic.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
97 # converted to undef, except for 'EXACT', for which max is set to equal
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
98 # min.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
99 %FUZZYPOINTENCODE = (
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
100 '\>(\d+)(.{0})' => 'AFTER',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
101 '\<(.{0})(\d+)' => 'BEFORE',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
102 '(\d+)' => 'EXACT',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
103 '(\d+)(.{0})\>' => 'AFTER',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
104 '(.{0})(\d+)\<' => 'BEFORE',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
105 '(\d+)\.(\d+)' => 'WITHIN',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
106 '(\d+)\^(\d+)' => 'BETWEEN',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
107 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
108
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
109 %FUZZYRANGEENCODE = ( '\.' => 'WITHIN',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
110 '\.\.' => 'EXACT',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
111 '\^' => 'BETWEEN' );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
112
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
113 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
114
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
115 =head2 new
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
116
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
117 Title : new
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
118 Usage : my $fuzzyloc = new Bio::Location::Fuzzy( @args);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
119 Function:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
120 Returns :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
121 Args : -start => value for start (initialize by superclass)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
122 -end => value for end (initialize by superclass)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
123 -strand => value for strand (initialize by superclass)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
124 -location_type => either ('EXACT', 'WITHIN', 'BETWEEN') OR
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
125 ( 1,2,3)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
126 -start_ext=> extension for start - defaults to 0,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
127 -start_fuz= fuzzy code for start can be
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
128 ( 'EXACT', 'WITHIN', 'BETWEEN', 'BEFORE', 'AFTER') OR
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
129 a value 1 - 5 corresponding to index+1 above
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
130 -end_ext=> extension for end - defaults to 0,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
131 -end_fuz= fuzzy code for end can be
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
132 ( 'EXACT', 'WITHIN', 'BETWEEN', 'BEFORE', 'AFTER') OR
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
133 a value 1 - 5 corresponding to index+1 above
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
134
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
135 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
136
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
137 sub new {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
138 my ($class, @args) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
139 my $self = $class->SUPER::new(@args);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
140 my ($location_type, $start_ext, $start_fuz, $end_ext, $end_fuz) =
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
141 $self->_rearrange([ qw(LOCATION_TYPE START_EXT START_FUZ
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
142 END_EXT END_FUZ )
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
143 ], @args);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
144
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
145 $location_type && $self->location_type($location_type);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
146 $start_ext && $self->max_start($self->min_start + $start_ext);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
147 $end_ext && $self->max_end($self->min_end + $end_ext);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
148 $start_fuz && $self->start_pos_type($start_fuz);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
149 $end_fuz && $self->end_pos_type($end_fuz);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
150
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
151 return $self;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
152 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
153
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
154 =head2 location_type
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
155
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
156 Title : location_type
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
157 Usage : my $location_type = $location->location_type();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
158 Function: Get location type encoded as text
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
159 Returns : string ('EXACT', 'WITHIN', 'BETWEEN')
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
160 Args : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
161
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
162 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
163
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
164 sub location_type {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
165 my ($self,$value) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
166 if( defined $value || ! defined $self->{'_location_type'} ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
167 $value = 'EXACT' unless defined $value;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
168 if(! defined $FUZZYCODES{$value}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
169 $value = uc($value);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
170 if( $value =~ /\.\./ ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
171 $value = 'EXACT';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
172 } elsif( $value =~ /^\.$/ ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
173 $value = 'WITHIN';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
174 } elsif( $value =~ /\^/ ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
175 $value = 'BETWEEN';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
176
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
177
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
178 $self->throw("Use Bio::Location::Simple for IN-BETWEEN locations [". $self->start. "] and [". $self->end. "]")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
179 if defined $self->start && defined $self->end && ($self->end - 1 == $self->start);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
180
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
181
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
182 } elsif( $value ne 'EXACT' && $value ne 'WITHIN' &&
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
183 $value ne 'BETWEEN' ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
184 $self->throw("Did not specify a valid location type");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
185 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
186 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
187 $self->{'_location_type'} = $value;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
188 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
189 return $self->{'_location_type'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
190 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
191
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
192 =head1 LocationI methods
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
193
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
194 =head2 length
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
195
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
196 Title : length
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
197 Usage : $length = $fuzzy_loc->length();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
198 Function: Get the length of this location.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
199
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
200 Note that the length of a fuzzy location will always depend
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
201 on the currently active interpretation of start and end. The
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
202 result will therefore vary for different CoordinatePolicy objects.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
203
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
204 Returns : an integer
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
205 Args : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
206
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
207 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
208
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
209 #sub length {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
210 # my($self) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
211 # return $self->SUPER::length() if( !$self->start || !$self->end);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
212 # $self->warn('Length is not valid for a FuzzyLocation');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
213 # return 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
214 #}
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
215
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
216 =head2 start
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
217
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
218 Title : start
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
219 Usage : $start = $fuzzy->start();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
220 Function: get/set start of this range, handling fuzzy_starts
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
221 Returns : a positive integer representing the start of the location
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
222 Args : start location on set (can be fuzzy point string)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
223
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
224 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
225
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
226 sub start {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
227 my($self,$value) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
228 if( defined $value ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
229 my ($encode,$min,$max) = $self->_fuzzypointdecode($value);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
230 $self->start_pos_type($encode);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
231 $self->min_start($min);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
232 $self->max_start($max);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
233 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
234
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
235 $self->throw("Use Bio::Location::Simple for IN-BETWEEN locations [". $self->SUPER::start. "] and [". $self->SUPER::end. "]")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
236 if $self->location_type eq 'BETWEEN' && defined $self->SUPER::end && ($self->SUPER::end - 1 == $self->SUPER::start);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
237
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
238 return $self->SUPER::start();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
239 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
240
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
241 =head2 end
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
242
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
243 Title : end
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
244 Usage : $end = $fuzzy->end();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
245 Function: get/set end of this range, handling fuzzy_ends
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
246 Returns : a positive integer representing the end of the range
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
247 Args : end location on set (can be fuzzy string)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
248
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
249 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
250
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
251 sub end {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
252 my($self,$value) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
253 if( defined $value ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
254 my ($encode,$min,$max) = $self->_fuzzypointdecode($value);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
255 $self->end_pos_type($encode);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
256 $self->min_end($min);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
257 $self->max_end($max);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
258 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
259
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
260 $self->throw("Use Bio::Location::Simple for IN-BETWEEN locations [". $self->SUPER::start. "] and [". $self->SUPER::end. "]")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
261 if $self->location_type eq 'BETWEEN' && defined $self->SUPER::start && ($self->SUPER::end - 1 == $self->SUPER::start);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
262
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
263 return $self->SUPER::end();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
264 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
265
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
266 =head2 min_start
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
267
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
268 Title : min_start
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
269 Usage : $min_start = $fuzzy->min_start();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
270 Function: get/set the minimum starting point
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
271 Returns : the minimum starting point from the contained sublocations
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
272 Args : integer or undef on set
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
273
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
274 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
275
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
276 sub min_start {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
277 my ($self,@args) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
278
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
279 if(@args) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
280 $self->{'_min_start'} = $args[0]; # the value may be undef!
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
281 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
282 return $self->{'_min_start'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
283 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
284
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
285 =head2 max_start
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
286
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
287 Title : max_start
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
288 Usage : my $maxstart = $location->max_start();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
289 Function: Get/set maximum starting location of feature startpoint
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
290 Returns : integer or undef if no maximum starting point.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
291 Args : integer or undef on set
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
292
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
293 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
294
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
295 sub max_start {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
296 my ($self,@args) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
297
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
298 if(@args) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
299 $self->{'_max_start'} = $args[0]; # the value may be undef!
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
300 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
301 return $self->{'_max_start'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
302 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
303
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
304 =head2 start_pos_type
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
305
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
306 Title : start_pos_type
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
307 Usage : my $start_pos_type = $location->start_pos_type();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
308 Function: Get/set start position type.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
309 Returns : type of position coded as text
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
310 ('BEFORE', 'AFTER', 'EXACT','WITHIN', 'BETWEEN')
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
311 Args : a string on set
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
312
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
313 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
314
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
315 sub start_pos_type {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
316 my ($self,$value) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
317 if(defined $value && $value =~ /^\d+$/ ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
318 if( $value == 0 ) { $value = 'EXACT'; }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
319 else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
320 my $v = $LOCATIONCODESBSANE[$value];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
321 if( ! defined $v ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
322 $self->warn("Provided value $value which I don't understand, reverting to 'EXACT'");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
323 $v = 'EXACT';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
324 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
325 $value = $v;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
326 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
327 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
328 if(defined($value)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
329 $self->{'_start_pos_type'} = $value;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
330 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
331 return $self->{'_start_pos_type'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
332 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
333
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
334 =head2 min_end
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
335
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
336 Title : min_end
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
337 Usage : my $minend = $location->min_end();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
338 Function: Get/set minimum ending location of feature endpoint
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
339 Returns : integer or undef if no minimum ending point.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
340 Args : integer or undef on set
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
341
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
342 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
343
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
344 sub min_end {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
345 my ($self,@args) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
346
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
347 if(@args) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
348 $self->{'_min_end'} = $args[0]; # the value may be undef!
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
349 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
350 return $self->{'_min_end'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
351 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
352
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
353 =head2 max_end
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
354
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
355 Title : max_end
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
356 Usage : my $maxend = $location->max_end();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
357 Function: Get/set maximum ending location of feature endpoint
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
358 Returns : integer or undef if no maximum ending point.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
359 Args : integer or undef on set
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
360
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
361 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
362
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
363 sub max_end {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
364 my ($self,@args) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
365
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
366 if(@args) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
367 $self->{'_max_end'} = $args[0]; # the value may be undef!
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
368 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
369 return $self->{'_max_end'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
370 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
371
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
372 =head2 end_pos_type
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
373
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
374 Title : end_pos_type
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
375 Usage : my $end_pos_type = $location->end_pos_type();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
376 Function: Get/set end position type.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
377 Returns : type of position coded as text
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
378 ('BEFORE', 'AFTER', 'EXACT','WITHIN', 'BETWEEN')
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
379 Args : a string on set
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
380
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
381 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
382
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
383 sub end_pos_type {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
384 my ($self,$value) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
385 if( defined $value && $value =~ /^\d+$/ ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
386 if( $value == 0 ) { $value = 'EXACT'; }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
387 else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
388 my $v = $LOCATIONCODESBSANE[$value];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
389 if( ! defined $v ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
390 $self->warn("Provided value $value which I don't understand, reverting to 'EXACT'");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
391 $v = 'EXACT';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
392 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
393 $value = $v;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
394 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
395 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
396
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
397 if(defined($value)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
398 $self->{'_end_pos_type'} = $value;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
399 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
400 return $self->{'_end_pos_type'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
401 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
402
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
403 =head2 seq_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
404
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
405 Title : seq_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
406 Usage : my $seqid = $location->seq_id();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
407 Function: Get/Set seq_id that location refers to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
408 Returns : seq_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
409 Args : [optional] seq_id value to set
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
410
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
411 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
412
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
413 =head2 coordinate_policy
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
414
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
415 Title : coordinate_policy
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
416 Usage : $policy = $location->coordinate_policy();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
417 $location->coordinate_policy($mypolicy); # set may not be possible
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
418 Function: Get the coordinate computing policy employed by this object.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
419
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
420 See Bio::Location::CoordinatePolicyI for documentation about
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
421 the policy object and its use.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
422
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
423 The interface *does not* require implementing classes to accept
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
424 setting of a different policy. The implementation provided here
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
425 does, however, allow to do so.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
426
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
427 Implementors of this interface are expected to initialize every
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
428 new instance with a CoordinatePolicyI object. The implementation
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
429 provided here will return a default policy object if none has
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
430 been set yet. To change this default policy object call this
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
431 method as a class method with an appropriate argument. Note that
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
432 in this case only subsequently created Location objects will be
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
433 affected.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
434
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
435 Returns : A Bio::Location::CoordinatePolicyI implementing object.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
436 Args : On set, a Bio::Location::CoordinatePolicyI implementing object.
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 =head2 to_FTstring
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
441
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
442 Title : to_FTstring
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
443 Usage : my $locstr = $location->to_FTstring()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
444 Function: Get/Set seq_id that location refers to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
445 Returns : seq_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
446 Args : [optional] seq_id value to set
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
447
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
448 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
449
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
450 sub to_FTstring {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
451 my ($self) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
452 my (%vals) = ( 'start' => $self->start,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
453 'min_start' => $self->min_start,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
454 'max_start' => $self->max_start,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
455 'start_code' => $self->start_pos_type,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
456 'end' => $self->end,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
457 'min_end' => $self->min_end,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
458 'max_end' => $self->max_end,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
459 'end_code' => $self->end_pos_type );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
460
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
461 my (%strs) = ( 'start' => '',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
462 'end' => '');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
463 my ($delimiter) = $FUZZYCODES{$self->location_type};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
464 # I'm lazy, lets do this in a loop since behaviour will be the same for
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
465 # start and end
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
466 foreach my $point ( qw(start end) ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
467 if( $vals{$point."_code"} ne 'EXACT' ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
468
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
469 if( (!defined $vals{"min_$point"} ||
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
470 !defined $vals{"max_$point"})
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
471 && ( $vals{$point."_code"} eq 'WITHIN' ||
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
472 $vals{$point."_code"} eq 'BETWEEN')
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
473 ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
474 $vals{"min_$point"} = '' unless defined $vals{"min_$point"};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
475 $vals{"max_$point"} = '' unless defined $vals{"max_$point"};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
476
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
477 $self->warn("Fuzzy codes for start are in a strange state, (".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
478 join(",", ($vals{"min_$point"},
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
479 $vals{"max_$point"},
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
480 $vals{$point."_code"})). ")");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
481 return '';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
482 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
483 if( defined $vals{$point."_code"} &&
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
484 ($vals{$point."_code"} eq 'BEFORE' ||
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
485 $vals{$point."_code"} eq 'AFTER')
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
486 ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
487 $strs{$point} .= $FUZZYCODES{$vals{$point."_code"}};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
488 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
489 if( defined $vals{"min_$point"} ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
490 $strs{$point} .= $vals{"min_$point"};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
491 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
492 if( defined $vals{$point."_code"} &&
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
493 ($vals{$point."_code"} eq 'WITHIN' ||
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
494 $vals{$point."_code"} eq 'BETWEEN')
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
495 ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
496 $strs{$point} .= $FUZZYCODES{$vals{$point."_code"}};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
497 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
498 if( defined $vals{"max_$point"} ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
499 $strs{$point} .= $vals{"max_$point"};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
500 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
501 if(($vals{$point."_code"} eq 'WITHIN') ||
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
502 ($vals{$point."_code"} eq 'BETWEEN')) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
503 $strs{$point} = "(".$strs{$point}.")";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
504 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
505 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
506 $strs{$point} = $vals{$point};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
507 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
508
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
509 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
510 my $str = $strs{'start'} . $delimiter . $strs{'end'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
511 if($self->is_remote() && $self->seq_id()) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
512 $str = $self->seq_id() . ":" . $str;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
513 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
514 if( $self->strand == -1 ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
515 $str = "complement(" . $str . ")";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
516 } elsif($self->location_type() eq "WITHIN") {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
517 $str = "(".$str.")";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
518 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
519 return $str;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
520 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
521
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
522 =head2 _fuzzypointdecode
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
523
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
524 Title : _fuzzypointdecode
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
525 Usage : ($type,$min,$max) = $self->_fuzzypointdecode('<5');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
526 Function: Decode a fuzzy string.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
527 Returns : A 3-element array consisting of the type of location, the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
528 minimum integer, and the maximum integer describing the range
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
529 of coordinates this start or endpoint refers to. Minimum or
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
530 maximum coordinate may be undefined.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
531 : Returns empty array on fail.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
532 Args : fuzzypoint string
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
533
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
534 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
535
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
536 sub _fuzzypointdecode {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
537 my ($self, $string) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
538 return () if( !defined $string);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
539 # strip off leading and trailing space
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
540 $string =~ s/^\s*(\S+)\s*/$1/;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
541 foreach my $pattern ( keys %FUZZYPOINTENCODE ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
542 if( $string =~ /^$pattern$/ ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
543 my ($min,$max) = ($1,$2);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
544 if($FUZZYPOINTENCODE{$pattern} eq 'EXACT') {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
545 $max = $min;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
546 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
547 $max = undef if(length($max) == 0);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
548 $min = undef if(length($min) == 0);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
549 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
550 return ($FUZZYPOINTENCODE{$pattern},$min,$max);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
551 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
552 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
553 if( $self->verbose >= 1 ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
554 $self->warn("could not find a valid fuzzy encoding for $string");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
555 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
556 return ();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
557 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
558
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
559 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
560