annotate variant_effect_predictor/Bio/Root/Vector.pm @ 3:d30fa12e4cc5 default tip

Merge heads 2:a5976b2dce6f and 1:09613ce8151e which were created as a result of a recently fixed bug.
author devteam <devteam@galaxyproject.org>
date Mon, 13 Jan 2014 10:38:30 -0500
parents 1f6dce3d34e0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1 #-----------------------------------------------------------------------------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2 # PACKAGE : Bio::Root::Vector.pm
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
3 # AUTHOR : Steve Chervitz (sac@bioperl.org)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
4 # CREATED : 15 April 1997
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
5 # REVISION: $Id: Vector.pm,v 1.10 2002/10/22 07:38:37 lapp Exp $
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
6 # STATUS : Alpha
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
7 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
8 # WARNING: This is considered an experimental module.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
9 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
10 # For documentation, run this module through pod2html
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
11 # (preferably from Perl v5.004 or better).
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
12 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
13 # MODIFIED:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
14 # sac --- Fri Nov 6 14:24:48 1998
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
15 # * Added destroy() method (experimental).
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
16 # 0.023, 20 Jul 1998, sac:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
17 # * Improved memory management (_destroy_master()).
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
18 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
19 # Copyright (c) 1997 Steve Chervitz. All Rights Reserved.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
20 # This module is free software; you can redistribute it and/or
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
21 # modify it under the same terms as Perl itself.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
22 #-----------------------------------------------------------------------------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
23
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
24 package Bio::Root::Vector;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
25
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
26 use Bio::Root::Global qw(:devel);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
27 use Bio::Root::Object ();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
28
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
29 # @ISA = qw(Bio::Root::Object); # Eventually perhaps...
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
30
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
31 use vars qw($ID $VERSION);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
32 $ID = 'Bio::Root::Vector';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
33 $VERSION = 0.04;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
34
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
35 use strict;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
36 my @SORT_BY = ('rank','name');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
37
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
38 ## POD Documentation:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
39
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
40 =head1 NAME
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
41
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
42 Bio::Root::Vector - Interface for managing linked lists of Perl5 objects.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
43
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
44 =head1 SYNOPSIS
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
45
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
46 =head2 Object Creation
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
47
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
48 B<At present, Vector objects cannot be instantiated.> This
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
49 package is currently designed to be inherited along with another class
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
50 that provides a constructor (e.g., B<Bio::Root::Object.pm>).
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
51 The Vector provides a set of methods that can then be used for managing
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
52 sets of objects.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
53
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
54 See L<the USAGE section | USAGE>.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
55
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
56 =head1 INSTALLATION
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
57
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
58 This module is included with the central Bioperl distribution:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
59
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
60 http://bio.perl.org/Core/Latest
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
61 ftp://bio.perl.org/pub/DIST
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
62
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
63 Follow the installation instructions included in the README file.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
64
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
65
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
66 =head1 DESCRIPTION
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
67
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
68 Bio::Root::Vector.pm provides an interface for creating and manipulating
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
69 dynamic sets (linked lists) of Perl5 objects. This is an abstract class (ie.,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
70 there is no constructor) and as such is expected to be inherited along with
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
71 some other class (see note above).
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
72
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
73 Vectors are handy when, for example, an object may contain one or more
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
74 other objects of a certain class. The container object knows only
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
75 that is has at least one such object; the multiplex nature of the contained
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
76 object is managed by the contained object via its Vector interface.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
77 The methods for adding, removing, counting, listing, and sorting all objects
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
78 are bundled together in Vector.pm.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
79
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
80 Thus, the current Bio::Root::Vector class is somewhat of a cross between an
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
81 interator and a composite design pattern. At present, a number of classes
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
82 utilize Bio::Root::Vector's composite-like behavior to implement a composite
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
83 pattern (Bio::SeqManager.pm, for example).
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
84 This is not necessarily ideal and is expected to change.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
85
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
86 =head1 USAGE
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
87
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
88 For a usage demo of Bio::Root::Vector.pm see the scripts in the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
89 examples/root_object/vector directory.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
90
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
91
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
92 =head1 DEPENDENCIES
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
93
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
94 Bio::Root::Vector.pm does not directly inherit from B<Bio::Root::Object.pm> but
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
95 creates an manager object which does.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
96
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
97 =head1 BUGS/FEATURES
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
98
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
99 By default, all Vectors are doubly-linked lists. This relieves one from
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
100 the burden of worrying about whether a given Vector is single- or doubly-linked.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
101 However, when generating lots of Vectors or extremely large vectors, memory
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
102 becomes an issue. In particular, signaling the GC to free the memory for
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
103 an object when you want to remove it. B<Until this memory issue is resolved,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
104 the use of Vector.pm is not recommended for large projects.>
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
105
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
106 Although it is not required, all objects within a vector are expected
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
107 to derive from the same class (package). Support for heterogeneous
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
108 Vectors has not been explicitly added (but they should work fine, as long
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
109 as you know what you're doing).
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
110
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
111 =head1 FEEDBACK
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
112
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
113 =head2 Mailing Lists
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
114
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
115 User feedback is an integral part of the evolution of this and other Bioperl modules.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
116 Send your comments and suggestions preferably to one of the Bioperl mailing lists.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
117 Your participation is much appreciated.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
118
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
119 bioperl-l@bioperl.org - General discussion
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
120 http://bioperl.org/MailList.shtml - About the mailing lists
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
121
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
122 =head2 Reporting Bugs
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
123
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
124 Report bugs to the Bioperl bug tracking system to help us keep track the bugs and
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
125 their resolution. Bug reports can be submitted via email or the web:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
126
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
127 bioperl-bugs@bio.perl.org
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
128 http://bugzilla.bioperl.org/
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
129
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
130 =head1 AUTHOR
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
131
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
132 Steve Chervitz E<lt>sac@bioperl.orgE<gt>
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
133
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
134 See L<the FEEDBACK section | FEEDBACK> for where to send bug reports and comments.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
135
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
136 =head1 VERSION
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
137
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
138 Bio::Root::Vector.pm, 0.04
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
139
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
140 =head1 TODO
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
141
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
142 =over 4
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
143
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
144 =item * (Maybe) create an container class version of this module
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
145
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
146 to permit Vectors to be instantiated. Thus, instead of inherited
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
147 from both Object.pm and Vector.pm, you could create a Vector.pm object.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
148
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
149 =item * Improve documentation.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
150
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
151 =back
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
152
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
153 =head1 SEE ALSO
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
154
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
155 Bio::Root::Object.pm - Core object
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
156 Bio::Root::Err.pm - Error/Exception object
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
157 Bio::Root::Global.pm - Manages global variables/constants
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
158
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
159 http://bio.perl.org/Projects/modules.html - Online module documentation
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
160 http://bio.perl.org/ - Bioperl Project Homepage
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
161
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
162 =head1 ACKNOWLEDGEMENTS
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
163
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
164 This module was developed under the auspices of the Saccharomyces Genome
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
165 Database:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
166 http://genome-www.stanford.edu/Saccharomyces
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
167
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
168 =head1 COPYRIGHT
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
169
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
170 Copyright (c) 1996-98 Steve Chervitz. All Rights Reserved.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
171 This module is free software; you can redistribute it and/or
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
172 modify it under the same terms as Perl itself.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
173
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
174 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
175
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
176
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
177 #'
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
178 ##
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
179 ###
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
180 #### END of main POD documentation.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
181 ###
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
182 ##
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
183 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
184
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
185 =head1 APPENDIX
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
186
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
187 Methods beginning with a leading underscore are considered private
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
188 and are intended for internal use by this module. They are
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
189 B<not> considered part of the public interface and are described here
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
190 for documentation purposes only.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
191
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
192 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
193
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
194 ########################################################
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
195 # CONSTRUCTOR #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
196 ########################################################
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
197
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
198 ## No constructor. See _set_master() for construction of {Master} data member.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
199
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
200 ## Destructor: Use remove_all() or remove().
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
201
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
202 # New Idea for destructor
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
203 #-------------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
204 sub destroy {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
205 #-------------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
206 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
207 local($^W) = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
208 undef $self->{'_prev'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
209 undef $self->{'_next'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
210 undef $self->{'_rank'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
211 undef $self->{'_master'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
212 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
213
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
214 #####################################################################################
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
215 ## ACCESSORS ##
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
216 #####################################################################################
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
217
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
218
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
219 =head2 set_rank
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
220
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
221 Purpose : To set an object's rank to an arbitrary numeric
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
222 : value to be used for sorting the objects of the Vector.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
223 Usage : $self->set_rank(-RANK =>numeric_ranking_data,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
224 : -RANK_BY =>ranking_criterion_string);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
225 : or without the named parameters as (rank, rank_by).
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
226 Throws : warning (if rank is set without also setting RANK_BY)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
227 Comments : It is redundant for every object to store RANK_BY data.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
228 : For this reason, the RANK_BY data is stored with the master
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
229 : object associated with the vector.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
230
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
231 See Also : L<rank>(), L<rank_by>()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
232
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
233 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
234
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
235 #-------------'
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
236 sub set_rank {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
237 #-------------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
238 my( $self, %param) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
239
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
240 $self->_set_master($self) unless $self->{'_master'}->{'_set'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
241
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
242 my($rank, $rank_by) = $self->master->_rearrange([qw(RANK RANK_BY)], %param);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
243
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
244 $DEBUG==1 and do{ print STDERR "$ID:set_rank() = $rank; Criteria: $rank_by."; <STDIN>; };
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
245
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
246 $self->{'_rank'} = ($rank || undef);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
247 $self->{'_master'}->{'_rankBy'} = ($rank_by || undef);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
248 if( defined $self->{'_rank'} and not defined $self->{'_master'}->{'_rankBy'} ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
249 return $self->master->warn('Rank defined without ranking criteria.');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
250 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
251 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
252 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
253
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
254 sub _set_rank_by {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
255 my( $self, $arg) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
256 $self->{'_master'}->{'_rankBy'} = $arg || 'unknown';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
257 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
258
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
259 sub _set_master {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
260 ## A vector does not need a master object unless it needs to grow.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
261 my($self,$obj) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
262
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
263 # print "$ID: _set_master() new Master object for ${\$obj->name}."; <STDIN>;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
264
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
265 require Bio::Root::Object;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
266 my $master = {};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
267 bless $master, 'Bio::Root::Object';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
268
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
269 $master->{'_set'} = 1; ## Special member indicating that this method has been called.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
270 ## Necessary since perl will generate an anonymous {Master}
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
271 ## hash ref on the fly. This ref will not be blessed however.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
272 $master->{'_first'} = $obj;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
273 $master->{'_last'} = $obj;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
274 $master->{'_size'} = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
275 $master->{'_index'}->{$obj->name()} = $obj;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
276 $self->{'_master'} = $master;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
277
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
278 $self->{'_rank'} = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
279 $self->{'_prev'} = undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
280 $self->{'_next'} = undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
281 # $self->{'_master'}->{'_rankBy'} = undef; # Default rank is the order of addition to Vector.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
282 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
283
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
284 sub _destroy_master {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
285 # This is called when the last object in the vector is being remove()d
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
286 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
287
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
288 return if !$self->master or !$self->master->{'_set'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
289
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
290 my $master = $self->master;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
291
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
292 ## Get rid of the Vector master object.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
293 ref $master->{'_first'} and (%{$master->{'_first'}} = (), undef $master->{'_first'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
294 ref $master->{'_last'} and (%{$master->{'_last'}} = (), undef $master->{'_last'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
295 ref $master->{'_index'} and (%{$master->{'_index'}} = (), undef $master->{'_index'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
296 %{$master} = ();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
297 undef $master;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
298 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
299
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
300
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
301 =head2 clone_vector
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
302
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
303 Purpose : Call this method to clone the whole vector.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
304 : NOT calling this method will extract the vector element.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
305 Usage : $self->clone_vector();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
306 Throws : Exception if argument is not an object reference.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
307 Comments : This method is usually called from within a module's
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
308 : _set_clone() method for modules that inherit from
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
309 : Bio::Root::Vector.pm.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
310
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
311 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
312
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
313 #-----------------'
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
314 sub clone_vector {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
315 #-----------------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
316 my($self, $obj) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
317
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
318 ref($obj) || throw($self, "Can't clone $ID object: Not an object ref ($obj)");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
319
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
320 $self->{'_prev'} = $obj->{'_prev'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
321 $self->{'_next'} = $obj->{'_next'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
322 $self->{'_rank'} = $obj->{'_rank'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
323 $self->{'_master'} = $obj->{'_master'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
324 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
325
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
326
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
327 =head2 prev
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
328
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
329 Purpose : Returns the previous object in the Vector or undef
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
330 : if on first object.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
331 Usage : $self->prev
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
332
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
333 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
334
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
335 #--------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
336 sub prev { my $self = shift; $self->{'_prev'}; }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
337 #--------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
338
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
339
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
340
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
341 =head2 next
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
342
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
343 Purpose : Returns the next object in the Vector or undef
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
344 : if on last object.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
345 Usage : $self->next
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
346
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
347 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
348
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
349 #--------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
350 sub next { my $self = shift; $self->{'_next'}; }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
351 #--------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
352
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
353
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
354
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
355 =head2 first
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
356
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
357 Purpose : Returns the first object in the Vector or $self
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
358 : if Vector size = 1.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
359 Usage : $self->first
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
360
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
361 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
362
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
363 #----------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
364 sub first {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
365 #----------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
366 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
367 defined $self->{'_master'} ? $self->{'_master'}->{'_first'} : $self;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
368 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
369
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
370
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
371 =head2 last
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
372
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
373 Purpose : Returns the last object in the Vector or
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
374 : $self if Vector size = 1.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
375 Usage : $self->last
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
376
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
377 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
378
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
379 #-------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
380 sub last {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
381 #-------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
382 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
383 defined $self->{'_master'} ? $self->{'_master'}->{'_last'} : $self;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
384 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
385
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
386
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
387
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
388 =head2 rank
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
389
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
390 Purpose : Returns the rank of the current object or 1
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
391 : if rank is not defined.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
392 Usage : $self->rank
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
393
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
394 See Also : L<set_rank>()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
395
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
396 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
397
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
398 #---------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
399 sub rank { my $self = shift; $self->{'_rank'} || 1; }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
400 #---------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
401
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
402
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
403
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
404 =head2 rank_by
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
405
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
406 Purpose : Returns the ranking criterion or the string 'order of addition'
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
407 : if rankBy has not been explicitly set.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
408 Usage : $self->rank_by
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
409
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
410 See Also : L<set_rank>()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
411
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
412 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
413
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
414 #-----------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
415 sub rank_by {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
416 #-----------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
417 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
418 defined $self->{'_master'} ? ($self->{'_master'}->{'_rankBy'}||'order of addition')
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
419 : 'unranked';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
420 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
421
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
422
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
423
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
424 =head2 size
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
425
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
426 Purpose : Returns the number of objects currently in the Vector.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
427 Usage : $self->size
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
428
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
429 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
430
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
431 #---------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
432 sub size {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
433 #---------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
434 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
435 defined $self->{'_master'} ? $self->{'_master'}->{'_size'} : 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
436 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
437
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
438
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
439 =head2 master
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
440
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
441 Purpose : Returns the master object associated with the Vector.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
442 : (should probably be a private method).
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
443 Usage : $self->master
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
444
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
445 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
446
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
447 #-----------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
448 sub master { my $self = shift; $self->{'_master'}; }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
449 #-----------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
450
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
451
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
452 ## Not sure what these potentially dangerous methods are used for.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
453 ## Should be unnecessary and probably can be removed.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
454 sub set_prev { my($self,$obj) = @_; $self->{'_prev'} = $obj; }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
455 sub set_next { my($self,$obj) = @_; $self->{'_next'} = $obj; }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
456
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
457 #############################################################################
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
458 # INSTANCE METHODS ##
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
459 #############################################################################
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
460
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
461
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
462 =head2 is_first
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
463
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
464 Purpose : Test whether the current object is the first in the Vector.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
465 Usage : $self->is_first
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
466
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
467 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
468
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
469 #------------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
470 sub is_first { my($self) = shift; return not defined $self->{'_prev'}; }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
471 #------------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
472
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
473
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
474 =head2 is_last
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
475
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
476 Purpose : Test whether the current object is the last in the Vector.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
477 Usage : $self->is_last
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
478
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
479 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
480
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
481 #------------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
482 sub is_last { my($self) = shift; return not defined $self->{'_next'}; }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
483 #------------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
484
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
485
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
486
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
487
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
488 =head2 get
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
489
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
490 Purpose : Retrives an object from the Vector given its name.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
491 : Returns undef if the object cannot be found.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
492 Usage : $self->get(object_name)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
493 Examples : $self->get($obj->name)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
494
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
495 See Also : L<list>()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
496
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
497 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
498
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
499 #--------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
500 sub get {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
501 #--------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
502 my($self,$name) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
503
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
504 my ($obj);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
505 # print "$ID get(): getting $name\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
506
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
507 if($self->{'_master'}->{'_set'}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
508 # my @names = keys %{$self->{'_master'}->{'_index'}};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
509 # print "$ID: names in hash:\n@names";<STDIN>;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
510 # print " returning $self->{'_master'}->{'_index'}->{$name}\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
511 local($^W) = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
512 $obj = $self->{'_master'}->{'_index'}->{$name};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
513 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
514
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
515 elsif($self->name =~ /$name/i) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
516 # print " returning self\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
517 $obj = $self;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
518 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
519
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
520 if(not ref $obj) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
521 $self->throw("Can't get object named \"$name\": object not set or name undefined.");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
522 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
523 $obj;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
524 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
525
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
526 ## Former strategy: hunt through the list for the object.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
527 ## No longer needed since master indexes all objects.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
528 # do{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
529 # if($obj->name eq $name) { return $obj; }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
530 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
531 # } while($obj = $current->prev());
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
532
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
533
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
534
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
535
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
536 =head2 add
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
537
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
538 Purpose : Add an object to the end of a Vector.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
539 Usage : $self->add(object_reference)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
540
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
541 See also : L<insert>(), L<remove>()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
542
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
543 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
544
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
545 #--------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
546 sub add {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
547 #--------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
548 my($self,$new,$index) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
549
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
550 $self->_set_master($self) unless $self->{'_master'}->{'_set'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
551
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
552 # print "\n\nADDING TO VECTOR ${\ref $self} ${\$self->name}\nFOR PARENT: ${\ref $self->parent} ${\$self->parent->name}\n\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
553
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
554 $self->{'_next'} = $new;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
555 $new->{'_prev'} = $self;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
556 $self->{'_master'}->{'_last'} = $new;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
557 $self->{'_master'}->{'_size'}++;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
558 $new->{'_master'} = $self->{'_master'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
559 $new->_incrementRank();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
560 $new->Bio::Root::Vector::_index();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
561
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
562 # printf "NEW CONTENTS: (n=%s)\n", $self->size;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
563 # my $obj = $self->first;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
564 # my $count=0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
565 # do { print "\n","Object #",++$count,"\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
566 # $obj->display;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
567 # } while($obj=$obj->next);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
568 # <STDIN>;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
569 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
570
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
571
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
572 sub _index {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
573 my($self) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
574 my $name = $self->name;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
575
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
576 # Generate unique name, if necessary, for indexing purposes.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
577 if( not $name or $name =~ /anonymous/) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
578 $name ||= '';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
579 $name .= $self->size();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
580 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
581 # print "$ID: _index() called for $name\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
582
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
583 $self->{'_master'}->{'_index'}->{$name} = $self;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
584 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
585
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
586 sub _incrementRank {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
587 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
588 return if not defined $self->{'_prev'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
589 $self->{'_rank'} = $self->{'_prev'}->rank() + 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
590 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
591
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
592
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
593 =head2 remove
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
594
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
595 Purpose : Remove the current object from the Vector.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
596 Usage : $self->remove([-RET=>'first'|'last'|'next'|'prev'], [-UPDATE => 0|1])
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
597 Returns : The first, last, next, or previous object in the Vector
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
598 : depending on the value of the -RET parameter.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
599 : Default = next.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
600 Argument : Named parameters: (TAGS CAN BE ALL UPPER OR ALL LOWER CASE)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
601 : -RET => string: 'first', 'last', 'prev' 'next'
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
602 : THis indicates the object to be returned.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
603 : -UPDATE => boolean, if non-zero all objects in the vector
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
604 : will be re-ranked.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
605 Comments : The -UPDATE parameter should be set to true to force a re-updating
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
606 : of the rank data for each object. (default = 0, no update).
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
607
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
608 See Also : L<add>(), L<insert>(), L<shift>(), L<chop>()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
609
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
610 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
611
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
612 #-----------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
613 sub remove {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
614 #-----------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
615 my($self,%param) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
616 my $updateRank = $param{-UPDATE} || $param{'-update'} || 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
617 my $ret = $param{-RET} || $param{'-ret'} || 'next';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
618
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
619 $DEBUG==2 && do{ print STDERR "$ID: removing ${\$self->name}; ret = $ret";<STDIN>; };
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
620
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
621 ## This set of conditionals involves primarily pointer shuffling.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
622 ## The special case of destroying a vector of size 1 is handled.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
623
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
624 if($self->is_first()) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
625 $DEBUG==2 && print STDERR "---> removing first object: ${\$self->name()}.\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
626 if($self->is_last) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
627 # print "Removing only object in vector: ${\$self->name}.\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
628 $self->_destroy_master();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
629 return $self->destroy;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
630 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
631 undef ($self->{'_next'}->{'_prev'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
632 $self->_update_first($self->{'_next'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
633 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
634
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
635 } elsif($self->is_last()) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
636 $DEBUG==2 && print STDERR "---> removing last object: ${\$self->name()}.\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
637 undef ($self->{'_prev'}->{'_next'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
638 $self->_update_last($self->{'_prev'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
639
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
640 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
641 $DEBUG==2 && print STDERR "---> removing internal object.\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
642 $self->{'_prev'}->{'_next'} = $self->{'_next'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
643 $self->{'_next'}->{'_prev'} = $self->{'_prev'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
644 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
645
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
646 $updateRank && $self->_update_rank();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
647 $self->{'_master'}->{'_size'}--;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
648
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
649 # print "new vector size = ",$self->size,"\n"; <STDIN>;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
650
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
651 my($retObj);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
652
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
653 if( $self->size) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
654 if($ret eq 'first') { $retObj = $self->first(); }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
655 elsif($ret eq 'last') { $retObj = $self->last(); }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
656 elsif($ret eq 'next') { $retObj = $self->next(); }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
657 elsif($ret eq 'prev') { $retObj = $self->prev(); }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
658 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
659
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
660 ## Destroy the object.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
661 # $self->destroy;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
662
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
663 $DEBUG && do{ print STDERR "$ID: returning ${\$retObj->name}";<STDIN>; };
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
664
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
665 $retObj;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
666 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
667
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
668 sub _update_first {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
669 my($self,$first) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
670 $DEBUG && print STDERR "Updating first.\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
671 undef ($first->{'_prev'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
672 $self->{'_master'}->{'_first'} = $first;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
673 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
674
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
675 sub _update_last {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
676 my($self,$last) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
677 $DEBUG && print STDERR "Updating last.\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
678 undef ($last->{'_next'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
679 $self->{'_master'}->{'_last'} = $last;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
680 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
681
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
682
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
683 =head2 remove_all
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
684
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
685 Purpose : Remove all objects currently in the Vector.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
686 Usage : $self->remove_all
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
687
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
688 See Also : L<remove>(), L<shift>(), L<chop>()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
689
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
690 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
691
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
692 #---------------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
693 sub remove_all {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
694 #---------------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
695 my($self,%param) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
696
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
697 $DEBUG==2 && print STDERR "DESTROYING VECTOR $self ${\$self->name}";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
698
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
699 # print "$ID Removing all.";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
700
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
701 $self = $self->first();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
702
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
703 while(ref $self) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
704 # print "$ID: removing ${\$self->name}\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
705 $self = $self->remove(-RET=>'next');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
706 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
707 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
708
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
709
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
710 =head2 shift
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
711
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
712 Purpose : Remove the first object from the Vector.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
713 : This is a wrapper for remove().
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
714 Usage : $self->shift([-RET=>'first'|'last'|'next'|'prev'])
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
715 Returns : The object returned by remove().
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
716
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
717 See Also : L<remove>(), L<chop>()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
718
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
719 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
720
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
721 #---------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
722 sub shift {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
723 #---------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
724 my($self,%param) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
725 $self = $self->first();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
726 $self = $self->remove(%param);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
727 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
728
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
729
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
730 =head2 chop
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
731
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
732 Purpose : Remove the last object from the Vector.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
733 : This is a wrapper for remove().
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
734 Usage : $self->chop([-RET=>'first'|'last'|'next'|'prev'])
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
735 Returns : The object returned by remove().
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
736
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
737 See Also : L<remove>(), L<shift>()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
738
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
739 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
740
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
741 #----------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
742 sub chop {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
743 #----------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
744 my($self,%param) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
745 $self = $self->last();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
746 $self = $self->remove(%param);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
747 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
748
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
749
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
750
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
751 =head2 insert
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
752
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
753 Purpose : Insert a new object into the vector relative to the current object.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
754 Usage : $self->insert(object_ref, ['before'|'after'])
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
755 Examples : $self->insert($obj) # Default insert after $self
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
756 : $self->insert($obj,'before')
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
757 Returns : The new number of objects in the vector (int).
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
758 Throws : exception if the first argument is not a reference.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
759
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
760 See Also : L<add>(), L<remove>()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
761
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
762 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
763
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
764 #-----------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
765 sub insert {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
766 #-----------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
767 my($self,$object,$where) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
768 my($first);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
769 $where ||= 'after';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
770
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
771 $self->_set_master($self) unless $self->{'_master'}->{'_set'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
772
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
773 ref($object) || return $self->master->throw("Can't insert. Not an object: $object");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
774
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
775 if($where eq 'before') {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
776 $object->{'_next'} = $self;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
777 $object->{'_prev'} = $self->{'_prev'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
778 $object->{'_master'} = $self->{'_master'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
779 $self->{'_prev'}->{'_next'} = $object;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
780 $self->{'_prev'} = $object;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
781 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
782 $object->{'_prev'} = $self;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
783 $object->{'_next'} = $self->{'_next'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
784 $object->{'_master'} = $self->{'_master'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
785 $self->{'_next'}->{'_prev'} = $object;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
786 $self->{'_next'} = $object;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
787 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
788 $self->{'_master'}->{'_size'}++;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
789 $object->Bio::Root::Vector::_index(); ##Fully qualified to disambiguate a potentially common method name.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
790 $self->_update_rank();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
791 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
792
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
793 sub _update_rank {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
794 my($self) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
795 my $current = $self->first();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
796 my $count = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
797 $DEBUG && print STDERR "$ID: Updating rank.\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
798 do{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
799 $count++;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
800 $current->{'_rank'} = $count;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
801
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
802 } while($current = $current->next());
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
803 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
804
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
805
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
806 =head2 list
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
807
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
808 Purpose : Returns objects in the Vector as an array or array slice.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
809 Usage : $self->list([starting_object|'first'] [,ending_object|'last'])
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
810 Examples : $self->list
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
811 : $self->list('first',$self->prev)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
812
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
813 See Also : L<get>()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
814
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
815 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
816
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
817 #----------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
818 sub list {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
819 #----------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
820 my($self,$start,$stop) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
821 my(@list);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
822
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
823 $start ||= 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
824 $stop ||= 'last';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
825
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
826 if( $start =~ /first|beg|start/i or $start <= 1 ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
827 $start = $self->first();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
828 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
829
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
830 if( $stop =~ /last|end|stop/i ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
831 $stop = $self->last();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
832 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
833
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
834 ref($start) || ($start = $self->first());
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
835 ref($stop) || ($stop = $self->last());
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
836
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
837 my $obj = $start;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
838 my $fini = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
839 do{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
840 push @list, $obj;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
841 if($obj eq $stop) { $fini = 1; }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
842 } while( $obj = $obj->next() and !$fini);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
843
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
844 @list;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
845 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
846
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
847
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
848 =head2 sort
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
849
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
850 Purpose : Sort the objects in the Vector.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
851 Usage : $self->sort(['rank'|'name'], [reverse])
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
852 Returns : The last object of the sorted Vector.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
853 Argument : First argument can be 'name' or 'rank' to sort on
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
854 : the object's name or rank data member, respectively.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
855 : If reverse is non-zero, sort will be in reverse order.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
856 Example : $self->sort() # Default sort by rank, not reverse.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
857 : $self->sort('name','reverse')
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
858
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
859 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
860
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
861 #---------'
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
862 sub sort {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
863 #---------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
864 my ($self,$sortBy,$reverse) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
865 my (@unsortedList,@sortedList);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
866
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
867 $sortBy ||= 'rank';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
868 my $rankBy = $self->rank_by;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
869
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
870 ### Build the initial unsorted list.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
871 my $obj = $self->first();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
872 do{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
873 push @unsortedList, $obj;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
874 } while( $obj = $obj->next());
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
875
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
876 # print "UNSORTED LIST:\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
877 # foreach(@unsortedList) {print $_->name().' '};<STDIN>;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
878
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
879 ### Sort it.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
880 if( $sortBy =~ /rank/i) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
881 # print "sorting by rank";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
882 if($reverse) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
883 # print " (reverse).\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
884 @sortedList = reverse sort _sort_by_rank @unsortedList;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
885 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
886 @sortedList = sort _sort_by_rank @unsortedList;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
887 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
888 } elsif( $sortBy =~ /name/i) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
889 # print "sorting by name";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
890 if($reverse) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
891 # print "(reverse).\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
892 @sortedList = reverse sort _sort_by_name @unsortedList;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
893 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
894 @sortedList = sort _sort_by_name @unsortedList;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
895 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
896 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
897 # print "unknown sort criteria: $sortBy\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
898 $self->warn("Invalid sorting criteria: $sortBy.",
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
899 "Sorting by rank.");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
900 @sortedList = sort _sort_by_rank @unsortedList;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
901 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
902
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
903
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
904 # if($reverse) { @sortedList = reverse sort @sortedList; }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
905
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
906 # print "SORTED LIST:\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
907 # foreach(@sortedList) {print $_->name().' '};<STDIN>;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
908
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
909 ### Re-load the Vector with the sorted list.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
910 my $count=0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
911
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
912 $self = $sortedList[0];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
913 $self->_set_master($self);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
914 $self->_set_rank_by($rankBy);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
915
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
916 my($i);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
917 my $current = $self;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
918 for($i=1; $i<@sortedList; $current=$sortedList[$i], $i++) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
919 $current->add($sortedList[$i]);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
920 if($i==$#sortedList) { $sortedList[$i]->{'_next'} = undef;}
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
921 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
922
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
923 $self->last();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
924 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
925
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
926 sub _sort_by_rank { my $aRank = $a->rank(); my $bRank = $b->rank(); $aRank <=> $bRank; }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
927
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
928 sub _sort_by_name { my $aName = $a->name(); my $bName = $b->name(); $aName cmp $bName; }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
929
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
930
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
931
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
932 =head2 valid_any
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
933
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
934 Purpose : Determine if at least one object in the Vector is valid.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
935 Usage : $self->valid_any
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
936 Status : Deprecated.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
937 Comments : A non-valid object should throw an exception that must be
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
938 : be caught an dealt with on the spot.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
939
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
940 See Also : B<Bio::Root::Object::valid()>
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
941
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
942 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
943
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
944 #-------------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
945 sub valid_any {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
946 #-------------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
947 my $self = &shift(@_);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
948
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
949 my $obj = $self->first();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
950 do{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
951 return 1 if $obj->valid();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
952 } while( $obj = $obj->next());
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
953
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
954 return undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
955 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
956
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
957
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
958 =head2 valid_all
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
959
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
960 Purpose : Determine if all objects in the Vector are valid.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
961 Usage : $self->valid_all
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
962 Comments : A non-valid object should throw an exception that must be
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
963 : be caught an dealt with on the spot.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
964
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
965 See Also : B<Bio::Root::Object::valid()>
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
966
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
967 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
968
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
969 #--------------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
970 sub valid_all {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
971 #--------------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
972 my $self = &shift(@_);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
973
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
974 my $obj = $self->first();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
975 do{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
976 return unless $obj->valid();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
977 } while( $obj = $obj->next());
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
978
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
979 return 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
980 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
981
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
982 sub _display_stats {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
983 # This could be fleshed out a bit...
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
984
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
985 my( $self, $OUT ) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
986
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
987 printf ( $OUT "%-11s %s\n","RANK:", $self->rank());
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
988 printf ( $OUT "%-11s %s\n","RANK BY:", $self->rank_by());
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
989 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
990
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
991 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
992 __END__
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
993
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
994 #####################################################################################
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
995 # END OF CLASS #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
996 #####################################################################################
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
997
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
998 =head1 FOR DEVELOPERS ONLY
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
999
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1000 =head2 Data Members
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1001
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1002 Information about the various data members of this module is provided for those
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1003 wishing to modify or understand the code. Two things to bear in mind:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1004
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1005 =over 4
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1006
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1007 =item 1 Do NOT rely on these in any code outside of this module.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1008
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1009 All data members are prefixed with an underscore to signify that they are private.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1010 Always use accessor methods. If the accessor doesn't exist or is inadequate,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1011 create or modify an accessor (and let me know, too!).
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1012
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1013 =item 2 This documentation may be incomplete and out of date.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1014
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1015 It is easy for this documentation to become obsolete as this module is still evolving.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1016 Always double check this info and search for members not described here.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1017
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1018 =back
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1019
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1020 Bio::Root::Vector.pm objects currently cannot be instantiated. Vector.pm must be inherited
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1021 along with Bio::Root::Object.pm (or an object that provides a constructor).
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1022 Vector.pm defines the following fields:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1023
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1024 FIELD VALUE
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1025 ------------------------------------------------------------------------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1026 _prev Reference to the previous object in the Vector.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1027
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1028 _next Reference to the next object in the Vector.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1029
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1030 _rank Rank relative to other objects in the Vector.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1031 Default rank = chronological order of addition to the Vector.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1032
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1033 _master A reference to an Bio::Root::Object that acts as a manager for
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1034 the given Vector. There is only one master per Vector.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1035 A master object is only needed when the Vector size is >1.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1036 The master object manages the following Vector data:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1037
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1038 _first - Reference to the first object in the Vector.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1039 _last - Reference to the last object in the Vector.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1040 _size - Total number of objects in the Vector.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1041 _rankBy - Criteria used to rank the object.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1042 Default: chronological order of addition.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1043 _index - Hash reference for quick access to any object
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1044 based on its name.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1045 Bio::Root::Object{'_err'} - Holds any errors affecting the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1046 Vector as a whole.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1047
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1048 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1049
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1050 1;