/usr/share/perl5/GO/Parsers/go_def_parser.pm is in libgo-perl 0.15-5.
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 | # $Id: go_def_parser.pm,v 1.6 2005/03/22 22:38:32 cmungall Exp $
#
#
# 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::Parsers::go_def_parser;
=head1 NAME
GO::Parsers::go_def_parser - syntax parsing of GO .def flat files
=head1 SYNOPSIS
do not use this class directly; use GO::Parser
=cut
=head1 DESCRIPTION
This generates Stag event streams from one of the various GO flat file
formats (ontology, defs, xref, associations). See GO::Parser for details
Examples of these files can be found at http://www.geneontology.org
A description of the event streams generated follows; Stag or an XML
handler can be used to catch these events
=head1 GO DEFINITION FILES
These have a suffix .defs or .definitions
=head1 AUTHOR
=cut
use Exporter;
use base qw(GO::Parsers::base_parser);
use GO::Parsers::ParserEventNames; # declare XML constants
use Carp;
use FileHandle;
use strict qw(subs vars refs);
sub dtd {
'go_def-parser-events.dtd';
}
sub parse_fh {
my ($self, $fh) = @_;
my $file = $self->file;
$self->start_event(OBO);
my $lnum = 0;
my $in_def=0;
while (my $line = <$fh>) {
chomp $line;
++$lnum;
next if $line =~ /^\!/;
next if !$line;
if ($line =~ /^term:\s+(.*)/) {
$self->pop_stack_to_depth(1);
$self->start_event(TERM);
$self->event(NAME, $1);
$in_def = 0;
}
elsif ($line =~ /^goid:\s+(\S+)/) {
if ($in_def) {
$self->parse_err("goid in definition");
}
$self->event(ID,$1);
}
elsif ($line =~ /^(\w+):\s+(.*)/) {
my ($k, $v) = ($1,$2);
if (!$in_def) {
$in_def = 1;
$self->start_event(DEF);
}
if ($k eq 'definition_reference') {
my ($db, $acc) = ('', $v);
if ($v =~ /(.*)?:(\S+)/) {
($db,$acc) = ($1,$2);
}
$self->event(DBXREF,[[acc=>$acc],[dbname=>$db]]);
next;
}
$k =~ s/^definition$/defstr/;
$self->event($k=>$v);
if ($k eq 'comment') {
my $stag = $self->parse_comment($v);
$self->event(@$stag) if $stag;
}
}
else {
$self->parse_err("trailing text");
}
}
$self->pop_stack_to_depth(0); # end event obo
}
sub parse_comment {
my $self = shift;
my $v = shift;
my $stag;
if ($v =~ /This term was made obsolete because (.*) To update annotations, (\w+) (.*)/) {
my $reason = $1;
my $update_type = $2;
my $nu = $3;
my @nu_ids = ();
while ($nu =~ / ; (\S+)\'/) {
push(@nu_ids, $1);
$nu =~ s/ ; (\S+)\'//;
}
$stag = [obsolete_data=>[
[reason=>$reason],
[update_type=>$update_type],
(map {[id=>$_]} @nu_ids),
]];
}
return $stag;
}
1;
|