Mercurial > repos > mahtabm > ensembl
diff variant_effect_predictor/Bio/Annotation/StructuredValue.pm @ 0:1f6dce3d34e0
Uploaded
author | mahtabm |
---|---|
date | Thu, 11 Apr 2013 02:01:53 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/variant_effect_predictor/Bio/Annotation/StructuredValue.pm Thu Apr 11 02:01:53 2013 -0400 @@ -0,0 +1,352 @@ +# $Id: StructuredValue.pm,v 1.2 2002/10/22 07:38:26 lapp Exp $ +# +# BioPerl module for Bio::Annotation::StructuredValue +# +# Cared for by Hilmar Lapp <hlapp at gmx.net> +# + +# +# (c) Hilmar Lapp, hlapp at gmx.net, 2002. +# (c) GNF, Genomics Institute of the Novartis Research Foundation, 2002. +# +# You may distribute this module under the same terms as perl itself. +# Refer to the Perl Artistic License (see the license accompanying this +# software package, or see http://www.perl.com/language/misc/Artistic.html) +# for the terms under which you may use, modify, and redistribute this module. +# +# THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +# MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. +# + +# POD documentation - main docs before the code + +=head1 NAME + +Bio::Annotation::StructuredValue - A scalar with embedded structured + information + +=head1 SYNOPSIS + + use Bio::Annotation::StructuredValue; + use Bio::Annotation::Collection; + + my $col = new Bio::Annotation::Collection; + my $sv = new Bio::Annotation::StructuredValue(-value => 'someval'); + $col->add_Annotation('tagname', $sv); + +=head1 DESCRIPTION + +Scalar value annotation object + +=head1 FEEDBACK + +=head2 Mailing Lists + +User feedback is an integral part of the evolution of this and other +Bioperl modules. Send your comments and suggestions preferably to one +of the Bioperl mailing lists. Your participation is much appreciated. + + bioperl-l@bioperl.org - General discussion + http://bio.perl.org/MailList.html - About the mailing lists + +=head2 Reporting Bugs + +Report bugs to the Bioperl bug tracking system to help us keep track +the bugs and their resolution. Bug reports can be submitted via email +or the web: + + bioperl-bugs@bioperl.org + http://bugzilla.bioperl.org/ + +=head1 AUTHOR - bioperl + +Email bioperl-l@bio.perl.org + +Describe contact details here + +=head1 APPENDIX + +The rest of the documentation details each of the object methods. Internal methods are usually preceded with a _ + +=cut + + +# Let the code begin... + + +package Bio::Annotation::StructuredValue; +use vars qw(@ISA); +use strict; + +# Object preamble - inherits from Bio::Root::Root + +use Bio::AnnotationI; +use Bio::Annotation::SimpleValue; + +@ISA = qw(Bio::Annotation::SimpleValue); + +=head2 new + + Title : new + Usage : my $sv = new Bio::Annotation::StructuredValue; + Function: Instantiate a new StructuredValue object + Returns : Bio::Annotation::StructuredValue object + Args : -value => $value to initialize the object data field [optional] + -tagname => $tag to initialize the tagname [optional] + +=cut + +sub new{ + my ($class,@args) = @_; + + my $self = $class->SUPER::new(@args); + + my ($value,$tag) = $self->_rearrange([qw(VALUE TAGNAME)], @args); + + $self->{'values'} = []; + defined $value && $self->value($value); + defined $tag && $self->tagname($tag); + + return $self; +} + + +=head1 AnnotationI implementing functions + +=cut + +=head2 as_text + + Title : as_text + Usage : my $text = $obj->as_text + Function: return the string "Value: $v" where $v is the value + Returns : string + Args : none + + +=cut + +sub as_text{ + my ($self) = @_; + + return "Value: ".$self->value; +} + +=head2 hash_tree + + Title : hash_tree + Usage : my $hashtree = $value->hash_tree + Function: For supporting the AnnotationI interface just returns the value + as a hashref with the key 'value' pointing to the value + Returns : hashrf + Args : none + + +=cut + +sub hash_tree{ + my ($self) = @_; + + my $h = {}; + $h->{'value'} = $self->value; +} + +=head2 tagname + + Title : tagname + Usage : $obj->tagname($newval) + Function: Get/set the tagname for this annotation value. + + Setting this is optional. If set, it obviates the need to provide + a tag to AnnotationCollection when adding this object. + Example : + Returns : value of tagname (a scalar) + Args : new value (a scalar, optional) + + +=cut + +sub tagname{ + my ($self,$value) = @_; + if( defined $value) { + $self->{'tagname'} = $value; + } + return $self->{'tagname'}; +} + + +=head1 Specific accessors for StructuredValue + +=cut + +=head2 value + + Title : value + Usage : $obj->value($newval) + Function: Get/set the value for this annotation. + + Set mode is here only to retain compatibility with + SimpleValue. It is equivalent to calling + add_value([0], $newval). + + In get mode, this implementation allows to pass additional + parameters that control how the structured annotation + components will be joined together to form a + string. Recognized are presently + -joins a reference to an array of join strings, the + elements at index i applying to joining + annotations at dimension i. The last element + will be re-used for dimensions higher than i. + Defaults to ['; ']. + -brackets a reference to an array of two strings + denoting the opening and closing brackets for + the elements of one dimension, if there is + more than one element in the dimension. + Defaults to ['(',')']. + + Returns : value of value + Args : newvalue (optional) + + +=cut + +sub value{ + my ($self,$value,@args) = @_; + + # set mode? + return $self->add_value([0], $value) if defined($value) && (@args == 0); + # no, get mode + # determine joins and brackets + unshift(@args, $value); + my ($joins, $brackets) = + $self->_rearrange([qw(JOINS BRACKETS)], @args); + $joins = ['; '] unless $joins; + $brackets = ['(', ')'] unless $brackets; + my $txt = &_to_text($self->{'values'}, $joins, $brackets); + # if there's only brackets at the start and end, remove them + if((@{$self->{'values'}} == 1) && + (length($brackets->[0]) == 1) && (length($brackets->[1]) == 1)) { + my $re = '\\'.$brackets->[0]. + '([^\\'.$brackets->[1].']*)\\'.$brackets->[1]; + $txt =~ s/^$re$/$1/; + } + return $txt; +} + +sub _to_text{ + my ($arr, $joins, $brackets, $rec_n) = @_; + + $rec_n = 0 unless defined($rec_n); + my $i = $rec_n >= @$joins ? @$joins-1 : $rec_n; + my $txt = join($joins->[$i], + map { + ref($_) ? + (ref($_) eq "ARRAY" ? + &_to_text($_, $joins, $brackets, $rec_n+1) : + $_->value()) : + $_; + } @$arr); + if($rec_n && (@$arr > 1)) { + $txt = $brackets->[0] . $txt . $brackets->[1]; + } + return $txt; +} + +=head2 get_values + + Title : get_values + Usage : + Function: Get the top-level array of values. Each of the elements will + recursively be a reference to an array or a scalar, depending + on the depth of this structured value annotation. + Example : + Returns : an array + Args : none + + +=cut + +sub get_values{ + my $self = shift; + + return @{$self->{'values'}}; +} + +=head2 get_all_values + + Title : get_all_values + Usage : + Function: Flattens all values in this structured annotation and + returns them as an array. + Example : + Returns : the (flat) array of values + Args : none + + +=cut + +sub get_all_values{ + my ($self) = @_; + + # we code lazy here and just take advantage of value() + my $txt = $self->value(-joins => ['@!@'], -brackets => ['','']); + return split(/\@!\@/, $txt); +} + +=head2 add_value + + Title : add_value + Usage : + Function: Adds the given value to the structured annotation at the + given index. + + The index is multi-dimensional, with the first dimension + applying to the first level, and so forth. If a particular + dimension or a particular index does not exist yet, it will + be created. If it does exist and adding the value would + mean replacing a scalar with an array reference, we throw + an exception to prevent unintended damage. An index of -1 + at any dimension means append. + + If an array of values is to be added, it will create an + additional dimension at the index specified, unless the + last index value is -1, in which case they will all be + appended to the last dimension. + + Example : + Returns : none + Args : the index at which to add (a reference to an array) + the value(s) to add + + +=cut + +sub add_value{ + my ($self,$index,@values) = @_; + + my $tree = $self->{'values'}; + my $lastidx = pop(@$index); + foreach my $i (@$index) { + if($i < 0) { + my $subtree = []; + push(@$tree, $subtree); + $tree = $subtree; + } elsif((! $tree->[$i]) || (ref($tree->[$i]) eq "ARRAY")) { + $tree->[$i] = [] unless ref($tree->[$i]) eq "ARRAY"; + $tree = $tree->[$i]; + } else { + $self->throw("element $i is a scalar but not in last dimension"); + } + } + if($lastidx < 0) { + push(@$tree, @values); + } elsif(@values < 2) { + $tree->[$lastidx] = shift(@values); + } else { + $tree->[$lastidx] = [@values]; + } + +} + +1;