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

Annotation of /FigKernelScripts/load_features.pl

Parent Directory Parent Directory | Revision Log Revision Log


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

1 : efrank 1.1 # -*- perl -*-
2 :    
3 :     use strict;
4 :     use FIG;
5 :     my $fig = new FIG;
6 :    
7 :     use DBrtns;
8 :    
9 :    
10 :     my $temp_dir = "$FIG_Config::temp";
11 :     my($organisms_dir) = "$FIG_Config::organisms";
12 :    
13 :     my($genome,@types,$type,$id,$loc,@aliases,$aliases,$contig);
14 :    
15 :     # usage: load_features [G1 G2 G3 ... ]
16 :    
17 :     open(REL,">$temp_dir/tmpfeat$$") || die "could not open $temp_dir/tmpfeat$$";
18 : overbeek 1.10 open(ALIAS,"| sort -u > $temp_dir/tmpalias$$") || die "could not open $temp_dir/tmpalias$$";
19 : efrank 1.1
20 :     my $dbf = $fig->{_dbf};
21 :    
22 :    
23 :    
24 :     my @genomes;
25 :     if (@ARGV == 0)
26 :     {
27 :     $dbf->drop_table( tbl => "features" );
28 : overbeek 1.8 $dbf->drop_table( tbl => "ext_alias" );
29 :    
30 :     $dbf->create_table( tbl => 'ext_alias',
31 :     flds => "id varchar(32), alias varchar(32), genome varchar(16)"
32 :     );
33 :    
34 : efrank 1.1 if ($FIG_Config::dbms eq "Pg")
35 :     {
36 :     $dbf->create_table( tbl => "features",
37 : overbeek 1.11 flds => "id varchar(32), idN INTEGER, type varchar(16),genome varchar(16)," .
38 : efrank 1.1 "location varchar(5000)," .
39 :     "contig varchar(96), minloc INTEGER, maxloc INTEGER," .
40 : overbeek 1.6 "aliases TEXT"
41 : efrank 1.1 );
42 :     }
43 :     elsif ($FIG_Config::dbms eq "mysql")
44 :     {
45 :     $dbf->create_table( tbl => "features",
46 : overbeek 1.11 flds => "id varchar(32), idN INTEGER, type varchar(16),genome varchar(16)," .
47 : efrank 1.1 "location TEXT," .
48 :     "contig varchar(96), minloc INTEGER, maxloc INTEGER," .
49 : overbeek 1.6 "aliases TEXT"
50 : efrank 1.1 );
51 :     }
52 :    
53 :     @genomes = $fig->genomes;
54 : overbeek 1.10
55 :     # Here we extract external aliases from the peg.synonyms table, when they can be inferred
56 :     # accurately.
57 :     open(SYN,"<$FIG_Config::global/peg.synonyms") || die "could not open $FIG_Config::global/peg.synonyms";
58 :     while (defined($_ = <SYN>))
59 :     {
60 :     chop;
61 :     my($x,$y) = split(/\t/,$_);
62 : overbeek 1.13 my @ids = map { $_ =~ /^([^,]+),(\d+)/; [$1,$2] } ($x,split(/;/,$y));
63 : overbeek 1.10 my @fig = ();
64 :     my(@nonfig) = ();
65 :     foreach $_ (@ids)
66 :     {
67 : overbeek 1.13 if ($_->[0] =~ /^fig\|/)
68 : overbeek 1.10 {
69 :     push(@fig,$_);
70 :     }
71 :     else
72 :     {
73 :     push(@nonfig,$_);
74 :     }
75 :     }
76 : overbeek 1.13
77 :     my $x;
78 :     foreach $x (@fig)
79 : overbeek 1.10 {
80 : overbeek 1.13 my($peg,$peg_ln) = @$x;
81 :     my $genome = &FIG::genome_of($peg);
82 : overbeek 1.10 foreach $_ (@nonfig)
83 :     {
84 : overbeek 1.13 if ((@fig == 1) || ($peg_ln == $_->[1]))
85 :     {
86 :     print ALIAS "$peg\t$_->[0]\t$genome\n";
87 : overbeek 1.14 print STDERR "$peg\t$_->[0]\t$genome\n";
88 : overbeek 1.13 }
89 : overbeek 1.10 }
90 :     }
91 :     }
92 :     close(SYN);
93 : efrank 1.1 }
94 :     else
95 :     {
96 :     @genomes = @ARGV;
97 : overbeek 1.2 foreach $genome (@genomes)
98 :     {
99 :     $dbf->SQL("DELETE FROM features WHERE ( genome = \'$genome\' )");
100 : overbeek 1.8 $dbf->SQL("DELETE FROM ext_alias WHERE ( genome = \'$genome\' )");
101 : overbeek 1.2 }
102 : efrank 1.1 }
103 :    
104 : overbeek 1.12 my $changes = {};
105 :     if (open(TMP,"<$FIG_Config::global/changed.location.features"))
106 :     {
107 :     while ($_ = <TMP>)
108 :     {
109 :     if ($_ =~ /^(fig\|\d+\.\d+\.[a-zA-Z]+\.\d+)/)
110 :     {
111 :     $changes->{$1}++;
112 :     }
113 :     }
114 :     close(TMP);
115 :     }
116 :    
117 : efrank 1.1 foreach $genome (@genomes)
118 :     {
119 :     opendir(FEAT,"$organisms_dir/$genome/Features")
120 :     || die "could not open $genome/Features";
121 :     @types = grep { $_ =~ /^[a-zA-Z]+$/ } readdir(FEAT);
122 :     closedir(FEAT);
123 :    
124 :     foreach $type (@types)
125 :     {
126 :     if ((-s "$organisms_dir/$genome/Features/$type/tbl") &&
127 :     open(TBL,"<$organisms_dir/$genome/Features/$type/tbl"))
128 :     {
129 :     # print STDERR "loading $genome/Features/$type/tbl\n";
130 :     while (defined($_ = <TBL>))
131 :     {
132 :     chop;
133 :     ($id,$loc,@aliases) = split(/\t/,$_);
134 : overbeek 1.12
135 :     if ($id && ($_ = $changes->{$id})) # check for obsolete entries due to location changes
136 :     {
137 :     $changes->{$id}--;
138 :     next;
139 :     }
140 :    
141 : efrank 1.1 if ($id)
142 :     {
143 :     my($minloc,$maxloc);
144 :     if ($loc)
145 :     {
146 :     $loc =~ s/\s+$//;
147 :     ($contig,$minloc,$maxloc) = &FIG::boundaries_of($loc);
148 :     if ($minloc && $maxloc)
149 :     {
150 :     ($minloc < $maxloc) || (($minloc,$maxloc) = ($maxloc,$minloc));
151 :     }
152 :     }
153 :    
154 :     if (! $contig)
155 :     {
156 :     $loc = $contig = $minloc = $maxloc = "";
157 :     }
158 :    
159 :     if (@aliases > 0)
160 :     {
161 :     $aliases = join(",",grep(/\S/,@aliases));
162 : overbeek 1.8 my $alias;
163 :     foreach $alias (@aliases)
164 :     {
165 : overbeek 1.11 if ($alias =~ /^(NP_|gi\||sp\|\tr\||kegg\||uni\|)/)
166 : overbeek 1.8 {
167 :    
168 : overbeek 1.14 print ALIAS "$id\t$alias\t$genome\tOVERRIDE\n";
169 :     print STDERR "$id\t$alias\t$genome\tOVERRIDE\n";
170 : overbeek 1.8 }
171 :     }
172 : efrank 1.1 }
173 :     else
174 :     {
175 :     $aliases = "";
176 :     }
177 :     $minloc = (! $minloc) ? 0 : $minloc;
178 :     $maxloc = (! $maxloc) ? 0 : $maxloc;
179 : overbeek 1.11 if ((length($loc) < 5000) && (length($contig) < 96) && (length($id) < 32) && ($id =~ /(\d+)$/))
180 : overbeek 1.3 {
181 : overbeek 1.11 print REL "$id\t$1\t$type\t$genome\t$loc\t$contig\t$minloc\t$maxloc\t$aliases\n";
182 : overbeek 1.3 }
183 : efrank 1.1 }
184 :     }
185 :     close(TBL);
186 :     }
187 :     }
188 :     }
189 :     close(REL);
190 : overbeek 1.8 close(ALIAS);
191 : overbeek 1.14 open(ALIASIN,"<$temp_dir/tmpalias$$") || die "could not open $temp_dir/tmpalias$$";
192 :     open(ALIASOUT,">$temp_dir/tmpalias$$.1") || die "could not open $temp_dir/tmpalias$$.1";
193 :     $_ = <ALIASIN>;
194 :     while ($_ && ($_ =~ /^(\S+)/))
195 :     {
196 :     my @aliases = ();
197 :     my $curr = $1;
198 :     while ($_ && ($_ =~ /^(\S+)\t(\S+)(\t(\S+))?/) && ($1 eq $curr))
199 :     {
200 :     push(@aliases,[$2,$3 ? 1 : 0]);
201 :     $_ = <ALIASIN>;
202 :     }
203 :     my $x;
204 :     my $genome = &FIG::genome_of($curr);
205 :     foreach $x (@aliases)
206 :     {
207 :     if ($x->[1])
208 :     {
209 :     print ALIASOUT "$curr\t$x->[0]\t$genome\n";
210 :     }
211 :     else
212 :     {
213 :     my $i;
214 :     for ($i=0; ($i < @aliases) && ((! $aliases[$i]->[1]) || (! &same_class($x->[0],$aliases[$i]->[0]))); $i++) {}
215 :     if ($i == @aliases)
216 :     {
217 :     print ALIASOUT "$curr\t$x->[0]\t$genome\n";
218 :     }
219 :     }
220 :     }
221 :     }
222 :     close(ALIASIN);
223 :     close(ALIASOUT);
224 :     unlink("$temp_dir/tmpalias$$");
225 : efrank 1.1
226 :     $dbf->load_table( tbl => "features",
227 :     file => "$temp_dir/tmpfeat$$" );
228 :    
229 : overbeek 1.8 $dbf->load_table( tbl => "ext_alias",
230 : overbeek 1.14 file => "$temp_dir/tmpalias$$.1" );
231 : overbeek 1.8
232 : overbeek 1.4 if (@ARGV == 0)
233 :     {
234 : overbeek 1.8 $dbf->create_index( idx => "ext_alias_alias_ix",
235 :     tbl => "ext_alias",
236 :     type => "btree",
237 :     flds => "alias" );
238 :    
239 :     $dbf->create_index( idx => "ext_alias_genome_ix",
240 :     tbl => "ext_alias",
241 :     type => "btree",
242 :     flds => "genome" );
243 :    
244 : overbeek 1.10 $dbf->create_index( idx => "ext_alias_id_ix",
245 :     tbl => "ext_alias",
246 :     type => "btree",
247 :     flds => "id" );
248 :    
249 : overbeek 1.6 $dbf->create_index( idx => "features_id_ix",
250 :     tbl => "features",
251 :     type => "btree",
252 :     flds => "id" );
253 : overbeek 1.4 $dbf->create_index( idx => "features_org_ix",
254 :     tbl => "features",
255 :     type => "btree",
256 :     flds => "genome" );
257 :     $dbf->create_index( idx => "features_type_ix",
258 :     type => "btree",
259 :     tbl => "features",
260 :     flds => "type" );
261 :     $dbf->create_index( idx => "features_beg_ix",
262 :     type => "btree",
263 :     tbl => "features",
264 :     flds => "genome,contig,minloc" );
265 :    
266 : overbeek 1.5 $dbf->vacuum_it("features")
267 : overbeek 1.4 }
268 : efrank 1.1 unlink("$temp_dir/tmpfeat$$");
269 : overbeek 1.14 unlink("$temp_dir/tmpalias$$.1");
270 :    
271 :     sub same_class {
272 :     my($x,$y) = @_;
273 :    
274 :     my $class1 = &classA($x);
275 :     my $class2 = &classA($y);
276 :     return ($class1 && ($class1 eq $class2));
277 :     }
278 :    
279 :     sub classA {
280 :     my($alias) = @_;
281 :    
282 :     if ($alias =~ /^([^\|]+)\|/)
283 :     {
284 :     return $1;
285 :     }
286 :     elsif ($alias =~ /^[NXYZA]P_[0-9\.]+$/)
287 :     {
288 :     return "refseq";
289 :     }
290 :     else
291 :     {
292 :     return "";
293 :     }
294 :     }

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3