[Bio] / FortyEightMeta / mg_chunk_sims.pl Repository:
ViewVC logotype

Annotation of /FortyEightMeta/mg_chunk_sims.pl

Parent Directory Parent Directory | Revision Log Revision Log


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

1 : olson 1.1 #
2 :     # Chunk a fasta file into pieces suitable for cluster BLAST calculations.
3 :     #
4 :     # We are provided the NR and peg.synonyms files that should be used for this.
5 :     #
6 :     # Usage: rp_chunk_sims -p blastprog -o 'blastopts' -n num-seqs -nr nr -j sims-job-dir fasta [fasta ...]
7 :     #
8 :     #
9 :     # We write a file task.list into sims-job-dir that contains the list of work units.
10 :     #
11 :     # The work units will write raw sims into sims-job-dir/sims.raw
12 :     #
13 :    
14 :     use strict;
15 :     use File::Basename;
16 :     use Cwd 'abs_path';
17 :    
18 : olson 1.2 my $usage = "$0 [-p blastprog] [-o blastopts] [-N num-chars] [-n num-seqs] -nr nr-file -j jobdir fasta [fasta...]";
19 : olson 1.1
20 :     my $blastprog = "blastp";
21 :     my $flags = "-m 8 -e 1.0e-5 -FF";
22 : olson 1.2 my $max_seqs;
23 :     my $max_chars;
24 : olson 1.1 my $nr_file;
25 :     my $jobdir;
26 :    
27 :     while (@ARGV)
28 :     {
29 :     my $opt = shift;
30 :     if ($opt eq '-p')
31 :     {
32 :     $blastprog = shift;
33 :     }
34 :     elsif ($opt eq '-o')
35 :     {
36 :     $flags = shift;
37 :     }
38 :     elsif ($opt eq '-n')
39 :     {
40 :     $max_seqs = shift;
41 :     }
42 : olson 1.2 elsif ($opt eq '-N')
43 :     {
44 :     $max_chars = shift;
45 :     }
46 : olson 1.1 elsif ($opt eq '-nr')
47 :     {
48 :     $nr_file = shift;
49 :     }
50 :     elsif ($opt eq '-j')
51 :     {
52 :     $jobdir = shift;
53 :     }
54 :     elsif ($opt =~ /^-/)
55 :     {
56 :     die "Invalid option $opt. Usage: $usage\n";
57 :     }
58 :     else
59 :     {
60 :     unshift(@ARGV, $opt);
61 :     last;
62 :     }
63 :     }
64 :    
65 :     $flags = "$flags -p $blastprog";
66 :    
67 :     if (@ARGV == 0)
68 :     {
69 :     die $usage;
70 :     }
71 :    
72 :     my @fasta_files = @ARGV;
73 :    
74 :     for my $f (@fasta_files)
75 :     {
76 :     -f $f or die "Fasta file $f does not exist\n";
77 :     }
78 :    
79 : olson 1.2 if (!defined($max_seqs) and !defined($max_chars))
80 :     {
81 :     die "Must pass either -n or -N option\n";
82 :     }
83 :    
84 : olson 1.1 -d $jobdir or mkdir $jobdir or die "Cannot mkdir $jobdir: $!\n";
85 :    
86 :     my $next_task = 1;
87 :     my $last_task;
88 :    
89 :     my $task_file = "$jobdir/task.list";
90 :     my $input_dir = "$jobdir/sims.in";
91 :     my $output_dir = "$jobdir/sims.raw";
92 :     my $error_dir = "$jobdir/sims.err";
93 :    
94 :     -d $input_dir or mkdir $input_dir or die "Cannot mkdir $input_dir: $!\n";
95 :     -d $output_dir or mkdir $output_dir or die "Cannot mkdir $output_dir: $!\n";
96 :     -d $error_dir or mkdir $error_dir or die "Cannot mkdir $error_dir: $!\n";
97 :    
98 :     $input_dir = abs_path($input_dir);
99 :     $output_dir = abs_path($output_dir);
100 :     $error_dir = abs_path($error_dir);
101 :    
102 :     open(TASK, ">$task_file") or die "Cannot write $task_file: $!";
103 :    
104 :     for my $file (@fasta_files)
105 :     {
106 :     my $cur_size = 0;
107 :     my $cur_count = 0;
108 :     my $cur_input = '';
109 :    
110 :     my $base = basename($file);
111 :     $file = abs_path($file);
112 :    
113 :     open(F, "<$file") or die "Cannot open $file: $!\n";
114 :    
115 :     print "Chunk file $file\n";
116 :    
117 :     while (<F>)
118 :     {
119 :     if (/^>/)
120 :     {
121 : olson 1.2 if ((defined($max_seqs) and ($cur_count >= $max_seqs)) or
122 :     (defined($max_chars) and ($cur_size >= $max_chars)))
123 : olson 1.1 {
124 :     write_task($base, $input_dir, $output_dir, $error_dir, $cur_input);
125 :     $cur_size = 0;
126 :     $cur_count = 0;
127 :     $cur_input = '';
128 :     }
129 :     $cur_input .= $_;
130 :     $cur_count++;
131 :     }
132 :     else
133 :     {
134 :     $cur_input .= $_;
135 :     $cur_size += length($_);
136 :     }
137 :     }
138 :     if ($cur_count >= 0)
139 :     {
140 :     write_task($base, $input_dir, $output_dir, $error_dir, $cur_input);
141 :     $cur_size = 0;
142 :     $cur_input = '';
143 :     $cur_count = 0;
144 :     }
145 :     close(F);
146 :     }
147 :     close(TASK);
148 :    
149 :     print "tasks\t1\t$last_task\n";
150 :    
151 :     #
152 :     # Write an input chunk to $dir.
153 :     # Write a line on the
154 :     sub write_task
155 :     {
156 :     my($base, $input_dir, $output_dir, $error_dir, $fasta) = @_;
157 :    
158 :     my $task = $next_task++;
159 :    
160 :     my $idir = "$input_dir/$base";
161 :     my $odir = "$output_dir/$base";
162 :     my $edir = "$error_dir/$base";
163 :    
164 :     -d $idir or mkdir($idir) or die "Cannot mkdir $idir: $!\n";
165 :     -d $odir or mkdir($odir) or die "Cannot mkdir $odir: $!\n";
166 :     -d $edir or mkdir($edir) or die "Cannot mkdir $edir: $!\n";
167 :    
168 :     my $in = "$idir/in.$task";
169 :     my $out = "$odir/out.$task";
170 :     my $err = "$edir/err.$task";
171 :    
172 :     open(I, ">$in") or die "Cannot write $in: $!";
173 :     print I $fasta;
174 :     close(I);
175 :     print TASK join("\t", $task, $in, $nr_file, $flags, $out, $err), "\n";
176 :     $last_task = $task;
177 :     }

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3