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

Deleted selected files
author willmclaren
date Fri, 03 Aug 2012 10:05:43 -0400
parents 21066c0abaf5
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1 =head1 NAME
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
3 NCBITaxon - DESCRIPTION of Object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
4
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
5 =head1 DESCRIPTION
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
6
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
7 An object that hold a node within a taxonomic tree. Inherits from NestedSet.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
8
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
9 From Bio::Species
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
10 classification
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
11 common_name
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
12 binomial
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
13
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
14 Here are also the additional methods in Bio::Species that "might" be useful, but let us
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
15 forget about these for now.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
16 genus
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
17 species
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
18 sub_species
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
19 variant
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
20 organelle
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
21 division
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
22
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
23 =head1 CONTACT
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
24
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
25 Contact Jessica Severin on implemetation/design detail: jessica@ebi.ac.uk
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
26 Contact Ewan Birney on EnsEMBL in general: birney@sanger.ac.uk
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
27
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
28 =head1 APPENDIX
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
29
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
30 The rest of the documentation details each of the object methods. Internal methods are usually preceded with a _
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
31
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
32 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
33
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
34 package Bio::EnsEMBL::Compara::NCBITaxon;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
35
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
36 use strict;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
37 use Bio::Species;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
38 use Bio::EnsEMBL::Compara::NestedSet;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
39 use Bio::EnsEMBL::Utils::Exception;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
40 use Bio::EnsEMBL::Utils::Argument;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
41
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
42 our @ISA = qw(Bio::EnsEMBL::Compara::NestedSet);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
43
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
44 =head2 copy
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
45
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
46 Arg [1] : int $member_id (optional)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
47 Example :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
48 Description: returns copy of object, calling superclass copy method
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
49 Returntype :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
50 Exceptions :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
51 Caller :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
52
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
53 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
54
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
55 sub copy {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
56 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
57
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
58 my $mycopy = $self->SUPER::copy;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
59 bless $mycopy, "Bio::EnsEMBL::Compara::NCBITaxon";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
60
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
61 $mycopy->ncbi_taxid($self->ncbi_taxid);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
62 $mycopy->rank($self->rank);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
63 $mycopy->genbank_hidden_flag($self->genbank_hidden_flag);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
64
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
65 return $mycopy;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
66 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
67
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
68
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
69 sub ncbi_taxid {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
70 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
71 my $value = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
72 $self->node_id($value) if($value);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
73 return $self->node_id;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
74 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
75
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
76 sub taxon_id {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
77 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
78 my $value = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
79 $self->node_id($value) if($value);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
80 return $self->node_id;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
81 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
82
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
83 sub dbID {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
84 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
85 my $value = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
86 $self->node_id($value) if($value);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
87 return $self->node_id;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
88 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
89
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
90 sub rank {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
91 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
92 $self->{'_rank'} = shift if(@_);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
93 return $self->{'_rank'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
94 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
95
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
96 sub genbank_hidden_flag {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
97 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
98 $self->{'_genbank_hidden_flag'} = shift if(@_);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
99 return $self->{'_genbank_hidden_flag'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
100 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
101
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
102 =head2 classification
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
103
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
104 Arg[SEPARATOR] : String (optional); used to separate the classification by
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
105 when returning as a string. If not specified then a single
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
106 space will be used.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
107 Arg[FULL] : Boolean (optional); indicates we want all nodes including
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
108 those which Genbank sets as hidden
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
109 Arg[AS_ARRAY] : Boolean (optional); says the return type will be an
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
110 ArrayRef of all nodes in the classification as instances
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
111 of NCBITaxon.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
112 Example : my $classification_string = $node->classification();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
113 Description : Returns the String representation of a taxon node's
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
114 classification or the objects which constitute it (
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
115 including the current node). The String return when
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
116 split is compatible with BioPerl's Species classification
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
117 code and will return a data structure compatible with
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
118 that found in core species MetaContainers.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
119
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
120 This code is a redevelopment of existing code which
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
121 descended down the taxonomy which had disadvanatages
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
122 when a classification was requested on nodes causing
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
123 the taxonomy to bi/multi-furcate.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
124
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
125 Note the String representation does have some disadvantages
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
126 when working with the poorer end of the taxonomy where
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
127 species nodes are not well defined. For these situations
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
128 you are better using the array representation and
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
129 capturing the required information from the nodes.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
130
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
131 Also to maintain the original functionality of the method
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
132 we filter any species, subspecies or subgenus nodes above
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
133 the current node. For the true classification always
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
134 call using the array structure.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
135
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
136 Recalling this subroutine with the same parameters for
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
137 separators will return a cached representation. Calling
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
138 for AS_ARRAY will cause the classificaiton to be
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
139 recalculated each time.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
140 Returntype : String if not asking for an array otherwise the array
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
141 Exceptions : -
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
142 Caller : Public
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
143
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
144 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
145
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
146 sub classification {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
147 my ($self, @args) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
148 my ($separator, $full, $as_array) = rearrange([qw( SEPARATOR FULL AS_ARRAY )], @args);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
149
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
150 #setup defaults
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
151 $separator = ' ' unless(defined $separator);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
152 $full = 0 unless (defined $full);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
153
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
154 if(!$as_array) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
155 #Reset the separators & classifications if we already had one & it
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
156 #differed from the input
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
157 if(defined $self->{_separator} && $self->{_separator} ne $separator) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
158 $self->{_separator} = undef;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
159 $self->{_classification} = undef;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
160 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
161 if(defined $self->{_separator_full} && $self->{_separator_full} ne $separator) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
162 $self->{_separator_full} = undef;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
163 $self->{_classification_full} = undef;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
164 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
165
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
166 $self->{_separator} = $separator unless (defined $self->{_separator});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
167 $self->{_separator_full} = $separator unless (defined $self->{_separator_full});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
168
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
169 return $self->{_classification_full} if ($full && defined $self->{_classification_full});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
170 return $self->{_classification} if (!$full && defined $self->{_classification});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
171 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
172
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
173 my $node = $self;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
174 my @classification;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
175 while( $node->name() ne 'root' ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
176 my $subgenus = $node->rank() eq 'subgenus';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
177 if($full) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
178 push(@classification, $node);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
179 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
180 else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
181 unless($node->genbank_hidden_flag() || $subgenus) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
182 push(@classification, $node);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
183 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
184 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
185
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
186 $node = $node->parent();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
187 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
188
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
189 if($as_array) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
190 return \@classification;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
191 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
192
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
193 #Once we have a normal array we can do top-down as before to replicate
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
194 #the original functionality
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
195 my $text_classification = $self->_to_text_classification(\@classification);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
196
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
197 if ($full) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
198 $self->{_classification_full} = join($separator, @{$text_classification});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
199 $self->{_separator_full} = $separator;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
200 return $self->{_classification_full};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
201 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
202 $self->{_classification} = join($separator, @{$text_classification});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
203 $self->{_separator} = $separator;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
204 return $self->{_classification};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
205 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
206 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
207
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
208 =head2 _to_text_classification
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
209
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
210 Arg[1] : ArrayRef of the classification array to be converted to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
211 the text classification
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
212 Example : my $array = $node->_to_text_classification(\@classification);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
213 Description : Returns the Array representation of a taxon node's
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
214 classification or the objects which constitute it (
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
215 including the current node) as the species names or split
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
216 according to the rules for working with BioPerl.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
217 Returntype : ArrayRef of Strings
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
218 Exceptions : -
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
219 Caller : Private
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
220
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
221 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
222
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
223 sub _to_text_classification {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
224 my ($self, $classification) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
225 my @text_classification;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
226 my $first = 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
227 for my $node ( @{$classification}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
228 my $subgenus = $node->rank() eq 'subgenus';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
229 my $species = $node->rank() eq 'species';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
230 my $subspecies = $node->rank() eq 'subspecies';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
231
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
232 if($first) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
233 if($species || $subspecies) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
234 my ($genus, $species, $subspecies) = split(q{ }, $node->binomial());
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
235 unshift @text_classification, $species;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
236 unshift @text_classification, $subspecies if (defined $subspecies);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
237 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
238 $first = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
239 next;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
240 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
241
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
242 next if $subgenus || $species || $subspecies;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
243 push(@text_classification, $node->name());
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
244 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
245 return \@text_classification;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
246 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
247
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
248 =head2 subspecies
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
249
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
250 Example : $ncbi->subspecies;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
251 Description: Returns the subspeceis name for this species
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
252 Example : "verus" for Pan troglodytes verus
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
253 Returntype : string
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
254 Exceptions :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
255 Caller : general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
256
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
257 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
258
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
259 sub subspecies {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
260 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
261
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
262 unless (defined $self->{'_species'}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
263 my ($genus, $species, $subspecies) = split(" ", $self->binomial);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
264 $self->{'_species'} = $species;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
265 $self->{'_genus'} = $genus;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
266 $self->{'_subspecies'} = $subspecies;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
267 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
268
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
269 return $self->{'_species'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
270 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
271
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
272
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
273 =head2 species
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
274
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
275 Example : $ncbi->species;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
276 Description: Returns the speceis name for this species
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
277 Example : "sapiens" for Homo sapiens
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
278 Returntype : string
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
279 Exceptions :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
280 Caller : general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
281
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
282 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
283
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
284 sub species {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
285 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
286
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
287 unless (defined $self->{'_species'}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
288 my ($genus, $species, $subspecies) = split(" ", $self->binomial);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
289 $self->{'_species'} = $species;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
290 $self->{'_genus'} = $genus;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
291 $self->{'_subspecies'} = $subspecies;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
292 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
293
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
294 return $self->{'_species'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
295 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
296
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
297
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
298 =head2 genus
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
299
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
300 Example : $ncbi->genus;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
301 Description: Returns the genus name for this species
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
302 Returntype : string
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
303 Example : "Homo" for Homo sapiens
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
304 Exceptions :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
305 Caller : general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
306
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
307 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
308
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
309 sub genus {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
310 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
311
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
312 unless (defined $self->{'_genus'}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
313 my ($genus, $species, $subspecies) = split(" ", $self->binomial);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
314 $self->{'_species'} = $species;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
315 $self->{'_genus'} = $genus;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
316 $self->{'_subspecies'} = $subspecies;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
317 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
318
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
319 return $self->{'_genus'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
320 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
321
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
322 =head2 common_name
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
323
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
324 Example : $ncbi->common_name;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
325 Description: The comon name as defined by Genbank
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
326 Returntype : string
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
327 Exceptions : returns undef if no genbank common name exists.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
328 Caller : general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
329
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
330 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
331
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
332 sub common_name {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
333 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
334 if ($self->has_tag('genbank common name') && $self->rank eq 'species') {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
335 return $self->get_tagvalue('genbank common name');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
336 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
337 return undef;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
338 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
339 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
340
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
341 =head2 ensembl_alias_name
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
342
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
343 Example : $ncbi->ensembl_alias_name;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
344 Description: The comon name as defined by ensembl alias
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
345 Returntype : string
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
346 Exceptions : returns undef if no ensembl alias name exists.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
347 Caller : general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
348
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
349 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
350
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
351 sub ensembl_alias_name {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
352 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
353
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
354 #Not checking for rank as we do above, because we do not get dog since the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
355 #rank for dog is subspecies (ensembl-51).
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
356 if ($self->has_tag('ensembl alias name')) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
357 return $self->get_tagvalue('ensembl alias name');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
358 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
359 return undef;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
360 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
361 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
362
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
363
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
364 =head scientific_name
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
365
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
366 Example : $ncbi->scientific_name;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
367 Description: The scientific name of this taxon
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
368 Returntype : string
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
369 Exceptions :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
370 Caller : general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
371
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
372 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
373
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
374 sub scientific_name {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
375 my ($self) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
376 return $self->get_tagvalue('scientific name');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
377 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
378
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
379 =head2 binomial
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
380
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
381 Example : $ncbi->binomial;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
382 Description: The binomial name (AKA the scientific name) of this genome
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
383 Returntype : string
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
384 Exceptions : warns when node is not a species or has no scientific name
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
385 Caller : general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
386
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
387 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
388
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
389 sub binomial {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
390 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
391 if ($self->has_tag('scientific name') && ($self->rank eq 'species' || $self->rank eq 'subspecies')) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
392 return $self->scientific_name;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
393 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
394 warning("taxon_id=",$self->node_id," is not a species or subspecies. So binomial is undef (try the scientific_name method)\n");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
395 return undef;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
396 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
397 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
398
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
399 =head2 ensembl_alias
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
400
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
401 Example : $ncbi->ensembl_alias;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
402 Description: The ensembl_alias name (AKA the name in the ensembl website) of this genome
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
403 Returntype : string
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
404 Exceptions : warns when node is not a species or has no ensembl_alias
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
405 Caller : general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
406
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
407 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
408
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
409 sub ensembl_alias {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
410 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
411 if ($self->has_tag('ensembl alias name')) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
412 return $self->get_tagvalue('ensembl alias name');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
413 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
414 warning("taxon_id=",$self->node_id," is not a species or subspecies. So ensembl_alias is undef\n");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
415 return undef;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
416 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
417 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
418
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
419
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
420 =head2 short_name
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
421
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
422 Example : $ncbi->short_name;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
423 Description: The name of this genome in the Gspe ('G'enera
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
424 'spe'cies) format.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
425 Returntype : string
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
426 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
427 Caller : general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
428
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
429 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
430
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
431 sub short_name {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
432 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
433 my $name = $self->name;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
434 $name =~ s/(\S)\S+\s(\S{3})\S+/$1$2/;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
435 $name =~ s/\ //g;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
436 return $name;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
437 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
438
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
439 sub get_short_name {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
440 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
441 return $self->short_name;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
442 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
443
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
444
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
445 sub RAP_species_format {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
446 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
447 my $newick = "";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
448
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
449 if($self->get_child_count() > 0) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
450 $newick .= "(";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
451 my $first_child=1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
452 foreach my $child (@{$self->sorted_children}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
453 $newick .= "," unless($first_child);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
454 $newick .= $child->newick_format;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
455 $first_child = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
456 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
457 $newick .= ")";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
458 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
459
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
460 $newick .= sprintf("\"%s\"", $self->name,);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
461 $newick .= sprintf(":%1.4f", $self->distance_to_parent) if($self->distance_to_parent > 0);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
462
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
463 if(!($self->has_parent)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
464 $newick .= ";";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
465 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
466 return $newick;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
467 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
468
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
469
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
470 sub print_node {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
471 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
472 printf("(%s", $self->node_id);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
473 printf(" %s", $self->rank) if($self->rank);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
474 print(")");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
475 printf("%s", $self->name) if($self->name);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
476 print("\n");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
477 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
478
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
479 1;