line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Bio::GMOD::GenericGenePage; |
2
|
1
|
|
|
1
|
|
27874
|
use strict; |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
44
|
|
3
|
1
|
|
|
1
|
|
5
|
use warnings; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
32
|
|
4
|
1
|
|
|
1
|
|
1273
|
use English; |
|
1
|
|
|
|
|
4526
|
|
|
1
|
|
|
|
|
5
|
|
5
|
1
|
|
|
1
|
|
553
|
use Carp; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
1282
|
|
6
|
|
|
|
|
|
|
|
7
|
|
|
|
|
|
|
our $VERSION = 0.12; |
8
|
|
|
|
|
|
|
|
9
|
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
=head1 NAME |
11
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
Bio::GMOD::GenericGenePage - Generic GMOD gene page base class |
13
|
|
|
|
|
|
|
|
14
|
|
|
|
|
|
|
=head1 SYNOPSIS |
15
|
|
|
|
|
|
|
|
16
|
|
|
|
|
|
|
my $page = Bio::GMOD::GenericGenePage->new( $gene_identifier ); |
17
|
|
|
|
|
|
|
my $xml = $page->render_xml(); |
18
|
|
|
|
|
|
|
|
19
|
|
|
|
|
|
|
=head1 DESCRIPTION |
20
|
|
|
|
|
|
|
|
21
|
|
|
|
|
|
|
Bio::GMOD::GenericGenePage is an abstract class to make it easier for |
22
|
|
|
|
|
|
|
Model Organism Databases (MODs) to serve up a simple XML that describes |
23
|
|
|
|
|
|
|
attributes of their gene models. In order to implement this, the user |
24
|
|
|
|
|
|
|
needs to subclass Bio::GMOD::GenericGenePage and provide the methods |
25
|
|
|
|
|
|
|
listed below as abstract classes. These methods are then used by |
26
|
|
|
|
|
|
|
the render_xml method to create XML for a given gene. |
27
|
|
|
|
|
|
|
|
28
|
|
|
|
|
|
|
There is one example implementation included with this distribution, |
29
|
|
|
|
|
|
|
Bio::GMOD::GenericGenePage::Chado, which is a Chado adapter for a |
30
|
|
|
|
|
|
|
yeast database derived from SGD's GFF3. In order to implement this for |
31
|
|
|
|
|
|
|
another Chado database it should be fairly easy to modify the provided |
32
|
|
|
|
|
|
|
methods to create your own adaptor. For example, ParameciumDB could |
33
|
|
|
|
|
|
|
subclass Bio::GMOD::GenericGenePage::Chado and create |
34
|
|
|
|
|
|
|
Bio::GMOD::GenericGenePage::Chado::ParameciumDB and only override |
35
|
|
|
|
|
|
|
the data_provider and organism methods to have a working adaptor. |
36
|
|
|
|
|
|
|
Databases not based on Chado will only have slightly more work, in order |
37
|
|
|
|
|
|
|
to implement all of the abstract classes in Bio::GMOD::GenericGenePage. |
38
|
|
|
|
|
|
|
|
39
|
|
|
|
|
|
|
Another example implementation is included, CXGN::Phenome::GenericGenePage, |
40
|
|
|
|
|
|
|
however this is only a partial implementation and will not work with |
41
|
|
|
|
|
|
|
the current release of Bio::GMOD::GenericGenePage. |
42
|
|
|
|
|
|
|
|
43
|
|
|
|
|
|
|
=head1 BASE CLASS(ES) |
44
|
|
|
|
|
|
|
|
45
|
|
|
|
|
|
|
none |
46
|
|
|
|
|
|
|
|
47
|
|
|
|
|
|
|
=head1 SUBCLASSES |
48
|
|
|
|
|
|
|
|
49
|
|
|
|
|
|
|
Bio::GMOD::GenericGenePage::Chado |
50
|
|
|
|
|
|
|
CXGN::Phenome::GenericGenePage |
51
|
|
|
|
|
|
|
|
52
|
|
|
|
|
|
|
=head1 BUGS AND SUPPORT |
53
|
|
|
|
|
|
|
|
54
|
|
|
|
|
|
|
Please report bugs and make support requests on the GMOD developers list, |
55
|
|
|
|
|
|
|
gmod-devel@lists.sourceforge.net. |
56
|
|
|
|
|
|
|
|
57
|
|
|
|
|
|
|
=head1 AUTHOR |
58
|
|
|
|
|
|
|
|
59
|
|
|
|
|
|
|
Scott Cain |
60
|
|
|
|
|
|
|
CPAN ID: SCAIN |
61
|
|
|
|
|
|
|
Cold Spring Harbor Laboratory |
62
|
|
|
|
|
|
|
scain@cpan.org |
63
|
|
|
|
|
|
|
http://www.gmod.org/ |
64
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
and Robert Buels. |
66
|
|
|
|
|
|
|
|
67
|
|
|
|
|
|
|
=head1 COPYRIGHT |
68
|
|
|
|
|
|
|
|
69
|
|
|
|
|
|
|
Copyright (c) 2008 Scott Cain and Robert Buels. All rights reserved. |
70
|
|
|
|
|
|
|
This program is free software; you can redistribute |
71
|
|
|
|
|
|
|
it and/or modify it under the same terms as Perl itself. |
72
|
|
|
|
|
|
|
|
73
|
|
|
|
|
|
|
The full text of the license can be found in the |
74
|
|
|
|
|
|
|
LICENSE file included with this module. |
75
|
|
|
|
|
|
|
|
76
|
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
=head1 SEE ALSO |
78
|
|
|
|
|
|
|
|
79
|
|
|
|
|
|
|
perl(1). |
80
|
|
|
|
|
|
|
|
81
|
|
|
|
|
|
|
=head1 PROVIDED METHODS |
82
|
|
|
|
|
|
|
|
83
|
|
|
|
|
|
|
=cut |
84
|
|
|
|
|
|
|
|
85
|
|
|
|
|
|
|
=head2 new |
86
|
|
|
|
|
|
|
|
87
|
|
|
|
|
|
|
Usage: my $genepage = MyGenePage->new( -id => $gene_identifier ); |
88
|
|
|
|
|
|
|
Desc : create a new gene page object. should be overridden |
89
|
|
|
|
|
|
|
Args : not specified |
90
|
|
|
|
|
|
|
Ret : a new gene page object |
91
|
|
|
|
|
|
|
Side Effects: none as implemented here, but subclass |
92
|
|
|
|
|
|
|
implementations may have side effects |
93
|
|
|
|
|
|
|
Example: |
94
|
|
|
|
|
|
|
|
95
|
|
|
|
|
|
|
=cut |
96
|
|
|
|
|
|
|
|
97
|
|
|
|
|
|
|
sub new { |
98
|
1
|
|
|
1
|
1
|
13
|
my ($class,%args) = @_; |
99
|
1
|
|
|
|
|
4
|
return bless {}, $class; |
100
|
|
|
|
|
|
|
} |
101
|
|
|
|
|
|
|
|
102
|
|
|
|
|
|
|
sub _counter { |
103
|
0
|
|
|
0
|
|
|
my $self = shift; |
104
|
0
|
|
|
|
|
|
$self->{'counter'}++; |
105
|
0
|
|
|
|
|
|
return $self->{'counter'}; |
106
|
|
|
|
|
|
|
} |
107
|
|
|
|
|
|
|
|
108
|
|
|
|
|
|
|
=head2 render_xml |
109
|
|
|
|
|
|
|
|
110
|
|
|
|
|
|
|
Usage: my $xml = $page->render_xml(); |
111
|
|
|
|
|
|
|
Desc : render the XML for this generic gene page |
112
|
|
|
|
|
|
|
Args : none |
113
|
|
|
|
|
|
|
Ret : string of xml |
114
|
|
|
|
|
|
|
Side Effects: none |
115
|
|
|
|
|
|
|
|
116
|
|
|
|
|
|
|
=cut |
117
|
|
|
|
|
|
|
|
118
|
|
|
|
|
|
|
sub render_xml { |
119
|
0
|
|
|
0
|
1
|
|
my ($self) = @_; |
120
|
|
|
|
|
|
|
|
121
|
0
|
|
|
|
|
|
my $data_provider = " ".$self->data_provider."\n"; |
122
|
|
|
|
|
|
|
|
123
|
0
|
|
|
|
|
|
my @accs = $self->accessions; |
124
|
0
|
|
|
|
|
|
my $accession = join "\n", map { |
125
|
0
|
|
|
|
|
|
qq| $_| |
126
|
|
|
|
|
|
|
} @accs; |
127
|
|
|
|
|
|
|
|
128
|
|
|
|
|
|
|
|
129
|
0
|
|
|
|
|
|
my $name = $self->name; |
130
|
|
|
|
|
|
|
|
131
|
0
|
|
|
|
|
|
my @syn = $self->synonyms; |
132
|
|
|
|
|
|
|
#shift @syn; #should the real name be in there too? |
133
|
|
|
|
|
|
|
#I don't think so--querying the synonym table is easy, why bother with |
134
|
|
|
|
|
|
|
#a join when we don't need it |
135
|
|
|
|
|
|
|
|
136
|
|
|
|
|
|
|
#also, synonym should probably be a hash to optionally allow for a |
137
|
|
|
|
|
|
|
#synonym type |
138
|
|
|
|
|
|
|
|
139
|
0
|
|
|
|
|
|
my $synonyms = join "\n", map { |
140
|
0
|
|
|
|
|
|
qq| $_| |
141
|
|
|
|
|
|
|
} @syn; |
142
|
|
|
|
|
|
|
|
143
|
0
|
|
|
|
|
|
my $dbreferences = $self->_xml_render_colon_separated_dbrefs( 2, $self->dbxrefs); |
144
|
0
|
|
|
|
|
|
my $organism = $self->_xml_render_organism(); |
145
|
0
|
|
|
|
|
|
my $ontology_terms = $self->_xml_render_ontology_terms( 4, $self->ontology_terms); |
146
|
0
|
|
|
|
|
|
my $literature = $self->_xml_render_colon_separated_dbrefs( 4, $self->literature_references); |
147
|
|
|
|
|
|
|
|
148
|
0
|
|
|
|
|
|
my $maplocations = join "\n", map { |
149
|
0
|
|
|
|
|
|
qq| | |
150
|
|
|
|
|
|
|
} $self->map_locations; |
151
|
|
|
|
|
|
|
|
152
|
0
|
|
|
|
|
|
my $comments = $self->_xml_render_comments($self->comments); |
153
|
|
|
|
|
|
|
|
154
|
0
|
|
|
|
|
|
return <
|
155
|
|
|
|
|
|
|
|
156
|
|
|
|
|
|
|
$data_provider |
157
|
|
|
|
|
|
|
$accession |
158
|
|
|
|
|
|
|
|
159
|
|
|
|
|
|
|
$name |
160
|
|
|
|
|
|
|
|
161
|
|
|
|
|
|
|
$synonyms |
162
|
|
|
|
|
|
|
|
163
|
|
|
|
|
|
|
$dbreferences |
164
|
|
|
|
|
|
|
|
165
|
|
|
|
|
|
|
$organism |
166
|
|
|
|
|
|
|
|
167
|
|
|
|
|
|
|
|
168
|
|
|
|
|
|
|
$maplocations |
169
|
|
|
|
|
|
|
|
170
|
|
|
|
|
|
|
|
171
|
|
|
|
|
|
|
|
172
|
|
|
|
|
|
|
$ontology_terms |
173
|
|
|
|
|
|
|
|
174
|
|
|
|
|
|
|
|
175
|
|
|
|
|
|
|
|
176
|
|
|
|
|
|
|
$literature |
177
|
|
|
|
|
|
|
|
178
|
|
|
|
|
|
|
|
179
|
|
|
|
|
|
|
$comments |
180
|
|
|
|
|
|
|
|
181
|
|
|
|
|
|
|
|
182
|
|
|
|
|
|
|
EOXML |
183
|
|
|
|
|
|
|
} |
184
|
|
|
|
|
|
|
|
185
|
|
|
|
|
|
|
sub _xml_render_organism { |
186
|
0
|
|
|
0
|
|
|
my $self = shift; |
187
|
0
|
|
|
|
|
|
my $counter = $self->_counter; |
188
|
0
|
|
|
|
|
|
my $org = $self->organism; |
189
|
0
|
|
|
|
|
|
my $organism = <
|
190
|
|
|
|
|
|
|
|
191
|
|
|
|
|
|
|
$org->{common} |
192
|
|
|
|
|
|
|
$org->{binomial} |
193
|
|
|
|
|
|
|
|
194
|
|
|
|
|
|
|
|
195
|
|
|
|
|
|
|
END |
196
|
0
|
|
|
|
|
|
return $organism; |
197
|
|
|
|
|
|
|
} |
198
|
|
|
|
|
|
|
|
199
|
|
|
|
|
|
|
sub _xml_render_colon_separated_dbrefs { |
200
|
0
|
|
|
0
|
|
|
my ($self,$spaces,@refs) = @_; |
201
|
0
|
|
|
|
|
|
my $refstring = ''; |
202
|
0
|
|
|
|
|
|
for my $ref (@refs) { |
203
|
0
|
|
|
|
|
|
my $counter = $self->_counter; |
204
|
0
|
|
|
|
|
|
my ($type,$id) = split /:/,$ref,2; |
205
|
0
|
|
|
|
|
|
$refstring .= (' 'x$spaces).qq|\n| |
206
|
|
|
|
|
|
|
} |
207
|
0
|
|
|
|
|
|
return $refstring; |
208
|
|
|
|
|
|
|
} |
209
|
|
|
|
|
|
|
|
210
|
|
|
|
|
|
|
sub _xml_render_ontology_terms { |
211
|
0
|
|
|
0
|
|
|
my ($self,$spaces,%term) = @_; |
212
|
|
|
|
|
|
|
|
213
|
0
|
|
|
|
|
|
my $xml_string = ''; |
214
|
0
|
|
|
|
|
|
for my $key (keys %term) { |
215
|
0
|
|
|
|
|
|
my ($type,$id) = split /:/,$key; |
216
|
0
|
|
|
|
|
|
my $value = $term{$key}; |
217
|
0
|
|
|
|
|
|
my $counter = $self->_counter; |
218
|
|
|
|
|
|
|
|
219
|
|
|
|
|
|
|
# the low casing of the 'o' seems inconsistent, so go with the upper |
220
|
|
|
|
|
|
|
#$type = "Go" if ($type eq "GO"); |
221
|
0
|
|
|
|
|
|
$xml_string .= (' 'x$spaces).qq|\n|; |
222
|
0
|
|
|
|
|
|
$xml_string .= (' 'x($spaces+2)).qq|\n|; |
223
|
0
|
|
|
|
|
|
$xml_string .= (' 'x$spaces).qq|\n|; |
224
|
|
|
|
|
|
|
} |
225
|
0
|
|
|
|
|
|
return $xml_string; |
226
|
|
|
|
|
|
|
} |
227
|
|
|
|
|
|
|
|
228
|
|
|
|
|
|
|
sub _xml_render_comments { |
229
|
0
|
|
|
0
|
|
|
my ($self, %comments) = @_; |
230
|
|
|
|
|
|
|
|
231
|
0
|
|
|
|
|
|
my $xml_string = ''; |
232
|
|
|
|
|
|
|
|
233
|
0
|
|
|
|
|
|
for my $key (keys %comments) { |
234
|
0
|
|
0
|
|
|
|
my $value = $comments{$key} || "miscellaneous"; |
235
|
0
|
|
|
|
|
|
$xml_string .= " \n"; |
236
|
0
|
|
|
|
|
|
$xml_string .= " $key\n"; |
237
|
0
|
|
|
|
|
|
$xml_string .= " \n\n"; |
238
|
|
|
|
|
|
|
} |
239
|
|
|
|
|
|
|
|
240
|
0
|
|
|
|
|
|
return $xml_string; |
241
|
|
|
|
|
|
|
} |
242
|
|
|
|
|
|
|
|
243
|
|
|
|
|
|
|
=head2 render_html NOT IMPLEMENTED! |
244
|
|
|
|
|
|
|
|
245
|
|
|
|
|
|
|
Usage: my $html = $page->render_html(); |
246
|
|
|
|
|
|
|
Desc : render HTML for this generic gene page. you may want to |
247
|
|
|
|
|
|
|
override this method for your implementation |
248
|
|
|
|
|
|
|
Args : none |
249
|
|
|
|
|
|
|
Ret : string of html |
250
|
|
|
|
|
|
|
Side Effects: none |
251
|
|
|
|
|
|
|
|
252
|
|
|
|
|
|
|
=cut |
253
|
|
|
|
|
|
|
|
254
|
|
|
|
|
|
|
sub render_html { |
255
|
0
|
|
|
0
|
1
|
|
my ($self) = @_; |
256
|
|
|
|
|
|
|
|
257
|
0
|
|
|
|
|
|
return <
|
258
|
|
|
|
|
|
|
|
259
|
|
|
|
|
|
|
EOHTML |
260
|
|
|
|
|
|
|
} |
261
|
|
|
|
|
|
|
|
262
|
|
|
|
|
|
|
#helper method that calls all those functions |
263
|
|
|
|
|
|
|
sub _info { |
264
|
0
|
|
|
0
|
|
|
my ($self) = @_; |
265
|
|
|
|
|
|
|
|
266
|
|
|
|
|
|
|
return |
267
|
0
|
|
|
|
|
|
{ name => $self->name, |
268
|
|
|
|
|
|
|
syn => [$self->synonyms], |
269
|
|
|
|
|
|
|
loc => [$self->map_locations], |
270
|
|
|
|
|
|
|
ont => [$self->ontology_terms], |
271
|
|
|
|
|
|
|
dbx => [$self->dbxrefs], |
272
|
|
|
|
|
|
|
lit => [$self->lit_refs], |
273
|
|
|
|
|
|
|
comments => [$self->comment_text], |
274
|
|
|
|
|
|
|
species => $self->species, |
275
|
|
|
|
|
|
|
}; |
276
|
|
|
|
|
|
|
} |
277
|
|
|
|
|
|
|
|
278
|
|
|
|
|
|
|
|
279
|
|
|
|
|
|
|
=head1 ABSTRACT METHODS |
280
|
|
|
|
|
|
|
|
281
|
|
|
|
|
|
|
Methods below should be overridden by each GenericGenePage implementation. |
282
|
|
|
|
|
|
|
|
283
|
|
|
|
|
|
|
=head2 name |
284
|
|
|
|
|
|
|
|
285
|
|
|
|
|
|
|
Usage: my $name = $genepage->name(); |
286
|
|
|
|
|
|
|
Desc : get the string name of this gene |
287
|
|
|
|
|
|
|
Args : none |
288
|
|
|
|
|
|
|
Ret : string gene name, e.g. 'Pax6' |
289
|
|
|
|
|
|
|
Side Effects: none |
290
|
|
|
|
|
|
|
|
291
|
|
|
|
|
|
|
=cut |
292
|
|
|
|
|
|
|
|
293
|
|
|
|
|
|
|
sub name { |
294
|
0
|
|
|
0
|
1
|
|
my ($self) = @_; |
295
|
0
|
|
|
|
|
|
die 'name() method is abstract, must be implemented in a subclass;' |
296
|
|
|
|
|
|
|
} |
297
|
|
|
|
|
|
|
|
298
|
|
|
|
|
|
|
=head2 accessions |
299
|
|
|
|
|
|
|
|
300
|
|
|
|
|
|
|
Usage: my @accessions = $genepage->accessions(); |
301
|
|
|
|
|
|
|
Desc : get a list of local accession values |
302
|
|
|
|
|
|
|
Args : none |
303
|
|
|
|
|
|
|
Ret : a list of local accessions |
304
|
|
|
|
|
|
|
Side Effects: none |
305
|
|
|
|
|
|
|
|
306
|
|
|
|
|
|
|
Note that these are the accessions that are used by the MOD providing the |
307
|
|
|
|
|
|
|
information, not accessions in external databases like GenBank. |
308
|
|
|
|
|
|
|
|
309
|
|
|
|
|
|
|
=cut |
310
|
|
|
|
|
|
|
|
311
|
|
|
|
|
|
|
sub accessions { |
312
|
0
|
|
|
0
|
1
|
|
my ($self) = @_; |
313
|
0
|
|
|
|
|
|
die 'accession() method is abstract, must be implemented in a subclass;' |
314
|
|
|
|
|
|
|
} |
315
|
|
|
|
|
|
|
|
316
|
|
|
|
|
|
|
=head2 data_provider |
317
|
|
|
|
|
|
|
|
318
|
|
|
|
|
|
|
Usage: my $data_provider = $genepage->data_provider(); |
319
|
|
|
|
|
|
|
Desc : The name of the data providing authority (ie, WormBase, SGD, etc) |
320
|
|
|
|
|
|
|
Args : none |
321
|
|
|
|
|
|
|
Ret : string, name of the data provider |
322
|
|
|
|
|
|
|
Side Effects: none |
323
|
|
|
|
|
|
|
|
324
|
|
|
|
|
|
|
=cut |
325
|
|
|
|
|
|
|
|
326
|
|
|
|
|
|
|
sub data_provider { |
327
|
0
|
|
|
0
|
1
|
|
my ($self) = @_; |
328
|
0
|
|
|
|
|
|
die 'data_provider() method is abstract, must be implemented in a subclass;' |
329
|
|
|
|
|
|
|
} |
330
|
|
|
|
|
|
|
|
331
|
|
|
|
|
|
|
|
332
|
|
|
|
|
|
|
=head2 synonyms |
333
|
|
|
|
|
|
|
|
334
|
|
|
|
|
|
|
Usage: my @syn = $genepage->synonyms(); |
335
|
|
|
|
|
|
|
Desc : get a list of synonyms for this gene |
336
|
|
|
|
|
|
|
Args : none |
337
|
|
|
|
|
|
|
|
338
|
|
|
|
|
|
|
Ret : list of strings, |
339
|
|
|
|
|
|
|
e.g. ( '1500038E17Rik', |
340
|
|
|
|
|
|
|
'AEY11', |
341
|
|
|
|
|
|
|
'Dey', |
342
|
|
|
|
|
|
|
"Dickie's small eye", |
343
|
|
|
|
|
|
|
'Gsfaey11', |
344
|
|
|
|
|
|
|
'Pax-6', |
345
|
|
|
|
|
|
|
) |
346
|
|
|
|
|
|
|
Side Effects: none |
347
|
|
|
|
|
|
|
|
348
|
|
|
|
|
|
|
=cut |
349
|
|
|
|
|
|
|
|
350
|
|
|
|
|
|
|
sub synonyms { |
351
|
0
|
|
|
0
|
1
|
|
my ($self) = @_; |
352
|
0
|
|
|
|
|
|
die 'synonyms() method is abstract, must be implemented in a subclass;' |
353
|
|
|
|
|
|
|
} |
354
|
|
|
|
|
|
|
|
355
|
|
|
|
|
|
|
=head2 map_locations |
356
|
|
|
|
|
|
|
|
357
|
|
|
|
|
|
|
Usage: my @locs = $genepage->map_locations() |
358
|
|
|
|
|
|
|
Desc : get a list of known map locations for this gene |
359
|
|
|
|
|
|
|
Args : none |
360
|
|
|
|
|
|
|
Ret : list of map locations, each a hashref as: |
361
|
|
|
|
|
|
|
{ map_name => string map name, |
362
|
|
|
|
|
|
|
chromosome => string chromosome name, |
363
|
|
|
|
|
|
|
marker => (optional) associated marker name, |
364
|
|
|
|
|
|
|
position => numerical position on the map, |
365
|
|
|
|
|
|
|
units => map units, either 'cm', for centimorgans, |
366
|
|
|
|
|
|
|
or 'b', for bases |
367
|
|
|
|
|
|
|
} |
368
|
|
|
|
|
|
|
Side Effects: none |
369
|
|
|
|
|
|
|
|
370
|
|
|
|
|
|
|
=cut |
371
|
|
|
|
|
|
|
|
372
|
|
|
|
|
|
|
sub map_locations { |
373
|
0
|
|
|
0
|
1
|
|
my ($self) = @_; |
374
|
0
|
|
|
|
|
|
die 'map_locations() method is abstract, must be implemented in a subclass;' |
375
|
|
|
|
|
|
|
} |
376
|
|
|
|
|
|
|
|
377
|
|
|
|
|
|
|
|
378
|
|
|
|
|
|
|
=head2 ontology_terms |
379
|
|
|
|
|
|
|
|
380
|
|
|
|
|
|
|
Usage: my @terms = $genepage->ontology_terms(); |
381
|
|
|
|
|
|
|
Desc : get a list of ontology terms |
382
|
|
|
|
|
|
|
Args : none |
383
|
|
|
|
|
|
|
Ret : hash-style list as: |
384
|
|
|
|
|
|
|
termname => human-readable description, |
385
|
|
|
|
|
|
|
Side Effects: none |
386
|
|
|
|
|
|
|
Example: |
387
|
|
|
|
|
|
|
|
388
|
|
|
|
|
|
|
my %terms = $genepage->ontology_terms() |
389
|
|
|
|
|
|
|
|
390
|
|
|
|
|
|
|
# and %terms is now |
391
|
|
|
|
|
|
|
( GO:0016711 => 'F:flavonoid 3'-monooxygenase activity', |
392
|
|
|
|
|
|
|
... |
393
|
|
|
|
|
|
|
) |
394
|
|
|
|
|
|
|
|
395
|
|
|
|
|
|
|
Note that the value in that has is the the concatenation of F:, B: or C: |
396
|
|
|
|
|
|
|
for molecular_function, biological_process, or cellular_component GO terms |
397
|
|
|
|
|
|
|
respectively. If the term does not belong to GO, there is no prepended |
398
|
|
|
|
|
|
|
identifier. |
399
|
|
|
|
|
|
|
|
400
|
|
|
|
|
|
|
=cut |
401
|
|
|
|
|
|
|
|
402
|
|
|
|
|
|
|
sub ontology_terms { |
403
|
0
|
|
|
0
|
1
|
|
my ($self) = @_; |
404
|
0
|
|
|
|
|
|
die 'go_terms() method is abstract, must be implemented in a subclass' |
405
|
|
|
|
|
|
|
} |
406
|
|
|
|
|
|
|
|
407
|
|
|
|
|
|
|
=head2 dbxrefs |
408
|
|
|
|
|
|
|
|
409
|
|
|
|
|
|
|
Usage: my @dbxrefs = $genepage->dbxrefs(); |
410
|
|
|
|
|
|
|
Desc : get a list of database cross-references for info related to this gene |
411
|
|
|
|
|
|
|
Args : none |
412
|
|
|
|
|
|
|
Ret : list of strings, like type:id e.g. ('PFAM:00012') |
413
|
|
|
|
|
|
|
Side Effects: none |
414
|
|
|
|
|
|
|
|
415
|
|
|
|
|
|
|
=cut |
416
|
|
|
|
|
|
|
|
417
|
|
|
|
|
|
|
sub dbxrefs { |
418
|
0
|
|
|
0
|
1
|
|
my ($self) = @_; |
419
|
0
|
|
|
|
|
|
die 'dbxrefs() method is abstract, must be implemented in a subclass' |
420
|
|
|
|
|
|
|
} |
421
|
|
|
|
|
|
|
|
422
|
|
|
|
|
|
|
=head2 comments |
423
|
|
|
|
|
|
|
|
424
|
|
|
|
|
|
|
Usage: my @comments = $genepage->comments(); |
425
|
|
|
|
|
|
|
Desc : get a list of comments with types |
426
|
|
|
|
|
|
|
Args : none |
427
|
|
|
|
|
|
|
Ret : a hash of comment=>type, where type is optional (empty string) |
428
|
|
|
|
|
|
|
Side Effects: none |
429
|
|
|
|
|
|
|
|
430
|
|
|
|
|
|
|
=cut |
431
|
|
|
|
|
|
|
|
432
|
|
|
|
|
|
|
sub comments { |
433
|
0
|
|
|
0
|
1
|
|
my ($self) = @_; |
434
|
0
|
|
|
|
|
|
die 'comments() method is abstract, must be impemented in a subclass'; |
435
|
|
|
|
|
|
|
} |
436
|
|
|
|
|
|
|
|
437
|
|
|
|
|
|
|
|
438
|
|
|
|
|
|
|
=head2 literature_references |
439
|
|
|
|
|
|
|
|
440
|
|
|
|
|
|
|
Usage: my @refs = $genepage->lit_refs(); |
441
|
|
|
|
|
|
|
Desc : get a list of literature references for this gene |
442
|
|
|
|
|
|
|
Args : none |
443
|
|
|
|
|
|
|
Ret : list of literature reference identifers, as type:id, |
444
|
|
|
|
|
|
|
like ('PMID:0023423',...) |
445
|
|
|
|
|
|
|
Side Effects: none |
446
|
|
|
|
|
|
|
|
447
|
|
|
|
|
|
|
=cut |
448
|
|
|
|
|
|
|
|
449
|
|
|
|
|
|
|
sub literature_references { |
450
|
0
|
|
|
0
|
1
|
|
my ($self) = @_; |
451
|
0
|
|
|
|
|
|
die 'lit_refs() method is abstract, must be implemented in a subclass' |
452
|
|
|
|
|
|
|
} |
453
|
|
|
|
|
|
|
|
454
|
|
|
|
|
|
|
|
455
|
|
|
|
|
|
|
=head2 summary_text |
456
|
|
|
|
|
|
|
|
457
|
|
|
|
|
|
|
Usage: my $summary = $page->summary_text(); |
458
|
|
|
|
|
|
|
Desc : get a text string of plain-English summary text for this gene |
459
|
|
|
|
|
|
|
Args : none |
460
|
|
|
|
|
|
|
Ret : string of summary text |
461
|
|
|
|
|
|
|
Side Effects: none |
462
|
|
|
|
|
|
|
|
463
|
|
|
|
|
|
|
=cut |
464
|
|
|
|
|
|
|
|
465
|
|
|
|
|
|
|
sub summary_text { |
466
|
0
|
|
|
0
|
1
|
|
my ($self) = @_; |
467
|
0
|
|
|
|
|
|
die 'summary_text() method is abstract, must be implemented in a subclass' |
468
|
|
|
|
|
|
|
} |
469
|
|
|
|
|
|
|
|
470
|
|
|
|
|
|
|
=head2 organism |
471
|
|
|
|
|
|
|
|
472
|
|
|
|
|
|
|
Usage: my $species_info = $genepage->organism |
473
|
|
|
|
|
|
|
Desc : get a handful of species-related information |
474
|
|
|
|
|
|
|
Args : none |
475
|
|
|
|
|
|
|
Ret : hashref as: |
476
|
|
|
|
|
|
|
{ ncbi_taxon_id => ncbi taxon id, (e.g. 3702), |
477
|
|
|
|
|
|
|
binomial => e.g. 'Arabidopsis thaliana', |
478
|
|
|
|
|
|
|
common => e.g. 'Mouse-ear cress', |
479
|
|
|
|
|
|
|
} |
480
|
|
|
|
|
|
|
Side Effects: none |
481
|
|
|
|
|
|
|
|
482
|
|
|
|
|
|
|
=cut |
483
|
|
|
|
|
|
|
|
484
|
|
|
|
|
|
|
sub organism { |
485
|
0
|
|
|
0
|
1
|
|
my ($self) = @_; |
486
|
0
|
|
|
|
|
|
die 'organism() method is abstract, must be implemented in a subclass'; |
487
|
|
|
|
|
|
|
} |
488
|
|
|
|
|
|
|
|
489
|
|
|
|
|
|
|
|
490
|
|
|
|
|
|
|
1; |
491
|
|
|
|
|
|
|
# The preceding line will help the module return a true value |
492
|
|
|
|
|
|
|
|