annotate variant_effect_predictor/Bio/Tools/SeqWords.pm @ 0:21066c0abaf5 draft

Uploaded
author willmclaren
date Fri, 03 Aug 2012 10:04:48 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1 # $Id: SeqWords.pm,v 1.7.2.1 2003/03/05 19:06:15 jason Exp $
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
3 #---------------------------------------------------------------------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
4 # PACKAGE : SeqWords.pm
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
5 # PURPOSE : To count n-mers in any sequence of characters
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
6 # AUTHOR : Derek Gatherer (D.Gatherer@organon.nhe.akzonobel.nl)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
7 # SOURCE :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
8 # CREATED : 21st March 2000
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
9 # MODIFIED :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
10 # DISCLAIMER : I am employed in the pharmaceutical industry but my
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
11 # : employers do not endorse or sponsor this module
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
12 # : in any way whatsoever. The above email address is
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
13 # : given purely for the purpose of easy communication
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
14 # : with the author, and does not imply any connection
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
15 # : between my employers and anything written below.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
16 # LICENCE : You may distribute this module under the same terms
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
17 # : as the rest of BioPerl.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
18 #---------------------------------------------------------------------------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
19
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
20 =head1 NAME
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
21
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
22 Bio::Tools::SeqWords - Object holding n-mer statistics for one sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
23
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
24 =head1 SYNOPSIS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
25
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
26 Take a sequence object from eg, an inputstream, and creates an object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
27 for the purposes of holding n-mer word statistics about that sequence.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
28 The sequence can be nucleic acid or protein, but the module is
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
29 probably most relevant for DNA. The words are counted in a
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
30 non-overlapping manner, ie. in the style of a codon table, but with
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
31 any word length. For overlapping word counts, a sequence can be
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
32 'shifted' to remove the first character and then the count repeated.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
33 For counts on opposite strand (DNA/RNA), a reverse complement method
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
34 should be performed, and then the count repeated.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
35
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
36 Creating the SeqWords object, eg:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
37
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
38 my $inputstream = Bio::SeqIO->new( -file => "seqfile",
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
39 -format => 'Fasta');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
40 my $seqobj = $inputstream->next_seq();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
41 my $seq_word = Bio::Tools::SeqWords->new(-seq => $seqobj);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
42
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
43 or:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
44
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
45 my $seqobj = Bio::PrimarySeq->new(-seq=>'[cut and paste a sequence here]',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
46 -alphabet => 'dna',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
47 -id => 'test');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
48 my $seq_word = Bio::Tools::SeqWords->new(-seq => $seqobj);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
49
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
50 obtain a hash of word counts, eg:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
51
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
52 my $hash_ref = $seq_stats->count_words($word_length);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
53
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
54 display hash table, eg:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
55
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
56 my %hash = %$hash_ref;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
57 foreach my $key(sort keys %hash)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
58 {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
59 print "\n$key\t$hash{$key}";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
60 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
61
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
62 or
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
63
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
64 my $hash_ref = Bio::SeqWords->count_words($seqobj,$word_length);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
65
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
66
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
67 =head1 DESCRIPTION
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
68
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
69 Bio:SeqWords is a featherweight object for the calculation of n-mer
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
70 word occurrences in a single sequence. It is envisaged that the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
71 object will be useful for construction of scripts which use n-mer word
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
72 tables as the raw material for statistical calculations; for instance,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
73 hexamer frequency for the calculation of coding protential, or the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
74 calculation of periodicity in repetitive DNA. Triplet frequency is
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
75 already handled by Bio::SeqStats.pm (author: Peter Schattner). There
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
76 are a few possible applications for protein, eg: hypothesised amino
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
77 acid 7-mers in heat shock proteins, or proteins with multiple simple
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
78 motifs. Sometimes these protein periodicities are best seen when the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
79 amino acid alphabet is truncated, eg Shulman alphabet. Since there
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
80 are quite a few of these shortened alphabets, this module does not
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
81 specify any particular alphabet.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
82
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
83 See Synopsis above for object creation code.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
84
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
85 =head1 FEEDBACK
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
86
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
87 =head2 Mailing Lists
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
88
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
89 User feedback is an integral part of the evolution of this
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
90 and other Bioperl modules. Send your comments and suggestions preferably
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
91 to one of the Bioperl mailing lists.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
92 Your participation is much appreciated.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
93
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
94 bioperl-l@bioperl.org - General discussion
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
95 http://bio.perl.org/MailList.html - About the mailing lists
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
96
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
97 =head2 Reporting Bugs
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
98
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
99 Report bugs to the Bioperl bug tracking system to help us keep track
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
100 the bugs and their resolution.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
101 Bug reports can be submitted via the web:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
102
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
103 http://bugzilla.bioperl.org/
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
104
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
105 =head1 AUTHOR
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
106
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
107 Derek Gatherer, in the loosest sense of the word 'author'. The
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
108 general shape of the module is lifted directly from Peter Schattner's
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
109 SeqStats.pm module. The central subroutine to count the words is
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
110 adapted from original code provided by Dave Shivak, in response to a
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
111 query on the bioperl mailing list. At least 2 other people provided
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
112 alternative means (equally good but not used in the end) of performing
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
113 the same calculation. Thanks to all for your assistance.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
114
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
115 =head1 CONTRUBITORS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
116
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
117 Jason Stajich, jason-at-bioperl.org
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
118
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
119 =head1 APPENDIX
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
120
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
121 The rest of the documentation details each of the object methods.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
122 Internal methods are usually preceded with a _
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
123
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
124 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
125
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
126 package Bio::Tools::SeqWords;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
127 use vars qw(@ISA);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
128 use strict;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
129
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
130 use Bio::Root::Root;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
131
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
132 @ISA = qw(Bio::Root::Root);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
133
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
134 sub new {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
135 my($class,@args) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
136 # our new standard way of instantiation
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
137 my $self = $class->SUPER::new(@args);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
138
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
139 my ($seqobj) = $self->_rearrange([qw(SEQ)],@args);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
140 if((! defined($seqobj)) && @args && ref($args[0])) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
141 # parameter not passed as named parameter?
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
142 $seqobj = $args[0];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
143 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
144
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
145 if(! $seqobj->isa("Bio::PrimarySeqI")) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
146 $self->throw(ref($self) . " works only on PrimarySeqI objects\n");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
147 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
148
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
149 $self->{'_seqref'} = $seqobj;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
150 return $self;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
151 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
152
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
153
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
154 =head2 count_words
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
155
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
156 Title : count_words
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
157 Usage : $word_count = $seq_stats->count_words($word_length);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
158 or : $word_count = $seq_stats->Bio::SeqWords->($seqobj,$word_length);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
159 Function: Counts non-overlapping words within a string
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
160 : any alphabet is used
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
161 Example : a sequence ACCGTCCGT, counted at word length 4,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
162 : will give the hash
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
163 : ACCG 1, TCCG 1
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
164 Returns : Reference to a hash in which keys are words (any length) of the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
165 : alphabet used and values are number of occurrences of the word
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
166 : in the sequence.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
167 Args : Word length as scalar and, reference to sequence object if
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
168 : required
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
169
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
170 Throws an exception word length is not a positive integer
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
171 or if word length is longer than the sequence.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
172
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
173 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
174
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
175 sub count_words
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
176 {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
177 my ($self,$seqobj,$word_length) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
178
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
179 # check how we were called, and if necessary rearrange arguments
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
180 if(ref($seqobj)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
181 # call as SeqWords->count_words($seq, $wordlen)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
182 if(! $seqobj->isa("Bio::PrimarySeqI")) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
183 $self->throw("SeqWords works only on PrimarySeqI objects\n");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
184 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
185 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
186 # call as $obj->count_words($wordlen)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
187 $word_length = $seqobj;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
188 $seqobj = undef;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
189 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
190
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
191 if($word_length eq "" || $word_length =~ /[a-z]/i)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
192 {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
193 $self->throw("SeqWords cannot accept non-numeric characters".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
194 " or a null value in the \$word_length variable\n");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
195 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
196 elsif ($word_length <1 || ($word_length - int($word_length)) >0)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
197 {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
198 $self->throw("SeqWords requires the word length to be a ".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
199 "positive integer\n");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
200 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
201
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
202 if(! defined($seqobj)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
203 $seqobj = $self->{'_seqref'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
204 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
205 my $seqstring = uc $seqobj->seq();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
206
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
207 if($word_length > length($seqstring))
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
208 {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
209 $self->throw("die in count words, \$word_length is bigger ".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
210 "than sequence length\n");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
211 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
212
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
213 my %codon = ();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
214
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
215 # now the real business
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
216 # JS - remove DNA assumption
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
217 while($seqstring =~ /((\w){$word_length})/gim) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
218 $codon{uc($1)}++;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
219 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
220 return \%codon;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
221
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
222 # and that's it
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
223 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
224
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
225 1;