annotate variant_effect_predictor/Bio/EnsEMBL/Compara/GeneTree.pm @ 0:21066c0abaf5 draft

Uploaded
author willmclaren
date Fri, 03 Aug 2012 10:04:48 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1 =head1 LICENSE
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
3 Copyright (c) 1999-2012 The European Bioinformatics Institute and
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
4 Genome Research Limited. All rights reserved.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
5
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
6 This software is distributed under a modified Apache license.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
7 For license details, please see
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
8
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
9 http://www.ensembl.org/info/about/code_licence.html
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
10
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
11 =head1 CONTACT
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
12
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
13 Please email comments or questions to the public Ensembl
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
14 developers list at <dev@ensembl.org>.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
15
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
16 Questions may also be sent to the Ensembl help desk at
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
17 <helpdesk@ensembl.org>.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
18
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
19 =head1 NAME
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
20
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
21 Bio::EnsEMBL::Compara::GeneTree
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
22
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
23 =head1 DESCRIPTION
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
24
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
25 Class to represent a gene tree object. Contains a link to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
26 the root of the tree, as long as general tree properties.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
27 It implements the AlignedMemberSet interface (via the leaves).
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
28
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
29 =head1 INHERITANCE TREE
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
30
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
31 Bio::EnsEMBL::Compara::GeneTree
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
32 +- Bio::EnsEMBL::Compara::AlignedMemberSet
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
33 `- Bio::EnsEMBL::Compara::Taggable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
34
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
35 =head1 AUTHORSHIP
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
36
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
37 Ensembl Team. Individual contributions can be found in the CVS log.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
38
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
39 =head1 MAINTAINER
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
40
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
41 $Author: mm14 $
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
42
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
43 =head VERSION
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
44
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
45 $Revision: 1.23 $
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
46
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
47 =head1 APPENDIX
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
48
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
49 The rest of the documentation details each of the object methods.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
50 Internal methods are usually preceded with an underscore (_)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
51
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
52 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
53
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
54 package Bio::EnsEMBL::Compara::GeneTree;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
55
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
56 use Bio::EnsEMBL::Utils::Argument;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
57 use Bio::EnsEMBL::Utils::Scalar qw(:assert);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
58
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
59 use Bio::EnsEMBL::Compara::GeneTreeNode;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
60 use Bio::EnsEMBL::Compara::GeneTreeMember;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
61
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
62 use strict;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
63 no strict 'refs';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
64
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
65 use base ('Bio::EnsEMBL::Compara::AlignedMemberSet', 'Bio::EnsEMBL::Compara::Taggable');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
66
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
67
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
68 ##############################
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
69 # Constructors / Destructors #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
70 ##############################
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
71
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
72 =head2 new
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
73
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
74 Arg [1] :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
75 Example :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
76 Description:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
77 Returntype : Bio::EnsEMBL::Compara::GeneTree
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
78 Exceptions :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
79 Caller :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
80
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
81 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
82
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
83 sub new {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
84 my($class,@args) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
85
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
86 my $self = $class->SUPER::new(@args);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
87
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
88 if (scalar @args) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
89 my ($root_id, $member_type, $tree_type, $clusterset_id) = rearrange([qw(ROOT_ID MEMBER_TYPE TREE_TYPE CLUSTERSET_ID)], @args);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
90
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
91 $self->{'_root_id'} = $root_id if defined $root_id;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
92 $member_type && $self->member_type($member_type);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
93 $tree_type && $self->tree_type($tree_type);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
94 $clusterset_id && $self->clusterset_id($clusterset_id);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
95 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
96
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
97 return $self;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
98 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
99
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
100
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
101 =head2 deep_copy
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
102
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
103 Description: Returns a copy of $self (as an AlignedMemberSet). All the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
104 members are themselves copied, but the tree topology is lost.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
105 Returntype : Bio::EnsEMBL::Compara::GeneTree
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
106 Caller : General
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
107
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
108 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
109
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
110 sub deep_copy {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
111 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
112 my $copy = $self->SUPER::deep_copy();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
113 foreach my $attr (qw(tree_type member_type clusterset_id)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
114 $copy->$attr($self->$attr);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
115 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
116 return $copy;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
117 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
118
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
119
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
120 =head2 DESTROY
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
121
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
122 Description : Deletes the reference to the root node and breaks
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
123 the circular reference.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
124 Returntype : None
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
125 Caller : System
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
126
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
127 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
128
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
129 sub DESTROY {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
130 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
131 delete $self->{'_root'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
132 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
133
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
134
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
135 #####################
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
136 # Object attributes #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
137 #####################
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
138
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
139 =head2 tree_type
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
140
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
141 Description : Getter/Setter for the tree_type field. This field can
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
142 currently be 'tree', 'supertree' or 'clusterset'
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
143 Returntype : String
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
144 Example : my $type = $tree->tree_type();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
145 Caller : General
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
146
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
147 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
148
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
149 sub tree_type {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
150 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
151 $self->{'_tree_type'} = shift if(@_);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
152 return $self->{'_tree_type'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
153 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
154
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
155
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
156 =head2 member_type
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
157
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
158 Description : Getter/Setter for the member_type field. This field can
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
159 currently be 'ncrna' or 'protein'
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
160 Returntype : String
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
161 Example : my $type = $tree->member_type();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
162 Caller : General
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
163
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
164 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
165
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
166 sub member_type {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
167 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
168 $self->{'_member_type'} = shift if(@_);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
169 return $self->{'_member_type'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
170 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
171
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
172
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
173 =head2 clusterset_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
174
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
175 Description : Getter/Setter for the clusterset_id field. This field can
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
176 be any string. Each dataset should contain a set of trees
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
177 with the "default" clusterset_id. Other clusterset_id are
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
178 used to store linked / additionnal data.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
179 Returntype : String
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
180 Example : my $clusterset_id = $tree->clusterset_id();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
181 Caller : General
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
182
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
183 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
184
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
185 sub clusterset_id {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
186 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
187 $self->{'_clusterset_id'} = shift if(@_);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
188 return $self->{'_clusterset_id'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
189 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
190
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
191
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
192 =head2 root_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
193
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
194 Description : Getter for the root_id of the root node of the tree.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
195 Returntype : Integer
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
196 Example : my $root_node_id = $tree->root_id();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
197 Caller : General
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
198
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
199 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
200
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
201 sub root_id {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
202 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
203 return $self->{'_root_id'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
204 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
205
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
206
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
207 ################
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
208 # Tree loading #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
209 ################
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
210
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
211 =head2 root
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
212
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
213 Description : Getter for the root node of the tree. This returns an
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
214 object fetch from the database if root_id is defined.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
215 Otherwise, it will create a new GeneTreeNode object.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
216 Returntype : Bio::EnsEMBL::Compara::GeneTreeNode
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
217 Example : my $root_node = $tree->root();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
218 Caller : General
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
219
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
220 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
221
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
222 sub root {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
223 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
224
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
225 if (not defined $self->{'_root'}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
226 if (defined $self->{'_root_id'} and defined $self->adaptor) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
227 # Loads all the nodes in one go
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
228 my $gtn_adaptor = $self->adaptor->db->get_GeneTreeNodeAdaptor;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
229 $gtn_adaptor->{'_ref_tree'} = $self;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
230 $self->{'_root'} = $gtn_adaptor->fetch_node_by_node_id($self->{'_root_id'});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
231 delete $gtn_adaptor->{'_ref_tree'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
232
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
233 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
234 # Creates a new GeneTreeNode object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
235 $self->{'_root'} = new Bio::EnsEMBL::Compara::GeneTreeNode;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
236 $self->{'_root'}->tree($self);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
237 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
238 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
239 return $self->{'_root'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
240 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
241
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
242
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
243 =head2 preload
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
244
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
245 Description : Method to load all the tree data in one go. This currently
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
246 includes if not loaded yet, and all the gene Members
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
247 associated with the leaves.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
248 In the future, it will include all the tags
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
249 Returntype : node
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
250 Example : $tree->preload();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
251 Caller : General
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
252
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
253 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
254
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
255 sub preload {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
256 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
257 return unless defined $self->adaptor;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
258
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
259 if (not defined $self->{'_root'} and defined $self->{'_root_id'}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
260 my $gtn_adaptor = $self->adaptor->db->get_GeneTreeNodeAdaptor;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
261 $gtn_adaptor->{'_ref_tree'} = $self;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
262 $self->{'_root'} = $gtn_adaptor->fetch_tree_by_root_id($self->{'_root_id'});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
263 delete $gtn_adaptor->{'_ref_tree'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
264 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
265
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
266 # Loads all the gene members in one go
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
267 my %leaves;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
268 foreach my $pm (@{$self->root->get_all_leaves}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
269 $leaves{$pm->gene_member_id} = $pm if UNIVERSAL::isa($pm, 'Bio::EnsEMBL::Compara::GeneTreeMember');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
270 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
271 my @m_ids = keys(%leaves);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
272 my $all_gm = $self->adaptor->db->get_MemberAdaptor->fetch_all_by_dbID_list(\@m_ids);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
273 foreach my $gm (@$all_gm) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
274 $leaves{$gm->dbID}->gene_member($gm);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
275 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
276 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
277
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
278
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
279 =head2 attach_alignment
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
280
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
281 Arg [1] : String: clusterset_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
282 Description : Method to fetch the alternative tree with the given
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
283 clusterset_id and attach its multiple alignment to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
284 the current tree. The alternative tree is returned.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
285 Returntype : GeneTree
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
286 Example : $supertree->attach_alignment('super-align');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
287 Caller : General
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
288
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
289 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
290
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
291 sub attach_alignment {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
292 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
293 my $other_clusterset_id = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
294 return unless defined $self->adaptor;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
295
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
296 # Gets the other tree
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
297 my $others = $self->adaptor->fetch_all_linked_trees($self);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
298 my @good_others = grep {$_->clusterset_id eq $other_clusterset_id} @$others;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
299 die "'$other_clusterset_id' tree not found\n" unless scalar(@good_others);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
300
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
301 # Gets the alignment
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
302 my %cigars;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
303 my $gtn_adaptor = $self->adaptor->db->get_GeneTreeNodeAdaptor;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
304 foreach my $leaf (@{$gtn_adaptor->fetch_all_AlignedMember_by_root_id($good_others[0]->root_id)}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
305 $cigars{$leaf->member_id} = $leaf->cigar_line;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
306 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
307
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
308 # Assigns it
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
309 foreach my $leaf (@{$self->root->get_all_leaves}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
310 $leaf->cigar_line($cigars{$leaf->member_id});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
311 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
312
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
313 return $good_others[0];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
314 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
315
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
316
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
317 =head2 expand_subtrees
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
318
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
319 Description : Method to fetch the subtrees of the current tree
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
320 and attach them to the tips of the current tree
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
321 Returntype : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
322 Example : $supertree->expand_subtrees();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
323 Caller : General
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
324
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
325 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
326
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
327 sub expand_subtrees {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
328 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
329 return unless defined $self->adaptor;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
330
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
331 # Gets the subtrees
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
332 my %subtrees;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
333 foreach my $subtree (@{$self->adaptor->fetch_subtrees($self)}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
334 $subtree->preload;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
335 $subtrees{$subtree->root->_parent_id} = $subtree->root;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
336 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
337
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
338 # Attaches them
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
339 $self->preload;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
340 foreach my $leaf (@{$self->root->get_all_leaves}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
341 next unless exists $subtrees{$leaf->node_id};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
342 $leaf->parent->add_child($subtrees{$leaf->node_id});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
343 $leaf->disavow_parent;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
344 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
345 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
346
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
347
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
348 ##############################
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
349 # AlignedMemberSet interface #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
350 ##############################
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
351
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
352 =head2 member_class
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
353
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
354 Description: Returns the type of member used in the set
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
355 Returntype : String: Bio::EnsEMBL::Compara::GeneTreeMember
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
356 Caller : Bio::EnsEMBL::Compara::MemberSet
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
357
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
358 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
359
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
360 sub member_class {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
361 return 'Bio::EnsEMBL::Compara::GeneTreeMember';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
362 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
363
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
364
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
365 =head2 get_all_Members
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
366
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
367 Example :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
368 Description: Returns the list of all the GeneTreeMember of the tree
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
369 Returntype : array reference of Bio::EnsEMBL::Compara::GeneTreeMember
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
370 Caller : General
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
371
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
372 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
373
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
374 sub get_all_Members {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
375 my ($self) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
376
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
377 unless (defined $self->{'_member_array'}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
378
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
379 $self->{'_member_array'} = [];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
380 $self->{'_members_by_source'} = {};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
381 $self->{'_members_by_source_taxon'} = {};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
382 $self->{'_members_by_source_genome_db'} = {};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
383 $self->{'_members_by_genome_db'} = {};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
384 foreach my $leaf (@{$self->root->get_all_leaves}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
385 $self->SUPER::add_Member($leaf) if UNIVERSAL::isa($leaf, 'Bio::EnsEMBL::Compara::GeneTreeMember');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
386 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
387 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
388 return $self->{'_member_array'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
389 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
390
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
391
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
392 =head2 add_Member
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
393
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
394 Arg [1] : GeneTreeMember
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
395 Example :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
396 Description: Add a new GeneTreeMember to this set and to the tree as
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
397 a child of the root node
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
398 Returntype : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
399 Exceptions : Throws if input objects don't check
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
400 Caller : General
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
401
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
402 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
403
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
404 sub add_Member {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
405 my ($self, $member) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
406 assert_ref($member, 'Bio::EnsEMBL::Compara::GeneTreeMember');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
407 $self->root->add_child($member);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
408 $member->tree($self);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
409 $self->SUPER::add_Member($member);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
410 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
411
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
412
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
413 ########
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
414 # Misc #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
415 ########
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
416
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
417 # Dynamic definition of functions to allow NestedSet methods work with GeneTrees
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
418 foreach my $func_name (qw(get_all_nodes get_all_leaves get_all_sorted_leaves
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
419 find_leaf_by_node_id find_leaf_by_name find_node_by_node_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
420 find_node_by_name remove_nodes build_leftright_indexing flatten_tree
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
421 newick_format nhx_format string_tree print_tree
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
422 release_tree
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
423 )) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
424 my $full_name = "Bio::EnsEMBL::Compara::GeneTree::$func_name";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
425 *$full_name = sub {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
426 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
427 my $ret = $self->root->$func_name(@_);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
428 return $ret;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
429 };
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
430 # print STDERR "REDEFINE $func_name\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
431 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
432
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
433
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
434 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
435