| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
######################################################################## |
|
2
|
|
|
|
|
|
|
# TaxUnit.pm |
|
3
|
|
|
|
|
|
|
######################################################################## |
|
4
|
|
|
|
|
|
|
# Author: Chengzhi Liang, Thomas Hladish |
|
5
|
|
|
|
|
|
|
# $Id: TaxUnit.pm,v 1.23 2007/09/24 04:52:14 rvos Exp $ |
|
6
|
|
|
|
|
|
|
|
|
7
|
|
|
|
|
|
|
#################### START POD DOCUMENTATION ################## |
|
8
|
|
|
|
|
|
|
|
|
9
|
|
|
|
|
|
|
=head1 NAME |
|
10
|
|
|
|
|
|
|
|
|
11
|
|
|
|
|
|
|
Bio::NEXUS::TaxUnit - Represents a taxon unit in a NEXUS file |
|
12
|
|
|
|
|
|
|
|
|
13
|
|
|
|
|
|
|
=head1 SYNOPSIS |
|
14
|
|
|
|
|
|
|
|
|
15
|
|
|
|
|
|
|
$tu = new Bio::NEXUS::TaxUnit($name, $seq); |
|
16
|
|
|
|
|
|
|
|
|
17
|
|
|
|
|
|
|
=head1 DESCRIPTION |
|
18
|
|
|
|
|
|
|
|
|
19
|
|
|
|
|
|
|
This module represents a taxon unit in a NEXUS file (in characters block or History block) |
|
20
|
|
|
|
|
|
|
|
|
21
|
|
|
|
|
|
|
=head1 COMMENTS |
|
22
|
|
|
|
|
|
|
|
|
23
|
|
|
|
|
|
|
=head1 FEEDBACK |
|
24
|
|
|
|
|
|
|
|
|
25
|
|
|
|
|
|
|
All feedback (bugs, feature enhancements, etc.) are greatly appreciated. |
|
26
|
|
|
|
|
|
|
|
|
27
|
|
|
|
|
|
|
=head1 AUTHORS |
|
28
|
|
|
|
|
|
|
|
|
29
|
|
|
|
|
|
|
Chengzhi Liang (liangc@umbi.umd.edu) |
|
30
|
|
|
|
|
|
|
Thomas Hladish (tjhladish at yahoo) |
|
31
|
|
|
|
|
|
|
|
|
32
|
|
|
|
|
|
|
=head1 VERSION |
|
33
|
|
|
|
|
|
|
|
|
34
|
|
|
|
|
|
|
$Revision: 1.23 $ |
|
35
|
|
|
|
|
|
|
|
|
36
|
|
|
|
|
|
|
=head1 METHODS |
|
37
|
|
|
|
|
|
|
|
|
38
|
|
|
|
|
|
|
=cut |
|
39
|
|
|
|
|
|
|
|
|
40
|
|
|
|
|
|
|
package Bio::NEXUS::TaxUnit; |
|
41
|
|
|
|
|
|
|
|
|
42
|
34
|
|
|
34
|
|
228
|
use strict; |
|
|
34
|
|
|
|
|
75
|
|
|
|
34
|
|
|
|
|
1144
|
|
|
43
|
34
|
|
|
34
|
|
202
|
use Bio::NEXUS::Functions; |
|
|
34
|
|
|
|
|
72
|
|
|
|
34
|
|
|
|
|
6918
|
|
|
44
|
|
|
|
|
|
|
#use Carp;# XXX this is not used, might as well not import it! |
|
45
|
|
|
|
|
|
|
#use Data::Dumper; # XXX this is not used, might as well not import it! |
|
46
|
34
|
|
|
34
|
|
200
|
use Bio::NEXUS::Util::Exceptions 'throw'; |
|
|
34
|
|
|
|
|
67
|
|
|
|
34
|
|
|
|
|
1793
|
|
|
47
|
34
|
|
|
34
|
|
201
|
use Bio::NEXUS::Util::Logger; |
|
|
34
|
|
|
|
|
1553
|
|
|
|
34
|
|
|
|
|
5661
|
|
|
48
|
|
|
|
|
|
|
# Note: This script uses Clone::PP to clone the |
|
49
|
|
|
|
|
|
|
# nested perl data structures |
|
50
|
|
|
|
|
|
|
#use Clone::PP; # XXX changed this to a lazy loading 'require' where it's needed, in the clone function |
|
51
|
34
|
|
|
34
|
|
1713
|
use vars qw($VERSION $AUTOLOAD); |
|
|
34
|
|
|
|
|
83
|
|
|
|
34
|
|
|
|
|
4246
|
|
|
52
|
34
|
|
|
34
|
|
3653
|
use Bio::NEXUS; $VERSION = $Bio::NEXUS::VERSION; |
|
|
34
|
|
|
|
|
1588
|
|
|
|
34
|
|
|
|
|
37539
|
|
|
53
|
|
|
|
|
|
|
|
|
54
|
|
|
|
|
|
|
my $logger = Bio::NEXUS::Util::Logger->new(); |
|
55
|
|
|
|
|
|
|
|
|
56
|
|
|
|
|
|
|
=head2 new |
|
57
|
|
|
|
|
|
|
|
|
58
|
|
|
|
|
|
|
Title : new |
|
59
|
|
|
|
|
|
|
Usage : $otu = new Bio::NEXUS::TaxUnit($name, $seq); |
|
60
|
|
|
|
|
|
|
Function: Creates a new Bio::NEXUS::TaxUnit object |
|
61
|
|
|
|
|
|
|
Returns : Bio::NEXUS::TaxUnit object |
|
62
|
|
|
|
|
|
|
Args : name and sequence of TaxUnit object |
|
63
|
|
|
|
|
|
|
|
|
64
|
|
|
|
|
|
|
=cut |
|
65
|
|
|
|
|
|
|
|
|
66
|
|
|
|
|
|
|
sub new { |
|
67
|
527
|
|
|
527
|
1
|
866
|
my ( $class, $name, $seq ) = @_; |
|
68
|
527
|
|
|
|
|
3081
|
my $self = { name => $name, seq => $seq, }; |
|
69
|
527
|
|
|
|
|
1235
|
bless $self, $class; |
|
70
|
527
|
|
|
|
|
2545
|
return $self; |
|
71
|
|
|
|
|
|
|
} |
|
72
|
|
|
|
|
|
|
|
|
73
|
|
|
|
|
|
|
=head2 clone |
|
74
|
|
|
|
|
|
|
|
|
75
|
|
|
|
|
|
|
Title : clone |
|
76
|
|
|
|
|
|
|
Usage : my $newtu = $set->clone(); |
|
77
|
|
|
|
|
|
|
Function: clone an TaxUnit object |
|
78
|
|
|
|
|
|
|
Returns : TaxUnit object |
|
79
|
|
|
|
|
|
|
Args : none |
|
80
|
|
|
|
|
|
|
|
|
81
|
|
|
|
|
|
|
=cut |
|
82
|
|
|
|
|
|
|
|
|
83
|
|
|
|
|
|
|
sub clone { |
|
84
|
14
|
|
|
14
|
1
|
32
|
my ($self) = @_; |
|
85
|
14
|
|
|
|
|
31
|
my $class = ref($self); |
|
86
|
14
|
|
|
|
|
21
|
my $newtu = bless( { %{$self} }, $class ); |
|
|
14
|
|
|
|
|
97
|
|
|
87
|
|
|
|
|
|
|
# clone the sequence using Clone::PP |
|
88
|
14
|
50
|
|
|
|
51
|
if (defined $self->{'seq'}) { |
|
89
|
14
|
|
|
|
|
23
|
eval { require Clone::PP }; |
|
|
14
|
|
|
|
|
131
|
|
|
90
|
14
|
50
|
|
|
|
39
|
if ( $@ ) { |
|
91
|
0
|
|
|
|
|
0
|
throw 'ExtensionError' => "Can't clone, no Clone::PP $@"; |
|
92
|
|
|
|
|
|
|
} |
|
93
|
14
|
|
|
|
|
69
|
$newtu->{'seq'} = Clone::PP::clone($self->{'seq'}); |
|
94
|
|
|
|
|
|
|
} |
|
95
|
14
|
|
|
|
|
2540
|
return $newtu; |
|
96
|
|
|
|
|
|
|
} |
|
97
|
|
|
|
|
|
|
|
|
98
|
|
|
|
|
|
|
=head2 set_name |
|
99
|
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
Title : set_name |
|
101
|
|
|
|
|
|
|
Usage : $tu->set_name($name); |
|
102
|
|
|
|
|
|
|
Function: sets the name of OTU |
|
103
|
|
|
|
|
|
|
Returns : none |
|
104
|
|
|
|
|
|
|
Args : name |
|
105
|
|
|
|
|
|
|
|
|
106
|
|
|
|
|
|
|
=cut |
|
107
|
|
|
|
|
|
|
|
|
108
|
|
|
|
|
|
|
sub set_name { |
|
109
|
17
|
|
|
17
|
1
|
907
|
my ( $self, $name ) = @_; |
|
110
|
17
|
|
|
|
|
68
|
$self->{'name'} = $name; |
|
111
|
|
|
|
|
|
|
} |
|
112
|
|
|
|
|
|
|
|
|
113
|
|
|
|
|
|
|
=head2 get_name |
|
114
|
|
|
|
|
|
|
|
|
115
|
|
|
|
|
|
|
Title : get_name |
|
116
|
|
|
|
|
|
|
Usage : $tu->get_name(); |
|
117
|
|
|
|
|
|
|
Function: Returns name |
|
118
|
|
|
|
|
|
|
Returns : name |
|
119
|
|
|
|
|
|
|
Args : none |
|
120
|
|
|
|
|
|
|
|
|
121
|
|
|
|
|
|
|
=cut |
|
122
|
|
|
|
|
|
|
|
|
123
|
|
|
|
|
|
|
sub get_name { |
|
124
|
1078
|
|
|
1078
|
1
|
11629
|
my ($self) = @_; |
|
125
|
1078
|
|
|
|
|
3563
|
return $self->{'name'}; |
|
126
|
|
|
|
|
|
|
} |
|
127
|
|
|
|
|
|
|
|
|
128
|
|
|
|
|
|
|
=head2 set_seq |
|
129
|
|
|
|
|
|
|
|
|
130
|
|
|
|
|
|
|
Title : set_seq |
|
131
|
|
|
|
|
|
|
Usage : $tu->set_seq($seq); |
|
132
|
|
|
|
|
|
|
Function: sets the sequence of OTU |
|
133
|
|
|
|
|
|
|
Returns : none |
|
134
|
|
|
|
|
|
|
Args : sequence |
|
135
|
|
|
|
|
|
|
|
|
136
|
|
|
|
|
|
|
=cut |
|
137
|
|
|
|
|
|
|
|
|
138
|
|
|
|
|
|
|
sub set_seq { |
|
139
|
3
|
|
|
3
|
1
|
44
|
my ( $self, $seq ) = @_; |
|
140
|
3
|
|
|
|
|
23
|
$self->{'seq'} = $seq; |
|
141
|
|
|
|
|
|
|
} |
|
142
|
|
|
|
|
|
|
|
|
143
|
|
|
|
|
|
|
=head2 get_seq |
|
144
|
|
|
|
|
|
|
|
|
145
|
|
|
|
|
|
|
Title : get_seq |
|
146
|
|
|
|
|
|
|
Usage : $tu->get_seq(); |
|
147
|
|
|
|
|
|
|
Function: Returns sequence |
|
148
|
|
|
|
|
|
|
Returns : sequence (an array of characters or tokens) |
|
149
|
|
|
|
|
|
|
Args : none |
|
150
|
|
|
|
|
|
|
|
|
151
|
|
|
|
|
|
|
=cut |
|
152
|
|
|
|
|
|
|
|
|
153
|
|
|
|
|
|
|
sub get_seq { |
|
154
|
151
|
|
|
151
|
1
|
515
|
my ($self) = @_; |
|
155
|
151
|
|
|
|
|
921
|
return $self->{'seq'}; |
|
156
|
|
|
|
|
|
|
} |
|
157
|
|
|
|
|
|
|
|
|
158
|
|
|
|
|
|
|
=head2 get_seq_string |
|
159
|
|
|
|
|
|
|
|
|
160
|
|
|
|
|
|
|
Title : get_seq_string |
|
161
|
|
|
|
|
|
|
Usage : $taxunit->get_seq_string($tokens_flag); |
|
162
|
|
|
|
|
|
|
Function: Returns sequence |
|
163
|
|
|
|
|
|
|
Returns : sequence (a string, wherein tokens or characters are space-delimited |
|
164
|
|
|
|
|
|
|
if a true value has been passed in for $tokens) |
|
165
|
|
|
|
|
|
|
Args : boolean tokens argument (optional) |
|
166
|
|
|
|
|
|
|
|
|
167
|
|
|
|
|
|
|
=cut |
|
168
|
|
|
|
|
|
|
|
|
169
|
|
|
|
|
|
|
sub get_seq_string { |
|
170
|
26
|
|
|
26
|
1
|
55
|
my ( $self, $tokens_flag ) = @_; |
|
171
|
26
|
|
|
|
|
33
|
my @seq; |
|
172
|
26
|
|
|
|
|
27
|
for my $token ( @{ $self->get_seq } ) { |
|
|
26
|
|
|
|
|
62
|
|
|
173
|
2228
|
50
|
|
|
|
2685
|
if ( ref $token eq 'HASH' ) { |
|
174
|
0
|
|
|
|
|
0
|
my $token_type = $token->{'type'}; |
|
175
|
0
|
0
|
|
|
|
0
|
if ( ref $token->{'states'} eq 'ARRAY' ) { |
|
|
|
0
|
|
|
|
|
|
|
176
|
0
|
|
|
|
|
0
|
my @states = @{ $token->{'states'} }; |
|
|
0
|
|
|
|
|
0
|
|
|
177
|
0
|
0
|
|
|
|
0
|
if ( $token_type eq 'uncertainty' ) { |
|
|
|
0
|
|
|
|
|
|
|
178
|
0
|
|
|
|
|
0
|
push @seq, '{', @states, '}'; |
|
179
|
|
|
|
|
|
|
} |
|
180
|
|
|
|
|
|
|
elsif ( $token_type eq 'polymorphism' ) { |
|
181
|
0
|
|
|
|
|
0
|
push @seq, '(', @states, ')'; |
|
182
|
|
|
|
|
|
|
} |
|
183
|
|
|
|
|
|
|
else { |
|
184
|
0
|
|
|
|
|
0
|
throw 'BadFormat' => "Unknown token type encountered: only 'uncertainty' and 'polymorphism' are valid"; |
|
185
|
|
|
|
|
|
|
} |
|
186
|
|
|
|
|
|
|
} |
|
187
|
|
|
|
|
|
|
elsif ( ref $token->{'states'} eq 'HASH' ) { |
|
188
|
0
|
|
|
|
|
0
|
my %states = %{ $token->{'states'} }; |
|
|
0
|
|
|
|
|
0
|
|
|
189
|
|
|
|
|
|
|
my @polymorphism |
|
190
|
0
|
|
|
|
|
0
|
; # will contain something like ('A:0.2', 'G:0.4', 'P:0.4') |
|
191
|
0
|
0
|
|
|
|
0
|
if ( $token_type eq 'polymorphism' ) { |
|
192
|
0
|
|
|
|
|
0
|
while ( my ( $key, $val ) = each %states ) { |
|
193
|
0
|
|
|
|
|
0
|
push @polymorphism, "$key:$val"; |
|
194
|
|
|
|
|
|
|
} |
|
195
|
0
|
|
|
|
|
0
|
push @seq, join q{ }, '(', @polymorphism, ')'; |
|
196
|
|
|
|
|
|
|
} |
|
197
|
|
|
|
|
|
|
else { |
|
198
|
0
|
|
|
|
|
0
|
throw 'BadFormat' => "Unknown token type <$token_type> encountered: only 'polymorphism' is valid when explicit frequencies are included"; |
|
199
|
|
|
|
|
|
|
} |
|
200
|
|
|
|
|
|
|
} |
|
201
|
|
|
|
|
|
|
} |
|
202
|
|
|
|
|
|
|
else { |
|
203
|
2228
|
|
|
|
|
2735
|
push @seq, $token; |
|
204
|
|
|
|
|
|
|
} |
|
205
|
|
|
|
|
|
|
} |
|
206
|
26
|
50
|
|
|
|
66
|
my $delimiter = $tokens_flag ? q{ } : q{}; |
|
207
|
26
|
|
|
|
|
461
|
return join $delimiter, @seq; |
|
208
|
|
|
|
|
|
|
} |
|
209
|
|
|
|
|
|
|
|
|
210
|
|
|
|
|
|
|
sub AUTOLOAD { |
|
211
|
0
|
0
|
|
0
|
|
|
return if $AUTOLOAD =~ /DESTROY$/; |
|
212
|
0
|
|
|
|
|
|
my $package_name = __PACKAGE__ . '::'; |
|
213
|
|
|
|
|
|
|
|
|
214
|
|
|
|
|
|
|
# The following methods are deprecated and are temporarily supported |
|
215
|
|
|
|
|
|
|
# via a warning and a redirection |
|
216
|
0
|
|
|
|
|
|
my %synonym_for = ( |
|
217
|
|
|
|
|
|
|
|
|
218
|
|
|
|
|
|
|
# "${package_name}parse" => "${package_name}_parse_tree", # example |
|
219
|
|
|
|
|
|
|
); |
|
220
|
|
|
|
|
|
|
|
|
221
|
0
|
0
|
|
|
|
|
if ( defined $synonym_for{$AUTOLOAD} ) { |
|
222
|
0
|
|
|
|
|
|
$logger->warn("$AUTOLOAD() is deprecated; use $synonym_for{$AUTOLOAD}() instead"); |
|
223
|
0
|
|
|
|
|
|
goto &{ $synonym_for{$AUTOLOAD} }; |
|
|
0
|
|
|
|
|
|
|
|
224
|
|
|
|
|
|
|
} |
|
225
|
|
|
|
|
|
|
else { |
|
226
|
0
|
|
|
|
|
|
throw 'UnknownMethod' => "Unknown method $AUTOLOAD called"; |
|
227
|
|
|
|
|
|
|
} |
|
228
|
|
|
|
|
|
|
} |
|
229
|
|
|
|
|
|
|
|
|
230
|
|
|
|
|
|
|
1; |