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

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3