comparison variant_effect_predictor/Bio/Matrix/PhylipDist.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 # BioPerl module for Bio::Matrix::PhylipDist
2 #
3 # Cared for by Shawn Hoon <shawnh@fugu-sg.org>
4 #
5 # Copyright Shawn Hoon
6 #
7 # You may distribute this module under the same terms as perl itself
8
9 # POD documentation - main docs before the code
10
11 =head1 NAME
12
13 Bio::Matrix::PhylipDist - A Phylip Distance Matrix object
14
15 =head1 SYNOPSIS
16
17 use Bio::Matrix::PhylipDist;
18
19 my $dist = Bio::Matrix::PhylipDist->new(-file=>"protdist.out",-program=>"ProtDist");
20 #or
21 my $dist = Bio::Matrix::PhylipDist->new(-fh=>$FH,-program=>"ProtDist");
22
23 #get specific entries
24 my $distance_value = $dist->get_entry('ALPHA','BETA');
25 my @columns = $dist->get_column('ALPHA');
26 my @rows = $dist->get_row('BETA');
27 my @diagonal = $dist->get_diagonal();
28
29 #print the matrix in phylip numerical format
30 print $dist->print_matrix;
31
32 =head1 DESCRIPTION
33
34 Simple object for holding Distance Matrices generated by the following Phylip programs:
35
36 1) dnadist
37 2) protdist
38 3) restdist
39
40 It currently handles parsing of the matrix without the data output option.
41
42 5
43 Alpha 0.00000 4.23419 3.63330 6.20865 3.45431
44 Beta 4.23419 0.00000 3.49289 3.36540 4.29179
45 Gamma 3.63330 3.49289 0.00000 3.68733 5.84929
46 Delta 6.20865 3.36540 3.68733 0.00000 4.43345
47 Epsilon 3.45431 4.29179 5.84929 4.43345 0.00000
48
49 =head1 FEEDBACK
50
51
52 =head2 Mailing Lists
53
54 User feedback is an integral part of the evolution of this and other
55 Bioperl modules. Send your comments and suggestions preferably to one
56 of the Bioperl mailing lists. Your participation is much appreciated.
57
58 bioperl-l@bioperl.org - General discussion
59 http://bio.perl.org/MailList.html - About the mailing lists
60
61 =head2 Reporting Bugs
62
63 Report bugs to the Bioperl bug tracking system to help us keep track
64 the bugs and their resolution. Bug reports can be submitted via email
65 or the web:
66
67 bioperl-bugs@bioperl.org
68 http://bugzilla.bioperl.org/
69
70 =head1 AUTHOR - Shawn Hoon
71
72 Email shawnh@fugu-sg.org
73
74
75 =head1 APPENDIX
76
77
78 The rest of the documentation details each of the object
79 methods. Internal methods are usually preceded with a "_".
80
81 =cut
82
83 # Let the code begin...
84
85 package Bio::Matrix::PhylipDist;
86 use strict;
87
88 use vars qw(@ISA);
89
90 use Bio::Root::Root;
91 use Bio::Root::IO;
92
93 @ISA = qw(Bio::Root::Root Bio::Root::IO);
94
95 =head2 new
96
97 Title : new
98 Usage : my $family = Bio::Matrix::PhylipDist->new(-file=>"protdist.out",
99 -program=>"protdist");
100 Function: Constructor for PhylipDist Object
101 Returns : L<Bio::Matrix::PhylipDist>
102
103 =cut
104
105 sub new {
106 my ($class,@args) = @_;
107 my $self = $class->SUPER::new(@args);
108 my ($matrix,$values, $names,$file, $fh,$program) = $self->_rearrange([qw(MATRIX VALUES NAMES FILE FH PROGRAM)],@args);
109
110 ($matrix && $values && $names) || $file || $fh || $self->throw("Need a file or file handle!");
111
112 $program && $self->program($program);
113 $self->_initialize_io(@args);
114
115 $self->_matrix($matrix) if $matrix;
116 $self->_values($values) if $values;
117 $self->names($names) if $names;
118 if(!$matrix && !$values && !$names){
119 $self->_parse();
120 }
121
122 return $self;
123 }
124
125 =head2 _parse
126
127 Title : _parse
128 Usage : $matrix->_parse();
129 Function: internal method that parses the distance matrix file.
130 Returns :
131 Arguments:
132
133 =cut
134
135 sub _parse {
136 my ($self) = @_;
137 my @names;
138 my @values;
139 while (my $entry = $self->_readline){
140 next if ($entry=~/^\s+\d+$/);
141 my ($n,@line) = split( /\s+/,$entry);
142 push @names, $n;
143 push @values, [@line];
144 }
145
146 my %dist;
147 my $i=0;
148 foreach my $name(@names){
149 my $j=0;
150 foreach my $n(@names) {
151 $dist{$name}{$n} = [$i,$j];
152 $j++;
153 }
154 $i++;
155 }
156
157 $self->_matrix(\%dist);
158 $self->names(\@names);
159 $self->_values(\@values);
160 }
161
162 =head2 get_entry
163
164 Title : get_entry
165 Usage : $matrix->get_entry();
166 Function: returns a particular entry
167 Returns : a float
168 Arguments: string id1, string id2
169
170 =cut
171
172 sub get_entry {
173 my ($self,$row,$column) = @_;
174 $row && $column || $self->throw("Need at least 2 ids");
175 my %matrix = %{$self->_matrix};
176 my @values = @{$self->_values};
177 if(ref $matrix{$row}{$column}){
178 my ($i,$j) = @{$matrix{$row}{$column}};
179 return $values[$i][$j];
180 }
181 return;
182
183 }
184
185 =head2 get_row
186
187 Title : get_row
188 Usage : $matrix->get_row('ALPHA');
189 Function: returns a particular row
190 Returns : an array of float
191 Arguments: string id1
192
193 =cut
194
195 sub get_row {
196 my ($self,$row) = @_;
197 $row || $self->throw("Need at least a row id");
198
199 my %matrix = %{$self->_matrix};
200 my @values = @{$self->_values};
201 my @names = @{$self->names};
202 $matrix{$row} || return;
203 my @row = %{$matrix{$row}};
204 my $row_pointer = $row[1]->[0];
205 my $index = scalar(@names)-1;
206 return @{$values[$row_pointer]}[0..$index];
207 }
208
209 =head2 get_column
210
211 Title : get_column
212 Usage : $matrix->get_column('ALPHA');
213 Function: returns a particular column
214 Returns : an array of floats
215 Arguments: string id1
216
217 =cut
218
219 sub get_column {
220 my ($self,$column) = @_;
221 $column || $self->throw("Need at least a column id");
222
223 my %matrix = %{$self->_matrix};
224 my @values = @{$self->_values};
225 my @names = @{$self->names};
226 $matrix{$column} || return;
227 my @column = %{$matrix{$column}};
228 my $row_pointer = $column[1]->[0];
229 my @return;
230 for(my $i=0; $i < scalar(@names); $i++){
231 push @return, $values[$i][$row_pointer];
232 }
233 return @return;
234 }
235
236 =head2 get_diagonal
237
238 Title : get_diagonal
239 Usage : $matrix->get_diagonal();
240 Function: returns the diagonal of the matrix
241 Returns : an array of float
242 Arguments: string id1
243
244 =cut
245
246 sub get_diagonal {
247 my ($self) = @_;
248 my %matrix = %{$self->_matrix};
249 my @values = @{$self->_values};
250 my @return;
251 foreach my $name (@{$self->names}){
252 my ($i,$j) = @{$matrix{$name}{$name}};
253 push @return,$values[$i][$j];
254 }
255 return @return;
256 }
257
258 =head2 print_matrix
259
260 Title : print_matrix
261 Usage : $matrix->print_matrix();
262 Function: returns a string of the matrix in phylip format
263 Returns : a string
264 Arguments:
265
266 =cut
267
268 sub print_matrix {
269 my ($self) = @_;
270 my @names = @{$self->names};
271 my @values = @{$self->_values};
272 my %matrix = %{$self->_matrix};
273 my $str;
274 $str.= (" "x 4). scalar(@names)."\n";
275 foreach my $name (@names){
276 my $newname = $name. (" " x (15-length($name)));
277 $str.=$newname;
278 my $count = 0;
279 foreach my $n (@names){
280 my ($i,$j) = @{$matrix{$name}{$n}};
281 if($count < $#names){
282 $str.= $values[$i][$j]. " ";
283 }
284 else {
285 $str.= $values[$i][$j];
286 }
287 $count++;
288 }
289 $str.="\n";
290 }
291 return $str;
292 }
293
294 =head2 _matrix
295
296 Title : _matrix
297 Usage : $matrix->_matrix();
298 Function: get/set for hash reference of the pointers
299 to the value matrix
300 Returns : hash reference
301 Arguments: hash reference
302
303 =cut
304
305 sub _matrix {
306 my ($self,$val) = @_;
307 if($val){
308 $self->{'_matrix'} = $val;
309 }
310 return $self->{'_matrix'};
311 }
312
313
314 =head2 names
315
316 Title : names
317 Usage : $matrix->names();
318 Function: get/set for array ref of names of sequences
319 Returns : an array reference
320 Arguments: an array reference
321
322 =cut
323
324 sub names {
325 my ($self,$val) = @_;
326 if($val){
327 $self->{"_names"} = $val;
328 }
329 return $self->{'_names'};
330 }
331
332 =head2 program
333
334 Title : program
335 Usage : $matrix->program();
336 Function: get/set for the program name generating this
337 matrix
338 Returns : string
339 Arguments: string
340
341 =cut
342
343 sub program {
344 my ($self,$val) = @_;
345 if($val){
346 $self->{'_program'} = $val;
347 }
348 return $self->{'_program'};
349 }
350
351 =head2 _values
352
353 Title : _values
354 Usage : $matrix->_values();
355 Function: get/set for array ref of the matrix containing
356 distance values
357 Returns : an array reference
358 Arguments: an array reference
359
360 =cut
361
362 sub _values {
363 my ($self,$val) = @_;
364 if($val){
365 $self->{'_values'} = $val;
366 }
367 return $self->{'_values'};
368 }
369
370 1;
371
372
373
374
375
376
377