[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.1 - (view) (download) (as text)

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

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3