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

Diff of /FigKernelScripts/sphinx_index_genome.pl

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.1, Mon Jun 7 18:20:23 2010 UTC revision 1.9, Wed May 18 18:49:26 2011 UTC
# Line 1  Line 1 
1    use Data::Dumper;
2    
3    use SeedSearch;
4    
5  use strict;  use strict;
6  use Encode;  use Encode;
7  use FIG;  use FIG;
8  my $fig = new FIG;  my $fig = new FIG;
9    
10    @ARGV == 1 or die "Usage: sphinx_index_genome function|attrib|subsystem\n";
11    
12    my $which = shift;
13    
14    my @fields;
15    my %attr_types;
16    if ($which eq 'function')
17    {
18        @fields = qw(annotation fid genome);
19        $attr_types{$_} = "attr=\"string\"" for @fields;
20    }
21    elsif ($which eq 'genome')
22    {
23        @fields = qw(genome name taxonomy contigs);
24        $attr_types{$_} = "attr=\"string\"" for qw(genome name);
25    }
26    elsif ($which eq 'attrib')
27    {
28        @fields = qw(genome alias subsystem annotation fid);
29        $attr_types{$_} = 'attr="string"' foreach qw(annotation);
30    }
31    elsif ($which eq 'subsystem')
32    {
33        @fields = qw(subsystem curator version classification);
34        $attr_types{$_} = "attr=\"string\"" for @fields;
35    }
36    else
37    {
38        die "Unknown type $which\n";
39    }
40    
41  print <<END;  print <<END;
42  <?xml version="1.0" encoding="utf-8"?>  <?xml version="1.0" encoding="utf-8"?>
43  <sphinx:docset>  <sphinx:docset>
44  <sphinx:schema>  <sphinx:schema>
45  <sphinx:field name="fid"/>  END
46  <sphinx:field name="annotation"/>  print "<sphinx:field name=\"$_\" $attr_types{$_}/>\n" for @fields;
47  <sphinx:field name="content"/>  print <<END;
48  </sphinx:schema>  </sphinx:schema>
49  END  END
50    
51  my %tmap = (peg => 1, rna => 2);  my %tmap = (peg => 1, rna => 2);
52    
53  for my $genome ($fig->genomes(1))  my @genomes;
54    if (my $glist = $ENV{SPHINX_INDEX_ONLY})
55    {
56        @genomes = split(/,/, $glist);
57    }
58    else
59    {
60        @genomes = $fig->genomes(1);
61    }
62    
63    if ($which eq 'subsystem')
64    {
65        &index_subsystems;
66        print "</sphinx:docset>\n";
67        exit;
68    }
69    elsif ($which eq 'genome')
70    {
71        &index_genomes(\@genomes);
72        print "</sphinx:docset>\n";
73        exit;
74    }
75    
76    
77    #
78    # Ingest the subsystem index.
79    #
80    
81    my $next_id = 1;
82    
83    for my $genome (@genomes)
84  {  {
85      print STDERR "$genome\n";      print STDERR "$genome\n";
86      my $gs = $fig->genus_species($genome);      my $gs = escape($fig->genus_species($genome));
87      for my $feature (@{$fig->all_features_detailed_fast($genome)})      if ($which eq 'function')
88        {
89            my @fids = $fig->all_features($genome);
90            my $fns = $fig->function_of_bulk(\@fids);
91    
92            for my $fid (keys %$fns)
93            {
94                my $fn = escape($fns->{$fid});
95                my $docid = SeedSearch::fid_to_docid($fid);
96                print <<END;
97    <sphinx:document id="$docid">
98    <genome>$gs</genome>
99    <annotation>$fn</annotation>
100    </sphinx:document>
101    END
102            }
103        }
104        else
105        {
106            my %ss_info;
107    
108            my $sth = $fig->db_handle->{_dbh}->prepare(qq(SELECT i.protein, i.subsystem
109                                                          FROM subsystem_index i LEFT JOIN aux_roles a ON i.role = a.role
110                                                          WHERE i.protein LIKE 'fig|$genome.peg.%' AND a.subsystem IS NULL),
111                                                   { mysql_use_result => 1});
112            $sth->execute();
113            while (my $ent = $sth->fetchrow_arrayref())
114            {
115                my($prot, $ss) = @$ent;
116                $ss_info{$prot}->{$ss} = 1;
117            }
118    
119            my $gs = escape($fig->genus_species($genome));
120    
121            my $all_data = $fig->all_features_detailed_fast($genome);
122    
123            my $ext_aliases_l = $fig->db_handle->SQL(qq(SELECT id, alias
124                                                        FROM ext_alias
125                                                        WHERE id like 'fig|${genome}.%'));
126            my %ext_aliases;
127            map { $ext_aliases{$_->[0]}->{$_->[1]}++ } @$ext_aliases_l;
128    
129            for my $feature (@$all_data)
130      {      {
131          my($fid, $loc, $aliases, $type, $b, $e, $func, $who) = @$feature;          my($fid, $loc, $aliases, $type, $b, $e, $func, $who) = @$feature;
132    
133          $func = encode_utf8($func);              # my @ss = $fig->peg_to_subsystems($fid, 1, 1);
134          $func =~ s/&/&amp;/g;              my @ss = keys %{$ss_info{$fid}};
135          $func =~ s/</&lt;/g;              @ss = map { defined($_) ? encode_utf8($_) : () } @ss;
136          $func =~ s/>/&gt;/g;              my $ss = escape(join("\n", map { s/_/ /g; $_ } @ss));
137          $aliases =~ s/&/&amp;/g;  
138          $aliases =~ s/</&lt;/g;              $func = defined($func) ? escape($func) : "";
139          $aliases =~ s/>/&gt;/g;              my $efid = escape($fid);
140          $genome =~ s/&/&amp;/g;  
141          $genome =~ s/</&lt;/g;              my %aliases = map { $_ => 1 } split(",", $aliases);
142          $genome =~ s/>/&gt;/g;              map { $aliases{$_} = 1 } keys %{$ext_aliases{$fid}};
143          $aliases =~ s/,/ /g;              my @aliases = keys %aliases;
144          if ($fid =~ /^fig\|(\d+)\.(\d+)\.([^.]+)\.(\d+)$/)              my $alias_txt = "";
145          {              if (@aliases)
146              my ($g, $ext, $type, $num) = ($1, $2, $3, $4);              {
147              my $tnum = $tmap{$type};                  $alias_txt = escape(join("\n",
148              my $enc = $g << 26 | $ext << 18 | $tnum << 16 | $num;                                           map { s/&/&amp;/g;
149                                                   s/</&lt;/g;
150                                                   s/>/&gt;/g;
151                                                   $_ } @aliases));
152                }
153                my $docid = SeedSearch::fid_to_docid($fid);
154              print <<END;              print <<END;
155  <sphinx:document id="$enc">  <sphinx:document id="$docid">
156  <fid>$fid</fid>  <genome>$genome $gs</genome>
157    <fid>$efid</fid>
158  <annotation>$func</annotation>  <annotation>$func</annotation>
159  <content>$genome $gs  <alias>$alias_txt</alias>
160  $aliases</content>  <subsystem>$ss</subsystem>
161  </sphinx:document>  </sphinx:document>
162  END  END
163          }          }
164      }      }
165  }  }
166  print "</sphinx:docset>\n";  print "</sphinx:docset>\n";
167    
168    sub index_genomes
169    {
170        my($genomes) = @_;
171        my $i = 1;
172        for my $g (@$genomes)
173        {
174            my $gs = escape($fig->genus_species($g));
175            my $tax =escape($fig->taxonomy_of($g));
176    
177            my $contigs = escape(join(" ", $fig->all_contigs($g)));
178    
179            print "<sphinx:document id=\"$i\">\n";
180    
181            print "<genome>$g</genome>\n";
182            print "<name>$gs</name>\n";
183            print "<contigs>$contigs</contigs>\n";
184            print "<taxonomy>$tax</taxonomy>\n";
185            print "</sphinx:document>\n";
186            $i++;
187        }
188    }
189    
190    sub index_subsystems
191    {
192        my $i = 1;
193        my @ss = $fig->all_subsystems_detailed();
194        for my $ent (@ss)
195        {
196            print "<sphinx:document id=\"$i\">\n";
197            $ent->{subsystem} =~ s/_/ /g;
198            for my $f (@fields)
199            {
200                print "<$f>" . escape($ent->{$f}) . "</$f>\n";
201            }
202            print "</sphinx:document>\n";
203            $i++;
204        }
205    }
206    
207    sub escape
208    {
209        my($s) = @_;
210        return "" unless defined($s);
211        $s = encode_utf8($s);
212        $s =~ s/&/&amp;/g;
213        $s =~ s/</&lt;/g;
214        $s =~ s/>/&gt;/g;
215        return $s;
216    }

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.9

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3