File: mesh_parser.pm

package info (click to toggle)
libgo-perl 0.15-10
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 8,112 kB
  • sloc: perl: 13,147; sh: 21; makefile: 7
file content (125 lines) | stat: -rw-r--r-- 2,895 bytes parent folder | download | duplicates (8)
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
# $Id: mesh_parser.pm,v 1.4 2005/03/30 21:15:48 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::mesh_parser;

=head1 NAME

  GO::Parsers::mesh_parser     - Parses Mesh ascii text files

=head1 SYNOPSIS

  do not use this class directly; use GO::Parser

=cut

=head1 DESCRIPTION

EXPERIMENTAL

=head1 AUTHOR

=cut

use Exporter;
use GO::Parsers::base_parser;
@ISA = qw(GO::Parsers::base_parser Exporter);

use Carp;
use FileHandle;
use strict qw(subs vars refs);

sub parse_file {
    my ($self, $file, $dtype) = @_;
    $self->file($file);

    my $fh = new FileHandle($file);
    if (!$fh) {confess "Couldn't open '$file': $!"};

    $/ = '*NEWRECORD';

    my %treenode2acc = ();

    $self->start_event("subgraph");

    my @accs = ();

    my $lnum = 0;

  PARSELINE:
    while (my $block = <$fh>) {
	chomp $block;
        next unless $block;
	++$lnum;
        $self->line($block);
        $self->line_no($lnum);

        my @lines = split(/\n/, $block);
        my ($name, $acc, $def, @mn);
        map {
            if (/(\w+) = (.*)/) {
                my ($key, $val) = ($1, $2);
                if ($key eq "MH") {
                    $name = $val;
                }
                if ($key eq "UI") {
                    $acc = $val;
                }
                if ($key eq "MS") {
                    $def = $val;
                }
                if ($key eq "MN") {
                    push(@mn, $val);
                }
            }
        } @lines;
        
        $self->event('term',
                     [
                      [name=>$name],
                      [acc=>"Mesh:$acc"],
                      [term_type=>"Mesh"],
                     ]
                    );
        $self->event('def',
                     [
                      ['godef-goid'=>$acc],
                      ['godef-definition'=>$def],
                     ]
                    ) if $def;
        push(@accs, $acc);
        foreach (@mn) {
            $treenode2acc{$_} = $acc;
        }
    }
    foreach my $tn (keys %treenode2acc) {
        my $child = $treenode2acc{$tn};
        my $pn = $tn;
        $pn =~ s/\.(\d+)$//;
        if ($pn ne $tn) {
            my $parent = $treenode2acc{$pn};
            $self->event("term" => [
                                    [acc=>$child],
                                    [rel=> [
                                            [type => 'isa'],
                                            [obj=>$parent]
                                           ]
                                    ]
                                   ]
                        );
        }
    }

    $self->end_event("subgraph");
    $self->parsed_ontology(1);
#    use Data::Dumper;
#    print Dumper $self;
}


1;