File Coverage

GO/Model/Evidence.pm
Criterion Covered Total %
statement 50 120 41.6
branch 16 58 27.5
condition n/a
subroutine 10 17 58.8
pod 6 9 66.6
total 82 204 40.2


line stmt bran cond sub pod time code
1             # $Id: Evidence.pm,v 1.5 2009/05/22 23:06:40 sjcarbon Exp $
2             #
3             # This GO module is maintained by Chris Mungall
4             #
5             # see also - http://www.geneontology.org
6             # - http://www.godatabase.org/dev
7             #
8             # You may distribute this module under the same terms as perl itself
9              
10              
11             package GO::Model::Evidence;
12              
13             =head1 NAME
14              
15             GO::Model::Evidence;
16              
17             =head1 SYNOPSIS
18              
19             my $ev_l = $association->evidence_list;
20             foreach my $ev (@$ev_l) {
21             print "Evidence for association %s : %s\n",
22             $association->gene_product->symbol,
23             $ev->code;
24             }
25              
26             =head1 DESCRIPTION
27              
28             evidence for an association
29              
30             see http://www.geneontology.org/GO.evidence.html
31             for a list of evidence codes
32              
33             =cut
34              
35              
36 24     24   126 use Carp qw(confess cluck);
  24         43  
  24         1805  
37 24     24   152 use Exporter;
  24         40  
  24         892  
38 24     24   152 use GO::Utils qw(rearrange);
  24         48  
  24         1486  
39 24     24   133 use GO::Model::Root;
  24         37  
  24         523  
40 24     24   153 use strict;
  24         62  
  24         1076  
41 24     24   358 use vars qw(@ISA);
  24         69  
  24         53172  
