[Bio] / FortyEightMeta / mg_load_tax_db.pl Repository:
ViewVC logotype

Annotation of /FortyEightMeta/mg_load_tax_db.pl

Parent Directory Parent Directory | Revision Log Revision Log


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

1 : olson 1.1 #
2 :     # Load the taxonomy for a new sequence database for use
3 :     # with the MG-RAST.
4 :     #
5 :     # The database must have already been defined in the databases.xml.
6 :     #
7 :     # Specify the database with the name and version as specified in databases.xml.
8 :     #
9 :    
10 :     use Data::Dumper;
11 :     use FortyEightMeta::SimDB;
12 :     use FortyEightMeta::TaxStr;
13 :     use FIG_Config;
14 :     use DBrtns;
15 :     use FIG;
16 :    
17 :     use strict;
18 :    
19 :     @ARGV == 2 or die "Usage: $0 db-name db-version\n";
20 :    
21 :     my($mgdb, $mgdb2);
22 :     eval {
23 :     $mgdb = new DBrtns($FIG_Config::mgrast_dbms, $FIG_Config::mgrast_db,
24 :     $FIG_Config::mgrast_dbuser, $FIG_Config::mgrast_dbpass,
25 :     $FIG_Config::mgrast_dbport, $FIG_Config::mgrast_dbhost,
26 :     $FIG_Config::mgrast_dbsock);
27 :    
28 :     $mgdb2 = new DBrtns($FIG_Config::mgrast_dbms, $FIG_Config::mgrast_db,
29 :     $FIG_Config::mgrast_dbuser, $FIG_Config::mgrast_dbpass,
30 :     $FIG_Config::mgrast_dbport, $FIG_Config::mgrast_dbhost,
31 :     $FIG_Config::mgrast_dbsock);
32 :     };
33 :     if ($@ or !defined($mgdb))
34 :     {
35 :     die "cannot connect to database: $@";
36 :     }
37 :    
38 :     my $db_name = shift;
39 :     my $db_version = shift;
40 :    
41 : olson 1.2 my $simdb = FortyEightMeta::SimDB->new($FIG_Config::mgrast_database_def);
42 : olson 1.1
43 :     my @db_files = $simdb->db_files_for_database_version($db_name, $db_version);
44 :    
45 :     if (@db_files == 0)
46 :     {
47 :     die "No files found for database $db_name version $db_version\n";
48 :     }
49 :    
50 :     my $errs;
51 :     for my $d (@db_files)
52 :     {
53 :     my $tax = $d->{file};
54 :     if (($tax eq '' or ! -f $tax) and !$d->{special})
55 :     {
56 :     warn "Tax file missing or cannot be opened\n";
57 :     $errs++;
58 :     }
59 :     if ($d->{name} eq '')
60 :     {
61 :     warn "Missing tax db name\n";
62 :     $errs++;
63 :     }
64 :     }
65 :    
66 :     die "Validation errors occured, exiting.\n" if $errs;
67 :    
68 :     #
69 :     # We're good to go.
70 :     #
71 :     # See if we have a dbid assigned for this database version yet.
72 :     #
73 :    
74 :     my $dbh = $mgdb->{_dbh};
75 :    
76 :     my $tax_str = new FortyEightMeta::TaxStr($mgdb2->{_dbh});
77 :     my $tax_insert = $dbh->prepare(qq(INSERT INTO rdp_to_tax(dbid, seq_num, tax_str) VALUES (?, ?, ?)));
78 :    
79 :     for my $d (@db_files)
80 :     {
81 :     my $dbid = get_or_assign_dbid($dbh, $db_name, $db_version, $d->{name});
82 :    
83 :     if ($d->{file})
84 :     {
85 :     $dbh->begin_work();
86 :     $dbh->do(qq(DELETE FROM rdp_to_tax WHERE dbid = ?), undef, $dbid);
87 :     load_file($dbid, $d->{file});
88 :     $dbh->commit();
89 :     }
90 :     elsif ($d->{special})
91 :     {
92 :     $dbh->begin_work();
93 :     $dbh->do(qq(DELETE FROM rdp_to_tax WHERE dbid = ?), undef, $dbid);
94 :     handle_special($dbid, $d);
95 :     $dbh->commit();
96 :     }
97 :     }
98 :    
99 :     $tax_insert->finish();
100 :     undef $tax_insert;
101 :     undef $tax_str;
102 :     $dbh->disconnect();
103 :    
104 :     sub handle_special
105 :     {
106 :     my($dbid, $d) = @_;
107 :    
108 :     if ($d->{special} eq 'seed_genomes')
109 :     {
110 :     load_seed_genomes($dbid);
111 :     }
112 :     }
113 :    
114 :     #
115 :     # Load tax information from the SEED genomes.
116 :     #
117 :     sub load_seed_genomes
118 :     {
119 :     my($dbid) = @_;
120 :    
121 :     my $fig = new FIG;
122 :     $fig or die "cannot create FIG object";
123 :    
124 :     $dbh->do(qq(COPY rdp_to_tax FROM STDIN));
125 :    
126 :     for my $g (sort { &FIG::by_genome_id($a, $b) } $fig->genomes())
127 :     {
128 :     my $tax = $fig->taxonomy_of($g);
129 :    
130 :     my @tax = split(/;\s*/, $tax);
131 :     my $tstr = join(":", map { $tax_str->tax_name_to_id($_) } @tax);
132 :    
133 :     $dbh->pg_putline(join("\t", $dbid, $g, $tstr). "\n");
134 :     }
135 :     $dbh->pg_endcopy();
136 :     }
137 :    
138 :    
139 :     sub load_file
140 :     {
141 :     my($dbid, $file) = @_;
142 :    
143 :     $dbh->do(qq(COPY rdp_to_tax FROM STDIN));
144 :    
145 :     open(F, "<", $file) or die "Cannot open $file: $!";
146 :    
147 :     print "Load $file\n";
148 :     open(T, ">/tmp/t");
149 :    
150 :     while (<F>)
151 :     {
152 :     chomp;
153 :     my($id, @tax) = split(/\t/);
154 :    
155 :     my $tstr = join(":", map { $tax_str->tax_name_to_id($_) } @tax);
156 :     #$tax_insert->execute($dbid, $id, $tstr);
157 :     my $line = join("\t", $dbid, $id, $tstr) . "\n";
158 :    
159 :     $dbh->pg_putline($line);
160 :    
161 :     # last if $. > 1000;
162 :     }
163 :     $dbh->pg_endcopy();
164 :    
165 :     close(T);
166 :     close(F);
167 :     print "Finished $file\n";
168 :     }
169 :    
170 :    
171 :     sub get_or_assign_dbid
172 :     {
173 :     my($dbh, $name, $version, $dbname) = @_;
174 :    
175 :     $dbh->begin_work();
176 :     my $res = $dbh->selectall_arrayref(qq(SELECT dbid
177 :     FROM seq_db
178 :     WHERE name = ? AND version = ? AND tax_db_name = ?), undef,
179 :     $name, $version, $dbname);
180 :     my $id;
181 :     if (@$res == 0)
182 :     {
183 :     #
184 :     # Assign.
185 :     #
186 :     $res = $dbh->selectcol_arrayref(qq(SELECT MAX(dbid) FROM seq_db));
187 :     $id = defined($res->[0]) ? $res->[0] + 1 : 1;
188 :     print "new id=$id\n";
189 :     $dbh->do(qq(INSERT INTO seq_db (dbid, name, version, tax_db_name) VALUES (?, ?, ?, ?)),
190 :     undef, $id, $name, $version, $dbname);
191 :     }
192 :     else
193 :     {
194 :     $id = $res->[0]->[0];
195 :     print "Found existing id $id\n";
196 :     }
197 :     $dbh->commit();
198 :     return $id;
199 :     }

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3