-
Notifications
You must be signed in to change notification settings - Fork 2
/
calculate_average_depth.pl
118 lines (94 loc) · 3.38 KB
/
calculate_average_depth.pl
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
#!/usr/bin/perl
# $Id: ancestors.pl,v 1.7 2007/11/15 18:30:47 sherlock Exp $
# License information (the MIT license)
# Copyright (c) 2003, 2007 Gavin Sherlock; Stanford University
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
# (the "Software"), to deal in the Software without restriction,
# including without limitation the rights to use, copy, modify, merge,
# publish, distribute, sublicense, and/or sell copies of the Software,
# and to permit persons to whom the Software is furnished to do so,
# subject to the following conditions:
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
use strict;
use diagnostics;
use warnings;
use Try::Tiny;
use GO::OntologyProvider::OboParser;
my ($ontologyFile) = @ARGV;
&Usage("You must provide an obo file") if (!$ontologyFile);
&Usage("Your obo file does not exist") if (!-e $ontologyFile);
&Usage("Your obo file does not have a .obo extension") if (!-e $ontologyFile);
my $ontologies = {
'P' => GO::OntologyProvider::OboParser->new(ontologyFile => $ontologyFile,
aspect => 'P'),
'C' => GO::OntologyProvider::OboParser->new(ontologyFile => $ontologyFile,
aspect => 'C'),
'F' => GO::OntologyProvider::OboParser->new(ontologyFile => $ontologyFile,
aspect => 'F'),
};
sub return_shortest_path{
my ($goid, $ontologiesd) = @_;
my $node;
foreach my $aspect (keys %$ontologies)
{
# print $aspect, "\n";
# print $ontologies->{$aspect}, "\n";
$node = $ontologies->{$aspect}->nodeFromId($goid);
if(defined $node)
{
last;
}
}
my @pathsToRoot = $node->pathsToRoot;
my $path_depth = 0;
my $shortest = 100000000000000;
foreach my $path (@pathsToRoot){
if(scalar(@{$path}) < $shortest)
{
$shortest = scalar(@{$path});
}
# print scalar(@{$path}), "\n";
}
return $shortest;
}
my $duf_file = 'duf_annotations.csv';
open(my $fh, $duf_file) or die "File can't be opened";
my $all_depths = '';
while( my $line = <$fh>)
{
chomp $line;
my @entries = split(/,/, $line);
my $out_line = shift @entries;
$out_line .= ",";
foreach my $goid (@entries){
my $len = "-";
try{
$len = return_shortest_path($goid, \$ontologies);
}
catch{};
$out_line.=$len.",";
$all_depths.=$len.",";
}
chop $out_line;
print $out_line, "\n";
}
chop $all_depths;
print $all_depths, "\n";
sub Usage{
my $message = shift;
print $message, ".\n\n";
print "Usage :
ancestors.pl <obo_file>
Where aspect is P, C or F. Note, the provided GOID must be for a GO term in the aspect that you provide.\n\n";
exit;
}