42              
43             @ISA = qw(GO::Model::Root Exporter);
44              
45              
46             sub _valid_params {
47 402     402   1428 return qw(id code seq_acc xref seq_xref_list pub_xref_list);
48             }
49              
50             =head2 code
51              
52             Usage - $ev->code("IEA");
53             Returns -
54             Args -
55              
56             gets/sets the evidence code
57              
58             see http://www.geneontology.org/GO.evidence.html
59              
60             =cut
61              
62             # dynamic method
63              
64             =head2 seq_acc
65              
66             Usage -
67             Returns -
68             Args -
69              
70             gets/sets the sequence accesion GO::Model::Xref
71              
72             ALPHA CODE - API may change
73              
74             used to set the GO::Model::Xref list from a text string. eg
75              
76             $ev->seq_acc("SGD:RRP41; SGDID:L0003550");
77              
78             will actually add two GO::Model::Xref objects
79              
80             This method doesnt really belong in the GO::Model::* hierarchy as it
81             contains parsing code. Its a minor hack mainly due to the fact that
82             this data is still denormalized in the database.
83              
84             =cut
85              
86             sub seq_acc {
87 0     0 1 0 my $self = shift;
88 0 0       0 if (@_) {
89 0         0 my $acc = shift;
90 0 0       0 if (ref($acc)) {
91 0 0       0 if (ref($acc) eq "ARRAY") {
92 0         0 foreach (@$acc) {
93 0         0 $self->add_seq_xref($_);
94             }
95             }
96             else {
97 0 0       0 if (UNIVERSAL::isa($acc, "GO::Model::Xref")) {
98 0         0 $self->add_seq_xref($acc)
99             }
100             else {
101 0         0 confess("$acc is not a valid argument for $self -> seq_acc()");
102             }
103             }
104             }
105             else {
106             # it's a string
107 0         0 my @accs =
108             split(/\;/, $acc);
109 0         0 foreach my $acc (@accs) {
110 0         0 $self->add_seq_xref($acc);
111             }
112             }
113             }
114             return
115 0         0 join("; ",
116 0 0       0 map {$_->as_str} @{$self->seq_xref_list || []});
  0         0  
117             }
118              
119              
120             =head2 add_seq_xref
121              
122             Usage -
123             Returns -
124             Args -
125              
126             equivalent to WITH column in gene_association files, and evidence_dbxref tables in db
127              
128             =cut
129              
130             sub add_seq_xref {
131 84     84 1 123 my $self = shift;
132 84         98 my $xref = shift;
133 84 100       186 if (ref($xref)) {
134 42 50       143 if (UNIVERSAL::isa($xref, "GO::Model::Xref")) {
135 42 100       153 $self->{seq_xref_list} = [] unless $self->{seq_xref_list};
136 42         52 push(@{$self->{seq_xref_list}}, $xref);
  42         194  
137             }
138             else {
139 0         0 confess("$xref is not a valid argument for $self -> add_seq_xref()");
140             }
141             }
142             else {
143             # string maybe in db:acc format
144 42 50       249 if ($xref =~ /\s*(\S+?):(\S+)/) {
145 42         144 my ($db, $acc) = ($1, $2);
146 42         219 $acc =~ s/ *$//;
147 42         227 $xref =
148             GO::Model::Xref->new({xref_dbname=>$db,
149             xref_key=>$acc});
150             }
151             else {
152 0         0 $xref =
153             GO::Model::Xref->new({xref_dbname=>"UNKNOWN",
154             xref_key=>"$xref"});
155             }
156 42 50       211 confess("Assertion error") unless $xref->isa("GO::Model::Xref");
157 42         115 $self->add_seq_xref($xref);
158             }
159             }
160              
161              
162             =head2 add_pub_xref
163              
164             Usage -
165             Returns -
166             Args -
167              
168             =cut
169              
170             sub add_pub_xref {
171 546     546 1 703 my $self = shift;
172 546         682 my $xref = shift;
173 546 100       1149 if (ref($xref)) {
174 273 50       983 if (UNIVERSAL::isa($xref, "GO::Model::Xref")) {
175 273 100       905 $self->{pub_xref_list} = [] unless $self->{pub_xref_list};
176 273         347 push(@{$self->{pub_xref_list}}, $xref);
  273         1287  
177             }
178             else {
179 0         0 confess("$xref is not a valid argument for $self -> add_pub_xref()");
180             }
181             }
182             else {
183             # string maybe in db:acc format
184 273 50       1429 if ($xref =~ /\s*(\S+?):(\S+)/) {
185 273         926 my ($db, $acc) = ($1, $2);
186 273         1312 $acc =~ s/ *$//;
187 273         7160 $xref =
188             GO::Model::Xref->new({xref_dbname=>$db,
189             xref_key=>$acc});
190             }
191             else {
192 0         0 $xref =
193             GO::Model::Xref->new({xref_dbname=>"UNKNOWN",
194             xref_key=>"$xref"});
195             }
196 273 50       1560 confess("Assertion error") unless $xref->isa("GO::Model::Xref");
197 273         592 $self->add_pub_xref($xref);
198             }
199             }
200              
201             =head2 xref
202              
203             Usage -
204             Returns -
205             Args -
206              
207             gets/sets the literature or sequence reference GO::Model::Xref
208              
209             NOTE: at some point we may want to deprecate this method and persuade
210             API client code to call
211              
212             $ev->literature_xref
213              
214             instead, to make explicit the fact that this is a literature reference
215             as opposed to a sequence reference
216              
217             =cut
218              
219             # dynamic method
220              
221              
222             =head2 xref_list
223              
224             Usage -
225             Returns - GO::Model::Xref listref
226             Args -
227              
228             returns all (sequence and literature) references
229              
230             =cut
231              
232             sub xref_list {
233 0     0 1 0 my $self = shift;
234 0 0       0 if (@_) {
235 0         0 confess("get only");
236             }
237 0 0       0 my @x = @{$self->pub_xref_list || []};
  0         0  
238 0 0       0 push(@x, @{$self->seq_xref_list || []});
  0         0  
239 0         0 return \@x;
240             }
241              
242              
243             =head2 xref
244              
245             Usage -
246             Returns -
247             Args -
248              
249             deprected - sets first pub_xref_list
250              
251             =cut
252              
253             sub xref {
254 0     0 1 0 my $self = shift;
255 0 0       0 if (@_) {
256 0         0 $self->pub_xref_list([@_]);
257             }
258 0 0       0 $self->pub_xref_list && $self->pub_xref_list->[0];
259             }
260              
261              
262             =head2 valid_codes
263              
264             Usage - print join("; ", GO::Model::Evidence->valid_codes);
265             Returns - string array
266             Args -
267              
268             list of valid evidence codes
269              
270             =cut
271              
272             ## TODO: This should be fixed to get the values from the live DB.
273             sub valid_codes {
274             #qw(IMP IGI IPI ISS IDA IEP IEA TAS NAS ND NR);
275             #qw(IC IDA IEP IGC IGI IMP IPI ISS NAS ND NR RCA TAS);
276             ## Latest scraped version:
277 0     0 1 0 qw(EXP IC IDA IEA IEP IGC IGI IMP IPI ISA ISM ISO ISS NAS ND NR RCA TAS);
278             }
279              
280              
281             sub _initialize
282             {
283              
284 201     201   263 my $self = shift;
285 201         312 my $paramh = shift;
286 201 50       447 if (!ref($paramh)) {
287 0         0 confess("init param must be hash");
288             }
289 201 50       503 if ($paramh->{reference}) {
290 0         0 my ($db, @keyparts) = split (/:/, $paramh->{reference});
291             # usually there is only one : in the dbxref, but
292             # MGI includes the dbname in the id, so their
293             # dbxrefs look like this:
294             # MGI:MGI:00000001
295 0         0 my $key = join(":", @keyparts);
296 0 0       0 if (!$key) {
297 0         0 $key = $db;
298 0         0 $db = "U";
299             }
300             else {
301 0         0 ($db) =~ tr/A-Z/a-z/;
302             }
303 0         0 my $xref =
304             GO::Model::Xref->new({xref_key=>$key,
305             xref_dbname=>$db});
306            
307 0         0 $self->xref($xref);
308 0         0 delete $paramh->{reference};
309             }
310 201         622 $self->SUPER::_initialize($paramh);
311             }
312              
313             sub to_idl_struct {
314 0     0 0   my $self = shift;
315 0 0         if (!$self->xref) {
316 0           confess("$self has no xref");
317             }
318             return
319             {
320 0           code=>$self->code,
321             seq_acc=>$self->seq_acc,
322             dbxref=>$self->xref->to_idl_struct,
323             };
324             }
325              
326              
327             sub from_idl {
328 0     0 0   my $class = shift;
329 0           my $h = shift;
330 0           $h->{dbxref} = GO::Model::Xref->from_idl($h->{dbxref});
331 0           return $class->new($h);
332             }
333              
334             # **** EXPERIMENTAL CODE ****
335             # the idea is to be homogeneous and use graphs for
336             # everything; eg gene products are nodes in a graph,
337             # associations are arcs
338             # cf rdf, daml+oil etc
339              
340             # args - optional graph to add to
341             sub graphify {
342 0     0 0   my $self = shift;
343 0           my ($ref, $subg, $opts) =
344             rearrange([qw(ref graph opts)], @_);
345              
346 0 0         $opts = {} unless $opts;
347 0 0         $subg = $self->apph->create_graph_obj unless $subg;
348              
349 0           my $acc = sprintf("%s", $self);
350 0           my $t =
351             $self->apph->create_term_obj({name=>$acc,
352             acc=>$acc});
353 0           $subg->add_node($t);
354 0 0         $subg->add_arc($t, $ref, "hasEvidence") if $ref;
355              
356 0 0         foreach my $xr (@{$self->xref_list || []}) {
  0            
357 0           $xr->apph($self->apph);
358 0           $xr->graphify($t, $subg);
359             }
360 0           my $code = $self->code;
361 0           my $cn = $subg->get_node($code);
362 0 0         if (!$cn) {
363 0           $cn =
364             $self->apph->create_term_obj({name=>$code,
365             acc=>$code});
366 0           $subg->add_node($cn);
367             }
368 0           $subg->add_arc($cn, $t, "hasCode");
369 0           $subg;
370             }
371              
372             1;