[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.5, Mon Jun 7 20:55:01 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="genome"/>  print <<END;
 <sphinx:field name="alias"/>  
 <sphinx:field name="subsystem"/>  
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      $gs =~ s/&/&amp;/g;      if ($which eq 'function')
88      $gs =~ s/</&lt;/g;      {
89      $gs =~ s/>/&gt;/g;          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);      my $all_data = $fig->all_features_detailed_fast($genome);
122      my $all_aliases = $fig->feature_aliases_bulk([ map { $_->[0] } @$all_data ]);  
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)      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          $aliases = $all_aliases->{$fid};              # my @ss = $fig->peg_to_subsystems($fid, 1, 1);
134                my @ss = keys %{$ss_info{$fid}};
         my @ss = $fig->peg_to_subsystems($fid, 1, 1);  
135          @ss = map { defined($_) ? encode_utf8($_) : () } @ss;          @ss = map { defined($_) ? encode_utf8($_) : () } @ss;
136          my $ss = join("\n", map { s/_/ /g; $_ } @ss);              my $ss = escape(join("\n", map { s/_/ /g; $_ } @ss));
137          $ss =~ s/&/&amp;/g;  
138          $ss =~ s/</&lt;/g;              $func = defined($func) ? escape($func) : "";
139          $ss =~ s/>/&gt;/g;              my $efid = escape($fid);
140    
141          $func = defined($func) ? encode_utf8($func) : "";              my %aliases = map { $_ => 1 } split(",", $aliases);
142          $func =~ s/&/&amp;/g;              map { $aliases{$_} = 1 } keys %{$ext_aliases{$fid}};
143          $func =~ s/</&lt;/g;              my @aliases = keys %aliases;
144          $func =~ s/>/&gt;/g;              my $alias_txt = "";
145          if ($aliases)              if (@aliases)
146          {              {
147              $aliases = join("\n", @$aliases);                  $alias_txt = escape(join("\n",
148              $aliases =~ s/&/&amp;/g;                                           map { s/&/&amp;/g;
149              $aliases =~ s/</&lt;/g;                                                 s/</&lt;/g;
150              $aliases =~ s/>/&gt;/g;                                                 s/>/&gt;/g;
151          }                                                 $_ } @aliases));
152          if ($fid =~ /^fig\|(\d+)\.(\d+)\.([^.]+)\.(\d+)$/)              }
153          {              my $docid = SeedSearch::fid_to_docid($fid);
             my ($g, $ext, $type, $num) = ($1, $2, $3, $4);  
             my $tnum = $tmap{$type};  
             my $enc = $g << 26 | $ext << 18 | $tnum << 16 | $num;  
154              print <<END;              print <<END;
155  <sphinx:document id="$enc">  <sphinx:document id="$docid">
 <fid>$fid</fid>  
 <annotation>$func</annotation>  
156  <genome>$genome $gs</genome>  <genome>$genome $gs</genome>
157  <alias>$aliases</alias>  <fid>$efid</fid>
158    <annotation>$func</annotation>
159    <alias>$alias_txt</alias>
160  <subsystem>$ss</subsystem>  <subsystem>$ss</subsystem>
161  </sphinx:document>  </sphinx:document>
162  END  END
# Line 70  Line 164 
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.5  
changed lines
  Added in v.1.9

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3