Raw content of Bio::EnsEMBL::Compara::NCBITaxon =head1 NAME NCBITaxon - DESCRIPTION of Object =head1 DESCRIPTION An object that hold a node within a taxonomic tree. Inherits from NestedSet. From Bio::Species classification common_name binomial Here are also the additional methods in Bio::Species that "might" be useful, but let us forget about these for now. genus species sub_species variant organelle division =head1 CONTACT Contact Jessica Severin on implemetation/design detail: jessica@ebi.ac.uk Contact Ewan Birney on EnsEMBL in general: birney@sanger.ac.uk =head1 APPENDIX The rest of the documentation details each of the object methods. Internal methods are usually preceded with a _ =cut package Bio::EnsEMBL::Compara::NCBITaxon; use strict; use Bio::Species; use Bio::EnsEMBL::Compara::NestedSet; use Bio::EnsEMBL::Utils::Exception; use Bio::EnsEMBL::Utils::Argument; our @ISA = qw(Bio::EnsEMBL::Compara::NestedSet); =head2 copy Arg [1] : int $member_id (optional) Example : Description: returns copy of object, calling superclass copy method Returntype : Exceptions : Caller : =cut sub copy { my $self = shift; my $mycopy = $self->SUPER::copy; bless $mycopy, "Bio::EnsEMBL::Compara::NCBITaxon"; $mycopy->ncbi_taxid($self->ncbi_taxid); $mycopy->rank($self->rank); $mycopy->genbank_hidden_flag($self->genbank_hidden_flag); return $mycopy; } sub ncbi_taxid { my $self = shift; my $value = shift; $self->node_id($value) if($value); return $self->node_id; } sub taxon_id { my $self = shift; my $value = shift; $self->node_id($value) if($value); return $self->node_id; } sub dbID { my $self = shift; my $value = shift; $self->node_id($value) if($value); return $self->node_id; } sub rank { my $self = shift; $self->{'_rank'} = shift if(@_); return $self->{'_rank'}; } sub genbank_hidden_flag { my $self = shift; $self->{'_genbank_hidden_flag'} = shift if(@_); return $self->{'_genbank_hidden_flag'}; } sub classification { my $self =shift; my @args = @_; my ($separator, $full); if (scalar @args) { ($separator, $full) = rearrange([qw(SEPARATOR FULL)], @args); } $separator = " " unless(defined $separator); $full = 0 unless (defined $full); $self->{"_separator"} = $separator unless (defined $self->{"_separator"}); $self->{"_separator_full"} = $separator unless (defined $self->{"_separator_full"}); $self->{'_classification'} = undef unless ($self->{"_separator"} eq $separator); $self->{'_classification_full'} = undef unless ($self->{"_separator_full"} eq $separator); return $self->{'_classification_full'} if ($full && defined $self->{'_classification_full'}); return $self->{'_classification'} if (!$full && defined $self->{'_classification'}); my $root = $self->root; my @classification; unless ($root->name eq "root") { unshift @classification, $self->name; } unless ($root->get_child_count == 0) { $root->_add_child_name_to_classification(\@classification, $full); } if ($self->rank eq 'species' || $self->rank eq 'subspecies') { my ($genus, $species, $subspecies) = split(" ", $self->binomial); unshift @classification, $species; unshift @classification, $subspecies if (defined $subspecies); } if ($full) { $self->{'_classification_full'} = join($separator,@classification); $self->{"_separator_full"} = $separator; return $self->{'_classification_full'}; } else { $self->{'_classification'} = join($separator,@classification); $self->{"_separator"} = $separator; return $self->{'_classification'}; } } =head2 subspecies Example : $ncbi->subspecies; Description: Returns the subspeceis name for this species Example : "verus" for Pan troglodytes verus Returntype : string Exceptions : Caller : general =cut sub subspecies { my $self = shift; unless (defined $self->{'_species'}) { my ($genus, $species, $subspecies) = split(" ", $self->binomial); $self->{'_species'} = $species; $self->{'_genus'} = $genus; $self->{'_subspecies'} = $subspecies; } return $self->{'_species'}; } =head2 species Example : $ncbi->species; Description: Returns the speceis name for this species Example : "sapiens" for Homo sapiens Returntype : string Exceptions : Caller : general =cut sub species { my $self = shift; unless (defined $self->{'_species'}) { my ($genus, $species, $subspecies) = split(" ", $self->binomial); $self->{'_species'} = $species; $self->{'_genus'} = $genus; $self->{'_subspecies'} = $subspecies; } return $self->{'_species'}; } =head2 genus Example : $ncbi->genus; Description: Returns the genus name for this species Returntype : string Example : "Homo" for Homo sapiens Exceptions : Caller : general =cut sub genus { my $self = shift; unless (defined $self->{'_genus'}) { my ($genus, $species, $subspecies) = split(" ", $self->binomial); $self->{'_species'} = $species; $self->{'_genus'} = $genus; $self->{'_subspecies'} = $subspecies; } return $self->{'_genus'}; } sub _add_child_name_to_classification { my $self = shift; my $classification = shift; my $full = shift; if ($self->get_child_count > 1) { throw("Can't classification on a multifurcating tree\n"); } elsif ($self->get_child_count == 1) { my $child = $self->children->[0]; if ($full) { unshift @$classification, $child->name unless ($child->rank eq "subgenus" || $child->rank eq "subspecies" || $child->rank eq "species"); } else { unless ($child->genbank_hidden_flag || $child->rank eq "subgenus") { unshift @$classification, $child->name; } } unless ($child->rank eq 'species') { $child->_add_child_name_to_classification($classification, $full); } } } =head2 common_name Example : $ncbi->common_name; Description: The comon name as defined by Genbank Returntype : string Exceptions : returns undef if no genbank common name exists. Caller : general =cut sub common_name { my $self = shift; if ($self->has_tag('genbank common name') && $self->rank eq 'species') { return $self->get_tagvalue('genbank common name'); } else { return undef; } } =head2 ensembl_alias_name Example : $ncbi->ensembl_alias_name; Description: The comon name as defined by ensembl alias Returntype : string Exceptions : returns undef if no ensembl alias name exists. Caller : general =cut sub ensembl_alias_name { my $self = shift; #Not checking for rank as we do above, because we do not get dog since the #rank for dog is subspecies (ensembl-51). if ($self->has_tag('ensembl alias name')) { return $self->get_tagvalue('ensembl alias name'); } else { return undef; } } =head2 binomial Example : $ncbi->binomial; Description: The binomial name (AKA the scientific name) of this genome Returntype : string Exceptions : warns when node is not a species or has no scientific name Caller : general =cut sub binomial { my $self = shift; if ($self->has_tag('scientific name') && ($self->rank eq 'species' || $self->rank eq 'subspecies')) { return $self->get_tagvalue('scientific name'); } else { warning("taxon_id=",$self->node_id," is not a species or subspecies. So binomial is undef\n"); return undef; } } =head2 ensembl_alias Example : $ncbi->ensembl_alias; Description: The ensembl_alias name (AKA the name in the ensembl website) of this genome Returntype : string Exceptions : warns when node is not a species or has no ensembl_alias Caller : general =cut sub ensembl_alias { my $self = shift; if ($self->has_tag('ensembl alias name')) { return $self->get_tagvalue('ensembl alias name'); } else { warning("taxon_id=",$self->node_id," is not a species or subspecies. So ensembl_alias is undef\n"); return undef; } } =head2 short_name Example : $ncbi->short_name; Description: The name of this genome in the Gspe ('G'enera 'spe'cies) format. Returntype : string Exceptions : none Caller : general =cut sub short_name { my $self = shift; my $name = $self->name; $name =~ s/(\S)\S+\s(\S{3})\S+/$1$2/; $name =~ s/\ //g; return $name; } sub get_short_name { my $self = shift; return $self->short_name; } sub RAP_species_format { my $self = shift; my $newick = ""; if($self->get_child_count() > 0) { $newick .= "("; my $first_child=1; foreach my $child (@{$self->sorted_children}) { $newick .= "," unless($first_child); $newick .= $child->newick_format; $first_child = 0; } $newick .= ")"; } $newick .= sprintf("\"%s\"", $self->name,); $newick .= sprintf(":%1.4f", $self->distance_to_parent) if($self->distance_to_parent > 0); if(!($self->has_parent)) { $newick .= ";"; } return $newick; } sub print_node { my $self = shift; printf("(%s", $self->node_id); printf(" %s", $self->rank) if($self->rank); print(")"); printf("%s", $self->name) if($self->name); print("\n"); } 1;