annotate variant_effect_predictor/Bio/EnsEMBL/StableIdHistoryTree.pm @ 1:d6778b5d8382 draft default tip

Deleted selected files
author willmclaren
date Fri, 03 Aug 2012 10:05:43 -0400
parents 21066c0abaf5
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 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
20
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
21 =head1 NAME
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
22
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
23 Bio::EnsEMBL::StableIdHistoryTree - object representing a stable ID history tree
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
24
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
25 =head1 SYNOPSIS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
26
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
27 my $reg = "Bio::EnsEMBL::Registry";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
28 my $archiveStableIdAdaptor =
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
29 $reg->get_adaptor( 'human', 'core', 'ArchiveStableId' );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
30
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
31 my $stable_id = 'ENSG00000068990';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
32 my $history =
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
33 $archiveStableIdAdaptor->fetch_history_tree_by_stable_id('ENSG01');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
34
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
35 print "Unique stable IDs in this tree:\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
36 print join( ", ", @{ $history->get_unique_stable_ids } ), "\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
37
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
38 print "\nReleases in this tree:\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
39 print join( ", ", @{ $history->get_release_display_names } ), "\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
40
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
41 print "\nCoordinates of nodes in the tree:\n\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
42 foreach my $a ( @{ $history->get_all_ArchiveStableIds } ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
43 print " Stable ID: " . $a->stable_id . "." . $a->version . "\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
44 print " Release: "
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
45 . $a->release . " ("
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
46 . $a->assembly . ", "
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
47 . $a->db_name . ")\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
48 print " coords: "
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
49 . join( ', ', @{ $history->coords_by_ArchiveStableId($a) } )
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
50 . "\n\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
51 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
52
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
53 =head1 DESCRIPTION
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
54
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
55 This object represents a stable ID history tree graph.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
56
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
57 The graph is implemented as a collection of nodes (ArchiveStableId
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
58 objects) and links (StableIdEvent objects) which have positions
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
59 on an (x,y) grid. The x axis is used for releases, the y axis for
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
60 stable_ids. The idea is to create a plot similar to this (the numbers
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
61 shown on the nodes are the stable ID versions):
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
62
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
63 ENSG001 1-------------- 2--
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
64 \
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
65 ENSG003 1-----1
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
66 /
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
67 ENSG002 1-------2----------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
68
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
69 38 39 40 41 42
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
70
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
71 The grid coordinates of the ArchiveStableId objects in this example
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
72 would be (note that coordinates are zero-based):
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
73
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
74 ENSG001.1 (0, 0)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
75 ENSG001.2 (2, 0)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
76 ENSG003.1 (release 41) (3, 1)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
77 ENSG003.1 (release 42) (4, 1)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
78 ENSG002.1 (0, 2)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
79 ENSG002.2 (1, 2)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
80
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
81 The tree will only contain those nodes which had a change in the stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
82 ID version. Therefore, in the above example, in release 39 ENSG001 was
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
83 present and had version 1 (but will not be drawn there, to unclutter the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
84 output).
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
85
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
86 The grid positions will be calculated by the API and will try to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
87 untangle the tree (i.e. try to avoid overlapping lines).
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
88
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
89 =head1 METHODS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
90
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
91 new
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
92 add_ArchiveStableIds
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
93 add_ArchiveStableIds_for_events
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
94 remove_ArchiveStableId
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
95 flush_ArchiveStableIds
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
96 add_StableIdEvents
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
97 remove_StableIdEvent
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
98 flush_StableIdEvents
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
99 get_all_ArchiveStableIds
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
100 get_all_StableIdEvents
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
101 get_latest_StableIdEvent
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
102 get_release_display_names
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
103 get_release_db_names
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
104 get_unique_stable_ids
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
105 optimise_tree
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
106 coords_by_ArchiveStableId
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
107 calculate_coords
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
108 consolidate_tree
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
109 reset_tree
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
110 current_dbname
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
111 current_release
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
112 current_assembly
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
113 is_incomplete
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
114
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
115 =head1 RELATED MODULES
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
116
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
117 Bio::EnsEMBL::ArchiveStableId
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
118 Bio::EnsEMBL::DBSQL::ArchiveStableIdAdaptor
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
119 Bio::EnsEMBL::StableIdEvent
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
120
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
121 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
122
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
123 package Bio::EnsEMBL::StableIdHistoryTree;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
124
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
125 use strict;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
126 use warnings;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
127 no warnings 'uninitialized';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
128
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
129 use Bio::EnsEMBL::Utils::Argument qw(rearrange);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
130 use Bio::EnsEMBL::Utils::Exception qw(throw warning);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
131
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
132
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
133 =head2 new
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
134
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
135 Arg [CURRENT_DBNAME] : (optional) name of current db
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
136 Arg [CURRENT_RELEASE] : (optional) current release number
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
137 Arg [CURRENT_ASSEMBLY] : (optional) current assembly name
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
138 Example : my $history = Bio::EnsEMBL::StableIdHistoryTree->new;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
139 Description : object constructor
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
140 Return type : Bio::EnsEMBL::StableIdHistoryTree
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
141 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
142 Caller : general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
143 Status : At Risk
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
144 : under development
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
145
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
146 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
147
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
148 sub new {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
149 my $caller = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
150 my $class = ref($caller) || $caller;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
151
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
152 my $self = {};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
153 bless $self, $class;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
154
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
155 my ($current_dbname, $current_release, $current_assembly) =
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
156 rearrange([qw( CURRENT_DBNAME CURRENT_RELEASE CURRENT_ASSEMBLY )], @_ );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
157
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
158 # initialise
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
159 $self->{'current_dbname'} = $current_dbname;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
160 $self->{'current_release'} = $current_release;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
161 $self->{'current_assembly'} = $current_assembly;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
162
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
163 return $self;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
164 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
165
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
166
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
167 =head2 add_ArchiveStableIds
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
168
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
169 Arg[1..n] : Bio::EnsEMBL::ArchiveStableId's @archive_ids
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
170 The ArchiveStableIds to add to the the history tree
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
171 Example : my $archive_id = $archiveStableIdAdaptor->fetch_by_stable_id(
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
172 'ENSG00024808');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
173 $history->add_ArchiveStableId($archive_id);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
174 Description : Adds ArchiveStableIds (nodes) to the history tree. No
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
175 calculation of grid coordinates is done at this point, you need
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
176 to initiate this manually with calculate_coords().
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
177 ArchiveStableIds are only added once for each release (to avoid
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
178 duplicates).
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
179 Return type : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
180 Exceptions : thrown on invalid or missing argument
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
181 Caller : Bio::EnsEMBL::DBSQL::ArchiveStableIdAdaptor::fetch_history_by_stable_id, general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
182 Status : At Risk
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
183 : under development
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
184
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
185 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
186
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
187 sub add_ArchiveStableIds {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
188 my ($self, @archive_ids) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
189
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
190 throw("You must provide one or more Bio::EnsEMBL::ArchiveStableIds to add.")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
191 unless (@archive_ids);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
192
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
193 foreach my $archive_id (@archive_ids) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
194 throw("Bio::EnsEMBL::ArchiveStableId object expected.")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
195 unless (ref($archive_id) &&
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
196 $archive_id->isa('Bio::EnsEMBL::ArchiveStableId'));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
197
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
198 $self->{'nodes'}->{$self->_node_id($archive_id)} = $archive_id;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
199 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
200 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
201
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
202
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
203 =head2 add_ArchiveStableIds_for_events
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
204
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
205 Example : my $history = Bio::EnsEMBL::StableIdHistoryTree->new;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
206 $history->add_StableIdEvents($event1, $event2);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
207 $history->add_ArchiveStableIds_for_events;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
208 Description : Convenience method that adds all ArchiveStableIds for all
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
209 StableIdEvents attached to this object to the tree.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
210 Return type : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
211 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
212 Caller : Bio::EnsEMBL::DBSQL::ArchiveStableIdAdaptor::fetch_history_by_stable_id, general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
213 Status : At Risk
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
214 : under development
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
215
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
216 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
217
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
218 sub add_ArchiveStableIds_for_events {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
219 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
220
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
221 foreach my $event (@{ $self->get_all_StableIdEvents }) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
222 if ($event->old_ArchiveStableId) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
223 $self->add_ArchiveStableIds($event->old_ArchiveStableId);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
224 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
225 if ($event->new_ArchiveStableId) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
226 $self->add_ArchiveStableIds($event->new_ArchiveStableId);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
227 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
228 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
229 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
230
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
231
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
232 =head2 remove_ArchiveStableId
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
233
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
234 Arg[1] : Bio::EnsEMBL::ArchiveStableId $archive_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
235 the ArchiveStableId to remove from the tree
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
236 Example : $history->remove_ArchiveStableId($archive_id);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
237 Description : Removes an ArchiveStableId from the tree.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
238 Return type : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
239 Exceptions : thrown on missing or invalid argument
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
240 Caller : Bio::EnsEMBL::DBSQL::ArchiveStableIdAdaptor::fetch_history_by_stable_id, general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
241 Status : At Risk
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
242 : under development
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
243
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
244 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
245
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
246 sub remove_ArchiveStableId {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
247 my ($self, $archive_id) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
248
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
249 throw("Bio::EnsEMBL::ArchiveStableId object expected.")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
250 unless ($archive_id && ref($archive_id) &&
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
251 $archive_id->isa('Bio::EnsEMBL::ArchiveStableId'));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
252
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
253 my %nodes = %{ $self->{'nodes'} };
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
254 delete $nodes{$self->_node_id($archive_id)};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
255 $self->{'nodes'} = \%nodes;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
256 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
257
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
258
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
259 =head2 flush_ArchiveStableIds
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
260
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
261 Example : $history->flush_ArchiveStableIds;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
262 Description : Remove all ArchiveStableIds from the tree.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
263 Return type : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
264 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
265 Caller : general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
266 Status : At Risk
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
267 : under development
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
268
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
269 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
270
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
271 sub flush_ArchiveStableIds {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
272 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
273 $self->{'nodes'} = undef;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
274 }
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 # generate a unique node identifier
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
279 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
280 sub _node_id {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
281 my ($self, $archive_id) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
282 return $archive_id->stable_id . ':' . $archive_id->db_name;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
283 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
284
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
285
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
286 =head2 add_StableIdEvents
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
287
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
288 Arg[1..n] : Bio::EnsEMBL::StableIdEvent's @events
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
289 The StableIdEvents to add to the the history tree
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
290 Example : $history->add_StableIdEvents($event);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
291 Description : Adds StableIdEvents (links) to the history tree. Note that
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
292 ArchiveStableIds attached to the StableIdEvent aren't added to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
293 the tree automatically, you'll need to call
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
294 add_ArchiveStableIds_for_events later.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
295 Return type : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
296 Exceptions : thrown on invalid or missing argument
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
297 Caller : Bio::EnsEMBL::DBSQL::ArchiveStableIdAdaptor::fetch_history_by_stable_id, general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
298 Status : At Risk
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
299 : under development
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
300
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
301 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
302
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
303 sub add_StableIdEvents {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
304 my ($self, @events) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
305
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
306 throw("You must provide one or more Bio::EnsEMBL::StableIdsEvents to add.")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
307 unless (@events);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
308
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
309 foreach my $event (@events) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
310 throw("Bio::EnsEMBL::StableIdEvent object expected.")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
311 unless ($event->isa('Bio::EnsEMBL::StableIdEvent'));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
312
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
313 $self->{'links'}->{$self->_link_id($event)} = $event;
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
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
318 =head2 remove_StableIdEvent
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
319
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
320 Arg[1] : Bio::EnsEMBL::StableIdEvent $event
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
321 the StableIdEvent to remove from the tree
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
322 Example : $history->remove_StableIdEvent($event);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
323 Description : Removes a StableIdEvent from the tree.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
324 Return type : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
325 Exceptions : thrown on missing or invalid arguments
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
326 Caller : Bio::EnsEMBL::DBSQL::ArchiveStableIdAdaptor::fetch_history_by_stable_id, general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
327 Status : At Risk
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
328 : under development
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
329
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
330 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
331
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
332 sub remove_StableIdEvent {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
333 my ($self, $event) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
334
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
335 throw("Bio::EnsEMBL::StableIdEvent object expected.") unless
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
336 ($event && ref($event) && $event->isa('Bio::EnsEMBL::StableIdEvent'));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
337
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
338 my %links = %{ $self->{'links'} };
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
339 delete $links{$self->_link_id($event)};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
340 $self->{'links'} = \%links;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
341 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
342
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
343
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
344 =head2 flush_StableIdEvents
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
345
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
346 Example : $history->flush_StableIdEvents;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
347 Description : Removes all StableIdEvents from the tree.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
348 Return type : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
349 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
350 Caller : general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
351 Status : At Risk
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
352 : under development
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
353
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
354 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
355
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
356 sub flush_StableIdEvents {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
357 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
358 $self->{'links'} = undef;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
359 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
360
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
361
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
362 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
363 # generate a unique link identifier
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
364 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
365 sub _link_id {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
366 my ($self, $event) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
367
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
368 my ($old_id, $old_db_name, $new_id, $new_db_name);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
369 if ($event->old_ArchiveStableId) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
370 $old_id = $event->old_ArchiveStableId->stable_id;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
371 $old_db_name = $event->old_ArchiveStableId->db_name;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
372 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
373 if ($event->new_ArchiveStableId) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
374 $new_id = $event->new_ArchiveStableId->stable_id;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
375 $new_db_name = $event->new_ArchiveStableId->db_name;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
376 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
377
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
378 return join(':', $old_id, $old_db_name, $new_id, $new_db_name);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
379 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
380
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
381
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
382 =head2 get_all_ArchiveStableIds
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
383
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
384 Example : foreach my $arch_id (@{ $history->get_all_ArchiveStableIds }) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
385 print $arch_id->stable_id, '.', $arch_id->version, "\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
386 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
387 Description : Gets all ArchiveStableIds (nodes) in this tree.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
388 Return type : Arrayref of Bio::EnsEMBL::ArchiveStableId objects
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
389 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
390 Caller : general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
391 Status : At Risk
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
392 : under development
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
393
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
394 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
395
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
396 sub get_all_ArchiveStableIds {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
397 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
398 return [ values %{ $self->{'nodes'} } ];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
399 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
400
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
401
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
402 =head2 get_all_current_ArchiveStableIds
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
403
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
404 Example : foreach my $arch_id (@{ $history->get_all_current_ArchiveStableIds }) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
405 print $arch_id->stable_id, '.', $arch_id->version, "\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
406 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
407 Description : Convenience method to get all current ArchiveStableIds in this
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
408 tree.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
409
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
410 Note that no lazy loading of "current" status is done at that
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
411 stage; as long as you retrieve your StableIdHistoryTree object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
412 from ArchiveStableIdAdaptor, you'll get the right answer. In
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
413 other use cases, if you want to make sure you really get all
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
414 current stable IDs, loop over the result of
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
415 get_all_ArchiveStableIds() and call
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
416 ArchiveStableId->current_version() on all of them.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
417 Return type : Arrayref of Bio::EnsEMBL::ArchiveStableId objects
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
418 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
419 Caller : general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
420 Status : At Risk
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
421 : under development
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
422
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
423 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
424
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
425 sub get_all_current_ArchiveStableIds {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
426 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
427
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
428 my @current = ();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
429
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
430 foreach my $arch_id (@{ $self->get_all_ArchiveStableIds }) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
431 push @current, $arch_id if ($arch_id->is_current);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
432 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
433
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
434 return \@current;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
435 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
436
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
437
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
438 =head2 get_all_StableIdEvents
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
439
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
440 Example : foreach my $event (@{ $history->get_all_StableIdsEvents }) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
441 print "Old stable ID: ",
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
442 ($event->get_attribute('old', 'stable_id') or 'none'), "\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
443 print "New stable ID: ",
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
444 ($event->get_attribute('new', 'stable_id') or 'none'), "\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
445 print "Mapping score: ", $event->score, "\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
446 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
447 Description : Gets all StableIdsEvents (links) in this tree.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
448 Return type : Arrayref of Bio::EnsEMBL::StableIdEvent objects
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
449 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
450 Caller : general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
451 Status : At Risk
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
452 : under development
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
453
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
454 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
455
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
456 sub get_all_StableIdEvents {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
457 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
458 return [ values %{ $self->{'links'} } ];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
459 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
460
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
461
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
462 =head2 get_latest_StableIdEvent
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
463
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
464 Arg[1] : Bio::EnsEMBL::ArchiveStableId $arch_id - the stable ID to get
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
465 the latest Event for
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
466 Example : my $arch_id = Bio::EnsEMBL::ArchiveStableId->new(
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
467 -stable_id => 'ENSG00001'
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
468 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
469 my $event = $history->get_latest_Event($arch_id);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
470 Description : Returns the latest StableIdEvent found in the tree where a given
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
471 stable ID is the new stable ID. If more than one is found (e.g.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
472 in a merge scenario in the latest mapping), preference is given
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
473 to self-events.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
474 Return type : Bio::EnsEMBL::StableIdEvent
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
475 Exceptions : thrown on missing or wrong argument
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
476 Caller : Bio::EnsEMBL::DBSQL::ArchiveStableIdAdaptor::add_all_current_to_history, general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
477 Status : At Risk
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
478 : under development
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
479
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
480 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
481
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
482 sub get_latest_StableIdEvent {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
483 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
484 my $arch_id = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
485
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
486 unless ($arch_id and $arch_id->isa('Bio::EnsEMBL::ArchiveStableId')) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
487 throw("Need a Bio::EnsEMBL::ArchiveStableId.");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
488 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
489
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
490 my @all_events = @{ $self->get_all_StableIdEvents };
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
491 my @self_events = ();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
492
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
493 while (my $event = shift(@all_events)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
494 if ($event->new_ArchiveStableId and
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
495 $event->new_ArchiveStableId->stable_id eq $arch_id->stable_id) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
496 push @self_events, $event;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
497 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
498 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
499
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
500 my @sorted = sort { $b->new_ArchiveStableId->release <=>
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
501 $a->new_ArchiveStableId->release } @self_events;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
502
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
503 # give priority to self events
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
504 my $latest;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
505 while ($latest = shift @sorted) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
506 last if (($latest->old_ArchiveStableId and
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
507 $latest->old_ArchiveStableId->stable_id eq $arch_id->stable_id)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
508 or !$latest->old_ArchiveStableId);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
509 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
510
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
511 return $latest;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
512 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
513
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
514
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
515 =head2 get_release_display_names
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
516
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
517 Example : print "Unique release display_names in this tree:\n"
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
518 foreach my $name (@{ $history->get_release_display_names }) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
519 print " $name\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
520 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
521 Description : Returns a chronologically sorted list of unique release
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
522 display_names in this tree.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
523
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
524 This method can be used to determine the number of columns when
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
525 plotting the history tree.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
526 Return type : Arrayref of strings.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
527 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
528 Caller : general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
529 Status : At Risk
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
530 : under development
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
531
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
532 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
533
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
534 sub get_release_display_names {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
535 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
536
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
537 my @display_names = map { $_->[1] } @{ $self->_sort_releases };
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
538
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
539 return \@display_names;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
540 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
541
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
542
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
543 =head2 get_release_db_names
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
544
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
545 Example : print "Unique release db_names in this tree:\n"
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
546 foreach my $name (@{ $history->get_release_db_names }) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
547 print " $name\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
548 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
549 Description : Returns a chronologically sorted list of unique release
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
550 db_names in this tree.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
551 Return type : Arrayref of strings.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
552 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
553 Caller : general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
554 Status : At Risk
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
555 : under development
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
556
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
557 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
558
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
559 sub get_release_db_names {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
560 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
561
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
562 my @db_names = map { $_->[0] } @{ $self->_sort_releases };
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
563
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
564 return \@db_names;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
565 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
566
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
567
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
568 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
569 # Create a chronologically sorted list of releases.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
570 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
571 # Return type : Arrayref of arrayrefs (db_name, release)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
572 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
573 sub _sort_releases {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
574 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
575
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
576 unless ($self->{'sorted_tree'}->{'releases'}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
577
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
578 my %unique = ();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
579
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
580 foreach my $archive_id (@{ $self->get_all_ArchiveStableIds }) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
581 $unique{join(':', $archive_id->db_name, $archive_id->release)} = 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
582 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
583
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
584 # sort releases by release number, then db_name; this should get them into
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
585 # chronological order
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
586 my @releases = sort { $a->[1] <=> $b->[1] || $a->[0] cmp $b->[0] }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
587 map { [ split(/:/, $_) ] } keys(%unique);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
588
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
589 $self->{'sorted_tree'}->{'releases'} = \@releases;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
590
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
591 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
592
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
593 return $self->{'sorted_tree'}->{'releases'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
594 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
595
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
596
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
597 =head2 get_unique_stable_ids
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
598
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
599 Example : print "Unique stable IDs in this tree:\n"
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
600 foreach my $id (@{ $history->get_unique_stable_ids }) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
601 print " $id\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
602 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
603 Description : Returns a list of unique stable IDs in this tree. Version is not
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
604 taken into account here. This method can be used to determine
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
605 the number of rows when plotting the history with each stable ID
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
606 occupying one line.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
607
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
608 Sort algorithm will depend on what was chosen when the sorted
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
609 tree was generated. This ranges from a simple alphanumeric sort
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
610 to algorithms trying to untangle the history tree. If no
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
611 pre-sorted data is found, an alphanumerically sorted list will
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
612 be returned by default.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
613 Return type : Arrayref of strings.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
614 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
615 Caller : general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
616 Status : At Risk
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
617 : under development
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
618
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
619 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
620
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
621 sub get_unique_stable_ids {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
622 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
623
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
624 unless ($self->{'sorted_tree'}->{'stable_ids'}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
625 $self->{'sorted_tree'}->{'stable_ids'} = $self->_sort_stable_ids;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
626 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
627
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
628 return $self->{'sorted_tree'}->{'stable_ids'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
629 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
630
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
631
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
632 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
633 # Returns a list of stable IDs in this history tree, sorted alphabetically.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
634 # This is the simplest sort function used and doesn't try to untangle the tree.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
635 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
636 # Return type : Arrayref
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
637 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
638 sub _sort_stable_ids {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
639 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
640 my %unique = map { $_->stable_id => 1 } @{ $self->get_all_ArchiveStableIds };
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
641 return [sort keys %unique];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
642 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
643
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
644
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
645 =head2 optimise_tree
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
646
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
647 Example : $history->optimise_tree;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
648 Description : This method sorts the history tree so that the number of
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
649 overlapping branches is minimised (thus "untangling" the tree).
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
650
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
651 It uses a clustering algorithm for this which iteratively moves
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
652 the nodes with the largest vertical distance next to each other
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
653 and looking for a mininum in total branch length. This might not
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
654 produce the overall optimum but usually converges on a local
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
655 optimum very quickly.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
656 Return type : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
657 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
658 Caller : calculate_coords
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
659 Status : At Risk
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
660 : under development
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
661
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
662 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
663
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
664 sub optimise_tree {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
665 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
666
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
667 # get all non-self events
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
668 my @links;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
669 foreach my $event (@{ $self->get_all_StableIdEvents }) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
670 next unless ($event->old_ArchiveStableId and $event->new_ArchiveStableId);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
671 my $old_id = $event->old_ArchiveStableId->stable_id;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
672 my $new_id = $event->new_ArchiveStableId->stable_id;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
673 push @links, [$old_id, $new_id] if ($old_id ne $new_id);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
674 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
675
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
676 # get initial list of sorted unique stable IDs and put them into a position
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
677 # lookup hash
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
678 my $i = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
679 my %pos = map { $_ => $i++ } @{ $self->_sort_stable_ids };
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
680
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
681 my $opt_length;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
682 my $successive_fails = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
683 my $k = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
684 my %seen;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
685
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
686 # for debug purposes:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
687 # find the number of permutations for the given number of stable IDs
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
688 my $fact = $self->_factorial(scalar(keys %pos));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
689
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
690 OPT:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
691 while ($successive_fails < 100) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
692
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
693 # sort links by vertical distance
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
694 #warn "sorting\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
695 $self->_sort_links(\@links, \%pos);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
696
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
697 # loop over sorted links
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
698 SORTED:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
699 foreach my $link (@links) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
700
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
701 #warn " trying ".join('-', @$link)."\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
702
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
703 $k++;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
704
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
705 # remember last sort order
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
706 my %last = %pos;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
707
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
708 #my $this_order = join(':', sort { $pos{$a} <=> $pos{$b} } keys %pos);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
709 #warn " before $this_order\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
710
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
711 # try both to move bottom node next to top node's current position and
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
712 # top node next to bottom node's position - one of the methods might give
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
713 # you better results
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
714 DIRECT:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
715 foreach my $direction (qw(up down)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
716
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
717 # move the nodes next to each other
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
718 $self->_move_nodes($link, \%pos, $direction);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
719
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
720 # next if we've seen this sort order before
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
721 my $new_order = join(':', sort { $pos{$a} <=> $pos{$b} } keys %pos);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
722 #warn " after ($direction) $new_order\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
723 if ($seen{$new_order}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
724 #warn " seen\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
725 %pos = %last;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
726 next DIRECT;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
727 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
728 $seen{$new_order} = 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
729
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
730 # calculate total link length for this sort order
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
731 my $total_length = $self->_total_link_length(\@links, \%pos);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
732
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
733 if (!$opt_length or $total_length < $opt_length) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
734 #warn " better ($total_length/$opt_length)\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
735 $opt_length = $total_length;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
736 $successive_fails = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
737 next OPT;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
738 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
739 #warn " worse ($total_length/$opt_length)\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
740 %pos = %last;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
741 $successive_fails++;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
742 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
743 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
744
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
745 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
746
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
747 last OPT;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
748
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
749 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
750
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
751 #warn "Needed $k tries (of $fact) to find optimal tree.\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
752
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
753 my @best = sort { $pos{$a} <=> $pos{$b} } keys %pos;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
754 $self->{'sorted_tree'}->{'stable_ids'} = \@best;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
755 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
756
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
757
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
758 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
759 # find the number of permutations for a give array size.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
760 # used for debugging code (compare implemented algorithm to looping over all
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
761 # possible permutations).
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
762 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
763 sub _factorial {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
764 my ($self, $n) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
765 my $s = 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
766 $s *= $n-- while $n > 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
767 return $s;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
768 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
769
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
770
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
771 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
772 # sort links by vertical distance
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
773 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
774 sub _sort_links {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
775 my ($self, $links, $pos) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
776
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
777 my @lookup;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
778
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
779 foreach my $link (@$links) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
780 my $dist = $pos->{$link->[0]} - $pos->{$link->[1]};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
781 $dist = -$dist if ($dist < 0);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
782 push @lookup, [$dist, $link];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
783 #warn " $dist ".join(' ', @$link)."\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
784 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
785
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
786 @$links = map { $_->[1] } sort { $b->[0] <=> $a->[0] } @lookup;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
787 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
788
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
789
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
790 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
791 # make two nodes adjacent by moving the second node next to the first node
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
792 # all other node coordinates are adjusted accordingly
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
793 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
794 sub _move_nodes {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
795 my ($self, $link, $pos, $direction) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
796
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
797 my $first_pos = $pos->{$link->[0]};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
798 my $second_pos = $pos->{$link->[1]};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
799
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
800 # swap positions if necessary
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
801 if ($first_pos > $second_pos) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
802 my $tmp = $second_pos;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
803 $second_pos = $first_pos;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
804 $first_pos = $tmp;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
805 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
806 #warn " $first_pos:$second_pos\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
807
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
808 foreach my $p (keys %$pos) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
809
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
810 my $val = $pos->{$p};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
811
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
812 #warn " $p $val\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
813 if ($direction eq 'up') {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
814 if ($val > $first_pos and $val < $second_pos) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
815 $val++;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
816 } elsif ($val == $second_pos) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
817 $val = $first_pos + 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
818 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
819 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
820 if ($val > $first_pos and $val < $second_pos) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
821 $val--;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
822 } elsif ($val == $first_pos) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
823 $val = $second_pos - 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
824 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
825 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
826
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
827 #warn " $p $val\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
828 $pos->{$p} = $val;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
829 #warn "\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
830 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
831 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
832
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
833
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
834 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
835 # calculate the total link (vertical distance) length based on this sort order
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
836 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
837 sub _total_link_length {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
838 my ($self, $links, $pos) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
839
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
840 my $total_length;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
841
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
842 foreach my $link (@$links) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
843 my $length = $pos->{$link->[0]} - $pos->{$link->[1]};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
844 $length = -$length if ($length < 0);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
845 $total_length += $length;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
846 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
847
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
848 return $total_length;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
849 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
850
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
851
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
852 =head2 coords_by_ArchiveStableId
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
853
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
854 Arg[1] : Bio::EnsEMBL::ArchiveStableId $archive_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
855 The ArchiveStableId to get tree grid coordinates for
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
856 Example : my ($x, $y) =
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
857 @{ $history->coords_by_ArchiveStableId($archive_id) };
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
858 print $archive_id->stable_id, " coords: $x, $y\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
859 Description : Returns the coordinates of an ArchiveStableId in the history
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
860 tree grid. If the ArchiveStableId isn't found in this tree, an
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
861 empty list is returned.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
862
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
863 Coordinates are zero-based (i.e. the top leftmost element in
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
864 the grid has coordinates [0, 0], not [1, 1]). This is to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
865 facilitate using them to create a matrix as a two-dimensional
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
866 array of arrays.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
867 Return type : Arrayref (x coordinate, y coordinate)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
868 Exceptions : thrown on wrong argument type
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
869 Caller : general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
870 Status : At Risk
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
871 : under development
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
872
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
873 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
874
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
875 sub coords_by_ArchiveStableId {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
876 my ($self, $archive_id) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
877
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
878 throw("Bio::EnsEMBL::ArchiveStableId object expected.")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
879 unless ($archive_id and ref($archive_id) and
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
880 $archive_id->isa('Bio::EnsEMBL::ArchiveStableId'));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
881
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
882 return $self->{'sorted_tree'}->{'coords'}->{$self->_node_id($archive_id)}
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
883 || [];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
884 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
885
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
886
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
887 =head2 calculate_coords
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
888
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
889 Example : $history->calculate_coords;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
890 Description : Pre-calculates the grid coordinates of all nodes in the tree.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
891 Return type : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
892 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
893 Caller : ArchiveStableIdAdaptor::fetch_history_by_stable_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
894 Status : At Risk
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
895 : under development
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
896
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
897 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
898
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
899 sub calculate_coords {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
900 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
901
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
902 # reset any previous tree cordinate calculations
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
903 $self->reset_tree;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
904
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
905 # the "master" information for the sorted tree is stored as the sorted lists
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
906 # of releases (x) and stable IDs (y). Sort them now.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
907 my $db_names = $self->get_release_db_names;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
908
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
909 # untangle tree by sorting stable IDs appropriately
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
910 $self->optimise_tree;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
911 my $stable_ids = $self->get_unique_stable_ids;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
912
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
913 # for performance reasons, additionally store coordinates in a lookup hash
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
914 foreach my $archive_id (@{ $self->get_all_ArchiveStableIds }) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
915
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
916 # coordinates are positions in the sorted lists
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
917 my $x = $self->_index_of($archive_id->db_name, $db_names);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
918 my $y = $self->_index_of($archive_id->stable_id, $stable_ids);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
919
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
920 $self->{'sorted_tree'}->{'coords'}->{$self->_node_id($archive_id)} =
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
921 [ $x, $y ];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
922 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
923 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
924
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
925 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
926 # Description : Returns the index of an element in an array
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
927 # Example : my @array = (a, b, c);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
928 # my $i = _index_of('b', \@array); # will return 1
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
929 # Return type : Int (or undef if element is not found in array)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
930 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
931 sub _index_of {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
932 my ($self, $element, $arrayref) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
933
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
934 throw("Expecting arrayref argument.") unless (ref($arrayref) eq 'ARRAY');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
935
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
936 my @array = @$arrayref;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
937
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
938 while (my $e = pop(@array)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
939 return scalar(@array) if ($e eq $element);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
940 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
941
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
942 return undef;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
943 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
944
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
945
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
946 =head2 consolidate_tree
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
947
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
948 Example : $history->consolidate_tree;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
949 Description : Consolidate the history tree. This means removing nodes where
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
950 there wasn't a change and bridging gaps in the history. The end
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
951 result will be a sparse tree which only contains the necessary
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
952 information.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
953 Return type : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
954 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
955 Caller : ArchiveStableIdAdaptor->fetch_history_tree_by_stable_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
956 Status : At Risk
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
957 : under development
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
958
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
959 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
960
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
961 sub consolidate_tree {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
962 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
963
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
964 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
965 # get all self-events and creations/deletions and sort them (by stable ID and
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
966 # chronologically)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
967 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
968 my @event_lookup;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
969
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
970 foreach my $event (@{ $self->get_all_StableIdEvents }) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
971
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
972 my $old_id = $event->old_ArchiveStableId;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
973 my $new_id = $event->new_ArchiveStableId;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
974
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
975 if (!$old_id or !$new_id or ($old_id->stable_id eq $new_id->stable_id)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
976 if ($old_id) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
977 push @event_lookup, [$old_id->stable_id, $old_id->release,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
978 $old_id->db_name, $event];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
979 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
980 push @event_lookup, [$new_id->stable_id, $new_id->release - 1,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
981 $new_id->db_name, $event];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
982 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
983 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
984 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
985
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
986 my @self_events = map { $_->[3] }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
987 sort { $a->[0] cmp $b->[0] || $a->[1] <=> $b->[1] || $a->[2] cmp $b->[2] }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
988 @event_lookup;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
989
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
990 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
991 # consolidate tree
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
992 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
993 my $last = shift(@self_events);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
994
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
995 while (my $event = shift(@self_events)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
996
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
997 my $lo = $last->old_ArchiveStableId;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
998 my $ln = $last->new_ArchiveStableId;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
999 my $eo = $event->old_ArchiveStableId;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1000 my $en = $event->new_ArchiveStableId;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1001
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1002 if ($lo and $eo and $en and $lo->stable_id eq $eo->stable_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1003 and $lo->version eq $eo->version) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1004
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1005 # this removes redundant nodes and connects the remaining nodes:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1006 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1007 # o--o--o -> o-----o
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1008 # 1 1 1 1 1
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1009
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1010 #warn 'A: '.$last->ident_string.' | '.$event->ident_string."\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1011
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1012 $self->remove_StableIdEvent($last);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1013 $self->remove_StableIdEvent($event);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1014
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1015 $event->old_ArchiveStableId($lo);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1016
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1017 $self->add_StableIdEvents($event);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1018
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1019 } elsif ($ln and $eo and $ln->db_name ne $eo->db_name
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1020 and $ln->stable_id eq $eo->stable_id and $ln->version eq $eo->version) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1021
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1022 # try to brigde gaps
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1023
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1024 if ($en) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1025
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1026 # o--o o--o -> o--o-----o
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1027 # 1 2 2 2 1 2 2
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1028 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1029 # o o--o -> o-----o
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1030 # 1 1 1 1 1
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1031
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1032 #warn 'X: '.$last->ident_string.' | '.$event->ident_string."\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1033
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1034 $self->remove_StableIdEvent($event);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1035 $event->old_ArchiveStableId($ln);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1036 $self->add_StableIdEvents($event);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1037
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1038 } elsif ($lo) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1039
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1040 # there's a deletion event, deal with it differently
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1041
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1042 if ($lo->version eq $ln->version) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1043
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1044 # o--o o -> o-----o
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1045 # 1 1 1 1 1
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1046
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1047 #warn 'Y: '.$last->ident_string.' | '.$event->ident_string."\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1048
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1049 $self->remove_StableIdEvent($last);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1050 $last->new_ArchiveStableId($eo);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1051 $self->add_StableIdEvents($last);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1052
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1053 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1054
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1055 # o--o o -> o--o--o
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1056 # 1 2 2 1 2 2
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1057
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1058 #warn 'Z: '.$last->ident_string.' | '.$event->ident_string."\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1059
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1060 $self->remove_StableIdEvent($event);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1061 $event->old_ArchiveStableId($ln);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1062 $event->new_ArchiveStableId($eo);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1063 $self->add_StableIdEvents($event);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1064
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1065 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1066
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1067 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1068
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1069 # creation followed by deletion in next mapping
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1070 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1071 # o o -> o--o
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1072 # 1 1 1 1
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1073
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1074 #warn 'Q: '.$last->ident_string.' | '.$event->ident_string."\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1075
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1076 $self->remove_StableIdEvent($last);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1077 $self->remove_StableIdEvent($event);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1078 $event->old_ArchiveStableId($ln);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1079 $event->new_ArchiveStableId($eo);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1080 $self->add_StableIdEvents($event);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1081
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1082 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1083
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1084 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1085 #warn 'C: '.$last->ident_string.' | '.$event->ident_string."\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1086 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1087
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1088 $last = $event;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1089 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1090
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1091 # now add ArchiveStableIds of the remaining events to the tree
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1092 $self->add_ArchiveStableIds_for_events;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1093 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1094
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1095
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1096 =head2 reset_tree
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1097
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1098 Example : $history->reset_tree;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1099 Description : Resets all pre-calculated tree grid data. Mostly used internally
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1100 by methods that modify the tree.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1101 Return type : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1102 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1103 Caller : internal
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1104 Status : At Risk
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1105 : under development
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1106
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1107 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1108
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1109 sub reset_tree {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1110 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1111 $self->{'sorted_tree'} = undef;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1112 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1113
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1114
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1115 =head2 current_dbname
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1116
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1117 Arg[1] : (optional) String $dbname - the dbname to set
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1118 Example : my $dbname = $history->current_dbname;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1119 Description : Getter/setter for current dbname.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1120 Return type : String
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1121 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1122 Caller : general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1123 Status : At Risk
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1124 : under development
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1125
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1126 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1127
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1128 sub current_dbname {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1129 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1130 $self->{'current_dbname'} = shift if (@_);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1131 return $self->{'current_dbname'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1132 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1133
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1134
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1135 =head2 current_release
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1136
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1137 Arg[1] : (optional) Int $release - the release to set
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1138 Example : my $release = $history->current_release;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1139 Description : Getter/setter for current release.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1140 Return type : Int
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1141 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1142 Caller : general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1143 Status : At Risk
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1144 : under development
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1145
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1146 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1147
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1148 sub current_release {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1149 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1150 $self->{'current_release'} = shift if (@_);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1151 return $self->{'current_release'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1152 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1153
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1154
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1155 =head2 current_assembly
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1156
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1157 Arg[1] : (optional) String $assembly - the assembly to set
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1158 Example : my $assembly = $history->current_assembly;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1159 Description : Getter/setter for current assembly.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1160 Return type : String
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1161 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1162 Caller : general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1163 Status : At Risk
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1164 : under development
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1165
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1166 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1167
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1168 sub current_assembly {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1169 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1170 $self->{'current_assembly'} = shift if (@_);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1171 return $self->{'current_assembly'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1172 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1173
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1174
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1175 =head2 is_incomplete
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1176
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1177 Arg[1] : (optional) Boolean $incomplete
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1178 Example : if ($history->is_incomplete) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1179 print "Returned tree is incomplete due to too many mappings
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1180 in the database.\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1181 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1182 Description : Getter/setter for incomplete flag. This is used by
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1183 ArchiveStableIdAdaptor to indicate that it finished building
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1184 the tree prematurely due to too many mappins in the db and can
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1185 be used by applications to print warning messages.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1186 Return type : Boolean
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1187 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1188 Caller : general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1189 Status : At Risk
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1190 : under development
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1191
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1192 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1193
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1194 sub is_incomplete {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1195 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1196 $self->{'incomplete'} = shift if (@_);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1197 return $self->{'incomplete'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1198 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1199
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1200
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1201 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1202