[Bio] / Babel / bin / load_md5rna2db.pl Repository:
ViewVC logotype

Annotation of /Babel/bin/load_md5rna2db.pl

Parent Directory Parent Directory | Revision Log Revision Log


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

1 : tharriso 1.1 #!/usr/bin/env perl
2 :    
3 :     use strict;
4 :     use warnings;
5 :    
6 :     use Data::Dumper;
7 :     use Carp;
8 :     use DBI;
9 :     use Getopt::Long;
10 :    
11 :     use FIG_Config;
12 :    
13 :     my $verbose = 0;
14 :     my $datafile = '';
15 :     my $taxfile = '';
16 :     my $index = 0;
17 :     my $test = 0;
18 :     my $tmpdir = "/tmp";
19 :     my $dbname = $FIG_Config::babel_db;
20 :     my $dbhost = $FIG_Config::babel_dbhost;
21 :     my $dbuser = $FIG_Config::babel_dbuser;
22 :     my $usage = qq(
23 :     DESCRIPTION: ($0)
24 :     load the ACH database tables with the inputted file data. Must be postgresql db.
25 :    
26 :     USAGE:
27 :     --datafile source_data Required.
28 :     --taxfile source_tax Required.
29 :     --tmp_dir dir Optional. Dir to create temperary files. Default is '$tmpdir'
30 :     --dbhost db user Optional. Server of database. Default is '$dbhost'
31 :     --dbname db name Optional. Name of database. Default is '$dbname'
32 :     --dbuser db user Optional. Owner of database. Default is '$dbuser'
33 :     --index Optional. Create and load indexes when done. Default is off.
34 :     --test Optional. Run without psql COPY and index drop/load. Default is off.
35 :     --verbose Optional. Verbose output. Default is off.
36 :    
37 :     );
38 :     if ( (@ARGV > 0) && ($ARGV[0] =~ /-h/) ) { print STDERR $usage; exit; }
39 :     if ( ! &GetOptions ('verbose!' => \$verbose,
40 :     'index!' => \$index,
41 :     'test!' => \$test,
42 :     'datafile=s' => \$datafile,
43 :     'taxfile=s' => \$taxfile,
44 :     'tmp_dir:s' => \$tmpdir,
45 :     'dbhost:s' => \$dbhost,
46 :     'dbname:s' => \$dbname,
47 :     'dbuser:s' => \$dbuser
48 :     ) )
49 :     { print STDERR $usage; exit; }
50 :    
51 :     unless ($datafile && $taxfile && (-s $datafile) && (-s $taxfile)) { print STDERR $usage; exit; }
52 :    
53 :     my $dbh = DBI->connect("DBI:Pg:dbname=$dbname;host=$dbhost", $dbuser, '', {AutoCommit => 0});
54 :     unless ($dbh) { print STDERR "Error: " , DBI->error , "\n"; }
55 :    
56 :     my $psql = "psql -U $dbuser -h $dbhost -d $dbname";
57 :     my $taxa = {};
58 :     my $tbls = { tbl => { md5 => "md5_rna",
59 :     func => "functions",
60 :     org => "organisms_ncbi",
61 :     src => "sources"
62 :     },
63 : tharriso 1.3 idx => { md5 => ["id","md5","function","organism","tax_rank","source"],
64 : tharriso 1.1 func => ["name"],
65 :     src => ["name"]
66 :     } };
67 :    
68 :     open(TFILE, "$taxfile") || die "Can't open file $taxfile\n";
69 :     if ($verbose) { print STDERR "Parsing $taxfile ... \n"; }
70 :     while (my $line = <TFILE>) {
71 :     chomp $line;
72 :     my ($id, $tax) = split(/\t/, $line);
73 :     unless ($id && $tax) { next; }
74 :     my @tax_set = map { &clean_wsp($_) } split(/;/, $tax);
75 : tharriso 1.2 my $tax_rank = &rank_taxonomy($tax, join(" ", @tax_set[0,1]));
76 : tharriso 1.3 $taxa->{$id} = [ $tax_rank, [ reverse @tax_set ] ];
77 : tharriso 1.1 }
78 :     close TFILE;
79 :    
80 :     &drop_table_indexes($dbh, $tbls->{tbl}{func}, $verbose);
81 :     &drop_table_indexes($dbh, $tbls->{tbl}{src}, $verbose);
82 :    
83 :     my $func_ids = &get_id_set($dbh, $psql, $tbls->{tbl}{func}, '3', 'name', $datafile, $verbose);
84 :     my $src_ids = &get_id_set($dbh, $psql, $tbls->{tbl}{src}, '5', 'name', $datafile, $verbose);
85 :     my $org_ids = &get_name_id_from_db($dbh, $tbls->{tbl}{org}, $verbose);
86 : tharriso 1.3 my ($funcID, $orgID, $srcID, $rankID);
87 : tharriso 1.1
88 :     my $data_tmp = "$tmpdir/data." . unpack("H*", pack("Nn", time, $$));
89 :     open(DTMP, ">$data_tmp") || die "Can not open $data_tmp: $!";
90 :     open(DFILE, "$datafile") || die "Can't open file $datafile\n";
91 :    
92 :     if ($verbose) { print STDERR "Parsing $datafile ... \n"; }
93 :     my $count = 0;
94 :     while (my $line = <DFILE>) {
95 :     chomp $line;
96 :     my ($md5, $id, $func, $org, $source) = split(/\t/, $line);
97 : tharriso 1.4 unless ($md5 && $id && $source && exists($taxa->{$id})) { next; }
98 : tharriso 1.1
99 : tharriso 1.4 $funcID = ($func && exists($func_ids->{$func})) ? $func_ids->{$func} : '\\N';
100 :     $srcID = $src_ids->{$source};
101 : tharriso 1.3 $orgID = '';
102 :     $rankID = $taxa->{$id}[0];
103 : tharriso 1.2
104 : tharriso 1.1 if ($org && exists($org_ids->{$org})) {
105 :     $orgID = $org_ids->{$org};
106 :     }
107 : tharriso 1.3 else {
108 :     foreach my $t ( @{$taxa->{$id}[1]} ) {
109 : tharriso 1.1 if (exists $org_ids->{$t}) {
110 :     $orgID = $org_ids->{$t};
111 :     last;
112 :     }
113 :     }
114 :     }
115 :    
116 : tharriso 1.3 if ($md5 && $id && $funcID && $orgID && $srcID && $rankID) {
117 :     print DTMP join("\t", ($md5, $id, $funcID, $orgID, $rankID, $srcID)) . "\n";
118 : tharriso 1.1 }
119 :    
120 :     $count += 1;
121 : tharriso 1.3 unless ($count % 100000) {
122 :     if ($verbose) { print STDERR "$count\t $md5 , $id , $func ($funcID) , $org ($orgID) , $rankID, $source ($srcID)\n"; }
123 : tharriso 1.1 }
124 :     }
125 :     close DFILE;
126 :     close DTMP;
127 :    
128 :     &drop_table_indexes($dbh, $tbls->{tbl}{md5}, $verbose);
129 : tharriso 1.3 &psql_copy($psql, $tbls->{tbl}{md5}, 'md5,id,function,organism,tax_rank,source', $data_tmp, $verbose);
130 : tharriso 1.1 $dbh->commit;
131 :    
132 :     if ($index) {
133 :     foreach (('func','src','md5')) {
134 :     &create_table_indexes($dbh, $tbls->{tbl}{$_}, $tbls->{idx}{$_}, $verbose);
135 :     }
136 :     }
137 :    
138 :     $dbh->commit;
139 :     $dbh->disconnect;
140 :     if ($verbose) { print STDERR "Done.\n"; }
141 :     exit 0;
142 :    
143 :    
144 :     sub drop_table_indexes {
145 :     my ($dbh, $table, $v) = @_;
146 :    
147 :     if ($test) { return; }
148 :     my @rv;
149 :     if ($v) { print STDERR "Disabling indexes for $table ...\n"; }
150 :     my $sql = qq(SELECT ci.relname FROM pg_index i, pg_class ci, pg_class ct
151 :     WHERE i.indexrelid=ci.oid AND i.indrelid=ct.oid AND i.indisprimary is false AND ct.relname='$table');
152 :     my $idx = $dbh->selectcol_arrayref($sql);
153 :     if ($idx && (@$idx > 0)) {
154 :     foreach my $i (@$idx) { push @rv, $dbh->do("DROP INDEX IF EXISTS $i"); }
155 :     }
156 :     $dbh->commit;
157 :     if ($v) { print STDERR join("\n", @rv) . "\n"; }
158 :     }
159 :    
160 :     sub create_table_indexes {
161 :     my ($dbh, $table, $indexes, $v) = @_;
162 :    
163 :     if ($test) { return; }
164 :     my @rv;
165 :     foreach my $i (@$indexes) {
166 :     my $x = $i;
167 :     $x =~ s/,/_/g;
168 :     my $sql = "CREATE INDEX ${table}_$x ON $table ($i)";
169 :     if ($v) { print STDERR "$sql\n"; }
170 :     push @rv, $dbh->do($sql);
171 :     }
172 :     $dbh->commit;
173 :     if ($v) { print STDERR join("\n", @rv) . "\n"; }
174 :     }
175 :    
176 :     sub psql_copy {
177 :     my ($cmd, $table, $cols, $file, $v) = @_;
178 :    
179 :     my $psql = qq($cmd -c "COPY $table ($cols) FROM '$file';");
180 :     unless (-s $file) {
181 :     print STDERR "No data in '$file' to COPY to '$table', skipping\n"; return;
182 :     }
183 :     if ($test) { print STDERR "\n$psql\n"; return; }
184 :    
185 :     my $run = &run_cmd($psql, $v);
186 :     #if ($run) { unlink($file); }
187 :     }
188 :    
189 :     sub get_id_set {
190 :     my ($dbh, $psql, $table, $cnum, $cname, $file, $v, $org_map) = @_;
191 :    
192 :     my $set = &get_name_id_from_db($dbh, $table, $v);
193 :     my $tmp = "$tmpdir/$table." . unpack("H*", pack("Nn", time, $$));
194 :     my $cmd = "cat $file | cut -f$cnum | sort -u | sed '/^\\s*\$/d' | tr -c '[:print:][:cntrl:]' '[?*]'";
195 :    
196 :     # if already has values in table, just get unique new ones
197 :     if ( scalar(keys %$set) > 0 ) {
198 :     print STDERR "Running $cmd ...\nOutputing unique $table to $tmp ... " if ($v);
199 :     open(TMP, ">$tmp") || die "Can not open $tmp: $!";
200 :     foreach my $n (`$cmd`) {
201 :     chomp $n;
202 :     if (! exists $set->{$n}) { print TMP &clean_text($n) . "\n"; }
203 :     }
204 :     close TMP;
205 :     print STDERR "Done\n" if ($v);
206 :     }
207 :     # else get unique all
208 :     else {
209 :     &run_cmd("$cmd > $tmp", $v);
210 :     }
211 :     &psql_copy($psql, $table, $cname, $tmp, $v);
212 :     return &get_name_id_from_db($dbh, $table, $v);
213 :     }
214 :    
215 :     sub get_name_id_from_db {
216 :     my ($dbh, $table, $v) = @_;
217 :    
218 :     print STDERR "Getting data for $table ... " if ($v);
219 :     my %set = ();
220 :     my $all = $dbh->selectall_arrayref("SELECT name, _id FROM $table");
221 :     if ($all && (@$all > 0)) {
222 :     %set = map { $_->[0], $_->[1] } @$all;
223 :     }
224 :     print STDERR "Done - " . scalar(keys %set) . " $table\n" if ($v);
225 :    
226 :     return \%set;
227 :     }
228 :    
229 :     sub clean_wsp {
230 :     my ($text) = @_;
231 :    
232 :     if (! $text) { return $text; }
233 :     my $clean = $text;
234 :     $clean =~ s/^\s+//;
235 :     $clean =~ s/\s+$//;
236 :     return $clean;
237 :     }
238 :    
239 :     sub clean_text {
240 :     my ($text) = @_;
241 :    
242 :     if (! $text) { return $text; }
243 :     my $clean = $text;
244 :     $clean =~ s/^\s+//;
245 :     $clean =~ s/\s+$//;
246 :     $clean =~ s/\\/\\\\/g; # escape the escapes
247 :     $clean =~ s/'/\\'/g; # escape the single quotes
248 :     return $clean;
249 :     }
250 :    
251 : tharriso 1.2 sub rank_taxonomy {
252 :     my ($tax, $top) = @_;
253 :     my $rank;
254 :    
255 :     ## enviromental
256 :     if ($tax =~ /(environmental samples|uncultured)/i) {
257 :     $rank = 3;
258 :     }
259 :     ## unknown
260 :     elsif ($top =~ /(artificial sequences|other sequences|unclassified|unidentified|unknown)/i) {
261 :     $rank = 2;
262 :     }
263 :     ## known
264 :     else {
265 :     $rank = 1;
266 :     }
267 :     return $rank;
268 :     }
269 :    
270 : tharriso 1.1 sub run_cmd {
271 :     my ($cmd, $v) = @_;
272 :    
273 :     if ($v) { print STDERR "Running: $cmd ...\n"; }
274 :     my $r = system($cmd);
275 :     if ($r == 0) {
276 :     return 1;
277 :     } else {
278 :     die "ERROR: $cmd: $!\n"
279 :     }
280 :     }

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3