[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.2 - (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 :     idx => { md5 => ["id","md5","function","organism","source"],
64 :     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 :     if ($tax_rank == 1) {
77 :     $taxa->{$id} = [ reverse @tax_set ];
78 :     }
79 : tharriso 1.1 }
80 :     close TFILE;
81 :    
82 :     &drop_table_indexes($dbh, $tbls->{tbl}{func}, $verbose);
83 :     &drop_table_indexes($dbh, $tbls->{tbl}{src}, $verbose);
84 :    
85 :     my $func_ids = &get_id_set($dbh, $psql, $tbls->{tbl}{func}, '3', 'name', $datafile, $verbose);
86 :     my $src_ids = &get_id_set($dbh, $psql, $tbls->{tbl}{src}, '5', 'name', $datafile, $verbose);
87 :     my $org_ids = &get_name_id_from_db($dbh, $tbls->{tbl}{org}, $verbose);
88 :     my ($funcID, $orgID, $srcID);
89 :    
90 :     my $data_tmp = "$tmpdir/data." . unpack("H*", pack("Nn", time, $$));
91 :     open(DTMP, ">$data_tmp") || die "Can not open $data_tmp: $!";
92 :     open(DFILE, "$datafile") || die "Can't open file $datafile\n";
93 :    
94 :     if ($verbose) { print STDERR "Parsing $datafile ... \n"; }
95 :     my $count = 0;
96 :     while (my $line = <DFILE>) {
97 :     chomp $line;
98 :     my ($md5, $id, $func, $org, $source) = split(/\t/, $line);
99 : tharriso 1.2 unless ($md5 && $id && exists($taxa->{$id})) { next; }
100 : tharriso 1.1
101 :     $funcID = ($func && exists($func_ids->{$func})) ? $func_ids->{$func} : '\\N';
102 :     $srcID = ($source && exists($src_ids->{$source})) ? $src_ids->{$source} : '\\N';
103 :     $orgID = '\\N';
104 : tharriso 1.2
105 : tharriso 1.1 if ($org && exists($org_ids->{$org})) {
106 :     $orgID = $org_ids->{$org};
107 :     }
108 :     elsif (exists $taxa->{$id}) {
109 :     foreach my $t ( @{$taxa->{$id}} ) {
110 :     if (exists $org_ids->{$t}) {
111 :     $orgID = $org_ids->{$t};
112 :     last;
113 :     }
114 :     }
115 :     }
116 :    
117 :     if ($md5 && $id && $funcID && $orgID && $srcID) {
118 :     print DTMP join("\t", ($md5, $id, $funcID, $orgID, $srcID)) . "\n";
119 :     }
120 :    
121 :     $count += 1;
122 :     unless ($count % 500000) {
123 :     if ($verbose) { print STDERR "$count\t $md5 , $id , $func ($funcID) , $org ($orgID) , $source ($srcID)\n"; }
124 :     }
125 :     }
126 :     close DFILE;
127 :     close DTMP;
128 :    
129 :     &drop_table_indexes($dbh, $tbls->{tbl}{md5}, $verbose);
130 :     &psql_copy($psql, $tbls->{tbl}{md5}, 'md5,id,function,organism,source', $data_tmp, $verbose);
131 :     $dbh->commit;
132 :    
133 :     if ($index) {
134 :     foreach (('func','src','md5')) {
135 :     &create_table_indexes($dbh, $tbls->{tbl}{$_}, $tbls->{idx}{$_}, $verbose);
136 :     }
137 :     }
138 :    
139 :     $dbh->commit;
140 :     $dbh->disconnect;
141 :     if ($verbose) { print STDERR "Done.\n"; }
142 :     exit 0;
143 :    
144 :    
145 :     sub drop_table_indexes {
146 :     my ($dbh, $table, $v) = @_;
147 :    
148 :     if ($test) { return; }
149 :     my @rv;
150 :     if ($v) { print STDERR "Disabling indexes for $table ...\n"; }
151 :     my $sql = qq(SELECT ci.relname FROM pg_index i, pg_class ci, pg_class ct
152 :     WHERE i.indexrelid=ci.oid AND i.indrelid=ct.oid AND i.indisprimary is false AND ct.relname='$table');
153 :     my $idx = $dbh->selectcol_arrayref($sql);
154 :     if ($idx && (@$idx > 0)) {
155 :     foreach my $i (@$idx) { push @rv, $dbh->do("DROP INDEX IF EXISTS $i"); }
156 :     }
157 :     $dbh->commit;
158 :     if ($v) { print STDERR join("\n", @rv) . "\n"; }
159 :     }
160 :    
161 :     sub create_table_indexes {
162 :     my ($dbh, $table, $indexes, $v) = @_;
163 :    
164 :     if ($test) { return; }
165 :     my @rv;
166 :     foreach my $i (@$indexes) {
167 :     my $x = $i;
168 :     $x =~ s/,/_/g;
169 :     my $sql = "CREATE INDEX ${table}_$x ON $table ($i)";
170 :     if ($v) { print STDERR "$sql\n"; }
171 :     push @rv, $dbh->do($sql);
172 :     }
173 :     $dbh->commit;
174 :     if ($v) { print STDERR join("\n", @rv) . "\n"; }
175 :     }
176 :    
177 :     sub psql_copy {
178 :     my ($cmd, $table, $cols, $file, $v) = @_;
179 :    
180 :     my $psql = qq($cmd -c "COPY $table ($cols) FROM '$file';");
181 :     unless (-s $file) {
182 :     print STDERR "No data in '$file' to COPY to '$table', skipping\n"; return;
183 :     }
184 :     if ($test) { print STDERR "\n$psql\n"; return; }
185 :    
186 :     my $run = &run_cmd($psql, $v);
187 :     #if ($run) { unlink($file); }
188 :     }
189 :    
190 :     sub get_id_set {
191 :     my ($dbh, $psql, $table, $cnum, $cname, $file, $v, $org_map) = @_;
192 :    
193 :     my $set = &get_name_id_from_db($dbh, $table, $v);
194 :     my $tmp = "$tmpdir/$table." . unpack("H*", pack("Nn", time, $$));
195 :     my $cmd = "cat $file | cut -f$cnum | sort -u | sed '/^\\s*\$/d' | tr -c '[:print:][:cntrl:]' '[?*]'";
196 :    
197 :     # if already has values in table, just get unique new ones
198 :     if ( scalar(keys %$set) > 0 ) {
199 :     print STDERR "Running $cmd ...\nOutputing unique $table to $tmp ... " if ($v);
200 :     open(TMP, ">$tmp") || die "Can not open $tmp: $!";
201 :     foreach my $n (`$cmd`) {
202 :     chomp $n;
203 :     if (! exists $set->{$n}) { print TMP &clean_text($n) . "\n"; }
204 :     }
205 :     close TMP;
206 :     print STDERR "Done\n" if ($v);
207 :     }
208 :     # else get unique all
209 :     else {
210 :     &run_cmd("$cmd > $tmp", $v);
211 :     }
212 :     &psql_copy($psql, $table, $cname, $tmp, $v);
213 :     return &get_name_id_from_db($dbh, $table, $v);
214 :     }
215 :    
216 :     sub get_name_id_from_db {
217 :     my ($dbh, $table, $v) = @_;
218 :    
219 :     print STDERR "Getting data for $table ... " if ($v);
220 :     my %set = ();
221 :     my $all = $dbh->selectall_arrayref("SELECT name, _id FROM $table");
222 :     if ($all && (@$all > 0)) {
223 :     %set = map { $_->[0], $_->[1] } @$all;
224 :     }
225 :     print STDERR "Done - " . scalar(keys %set) . " $table\n" if ($v);
226 :    
227 :     return \%set;
228 :     }
229 :    
230 :     sub clean_wsp {
231 :     my ($text) = @_;
232 :    
233 :     if (! $text) { return $text; }
234 :     my $clean = $text;
235 :     $clean =~ s/^\s+//;
236 :     $clean =~ s/\s+$//;
237 :     return $clean;
238 :     }
239 :    
240 :     sub clean_text {
241 :     my ($text) = @_;
242 :    
243 :     if (! $text) { return $text; }
244 :     my $clean = $text;
245 :     $clean =~ s/^\s+//;
246 :     $clean =~ s/\s+$//;
247 :     $clean =~ s/\\/\\\\/g; # escape the escapes
248 :     $clean =~ s/'/\\'/g; # escape the single quotes
249 :     return $clean;
250 :     }
251 :    
252 : tharriso 1.2 sub rank_taxonomy {
253 :     my ($tax, $top) = @_;
254 :     my $rank;
255 :    
256 :     ## enviromental
257 :     if ($tax =~ /(environmental samples|uncultured)/i) {
258 :     $rank = 3;
259 :     }
260 :     ## unknown
261 :     elsif ($top =~ /(artificial sequences|other sequences|unclassified|unidentified|unknown)/i) {
262 :     $rank = 2;
263 :     }
264 :     ## known
265 :     else {
266 :     $rank = 1;
267 :     }
268 :     return $rank;
269 :     }
270 :    
271 : tharriso 1.1 sub run_cmd {
272 :     my ($cmd, $v) = @_;
273 :    
274 :     if ($v) { print STDERR "Running: $cmd ...\n"; }
275 :     my $r = system($cmd);
276 :     if ($r == 0) {
277 :     return 1;
278 :     } else {
279 :     die "ERROR: $cmd: $!\n"
280 :     }
281 :     }

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3