[Bio] / FigKernelScripts / synchronize_annotations_and_assignments.pl Repository:
ViewVC logotype

Annotation of /FigKernelScripts/synchronize_annotations_and_assignments.pl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.2 - (view) (download) (as text)

1 : olson 1.2 #
2 :     # Copyright (c) 2003-2006 University of Chicago and Fellowship
3 :     # for Interpretations of Genomes. All Rights Reserved.
4 :     #
5 :     # This file is part of the SEED Toolkit.
6 :     #
7 :     # The SEED Toolkit is free software. You can redistribute
8 :     # it and/or modify it under the terms of the SEED Toolkit
9 :     # Public License.
10 :     #
11 :     # You should have received a copy of the SEED Toolkit Public License
12 :     # along with this program; if not write to the University of Chicago
13 :     # at info@ci.uchicago.edu or the Fellowship for Interpretation of
14 :     # Genomes at veronika@thefig.info or download a copy from
15 :     # http://www.theseed.org/LICENSE.TXT.
16 :     #
17 :    
18 : olson 1.1
19 :     #
20 :     # Create an annotation for every function assignment that does not currently have one.
21 :     #
22 :     # Load the assigned_functions file for a genome into memory.
23 :     #
24 :     # Walk the annotations file, loading the most recent master annotation for each peg.
25 :     #
26 :     # Then walk the two lists, comparing and writing out annotations for the ones that are
27 :     # missing.
28 :     #
29 :    
30 :     use File::stat;
31 :     use Data::Dumper;
32 :     use FileHandle;
33 :     use strict;
34 :     use FIG;
35 :     my $fig = new FIG;
36 :    
37 :     my %gcount;
38 :    
39 :     if (@ARGV < 3)
40 :     {
41 :     die "Usage: $0 anno_file assign_file genome [genome ..]\n";
42 :     }
43 :    
44 :     my $anno_file = shift;
45 :     my $assign_file = shift;
46 :    
47 :     my @genomes = @ARGV;
48 :    
49 :    
50 :     if (@genomes == 1 and $genomes[0] eq '-')
51 :     {
52 :     @genomes = ();
53 :     while (<STDIN>)
54 :     {
55 :     chomp;
56 :     if (/^\s*(\d+\.\d+)/)
57 :     {
58 :     push(@genomes, $1);
59 :     }
60 :     }
61 :     }
62 :    
63 :     for my $genome (@genomes)
64 :     {
65 :     if ($genome !~ /^\d+\.\d+$/)
66 :     {
67 :     die "Invalid genome $genome\n";
68 :     }
69 :     }
70 :    
71 :     {
72 :     my $anno_fh = new FileHandle(">$anno_file");
73 :     $anno_fh or die "Cannot open annotation file $anno_file for writing: $!\n";
74 :    
75 :     my $assign_fh = new FileHandle(">$assign_file");
76 :     $assign_fh or die "Cannot open assignment file $assign_file for writing: $!\n";
77 :    
78 :     for my $genome (@genomes)
79 :     {
80 :     print "Process $genome\n";
81 :     walk_genome($anno_fh, $assign_fh, $genome);
82 :    
83 :     $anno_fh->autoflush(1);
84 :     $anno_fh->autoflush(0);
85 :     $assign_fh->autoflush(1);
86 :     $assign_fh->autoflush(0);
87 :     }
88 :    
89 :     close($assign_fh);
90 :     close($anno_fh);
91 :     }
92 :    
93 :    
94 :     print "Global counts\n";
95 :     while (my ($k, $v) = each(%gcount))
96 :     {
97 :     print "$k:\t$v\n";
98 :     }
99 :    
100 :     sub walk_genome
101 :     {
102 :     my($anno_fh, $assign_fh, $genome) = @_;
103 :    
104 :     my($assigns, $assigns_mod) = load_assignments($genome);
105 :     print "size ", int(keys %$assigns), " $assigns_mod\n";
106 :    
107 :     my $annos = load_latest_annos($genome);
108 :    
109 :     compare($anno_fh, $assign_fh, $genome, $assigns, $assigns_mod, $annos);
110 :     }
111 :    
112 :     sub compare
113 :     {
114 :     my($anno_fh, $assign_fh, $genome, $assigns, $assigns_mod, $annos) = @_;
115 :    
116 :     my @pegs = sort { &FIG::by_fig_id($a, $b) } $fig->pegs_of($genome);
117 :    
118 :     my %counts;
119 :     for my $peg (@pegs)
120 :     {
121 :     my $assign = $assigns->{$peg};
122 :     my $anno = $annos->{$peg};
123 :    
124 :     my($fid, $anno_time, $who, $anno_text, $anno_fn);
125 :     defined($anno) and ($fid, $anno_time, $who, $anno_text, $anno_fn) = @$anno;
126 :    
127 :     if (not defined($assign) and not defined($anno))
128 :     {
129 :     #print "$peg: nothing\n";
130 :     $counts{none}++;
131 :     }
132 :     elsif (defined($assign) and not defined($anno))
133 :     {
134 :     #print "$peg: no anno, $assign\n";
135 :     $counts{no_anno}++;
136 :     write_anno($anno_fh, $peg, $assign, $assigns_mod, "Annotation for existing assignment\n$assign");
137 :     }
138 :     elsif (not defined($assign) and defined($anno))
139 :     {
140 :     #print "$peg: no assign, $who $anno_fn\n";
141 :     write_assign($assign_fh, $peg, $anno_fn);
142 :     $counts{no_assign}++;
143 :     }
144 :     elsif ($assign eq $anno_fn)
145 :     {
146 :     #print "$peg: OK\n";
147 :     $counts{ok}++;
148 :     }
149 :     else
150 :     {
151 :     my $xx = $anno_fn;
152 :     $xx =~ s/\s+/ /g;
153 :     if ($xx eq $assign)
154 :     {
155 :     write_anno($anno_fh, $peg, $assign, $assigns_mod, "Whitespace repair");
156 :     #print "$peg: WS\n";
157 :     $counts{ws}++;
158 :     }
159 :     else
160 :     {
161 :     write_anno($anno_fh, $peg, $assign, $assigns_mod, "Annotation for existing assignment\n$assign\nthat did not match latest annotation\n$anno_fn");
162 :     #print "$peg: clash: $anno_fn $who\n" . ' ' x length($peg);
163 :     #print " $assign\n";
164 :     $counts{clash}++;
165 :     }
166 :     }
167 :     }
168 :     while (my ($k, $v) = each(%counts))
169 :     {
170 :     print "$k:\t$v\n";
171 :     $gcount{$k} += $v;
172 :     }
173 :     }
174 :    
175 :     sub write_assign
176 :     {
177 :     my($fh, $peg, $assignment) = @_;
178 :    
179 :     print $fh "$peg\t$assignment\n";
180 :     }
181 :    
182 :     sub write_anno
183 :     {
184 :     my($fh, $peg, $assignment, $time, $txt) = @_;
185 :    
186 :     print $fh join("\n", $peg, $time, 'annotation_repair', $txt), "\n";
187 :     print $fh "///\n";
188 :     print $fh join("\n", $peg, $time, 'annotation_repair', "Set master function to", $assignment), "\n";
189 :     print $fh "///\n";
190 :     }
191 :    
192 :     sub load_assignments
193 :     {
194 :     my($genome) = @_;
195 :    
196 :     my $fh = new FileHandle("<$FIG_Config::organisms/$genome/assigned_functions");
197 :    
198 :     my $fns = {};
199 :    
200 :     if (!$fh)
201 :     {
202 :     warn "Cannot open assigned functions for $genome: $!";
203 :     return {};
204 :     }
205 :    
206 :     while (<$fh>)
207 :     {
208 :     chomp;
209 :     my($peg, $assign) = split(/\t/);
210 :    
211 :     if (not $fig->is_deleted_fid($peg))
212 :     {
213 :     $fns->{$peg}= $assign;
214 :     }
215 :     }
216 :    
217 :     my $stat = stat($fh);
218 :    
219 :     close($fh);
220 :     return $fns, $stat->mtime;
221 :     }
222 :    
223 :     sub load_latest_annos
224 :     {
225 :     my($genome) = @_;
226 :    
227 :     #
228 :     # %annos is a hash from fid to [$fid, $time, $who, $anno, $fn]
229 :     #
230 :     my %annos;
231 :    
232 :     my $fh = new FileHandle("<$FIG_Config::organisms/$genome/annotations");
233 :    
234 :     if (!$fh)
235 :     {
236 :     warn "Cannot open annotations for $genome: $!\n";
237 :     return \%annos;
238 :     }
239 :    
240 :     local $/ = "//\n";
241 :    
242 :     my ($fid, $anno_time, $who, $anno_text, $anno_who, $fn);
243 :    
244 :     while (my $ann = <$fh>)
245 :     {
246 :     chomp $ann;
247 :    
248 :     if ((($fid, $anno_time, $who, $anno_text, $anno_who, $fn) =
249 :     ($ann =~ /^(fig\|\d+\.\d+\.peg\.\d+)\n(\d+)\n(\S+)\n(Set\s+(FIG|master)\s+function\s+to[ \t]*\n(.*))/s)) and
250 :     not $fig->is_deleted_fid($fid))
251 :     {
252 :     my $cur = $annos{$fid};
253 :    
254 :     if (not ref($cur) or ($cur->[1] < $anno_time))
255 :     {
256 :     $fn =~ s/\n//g;
257 :     my $anno = [$fid, $anno_time, $who, $anno_text, $fn];
258 :     $annos{$fid} = $anno;
259 :     }
260 :     }
261 :     }
262 :     close($fh);
263 :     return \%annos;
264 :     }

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3