comparison variant_effect_predictor/Bio/Location/Atomic.pm @ 0:1f6dce3d34e0

Uploaded
author mahtabm
date Thu, 11 Apr 2013 02:01:53 -0400
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:1f6dce3d34e0
1 # $Id: Atomic.pm,v 1.6 2002/12/01 00:05:20 jason Exp $
2 #
3 # BioPerl module for Bio::Location::Atomic
4 # Cared for by Jason Stajich <jason@bioperl.org>
5 #
6 # Copyright Jason Stajich
7 #
8 # You may distribute this module under the same terms as perl itself
9 # POD documentation - main docs before the code
10
11 =head1 NAME
12
13 Bio::Location::Atomic - Implementation of a Atomic Location on a Sequence
14
15 =head1 SYNOPSIS
16
17 use Bio::Location::Atomic;
18
19 my $location = new Bio::Location::Atomic(-start => 1, -end => 100,
20 -strand => 1 );
21
22 if( $location->strand == -1 ) {
23 printf "complement(%d..%d)\n", $location->start, $location->end;
24 } else {
25 printf "%d..%d\n", $location->start, $location->end;
26 }
27
28 =head1 DESCRIPTION
29
30 This is an implementation of Bio::LocationI to manage simple location
31 information on a Sequence.
32
33 =head1 FEEDBACK
34
35 User feedback is an integral part of the evolution of this and other
36 Bioperl modules. Send your comments and suggestions preferably to one
37 of the Bioperl mailing lists. Your participation is much appreciated.
38
39 bioperl-l@bioperl.org - General discussion
40 http://bio.perl.org/MailList.html - About the mailing lists
41
42 =head2 Reporting Bugs
43
44 Report bugs to the Bioperl bug tracking system to help us keep track
45 the bugs and their resolution. Bug reports can be submitted via email
46 or the web:
47
48 bioperl-bugs@bio.perl.org
49 http://bugzilla.bioperl.org/
50
51 =head1 AUTHOR - Jason Stajich
52
53 Email jason@bioperl.org
54
55 =head1 APPENDIX
56
57 The rest of the documentation details each of the object
58 methods. Internal methods are usually preceded with a _
59
60 =cut
61
62 # Let the code begin...
63
64
65 package Bio::Location::Atomic;
66 use vars qw(@ISA);
67 use strict;
68
69 use Bio::Root::Root;
70 use Bio::LocationI;
71
72
73 @ISA = qw(Bio::Root::Root Bio::LocationI);
74
75 sub new {
76 my ($class, @args) = @_;
77 my $self = {};
78
79 bless $self,$class;
80
81 my ($v,$start,$end,$strand,$seqid) = $self->_rearrange([qw(VERBOSE
82 START
83 END
84 STRAND
85 SEQ_ID)],@args);
86 defined $v && $self->verbose($v);
87 defined $strand && $self->strand($strand);
88
89 defined $start && $self->start($start);
90 defined $end && $self->end($end);
91 if( defined $self->start && defined $self->end &&
92 $self->start > $self->end && $self->strand != -1 ) {
93 $self->warn("When building a location, start ($start) is expected to be less than end ($end), ".
94 "however it was not. Switching start and end and setting strand to -1");
95
96 $self->strand(-1);
97 my $e = $self->end;
98 my $s = $self->start;
99 $self->start($e);
100 $self->end($s);
101 }
102 $seqid && $self->seq_id($seqid);
103
104 return $self;
105 }
106
107 =head2 start
108
109 Title : start
110 Usage : $start = $loc->start();
111 Function: get/set the start of this range
112 Returns : the start of this range
113 Args : optionaly allows the start to be set
114 : using $loc->start($start)
115
116 =cut
117
118 sub start {
119 my ($self, $value) = @_;
120 $self->min_start($value) if( defined $value );
121 return $self->SUPER::start();
122 }
123
124 =head2 end
125
126 Title : end
127 Usage : $end = $loc->end();
128 Function: get/set the end of this range
129 Returns : the end of this range
130 Args : optionaly allows the end to be set
131 : using $loc->end($start)
132
133 =cut
134
135 sub end {
136 my ($self, $value) = @_;
137
138 $self->min_end($value) if( defined $value );
139 return $self->SUPER::end();
140 }
141
142 =head2 strand
143
144 Title : strand
145 Usage : $strand = $loc->strand();
146 Function: get/set the strand of this range
147 Returns : the strandidness (-1, 0, +1)
148 Args : optionaly allows the strand to be set
149 : using $loc->strand($strand)
150
151 =cut
152
153 sub strand {
154 my ($self, $value) = @_;
155
156 if ( defined $value ) {
157 if ( $value eq '+' ) { $value = 1; }
158 elsif ( $value eq '-' ) { $value = -1; }
159 elsif ( $value eq '.' ) { $value = 0; }
160 elsif ( $value != -1 && $value != 1 && $value != 0 ) {
161 $self->throw("$value is not a valid strand info");
162 }
163 $self->{'_strand'} = $value
164 }
165 # let's go ahead and force to '0' if
166 # we are requesting the strand without it
167 # having been set previously
168 return $self->{'_strand'} || 0;
169 }
170
171 =head2 length
172
173 Title : length
174 Usage : $len = $loc->length();
175 Function: get the length in the coordinate space this location spans
176 Example :
177 Returns : an integer
178 Args : none
179
180
181 =cut
182
183 sub length {
184 my ($self) = @_;
185 return abs($self->end() - $self->start()) + 1;
186 }
187
188 =head2 min_start
189
190 Title : min_start
191 Usage : my $minstart = $location->min_start();
192 Function: Get minimum starting location of feature startpoint
193 Returns : integer or undef if no minimum starting point.
194 Args : none
195
196 =cut
197
198 sub min_start {
199 my ($self,$value) = @_;
200
201 if(defined($value)) {
202 $self->{'_start'} = $value;
203 }
204 return $self->{'_start'};
205 }
206
207 =head2 max_start
208
209 Title : max_start
210 Usage : my $maxstart = $location->max_start();
211 Function: Get maximum starting location of feature startpoint.
212
213 In this implementation this is exactly the same as min_start().
214
215 Returns : integer or undef if no maximum starting point.
216 Args : none
217
218 =cut
219
220 sub max_start {
221 my ($self,@args) = @_;
222 return $self->min_start(@args);
223 }
224
225 =head2 start_pos_type
226
227 Title : start_pos_type
228 Usage : my $start_pos_type = $location->start_pos_type();
229 Function: Get start position type (ie <,>, ^).
230
231 In this implementation this will always be 'EXACT'.
232
233 Returns : type of position coded as text
234 ('BEFORE', 'AFTER', 'EXACT','WITHIN', 'BETWEEN')
235 Args : none
236
237 =cut
238
239 sub start_pos_type {
240 my($self) = @_;
241 return 'EXACT';
242 }
243
244 =head2 min_end
245
246 Title : min_end
247 Usage : my $minend = $location->min_end();
248 Function: Get minimum ending location of feature endpoint
249 Returns : integer or undef if no minimum ending point.
250 Args : none
251
252 =cut
253
254 sub min_end {
255 my($self,$value) = @_;
256
257 if(defined($value)) {
258 $self->{'_end'} = $value;
259 }
260 return $self->{'_end'};
261 }
262
263 =head2 max_end
264
265 Title : max_end
266 Usage : my $maxend = $location->max_end();
267 Function: Get maximum ending location of feature endpoint
268
269 In this implementation this is exactly the same as min_end().
270
271 Returns : integer or undef if no maximum ending point.
272 Args : none
273
274 =cut
275
276 sub max_end {
277 my($self,@args) = @_;
278 return $self->min_end(@args);
279 }
280
281 =head2 end_pos_type
282
283 Title : end_pos_type
284 Usage : my $end_pos_type = $location->end_pos_type();
285 Function: Get end position type (ie <,>, ^)
286
287 In this implementation this will always be 'EXACT'.
288
289 Returns : type of position coded as text
290 ('BEFORE', 'AFTER', 'EXACT','WITHIN', 'BETWEEN')
291 Args : none
292
293 =cut
294
295 sub end_pos_type {
296 my($self) = @_;
297 return 'EXACT';
298 }
299
300 =head2 location_type
301
302 Title : location_type
303 Usage : my $location_type = $location->location_type();
304 Function: Get location type encoded as text
305 Returns : string ('EXACT', 'WITHIN', 'BETWEEN')
306 Args : none
307
308 =cut
309
310 sub location_type {
311 my ($self) = @_;
312 return 'EXACT';
313 }
314
315 =head2 is_remote
316
317 Title : is_remote
318 Usage : $self->is_remote($newval)
319 Function: Getset for is_remote value
320 Returns : value of is_remote
321 Args : newvalue (optional)
322
323
324 =cut
325
326 sub is_remote {
327 my $self = shift;
328 if( @_ ) {
329 my $value = shift;
330 $self->{'is_remote'} = $value;
331 }
332 return $self->{'is_remote'};
333
334 }
335
336 =head2 each_Location
337
338 Title : each_Location
339 Usage : @locations = $locObject->each_Location($order);
340 Function: Conserved function call across Location:: modules - will
341 return an array containing the component Location(s) in
342 that object, regardless if the calling object is itself a
343 single location or one containing sublocations.
344 Returns : an array of Bio::LocationI implementing objects - for
345 Simple locations, the return value is just itself.
346 Args :
347
348 =cut
349
350 sub each_Location {
351 my ($self) = @_;
352 return ($self);
353 }
354
355 =head2 to_FTstring
356
357 Title : to_FTstring
358 Usage : my $locstr = $location->to_FTstring()
359 Function: returns the FeatureTable string of this location
360 Returns : string
361 Args : none
362
363 =cut
364
365 sub to_FTstring {
366 my($self) = @_;
367 if( $self->start == $self->end ) {
368 return $self->start;
369 }
370 my $str = $self->start . ".." . $self->end;
371 if( $self->strand == -1 ) {
372 $str = sprintf("complement(%s)", $str);
373 }
374 return $str;
375 }
376
377
378 sub trunc {
379 my ($self,$start,$end,$relative_ori) = @_;
380
381 my $newstart = $self->start - $start+1;
382 my $newend = $self->end - $start+1;
383 my $newstrand = $relative_ori * $self->strand;
384
385 my $out;
386 if( $newstart < 1 || $newend > ($end-$start+1) ) {
387 $out = Bio::Location::Atomic->new();
388 $out->start($self->start);
389 $out->end($self->end);
390 $out->strand($self->strand);
391 $out->seq_id($self->seqid);
392 $out->is_remote(1);
393 } else {
394 $out = Bio::Location::Atomic->new();
395 $out->start($newstart);
396 $out->end($newend);
397 $out->strand($newstrand);
398 $out->seq_id();
399 }
400
401 return $out;
402 }
403
404 1;
405