annotate variant_effect_predictor/Bio/LiveSeq/Chain.pm @ 0:2bc9b66ada89 draft default tip

Uploaded
author mahtabm
date Thu, 11 Apr 2013 06:29:17 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1 #!/usr/bin/perl
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
2 # $Id: Chain.pm,v 1.12 2001/06/18 08:27:53 heikki Exp $
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
3 #
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
4 # bioperl module for Bio::LiveSeq::Chain
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
5 #
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
6 # Cared for by Joseph Insana <insana@ebi.ac.uk> <jinsana@gmx.net>
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
7 #
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
8 # Copyright Joseph Insana
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
9 #
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
10 # You may distribute this module under the same terms as perl itself
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
11 #
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
12 # POD documentation - main docs before the code
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
13 #
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
14
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
15 =head1 NAME
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
16
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
17 Bio::LiveSeq::Chain - DoubleChain DataStructure for Perl
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
18
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
19 =head1 SYNOPSIS
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
20
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
21 #documentation needed
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
22
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
23 =head1 DESCRIPTION
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
24
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
25 This is a general purpose module (that's why it's not in object-oriented
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
26 form) that introduces a novel datastructure in PERL. It implements
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
27 the "double linked chain". The elements of the chain can contain basically
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
28 everything. From chars to strings, from object references to arrays or hashes.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
29 It is used in the LiveSequence project to create a dynamical DNA sequence,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
30 easier to manipulate and change. It's use is mainly for sequence variation
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
31 analysis but it could be used - for example - in e-cell projects.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
32 The Chain module in itself doesn't have any biological bias, so can be
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
33 used for any programming purpose.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
34
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
35 Each element of the chain (with the exclusion of the first and the last of the
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
36 chain) is connected to other two elements (the PREVious and the NEXT one).
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
37 There is no absolute position (like in an array), hence if positions are
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
38 important, they need to be computed (methods are provided).
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
39 Otherwise it's easy to keep track of the elements with their "LABELs".
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
40 There is one LABEL (think of it as a pointer) to each ELEMENT. The labels
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
41 won't change after insertions or deletions of the chain. So it's
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
42 always possible to retrieve an element even if the chain has been
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
43 modified by successive insertions or deletions.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
44 From this the high potential profit for bioinformatics: dealing with
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
45 sequences in a way that doesn't have to rely on positions, without
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
46 the need of constantly updating them if the sequence changes, even
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
47 dramatically.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
48
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
49 =head1 AUTHOR - Joseph A.L. Insana
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
50
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
51 Email: Insana@ebi.ac.uk, jinsana@gmx.net
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
52
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
53 Address:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
54
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
55 EMBL Outstation, European Bioinformatics Institute
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
56 Wellcome Trust Genome Campus, Hinxton
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
57 Cambs. CB10 1SD, United Kingdom
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
58
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
59 =head1 APPENDIX
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
60
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
61 The rest of the documentation details each of the object
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
62 methods. Internal methods are usually preceded with a _
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
63
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
64 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
65
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
66 # Let the code begin...
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
67
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
68 # DoubleChain Data Structure for PERL
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
69 # by Joseph A.L. Insana - Deathson - Filius Mortis - Fal Mortais
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
70 # insana@ebi.ac.uk, jinsana@gmx.net
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
71
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
72 package Bio::LiveSeq::Chain;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
73 # Version history:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
74 # Fri Mar 10 16:46:51 GMT 2000 v1.0 begun working on chains in perl
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
75 # Sat Mar 11 05:47:21 GMT 2000 v.1.4 working on splice method
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
76 # Sun Mar 12 14:08:31 GMT 2000 v.1.5
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
77 # Sun Mar 12 17:21:51 GMT 2000 v.2.0 splice method working, is_updownstream made
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
78 # Sun Mar 12 18:11:22 GMT 2000 v.2.04 wrapped all in package Chain.pm
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
79 # Sun Mar 12 18:49:23 GMT 2000 v.2.08 added elements()
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
80 # Sun Mar 12 21:18:04 GMT 2000 v.2.1 done array2dchain, working on *insert*
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
81 # Sun Mar 12 23:04:40 GMT 2000 v.2.16 done *insert*, up_element, create_elems
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
82 # Sun Mar 12 23:45:32 GMT 2000 v.2.17 debugged and checked
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
83 # Mon Mar 13 00:44:51 GMT 2000 v.2.2 added mutate()
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
84 # Mon Mar 13 02:00:32 GMT 2000 v 2.21 added invert_dchain()
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
85 # Mon Mar 13 03:01:21 GMT 2000 v 2.22 created updown_chain2string
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
86 # Mon Mar 13 03:45:50 GMT 2000 v.2.24 added subchain_length()
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
87 # Mon Mar 13 17:25:04 GMT 2000 v.2.26 added element_at_pos and pos_of_element
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
88 # Wed Mar 15 23:05:06 GMT 2000 v.2.27 use strict enforced
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
89 # Thu Mar 16 19:05:34 GMT 2000 v.2.3 changed dchain->chain everywhere
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
90 # Fri Mar 17 01:48:36 GMT 2000 v.2.33 mutate_element renamed, created new
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
91 # methods: set_value, get_value...
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
92 # Fri Mar 17 05:03:15 GMT 2000 v.2.4 set_value_at_pos, get_value_at_pos
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
93 # get_label_at_pos...
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
94 # Fri Mar 17 15:51:07 GMT 2000 v.2.41 renamed pos_of_element -> get_pos_of_label
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
95 # Fri Mar 17 18:10:36 GMT 2000 v.2.44 recoded subchain_length and pos_of_label
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
96 # Fri Mar 17 20:12:27 GMT 2000 v.2.5 NAMING change: index->label everywhere
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
97 # Mon Mar 20 18:33:10 GMT 2000 v.2.52 label_exists(), start(), end()
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
98 # Mon Mar 20 23:10:28 GMT 2000 v.2.6 labels() created
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
99 # Wed Mar 22 18:35:17 GMT 2000 v.2.61 chain2string() rewritten
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
100 # Tue Dec 12 14:47:58 GMT 2000 v 2.66 optimized with /use integer/
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
101 # Tue Dec 12 16:28:45 GMT 2000 v 2.7 rewritten comments to methods in pod style
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
102
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
103 #
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
104 $VERSION=2.7;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
105 #
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
106 # TODO_list:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
107 # **** cleanup code
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
108 # **** performance concerns
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
109 # *??* create hash2dchain ???? (with hashkeys used for label)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
110 # **????** how about using array of arrays instead than hash of arrays??
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
111 #
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
112 # further strict complaints:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
113 # in verbose $string assignment around line 721 ???
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
114
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
115 # TERMINOLOGY update, naming convention:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
116 # "chain" the datastructure
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
117 # "element" the individual units that compose a chain
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
118 # "label" the unique name of a single element
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
119 # "position" the position of an element into the chain according to a
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
120 # particular coordinate system (e.g. counting from the start)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
121 # "value" what is stored in a single element
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
122
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
123 use Carp qw(croak cluck carp); # as of 2.3
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
124 use strict; # as of 2.27
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
125 use integer; # WARNING: this is to increase performance
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
126 # a little bit of attention has to be given if float need to
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
127 # be stored as elements of the array
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
128 # the use of this "integer" affects all operations but not
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
129 # assignments. So float CAN be assigned as elements of the chain
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
130 # BUT, if you assign $z=-1.8;, $z will be equal to -1 because
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
131 # "-" counts as a unary operation!
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
132
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
133 =head2 _updown_chain2string
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
134
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
135 Title : chain2string
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
136 Usage : $string = Bio::LiveSeq::Chain::chain2string("down",$chain,6,9)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
137 Function: reads the contents of the chain, outputting a string
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
138 Returns : a string
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
139 Examples:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
140 : down_chain2string($chain) -> all the chain from begin to end
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
141 : down_chain2string($chain,6) -> from 6 to the end
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
142 : down_chain2string($chain,6,4) -> from 6, going on 4 elements
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
143 : down_chain2string($chain,6,"",10) -> from 6 to 10
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
144 : up_chain2string($chain,10,"",6) -> from 10 to 6 upstream
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
145 Defaults: start=first element; if len undef, goes to last
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
146 if last undef, goes to end
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
147 if last defined, it overrides len (undefining it)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
148 Error code: -1
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
149 Args : "up"||"down" as first argument to specify the reading direction
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
150 reference (to the chain)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
151 [first] [len] [last] optional integer arguments to specify how
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
152 much and from (and to) where to read
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
153
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
154 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
155
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
156 # methods rewritten 2.61
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
157 sub up_chain2string {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
158 _updown_chain2string("up",@_);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
159 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
160 sub down_chain2string {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
161 _updown_chain2string("down",@_);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
162 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
163
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
164 sub _updown_chain2string {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
165 my ($direction,$chain,$first,$len,$last)=@_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
166 unless($chain) { cluck "no chain input"; return (-1); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
167 my $begin=$chain->{'begin'}; # the label of the BEGIN element
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
168 my $end=$chain->{'end'}; # the label of the END element
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
169 my $flow;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
170
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
171 if ($direction eq "up") {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
172 $flow=2; # used to determine the direction of chain navigation
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
173 unless ($first) { $first=$end; } # if undef or 0, use $end
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
174 } else { # defaults to "down"
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
175 $flow=1; # used to determine the direction of chain navigation
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
176 unless ($first) { $first=$begin; } # if undef or 0, use $begin
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
177 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
178
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
179 unless($chain->{$first}) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
180 cluck "label for first not defined"; return (-1); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
181 if ($last) { # if last is defined, it gets priority and len is not used
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
182 unless($chain->{$last}) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
183 cluck "label for last not defined"; return (-1); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
184 if ($len) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
185 warn "Warning chain2string: argument LAST:$last overriding LEN:$len!";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
186 undef $len;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
187 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
188 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
189 if ($direction eq "up") {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
190 $last=$begin; # if last not defined, go 'till begin (or upto len elements)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
191 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
192 $last=$end; # if last not defined, go 'till end (or upto len elements)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
193 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
194 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
195
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
196 my ($string,@array);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
197 my $label=$first; my $i=1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
198 my $afterlast=$chain->{$last}[$flow]; # if last=end, afterlast is undef
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
199 unless (defined $afterlast) { $afterlast=0; } # keep strict happy
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
200
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
201 # proceed for len elements or until last, whichever comes first
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
202 # if $len undef goes till end
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
203 while (($label) && ($label != $afterlast) && ($i <= ($len || $i + 1))) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
204 @array=@{$chain->{$label}};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
205 $string .= $array[0];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
206 $label = $array[$flow];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
207 $i++;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
208 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
209 return ($string); # if chain is interrupted $string won't be complete
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
210 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
211
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
212 =head2 _updown_labels
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
213
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
214 Title : labels
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
215 Usage : @labels = Bio::LiveSeq::Chain::_updown_labels("down",$chain,4,16)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
216 Function: returns all the labels in a chain or those between two
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
217 specified ones (termed "first" and "last")
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
218 Returns : a reference to an array containing the labels
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
219 Args : "up"||"down" as first argument to specify the reading direction
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
220 reference (to the chain)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
221 [first] [last] (integer for the starting and eneding labels)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
222
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
223 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
224
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
225
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
226 # arguments: CHAIN_REF [FIRSTLABEL] [LASTLABEL]
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
227 # returns: reference to array containing the labels
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
228 sub down_labels {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
229 my ($chain,$first,$last)=@_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
230 _updown_labels("down",$chain,$first,$last);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
231 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
232 sub up_labels {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
233 my ($chain,$first,$last)=@_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
234 _updown_labels("up",$chain,$first,$last);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
235 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
236 # arguments: "up"||"down" CHAIN_REF [FIRSTLABEL] [LASTLABEL]
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
237 # returns: reference to array containing the labels
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
238 sub _updown_labels {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
239 my ($direction,$chain,$first,$last)=@_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
240 unless($chain) { cluck "no chain input"; return (0); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
241 my $begin=$chain->{'begin'}; # the label of the BEGIN element
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
242 my $end=$chain->{'end'}; # the label of the END element
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
243 my $flow;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
244 if ($direction eq "up") { $flow=2;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
245 unless ($first) { $first=$end; }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
246 unless ($last) { $last=$begin; }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
247 } else { $flow=1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
248 unless ($last) { $last=$end; }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
249 unless ($first) { $first=$begin; }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
250 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
251 unless($chain->{$first}) { warn "not existing label $first"; return (0); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
252 unless($chain->{$last}) { warn "not existing label $last"; return (0); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
253
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
254 my $label=$first; my @labels;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
255 my $afterlast=$chain->{$last}[$flow]; # if last=end, afterlast is undef
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
256 unless (defined $afterlast) { $afterlast=0; } # keep strict happy
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
257
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
258 while (($label)&&($label != $afterlast)) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
259 push(@labels,$label);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
260 $label=$chain->{$label}[$flow];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
261 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
262 return (\@labels); # if chain is interrupted @labels won't be complete
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
263 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
264
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
265
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
266 =head2 start
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
267
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
268 Title : start
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
269 Usage : $start = Bio::LiveSeq::Chain::start()
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
270 Returns : the label marking the start of the chain
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
271 Errorcode: -1
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
272 Args : none
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
273
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
274 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
275
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
276 sub start {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
277 my $chain=$_[0];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
278 unless($chain) { cluck "no chain input"; return (-1); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
279 return ($chain->{'begin'});
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
280 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
281
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
282 =head2 end
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
283
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
284 Title : end
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
285 Usage : $end = Bio::LiveSeq::Chain::end()
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
286 Returns : the label marking the end of the chain
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
287 Errorcode: -1
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
288 Args : none
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
289
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
290 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
291
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
292 sub end {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
293 my $chain=$_[0];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
294 unless($chain) { cluck "no chain input"; return (-1); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
295 return ($chain->{'end'});
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
296 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
297
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
298 =head2 label_exists
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
299
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
300 Title : label_exists
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
301 Usage : $check = Bio::LiveSeq::Chain::label_exists($chain,$label)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
302 Function: It checks if a label is defined, i.e. if an element is there or
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
303 is not there anymore
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
304 Returns : 1 if the label exists, 0 if it is not there, -1 error
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
305 Errorcode: -1
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
306 Args : reference to the chain, integer
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
307
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
308 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
309
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
310 sub label_exists {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
311 my ($chain,$label)=@_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
312 unless($chain) { cluck "no chain input"; return (-1); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
313 if ($label && $chain->{$label}) { return (1); } else { return (0) };
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
314 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
315
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
316
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
317 =head2 down_get_pos_of_label
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
318
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
319 Title : down_get_pos_of_label
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
320 Usage : $position = Bio::LiveSeq::Chain::down_get_pos_of_label($chain,$label,$first)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
321 Function: returns the position of $label counting from $first, i.e. taking
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
322 $first as 1 of coordinate system. If $first is not specified it will
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
323 count from the start of the chain.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
324 Returns :
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
325 Errorcode: 0
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
326 Args : reference to the chain, integer (the label of interest)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
327 optional: integer (a different label that will be taken as the
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
328 first one, i.e. the one to count from)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
329 Note: It counts "downstream". To proceed backward use up_get_pos_of_label
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
330
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
331 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
332
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
333 sub down_get_pos_of_label {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
334 #down_chain2string($_[0],$_[2],undef,$_[1],"counting");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
335 my ($chain,$label,$first)=@_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
336 _updown_count("down",$chain,$first,$label);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
337 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
338 sub up_get_pos_of_label {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
339 #up_chain2string($_[0],$_[2],undef,$_[1],"counting");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
340 my ($chain,$label,$first)=@_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
341 _updown_count("up",$chain,$first,$label);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
342 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
343
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
344 =head2 down_subchain_length
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
345
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
346 Title : down_subchain_length
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
347 Usage : $length = Bio::LiveSeq::Chain::down_subchain_length($chain,$first,$last)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
348 Function: returns the length of the chain between the labels "first" and "last", included
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
349 Returns : integer
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
350 Errorcode: 0
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
351 Args : reference to the chain, integer, integer
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
352 Note: It counts "downstream". To proceed backward use up_subchain_length
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
353
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
354 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
355
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
356 # arguments: chain_ref [first] [last]
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
357 # returns the length of the chain between first and last (included)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
358 sub down_subchain_length {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
359 #down_chain2string($_[0],$_[1],undef,$_[2],"counting");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
360 my ($chain,$first,$last)=@_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
361 _updown_count("down",$chain,$first,$last);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
362 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
363 sub up_subchain_length {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
364 #up_chain2string($_[0],$_[1],undef,$_[2],"counting");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
365 my ($chain,$first,$last)=@_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
366 _updown_count("up",$chain,$first,$last);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
367 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
368
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
369 # arguments: DIRECTION CHAIN_REF FIRSTLABEL LASTLABEL
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
370 # errorcode 0
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
371 sub _updown_count {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
372 my ($direction,$chain,$first,$last)=@_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
373 unless($chain) { cluck "no chain input"; return (0); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
374 my $begin=$chain->{'begin'}; # the label of the BEGIN element
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
375 my $end=$chain->{'end'}; # the label of the END element
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
376 my $flow;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
377 if ($direction eq "up") { $flow=2;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
378 unless ($first) { $first=$end; }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
379 unless ($last) { $last=$begin; }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
380 } else { $flow=1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
381 unless ($last) { $last=$end; }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
382 unless ($first) { $first=$begin; }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
383 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
384 unless($chain->{$first}) { warn "not existing label $first"; return (0); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
385 unless($chain->{$last}) { warn "not existing label $last"; return (0); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
386
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
387 my $label=$first; my $count;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
388 my $afterlast=$chain->{$last}[$flow]; # if last=end, afterlast is undef
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
389 unless (defined $afterlast) { $afterlast=0; } # keep strict happy
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
390
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
391 while (($label)&&($label != $afterlast)) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
392 $count++;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
393 $label=$chain->{$label}[$flow];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
394 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
395 return ($count); # if chain is interrupted, $i will be up to the breaking point
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
396 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
397
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
398 =head2 invert_chain
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
399
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
400 Title : invert_chain
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
401 Usage : $errorcode=Bio::LiveSeq::Chain::invert_chain($chain)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
402 Function: completely inverts the order of the chain elements; begin is swapped with end and all links updated (PREV&NEXT fields swapped)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
403 Returns : 1 if all OK, 0 if errors
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
404 Errorcode: 0
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
405 Args : reference to the chain
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
406
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
407 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
408
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
409 sub invert_chain {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
410 my $chain=$_[0];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
411 unless($chain) { cluck "no chain input"; return (0); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
412 my $begin=$chain->{'begin'}; # the name of the first element
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
413 my $end=$chain->{'end'}; # the name of the last element
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
414 my ($label,@array);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
415 $label=$begin; # starts from the beginning
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
416 while ($label) { # proceed with linked elements, swapping PREV and NEXT
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
417 @array=@{$chain->{$label}};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
418 ($chain->{$label}[1],$chain->{$label}[2])=($array[2],$array[1]); # swap
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
419 $label = $array[1]; # go to the next one
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
420 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
421 # now swap begin and end fields
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
422 ($chain->{'begin'},$chain->{'end'})=($end,$begin);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
423 return (1); # that's it
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
424 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
425
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
426 # warning that method has changed name
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
427 #sub mutate_element {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
428 #croak "Warning: old method name. Please update code to 'set_value_at_label'\n";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
429 # &set_value_at_label;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
430 #}
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
431
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
432 =head2 down_get_value_at_pos
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
433
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
434 Title : down_get_value_at_pos
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
435 Usage : $value = Bio::LiveSeq::Chain::down_get_value_at_pos($chain,$position,$first)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
436 Function: used to access the value of the chain at a particular position instead than directly with a label pointer. It will count the position from the start of the chain or from the label $first, if $first is specified
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
437 Returns : whatever is stored in the element of the chain
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
438 Errorcode: 0
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
439 Args : reference to the chain, integer, [integer]
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
440 Note: It works "downstream". To proceed backward use up_get_value_at_pos
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
441
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
442 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
443
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
444 #sub get_value_at_pos {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
445 #croak "Please use instead: down_get_value_at_pos";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
446 ##&down_get_value_at_pos;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
447 #}
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
448 sub down_get_value_at_pos {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
449 my ($chain,$position,$first)=@_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
450 my $label=down_get_label_at_pos($chain,$position,$first);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
451 # check place of change
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
452 if (($label eq -1)||($label eq 0)) { # complain if label doesn't exist
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
453 warn "not existing element $label"; return (0); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
454 return _get_value($chain,$label);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
455 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
456 sub up_get_value_at_pos {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
457 my ($chain,$position,$first)=@_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
458 my $label=up_get_label_at_pos($chain,$position,$first);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
459 # check place of change
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
460 if (($label eq -1)||($label eq 0)) { # complain if label doesn't exist
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
461 warn "not existing element $label"; return (0); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
462 return _get_value($chain,$label);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
463 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
464
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
465 =head2 down_set_value_at_pos
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
466
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
467 Title : down_set_value_at_pos
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
468 Usage : $errorcode = Bio::LiveSeq::Chain::down_set_value_at_pos($chain,$newvalue,$position,$first)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
469 Function: used to store a new value inside an element of the chain at a particular position instead than directly with a label pointer. It will count the position from the start of the chain or from the label $first, if $first is specified
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
470 Returns : 1
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
471 Errorcode: 0
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
472 Args : reference to the chain, newvalue, integer, [integer]
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
473 (newvalue can be: integer, string, object reference, hash ref)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
474 Note: It works "downstream". To proceed backward use up_set_value_at_pos
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
475 Note2: If the $newvalue is undef, it will delete the contents of the
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
476 element but it won't remove the element from the chain.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
477
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
478 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
479
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
480 #sub set_value_at_pos {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
481 #croak "Please use instead: down_set_value_at_pos";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
482 ##&down_set_value_at_pos;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
483 #}
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
484 sub down_set_value_at_pos {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
485 my ($chain,$value,$position,$first)=@_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
486 my $label=down_get_label_at_pos($chain,$position,$first);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
487 # check place of change
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
488 if (($label eq -1)||($label eq 0)) { # complain if label doesn't exist
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
489 warn "not existing element $label"; return (0); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
490 _set_value($chain,$label,$value);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
491 return (1);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
492 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
493 sub up_set_value_at_pos {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
494 my ($chain,$value,$position,$first)=@_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
495 my $label=up_get_label_at_pos($chain,$position,$first);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
496 # check place of change
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
497 if (($label eq -1)||($label eq 0)) { # complain if label doesn't exist
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
498 warn "not existing element $label"; return (0); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
499 _set_value($chain,$label,$value);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
500 return (1);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
501 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
502
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
503
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
504 =head2 down_set_value_at_label
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
505
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
506 Title : down_set_value_at_label
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
507 Usage : $errorcode = Bio::LiveSeq::Chain::down_set_value_at_label($chain,$newvalue,$label)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
508 Function: used to store a new value inside an element of the chain defined by its label.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
509 Returns : 1
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
510 Errorcode: 0
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
511 Args : reference to the chain, newvalue, integer
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
512 (newvalue can be: integer, string, object reference, hash ref)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
513 Note: It works "downstream". To proceed backward use up_set_value_at_label
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
514 Note2: If the $newvalue is undef, it will delete the contents of the
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
515 element but it won't remove the element from the chain.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
516
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
517 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
518
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
519 sub set_value_at_label {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
520 my ($chain,$value,$label)=@_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
521 unless($chain) { cluck "no chain input"; return (0); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
522
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
523 # check place of change
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
524 unless($chain->{$label}) { # complain if label doesn't exist
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
525 warn "not existing element $label"; return (0); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
526 _set_value($chain,$label,$value);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
527 return (1);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
528 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
529
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
530 =head2 down_get_value_at_label
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
531
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
532 Title : down_get_value_at_label
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
533 Usage : $value = Bio::LiveSeq::Chain::down_get_value_at_label($chain,$label)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
534 Function: used to access the value of the chain from one element defined by its label.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
535 Returns : whatever is stored in the element of the chain
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
536 Errorcode: 0
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
537 Args : reference to the chain, integer
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
538 Note: It works "downstream". To proceed backward use up_get_value_at_label
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
539
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
540 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
541
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
542 sub get_value_at_label {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
543 my $chain=$_[0];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
544 unless($chain) { cluck "no chain input"; return (0); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
545 my $label = $_[1]; # the name of the element
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
546
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
547 # check place of change
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
548 unless($chain->{$label}) { # complain if label doesn't exist
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
549 warn "not existing label $label"; return (0); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
550 return _get_value($chain,$label);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
551 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
552
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
553 # arguments: CHAIN_REF LABEL VALUE
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
554 sub _set_value {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
555 my ($chain,$label,$value)=@_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
556 $chain->{$label}[0]=$value;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
557 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
558 # arguments: CHAIN_REF LABEL
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
559 sub _get_value {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
560 my ($chain,$label)=@_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
561 return $chain->{$label}[0];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
562 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
563
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
564 =head2 down_get_label_at_pos
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
565
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
566 Title : down_get_label_at_pos
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
567 Usage : $label = Bio::LiveSeq::Chain::down_get_label_at_pos($chain,$position,$first)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
568 Function: used to retrieve the label of an an element of the chain at a particular position. It will count the position from the start of the chain or from the label $first, if $first is specified
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
569 Returns : integer
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
570 Errorcode: 0
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
571 Args : reference to the chain, integer, [integer]
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
572 Note: It works "downstream". To proceed backward use up_get_label_at_pos
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
573
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
574 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
575
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
576 # arguments: CHAIN_REF POSITION [FIRST]
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
577 # returns: LABEL of element found counting from FIRST
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
578 sub down_get_label_at_pos {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
579 _updown_get_label_at_pos("down",@_);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
580 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
581 sub up_get_label_at_pos {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
582 _updown_get_label_at_pos("up",@_);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
583 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
584
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
585 # arguments: [DIRECTION] CHAIN_REF POSITION [FIRST]
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
586 # Default DIRECTION="down"
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
587 # if FIRST is undefined, FIRST=START (if DIRECTION=down) or FIRST=END (up)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
588
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
589 sub _updown_get_label_at_pos {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
590 my ($direction,$chain,$position,$first)=@_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
591 unless($chain) { cluck "no chain input"; return (0); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
592 my $begin=$chain->{'begin'}; # the label of the BEGIN element
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
593 my $end=$chain->{'end'}; # the label of the END element
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
594 my $flow;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
595 if ($direction eq "up") { $flow=2; unless ($first) { $first=$end; }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
596 } else { $flow=1; unless ($first) { $first=$begin; } }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
597 unless($chain->{$first}) { warn "not existing label $first"; return (0); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
598
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
599 my $label=$first;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
600 my $i=1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
601 while ($i < $position) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
602 $label=$chain->{$label}[$flow];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
603 $i++;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
604 unless ($label) { return (0); } # chain ended before position reached
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
605 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
606 return ($label);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
607 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
608
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
609 # for english_concerned, latin_unconcerned people
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
610 sub preinsert_string { &praeinsert_string }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
611 sub preinsert_array { &praeinsert_array }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
612
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
613 # praeinsert_string CHAIN_REF STRING [POSITION]
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
614 # the chars of STRING are passed to praeinsert_array
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
615 # the chars are inserted in CHAIN, before POSITION
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
616 # if POSITION is undef, default is to prepend the string to the beginning
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
617 # i.e. POSITION is START of CHAIN
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
618 sub praeinsert_string {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
619 my @string=split(//,$_[1]);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
620 praeinsert_array($_[0],\@string,$_[2]);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
621 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
622
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
623 # postinsert_string CHAIN_REF STRING [POSITION]
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
624 # the chars of STRING are passed to postinsert_array
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
625 # the chars are inserted in CHAIN, after POSITION
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
626 # if POSITION is undef, default is to append the string to the end
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
627 # i.e. POSITION is END of CHAIN
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
628 sub postinsert_string {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
629 my @string=split(//,$_[1]);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
630 postinsert_array($_[0],\@string,$_[2]);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
631 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
632
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
633 # praeinsert_array CHAIN_REF ARRAY_REF [POSITION]
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
634 # the elements of ARRAY are inserted in CHAIN, before POSITION
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
635 # if POSITION is undef, default is to prepend the elements to the beginning
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
636 # i.e. POSITION is START of CHAIN
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
637 sub praeinsert_array {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
638 _praepostinsert_array($_[0],"prae",$_[1],$_[2]);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
639 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
640
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
641 # postinsert_array CHAIN_REF ARRAY_REF [POSITION]
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
642 # the elements of ARRAY are inserted in CHAIN, after POSITION
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
643 # if POSITION is undef, default is to append the elements to the end
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
644 # i.e. POSITION is END of CHAIN
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
645 sub postinsert_array {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
646 _praepostinsert_array($_[0],"post",$_[1],$_[2]);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
647 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
648
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
649
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
650 =head2 _praepostinsert_array
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
651
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
652 Title : _praepostinsert_array
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
653 Usage : ($insbegin,$insend) = Bio::LiveSeq::Chain::_praepostinsert_array($chainref,"post",$arrayref,$position)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
654 Function: the elements of the array specified by $arrayref are inserted (creating a new subchain) in the chain specified by $chainref, before or after (depending on the "prae"||"post" keyword passed as second argument) the specified position.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
655 Returns : two labels: the first and the last of the inserted subchain
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
656 Defaults: if no position is specified, the new chain will be inserted after
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
657 (post) the first element of the chain
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
658 Errorcode: 0
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
659 Args : chainref, "prae"||"post", arrayref, integer (position)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
660
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
661 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
662
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
663 # returns: 0 if errors, otherwise returns references of begin and end of
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
664 # the insertion
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
665 sub _praepostinsert_array {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
666 my $chain=$_[0];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
667 unless($chain) { cluck "no chain input"; return (0); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
668 my $praepost=$_[1] || "post"; # defaults to post
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
669 my ($prae,$post);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
670 my $position=$_[3];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
671 my $begin=$chain->{'begin'}; # the name of the first element of the chain
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
672 my $end=$chain->{'end'}; # the name of the the last element of the chain
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
673 # check if prae or post insertion and prepare accordingly
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
674 if ($praepost eq "prae") {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
675 $prae=1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
676 unless (($position eq 0)||($position)) { $position=$begin; } # if undef, use $begin
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
677 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
678 $post=1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
679 unless (($position eq 0)||($position)) { $position=$end; } # if undef, use $end
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
680 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
681 # check place of insertion
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
682 unless($chain->{$position}) { # complain if position doesn't exist
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
683 warn ("Warning _praepostinsert_array: not existing element $position");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
684 return (0);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
685 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
686
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
687 # check if there are elements to insert
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
688 my $elements=$_[2]; # reference to the array containing the new elements
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
689 my $elements_count=scalar(@{$elements});
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
690 unless ($elements_count) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
691 warn ("Warning _praepostinsert_array: no elements input"); return (0); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
692
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
693 # create new chainelements with offset=firstfree(chain)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
694 my ($insertbegin,$insertend)=_create_chain_elements($chain,$elements);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
695
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
696 # DEBUGGING
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
697 #print "Executing ${praepost}insertion of $elements_count elements ('@{$elements}') at position: $position\n";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
698
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
699 # attach the new chain to the old chain
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
700 # 4 cases: prae@begin, prae@middle, post@middle, post@end
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
701 # NOTE: in case of double joinings always join wisely so not to
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
702 # delete the PREV/NEXT attribute before it is needed
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
703 my $noerror=1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
704 if ($prae) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
705 if ($position==$begin) { # 1st case: prae@begin
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
706 $noerror=_join_chain_elements($chain,$insertend,$begin);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
707 $chain->{'begin'}=$insertbegin;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
708 } else { # 2nd case: prae@middle
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
709 $noerror=_join_chain_elements($chain,up_element($chain,$position),$insertbegin);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
710 $noerror=_join_chain_elements($chain,$insertend,$position);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
711 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
712 } elsif ($post) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
713 if ($position==$end) { # 4th case: post@end
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
714 $noerror=_join_chain_elements($chain,$end,$insertbegin);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
715 $chain->{'end'}=$insertend;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
716 } else { # 3rd case: post@middle # note the order of joins (important)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
717 $noerror=_join_chain_elements($chain,$insertend,down_element($chain,$position));
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
718 $noerror=_join_chain_elements($chain,$position,$insertbegin);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
719 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
720 } else { # this should never happen
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
721 die "_praepostinsert_array: Something went very wrong";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
722 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
723
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
724 # check for errors and return begin,end of insertion
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
725 if ($noerror) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
726 return ($insertbegin,$insertend);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
727 } else { # something went wrong with the joinings
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
728 warn "Warning _praepostinsert_array: Joining of insertion failed";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
729 return (0);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
730 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
731 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
732
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
733 # create new chain elements with offset=firstfree
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
734 # arguments: CHAIN_REF ARRAY_REF
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
735 # returns: pointers to BEGIN and END of new chained elements created
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
736 # returns 0 if error(s) encountered
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
737 sub _create_chain_elements {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
738 my $chain=$_[0];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
739 unless($chain) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
740 warn ("Warning _create_chain_elements: no chain input"); return (0); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
741 my $arrayref=$_[1];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
742 my $array_count=scalar(@{$arrayref});
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
743 unless ($array_count) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
744 warn ("Warning _create_chain_elements: no elements input"); return (0); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
745 my $begin=$chain->{'firstfree'};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
746 my $i=$begin-1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
747 my $element;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
748 foreach $element (@{$arrayref}) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
749 $i++;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
750 $chain->{$i}=[$element,$i+1,$i-1];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
751 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
752 my $end=$i;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
753 $chain->{'firstfree'}=$i+1; # what a new added element should be called
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
754 $chain->{'size'} += $end-$begin+1; # increase size of chain
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
755 # leave sticky edges (to be joined by whoever called this subroutine)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
756 $chain->{$begin}[2]=undef;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
757 $chain->{$end}[1]=undef;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
758 return ($begin,$end); # return pointers to first and last of the newelements
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
759 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
760
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
761 # argument: CHAIN_REF ELEMENT
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
762 # returns: name of DOWN/NEXT element (the downstream one)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
763 # returns -1 if error encountered (e.g. chain or elements undefined)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
764 # returns 0 if there's no DOWN element
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
765 sub down_element {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
766 _updown_element("down",@_);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
767 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
768 # argument: CHAIN_REF ELEMENT
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
769 # returns: name of UP/PREV element (the upstream one)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
770 # returns -1 if error encountered (e.g. chain or elements undefined)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
771 # returns 0 if there's no UP element
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
772 sub up_element {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
773 _updown_element("up",@_);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
774 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
775
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
776 # used by both is_up_element and down_element
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
777 sub _updown_element {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
778 my $direction=$_[0] || "down"; # defaults to downstream
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
779 my $flow;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
780 if ($direction eq "up") {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
781 $flow=2; # used to determine the direction of chain navigation
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
782 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
783 $flow=1; # used to determine the direction of chain navigation
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
784 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
785 my $chain=$_[1];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
786 unless($chain) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
787 warn ("Warning ${direction}_element: no chain input"); return (-1); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
788 my $me = $_[2]; # the name of the element
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
789 my $it = $chain->{$me}[$flow]; # the prev||next one, upstream||downstream
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
790 if ($it) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
791 return ($it); # return the name of prev||next element
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
792 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
793 return (0); # there is no prev||next element ($it is undef)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
794 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
795 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
796
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
797 # used by both is_downstream and is_upstream
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
798 sub _is_updownstream {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
799 my $direction=$_[0] || "down"; # defaults to downstream
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
800 my $flow;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
801 if ($direction eq "up") {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
802 $flow=2; # used to determine the direction of chain navigation
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
803 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
804 $flow=1; # used to determine the direction of chain navigation
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
805 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
806 my $chain=$_[1];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
807 unless($chain) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
808 warn ("Warning is_${direction}stream: no chain input"); return (-1); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
809 my $first=$_[2]; # the name of the first element
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
810 my $second=$_[3]; # the name of the first element
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
811 if ($first==$second) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
812 warn ("Warning is_${direction}stream: first==second!!"); return (0); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
813 unless($chain->{$first}) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
814 warn ("Warning is_${direction}stream: first element not defined"); return (-1); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
815 unless($chain->{$second}) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
816 warn ("Warning is_${direction}stream: second element not defined"); return (-1); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
817 my ($label,@array);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
818 $label=$first;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
819 my $found=0;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
820 while (($label)&&(!($found))) { # searches till the end or till found
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
821 if ($label==$second) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
822 $found=1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
823 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
824 @array=@{$chain->{$label}};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
825 $label = $array[$flow]; # go to the prev||next one, upstream||downstream
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
826 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
827 return $found;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
828 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
829
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
830 =head2 is_downstream
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
831
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
832 Title : is_downstream
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
833 Usage : Bio::LiveSeq::Chain::is_downstream($chainref,$firstlabel,$secondlabel)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
834 Function: checks if SECONDlabel follows FIRSTlabel
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
835 It runs downstream the elements of the chain from FIRST searching
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
836 for SECOND.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
837 Returns : 1 if SECOND is found /after/ FIRST; 0 otherwise (i.e. if it
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
838 reaches the end of the chain without having found it)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
839 Errorcode -1
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
840 Args : two labels (integer)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
841
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
842 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
843
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
844 sub is_downstream {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
845 _is_updownstream("down",@_);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
846 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
847
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
848 =head2 is_upstream
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
849
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
850 Title : is_upstream
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
851 Usage : Bio::LiveSeq::Chain::is_upstream($chainref,$firstlabel,$secondlabel)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
852 Function: checks if SECONDlabel follows FIRSTlabel
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
853 It runs upstream the elements of the chain from FIRST searching
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
854 for SECOND.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
855 Returns : 1 if SECOND is found /after/ FIRST; 0 otherwise (i.e. if it
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
856 reaches the end of the chain without having found it)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
857 Errorcode -1
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
858 Args : two labels (integer)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
859
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
860 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
861
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
862 sub is_upstream {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
863 _is_updownstream("up",@_);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
864 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
865
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
866 =head2 check_chain
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
867
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
868 Title : check_chain
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
869 Usage : @errorcodes = Bio::LiveSeq::Chain::check_chain()
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
870 Function: a wraparound to a series of check for consistency of the chain
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
871 It will check for boundaries, size, backlinking and forwardlinking
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
872 Returns : array of 4 warn codes, each can be 1 (all ok) or 0 (something wrong)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
873 Errorcode: 0
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
874 Args : none
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
875 Note : this is slow and through. It is not really needed. It is mostly
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
876 a code-developer tool.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
877
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
878 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
879
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
880 sub check_chain {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
881 my $chain=$_[0];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
882 unless($chain) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
883 warn ("Warning check_chain: no chain input"); return (-1); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
884 my ($warnbound,$warnsize,$warnbacklink,$warnforlink);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
885 $warnbound=&_boundcheck; # passes on the arguments of the subroutine
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
886 $warnsize=&_sizecheck;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
887 $warnbacklink=&_downlinkcheck;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
888 $warnforlink=&_uplinkcheck;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
889 return ($warnbound,$warnsize,$warnbacklink,$warnforlink);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
890 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
891
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
892 # consistency check for forwardlinks walking upstream
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
893 # argument: a chain reference
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
894 # returns: 1 all OK 0 problems
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
895 sub _uplinkcheck {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
896 _updownlinkcheck("up",@_);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
897 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
898
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
899 # consistency check for backlinks walking downstream
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
900 # argument: a chain reference
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
901 # returns: 1 all OK 0 problems
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
902 sub _downlinkcheck {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
903 _updownlinkcheck("down",@_);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
904 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
905
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
906 # consistency check for links, common to _uplinkcheck and _downlinkcheck
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
907 # argument: "up"||"down", check_ref
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
908 # returns: 1 all OK 0 problems
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
909 sub _updownlinkcheck {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
910 my $direction=$_[0] || "down"; # defaults to downstream
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
911 my ($flow,$wolf);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
912 my $chain=$_[1];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
913 unless($chain) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
914 warn ("Warning _${direction}linkcheck: no chain input"); return (0); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
915 my $begin=$chain->{'begin'}; # the name of the first element
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
916 my $end=$chain->{'end'}; # the name of the last element
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
917 my ($label,@array,$me,$it,$itpoints);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
918 if ($direction eq "up") {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
919 $flow=2; # used to determine the direction of chain navigation
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
920 $wolf=1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
921 $label=$end; # start from end
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
922 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
923 $flow=1; # used to determine the direction of chain navigation
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
924 $wolf=2;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
925 $label=$begin; # start from beginning
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
926 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
927 my $warncode=1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
928
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
929 while ($label) { # proceed with linked elements, checking neighbours
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
930 $me=$label;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
931 @array=@{$chain->{$label}};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
932 $label = $array[$flow]; # go to the next one
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
933 $it=$label;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
934 if ($it) { # no sense in checking if next one not defined (END element)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
935 @array=@{$chain->{$label}};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
936 $itpoints=$array[$wolf];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
937 unless ($me==$itpoints) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
938 warn "Warning: ${direction}LinkCheck: LINK wrong in $it, that doesn't point back to me ($me). It points to $itpoints\n";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
939 $warncode=0;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
940 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
941 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
942 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
943 return $warncode;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
944 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
945
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
946 # consistency check for size of chain
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
947 # argument: a chain reference
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
948 # returns: 1 all OK 0 wrong size
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
949 sub _sizecheck {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
950 my $chain=$_[0];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
951 unless($chain) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
952 warn ("Warning _sizecheck: no chain input"); return (0); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
953 my $begin=$chain->{'begin'}; # the name of the first element
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
954 my $warncode=1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
955 my ($label,@array);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
956 my $size=$chain->{'size'};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
957 my $count=0;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
958 $label=$begin;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
959 while ($label) { # proceed with linked elements, counting
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
960 @array=@{$chain->{$label}};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
961 $label = $array[1]; # go to the next one
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
962 $count++;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
963 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
964 if ($size != $count) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
965 warn "Size check reports error: assumed size: $size, real size: $count ";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
966 $warncode=0;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
967 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
968 return $warncode;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
969 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
970
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
971
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
972 # consistency check for begin and end (boundaries)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
973 # argument: a chain reference
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
974 # returns: 1 all OK 0 problems
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
975 sub _boundcheck {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
976 my $chain=$_[0];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
977 unless($chain) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
978 warn ("Warning _boundcheck: no chain input"); return (0); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
979 my $begin=$chain->{'begin'}; # the name of the first element
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
980 my $end=$chain->{'end'}; # the name of the (supposedly) last element
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
981 my $warncode=1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
982
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
983 # check SYNC of beginning
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
984 if (($begin)&&($chain->{$begin})) { # if the BEGIN points to existing element
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
985 if ($chain->{$begin}[2]) { # if BEGIN element has PREV not undef
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
986 warn "Warning: BEGIN element has PREV field defined \n";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
987 warn "\tWDEBUG begin: $begin\t";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
988 warn "\tWDEBUG begin's PREV: $chain->{$begin}[2] \n";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
989 $warncode=0;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
990 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
991 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
992 warn "Warning: BEGIN key of chain does not point to existing element!\n";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
993 warn "\tWDEBUG begin: $begin\n";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
994 $warncode=0;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
995 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
996 # check SYNC of end
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
997 if (($end)&&($chain->{$end})) { # if the END points to an existing element
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
998 if ($chain->{$end}[1]) { # if END element has NEXT not undef
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
999 warn "Warning: END element has NEXT field defined \n";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1000 warn "\tWDEBUG end: $end\t";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1001 warn "\tWDEBUG end's NEXT: $chain->{$end}[1] \n";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1002 $warncode=0;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1003 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1004 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1005 warn "Warning: END key of chain does not point to existing element!\n";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1006 warn "\tWDEBUG end: $end\n";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1007 $warncode=0;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1008 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1009 return $warncode;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1010 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1011
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1012 # arguments: chain_ref
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1013 # returns: the size of the chain (the number of elements)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1014 # return code -1: unexistant chain, errors...
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1015 sub chain_length {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1016 my $chain=$_[0];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1017 unless($chain) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1018 warn ("Warning chain_length: no chain input"); return (-1); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1019 my $size=$chain->{'size'};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1020 if ($size) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1021 return ($size);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1022 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1023 return (-1);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1024 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1025 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1026
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1027 # arguments: chain ref, first element name, second element name
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1028 # returns: 1 or 0 (1 ok, 0 errors)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1029 sub _join_chain_elements {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1030 my $chain=$_[0];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1031 unless($chain) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1032 warn ("Warning _join_chain_elements: no chain input"); return (0); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1033 my $leftelem=$_[1];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1034 my $rightelem=$_[2];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1035 unless(($leftelem)&&($rightelem)) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1036 warn ("Warning _join_chain_elements: element arguments??"); return (0); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1037 if (($chain->{$leftelem})&&($chain->{$rightelem})) { # if the elements exist
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1038 $chain->{$leftelem}[1]=$rightelem;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1039 $chain->{$rightelem}[2]=$leftelem;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1040 return 1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1041 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1042 warn ("Warning _join_chain_elements: elements not defined");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1043 return 0;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1044 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1045 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1046
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1047 =head2 splice_chain
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1048
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1049 Title : splice_chain
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1050 Usage : @errorcodes = Bio::LiveSeq::Chain::splice_chain($chainref,$first,$length,$last)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1051 Function: removes the elements designated by FIRST and LENGTH from a chain.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1052 The chain shrinks accordingly. If LENGTH is omitted, removes
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1053 everything from FIRST onward.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1054 If END is specified, LENGTH is ignored and instead the removal
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1055 occurs from FIRST to LAST.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1056 Returns : the elements removed as a string
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1057 Errorcode: -1
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1058 Args : chainref, integer, integer, integer
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1059
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1060 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1061
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1062 sub splice_chain {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1063 my $chain=$_[0];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1064 unless($chain) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1065 warn ("Warning splice_chain: no chain input"); return (-1); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1066 my $begin=$chain->{'begin'}; # the name of the first element
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1067 my $end=$chain->{'end'}; # the name of the (supposedly) last element
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1068 my $first=$_[1];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1069 unless (($first eq 0)||($first)) { $first=$begin; } # if undef, use $begin
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1070 my $len=$_[2];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1071 my $last=$_[3];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1072 my (@array, $string);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1073 my ($beforecut,$aftercut);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1074
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1075 unless($chain->{$first}) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1076 warn ("Warning splice_chain: first element not defined"); return (-1); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1077 if ($last) { # if last is defined, it gets priority and len is not used
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1078 unless($chain->{$last}) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1079 warn ("Warning splice_chain: last element not defined"); return (-1); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1080 if ($len) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1081 warn ("Warning splice_chain: argument LAST:$last overriding LEN:$len!");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1082 undef $len;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1083 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1084 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1085 $last=$end; # if last not defined, go 'till end (or to len, whichever 1st)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1086 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1087
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1088 $beforecut=$chain->{$first}[2]; # what's the element before 1st deleted?
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1089 # if it is undef then it means we are splicing since the beginning
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1090
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1091 my $i=1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1092 my $label=$first;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1093 my $afterlast=$chain->{$last}[1]; # if $last=$end $afterlast should be undef
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1094 unless (defined $afterlast) { $afterlast=0; } # keep strict happy
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1095
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1096 # proceed for len elements or until the end, whichever comes first
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1097 # if len undef goes till last
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1098 while (($label)&&($label != $afterlast) && ($i <= ($len || $i + 1))) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1099 @array=@{$chain->{$label}};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1100 $string .= $array[0];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1101 $aftercut = $array[1]; # what's the element next last deleted?
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1102 # also used as savevar to change label posdeletion
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1103 delete $chain->{$label}; # this can be deleted now
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1104 $label=$aftercut; # label is updated using the savevar
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1105 $i++;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1106 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1107
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1108 # Now fix the chain (sticky edges, fields)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1109 # 4 cases: cut in the middle, cut from beginning, cut till end, cut all
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1110 #print "\n\tstickyDEBUG beforecut: $beforecut "; # DEBUG
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1111 #print "\taftercut: $aftercut \n"; # DEBUG
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1112 if ($beforecut) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1113 if ($aftercut) { # 1st case, middle cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1114 _join_chain_elements($chain,$beforecut,$aftercut);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1115 } else { # 3rd case, end cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1116 $chain->{'end'}=$beforecut; # update the END field
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1117 $chain->{$beforecut}[1]=undef; # since we cut till the end
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1118 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1119 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1120 if ($aftercut) { # 2nd case, begin cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1121 $chain->{'begin'}=$aftercut; # update the BEGIN field
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1122 $chain->{$aftercut}[2]=undef; # since we cut from beginning
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1123 } else { # 4th case, all has been cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1124 $chain->{'begin'}=undef;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1125 $chain->{'end'}=undef;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1126 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1127 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1128 $chain->{'size'}=($chain->{'size'}) - $i + 1; # update the SIZE field
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1129
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1130 return $string;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1131 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1132
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1133
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1134 # arguments: CHAIN_REF POSITION [FIRST]
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1135 # returns: element counting POSITION from FIRST or from START if FIRST undef
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1136 # i.e. returns the element at POSITION counting from FIRST
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1137 #sub element_at_pos {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1138 #croak "Warning: old method name. Please update code to 'down_get_label_at_position'\n";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1139 ##&down_element_at_pos;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1140 #}
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1141 #sub up_element_at_pos {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1142 ## old wraparound
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1143 ##my @array=up_chain2string($_[0],$_[2],$_[1],undef,"elements");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1144 ##return $array[-1];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1145 #croak "old method name. Update code to: up_get_label_at_position";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1146 ##&up_get_label_at_pos;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1147 #}
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1148 #sub down_element_at_pos {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1149 ## old wraparound
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1150 ##my @array=down_chain2string($_[0],$_[2],$_[1],undef,"elements");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1151 ##return $array[-1];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1152 #croak "old method name. Update code to: down_get_label_at_position";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1153 ##&down_get_label_at_pos;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1154 #}
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1155
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1156 # arguments: CHAIN_REF ELEMENT [FIRST]
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1157 # returns: the position of ELEMENT counting from FIRST or from START
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1158 #i if FIRST is undef
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1159 # i.e. returns the Number of elements between FIRST and ELEMENT
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1160 # i.e. returns the position of element taking FIRST as 1 of coordinate system
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1161 #sub pos_of_element {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1162 #croak ("Warning: old and ambiguous method name. Please update code to 'down_get_pos_of_label'\n");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1163 ##&down_pos_of_element;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1164 #}
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1165 #sub up_pos_of_element {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1166 #croak ("Warning: old method name. Please update code to 'up_get_pos_of_label'\n");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1167 ##up_chain2string($_[0],$_[2],undef,$_[1],"counting");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1168 #}
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1169 #sub down_pos_of_element {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1170 #croak ("Warning: old method name. Please update code to 'down_get_pos_of_label'\n");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1171 ##down_chain2string($_[0],$_[2],undef,$_[1],"counting");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1172 #}
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1173
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1174 # wraparounds to calculate length of subchain from first to last
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1175 # arguments: chain_ref [first] [last]
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1176 #sub subchain_length {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1177 #croak "Warning: old method name. Please update code to 'down_subchain_length'\n";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1178 ##&down_subchain_length;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1179 #}
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1180
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1181 # wraparounds to have elements output
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1182 # same arguments as chain2string
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1183 # returns label|name of every element
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1184 #sub elements {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1185 #croak ("Warning: method no more supported. Please update code to 'down_labels' (NB: now it returns ref to array and doesn't allow length argument!)\n");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1186 ##&down_elements;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1187 #}
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1188 #sub up_elements {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1189 #croak ("Warning: method no more supported. Please update code to 'up_labels' (NB: now it returns ref to array and doesn't allow length argument!)\n");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1190 ##up_chain2string($_[0],$_[1],$_[2],$_[3],"elements");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1191 #}
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1192 #sub down_elements {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1193 #croak ("Warning: method no more supported. Please update code to 'down_labels' (NB: now it returns ref to array and doesn't allow length argument!)\n");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1194 ##down_chain2string($_[0],$_[1],$_[2],$_[3],"elements");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1195 #}
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1196
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1197 # wraparounds to have verbose output
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1198 # same arguments as chain2string
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1199 # returns the chain in a very verbose way
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1200 sub chain2string_verbose {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1201 carp "Warning: method no more supported.\n";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1202 &old_down_chain2string_verbose;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1203 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1204 sub up_chain2string_verbose {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1205 carp "Warning: method no more supported.\n";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1206 old_up_chain2string($_[0],$_[1],$_[2],$_[3],"verbose");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1207 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1208 sub down_chain2string_verbose {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1209 carp "Warning: method no more supported.\n";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1210 old_down_chain2string($_[0],$_[1],$_[2],$_[3],"verbose");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1211 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1212
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1213 #sub chain2string {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1214 #croak ("Warning: old method name. Please update code to 'down_chain2string'\n");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1215 ##&down_chain2string;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1216 #}
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1217 sub old_up_chain2string {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1218 old_updown_chain2string("up",@_);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1219 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1220 sub old_down_chain2string {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1221 old_updown_chain2string("down",@_);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1222 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1223
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1224 # common to up_chain2string and down_chain2string
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1225 # arguments: "up"||"down" chain_ref [first] [len] [last] [option]
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1226 # [option] can be any of "verbose", "counting", "elements"
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1227 # error: return -1
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1228 # defaults: start = first element; if len undef, goes to last
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1229 # if last undef, goes to end
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1230 # if last def it overrides len (that gets undef)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1231 # returns: a string
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1232 # example usage: down_chain2string($chain) -> all the chain from begin to end
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1233 # example usage: down_chain2string($chain,6) -> from 6 to the end
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1234 # example usage: down_chain2string($chain,6,4) -> from 6, going on 4 elements
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1235 # example usage: down_chain2string($chain,6,"",10) -> from 6 to 10
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1236 # example usage: up_chain2string($chain,10,"",6) -> from 10 to 6 upstream
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1237 sub old_updown_chain2string {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1238 my ($direction,$chain,$first,$len,$last,$option)=@_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1239 unless($chain) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1240 warn ("Warning chain2string: no chain input"); return (-1); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1241 my $begin=$chain->{'begin'}; # the name of the BEGIN element
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1242 my $end=$chain->{'end'}; # the name of the END element
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1243 my $flow;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1244 if ($direction eq "up") {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1245 $flow=2; # used to determine the direction of chain navigation
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1246 unless ($first) { $first=$end; } # if undef or 0, use $end
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1247 } else { # defaults to "down"
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1248 $flow=1; # used to determine the direction of chain navigation
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1249 unless ($first) { $first=$begin; } # if undef or 0, use $begin
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1250 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1251
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1252 unless($chain->{$first}) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1253 warn ("Warning chain2string: first element not defined"); return (-1); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1254 if ($last) { # if last is defined, it gets priority and len is not used
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1255 unless($chain->{$last}) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1256 warn ("Warning chain2string: last element not defined"); return (-1); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1257 if ($len) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1258 warn ("Warning chain2string: argument LAST:$last overriding LEN:$len!");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1259 undef $len;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1260 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1261 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1262 if ($direction eq "up") {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1263 $last=$begin; # if last not defined, go 'till begin (or upto len elements)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1264 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1265 $last=$end; # if last not defined, go 'till end (or upto len elements)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1266 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1267 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1268 my (@array, $string, $count);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1269 # call for verbosity (by way of chain2string_verbose);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1270 my $verbose=0; my $elements=0; my @elements; my $counting=0;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1271 if ($option) { # keep strict happy
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1272 if ($option eq "verbose") { $verbose=1; }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1273 if ($option eq "elements") { $elements=1; }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1274 if ($option eq "counting") { $counting=1; }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1275 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1276
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1277 if ($verbose) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1278 print "BEGIN=$begin"; print " END=$end"; print " SIZE=$chain->{'size'}";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1279 print " FIRSTFREE=$chain->{'firstfree'} \n";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1280 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1281
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1282 my $i=1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1283 my $label=$first;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1284 my $afterlast=$chain->{$last}[$flow]; # if $last=$end $afterlast should be undef
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1285 unless (defined $afterlast) { $afterlast=0; } # keep strict happy
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1286
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1287 # proceed for len elements or until last, whichever comes first
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1288 # if $len undef goes till end
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1289 while (($label)&&($label != $afterlast) && ($i <= ($len || $i + 1))) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1290 @array=@{$chain->{$label}};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1291 if ($verbose) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1292 $string .= "$array[2]_${label}_$array[1]=$array[0] ";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1293 $count++;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1294 } elsif ($elements) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1295 push (@elements,$label); # returning element names/references/identifiers
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1296 } elsif ($counting) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1297 $count++;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1298 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1299 $string .= $array[0]; # returning element content
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1300 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1301 $label = $array[$flow]; # go to next||prev i.e. downstream||upstream
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1302 $i++;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1303 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1304 #DEBUG#print "len: $len, first: $first, last: $last, afterlast=$afterlast \n";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1305 if ($verbose) { print "TOTALprinted: $count\n"; }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1306 if ($counting) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1307 return $count;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1308 } elsif ($elements) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1309 return @elements;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1310 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1311 return $string;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1312 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1313 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1314
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1315 # sub string2schain
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1316 # --------> deleted, no more supported <--------
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1317 # creation of a single linked list/chain from a string
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1318 # basically could be recreated by taking the *2chain methods and
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1319 # omitting to set the 3rd field (label 2) containing the back links
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1320
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1321
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1322 # creation of a double linked list/chain from a string
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1323 # returns reference to a hash containing the chain
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1324 # arguments: STRING [OFFSET]
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1325 # defaults: OFFSET defaults to 1 if undef
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1326 # the chain will contain as elements the single characters in the string
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1327 sub string2chain {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1328 my @string=split(//,$_[0]);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1329 array2chain(\@string,$_[1]);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1330 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1331
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1332 =head2 array2chain
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1333
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1334 Title : array2chain
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1335 Usage : $chainref = Bio::LiveSeq::Chain::array2chain($arrayref,$offset)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1336 Function: creation of a double linked chain from an array
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1337 Returns : reference to a hash containing the chain
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1338 Defaults: OFFSET defaults to 1 if undef
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1339 Error code: 0
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1340 Args : a reference to an array containing the elements to be chainlinked
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1341 an optional integer > 0 (this will be the starting count for
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1342 the chain labels instead than having them begin from "1")
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1343
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1344 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1345
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1346 sub array2chain {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1347 my $arrayref=$_[0];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1348 my $array_count=scalar(@{$arrayref});
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1349 unless ($array_count) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1350 warn ("Warning array2chain: no elements input"); return (0); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1351 my $begin=$_[1];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1352 if (defined $begin) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1353 if ($begin < 1) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1354 warn "Warning array2chain: Zero or Negative offsets not allowed"; return (0); }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1355 } else {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1356 $begin=1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1357 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1358 my ($element,%hash);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1359 $hash{'begin'}=$begin;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1360 my $i=$begin-1;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1361 foreach $element (@{$arrayref}) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1362 $i++;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1363 # hash with keys begin..end pointing to the arrays
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1364 $hash{$i}=[$element,$i+1,$i-1];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1365 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1366 my $end=$i;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1367 $hash{'end'}=$end;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1368 $hash{firstfree}=$i+1; # what a new added element should be called
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1369 $hash{size}=$end-$begin+1; # how many elements in the chain
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1370
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1371 # eliminate pointers to unexisting elements
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1372 $hash{$begin}[2]=undef;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1373 $hash{$end}[1]=undef;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1374
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1375 return (\%hash);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1376 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1377
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1378 1; # returns 1