comparison variant_effect_predictor/Bio/Annotation/StructuredValue.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: StructuredValue.pm,v 1.2 2002/10/22 07:38:26 lapp Exp $
2 #
3 # BioPerl module for Bio::Annotation::StructuredValue
4 #
5 # Cared for by Hilmar Lapp <hlapp at gmx.net>
6 #
7
8 #
9 # (c) Hilmar Lapp, hlapp at gmx.net, 2002.
10 # (c) GNF, Genomics Institute of the Novartis Research Foundation, 2002.
11 #
12 # You may distribute this module under the same terms as perl itself.
13 # Refer to the Perl Artistic License (see the license accompanying this
14 # software package, or see http://www.perl.com/language/misc/Artistic.html)
15 # for the terms under which you may use, modify, and redistribute this module.
16 #
17 # THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
18 # WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
19 # MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
20 #
21
22 # POD documentation - main docs before the code
23
24 =head1 NAME
25
26 Bio::Annotation::StructuredValue - A scalar with embedded structured
27 information
28
29 =head1 SYNOPSIS
30
31 use Bio::Annotation::StructuredValue;
32 use Bio::Annotation::Collection;
33
34 my $col = new Bio::Annotation::Collection;
35 my $sv = new Bio::Annotation::StructuredValue(-value => 'someval');
36 $col->add_Annotation('tagname', $sv);
37
38 =head1 DESCRIPTION
39
40 Scalar value annotation object
41
42 =head1 FEEDBACK
43
44 =head2 Mailing Lists
45
46 User feedback is an integral part of the evolution of this and other
47 Bioperl modules. Send your comments and suggestions preferably to one
48 of the Bioperl mailing lists. Your participation is much appreciated.
49
50 bioperl-l@bioperl.org - General discussion
51 http://bio.perl.org/MailList.html - About the mailing lists
52
53 =head2 Reporting Bugs
54
55 Report bugs to the Bioperl bug tracking system to help us keep track
56 the bugs and their resolution. Bug reports can be submitted via email
57 or the web:
58
59 bioperl-bugs@bioperl.org
60 http://bugzilla.bioperl.org/
61
62 =head1 AUTHOR - bioperl
63
64 Email bioperl-l@bio.perl.org
65
66 Describe contact details here
67
68 =head1 APPENDIX
69
70 The rest of the documentation details each of the object methods. Internal methods are usually preceded with a _
71
72 =cut
73
74
75 # Let the code begin...
76
77
78 package Bio::Annotation::StructuredValue;
79 use vars qw(@ISA);
80 use strict;
81
82 # Object preamble - inherits from Bio::Root::Root
83
84 use Bio::AnnotationI;
85 use Bio::Annotation::SimpleValue;
86
87 @ISA = qw(Bio::Annotation::SimpleValue);
88
89 =head2 new
90
91 Title : new
92 Usage : my $sv = new Bio::Annotation::StructuredValue;
93 Function: Instantiate a new StructuredValue object
94 Returns : Bio::Annotation::StructuredValue object
95 Args : -value => $value to initialize the object data field [optional]
96 -tagname => $tag to initialize the tagname [optional]
97
98 =cut
99
100 sub new{
101 my ($class,@args) = @_;
102
103 my $self = $class->SUPER::new(@args);
104
105 my ($value,$tag) = $self->_rearrange([qw(VALUE TAGNAME)], @args);
106
107 $self->{'values'} = [];
108 defined $value && $self->value($value);
109 defined $tag && $self->tagname($tag);
110
111 return $self;
112 }
113
114
115 =head1 AnnotationI implementing functions
116
117 =cut
118
119 =head2 as_text
120
121 Title : as_text
122 Usage : my $text = $obj->as_text
123 Function: return the string "Value: $v" where $v is the value
124 Returns : string
125 Args : none
126
127
128 =cut
129
130 sub as_text{
131 my ($self) = @_;
132
133 return "Value: ".$self->value;
134 }
135
136 =head2 hash_tree
137
138 Title : hash_tree
139 Usage : my $hashtree = $value->hash_tree
140 Function: For supporting the AnnotationI interface just returns the value
141 as a hashref with the key 'value' pointing to the value
142 Returns : hashrf
143 Args : none
144
145
146 =cut
147
148 sub hash_tree{
149 my ($self) = @_;
150
151 my $h = {};
152 $h->{'value'} = $self->value;
153 }
154
155 =head2 tagname
156
157 Title : tagname
158 Usage : $obj->tagname($newval)
159 Function: Get/set the tagname for this annotation value.
160
161 Setting this is optional. If set, it obviates the need to provide
162 a tag to AnnotationCollection when adding this object.
163 Example :
164 Returns : value of tagname (a scalar)
165 Args : new value (a scalar, optional)
166
167
168 =cut
169
170 sub tagname{
171 my ($self,$value) = @_;
172 if( defined $value) {
173 $self->{'tagname'} = $value;
174 }
175 return $self->{'tagname'};
176 }
177
178
179 =head1 Specific accessors for StructuredValue
180
181 =cut
182
183 =head2 value
184
185 Title : value
186 Usage : $obj->value($newval)
187 Function: Get/set the value for this annotation.
188
189 Set mode is here only to retain compatibility with
190 SimpleValue. It is equivalent to calling
191 add_value([0], $newval).
192
193 In get mode, this implementation allows to pass additional
194 parameters that control how the structured annotation
195 components will be joined together to form a
196 string. Recognized are presently
197 -joins a reference to an array of join strings, the
198 elements at index i applying to joining
199 annotations at dimension i. The last element
200 will be re-used for dimensions higher than i.
201 Defaults to ['; '].
202 -brackets a reference to an array of two strings
203 denoting the opening and closing brackets for
204 the elements of one dimension, if there is
205 more than one element in the dimension.
206 Defaults to ['(',')'].
207
208 Returns : value of value
209 Args : newvalue (optional)
210
211
212 =cut
213
214 sub value{
215 my ($self,$value,@args) = @_;
216
217 # set mode?
218 return $self->add_value([0], $value) if defined($value) && (@args == 0);
219 # no, get mode
220 # determine joins and brackets
221 unshift(@args, $value);
222 my ($joins, $brackets) =
223 $self->_rearrange([qw(JOINS BRACKETS)], @args);
224 $joins = ['; '] unless $joins;
225 $brackets = ['(', ')'] unless $brackets;
226 my $txt = &_to_text($self->{'values'}, $joins, $brackets);
227 # if there's only brackets at the start and end, remove them
228 if((@{$self->{'values'}} == 1) &&
229 (length($brackets->[0]) == 1) && (length($brackets->[1]) == 1)) {
230 my $re = '\\'.$brackets->[0].
231 '([^\\'.$brackets->[1].']*)\\'.$brackets->[1];
232 $txt =~ s/^$re$/$1/;
233 }
234 return $txt;
235 }
236
237 sub _to_text{
238 my ($arr, $joins, $brackets, $rec_n) = @_;
239
240 $rec_n = 0 unless defined($rec_n);
241 my $i = $rec_n >= @$joins ? @$joins-1 : $rec_n;
242 my $txt = join($joins->[$i],
243 map {
244 ref($_) ?
245 (ref($_) eq "ARRAY" ?
246 &_to_text($_, $joins, $brackets, $rec_n+1) :
247 $_->value()) :
248 $_;
249 } @$arr);
250 if($rec_n && (@$arr > 1)) {
251 $txt = $brackets->[0] . $txt . $brackets->[1];
252 }
253 return $txt;
254 }
255
256 =head2 get_values
257
258 Title : get_values
259 Usage :
260 Function: Get the top-level array of values. Each of the elements will
261 recursively be a reference to an array or a scalar, depending
262 on the depth of this structured value annotation.
263 Example :
264 Returns : an array
265 Args : none
266
267
268 =cut
269
270 sub get_values{
271 my $self = shift;
272
273 return @{$self->{'values'}};
274 }
275
276 =head2 get_all_values
277
278 Title : get_all_values
279 Usage :
280 Function: Flattens all values in this structured annotation and
281 returns them as an array.
282 Example :
283 Returns : the (flat) array of values
284 Args : none
285
286
287 =cut
288
289 sub get_all_values{
290 my ($self) = @_;
291
292 # we code lazy here and just take advantage of value()
293 my $txt = $self->value(-joins => ['@!@'], -brackets => ['','']);
294 return split(/\@!\@/, $txt);
295 }
296
297 =head2 add_value
298
299 Title : add_value
300 Usage :
301 Function: Adds the given value to the structured annotation at the
302 given index.
303
304 The index is multi-dimensional, with the first dimension
305 applying to the first level, and so forth. If a particular
306 dimension or a particular index does not exist yet, it will
307 be created. If it does exist and adding the value would
308 mean replacing a scalar with an array reference, we throw
309 an exception to prevent unintended damage. An index of -1
310 at any dimension means append.
311
312 If an array of values is to be added, it will create an
313 additional dimension at the index specified, unless the
314 last index value is -1, in which case they will all be
315 appended to the last dimension.
316
317 Example :
318 Returns : none
319 Args : the index at which to add (a reference to an array)
320 the value(s) to add
321
322
323 =cut
324
325 sub add_value{
326 my ($self,$index,@values) = @_;
327
328 my $tree = $self->{'values'};
329 my $lastidx = pop(@$index);
330 foreach my $i (@$index) {
331 if($i < 0) {
332 my $subtree = [];
333 push(@$tree, $subtree);
334 $tree = $subtree;
335 } elsif((! $tree->[$i]) || (ref($tree->[$i]) eq "ARRAY")) {
336 $tree->[$i] = [] unless ref($tree->[$i]) eq "ARRAY";
337 $tree = $tree->[$i];
338 } else {
339 $self->throw("element $i is a scalar but not in last dimension");
340 }
341 }
342 if($lastidx < 0) {
343 push(@$tree, @values);
344 } elsif(@values < 2) {
345 $tree->[$lastidx] = shift(@values);
346 } else {
347 $tree->[$lastidx] = [@values];
348 }
349
350 }
351
352 1;