comparison variant_effect_predictor/Bio/SeqFeature/PositionProxy.pm @ 0:2bc9b66ada89 draft default tip

Uploaded
author mahtabm
date Thu, 11 Apr 2013 06:29:17 -0400
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:2bc9b66ada89
1 # $Id: PositionProxy.pm,v 1.4 2002/10/22 07:38:41 lapp Exp $
2 #
3 # BioPerl module for Bio::SeqFeature::PositionProxy
4 #
5 # Cared for by Ewan Birney <birney@ebi.ac.uk>
6 #
7 # Copyright Ewan Birney
8 #
9 # You may distribute this module under the same terms as perl itself
10
11 # POD documentation - main docs before the code
12
13 =head1 NAME
14
15 Bio::SeqFeature::PositionProxy - handle features when truncation/revcom sequences span a feature
16
17 =head1 SYNOPSIS
18
19 $proxy = new Bio::SeqFeature::PositionProxy ( -loc => $loc,
20 -parent => $basefeature);
21
22 $seq->add_SeqFeature($feat);
23
24
25
26 =head1 DESCRIPTION
27
28 PositionProxy is a Proxy Sequence Feature to handle truncation
29 and revcomp without duplicating all the data within the sequence features.
30 It holds a new location for a sequence feature and the original feature
31 it came from to provide the additional annotation information.
32
33 =head1 FEEDBACK
34
35 =head2 Mailing Lists
36
37 User feedback is an integral part of the evolution of this and other
38 Bioperl modules. Send your comments and suggestions preferably to one
39 of the Bioperl mailing lists. Your participation is much appreciated.
40
41 bioperl-l@bioperl.org - General discussion
42 http://bio.perl.org/MailList.html - About the mailing lists
43
44 =head2 Reporting Bugs
45
46 Report bugs to the Bioperl bug tracking system to help us keep track
47 the bugs and their resolution. Bug reports can be submitted via email
48 or the web:
49
50 bioperl-bugs@bio.perl.org
51 http://bugzilla.bioperl.org/
52
53 =head1 AUTHOR - Ewan Birney
54
55 Ewan Birney E<lt>birney@sanger.ac.ukE<gt>
56
57 =head1 DEVELOPERS
58
59 This class has been written with an eye out of inheritence. The fields
60 the actual object hash are:
61
62 _gsf_tag_hash = reference to a hash for the tags
63 _gsf_sub_array = reference to an array for sub arrays
64 _gsf_start = scalar of the start point
65 _gsf_end = scalar of the end point
66 _gsf_strand = scalar of the strand
67
68 =head1 APPENDIX
69
70 The rest of the documentation details each of the object
71 methods. Internal methods are usually preceded with a _
72
73 =cut
74
75
76 # Let the code begin...
77
78
79 package Bio::SeqFeature::PositionProxy;
80 use vars qw(@ISA);
81 use strict;
82
83 use Bio::Root::Root;
84 use Bio::SeqFeatureI;
85 use Bio::Tools::GFF;
86
87
88 @ISA = qw(Bio::Root::Root Bio::SeqFeatureI);
89
90 sub new {
91 my ($caller, @args) = @_;
92 my $self = $caller->SUPER::new(@args);
93
94 my ($feature,$location) = $self->_rearrange([qw(PARENT LOC)],@args);
95
96 if( !defined $feature || !ref $feature || !$feature->isa('Bio::SeqFeatureI') ) {
97 $self->throw("Must have a parent feature, not a [$feature]");
98 }
99
100 if( $feature->isa("Bio::SeqFeature::PositionProxy") ) {
101 $feature = $feature->parent();
102 }
103
104 if( !defined $location || !ref $location || !$location->isa('Bio::LocationI') ) {
105 $self->throw("Must have a location, not a [$location]");
106 }
107
108
109 return $self;
110 }
111
112
113 =head2 location
114
115 Title : location
116 Usage : my $location = $seqfeature->location()
117 Function: returns a location object suitable for identifying location
118 of feature on sequence or parent feature
119 Returns : Bio::LocationI object
120 Args : none
121
122
123 =cut
124
125 sub location {
126 my($self, $value ) = @_;
127
128 if (defined($value)) {
129 unless (ref($value) and $value->isa('Bio::LocationI')) {
130 $self->throw("object $value pretends to be a location but ".
131 "does not implement Bio::LocationI");
132 }
133 $self->{'_location'} = $value;
134 }
135 elsif (! $self->{'_location'}) {
136 # guarantees a real location object is returned every time
137 $self->{'_location'} = Bio::Location::Simple->new();
138 }
139 return $self->{'_location'};
140 }
141
142
143 =head2 parent
144
145 Title : parent
146 Usage : my $sf = $proxy->parent()
147 Function: returns the seqfeature parent of this proxy
148 Returns : Bio::SeqFeatureI object
149 Args : none
150
151
152 =cut
153
154 sub parent {
155 my($self, $value ) = @_;
156
157 if (defined($value)) {
158 unless (ref($value) and $value->isa('Bio::SeqFeatureI')) {
159 $self->throw("object $value pretends to be a location but ".
160 "does not implement Bio::SeqFeatureI");
161 }
162 $self->{'_parent'} = $value;
163 }
164
165 return $self->{'_parent'};
166 }
167
168
169
170 =head2 start
171
172 Title : start
173 Usage : $start = $feat->start
174 $feat->start(20)
175 Function: Get
176 Returns : integer
177 Args : none
178
179
180 =cut
181
182 sub start {
183 my ($self,$value) = @_;
184 return $self->location->start($value);
185 }
186
187 =head2 end
188
189 Title : end
190 Usage : $end = $feat->end
191 $feat->end($end)
192 Function: get
193 Returns : integer
194 Args : none
195
196
197 =cut
198
199 sub end {
200 my ($self,$value) = @_;
201 return $self->location->end($value);
202 }
203
204 =head2 length
205
206 Title : length
207 Usage :
208 Function:
209 Example :
210 Returns :
211 Args :
212
213
214 =cut
215
216 sub length {
217 my ($self) = @_;
218 return $self->end - $self->start() + 1;
219 }
220
221 =head2 strand
222
223 Title : strand
224 Usage : $strand = $feat->strand()
225 $feat->strand($strand)
226 Function: get/set on strand information, being 1,-1 or 0
227 Returns : -1,1 or 0
228 Args : none
229
230
231 =cut
232
233 sub strand {
234 my ($self,$value) = @_;
235 return $self->location->strand($value);
236 }
237
238
239 =head2 attach_seq
240
241 Title : attach_seq
242 Usage : $sf->attach_seq($seq)
243 Function: Attaches a Bio::Seq object to this feature. This
244 Bio::Seq object is for the *entire* sequence: ie
245 from 1 to 10000
246 Example :
247 Returns : TRUE on success
248 Args :
249
250
251 =cut
252
253 sub attach_seq {
254 my ($self, $seq) = @_;
255
256 if ( !defined $seq || !ref $seq || ! $seq->isa("Bio::PrimarySeqI") ) {
257 $self->throw("Must attach Bio::PrimarySeqI objects to SeqFeatures");
258 }
259
260 $self->{'_gsf_seq'} = $seq;
261
262 # attach to sub features if they want it
263
264 foreach my $sf ( $self->sub_SeqFeature() ) {
265 if ( $sf->can("attach_seq") ) {
266 $sf->attach_seq($seq);
267 }
268 }
269 return 1;
270 }
271
272 =head2 seq
273
274 Title : seq
275 Usage : $tseq = $sf->seq()
276 Function: returns the truncated sequence (if there) for this
277 Example :
278 Returns : sub seq on attached sequence bounded by start & end
279 Args : none
280
281
282 =cut
283
284 sub seq {
285 my ($self, $arg) = @_;
286
287 if ( defined $arg ) {
288 $self->throw("Calling SeqFeature::PositionProxy->seq with an argument. You probably want attach_seq");
289 }
290
291 if ( ! exists $self->{'_gsf_seq'} ) {
292 return undef;
293 }
294
295 # assumming our seq object is sensible, it should not have to yank
296 # the entire sequence out here.
297
298 my $seq = $self->{'_gsf_seq'}->trunc($self->start(), $self->end());
299
300
301 if ( $self->strand == -1 ) {
302 $seq = $seq->revcom;
303 }
304
305 return $seq;
306 }
307
308 =head2 entire_seq
309
310 Title : entire_seq
311 Usage : $whole_seq = $sf->entire_seq()
312 Function: gives the entire sequence that this seqfeature is attached to
313 Example :
314 Returns :
315 Args :
316
317
318 =cut
319
320 sub entire_seq {
321 my ($self) = @_;
322
323 return undef unless exists($self->{'_gsf_seq'});
324 return $self->{'_gsf_seq'};
325 }
326
327
328 =head2 seqname
329
330 Title : seqname
331 Usage : $obj->seq_id($newval)
332 Function: There are many cases when you make a feature that you
333 do know the sequence name, but do not know its actual
334 sequence. This is an attribute such that you can store
335 the seqname.
336
337 This attribute should *not* be used in GFF dumping, as
338 that should come from the collection in which the seq
339 feature was found.
340 Returns : value of seqname
341 Args : newvalue (optional)
342
343
344 =cut
345
346 sub seqname {
347 my ($obj,$value) = @_;
348 if ( defined $value ) {
349 $obj->{'_gsf_seqname'} = $value;
350 }
351 return $obj->{'_gsf_seqname'};
352 }
353
354
355
356 =head2 Proxies
357
358 These functions chain back to the parent for all non sequence related stuff.
359
360
361 =cut
362
363 =head2 primary_tag
364
365 Title : primary_tag
366 Usage : $tag = $feat->primary_tag()
367 Function: Returns the primary tag for a feature,
368 eg 'exon'
369 Returns : a string
370 Args : none
371
372
373 =cut
374
375 sub primary_tag{
376 my ($self,@args) = @_;
377
378 return $self->parent->primary_tag();
379 }
380
381 =head2 source_tag
382
383 Title : source_tag
384 Usage : $tag = $feat->source_tag()
385 Function: Returns the source tag for a feature,
386 eg, 'genscan'
387 Returns : a string
388 Args : none
389
390
391 =cut
392
393 sub source_tag{
394 my ($self) = @_;
395
396 return $self->parent->source_tag();
397 }
398
399
400 =head2 has_tag
401
402 Title : has_tag
403 Usage : $tag_exists = $self->has_tag('some_tag')
404 Function:
405 Returns : TRUE if the specified tag exists, and FALSE otherwise
406 Args :
407
408
409 =cut
410
411 sub has_tag{
412 my ($self,$tag) = @_;
413
414 return $self->parent->has_tag($tag);
415 }
416
417 =head2 each_tag_value
418
419 Title : each_tag_value
420 Usage : @values = $self->each_tag_value('some_tag')
421 Function:
422 Returns : An array comprising the values of the specified tag.
423 Args :
424
425
426 =cut
427
428 sub each_tag_value {
429 my ($self,$tag) = @_;
430
431 return $self->parent->each_tag_value($tag);
432 }
433
434 =head2 all_tags
435
436 Title : all_tags
437 Usage : @tags = $feat->all_tags()
438 Function: gives all tags for this feature
439 Returns : an array of strings
440 Args : none
441
442
443 =cut
444
445 sub all_tags{
446 my ($self) = @_;
447
448 return $self->parent->all_tags();
449 }