Raw content of Bio::EnsEMBL::Compara::DBSQL::ProteinTreeAdaptor =head1 NAME ProteinTreeAdaptor - DESCRIPTION of Object =head1 SYNOPSIS =head1 DESCRIPTION =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::DBSQL::ProteinTreeAdaptor; use strict; use Bio::EnsEMBL::Compara::ProteinTree; use Bio::EnsEMBL::Compara::AlignedMember; use Bio::EnsEMBL::Utils::Exception qw(throw warning); use Bio::EnsEMBL::Compara::DBSQL::NestedSetAdaptor; use Bio::EnsEMBL::Compara::DBSQL::MemberAdaptor; our @ISA = qw(Bio::EnsEMBL::Compara::DBSQL::NestedSetAdaptor); ########################### # FETCH methods ########################### =head2 fetch_by_Member_root_id Arg[1] : Bio::EnsEMBL::Compara::Member Arg[2] : [optional] int clusterset_id (def. 1) Example : $protein_tree = $proteintree_adaptor->fetch_by_Member_root_id($member); Description: Fetches from the database the protein_tree that contains the member Returntype : Bio::EnsEMBL::Compara::ProteinTree Exceptions : Caller : =cut sub fetch_by_Member_root_id { my ($self, $member, $root_id) = @_; $root_id = $root_id || 1; my $aligned_member = $self->fetch_AlignedMember_by_member_id_root_id ( $member->get_longest_peptide_Member->member_id, $root_id); return undef unless (defined $aligned_member); my $node = $aligned_member->subroot; return undef unless (defined $node); my $protein_tree = $self->fetch_node_by_node_id($node->node_id); return $protein_tree; } =head2 fetch_AlignedMember_by_member_id_root_id Arg[1] : int member_id of a peptide member (longest translation) Arg[2] : [optional] int clusterset_id (def. 0) Example : my $aligned_member = $proteintree_adaptor-> fetch_AlignedMember_by_member_id_root_id ( $member->get_longest_peptide_Member->member_id ); Description: Fetches from the database the protein_tree that contains the member_id Returntype : Bio::EnsEMBL::Compara::AlignedMember Exceptions : Caller : =cut sub fetch_AlignedMember_by_member_id_root_id { my ($self, $member_id, $root_id) = @_; my $constraint = "WHERE tm.member_id = $member_id and m.member_id = $member_id"; $constraint .= " AND t.root_id = $root_id" if($root_id and $root_id>0); my $final_clause = "order by tm.node_id desc"; $self->final_clause($final_clause); my ($node) = @{$self->_generic_fetch($constraint)}; return $node; } =head2 fetch_AlignedMember_by_member_id_mlssID Arg[1] : int member_id of a peptide member (longest translation) Arg[2] : [optional] int clusterset_id (def. 0) Example : my $aligned_member = $proteintree_adaptor-> fetch_AlignedMember_by_member_id_mlssID ( $member->get_longest_peptide_Member->member_id, $mlssID ); Description: Fetches from the database the protein_tree that contains the member_id Returntype : Bio::EnsEMBL::Compara::AlignedMember Exceptions : Caller : =cut sub fetch_AlignedMember_by_member_id_mlssID { my ($self, $member_id, $mlss_id) = @_; my $constraint = "WHERE tm.member_id = $member_id and m.member_id = $member_id"; $constraint .= " AND tm.method_link_species_set_id = $mlss_id" if($mlss_id and $mlss_id>0); my ($node) = @{$self->_generic_fetch($constraint)}; return $node; } ########################### # STORE methods ########################### sub store { my ($self, $node) = @_; unless($node->isa('Bio::EnsEMBL::Compara::NestedSet')) { throw("set arg must be a [Bio::EnsEMBL::Compara::NestedSet] not a $node"); } $self->store_node($node); # recursively do all the children my $children = $node->children; foreach my $child_node (@$children) { $self->store($child_node); } return $node->node_id; } sub delete_tag { my $self = shift; my $node_id = shift; my $tag = shift; my $sql = "DELETE from protein_tree_tag where node_id=$node_id and tag=\"$tag\""; #print("$sql\n"); $self->dbc->do($sql); } sub store_node { my ($self, $node) = @_; unless($node->isa('Bio::EnsEMBL::Compara::NestedSet')) { throw("set arg must be a [Bio::EnsEMBL::Compara::NestedSet] not a $node"); } if($node->adaptor and $node->adaptor->isa('Bio::EnsEMBL::Compara::DBSQL::NestedSetAdaptor') and $node->adaptor eq $self) { #already stored so just update return $self->update_node($node); } my $parent_id = 0; my $root_id = 0; if($node->parent) { $parent_id = $node->parent->node_id ; $root_id = $node->root->node_id; } #printf("inserting parent_id = %d, root_id = %d\n", $parent_id, $root_id); my $sth = $self->prepare("INSERT INTO protein_tree_node (parent_id, root_id, left_index, right_index, distance_to_parent) VALUES (?,?,?,?,?)"); $sth->execute($parent_id, $root_id, $node->left_index, $node->right_index, $node->distance_to_parent); $node->node_id( $sth->{'mysql_insertid'} ); #printf(" new node_id %d\n", $node->node_id); $node->adaptor($self); $sth->finish; if($node->isa('Bio::EnsEMBL::Compara::AlignedMember')) { $sth = $self->prepare("INSERT ignore INTO protein_tree_member (node_id, member_id, method_link_species_set_id, cigar_line) VALUES (?,?,?,?)"); $sth->execute($node->node_id, $node->member_id, $node->method_link_species_set_id, $node->cigar_line); $sth->finish; } return $node->node_id; } sub update_node { my ($self, $node) = @_; unless($node->isa('Bio::EnsEMBL::Compara::NestedSet')) { throw("set arg must be a [Bio::EnsEMBL::Compara::NestedSet] not a $node"); } my $parent_id = 0; if($node->parent) { $parent_id = $node->parent->node_id ; } my $sth = $self->prepare("UPDATE protein_tree_node SET parent_id=?, left_index=?, right_index=?, distance_to_parent=? WHERE node_id=?"); $sth->execute($parent_id, $node->left_index, $node->right_index, $node->distance_to_parent, $node->node_id); $node->adaptor($self); $sth->finish; if($node->isa('Bio::EnsEMBL::Compara::AlignedMember')) { my $sql = "UPDATE protein_tree_member SET ". "cigar_line='". $node->cigar_line . "'"; $sql .= ", cigar_start=" . $node->cigar_start if($node->cigar_start); $sql .= ", cigar_end=" . $node->cigar_end if($node->cigar_end); $sql .= ", method_link_species_set_id=" . $node->method_link_species_set_id if($node->method_link_species_set_id); $sql .= " WHERE node_id=". $node->node_id; $self->dbc->do($sql); } } sub merge_nodes { my ($self, $node1, $node2) = @_; unless($node1->isa('Bio::EnsEMBL::Compara::NestedSet')) { throw("set arg must be a [Bio::EnsEMBL::Compara::NestedSet] not a $node1"); } # printf("MERGE children from parent %d => %d\n", $node2->node_id, $node1->node_id); my $sth = $self->prepare("UPDATE protein_tree_node SET parent_id=?, WHERE parent_id=?"); $sth->execute($node1->node_id, $node2->node_id); $sth->finish; $sth = $self->prepare("DELETE from protein_tree_node WHERE node_id=?"); $sth->execute($node2->node_id); $sth->finish; } sub delete_flattened_leaf { my $self = shift; my $node = shift; my $node_id = $node->node_id; #print("delete node $node_id\n"); # $self->dbc->do("UPDATE protein_tree_node dn, protein_tree_node n SET ". # "n.parent_id = dn.parent_id WHERE n.parent_id=dn.node_id AND dn.node_id=$node_id"); $self->dbc->do("DELETE from protein_tree_node WHERE node_id = $node_id"); $self->dbc->do("DELETE from protein_tree_tag WHERE node_id = $node_id"); $self->dbc->do("DELETE from protein_tree_member WHERE node_id = $node_id"); } sub delete_node { my $self = shift; my $node = shift; my $node_id = $node->node_id; #print("delete node $node_id\n"); $self->dbc->do("UPDATE protein_tree_node dn, protein_tree_node n SET ". "n.parent_id = dn.parent_id WHERE n.parent_id=dn.node_id AND dn.node_id=$node_id"); $self->dbc->do("DELETE from protein_tree_node WHERE node_id = $node_id"); $self->dbc->do("DELETE from protein_tree_tag WHERE node_id = $node_id"); $self->dbc->do("DELETE from protein_tree_member WHERE node_id = $node_id"); } sub delete_nodes_not_in_tree { my $self = shift; my $tree = shift; unless($tree->isa('Bio::EnsEMBL::Compara::NestedSet')) { throw("set arg must be a [Bio::EnsEMBL::Compara::NestedSet] not a $tree"); } #print("delete_nodes_not_present under ", $tree->node_id, "\n"); my $dbtree = $self->fetch_node_by_node_id($tree->node_id); my @all_db_nodes = $dbtree->get_all_subnodes; foreach my $dbnode (@all_db_nodes) { next if($tree->find_node_by_node_id($dbnode->node_id)); $self->delete_node($dbnode); } $dbtree->release_tree; } sub delete_node_and_under { my $self = shift; my $node = shift; my @all_subnodes = $node->get_all_subnodes; foreach my $subnode (@all_subnodes) { my $subnode_id = $subnode->node_id; $self->dbc->do("DELETE from protein_tree_node WHERE node_id = $subnode_id"); $self->dbc->do("DELETE from protein_tree_tag WHERE node_id = $subnode_id"); $self->dbc->do("DELETE from protein_tree_member WHERE node_id = $subnode_id"); } my $node_id = $node->node_id; $self->dbc->do("DELETE from protein_tree_node WHERE node_id = $node_id"); $self->dbc->do("DELETE from protein_tree_tag WHERE node_id = $node_id"); $self->dbc->do("DELETE from protein_tree_member WHERE node_id = $node_id"); } ################################### # # tagging # ################################### sub _load_tagvalues { my $self = shift; my $node = shift; unless($node->isa('Bio::EnsEMBL::Compara::NestedSet')) { throw("set arg must be a [Bio::EnsEMBL::Compara::NestedSet] not a $node"); } my $sth = $self->prepare("SELECT tag,value from protein_tree_tag where node_id=?"); $sth->execute($node->node_id); while (my ($tag, $value) = $sth->fetchrow_array()) { $node->add_tag($tag,$value); } $sth->finish; } sub _store_tagvalue { my $self = shift; my $node_id = shift; my $tag = shift; my $value = shift; $value="" unless(defined($value)); my $sql = "INSERT ignore into protein_tree_tag (node_id,tag) values ($node_id,\"$tag\")"; #print("$sql\n"); $self->dbc->do($sql); $sql = "UPDATE protein_tree_tag set value=\"$value\" where node_id=$node_id and tag=\"$tag\""; #print("$sql\n"); $self->dbc->do($sql); } ################################## # # subclass override methods # ################################## sub columns { my $self = shift; return ['t.node_id', 't.parent_id', 't.root_id', 't.left_index', 't.right_index', 't.distance_to_parent', 'tm.cigar_line', 'tm.cigar_start', 'tm.cigar_end', @{Bio::EnsEMBL::Compara::DBSQL::MemberAdaptor->columns()} ]; } sub tables { my $self = shift; return [['protein_tree_node', 't']]; } sub left_join_clause { return "left join protein_tree_member tm on t.node_id = tm.node_id left join member m on tm.member_id = m.member_id"; } sub default_where_clause { return ""; } sub create_instance_from_rowhash { my $self = shift; my $rowhash = shift; my $node; if($rowhash->{'member_id'}) { $node = new Bio::EnsEMBL::Compara::AlignedMember; } else { $node = new Bio::EnsEMBL::Compara::ProteinTree; } $self->init_instance_from_rowhash($node, $rowhash); return $node; } sub _objs_from_sth { my ($self, $sth) = @_; my $node_list = []; while(my $rowhash = $sth->fetchrow_hashref) { my $node = $self->create_instance_from_rowhash($rowhash); push @$node_list, $node; } return $node_list; } sub init_instance_from_rowhash { my $self = shift; my $node = shift; my $rowhash = shift; #SUPER is NestedSetAdaptor $self->SUPER::init_instance_from_rowhash($node, $rowhash); if($rowhash->{'member_id'}) { Bio::EnsEMBL::Compara::DBSQL::MemberAdaptor->init_instance_from_rowhash($node, $rowhash); $node->cigar_line($rowhash->{'cigar_line'}); # cigar_start and cigar_end does not need to be set. # $node->cigar_start($rowhash->{'cigar_start'}); # $node->cigar_end($rowhash->{'cigar_end'}); } # print(" create node : ", $node, " : "); $node->print_node; $node->adaptor($self); return $node; } ########################################################## # # explicit method forwarding to MemberAdaptor # ########################################################## sub _fetch_sequence_by_id { my $self = shift; return $self->db->get_MemberAdaptor->_fetch_sequence_by_id(@_); } sub fetch_gene_for_peptide_member_id { my $self = shift; return $self->db->get_MemberAdaptor->fetch_gene_for_peptide_member_id(@_); } sub fetch_peptides_for_gene_member_id { my $self = shift; return $self->db->get_MemberAdaptor->fetch_peptides_for_gene_member_id(@_); } sub fetch_longest_peptide_member_for_gene_member_id { my $self = shift; return $self->db->get_MemberAdaptor->fetch_longest_peptide_member_for_gene_member_id(@_); } 1;