line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
# |
2
|
|
|
|
|
|
|
# BioPerl module for Bio::Taxon |
3
|
|
|
|
|
|
|
# |
4
|
|
|
|
|
|
|
# Please direct questions and support issues to |
5
|
|
|
|
|
|
|
# |
6
|
|
|
|
|
|
|
# Cared for by Sendu Bala |
7
|
|
|
|
|
|
|
# |
8
|
|
|
|
|
|
|
# Copyright Sendu Bala, based heavily on a module by Jason Stajich |
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::Taxon - A node in a represented taxonomy |
17
|
|
|
|
|
|
|
|
18
|
|
|
|
|
|
|
=head1 SYNOPSIS |
19
|
|
|
|
|
|
|
|
20
|
|
|
|
|
|
|
use Bio::Taxon; |
21
|
|
|
|
|
|
|
|
22
|
|
|
|
|
|
|
# Typically you will get a Taxon from a Bio::DB::Taxonomy object |
23
|
|
|
|
|
|
|
# but here is how you initialize one |
24
|
|
|
|
|
|
|
my $taxon = Bio::Taxon->new(-name => $name, |
25
|
|
|
|
|
|
|
-id => $id, |
26
|
|
|
|
|
|
|
-rank => $rank, |
27
|
|
|
|
|
|
|
-division => $div); |
28
|
|
|
|
|
|
|
|
29
|
|
|
|
|
|
|
# Get one from a database |
30
|
|
|
|
|
|
|
my $dbh = Bio::DB::Taxonomy->new(-source => 'flatfile', |
31
|
|
|
|
|
|
|
-directory=> '/tmp', |
32
|
|
|
|
|
|
|
-nodesfile=> '/path/to/nodes.dmp', |
33
|
|
|
|
|
|
|
-namesfile=> '/path/to/names.dmp'); |
34
|
|
|
|
|
|
|
my $human = $dbh->get_taxon(-name => 'Homo sapiens'); |
35
|
|
|
|
|
|
|
$human = $dbh->get_taxon(-taxonid => '9606'); |
36
|
|
|
|
|
|
|
|
37
|
|
|
|
|
|
|
print "id is ", $human->id, "\n"; # 9606 |
38
|
|
|
|
|
|
|
print "rank is ", $human->rank, "\n"; # species |
39
|
|
|
|
|
|
|
print "scientific name is ", $human->scientific_name, "\n"; # Homo sapiens |
40
|
|
|
|
|
|
|
print "division is ", $human->division, "\n"; # Primates |
41
|
|
|
|
|
|
|
|
42
|
|
|
|
|
|
|
my $mouse = $dbh->get_taxon(-name => 'Mus musculus'); |
43
|
|
|
|
|
|
|
|
44
|
|
|
|
|
|
|
# You can quickly make your own lineages with the list database |
45
|
|
|
|
|
|
|
my @ranks = qw(superkingdom class genus species); |
46
|
|
|
|
|
|
|
my @h_lineage = ('Eukaryota', 'Mammalia', 'Homo', 'Homo sapiens'); |
47
|
|
|
|
|
|
|
my $list_dbh = Bio::DB::Taxonomy->new(-source => 'list', -names => \@h_lineage, |
48
|
|
|
|
|
|
|
-ranks => \@ranks); |
49
|
|
|
|
|
|
|
$human = $list_dbh->get_taxon(-name => 'Homo sapiens'); |
50
|
|
|
|
|
|
|
my @names = $human->common_names; # @names is empty |
51
|
|
|
|
|
|
|
$human->common_names('woman'); |
52
|
|
|
|
|
|
|
@names = $human->common_names; # @names contains woman |
53
|
|
|
|
|
|
|
|
54
|
|
|
|
|
|
|
# You can switch to another database when you need more information |
55
|
|
|
|
|
|
|
my $entrez_dbh = Bio::DB::Taxonomy->new(-source => 'entrez'); |
56
|
|
|
|
|
|
|
$human->db_handle($entrez_dbh); |
57
|
|
|
|
|
|
|
@names = $human->common_names; # @names contains woman, human, man |
58
|
|
|
|
|
|
|
|
59
|
|
|
|
|
|
|
# Since Bio::Taxon implements Bio::Tree::NodeI, we have access to those |
60
|
|
|
|
|
|
|
# methods (and can manually create our own taxa and taxonomy without the use |
61
|
|
|
|
|
|
|
# of any database) |
62
|
|
|
|
|
|
|
my $homo = $human->ancestor; |
63
|
|
|
|
|
|
|
|
64
|
|
|
|
|
|
|
# Though be careful with each_Descendent - unless you add_Descendent() |
65
|
|
|
|
|
|
|
# yourself, you won't get an answer because unlike for ancestor(), Bio::Taxon |
66
|
|
|
|
|
|
|
# does not ask the database for the answer. You can ask the database yourself |
67
|
|
|
|
|
|
|
# using the same method: |
68
|
|
|
|
|
|
|
($human) = $homo->db_handle->each_Descendent($homo); |
69
|
|
|
|
|
|
|
|
70
|
|
|
|
|
|
|
# We can also take advantage of Bio::Tree::Tree* methods: |
71
|
|
|
|
|
|
|
# a) some methods are available with just an empty tree object |
72
|
|
|
|
|
|
|
use Bio::Tree::Tree; |
73
|
|
|
|
|
|
|
my $tree_functions = Bio::Tree::Tree->new(); |
74
|
|
|
|
|
|
|
my @lineage = $tree_functions->get_lineage_nodes($human); |
75
|
|
|
|
|
|
|
my $lineage = $tree_functions->get_lineage_string($human); |
76
|
|
|
|
|
|
|
my $lca = $tree_functions->get_lca($human, $mouse); |
77
|
|
|
|
|
|
|
|
78
|
|
|
|
|
|
|
# b) for other methods, create a tree using your Taxon object |
79
|
|
|
|
|
|
|
my $tree = Bio::Tree::Tree->new(-node => $human); |
80
|
|
|
|
|
|
|
my @taxa = $tree->get_nodes; |
81
|
|
|
|
|
|
|
$homo = $tree->find_node(-rank => 'genus'); |
82
|
|
|
|
|
|
|
|
83
|
|
|
|
|
|
|
# Normally you can't get the lca of a list-database derived Taxon and an |
84
|
|
|
|
|
|
|
# entrez or flatfile-derived one because the two different databases might |
85
|
|
|
|
|
|
|
# have different roots and different numbers of ranks between the root and the |
86
|
|
|
|
|
|
|
# taxa of interest. To solve this, make a tree of the Taxon with the more |
87
|
|
|
|
|
|
|
# detailed lineage and splice out all the taxa that won't be in the lineage of |
88
|
|
|
|
|
|
|
# your other Taxon: |
89
|
|
|
|
|
|
|
my $entrez_mouse = $entrez_dbh->get_taxon(-name => 'Mus musculus'); |
90
|
|
|
|
|
|
|
my $list_human = $list_dbh->get_taxon(-name => 'Homo sapiens'); |
91
|
|
|
|
|
|
|
my $mouse_tree = Bio::Tree::Tree->new(-node => $entrez_mouse); |
92
|
|
|
|
|
|
|
$mouse_tree->splice(-keep_rank => \@ranks); |
93
|
|
|
|
|
|
|
$lca = $mouse_tree->get_lca($entrez_mouse, $list_human); |
94
|
|
|
|
|
|
|
|
95
|
|
|
|
|
|
|
=head1 DESCRIPTION |
96
|
|
|
|
|
|
|
|
97
|
|
|
|
|
|
|
This is the next generation (for Bioperl) of representing Taxonomy |
98
|
|
|
|
|
|
|
information. Previously all information was managed by a single |
99
|
|
|
|
|
|
|
object called Bio::Species. This new implementation allows |
100
|
|
|
|
|
|
|
representation of the intermediate nodes not just the species nodes |
101
|
|
|
|
|
|
|
and can relate their connections. |
102
|
|
|
|
|
|
|
|
103
|
|
|
|
|
|
|
=head1 FEEDBACK |
104
|
|
|
|
|
|
|
|
105
|
|
|
|
|
|
|
=head2 Mailing Lists |
106
|
|
|
|
|
|
|
|
107
|
|
|
|
|
|
|
User feedback is an integral part of the evolution of this and other |
108
|
|
|
|
|
|
|
Bioperl modules. Send your comments and suggestions preferably to |
109
|
|
|
|
|
|
|
the Bioperl mailing list. Your participation is much appreciated. |
110
|
|
|
|
|
|
|
|
111
|
|
|
|
|
|
|
bioperl-l@bioperl.org - General discussion |
112
|
|
|
|
|
|
|
http://bioperl.org/wiki/Mailing_lists - About the mailing lists |
113
|
|
|
|
|
|
|
|
114
|
|
|
|
|
|
|
=head2 Support |
115
|
|
|
|
|
|
|
|
116
|
|
|
|
|
|
|
Please direct usage questions or support issues to the mailing list: |
117
|
|
|
|
|
|
|
|
118
|
|
|
|
|
|
|
I |
119
|
|
|
|
|
|
|
|
120
|
|
|
|
|
|
|
rather than to the module maintainer directly. Many experienced and |
121
|
|
|
|
|
|
|
reponsive experts will be able look at the problem and quickly |
122
|
|
|
|
|
|
|
address it. Please include a thorough description of the problem |
123
|
|
|
|
|
|
|
with code and data examples if at all possible. |
124
|
|
|
|
|
|
|
|
125
|
|
|
|
|
|
|
=head2 Reporting Bugs |
126
|
|
|
|
|
|
|
|
127
|
|
|
|
|
|
|
Report bugs to the Bioperl bug tracking system to help us keep track |
128
|
|
|
|
|
|
|
of the bugs and their resolution. Bug reports can be submitted via |
129
|
|
|
|
|
|
|
the web: |
130
|
|
|
|
|
|
|
|
131
|
|
|
|
|
|
|
https://github.com/bioperl/bioperl-live/issues |
132
|
|
|
|
|
|
|
|
133
|
|
|
|
|
|
|
=head1 AUTHOR - Sendu Bala |
134
|
|
|
|
|
|
|
|
135
|
|
|
|
|
|
|
Email bix@sendu.me.uk |
136
|
|
|
|
|
|
|
|
137
|
|
|
|
|
|
|
=head1 CONTRIBUTORS |
138
|
|
|
|
|
|
|
|
139
|
|
|
|
|
|
|
Jason Stajich, jason-at-bioperl-dot-org (original Bio::Taxonomy::Node) |
140
|
|
|
|
|
|
|
Juguang Xiao, juguang@tll.org.sg |
141
|
|
|
|
|
|
|
Gabriel Valiente, valiente@lsi.upc.edu |
142
|
|
|
|
|
|
|
|
143
|
|
|
|
|
|
|
=head1 APPENDIX |
144
|
|
|
|
|
|
|
|
145
|
|
|
|
|
|
|
The rest of the documentation details each of the object methods. |
146
|
|
|
|
|
|
|
Internal methods are usually preceded with a _ |
147
|
|
|
|
|
|
|
|
148
|
|
|
|
|
|
|
=cut |
149
|
|
|
|
|
|
|
|
150
|
|
|
|
|
|
|
|
151
|
|
|
|
|
|
|
package Bio::Taxon; |
152
|
44
|
|
|
44
|
|
253
|
use strict; |
|
44
|
|
|
|
|
81
|
|
|
44
|
|
|
|
|
1354
|
|
153
|
44
|
|
|
44
|
|
220
|
use Scalar::Util qw(blessed); |
|
44
|
|
|
|
|
71
|
|
|
44
|
|
|
|
|
2417
|
|
154
|
|
|
|
|
|
|
|
155
|
44
|
|
|
44
|
|
214
|
use Bio::DB::Taxonomy; |
|
44
|
|
|
|
|
69
|
|
|
44
|
|
|
|
|
896
|
|
156
|
|
|
|
|
|
|
|
157
|
44
|
|
|
44
|
|
298
|
use base qw(Bio::Tree::Node Bio::IdentifiableI); |
|
44
|
|
|
|
|
72
|
|
|
44
|
|
|
|
|
14676
|
|
158
|
|
|
|
|
|
|
|
159
|
|
|
|
|
|
|
|
160
|
|
|
|
|
|
|
=head2 new |
161
|
|
|
|
|
|
|
|
162
|
|
|
|
|
|
|
Title : new |
163
|
|
|
|
|
|
|
Usage : my $obj = Bio::Taxonomy::Node->new(); |
164
|
|
|
|
|
|
|
Function: Builds a new Bio::Taxonomy::Node object |
165
|
|
|
|
|
|
|
Returns : an instance of Bio::Taxonomy::Node |
166
|
|
|
|
|
|
|
Args : -dbh => a reference to a Bio::DB::Taxonomy object |
167
|
|
|
|
|
|
|
[no default] |
168
|
|
|
|
|
|
|
-name => a string representing the taxon name |
169
|
|
|
|
|
|
|
(scientific name) |
170
|
|
|
|
|
|
|
-id => human readable id - typically NCBI taxid |
171
|
|
|
|
|
|
|
-ncbi_taxid => same as -id, but explicitly say that it is an |
172
|
|
|
|
|
|
|
NCBI taxid |
173
|
|
|
|
|
|
|
-rank => node rank (one of 'species', 'genus', etc) |
174
|
|
|
|
|
|
|
-common_names => array ref of all common names |
175
|
|
|
|
|
|
|
-division => 'Primates', 'Rodents', etc |
176
|
|
|
|
|
|
|
-genetic_code => genetic code table number |
177
|
|
|
|
|
|
|
-mito_genetic_code => mitochondrial genetic code table number |
178
|
|
|
|
|
|
|
-create_date => date created in database |
179
|
|
|
|
|
|
|
-update_date => date last updated in database |
180
|
|
|
|
|
|
|
-pub_date => date published in database |
181
|
|
|
|
|
|
|
|
182
|
|
|
|
|
|
|
=cut |
183
|
|
|
|
|
|
|
|
184
|
|
|
|
|
|
|
sub new { |
185
|
7161
|
|
|
7161
|
1
|
14159
|
my ($class, @args) = @_; |
186
|
7161
|
|
|
|
|
15082
|
my $self = $class->SUPER::new(@args); |
187
|
7161
|
|
|
|
|
27797
|
my ($name, $id, $objid, $rank, $div, $dbh, $ncbitaxid, $commonname, |
188
|
|
|
|
|
|
|
$commonnames, $gcode, $mitocode, $createdate, $updatedate, $pubdate, |
189
|
|
|
|
|
|
|
$parent_id) = $self->_rearrange([qw(NAME ID OBJECT_ID RANK DIVISION DBH |
190
|
|
|
|
|
|
|
NCBI_TAXID COMMON_NAME COMMON_NAMES |
191
|
|
|
|
|
|
|
GENETIC_CODE MITO_GENETIC_CODE |
192
|
|
|
|
|
|
|
CREATE_DATE UPDATE_DATE PUB_DATE |
193
|
|
|
|
|
|
|
PARENT_ID)], @args); |
194
|
|
|
|
|
|
|
|
195
|
7161
|
50
|
0
|
|
|
26992
|
if (defined $id && (defined $ncbitaxid && $ncbitaxid ne $id || defined $objid && $objid ne $id)) { |
|
|
50
|
33
|
|
|
|
|
196
|
0
|
|
|
|
|
0
|
$self->warn("Only provide one of -id, -object_id or -ncbi_taxid, using $id\n"); |
197
|
|
|
|
|
|
|
} |
198
|
|
|
|
|
|
|
elsif(!defined $id) { |
199
|
7161
|
|
100
|
|
|
12971
|
$id = $objid || $ncbitaxid; |
200
|
|
|
|
|
|
|
} |
201
|
7161
|
100
|
|
|
|
17526
|
defined $id && $self->id($id); |
202
|
7161
|
100
|
|
|
|
11106
|
$self->{_ncbi_tax_id_provided} = 1 if $ncbitaxid; |
203
|
|
|
|
|
|
|
|
204
|
7161
|
50
|
|
|
|
10533
|
defined $rank && $self->rank($rank); |
205
|
7161
|
100
|
|
|
|
17045
|
defined $name && $self->node_name($name); |
206
|
|
|
|
|
|
|
|
207
|
7161
|
|
|
|
|
7532
|
my @common_names; |
208
|
7161
|
50
|
|
|
|
10524
|
if ($commonnames) { |
209
|
0
|
0
|
0
|
|
|
0
|
$self->throw("-common_names takes only an array reference") unless $commonnames |
210
|
|
|
|
|
|
|
&& ref($commonnames) eq 'ARRAY'; |
211
|
0
|
|
|
|
|
0
|
@common_names = @{$commonnames}; |
|
0
|
|
|
|
|
0
|
|
212
|
|
|
|
|
|
|
} |
213
|
7161
|
100
|
|
|
|
10089
|
if ($commonname) { |
214
|
3
|
|
|
|
|
7
|
my %c_names = map { $_ => 1 } @common_names; |
|
0
|
|
|
|
|
0
|
|
215
|
3
|
50
|
|
|
|
7
|
unless (exists $c_names{$commonname}) { |
216
|
3
|
|
|
|
|
9
|
unshift(@common_names, $commonname); |
217
|
|
|
|
|
|
|
} |
218
|
|
|
|
|
|
|
} |
219
|
7161
|
100
|
|
|
|
11914
|
@common_names > 0 && $self->common_names(@common_names); |
220
|
|
|
|
|
|
|
|
221
|
7161
|
50
|
|
|
|
10541
|
defined $gcode && $self->genetic_code($gcode); |
222
|
7161
|
50
|
|
|
|
9982
|
defined $mitocode && $self->mitochondrial_genetic_code($mitocode); |
223
|
7161
|
50
|
|
|
|
9783
|
defined $createdate && $self->create_date($createdate); |
224
|
7161
|
50
|
|
|
|
9910
|
defined $updatedate && $self->update_date($updatedate); |
225
|
7161
|
50
|
|
|
|
9960
|
defined $pubdate && $self->pub_date($pubdate); |
226
|
7161
|
50
|
|
|
|
10146
|
defined $div && $self->division($div); |
227
|
7161
|
50
|
|
|
|
9256
|
defined $dbh && $self->db_handle($dbh); |
228
|
|
|
|
|
|
|
|
229
|
|
|
|
|
|
|
# Making an administrative decision to override this behavior, particularly |
230
|
|
|
|
|
|
|
# for optimization reasons (if it works to cache it up front, why not? |
231
|
|
|
|
|
|
|
# Please trust your implementations to get it right) |
232
|
|
|
|
|
|
|
|
233
|
|
|
|
|
|
|
# Original note: |
234
|
|
|
|
|
|
|
# deprecated and will issue a warning when method called, |
235
|
|
|
|
|
|
|
# eventually to be removed completely as option |
236
|
7161
|
50
|
|
|
|
9588
|
defined $parent_id && $self->parent_id($parent_id); |
237
|
|
|
|
|
|
|
|
238
|
|
|
|
|
|
|
# some things want to freeze/thaw Bio::Species objects, but |
239
|
|
|
|
|
|
|
# _root_cleanup_methods contains a CODE ref, delete it. |
240
|
7161
|
|
|
|
|
11753
|
delete $self->{_root_cleanup_methods}; |
241
|
|
|
|
|
|
|
|
242
|
7161
|
|
|
|
|
17997
|
return $self; |
243
|
|
|
|
|
|
|
} |
244
|
|
|
|
|
|
|
|
245
|
|
|
|
|
|
|
|
246
|
|
|
|
|
|
|
=head1 Bio::IdentifiableI interface |
247
|
|
|
|
|
|
|
|
248
|
|
|
|
|
|
|
Also see L |
249
|
|
|
|
|
|
|
|
250
|
|
|
|
|
|
|
=head2 version |
251
|
|
|
|
|
|
|
|
252
|
|
|
|
|
|
|
Title : version |
253
|
|
|
|
|
|
|
Usage : $taxon->version($newval) |
254
|
|
|
|
|
|
|
Returns : value of version (a scalar) |
255
|
|
|
|
|
|
|
Args : on set, new value (a scalar or undef, optional) |
256
|
|
|
|
|
|
|
|
257
|
|
|
|
|
|
|
=cut |
258
|
|
|
|
|
|
|
|
259
|
|
|
|
|
|
|
sub version { |
260
|
504
|
|
|
504
|
1
|
831
|
my $self = shift; |
261
|
504
|
50
|
|
|
|
1012
|
return $self->{'version'} = shift if @_; |
262
|
504
|
|
|
|
|
791
|
return $self->{'version'}; |
263
|
|
|
|
|
|
|
} |
264
|
|
|
|
|
|
|
|
265
|
|
|
|
|
|
|
|
266
|
|
|
|
|
|
|
=head2 authority |
267
|
|
|
|
|
|
|
|
268
|
|
|
|
|
|
|
Title : authority |
269
|
|
|
|
|
|
|
Usage : $taxon->authority($newval) |
270
|
|
|
|
|
|
|
Returns : value of authority (a scalar) |
271
|
|
|
|
|
|
|
Args : on set, new value (a scalar or undef, optional) |
272
|
|
|
|
|
|
|
|
273
|
|
|
|
|
|
|
=cut |
274
|
|
|
|
|
|
|
|
275
|
|
|
|
|
|
|
sub authority { |
276
|
504
|
|
|
504
|
1
|
765
|
my $self = shift; |
277
|
504
|
50
|
|
|
|
1077
|
return $self->{'authority'} = shift if @_; |
278
|
504
|
|
|
|
|
759
|
return $self->{'authority'}; |
279
|
|
|
|
|
|
|
} |
280
|
|
|
|
|
|
|
|
281
|
|
|
|
|
|
|
|
282
|
|
|
|
|
|
|
=head2 namespace |
283
|
|
|
|
|
|
|
|
284
|
|
|
|
|
|
|
Title : namespace |
285
|
|
|
|
|
|
|
Usage : $taxon->namespace($newval) |
286
|
|
|
|
|
|
|
Returns : value of namespace (a scalar) |
287
|
|
|
|
|
|
|
Args : on set, new value (a scalar or undef, optional) |
288
|
|
|
|
|
|
|
|
289
|
|
|
|
|
|
|
=cut |
290
|
|
|
|
|
|
|
|
291
|
|
|
|
|
|
|
sub namespace { |
292
|
504
|
|
|
504
|
1
|
701
|
my $self = shift; |
293
|
504
|
50
|
|
|
|
881
|
return $self->{'namespace'} = shift if @_; |
294
|
504
|
|
|
|
|
730
|
return $self->{'namespace'}; |
295
|
|
|
|
|
|
|
} |
296
|
|
|
|
|
|
|
|
297
|
|
|
|
|
|
|
|
298
|
|
|
|
|
|
|
=head1 Bio::Taxonomy::Node implementation |
299
|
|
|
|
|
|
|
|
300
|
|
|
|
|
|
|
=head2 db_handle |
301
|
|
|
|
|
|
|
|
302
|
|
|
|
|
|
|
Title : db_handle |
303
|
|
|
|
|
|
|
Usage : $taxon->db_handle($newval) |
304
|
|
|
|
|
|
|
Function: Get/Set Bio::DB::Taxonomy Handle |
305
|
|
|
|
|
|
|
Returns : value of db_handle (a scalar) (Bio::DB::Taxonomy object) |
306
|
|
|
|
|
|
|
Args : on set, new value (a scalar, optional) Bio::DB::Taxonomy object |
307
|
|
|
|
|
|
|
|
308
|
|
|
|
|
|
|
Also see L |
309
|
|
|
|
|
|
|
|
310
|
|
|
|
|
|
|
=cut |
311
|
|
|
|
|
|
|
|
312
|
|
|
|
|
|
|
sub db_handle { |
313
|
26559
|
|
|
26559
|
1
|
29280
|
my $self = shift; |
314
|
26559
|
100
|
|
|
|
35234
|
if (@_) { |
315
|
252
|
|
|
|
|
446
|
my $db = shift; |
316
|
|
|
|
|
|
|
|
317
|
252
|
50
|
33
|
|
|
2726
|
if (! ref($db) || ! $db->isa('Bio::DB::Taxonomy')) { |
318
|
0
|
|
|
|
|
0
|
$self->throw("Must provide a valid Bio::DB::Taxonomy object to db_handle()"); |
319
|
|
|
|
|
|
|
} |
320
|
252
|
50
|
33
|
|
|
970
|
if (!$self->{'db_handle'} || ($self->{'db_handle'} && $self->{'db_handle'} ne $db)) { |
|
|
|
66
|
|
|
|
|
321
|
252
|
|
|
|
|
951
|
my $new_self = $self->_get_similar_taxon_from_db($self, $db); |
322
|
252
|
50
|
|
|
|
1149
|
$self->_merge_taxa($new_self) if $new_self; |
323
|
|
|
|
|
|
|
} |
324
|
|
|
|
|
|
|
|
325
|
|
|
|
|
|
|
# NB: The Bio::DB::Taxonomy modules access this data member directly |
326
|
|
|
|
|
|
|
# to avoid calling this method and going infinite |
327
|
252
|
|
|
|
|
516
|
$self->{'db_handle'} = $db; |
328
|
|
|
|
|
|
|
} |
329
|
26559
|
|
|
|
|
55336
|
return $self->{'db_handle'}; |
330
|
|
|
|
|
|
|
} |
331
|
|
|
|
|
|
|
|
332
|
|
|
|
|
|
|
|
333
|
|
|
|
|
|
|
=head2 rank |
334
|
|
|
|
|
|
|
|
335
|
|
|
|
|
|
|
Title : rank |
336
|
|
|
|
|
|
|
Usage : $taxon->rank($newval) |
337
|
|
|
|
|
|
|
Function: Get/set rank of this Taxon, 'species', 'genus', 'order', etc... |
338
|
|
|
|
|
|
|
Returns : value of rank (a scalar) |
339
|
|
|
|
|
|
|
Args : on set, new value (a scalar or undef, optional) |
340
|
|
|
|
|
|
|
|
341
|
|
|
|
|
|
|
=cut |
342
|
|
|
|
|
|
|
|
343
|
|
|
|
|
|
|
sub rank { |
344
|
9397
|
|
|
9397
|
1
|
10476
|
my $self = shift; |
345
|
9397
|
100
|
|
|
|
15154
|
return $self->{'rank'} = shift if @_; |
346
|
9094
|
|
|
|
|
25481
|
return $self->{'rank'}; |
347
|
|
|
|
|
|
|
} |
348
|
|
|
|
|
|
|
|
349
|
|
|
|
|
|
|
|
350
|
|
|
|
|
|
|
=head2 id |
351
|
|
|
|
|
|
|
|
352
|
|
|
|
|
|
|
Title : id |
353
|
|
|
|
|
|
|
Usage : $taxon->id($newval) |
354
|
|
|
|
|
|
|
Function: Get/Set id (NCBI Taxonomy ID in most cases); object_id() and |
355
|
|
|
|
|
|
|
ncbi_taxid() are synonyms of this method. |
356
|
|
|
|
|
|
|
Returns : id (a scalar) |
357
|
|
|
|
|
|
|
Args : none to get, OR scalar to set |
358
|
|
|
|
|
|
|
|
359
|
|
|
|
|
|
|
=cut |
360
|
|
|
|
|
|
|
|
361
|
|
|
|
|
|
|
sub id { |
362
|
33108
|
|
|
33108
|
1
|
33436
|
my $self = shift; |
363
|
33108
|
|
|
|
|
55265
|
return $self->SUPER::id(@_); |
364
|
|
|
|
|
|
|
} |
365
|
|
|
|
|
|
|
|
366
|
|
|
|
|
|
|
*object_id = \&id; |
367
|
|
|
|
|
|
|
|
368
|
|
|
|
|
|
|
|
369
|
|
|
|
|
|
|
=head2 ncbi_taxid |
370
|
|
|
|
|
|
|
|
371
|
|
|
|
|
|
|
Title : ncbi_taxid |
372
|
|
|
|
|
|
|
Usage : $taxon->ncbi_taxid($newval) |
373
|
|
|
|
|
|
|
Function: Get/Set the NCBI Taxonomy ID; This actually sets the id() but only |
374
|
|
|
|
|
|
|
returns an id when ncbi_taxid has been explictely set with this |
375
|
|
|
|
|
|
|
method. |
376
|
|
|
|
|
|
|
Returns : id (a scalar) |
377
|
|
|
|
|
|
|
Args : none to get, OR scalar to set |
378
|
|
|
|
|
|
|
|
379
|
|
|
|
|
|
|
=cut |
380
|
|
|
|
|
|
|
|
381
|
|
|
|
|
|
|
sub ncbi_taxid { |
382
|
363
|
|
|
363
|
1
|
1008
|
my ($self, $id) = @_; |
383
|
|
|
|
|
|
|
|
384
|
363
|
100
|
|
|
|
967
|
if ($id) { |
385
|
190
|
|
|
|
|
416
|
$self->{_ncbi_tax_id_provided} = 1; |
386
|
190
|
|
|
|
|
797
|
return $self->SUPER::id($id); |
387
|
|
|
|
|
|
|
} |
388
|
|
|
|
|
|
|
|
389
|
173
|
100
|
|
|
|
474
|
if ($self->{_ncbi_tax_id_provided}) { |
390
|
57
|
|
|
|
|
197
|
return $self->SUPER::id; |
391
|
|
|
|
|
|
|
} |
392
|
116
|
|
|
|
|
461
|
return; |
393
|
|
|
|
|
|
|
} |
394
|
|
|
|
|
|
|
|
395
|
|
|
|
|
|
|
|
396
|
|
|
|
|
|
|
=head2 parent_id |
397
|
|
|
|
|
|
|
|
398
|
|
|
|
|
|
|
Title : parent_id |
399
|
|
|
|
|
|
|
Usage : $taxon->parent_id() |
400
|
|
|
|
|
|
|
Function: Get parent ID, (NCBI Taxonomy ID in most cases); |
401
|
|
|
|
|
|
|
parent_taxon_id() is a synonym of this method. |
402
|
|
|
|
|
|
|
Returns : value of parent_id (a scalar) |
403
|
|
|
|
|
|
|
Args : none |
404
|
|
|
|
|
|
|
|
405
|
|
|
|
|
|
|
=cut |
406
|
|
|
|
|
|
|
|
407
|
|
|
|
|
|
|
sub parent_id { |
408
|
2
|
|
|
2
|
1
|
6
|
my $self = shift; |
409
|
2
|
50
|
|
|
|
10
|
if (@_) { |
410
|
0
|
|
|
|
|
0
|
$self->{parent_id} = shift; |
411
|
|
|
|
|
|
|
} |
412
|
2
|
50
|
|
|
|
8
|
if (defined $self->{parent_id}) { |
413
|
|
|
|
|
|
|
return $self->{parent_id} |
414
|
0
|
|
|
|
|
0
|
} |
415
|
2
|
|
50
|
|
|
7
|
my $ancestor = $self->ancestor() || return; |
416
|
2
|
|
|
|
|
6
|
return $ancestor->id; |
417
|
|
|
|
|
|
|
} |
418
|
|
|
|
|
|
|
|
419
|
|
|
|
|
|
|
*parent_taxon_id = \&parent_id; |
420
|
|
|
|
|
|
|
|
421
|
|
|
|
|
|
|
=head2 trusted_parent_id |
422
|
|
|
|
|
|
|
|
423
|
|
|
|
|
|
|
Title : trusted_parent_id |
424
|
|
|
|
|
|
|
Usage : $taxon->trusted_parent_id() |
425
|
|
|
|
|
|
|
Function: If the parent_id is explicitly set, trust it |
426
|
|
|
|
|
|
|
Returns : simple boolean value (whether or not it has been set) |
427
|
|
|
|
|
|
|
Args : none |
428
|
|
|
|
|
|
|
Notes : Previously, the parent_id method was to be deprecated in favor of |
429
|
|
|
|
|
|
|
using ancestor(). However this removes one key optimization point, |
430
|
|
|
|
|
|
|
namely when an implementation has direct access to the taxon's |
431
|
|
|
|
|
|
|
parent ID when retrieving the information for the taxon ID. This |
432
|
|
|
|
|
|
|
method is in place so implementations can choose to (1) check whether |
433
|
|
|
|
|
|
|
the parent_id is set and (2) trust that the implementation (whether |
434
|
|
|
|
|
|
|
it is self or another implementation) set the parent_id correctly. |
435
|
|
|
|
|
|
|
|
436
|
|
|
|
|
|
|
=cut |
437
|
|
|
|
|
|
|
|
438
|
|
|
|
|
|
|
sub trusted_parent_id { |
439
|
0
|
|
|
0
|
1
|
0
|
return defined $_[0]->{parent_id}; |
440
|
|
|
|
|
|
|
} |
441
|
|
|
|
|
|
|
|
442
|
|
|
|
|
|
|
=head2 genetic_code |
443
|
|
|
|
|
|
|
|
444
|
|
|
|
|
|
|
Title : genetic_code |
445
|
|
|
|
|
|
|
Usage : $taxon->genetic_code($newval) |
446
|
|
|
|
|
|
|
Function: Get/set genetic code table |
447
|
|
|
|
|
|
|
Returns : value of genetic_code (a scalar) |
448
|
|
|
|
|
|
|
Args : on set, new value (a scalar or undef, optional) |
449
|
|
|
|
|
|
|
|
450
|
|
|
|
|
|
|
=cut |
451
|
|
|
|
|
|
|
|
452
|
|
|
|
|
|
|
sub genetic_code { |
453
|
506
|
|
|
506
|
1
|
619
|
my $self = shift; |
454
|
506
|
50
|
|
|
|
940
|
return $self->{'genetic_code'} = shift if @_; |
455
|
506
|
|
|
|
|
741
|
return $self->{'genetic_code'}; |
456
|
|
|
|
|
|
|
} |
457
|
|
|
|
|
|
|
|
458
|
|
|
|
|
|
|
|
459
|
|
|
|
|
|
|
=head2 mitochondrial_genetic_code |
460
|
|
|
|
|
|
|
|
461
|
|
|
|
|
|
|
Title : mitochondrial_genetic_code |
462
|
|
|
|
|
|
|
Usage : $taxon->mitochondrial_genetic_code($newval) |
463
|
|
|
|
|
|
|
Function: Get/set mitochondrial genetic code table |
464
|
|
|
|
|
|
|
Returns : value of mitochondrial_genetic_code (a scalar) |
465
|
|
|
|
|
|
|
Args : on set, new value (a scalar or undef, optional) |
466
|
|
|
|
|
|
|
|
467
|
|
|
|
|
|
|
=cut |
468
|
|
|
|
|
|
|
|
469
|
|
|
|
|
|
|
sub mitochondrial_genetic_code { |
470
|
506
|
|
|
506
|
1
|
708
|
my $self = shift; |
471
|
506
|
50
|
|
|
|
928
|
return $self->{'mitochondrial_genetic_code'} = shift if @_; |
472
|
506
|
|
|
|
|
745
|
return $self->{'mitochondrial_genetic_code'}; |
473
|
|
|
|
|
|
|
} |
474
|
|
|
|
|
|
|
|
475
|
|
|
|
|
|
|
|
476
|
|
|
|
|
|
|
=head2 create_date |
477
|
|
|
|
|
|
|
|
478
|
|
|
|
|
|
|
Title : create_date |
479
|
|
|
|
|
|
|
Usage : $taxon->create_date($newval) |
480
|
|
|
|
|
|
|
Function: Get/Set Date this node was created (in the database) |
481
|
|
|
|
|
|
|
Returns : value of create_date (a scalar) |
482
|
|
|
|
|
|
|
Args : on set, new value (a scalar or undef, optional) |
483
|
|
|
|
|
|
|
|
484
|
|
|
|
|
|
|
=cut |
485
|
|
|
|
|
|
|
|
486
|
|
|
|
|
|
|
sub create_date { |
487
|
504
|
|
|
504
|
1
|
680
|
my $self = shift; |
488
|
504
|
50
|
|
|
|
977
|
return $self->{'create_date'} = shift if @_; |
489
|
504
|
|
|
|
|
712
|
return $self->{'create_date'}; |
490
|
|
|
|
|
|
|
} |
491
|
|
|
|
|
|
|
|
492
|
|
|
|
|
|
|
|
493
|
|
|
|
|
|
|
=head2 update_date |
494
|
|
|
|
|
|
|
|
495
|
|
|
|
|
|
|
Title : update_date |
496
|
|
|
|
|
|
|
Usage : $taxon->update_date($newval) |
497
|
|
|
|
|
|
|
Function: Get/Set Date this node was updated (in the database) |
498
|
|
|
|
|
|
|
Returns : value of update_date (a scalar) |
499
|
|
|
|
|
|
|
Args : on set, new value (a scalar or undef, optional) |
500
|
|
|
|
|
|
|
|
501
|
|
|
|
|
|
|
=cut |
502
|
|
|
|
|
|
|
|
503
|
|
|
|
|
|
|
sub update_date { |
504
|
504
|
|
|
504
|
1
|
760
|
my $self = shift; |
505
|
504
|
50
|
|
|
|
854
|
return $self->{'update_date'} = shift if @_; |
506
|
504
|
|
|
|
|
764
|
return $self->{'update_date'}; |
507
|
|
|
|
|
|
|
} |
508
|
|
|
|
|
|
|
|
509
|
|
|
|
|
|
|
|
510
|
|
|
|
|
|
|
=head2 pub_date |
511
|
|
|
|
|
|
|
|
512
|
|
|
|
|
|
|
Title : pub_date |
513
|
|
|
|
|
|
|
Usage : $taxon->pub_date($newval) |
514
|
|
|
|
|
|
|
Function: Get/Set Date this node was published (in the database) |
515
|
|
|
|
|
|
|
Returns : value of pub_date (a scalar) |
516
|
|
|
|
|
|
|
Args : on set, new value (a scalar or undef, optional) |
517
|
|
|
|
|
|
|
|
518
|
|
|
|
|
|
|
=cut |
519
|
|
|
|
|
|
|
|
520
|
|
|
|
|
|
|
sub pub_date { |
521
|
504
|
|
|
504
|
1
|
647
|
my $self = shift; |
522
|
504
|
50
|
|
|
|
881
|
return $self->{'pub_date'} = shift if @_; |
523
|
504
|
|
|
|
|
700
|
return $self->{'pub_date'}; |
524
|
|
|
|
|
|
|
} |
525
|
|
|
|
|
|
|
|
526
|
|
|
|
|
|
|
|
527
|
|
|
|
|
|
|
=head2 ancestor |
528
|
|
|
|
|
|
|
|
529
|
|
|
|
|
|
|
Title : ancestor |
530
|
|
|
|
|
|
|
Usage : my $ancestor_taxon = $taxon->ancestor() |
531
|
|
|
|
|
|
|
Function: Retrieve the ancestor taxon. Normally the database is asked what the |
532
|
|
|
|
|
|
|
ancestor is. |
533
|
|
|
|
|
|
|
|
534
|
|
|
|
|
|
|
If you manually set the ancestor (or you make a Bio::Tree::Tree with |
535
|
|
|
|
|
|
|
this object as an argument to new()), the database (if any) will not |
536
|
|
|
|
|
|
|
be used for the purposes of this method. |
537
|
|
|
|
|
|
|
|
538
|
|
|
|
|
|
|
To restore normal database behaviour, call ancestor(undef) (which |
539
|
|
|
|
|
|
|
would remove this object from the tree), or request this taxon again |
540
|
|
|
|
|
|
|
as a new Taxon object from the database. |
541
|
|
|
|
|
|
|
|
542
|
|
|
|
|
|
|
Returns : Bio::Taxon |
543
|
|
|
|
|
|
|
Args : none |
544
|
|
|
|
|
|
|
|
545
|
|
|
|
|
|
|
=cut |
546
|
|
|
|
|
|
|
|
547
|
|
|
|
|
|
|
sub ancestor { |
548
|
30160
|
|
|
30160
|
1
|
29516
|
my $self = shift; |
549
|
30160
|
|
|
|
|
43297
|
my $ancestor = $self->SUPER::ancestor(@_); |
550
|
30160
|
100
|
|
|
|
40171
|
if ($ancestor) { |
551
|
25660
|
|
|
|
|
43240
|
return $ancestor; |
552
|
|
|
|
|
|
|
} |
553
|
4500
|
|
|
|
|
6874
|
my $dbh = $self->db_handle; |
554
|
|
|
|
|
|
|
#*** could avoid the db lookup if we knew our current id was definitely |
555
|
|
|
|
|
|
|
# information from the db... |
556
|
|
|
|
|
|
|
|
557
|
4500
|
|
|
|
|
8044
|
my $definitely_from_dbh = $self->_get_similar_taxon_from_db($self); |
558
|
4500
|
|
|
|
|
8856
|
return $dbh->ancestor($definitely_from_dbh); |
559
|
|
|
|
|
|
|
} |
560
|
|
|
|
|
|
|
|
561
|
|
|
|
|
|
|
|
562
|
|
|
|
|
|
|
=head2 get_Parent_Node |
563
|
|
|
|
|
|
|
|
564
|
|
|
|
|
|
|
Title : get_Parent_Node |
565
|
|
|
|
|
|
|
Function: Synonym of ancestor() |
566
|
|
|
|
|
|
|
Status : deprecated |
567
|
|
|
|
|
|
|
|
568
|
|
|
|
|
|
|
=cut |
569
|
|
|
|
|
|
|
|
570
|
|
|
|
|
|
|
sub get_Parent_Node { |
571
|
0
|
|
|
0
|
1
|
0
|
my $self = shift; |
572
|
0
|
|
|
|
|
0
|
$self->warn("get_Parent_Node is deprecated, use ancestor() instead"); |
573
|
0
|
|
|
|
|
0
|
return $self->ancestor(@_); |
574
|
|
|
|
|
|
|
} |
575
|
|
|
|
|
|
|
|
576
|
|
|
|
|
|
|
|
577
|
|
|
|
|
|
|
=head2 each_Descendent |
578
|
|
|
|
|
|
|
|
579
|
|
|
|
|
|
|
Title : each_Descendent |
580
|
|
|
|
|
|
|
Usage : my @taxa = $taxon->each_Descendent(); |
581
|
|
|
|
|
|
|
Function: Get all the descendents for this Taxon (but not their descendents, |
582
|
|
|
|
|
|
|
ie. not a recursive fetchall). get_Children_Nodes() is a synonym of |
583
|
|
|
|
|
|
|
this method. |
584
|
|
|
|
|
|
|
|
585
|
|
|
|
|
|
|
Note that this method never asks the database for the descendents; |
586
|
|
|
|
|
|
|
it will only return objects you have manually set with |
587
|
|
|
|
|
|
|
add_Descendent(), or where this was done for you by making a |
588
|
|
|
|
|
|
|
Bio::Tree::Tree with this object as an argument to new(). |
589
|
|
|
|
|
|
|
|
590
|
|
|
|
|
|
|
To get the database descendents use |
591
|
|
|
|
|
|
|
$taxon->db_handle->each_Descendent($taxon). |
592
|
|
|
|
|
|
|
|
593
|
|
|
|
|
|
|
Returns : Array of Bio::Taxon objects |
594
|
|
|
|
|
|
|
Args : optionally, when you have set your own descendents, the string |
595
|
|
|
|
|
|
|
"height", "creation", "alpha", "revalpha", or coderef to be used to |
596
|
|
|
|
|
|
|
sort the order of children nodes. |
597
|
|
|
|
|
|
|
|
598
|
|
|
|
|
|
|
=cut |
599
|
|
|
|
|
|
|
|
600
|
|
|
|
|
|
|
|
601
|
|
|
|
|
|
|
# implemented by Bio::Tree::Node |
602
|
|
|
|
|
|
|
|
603
|
|
|
|
|
|
|
=head2 get_Children_Nodes |
604
|
|
|
|
|
|
|
|
605
|
|
|
|
|
|
|
Title : get_Children_Nodes |
606
|
|
|
|
|
|
|
Function: Synonym of each_Descendent() |
607
|
|
|
|
|
|
|
Status : deprecated |
608
|
|
|
|
|
|
|
|
609
|
|
|
|
|
|
|
=cut |
610
|
|
|
|
|
|
|
|
611
|
|
|
|
|
|
|
sub get_Children_Nodes { |
612
|
0
|
|
|
0
|
1
|
0
|
my $self = shift; |
613
|
0
|
|
|
|
|
0
|
$self->warn("get_Children_Nodes is deprecated, use each_Descendent() instead"); |
614
|
0
|
|
|
|
|
0
|
return $self->each_Descendent(@_); |
615
|
|
|
|
|
|
|
} |
616
|
|
|
|
|
|
|
|
617
|
|
|
|
|
|
|
|
618
|
|
|
|
|
|
|
=head2 name |
619
|
|
|
|
|
|
|
|
620
|
|
|
|
|
|
|
Title: name |
621
|
|
|
|
|
|
|
Usage: $taxon->name('scientific', 'Homo sapiens'); |
622
|
|
|
|
|
|
|
$taxon->name('common', 'human', 'man'); |
623
|
|
|
|
|
|
|
my @names = @{$taxon->name('common')}; |
624
|
|
|
|
|
|
|
Function: Get/set the names. node_name(), scientific_name() and common_names() |
625
|
|
|
|
|
|
|
are shorthands to name('scientific'), name('scientific') and |
626
|
|
|
|
|
|
|
name('common') respectively. |
627
|
|
|
|
|
|
|
Returns: names (a array reference) |
628
|
|
|
|
|
|
|
Args: Arg1 => the name_class. You can assign any text, but the words |
629
|
|
|
|
|
|
|
'scientific' and 'common' have the special meaning, as |
630
|
|
|
|
|
|
|
scientific name and common name, respectively. 'scientific' and |
631
|
|
|
|
|
|
|
'division' are treated specially, allowing only the first value |
632
|
|
|
|
|
|
|
in the Arg2 list to be set. |
633
|
|
|
|
|
|
|
Arg2 ... => list of names |
634
|
|
|
|
|
|
|
|
635
|
|
|
|
|
|
|
=cut |
636
|
|
|
|
|
|
|
|
637
|
|
|
|
|
|
|
sub name { |
638
|
20254
|
|
|
20254
|
1
|
28219
|
my ($self, $name_class, @names) = @_; |
639
|
20254
|
50
|
|
|
|
28693
|
$self->throw('No name class specified') unless defined $name_class; |
640
|
|
|
|
|
|
|
|
641
|
20254
|
100
|
|
|
|
29462
|
if (@names) { |
642
|
7397
|
100
|
|
|
|
34354
|
if ($name_class =~ /scientific|division/i) { |
643
|
7160
|
|
|
|
|
12092
|
delete $self->{'_names_hash'}->{$name_class}; |
644
|
7160
|
|
|
|
|
9812
|
@names = (shift(@names)); |
645
|
|
|
|
|
|
|
} |
646
|
7397
|
|
|
|
|
7773
|
push @{$self->{'_names_hash'}->{$name_class}}, @names; |
|
7397
|
|
|
|
|
19207
|
|
647
|
|
|
|
|
|
|
} |
648
|
20254
|
|
100
|
|
|
63664
|
return $self->{'_names_hash'}->{$name_class} || return; |
649
|
|
|
|
|
|
|
} |
650
|
|
|
|
|
|
|
|
651
|
|
|
|
|
|
|
|
652
|
|
|
|
|
|
|
=head2 node_name |
653
|
|
|
|
|
|
|
|
654
|
|
|
|
|
|
|
Title : node_name |
655
|
|
|
|
|
|
|
Usage : $taxon->node_name($newval) |
656
|
|
|
|
|
|
|
Function: Get/set the name of this taxon (node), typically the scientific name |
657
|
|
|
|
|
|
|
of the taxon, eg. 'Primate' or 'Homo'; scientific_name() is a synonym |
658
|
|
|
|
|
|
|
of this method. |
659
|
|
|
|
|
|
|
Returns : value of node_name (a scalar) |
660
|
|
|
|
|
|
|
Args : on set, new value (a scalar or undef, optional) |
661
|
|
|
|
|
|
|
|
662
|
|
|
|
|
|
|
=cut |
663
|
|
|
|
|
|
|
|
664
|
|
|
|
|
|
|
sub node_name { |
665
|
18896
|
|
|
18896
|
1
|
20412
|
my $self = shift; |
666
|
18896
|
100
|
|
|
|
17962
|
my @v = @{$self->name('scientific', @_) || []}; |
|
18896
|
|
|
|
|
31988
|
|
667
|
18896
|
|
|
|
|
37903
|
return pop @v; |
668
|
|
|
|
|
|
|
} |
669
|
|
|
|
|
|
|
|
670
|
|
|
|
|
|
|
*scientific_name = \&node_name; |
671
|
|
|
|
|
|
|
|
672
|
|
|
|
|
|
|
|
673
|
|
|
|
|
|
|
=head2 common_names |
674
|
|
|
|
|
|
|
|
675
|
|
|
|
|
|
|
Title : common_names |
676
|
|
|
|
|
|
|
Usage : $taxon->common_names($newval) |
677
|
|
|
|
|
|
|
Function: Get/add the other names of this taxon, typically the genbank common |
678
|
|
|
|
|
|
|
name and others, eg. 'Human' and 'man'. common_name() is a synonym |
679
|
|
|
|
|
|
|
of this method. |
680
|
|
|
|
|
|
|
Returns : array of names in list context, one of those names in scalar context |
681
|
|
|
|
|
|
|
Args : on add, new list of names (scalars, optional) |
682
|
|
|
|
|
|
|
|
683
|
|
|
|
|
|
|
=cut |
684
|
|
|
|
|
|
|
|
685
|
|
|
|
|
|
|
sub common_names { |
686
|
637
|
|
|
637
|
1
|
961
|
my $self = shift; |
687
|
637
|
100
|
|
|
|
1106
|
my @v = @{$self->name('common', @_) || []}; |
|
637
|
|
|
|
|
1229
|
|
688
|
637
|
100
|
|
|
|
2978
|
return ( wantarray ) ? @v : pop @v; |
689
|
|
|
|
|
|
|
} |
690
|
|
|
|
|
|
|
|
691
|
|
|
|
|
|
|
*common_name = \&common_names; |
692
|
|
|
|
|
|
|
|
693
|
|
|
|
|
|
|
|
694
|
|
|
|
|
|
|
=head2 division |
695
|
|
|
|
|
|
|
|
696
|
|
|
|
|
|
|
Title : division |
697
|
|
|
|
|
|
|
Usage : $taxon->division($newval) |
698
|
|
|
|
|
|
|
Function: Get/set the division this taxon belongs to, eg. 'Primates' or |
699
|
|
|
|
|
|
|
'Bacteria'. |
700
|
|
|
|
|
|
|
Returns : value of division (a scalar) |
701
|
|
|
|
|
|
|
Args : on set, new value (a scalar or undef, optional) |
702
|
|
|
|
|
|
|
|
703
|
|
|
|
|
|
|
=cut |
704
|
|
|
|
|
|
|
|
705
|
|
|
|
|
|
|
sub division { |
706
|
506
|
|
|
506
|
1
|
1596
|
my $self = shift; |
707
|
506
|
50
|
|
|
|
628
|
my @v = @{$self->name('division',@_) || []}; |
|
506
|
|
|
|
|
942
|
|
708
|
506
|
|
|
|
|
929
|
return pop @v; |
709
|
|
|
|
|
|
|
} |
710
|
|
|
|
|
|
|
|
711
|
|
|
|
|
|
|
|
712
|
|
|
|
|
|
|
# get a node from the database that is like the supplied node |
713
|
|
|
|
|
|
|
sub _get_similar_taxon_from_db { |
714
|
|
|
|
|
|
|
#*** not really happy with this having to be called so much; there must be |
715
|
|
|
|
|
|
|
# a better way... |
716
|
4752
|
|
|
4752
|
|
7172
|
my ($self, $taxon, $db) = @_; |
717
|
4752
|
50
|
33
|
|
|
18973
|
$self->throw("Must supply a Bio::Taxon") unless ref($taxon) && $taxon->isa("Bio::Taxon"); |
718
|
4752
|
50
|
66
|
|
|
7451
|
($self->id || $self->node_name) || return; |
719
|
4752
|
|
50
|
|
|
12855
|
$db ||= $self->db_handle || return; |
|
|
|
66
|
|
|
|
|
720
|
4752
|
50
|
33
|
|
|
23713
|
if (!blessed($db) || !$db->isa('Bio::DB::Taxonomy')) { |
721
|
0
|
|
|
|
|
0
|
$self->throw("DB handle is not a Bio::DB::Taxonomy: got $db in node ".$self->node_name) |
722
|
|
|
|
|
|
|
} |
723
|
4752
|
100
|
|
|
|
8485
|
my $db_taxon = $db->get_taxon(-taxonid => $taxon->id) if $taxon->id; |
724
|
4752
|
100
|
|
|
|
9153
|
unless ($db_taxon) { |
725
|
252
|
50
|
|
|
|
585
|
my @try_ids = $db->get_taxonids($taxon->node_name) if $taxon->node_name; |
726
|
|
|
|
|
|
|
|
727
|
252
|
|
50
|
|
|
663
|
my $own_rank = $taxon->rank || 'no rank'; |
728
|
252
|
|
|
|
|
706
|
foreach my $try_id (@try_ids) { |
729
|
252
|
|
|
|
|
1327
|
my $try = $db->get_taxon(-taxonid => $try_id); |
730
|
252
|
|
50
|
|
|
643
|
my $try_rank = $try->rank || 'no rank'; |
731
|
252
|
50
|
33
|
|
|
1455
|
if ($own_rank eq 'no rank' || $try_rank eq 'no rank' || $own_rank eq $try_rank) { |
|
|
|
33
|
|
|
|
|
732
|
252
|
|
|
|
|
371
|
$db_taxon = $try; |
733
|
252
|
|
|
|
|
599
|
last; |
734
|
|
|
|
|
|
|
} |
735
|
|
|
|
|
|
|
} |
736
|
|
|
|
|
|
|
} |
737
|
|
|
|
|
|
|
|
738
|
4752
|
|
|
|
|
6631
|
return $db_taxon; |
739
|
|
|
|
|
|
|
} |
740
|
|
|
|
|
|
|
|
741
|
|
|
|
|
|
|
|
742
|
|
|
|
|
|
|
# merge data from supplied Taxon into self |
743
|
|
|
|
|
|
|
sub _merge_taxa { |
744
|
252
|
|
|
252
|
|
680
|
my ($self, $taxon) = @_; |
745
|
252
|
50
|
33
|
|
|
1540
|
$self->throw("Must supply a Bio::Taxon object") unless ref($taxon) && $taxon->isa('Bio::Taxon'); |
746
|
252
|
50
|
|
|
|
892
|
return if ($taxon eq $self); |
747
|
|
|
|
|
|
|
|
748
|
252
|
|
|
|
|
752
|
foreach my $attrib (qw(scientific_name version authority namespace genetic_code mitochondrial_genetic_code create_date update_date pub_date division id)) { |
749
|
2772
|
|
|
|
|
6833
|
my $own = $self->$attrib(); |
750
|
2772
|
|
|
|
|
4181
|
my $his = $taxon->$attrib(); |
751
|
2772
|
100
|
100
|
|
|
6881
|
if (!$own && $his) { |
752
|
248
|
|
|
|
|
556
|
$self->$attrib($his); |
753
|
|
|
|
|
|
|
} |
754
|
|
|
|
|
|
|
} |
755
|
|
|
|
|
|
|
|
756
|
252
|
|
50
|
|
|
629
|
my $own = $self->rank || 'no rank'; |
757
|
252
|
|
50
|
|
|
616
|
my $his = $taxon->rank || 'no rank'; |
758
|
252
|
50
|
33
|
|
|
1020
|
if ($own eq 'no rank' && $his ne 'no rank') { |
759
|
0
|
|
|
|
|
0
|
$self->rank($his); |
760
|
|
|
|
|
|
|
} |
761
|
|
|
|
|
|
|
|
762
|
252
|
|
|
|
|
892
|
my %own_cnames = map { $_ => 1 } $self->common_names; |
|
2
|
|
|
|
|
8
|
|
763
|
252
|
|
|
|
|
709
|
my %his_cnames = map { $_ => 1 } $taxon->common_names; |
|
0
|
|
|
|
|
0
|
|
764
|
252
|
|
|
|
|
1356
|
foreach (keys %his_cnames) { |
765
|
0
|
0
|
|
|
|
|
unless (exists $own_cnames{$_}) { |
766
|
0
|
|
|
|
|
|
$self->common_names($_); |
767
|
|
|
|
|
|
|
} |
768
|
|
|
|
|
|
|
} |
769
|
|
|
|
|
|
|
|
770
|
|
|
|
|
|
|
#*** haven't merged the other things in names() hash, could do above much easier with direct access to object data |
771
|
|
|
|
|
|
|
} |
772
|
|
|
|
|
|
|
|
773
|
|
|
|
|
|
|
|
774
|
|
|
|
|
|
|
=head2 remove_Descendent |
775
|
|
|
|
|
|
|
|
776
|
|
|
|
|
|
|
Title : remove_Descendent |
777
|
|
|
|
|
|
|
Usage : $node->remove_Descedent($node_foo); |
778
|
|
|
|
|
|
|
Function: Removes a specific node from being a Descendent of this node |
779
|
|
|
|
|
|
|
Returns : nothing |
780
|
|
|
|
|
|
|
Args : An array of Bio::Node::NodeI objects which have been previously |
781
|
|
|
|
|
|
|
passed to the add_Descendent call of this object. |
782
|
|
|
|
|
|
|
|
783
|
|
|
|
|
|
|
=cut |
784
|
|
|
|
|
|
|
|
785
|
|
|
|
|
|
|
sub remove_Descendent { |
786
|
|
|
|
|
|
|
# need to override this method from Bio::Tree::Node since it casually |
787
|
|
|
|
|
|
|
# throws away nodes if they don't branch |
788
|
0
|
|
|
0
|
1
|
|
my ($self,@nodes) = @_; |
789
|
0
|
|
|
|
|
|
my $c= 0; |
790
|
0
|
|
|
|
|
|
foreach my $n ( @nodes ) { |
791
|
0
|
0
|
|
|
|
|
if ($self->{'_desc'}->{$n->internal_id}) { |
792
|
0
|
|
|
|
|
|
$self->{_removing_descendent} = 1; |
793
|
0
|
|
|
|
|
|
$n->ancestor(undef); |
794
|
0
|
|
|
|
|
|
$self->{_removing_descendent} = 0; |
795
|
0
|
|
|
|
|
|
$self->{'_desc'}->{$n->internal_id}->ancestor(undef); |
796
|
0
|
|
|
|
|
|
delete $self->{'_desc'}->{$n->internal_id}; |
797
|
0
|
|
|
|
|
|
$c++; |
798
|
|
|
|
|
|
|
} |
799
|
|
|
|
|
|
|
} |
800
|
0
|
|
|
|
|
|
return $c; |
801
|
|
|
|
|
|
|
} |
802
|
|
|
|
|
|
|
|
803
|
|
|
|
|
|
|
|
804
|
|
|
|
|
|
|
1; |