[Bio] / FigKernelScripts / index_sims.pl Repository:
ViewVC logotype

Annotation of /FigKernelScripts/index_sims.pl

Parent Directory Parent Directory | Revision Log Revision Log


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

1 : efrank 1.1 # -*- perl -*-
2 : olson 1.9 #
3 :     # Copyright (c) 2003-2006 University of Chicago and Fellowship
4 :     # for Interpretations of Genomes. All Rights Reserved.
5 :     #
6 :     # This file is part of the SEED Toolkit.
7 :     #
8 :     # The SEED Toolkit is free software. You can redistribute
9 :     # it and/or modify it under the terms of the SEED Toolkit
10 :     # Public License.
11 :     #
12 :     # You should have received a copy of the SEED Toolkit Public License
13 :     # along with this program; if not write to the University of Chicago
14 :     # at info@ci.uchicago.edu or the Fellowship for Interpretation of
15 :     # Genomes at veronika@thefig.info or download a copy from
16 :     # http://www.theseed.org/LICENSE.TXT.
17 :     #
18 :    
19 : efrank 1.1
20 : olson 1.10 #
21 :     # Usage: index_sims [--table tablename] [--dir sims-dir] [ File1 File2 ... ]
22 : olson 1.5 #
23 :     # If available, it uses the program index_sims_file
24 :     #
25 :    
26 : efrank 1.1 use strict;
27 :     use FIG;
28 :     use DBrtns;
29 : parrello 1.8 use Tracer;
30 : olson 1.10 use Getopt::Long;
31 :    
32 : olson 1.11 my $usage = "Usage: $0 [--dbname database-name] [--table tablename] [--dir sims-dir] [ File1 File2 ... ]";
33 : efrank 1.1
34 : olson 1.11 my $sims_db;
35 : olson 1.10 my $sims_dir;
36 :     my $new_sims_dir;
37 :     my $seeks_table = "sim_seeks";
38 :     my $help = 0;
39 : efrank 1.1
40 : olson 1.5 my( $sim_file, @sim_files );
41 : efrank 1.1
42 : olson 1.10 my $rc = GetOptions("dir=s" => \$sims_dir,
43 :     "table=s" => \$seeks_table,
44 : olson 1.11 "dbname=s" => \$sims_db,
45 : olson 1.10 "help" => \$help);
46 :    
47 :     $rc or die "$usage\n";
48 :    
49 :     if ($help)
50 :     {
51 :     print "$usage\n";
52 :     exit 0;
53 :     }
54 :    
55 : olson 1.11 if ($sims_db)
56 :     {
57 :     $FIG_Config::db = $sims_db;
58 :     }
59 :    
60 :     my $fig = new FIG;
61 :     my $dbf = $fig->db_handle;
62 :    
63 :     my $seeks_file = "$FIG_Config::temp/sims_seeks_tmp.$$";
64 :    
65 :    
66 : olson 1.10 #
67 :     # Traditional usage.
68 :     #
69 :     if ($sims_dir eq '')
70 :     {
71 :     $sims_dir = "$FIG_Config::data/Sims";
72 :     $new_sims_dir = "$FIG_Config::data/NewSims";
73 :     }
74 :    
75 :     print "Indexing sims_dir=$sims_dir new=$new_sims_dir seeks=$seeks_table\n";
76 :     print "Files: @ARGV\n";
77 :    
78 : olson 1.5 #
79 :     # Build the list of files to be indexed:
80 :     #
81 : efrank 1.1
82 : parrello 1.8 if ( @ARGV == 0 ) {
83 : olson 1.10 Trace("Reading sim directory.") if T(2);
84 :     opendir( SIMSDIR, $sims_dir ) || Confess("Could not open sims directory $sims_dir");
85 : olson 1.5 @sim_files = map { "$sims_dir/$_" } grep { $_ !~ /^\./ } readdir( SIMSDIR );
86 :     closedir( SIMSDIR );
87 : efrank 1.1
88 : olson 1.10 if ( $new_sims_dir and -d $new_sims_dir ) {
89 :     opendir( SIMSDIR, $new_sims_dir ) || Confess("Could not open new sims $new_sims_dir");
90 :     push @sim_files, map { "$new_sims_dir/$_" } grep { $_ !~ /^\./ } readdir( SIMSDIR );
91 :     closedir( SIMSDIR );
92 : olson 1.5 }
93 :    
94 : parrello 1.8 if ( @sim_files ) {
95 : olson 1.10 $dbf->drop_table( tbl => $seeks_table );
96 :     $dbf->create_table( tbl => $seeks_table,
97 : olson 1.12 flds => "id varchar(64), "
98 : parrello 1.8 . "fileN INTEGER, "
99 :     . "seek INTEGER, "
100 :     . "len INTEGER"
101 :     );
102 : efrank 1.1 }
103 : parrello 1.8 } else {
104 : efrank 1.1 @sim_files = @ARGV;
105 : olson 1.5 }
106 :    
107 :     my ( $v, $contigfilelist );
108 :    
109 :     #
110 :     # See if we can find the C program to do the indexing
111 :     #
112 :    
113 :     my $use_prog = 0;
114 :     if ( open VERSION_PIPE, "index_sims_file -v |"
115 :     and $v = <VERSION_PIPE>
116 :     and close VERSION_PIPE
117 :     and chomp $v
118 :     and $v eq "1.00"
119 : parrello 1.8 ) {
120 : olson 1.5 $use_prog = 1;
121 :     }
122 :    
123 :     my $nfiles = @sim_files;
124 :     my $n = 0;
125 :    
126 :     #
127 :     # For each file, find the seeks and load them into the database:
128 :     #
129 : parrello 1.8 foreach $sim_file ( @sim_files ) {
130 : olson 1.5 $n++;
131 : parrello 1.8 Trace(" Indexing sims file $sim_file ($n of $nfiles)") if T(2);
132 : olson 1.5 my $fileN;
133 : parrello 1.8 if ( $fileN = $fig->file2N( $sim_file ) ) {
134 :     #
135 :     # Check if sims file is zero length, and skip it if so.
136 :     #
137 :    
138 :     if ((-s $sim_file) == 0) {
139 :     #
140 :     # Empty the file.
141 :     #
142 :     open(SEEK_FH, ">$seeks_file");
143 :     close(SEEK_FH);
144 :     } else {
145 :     ( $use_prog &&
146 :     ( system( "index_sims_file $fileN < $sim_file > $seeks_file" ) == 0 )
147 :     )
148 :     || index_sims_file( $sim_file, $fileN, $seeks_file )
149 :     || Confess("ERROR: index_sims failed on sim file $sim_file");
150 :     }
151 :    
152 :     if ( @ARGV > 0 ) {
153 : olson 1.10 $dbf->SQL("DELETE FROM $seeks_table WHERE ( fileN = $fileN )");
154 : parrello 1.8 }
155 : olson 1.10 $dbf->load_table( tbl => $seeks_table, file => $seeks_file );
156 : overbeek 1.3 }
157 : efrank 1.1 }
158 :    
159 : olson 1.5 unlink( $seeks_file );
160 : efrank 1.1
161 : olson 1.5 #
162 :     # Index the database file:
163 :     #
164 : efrank 1.1
165 : parrello 1.8 if ( @ARGV == 0 ) {
166 : olson 1.10 Trace("Indexing $seeks_table table.");
167 :     $dbf->create_index( tbl => $seeks_table,
168 :     idx => "${seeks_table}_id_ix",
169 : overbeek 1.2 type => "btree",
170 :     flds => "id"
171 :     );
172 : olson 1.10 $dbf->vacuum_it( $seeks_table );
173 : overbeek 1.2 }
174 : parrello 1.8 Trace("Sim index processing complete.") if T(2);
175 : efrank 1.1
176 : olson 1.5 #
177 :     # The perl version in case the C version fails:
178 :     #
179 :    
180 :     sub index_sims_file {
181 :     my( $file, $fileN, $seeks_file ) = @_;
182 :     my( $line, $offset, $curr, $nxt_offset, $ln );
183 :    
184 :     open( SIMS, "<$file" ) || return 0;
185 :     open( SEEKS, ">$seeks_file") || ( close( SIMS ) && return 0 );
186 :    
187 :     $offset = tell SIMS;
188 :     $line = <SIMS>;
189 : parrello 1.8 while ( defined( $line ) && ( $line =~ /^(\S+)/ ) ) {
190 :     $curr = $1;
191 :     while ( $line && ( $line =~ /^(\S+)/ ) && ( $1 eq $curr ) ) {
192 :     $nxt_offset = tell SIMS;
193 :     $line = <SIMS>;
194 :     }
195 :     $ln = $nxt_offset - $offset;
196 :     print SEEKS "$curr\t$fileN\t$offset\t$ln\n";
197 :     $offset = $nxt_offset;
198 : efrank 1.1 }
199 : olson 1.5
200 :     close( SEEKS );
201 :     close( SIMS );
202 :    
203 :     return 1;
204 : efrank 1.1 }
205 : olson 1.5
206 :     1;

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3