comparison variant_effect_predictor/Bio/SeqFeature/Computation.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: Computation.pm,v 1.11 2002/10/22 07:38:41 lapp Exp $
2 #
3 # BioPerl module for Bio::SeqFeature::Generic
4 #
5 # Cared for by mark Fiers <m.w.e.j.fiers@plant.wag-ur.nl>
6 #
7 # Copyright Ewan Birney, Mark Fiers
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::Computation - Computation SeqFeature
16
17 =head1 SYNOPSIS
18
19 $feat = new Bio::SeqFeature::Computation (
20 -start => 10, -end => 100,
21 -strand => -1, -primary => 'repeat',
22 -program_name => 'GeneMark',
23 -program_date => '12-5-2000',
24 -program_version => 'x.y',
25 -database_name => 'Arabidopsis',
26 -database_date => '12-dec-2000',
27 -computation_id => 2231,
28 -score => { no_score => 334 } );
29
30
31 =head1 DESCRIPTION
32
33 Bio::SeqFeature::Computation extends the Generic seqfeature object with
34 a set of computation related fields and a more flexible set of storing
35 more types of score and subseqfeatures. It is compatible with the Generic
36 SeqFeature object.
37
38 The new way of storing score values is similar to the tag structure in the
39 Generic object. For storing sets of subseqfeatures the array containg the
40 subseqfeatures is now a hash which contains arrays of seqfeatures
41 Both the score and subSeqfeature methods can be called in exactly the same
42 way, the value's will be stored as a 'default' score or subseqfeature.
43
44 =cut
45
46 #'
47
48 =head1 FEEDBACK
49
50 =head2 Mailing Lists
51
52 User feedback is an integral part of the evolution of this and other
53 Bioperl modules. Send your comments and suggestions preferably to one
54 of the Bioperl mailing lists. Your participation is much appreciated.
55
56 bioperl-l@bioperl.org - General discussion
57 http://bio.perl.org/MailList.html - About the mailing lists
58
59 =head2 Reporting Bugs
60
61 Report bugs to the Bioperl bug tracking system to help us keep track
62 the bugs and their resolution. Bug reports can be submitted via email
63 or the web:
64
65 bioperl-bugs@bio.perl.org
66 http://bugzilla.bioperl.org/
67
68 =head1 AUTHOR - Ewan Birney, Mark Fiers
69
70 Ewan Birney E<lt>birney@sanger.ac.ukE<gt>
71 Mark Fiers E<lt>m.w.e.j.fiers@plant.wag-ur.nlE<gt>
72
73 =head1 DEVELOPERS
74
75 This class has been written with an eye out of inheritance. The fields
76 the actual object hash are:
77
78 _gsf_sub_hash = reference to a hash containing sets of sub arrays
79 _gsf_score_hash= reference to a hash for the score values
80
81 =head1 APPENDIX
82
83 The rest of the documentation details each of the object
84 methods. Internal methods are usually preceded with a _
85
86 =cut
87
88 # Let the code begin...
89
90 package Bio::SeqFeature::Computation;
91 use vars qw(@ISA);
92 use strict;
93
94 use Bio::Root::Root;
95 use Bio::SeqFeature::Generic;
96
97 @ISA = qw(Bio::SeqFeature::Generic);
98
99 sub new {
100 my ( $class, @args) = @_;
101
102 my $self = $class->SUPER::new(@args);
103
104
105 my ( $computation_id,
106 $program_name, $program_date, $program_version,
107 $database_name, $database_date, $database_version) =
108 $self->_rearrange([qw(COMPUTATION_ID
109 PROGRAM_NAME
110 PROGRAM_DATE
111 PROGRAM_VERSION
112 DATABASE_NAME
113 DATABASE_DATE
114 DATABASE_VERSION
115 )],@args);
116
117 $program_name && $self->program_name($program_name);
118 $program_date && $self->program_date($program_date);
119 $program_version && $self->program_version($program_version);
120 $database_name && $self->database_name($database_name);
121 $database_date && $self->database_date($database_date);
122 $database_version && $self->database_version($database_version);
123 $computation_id && $self->computation_id($computation_id);
124
125 return $self;
126 }
127
128 =head2 has_score
129
130 Title : has_score
131 Usage : $value = $self->has_score('some_score')
132 Function: Tests wether a feature contains a score
133 Returns : TRUE if the SeqFeature has the score,
134 and FALSE otherwise.
135 Args : The name of a score
136
137 =cut
138
139 sub has_score {
140 my ($self, $score) = @_;
141 return undef unless defined $score;
142 return exists $self->{'_gsf_score_hash'}->{$score};
143 }
144
145 =head2 add_score_value
146
147 Title : add_score_value
148 Usage : $self->add_score_value('P_value',224);
149 Returns : TRUE on success
150 Args : score (string) and value (any scalar)
151
152 =cut
153
154 sub add_score_value {
155 my ($self, $score, $value) = @_;
156 if( ! defined $score || ! defined $value ) {
157 $self->warn("must specify a valid $score and $value to add_score_value");
158 return 0;
159 }
160
161 if ( !defined $self->{'_gsf_score_hash'}->{$score} ) {
162 $self->{'_gsf_score_hash'}->{$score} = [];
163 }
164
165 push(@{$self->{'_gsf_score_hash'}->{$score}},$value);
166 }
167
168 =head2 score
169
170 Title : score
171 Usage : $value = $comp_obj->score()
172 $comp_obj->score($value)
173 Function: Returns the 'default' score or sets the 'default' score
174 This method exist for compatibility options
175 It would equal ($comp_obj->each_score_value('default'))[0];
176 Returns : A value
177 Args : (optional) a new value for the 'default' score
178
179 =cut
180
181 sub score {
182 my ($self, $value) = @_;
183 my @v;
184 if (defined $value) {
185
186 if( ref($value) =~ /HASH/i ) {
187 while( my ($t,$val) = each %{ $value } ) {
188 $self->add_score_value($t,$val);
189 }
190 } else {
191 @v = $value;
192 $self->add_score_value('default', $value);
193 }
194
195 } else {
196 @v = $self->each_score_value('default');
197 }
198 return $v[0];
199 }
200
201 =head2 each_score_value
202
203 Title : each_score_value
204 Usage : @values = $gsf->each_score_value('note');
205 Function: Returns a list of all the values stored
206 under a particular score.
207 Returns : A list of scalars
208 Args : The name of the score
209
210 =cut
211
212 sub each_score_value {
213 my ($self, $score) = @_;
214 if ( ! exists $self->{'_gsf_score_hash'}->{$score} ) {
215 $self->warn("asking for score value that does not exist $score");
216 return undef;
217 }
218 return @{$self->{'_gsf_score_hash'}->{$score}};
219 }
220
221
222 =head2 all_scores
223
224 Title : all_scores
225 Usage : @scores = $feat->all_scores()
226 Function: Get a list of all the scores in a feature
227 Returns : An array of score names
228 Args : none
229
230
231 =cut
232
233 sub all_scores {
234 my ($self, @args) = @_;
235
236 return keys %{$self->{'_gsf_score_hash'}};
237 }
238
239
240 =head2 remove_score
241
242 Title : remove_score
243 Usage : $feat->remove_score('some_score')
244 Function: removes a score from this feature
245 Returns : nothing
246 Args : score (string)
247
248
249 =cut
250
251 sub remove_score {
252 my ($self, $score) = @_;
253
254 if ( ! exists $self->{'_gsf_score_hash'}->{$score} ) {
255 $self->warn("trying to remove a score that does not exist: $score");
256 }
257
258 delete $self->{'_gsf_score_hash'}->{$score};
259 }
260
261 =head2 computation_id
262
263 Title : computation_id
264 Usage : $computation_id = $feat->computation_id()
265 $feat->computation_id($computation_id)
266 Function: get/set on program name information
267 Returns : string
268 Args : none if get, the new value if set
269
270
271 =cut
272
273 sub computation_id {
274 my ($self,$value) = @_;
275
276 if (defined($value)) {
277 $self->{'_gsf_computation_id'} = $value;
278 }
279
280 return $self->{'_gsf_computation_id'};
281 }
282
283
284
285
286 =head2 program_name
287
288 Title : program_name
289 Usage : $program_name = $feat->program_name()
290 $feat->program_name($program_name)
291 Function: get/set on program name information
292 Returns : string
293 Args : none if get, the new value if set
294
295
296 =cut
297
298 sub program_name {
299 my ($self,$value) = @_;
300
301 if (defined($value)) {
302 $self->{'_gsf_program_name'} = $value;
303 }
304
305 return $self->{'_gsf_program_name'};
306 }
307
308 =head2 program_date
309
310 Title : program_date
311 Usage : $program_date = $feat->program_date()
312 $feat->program_date($program_date)
313 Function: get/set on program date information
314 Returns : date (string)
315 Args : none if get, the new value if set
316
317
318 =cut
319
320 sub program_date {
321 my ($self,$value) = @_;
322
323 if (defined($value)) {
324 $self->{'_gsf_program_date'} = $value;
325 }
326
327 return $self->{'_gsf_program_date'};
328 }
329
330
331 =head2 program_version
332
333 Title : program_version
334 Usage : $program_version = $feat->program_version()
335 $feat->program_version($program_version)
336 Function: get/set on program version information
337 Returns : date (string)
338 Args : none if get, the new value if set
339
340
341 =cut
342
343 sub program_version {
344 my ($self,$value) = @_;
345
346 if (defined($value)) {
347 $self->{'_gsf_program_version'} = $value;
348 }
349
350 return $self->{'_gsf_program_version'};
351 }
352
353 =head2 database_name
354
355 Title : database_name
356 Usage : $database_name = $feat->database_name()
357 $feat->database_name($database_name)
358 Function: get/set on program name information
359 Returns : string
360 Args : none if get, the new value if set
361
362 =cut
363
364 sub database_name {
365 my ($self,$value) = @_;
366
367 if (defined($value)) {
368 $self->{'_gsf_database_name'} = $value;
369 }
370
371 return $self->{'_gsf_database_name'};
372 }
373
374 =head2 database_date
375
376 Title : database_date
377 Usage : $database_date = $feat->database_date()
378 $feat->database_date($database_date)
379 Function: get/set on program date information
380 Returns : date (string)
381 Args : none if get, the new value if set
382
383
384 =cut
385
386 sub database_date {
387 my ($self,$value) = @_;
388
389 if (defined($value)) {
390 $self->{'_gsf_database_date'} = $value;
391 }
392
393 return $self->{'_gsf_database_date'};
394 }
395
396
397 =head2 database_version
398
399 Title : database_version
400 Usage : $database_version = $feat->database_version()
401 $feat->database_version($database_version)
402 Function: get/set on program version information
403 Returns : date (string)
404 Args : none if get, the new value if set
405
406
407 =cut
408
409 sub database_version {
410 my ($self,$value) = @_;
411
412 if (defined($value)) {
413 $self->{'_gsf_database_version'} = $value;
414 }
415
416 return $self->{'_gsf_database_version'};
417
418 }
419
420 =head2 sub_SeqFeature_type
421
422 Title : sub_SeqFeature_type
423 Usage : $sub_SeqFeature_type = $feat->sub_SeqFeature_type()
424 $feat->sub_SeqFeature_type($sub_SeqFeature_type)
425 Function: sub_SeqFeature_type is automatically set when adding
426 a sub_computation (sub_SeqFeature) to a computation object
427 Returns : sub_SeqFeature_type (string)
428 Args : none if get, the new value if set
429
430 =cut
431
432 sub sub_SeqFeature_type {
433 my ($self, $value) = @_;
434
435 if (defined($value)) {
436 $self->{'_gsf_sub_SeqFeature_type'} = $value;
437 }
438 return $self->{'_gsf_sub_SeqFeature_type'};
439 }
440
441 =head2 all_sub_SeqFeature_types
442
443 Title : all_Sub_SeqFeature_types
444 Usage : @all_sub_seqfeature_types = $comp->all_Sub_SeqFeature_types();
445 Function: Returns an array with all subseqfeature types
446 Returns : An array
447 Args : none
448
449 =cut
450
451 sub all_sub_SeqFeature_types {
452 my ($self) = @_;
453 return keys ( %{$self->{'gsf_sub_hash'}} );
454 }
455
456 =head2 sub_SeqFeature
457
458 Title : sub_SeqFeature('sub_feature_type')
459 Usage : @feats = $feat->sub_SeqFeature();
460 @feats = $feat->sub_SeqFeature('sub_feature_type');
461 Function: Returns an array of sub Sequence Features of a specific
462 type or, if the type is ommited, all sub Sequence Features
463 Returns : An array
464 Args : (optional) a sub_SeqFeature type (ie exon, pattern)
465
466 =cut
467
468 sub sub_SeqFeature {
469 my ($self, $ssf_type) = @_;
470 my (@return_array) = ();
471 if ($ssf_type eq '') {
472 #return all sub_SeqFeatures
473 foreach (keys ( %{$self->{'gsf_sub_hash'}} )){
474 push @return_array, @{$self->{'gsf_sub_hash'}->{$_}};
475 }
476 return @return_array;
477 } else {
478 if (defined ($self->{'gsf_sub_hash'}->{$ssf_type})) {
479 return @{$self->{'gsf_sub_hash'}->{$ssf_type}};
480 } else {
481 $self->warn("$ssf_type is not a valid sub SeqFeature type");
482 }
483 }
484 }
485
486 =head2 add_sub_SeqFeature
487
488 Title : add_sub_SeqFeature
489 Usage : $feat->add_sub_SeqFeature($subfeat);
490 $feat->add_sub_SeqFeature($subfeat,'sub_seqfeature_type')
491 $feat->add_sub_SeqFeature($subfeat,'EXPAND')
492 $feat->add_sub_SeqFeature($subfeat,'EXPAND','sub_seqfeature_type')
493 Function: adds a SeqFeature into a specific subSeqFeature array.
494 with no 'EXPAND' qualifer, subfeat will be tested
495 as to whether it lies inside the parent, and throw
496 an exception if not.
497 If EXPAND is used, the parents start/end/strand will
498 be adjusted so that it grows to accommodate the new
499 subFeature,
500 optionally a sub_seqfeature type can be defined.
501 Returns : nothing
502 Args : An object which has the SeqFeatureI interface
503 : (optional) 'EXPAND'
504 : (optional) 'sub_SeqFeature_type'
505
506 =cut
507
508 sub add_sub_SeqFeature{
509 my ($self,$feat,$var1, $var2) = @_;
510 $var1 = '' unless( defined $var1);
511 $var2 = '' unless( defined $var2);
512 my ($expand, $ssf_type) = ('', $var1 . $var2);
513 $expand = 'EXPAND' if ($ssf_type =~ s/EXPAND//);
514
515 if ( !$feat->isa('Bio::SeqFeatureI') ) {
516 $self->warn("$feat does not implement Bio::SeqFeatureI. Will add it anyway, but beware...");
517 }
518
519 if($expand eq 'EXPAND') {
520 $self->_expand_region($feat);
521 } else {
522 if ( !$self->contains($feat) ) {
523 $self->throw("$feat is not contained within parent feature, and expansion is not valid");
524 }
525 }
526
527 $ssf_type = 'default' if ($ssf_type eq '');
528
529 if (!(defined ($self->{'gsf_sub_hash'}->{$ssf_type}))) {
530 @{$self->{'gsf_sub_hash'}->{$ssf_type}} = ();
531 }
532 $feat->sub_SeqFeature_type($ssf_type);
533 push @{$self->{'gsf_sub_hash'}->{$ssf_type}}, $feat;
534 }
535
536 =head2 flush_sub_SeqFeature
537
538 Title : flush_sub_SeqFeature
539 Usage : $sf->flush_sub_SeqFeature
540 $sf->flush_sub_SeqFeature('sub_SeqFeature_type');
541 Function: Removes all sub SeqFeature or all sub SeqFeatures
542 of a specified type
543 (if you want to remove a more specific subset, take
544 an array of them all, flush them, and add
545 back only the guys you want)
546 Example :
547 Returns : none
548 Args : none
549
550
551 =cut
552
553 sub flush_sub_SeqFeature {
554 my ($self, $ssf_type) = @_;
555 if ($ssf_type) {
556 if ((defined ($self->{'gsf_sub_hash'}->{$ssf_type}))) {
557 delete $self->{'gsf_sub_hash'}->{$ssf_type};
558 } else {
559 $self->warn("$ssf_type is not a valid sub SeqFeature type");
560 }
561 } else {
562 $self->{'_gsf_sub_hash'} = {}; # zap the complete hash implicitly.
563 }
564 }
565
566
567
568 1;