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

Annotation of /FigKernelScripts/sphinx_index_genome.pl

Parent Directory Parent Directory | Revision Log Revision Log


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

1 : olson 1.7 use Data::Dumper;
2 : olson 1.1
3 : olson 1.8 use SeedSearch;
4 :    
5 : olson 1.11 use File::Slurp;
6 :     use LWP::UserAgent;
7 : olson 1.1 use strict;
8 :     use Encode;
9 : olson 1.11 use FIG_Config;
10 : olson 1.1 use FIG;
11 :     my $fig = new FIG;
12 :    
13 : olson 1.8 @ARGV == 1 or die "Usage: sphinx_index_genome function|attrib|subsystem\n";
14 :    
15 :     my $which = shift;
16 :    
17 :     my @fields;
18 :     my %attr_types;
19 :     if ($which eq 'function')
20 :     {
21 :     @fields = qw(annotation fid genome);
22 :     $attr_types{$_} = "attr=\"string\"" for @fields;
23 :     }
24 :     elsif ($which eq 'genome')
25 :     {
26 : olson 1.9 @fields = qw(genome name taxonomy contigs);
27 : olson 1.8 $attr_types{$_} = "attr=\"string\"" for qw(genome name);
28 :     }
29 :     elsif ($which eq 'attrib')
30 :     {
31 :     @fields = qw(genome alias subsystem annotation fid);
32 :     $attr_types{$_} = 'attr="string"' foreach qw(annotation);
33 :     }
34 :     elsif ($which eq 'subsystem')
35 :     {
36 : olson 1.12 @fields = qw(subsystem curator version classification role);
37 : olson 1.8 $attr_types{$_} = "attr=\"string\"" for @fields;
38 :     }
39 : olson 1.11 elsif ($which eq 'dlit')
40 :     {
41 :     @fields = qw(title abstract protein genome fid pmid pmcid);
42 :     $attr_types{$_} = "attr=\"string\"" foreach (qw(title fid pmid pmcid));
43 :     }
44 : olson 1.8 else
45 :     {
46 :     die "Unknown type $which\n";
47 :     }
48 :    
49 : olson 1.1 print <<END;
50 :     <?xml version="1.0" encoding="utf-8"?>
51 :     <sphinx:docset>
52 :     <sphinx:schema>
53 : olson 1.8 END
54 :     print "<sphinx:field name=\"$_\" $attr_types{$_}/>\n" for @fields;
55 :     print <<END;
56 : olson 1.1 </sphinx:schema>
57 :     END
58 :    
59 :     my %tmap = (peg => 1, rna => 2);
60 :    
61 : olson 1.7 my @genomes;
62 :     if (my $glist = $ENV{SPHINX_INDEX_ONLY})
63 :     {
64 :     @genomes = split(/,/, $glist);
65 :     }
66 :     else
67 :     {
68 : olson 1.10 @genomes = $fig->genomes();
69 : olson 1.7 }
70 :    
71 : olson 1.8 if ($which eq 'subsystem')
72 :     {
73 :     &index_subsystems;
74 :     print "</sphinx:docset>\n";
75 :     exit;
76 :     }
77 :     elsif ($which eq 'genome')
78 :     {
79 :     &index_genomes(\@genomes);
80 :     print "</sphinx:docset>\n";
81 :     exit;
82 :     }
83 : olson 1.11 elsif ($which eq 'dlit')
84 :     {
85 :     &index_dlits();
86 :     print "</sphinx:docset>\n";
87 :     exit;
88 :     }
89 : olson 1.8
90 : olson 1.7 #
91 :     # Ingest the subsystem index.
92 :     #
93 :    
94 : olson 1.8 my $next_id = 1;
95 :    
96 : olson 1.7 for my $genome (@genomes)
97 : olson 1.1 {
98 :     print STDERR "$genome\n";
99 : olson 1.8 my $gs = escape($fig->genus_species($genome));
100 :     if ($which eq 'function')
101 :     {
102 :     my @fids = $fig->all_features($genome);
103 :     my $fns = $fig->function_of_bulk(\@fids);
104 : olson 1.7
105 : olson 1.8 for my $fid (keys %$fns)
106 :     {
107 :     my $fn = escape($fns->{$fid});
108 :     my $docid = SeedSearch::fid_to_docid($fid);
109 : olson 1.14 if (!defined($docid))
110 :     {
111 :     print STDERR "Skipping $fid docid not defined\n";
112 :     next;
113 :     }
114 : olson 1.8 print <<END;
115 :     <sphinx:document id="$docid">
116 :     <genome>$gs</genome>
117 :     <annotation>$fn</annotation>
118 :     </sphinx:document>
119 :     END
120 :     }
121 : olson 1.7 }
122 : olson 1.8 else
123 : olson 1.1 {
124 : olson 1.8 my %ss_info;
125 : olson 1.1
126 : olson 1.8 my $sth = $fig->db_handle->{_dbh}->prepare(qq(SELECT i.protein, i.subsystem
127 :     FROM subsystem_index i LEFT JOIN aux_roles a ON i.role = a.role
128 :     WHERE i.protein LIKE 'fig|$genome.peg.%' AND a.subsystem IS NULL),
129 :     { mysql_use_result => 1});
130 :     $sth->execute();
131 :     while (my $ent = $sth->fetchrow_arrayref())
132 : olson 1.5 {
133 : olson 1.8 my($prot, $ss) = @$ent;
134 :     $ss_info{$prot}->{$ss} = 1;
135 : olson 1.5 }
136 : olson 1.8
137 :     my $gs = escape($fig->genus_species($genome));
138 :    
139 :     my $all_data = $fig->all_features_detailed_fast($genome);
140 :    
141 :     my $ext_aliases_l = $fig->db_handle->SQL(qq(SELECT id, alias
142 :     FROM ext_alias
143 :     WHERE id like 'fig|${genome}.%'));
144 :     my %ext_aliases;
145 :     map { $ext_aliases{$_->[0]}->{$_->[1]}++ } @$ext_aliases_l;
146 :    
147 :     for my $feature (@$all_data)
148 : olson 1.1 {
149 : olson 1.8 my($fid, $loc, $aliases, $type, $b, $e, $func, $who) = @$feature;
150 :    
151 :     # my @ss = $fig->peg_to_subsystems($fid, 1, 1);
152 :     my @ss = keys %{$ss_info{$fid}};
153 :     @ss = map { defined($_) ? encode_utf8($_) : () } @ss;
154 :     my $ss = escape(join("\n", map { s/_/ /g; $_ } @ss));
155 :    
156 :     $func = defined($func) ? escape($func) : "";
157 :     my $efid = escape($fid);
158 :    
159 :     my %aliases = map { $_ => 1 } split(",", $aliases);
160 :     map { $aliases{$_} = 1 } keys %{$ext_aliases{$fid}};
161 :     my @aliases = keys %aliases;
162 :     my $alias_txt = "";
163 :     if (@aliases)
164 :     {
165 :     $alias_txt = escape(join("\n",
166 :     map { s/&/&amp;/g;
167 :     s/</&lt;/g;
168 :     s/>/&gt;/g;
169 :     $_ } @aliases));
170 :     }
171 :     my $docid = SeedSearch::fid_to_docid($fid);
172 : olson 1.14 if (!$docid)
173 :     {
174 :     warn "Skipping $fid docid not defined\n";
175 :     next;
176 :     }
177 : olson 1.1 print <<END;
178 : olson 1.8 <sphinx:document id="$docid">
179 :     <genome>$genome $gs</genome>
180 :     <fid>$efid</fid>
181 : olson 1.1 <annotation>$func</annotation>
182 : olson 1.6 <alias>$alias_txt</alias>
183 : olson 1.5 <subsystem>$ss</subsystem>
184 : olson 1.1 </sphinx:document>
185 :     END
186 :     }
187 :     }
188 :     }
189 :     print "</sphinx:docset>\n";
190 : olson 1.8
191 :     sub index_genomes
192 :     {
193 :     my($genomes) = @_;
194 :     my $i = 1;
195 :     for my $g (@$genomes)
196 :     {
197 :     my $gs = escape($fig->genus_species($g));
198 :     my $tax =escape($fig->taxonomy_of($g));
199 : olson 1.9
200 :     my $contigs = escape(join(" ", $fig->all_contigs($g)));
201 :    
202 : olson 1.8 print "<sphinx:document id=\"$i\">\n";
203 :    
204 :     print "<genome>$g</genome>\n";
205 :     print "<name>$gs</name>\n";
206 : olson 1.9 print "<contigs>$contigs</contigs>\n";
207 : olson 1.8 print "<taxonomy>$tax</taxonomy>\n";
208 :     print "</sphinx:document>\n";
209 :     $i++;
210 :     }
211 :     }
212 :    
213 : olson 1.11 sub index_dlits
214 :     {
215 :    
216 :     my @dlits = $fig->get_attributes(undef, 'evidence_code', 'dlit%');
217 :    
218 :     my $ua = LWP::UserAgent->new;
219 :     my $url_fmt = 'http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id=%s&retmode=text&rettype=abstract';
220 :     # @fields = qw(title abstract protein fid);
221 :     my $cache = "$FIG_Config::var/pm_abstract_cache";
222 :     -d $cache || mkdir $cache;
223 :     my $id = 1;
224 :     my %by_pmid;
225 :     for my $dlit (@dlits)
226 :     {
227 :     my($pmid) = $dlit->[2] =~ /dlit\((\d+)\)/;
228 :     next unless $pmid && $pmid > 10;
229 :     push(@{$by_pmid{$pmid}}, $dlit);
230 :     }
231 :     for my $pmid (keys %by_pmid)
232 :     {
233 :     last if ($ENV{LIMIT_DLIT_INDEX} && $id > $ENV{LIMIT_DLIT_INDEX});
234 :    
235 :     my $abs;
236 :     my $cache_file = "$cache/$pmid";
237 :     if (-s $cache_file)
238 :     {
239 :     $abs = read_file($cache_file);
240 :     }
241 :     else
242 :     {
243 :     my $url = sprintf($url_fmt, $pmid);
244 :     my $resp = $ua->get($url);
245 :     if ($resp->is_success)
246 :     {
247 :     $abs = $resp->content;
248 :     open(S, ">", $cache_file);
249 :     print S $abs;
250 :     close(S);
251 :     }
252 :     }
253 :     my $eabs = escape($abs);
254 :     my $details = Dlits::get_pubmed_document_details($fig, $pmid);
255 : olson 1.12 next unless ref($details);
256 : olson 1.11
257 :     my %pegs;
258 :     my %md5;
259 :    
260 :     for my $ent (@{$by_pmid{$pmid}})
261 :     {
262 :     if ($ent->[0] =~ /Protein:(\S+)/)
263 :     {
264 :     my $md5 = $1;
265 :     my @pegs = $fig->pegs_with_md5($md5);
266 :     $md5{$md5} = 1;
267 :     $pegs{$_} = 1 foreach @pegs;
268 :     }
269 :     elsif ($ent->[0] =~ /^fig\|/)
270 :     {
271 :     $pegs{$ent->[0]} = 1;
272 :     }
273 :     }
274 :    
275 :     my($pmcid) = $abs =~ /PMCID:\s+(\S+)/mg;
276 :    
277 :     my @pegs = sort { &FIG::by_fig_id($a, $b) } keys %pegs;
278 :    
279 :     my %genomes = map { &FIG::genome_of($_) } @pegs;
280 :     my @genomes = sort { &FIG::by_genome_id($a, $b) } keys %genomes;
281 :     my @genome_names = map { $fig->genus_species($_) } @genomes;
282 :    
283 :     my $genomes = escape(join(" ", @genomes));
284 :     my $genome_names = escape(join(" ", @genome_names));
285 :     my $fids = escape(join(" ", @pegs));
286 :     my $md5 = escape(join(" ", keys %md5));
287 :    
288 :     print "<sphinx:document id=\"$id\">\n";
289 :     print "<title>" . escape($details->{title}) . "</title>\n";
290 :     print "<abstract>$eabs</abstract>\n";
291 :     print "<protein>$md5</protein>\n";
292 :     print "<fid>$fids</fid>\n";
293 :     print "<genome>$genomes $genome_names</genome>\n";
294 :     print "<pmid>$pmid</pmid>\n";
295 :     print "<pmcid>$pmcid</pmcid>\n";
296 :     print "</sphinx:document>\n";
297 :     $id++;
298 :     }
299 :     }
300 :    
301 : olson 1.8 sub index_subsystems
302 :     {
303 :     my $i = 1;
304 :     my @ss = $fig->all_subsystems_detailed();
305 : olson 1.12
306 :     #
307 :     # Pull subsystem roles from database.
308 :     #
309 :     my %ss_to_role;
310 :     my $res = $fig->db_handle->SQL("SELECT subsystem, role FROM subsystem_nonaux_role");
311 :     for my $ent (@$res)
312 :     {
313 :     my($ss, $role) = @$ent;
314 :     $ss_to_role{$ss} .= " " . $role;
315 :     }
316 :     undef $res;
317 :    
318 : olson 1.8 for my $ent (@ss)
319 :     {
320 :     print "<sphinx:document id=\"$i\">\n";
321 : olson 1.12 my $roles = $ss_to_role{$ent->{subsystem}};
322 : olson 1.8 $ent->{subsystem} =~ s/_/ /g;
323 : olson 1.12 for my $f (grep { $_ ne 'role' } @fields)
324 : olson 1.8 {
325 :     print "<$f>" . escape($ent->{$f}) . "</$f>\n";
326 :     }
327 : olson 1.13 print "<role>" . escape($roles) . "</role>\n";
328 : olson 1.8 print "</sphinx:document>\n";
329 :     $i++;
330 :     }
331 :     }
332 :    
333 :     sub escape
334 :     {
335 :     my($s) = @_;
336 :     return "" unless defined($s);
337 :     $s = encode_utf8($s);
338 :     $s =~ s/&/&amp;/g;
339 :     $s =~ s/</&lt;/g;
340 :     $s =~ s/>/&gt;/g;
341 :     return $s;
342 :     }

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3