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

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3