comparison variant_effect_predictor/Bio/Annotation/Collection.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: Collection.pm,v 1.16 2002/11/22 22:48:25 birney Exp $
2
3 #
4 # BioPerl module for Bio::Annotation::Collection.pm
5 #
6 # Cared for by Ewan Birney <birney@ebi.ac.uk>
7 #
8 # Copyright Ewan Birney
9 #
10 # You may distribute this module under the same terms as perl itself
11
12 # POD documentation - main docs before the code
13
14 =head1 NAME
15
16 Bio::Annotation::Collection - Default Perl implementation of AnnotationCollectionI
17
18 =head1 SYNOPSIS
19
20 # get an AnnotationCollectionI somehow, eg
21
22 $ac = $seq->annotation();
23
24 foreach $key ( $ac->get_all_annotation_keys() ) {
25 @values = $ac->get_Annotations($key);
26 foreach $value ( @values ) {
27 # value is an Bio::AnnotationI, and defines a "as_text" method
28 print "Annotation ",$key," stringified value ",$value->as_text,"\n";
29
30 # also defined hash_tree method, which allows data orientated
31 # access into this object
32 $hash = $value->hash_tree();
33 }
34 }
35
36 =head1 DESCRIPTION
37
38 Bioperl implementation for Bio::AnnotationCollecitonI
39
40 =head1 FEEDBACK
41
42 =head2 Mailing Lists
43
44 User feedback is an integral part of the evolution of this and other
45 Bioperl modules. Send your comments and suggestions preferably to one
46 of the Bioperl mailing lists. Your participation is much appreciated.
47
48 bioperl-l@bioperl.org - General discussion
49 http://bio.perl.org/MailList.html - About the mailing lists
50
51 =head2 Reporting Bugs
52
53 Report bugs to the Bioperl bug tracking system to help us keep track
54 the bugs and their resolution. Bug reports can be submitted via email
55 or the web:
56
57 bioperl-bugs@bioperl.org
58 http://bugzilla.bioperl.org/
59
60 =head1 AUTHOR - Ewan Birney
61
62 Email birney@ebi.ac.uk
63
64 =head1 APPENDIX
65
66 The rest of the documentation details each of the object
67 methods. Internal methods are usually preceded with a _
68
69 =cut
70
71
72 # Let the code begin...
73
74
75 package Bio::Annotation::Collection;
76
77 use vars qw(@ISA);
78 use strict;
79
80 # Object preamble - inherits from Bio::Root::Root
81
82 use Bio::AnnotationCollectionI;
83 use Bio::AnnotationI;
84 use Bio::Root::Root;
85 use Bio::Annotation::TypeManager;
86 use Bio::Annotation::SimpleValue;
87
88
89 @ISA = qw(Bio::Root::Root Bio::AnnotationCollectionI Bio::AnnotationI);
90
91
92 =head2 new
93
94 Title : new
95 Usage : $coll = Bio::Annotation::Collection->new()
96 Function: Makes a new Annotation::Collection object.
97 Returns : Bio::Annotation::Collection
98 Args : none
99
100 =cut
101
102 sub new{
103 my ($class,@args) = @_;
104
105 my $self = $class->SUPER::new(@args);
106
107 $self->{'_annotation'} = {};
108 $self->_typemap(Bio::Annotation::TypeManager->new());
109
110 return $self;
111 }
112
113
114 =head1 L<Bio::AnnotationCollectionI> implementing methods
115
116 =cut
117
118 =head2 get_all_annotation_keys
119
120 Title : get_all_annotation_keys
121 Usage : $ac->get_all_annotation_keys()
122 Function: gives back a list of annotation keys, which are simple text strings
123 Returns : list of strings
124 Args : none
125
126 =cut
127
128 sub get_all_annotation_keys{
129 my ($self) = @_;
130 return keys %{$self->{'_annotation'}};
131 }
132
133 =head2 get_Annotations
134
135 Title : get_Annotations
136 Usage : my @annotations = $collection->get_Annotations('key')
137 Function: Retrieves all the Bio::AnnotationI objects for one or more
138 specific key(s).
139
140 If no key is given, returns all annotation objects.
141
142 The returned objects will have their tagname() attribute set to
143 the key under which they were attached, unless the tagname was
144 already set.
145
146 Returns : list of Bio::AnnotationI - empty if no objects stored for a key
147 Args : keys (list of strings) for annotations (optional)
148
149 =cut
150
151 sub get_Annotations{
152 my ($self,@keys) = @_;
153
154 my @anns = ();
155 @keys = $self->get_all_annotation_keys() unless @keys;
156 foreach my $key (@keys) {
157 if(exists($self->{'_annotation'}->{$key})) {
158 push(@anns,
159 map {
160 $_->tagname($key) if ! $_->tagname(); $_;
161 } @{$self->{'_annotation'}->{$key}});
162 }
163 }
164 return @anns;
165 }
166
167 =head2 get_all_Annotations
168
169 Title : get_all_Annotations
170 Usage :
171 Function: Similar to get_Annotations, but traverses and flattens nested
172 annotation collections. This means that collections in the
173 tree will be replaced by their components.
174
175 Keys will not be passed on to nested collections. I.e., if the
176 tag name of a nested collection matches the key, it will be
177 flattened in its entirety.
178
179 Hence, for un-nested annotation collections this will be identical
180 to get_Annotations.
181 Example :
182 Returns : an array of L<Bio::AnnotationI> compliant objects
183 Args : keys (list of strings) for annotations (optional)
184
185
186 =cut
187
188 sub get_all_Annotations{
189 my ($self,@keys) = @_;
190
191 return map {
192 $_->isa("Bio::AnnotationCollectionI") ?
193 $_->get_all_Annotations() : $_;
194 } $self->get_Annotations(@keys);
195 }
196
197 =head2 get_num_of_annotations
198
199 Title : get_num_of_annotations
200 Usage : my $count = $collection->get_num_of_annotations()
201 Function: Returns the count of all annotations stored in this collection
202 Returns : integer
203 Args : none
204
205
206 =cut
207
208 sub get_num_of_annotations{
209 my ($self) = @_;
210 my $count = 0;
211 map { $count += scalar @$_ } values %{$self->{'_annotation'}};
212 return $count;
213 }
214
215 =head1 Implementation specific functions - mainly for adding
216
217 =cut
218
219 =head2 add_Annotation
220
221 Title : add_Annotation
222 Usage : $self->add_Annotation('reference',$object);
223 $self->add_Annotation($object,'Bio::MyInterface::DiseaseI');
224 $self->add_Annotation($object);
225 $self->add_Annotation('disease',$object,'Bio::MyInterface::DiseaseI');
226 Function: Adds an annotation for a specific key.
227
228 If the key is omitted, the object to be added must provide a value
229 via its tagname().
230
231 If the archetype is provided, this and future objects added under
232 that tag have to comply with the archetype and will be rejected
233 otherwise.
234
235 Returns : none
236 Args : annotation key ('disease', 'dblink', ...)
237 object to store (must be Bio::AnnotationI compliant)
238 [optional] object archetype to map future storage of object
239 of these types to
240
241 =cut
242
243 sub add_Annotation{
244 my ($self,$key,$object,$archetype) = @_;
245
246 # if there's no key we use the tagname() as key
247 if(ref($key) && $key->isa("Bio::AnnotationI") &&
248 (! ($object && ref($object)))) {
249 $archetype = $object if $object;
250 $object = $key;
251 $key = $object->tagname();
252 $key = $key->name() if $key && ref($key); # OntologyTermI
253 $self->throw("Annotation object must have a tagname if key omitted")
254 unless $key;
255 }
256
257 if( !defined $object ) {
258 $self->throw("Must have at least key and object in add_Annotation");
259 }
260
261 if( !ref $object ) {
262 $self->throw("Must add an object. Use Bio::Annotation::{Comment,SimpleValue,OntologyTerm} for simple text additions");
263 }
264
265 if( !$object->isa("Bio::AnnotationI") ) {
266 $self->throw("object must be AnnotationI compliant, otherwise we wont add it!");
267 }
268
269 # ok, now we are ready! If we don't have an archetype, set it
270 # from the type of the object
271
272 if( !defined $archetype ) {
273 $archetype = ref $object;
274 }
275
276 # check typemap, storing if needed.
277 my $stored_map = $self->_typemap->type_for_key($key);
278
279 if( defined $stored_map ) {
280 # check validity, irregardless of archetype. A little cheeky
281 # this means isa stuff is executed correctly
282
283 if( !$self->_typemap()->is_valid($key,$object) ) {
284 $self->throw("Object $object was not valid with key $key. If you were adding new keys in, perhaps you want to make use of the archetype method to allow registration to a more basic type");
285 }
286 } else {
287 $self->_typemap->_add_type_map($key,$archetype);
288 }
289
290 # we are ok to store
291
292 if( !defined $self->{'_annotation'}->{$key} ) {
293 $self->{'_annotation'}->{$key} = [];
294 }
295
296 push(@{$self->{'_annotation'}->{$key}},$object);
297
298 return 1;
299 }
300
301 =head2 remove_Annotations
302
303 Title : remove_Annotations
304 Usage :
305 Function: Remove the annotations for the specified key from this collection.
306 Example :
307 Returns : an array Bio::AnnotationI compliant objects which were stored
308 under the given key(s)
309 Args : the key(s) (tag name(s), one or more strings) for which to
310 remove annotations (optional; if none given, flushes all
311 annotations)
312
313
314 =cut
315
316 sub remove_Annotations{
317 my ($self, @keys) = @_;
318
319 @keys = $self->get_all_annotation_keys() unless @keys;
320 my @anns = $self->get_Annotations(@keys);
321 # flush
322 foreach (@keys) {
323 delete $self->{'_annotation'}->{$_};
324 }
325 return @anns;
326 }
327
328 =head2 flatten_Annotations
329
330 Title : flatten_Annotations
331 Usage :
332 Function: Flattens part or all of the annotations in this collection.
333
334 This is a convenience method for getting the flattened
335 annotation for the given keys, removing the annotation for
336 those keys, and adding back the flattened array.
337
338 This should not change anything for un-nested collections.
339 Example :
340 Returns : an array Bio::AnnotationI compliant objects which were stored
341 under the given key(s)
342 Args : list of keys (strings) the annotation for which to flatten,
343 defaults to all keys if not given
344
345
346 =cut
347
348 sub flatten_Annotations{
349 my ($self,@keys) = @_;
350
351 my @anns = $self->get_all_Annotations(@keys);
352 my @origanns = $self->remove_Annotations(@keys);
353 foreach (@anns) {
354 $self->add_Annotation($_);
355 }
356 return @origanns;
357 }
358
359 =head1 Bio::AnnotationI methods implementations
360
361 This is to allow nested annotation: you can a collection as an
362 annotation object to an annotation collection.
363
364 =cut
365
366 =head2 as_text
367
368 Title : as_text
369 Usage :
370 Function: See L<Bio::AnnotationI>
371 Example :
372 Returns : a string
373 Args : none
374
375
376 =cut
377
378 sub as_text{
379 my $self = shift;
380
381 my $txt = "Collection consisting of ";
382 my @texts = ();
383 foreach my $ann ($self->get_Annotations()) {
384 push(@texts, $ann->as_text());
385 }
386 if(@texts) {
387 $txt .= join(", ", map { '['.$_.']'; } @texts);
388 } else {
389 $txt .= "no elements";
390 }
391 return $txt;
392 }
393
394 =head2 hash_tree
395
396 Title : hash_tree
397 Usage :
398 Function: See L<Bio::AnnotationI>
399 Example :
400 Returns : a hash reference
401 Args : none
402
403
404 =cut
405
406 sub hash_tree{
407 my $self = shift;
408 my $tree = {};
409
410 foreach my $key ($self->get_all_annotation_keys()) {
411 # all contained objects will support hash_tree()
412 # (they are AnnotationIs)
413 $tree->{$key} = [$self->get_Annotations($key)];
414 }
415 return $tree;
416 }
417
418 =head2 tagname
419
420 Title : tagname
421 Usage : $obj->tagname($newval)
422 Function: Get/set the tagname for this annotation value.
423
424 Setting this is optional. If set, it obviates the need to
425 provide a tag to Bio::AnnotationCollectionI when adding
426 this object. When obtaining an AnnotationI object from the
427 collection, the collection will set the value to the tag
428 under which it was stored unless the object has a tag
429 stored already.
430
431 Example :
432 Returns : value of tagname (a scalar)
433 Args : new value (a scalar, optional)
434
435
436 =cut
437
438 sub tagname{
439 my $self = shift;
440
441 return $self->{'tagname'} = shift if @_;
442 return $self->{'tagname'};
443 }
444
445
446 =head1 Backward compatible functions
447
448 Functions put in for backward compatibility with old
449 Bio::Annotation.pm stuff
450
451 =cut
452
453 =head2 description
454
455 Title : description
456 Usage :
457 Function:
458 Example :
459 Returns :
460 Args :
461
462
463 =cut
464
465 sub description{
466 my ($self,$value) = @_;
467
468 $self->deprecated("Using old style annotation call on new Annotation::Collection object");
469
470 if( defined $value ) {
471 my $val = Bio::Annotation::SimpleValue->new();
472 $val->value($value);
473 $self->add_Annotation('description',$val);
474 }
475
476 my ($desc) = $self->get_Annotations('description');
477
478 # If no description tag exists, do not attempt to call value on undef:
479 return $desc ? $desc->value : undef;
480 }
481
482
483 =head2 add_gene_name
484
485 Title : add_gene_name
486 Usage :
487 Function:
488 Example :
489 Returns :
490 Args :
491
492
493 =cut
494
495 sub add_gene_name{
496 my ($self,$value) = @_;
497
498 $self->deprecated("Old style add_gene_name called on new style Annotation::Collection");
499
500 my $val = Bio::Annotation::SimpleValue->new();
501 $val->value($value);
502 $self->add_Annotation('gene_name',$val);
503 }
504
505 =head2 each_gene_name
506
507 Title : each_gene_name
508 Usage :
509 Function:
510 Example :
511 Returns :
512 Args :
513
514
515 =cut
516
517 sub each_gene_name{
518 my ($self) = @_;
519
520 $self->deprecated("Old style each_gene_name called on new style Annotation::Collection");
521
522 my @out;
523 my @gene = $self->get_Annotations('gene_name');
524
525 foreach my $g ( @gene ) {
526 push(@out,$g->value);
527 }
528
529 return @out;
530 }
531
532 =head2 add_Reference
533
534 Title : add_Reference
535 Usage :
536 Function:
537 Example :
538 Returns :
539 Args :
540
541
542 =cut
543
544 sub add_Reference{
545 my ($self, @values) = @_;
546
547 $self->deprecated("add_Reference (old style Annotation) on new style Annotation::Collection");
548
549 # Allow multiple (or no) references to be passed, as per old method
550 foreach my $value (@values) {
551 $self->add_Annotation('reference',$value);
552 }
553 }
554
555 =head2 each_Reference
556
557 Title : each_Reference
558 Usage :
559 Function:
560 Example :
561 Returns :
562 Args :
563
564
565 =cut
566
567 sub each_Reference{
568 my ($self) = @_;
569
570 $self->deprecated("each_Reference (old style Annotation) on new style Annotation::Collection");
571
572 return $self->get_Annotations('reference');
573 }
574
575
576 =head2 add_Comment
577
578 Title : add_Comment
579 Usage :
580 Function:
581 Example :
582 Returns :
583 Args :
584
585
586 =cut
587
588 sub add_Comment{
589 my ($self,$value) = @_;
590
591 $self->deprecated("add_Comment (old style Annotation) on new style Annotation::Collection");
592
593 $self->add_Annotation('comment',$value);
594
595 }
596
597 =head2 each_Comment
598
599 Title : each_Comment
600 Usage :
601 Function:
602 Example :
603 Returns :
604 Args :
605
606
607 =cut
608
609 sub each_Comment{
610 my ($self) = @_;
611
612 $self->deprecated("each_Comment (old style Annotation) on new style Annotation::Collection");
613
614 return $self->get_Annotations('comment');
615 }
616
617
618
619 =head2 add_DBLink
620
621 Title : add_DBLink
622 Usage :
623 Function:
624 Example :
625 Returns :
626 Args :
627
628
629 =cut
630
631 sub add_DBLink{
632 my ($self,$value) = @_;
633
634 $self->deprecated("add_DBLink (old style Annotation) on new style Annotation::Collection");
635
636 $self->add_Annotation('dblink',$value);
637
638 }
639
640 =head2 each_DBLink
641
642 Title : each_DBLink
643 Usage :
644 Function:
645 Example :
646 Returns :
647 Args :
648
649
650 =cut
651
652 sub each_DBLink{
653 my ($self) = @_;
654
655 $self->deprecated("each_DBLink (old style Annotation) on new style Annotation::Collection - use get_Annotations('dblink')");
656
657 return $self->get_Annotations('dblink');
658 }
659
660
661
662 =head1 Implementation management functions
663
664 =cut
665
666 =head2 _typemap
667
668 Title : _typemap
669 Usage : $obj->_typemap($newval)
670 Function:
671 Example :
672 Returns : value of _typemap
673 Args : newvalue (optional)
674
675
676 =cut
677
678 sub _typemap{
679 my ($self,$value) = @_;
680 if( defined $value) {
681 $self->{'_typemap'} = $value;
682 }
683 return $self->{'_typemap'};
684
685 }
686
687 1;