[Bio] / FortyEight / pull_sims_from_database.pl Repository:
ViewVC logotype

Annotation of /FortyEight/pull_sims_from_database.pl

Parent Directory Parent Directory | Revision Log Revision Log


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

1 : olson 1.1 #
2 :     # Given a fasta file, pull the sims from the a seed database. This is
3 :     # functionality similar to the guts of the sim server or FIG::osims,
4 :     # but meant to operate in a more standalone environment (like the
5 :     # detached RAST code running on a standalone compute cluster).
6 :     #
7 :     # Write them to stdout, and write nonmatching IDs to stderr.
8 :     #
9 :     # Usage: pull_sims_from_database dsn user password table_name < fasta > sims 2> non-matching
10 :     #
11 :    
12 :     use FIG;
13 :     use Digest::MD5;
14 :     use Data::Dumper;
15 :     use DBI;
16 :     use Sim;
17 :     use strict;
18 :    
19 :     @ARGV == 4 or die "Usage: $0 database-dsn user password table_name < fasta > sims 2> non-matching-ids\n";
20 :    
21 :     my $fig = new FIG;
22 :    
23 :     my $dsn = shift;
24 :     my $user = shift;
25 :     my $pw = shift;
26 :     my $table = shift;
27 :    
28 :     my $dbh = DBI->connect($dsn, $user, $pw);
29 :     $dbh or die "Cannot connect to dtabase $dsn";
30 :    
31 :     my $sth = $dbh->prepare(qq(SELECT file, seek, len
32 :     FROM file_table f JOIN $table s ON s.fileN = f.fileno
33 :     WHERE s.id= ?));
34 :     my $fhin = \*STDIN;
35 :    
36 :    
37 :     {
38 :     my %id_to_md5;
39 :     my %md5_to_id;
40 :     my @ids;
41 :     my @md5s;
42 :     while ((my($id, $seqp, undef) = &FIG::read_fasta_record($fhin)))
43 :     {
44 :     my $md5 = Digest::MD5::md5_hex(uc($$seqp));
45 :     my $mid = "gnl|md5|$md5";
46 :     $id_to_md5{$id} = $mid;
47 :     $md5_to_id{$mid} = $id;
48 :     push(@ids, $id);
49 :     push(@md5s, $mid);
50 :     }
51 :    
52 :     my $chunksize = 200;
53 :    
54 :     my %seen = %md5_to_id;
55 :     while (@md5s)
56 :     {
57 :     my @chunk = splice(@md5s, 0, $chunksize);
58 :     #print "process chunk\n";
59 :     #print STDERR "@chunk \n";
60 :    
61 :     my $sims = get_sims(\@chunk);
62 :    
63 :     my $last;
64 :     while (my $sim = shift @$sims)
65 :     {
66 :     if ($sim->id1 ne $last)
67 :     {
68 :     delete $seen{$last};
69 :     $last = $sim->id1;
70 :     }
71 :    
72 :     my $new = $md5_to_id{$sim->id1};
73 :     if ($new)
74 :     {
75 :     $sim->[0] = $new;
76 :     }
77 :    
78 :     print join("\t", @$sim), "\n";
79 :     }
80 :     delete $seen{$last};
81 :     }
82 :    
83 :     print STDERR "$_\n" for sort { &FIG::by_fig_id($a, $b) } values %seen;
84 :     }
85 :    
86 :     sub get_sims
87 :     {
88 :     my($ids) = @_;
89 :    
90 :     my @sims;
91 :     for my $id (@$ids)
92 :     {
93 :     $sth->execute($id);
94 :     while (my $r = $sth->fetchrow_arrayref())
95 :     {
96 :     my($file, $seek, $len) = @$r;
97 : olson 1.2 if ($file !~ m,^/,)
98 :     {
99 :     $file = "$FIG_Config::fig_disk/$file";
100 :     }
101 :    
102 : olson 1.1 my $fh = $fig->openF($file);
103 :     push @sims, map { bless [ split( /\t/, $_ ), 'blastp'], 'Sim' }
104 :     @{ &FIG::read_block( $fh, $seek, $len - 1 ) };
105 :     }
106 :     }
107 :     return \@sims;
108 :     }

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3