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