]> git.donarmstrong.com Git - rsem.git/blob - rsem-calculate-expression
modify one error message and add --bowtie-chunkmbs option by merging earonesty's...
[rsem.git] / rsem-calculate-expression
1 #!/usr/bin/perl
2
3 use Getopt::Long;
4 use Pod::Usage;
5 use File::Basename;
6 use Switch;
7 use strict;
8
9 #const
10 my $BURNIN = 200;
11 my $CHAINLEN = 1000;
12 my $SAMPLEGAP = 1;
13 my $CONFIDENCE = 0.95;
14 my $NSPC = 50;
15
16 my $NMB = 1024; # default
17
18 my $status = 0;
19
20 my $read_type = 1; # default, single end with qual
21
22 my $bowtie_path = "";
23 my $C = 2;
24 my $E = 99999999;
25 my $L = 25;
26 my $maxHits = 200;
27 my $chunkMbs = 0;       # 0 = use bowtie default
28 my $phred33 = 0;
29 my $phred64 = 0;
30 my $solexa = 0;
31
32 my $is_sam = 0;
33 my $is_bam = 0;
34 my $fn_list = "";
35 my $tagName = "XM";
36
37 my $probF = 0.5;
38
39 my $minL = 1;
40 my $maxL = 1000;
41 my $mean = -1;
42 my $sd = 0;
43
44 my $estRSPD = 0;
45 my $B = 20;
46
47 my $nThreads = 1;
48 my $genBamF = 1;  # default is generating transcript bam file
49 my $genGenomeBamF = 0;
50 my $sampling = 0;
51 my $calcCI = 0;
52 my $quiet = 0;
53 my $help = 0;
54
55 my $paired_end = 0;
56 my $no_qual = 0;
57 my $keep_intermediate_files = 0;
58
59 my $strand_specific = 0;
60
61 my $mTime = 0;
62 my ($time_start, $time_end, $time_alignment, $time_rsem, $time_ci) = (0, 0, 0, 0, 0);
63
64 GetOptions("keep-intermediate-files" => \$keep_intermediate_files,
65            "no-qualities" => \$no_qual,
66            "paired-end" => \$paired_end,
67            "strand-specific" => \$strand_specific,
68            "sam" => \$is_sam,
69            "bam" => \$is_bam,
70            "sam-header-info=s" => \$fn_list,
71            "tag=s" => \$tagName,
72            "seed-length=i" => \$L,
73            "bowtie-path=s" => \$bowtie_path,
74            "bowtie-n=i" => \$C,
75            "bowtie-e=i" => \$E,
76            "bowtie-m=i" => \$maxHits,
77            "bowtie-chunkmbs=i" => \$chunkMbs,
78            "phred33-quals" => \$phred33,
79            "phred64-quals" => \$phred64, #solexa1.3-quals" => \$phred64,
80            "solexa-quals" => \$solexa,
81            "forward-prob=f" => \$probF,
82            "fragment-length-min=i" => \$minL,
83            "fragment-length-max=i" => \$maxL,
84            "fragment-length-mean=f" => \$mean,
85            "fragment-length-sd=f" => \$sd,
86            "estimate-rspd" => \$estRSPD,
87            "num-rspd-bins=i" => \$B,
88            "p|num-threads=i" => \$nThreads,
89            "output-genome-bam" => \$genGenomeBamF,
90            "sampling-for-bam" => \$sampling,
91            "calc-ci" => \$calcCI,
92            "ci-memory=i" => \$NMB,
93            "time" => \$mTime,
94            "q|quiet" => \$quiet,
95            "h|help" => \$help) or pod2usage(-exitval => 2, -verbose => 2);
96
97 pod2usage(-verbose => 2) if ($help == 1);
98
99
100 #check parameters and options
101
102 if ($is_sam || $is_bam) {
103     pod2usage(-msg => "Invalid number of arguments!", -exitval => 2, -verbose => 2) if (scalar(@ARGV) != 3);
104     pod2usage(-msg => "--sam and --bam cannot be active at the same time!", -exitval => 2, -verbose => 2) if ($is_sam == 1&& $is_bam == 1);
105     pod2usage(-msg => "--bowtie-path, --bowtie-n, --bowtie-e, --bowtie-m, --phred33-quals, --phred64-quals or --solexa-quals cannot be set if input is SAM/BAM format!", -exitval => 2, -verbose => 2) if ($bowtie_path ne "" || $C != 2 || $E != 99999999 || $maxHits != 200 || $phred33 || $phred64 || $solexa);
106 }
107 else {
108     pod2usage(-msg => "Invalid number of arguments!", -exitval => 2, -verbose => 2) if (!$paired_end && scalar(@ARGV) != 3 || $paired_end && scalar(@ARGV) != 4);    
109     pod2usage(-msg => "Only one of --phred33-quals --phred64-quals/--solexa1.3-quals --solexa-suqls can be active!", -exitval => 2, -verbose => 2) if ($phred33 + $phred64 + $solexa > 1);    
110     podwusage(-msg => "--sam , --bam or --sam-header-info cannot be set if use bowtie aligner to produce alignments!", -exitval => 2, -verbose => 2) if ($is_sam || $is_bam || $fn_list ne "");
111 }
112
113 pod2usage(-msg => "Forward probability should be in [0, 1]!", -exitval => 2, -verbose => 2) if ($probF < 0 || $probF > 1);
114 pod2usage(-msg => "Min fragment length should be at least 1!", -exitval => 2, -verbose => 2) if ($minL < 1);
115 pod2usage(-msg => "Min fragment length should be smaller or equal to max fragment length!", -exitval => 2, -verbose => 2) if ($minL > $maxL);
116 pod2usage(-msg => "The memory allocated for calculating credibility intervals should be at least 1 MB!\n", -exitval => 2, -verbose => 2) if ($NMB < 1);
117 pod2usage(-msg => "Number of threads should be at least 1!\n", -exitval => 2, -verbose => 2) if ($nThreads < 1);
118 pod2usage(-msg => "Seed length should be at least 5!\n", -exitval => 2, -verbose => 2) if ($L < 5);
119 pod2usage(-msg => "--sampling-for-bam cannot be specified if --out-bam is not specified!\n", -exitval => 2, -verbose => 2) if ($sampling && !$genBamF);
120
121 if ($L < 25) { print "Warning: the seed length set is less than 25! This is only allowed if the references are not added poly(A) tails.\n"; }
122
123 if ($strand_specific) { $probF = 1.0; }
124
125 my $mate1_list = "";
126 my $mate2_list = "";
127 my $inpF = "";
128
129 my ($refName, $sampleName, $sampleToken, $temp_dir, $stat_dir, $imdName) = ();
130 my $gap = 32;
131
132 if ($paired_end) {
133     if ($no_qual) { $read_type = 2; }
134     else { $read_type = 3; }
135 }
136 else {
137     if ($no_qual) { $read_type = 0; }
138     else { $read_type = 1; }
139 }
140
141 if (scalar(@ARGV) == 3) {
142     if ($is_sam || $is_bam) { $inpF = $ARGV[0]; } 
143     else {$mate1_list = $ARGV[0]; }
144     $refName = $ARGV[1];
145     $sampleName = $ARGV[2];
146 }
147 else {
148     $mate1_list = $ARGV[0];
149     $mate2_list = $ARGV[1];
150     $refName = $ARGV[2];
151     $sampleName = $ARGV[3];
152 }
153
154 if ($genGenomeBamF) {
155     open(INPUT, "$refName.ti");
156     my $line = <INPUT>; chomp($line);
157     close(INPUT);
158     my ($M, $type) = split(/ /, $line);
159     pod2usage(-msg => "No genome information provided, so genome bam file cannot be generated!\n", -exitval => 2, -verbose => 2) if ($type != 0);
160 }
161
162 my $pos = rindex($sampleName, '/');
163 if ($pos < 0) { $sampleToken = $sampleName; }
164 else { $sampleToken = substr($sampleName, $pos + 1); }
165
166 $temp_dir = "$sampleName.temp";
167 $stat_dir = "$sampleName.stat";
168
169 if (!(-d $temp_dir) && !mkdir($temp_dir)) { print "Fail to create folder $temp_dir.\n"; exit(-1); }
170 if (!(-d $stat_dir) && !mkdir($stat_dir)) { print "Fail to create folder $stat_dir.\n"; exit(-1); }
171
172 $imdName = "$temp_dir/$sampleToken";
173
174 if (!$is_sam && !$is_bam && $phred33 + $phred64 + $solexa == 0) { $phred33 = 1; }
175
176 my ($mate_minL, $mate_maxL) = (1, $maxL);
177
178 if ($bowtie_path ne "") { $bowtie_path .= "/"; }
179
180 my ($fn, $dir, $suf) = fileparse($0);
181 my $command = "";
182
183 if (!$is_sam && !$is_bam) {
184     $command = $bowtie_path."bowtie";
185     if ($read_type == 0 || $read_type == 2) { $command .= " -f"; }
186     else { $command .= " -q"; }
187     
188     if ($phred33) { $command .= " --phred33-quals"; }
189     elsif ($phred64) { $command .= " --phred64-quals"; }
190     elsif ($solexa) { $command .= " --solexa-quals"; }
191     else { print "Oh, no!!!"; exit(2); }
192     
193     $command .= " -n $C -e $E -l $L";
194     if ($read_type == 2 || $read_type == 3) { $command .= " -I $minL -X $maxL"; }
195     if ($chunkMbs > 0) { $command .= " --chunkmbs $chunkMbs"; }
196     
197     if ($strand_specific || $probF == 1.0) { $command .= " --norc"; }
198     elsif ($probF == 0.0) { $command .= " --nofw"; }
199
200     $command .= " -p $nThreads -a -m $maxHits -S";
201     if ($quiet) { $command .= " --quiet"; }    
202
203     $command .= " $refName";
204     if ($read_type == 0 || $read_type == 1) {
205         $command .= " $mate1_list"; 
206     }
207     else {
208         $command .= " -1 $mate1_list -2 $mate2_list";
209     }
210
211     $command .= " | gzip > $imdName.sam.gz";
212
213     if ($mTime) { $time_start = time(); }
214
215     &runCommand($command);
216
217     if ($mTime) { $time_end = time(); $time_alignment = $time_end - $time_start; }
218
219     $inpF = "$imdName.sam.gz";
220     $is_sam = 1; # output of bowtie is a sam file
221 }
222
223 if ($mTime) { $time_start = time(); }
224
225 $command = $dir."rsem-parse-alignments $refName $sampleName $sampleToken";
226
227 my $samInpType;
228 if ($is_sam) { $samInpType = "s"; } 
229 elsif ($is_bam) { $samInpType = "b"; }
230
231 $command .= " $samInpType $inpF -t $read_type";
232 if ($fn_list ne "") { $command .= " -l $fn_list"; }
233 if ($tagName ne "") { $command .= " -tag $tagName"; }
234 if ($quiet) { $command .= " -q"; }
235
236 &runCommand($command);
237
238 $command = $dir."rsem-build-read-index $gap"; 
239 switch($read_type) {
240     case 0  { $command .= " 0 $quiet $imdName\_alignable.fa"; }
241     case 1  { $command .= " 1 $quiet $imdName\_alignable.fq"; }
242     case 2  { $command .= " 0 $quiet $imdName\_alignable_1.fa $imdName\_alignable_2.fa"; }
243     case 3  { $command .= " 1 $quiet $imdName\_alignable_1.fq $imdName\_alignable_2.fq"; }
244 }
245 &runCommand($command);
246
247 my $doesOpen = open(OUTPUT, ">$imdName.mparams");
248 if ($doesOpen == 0) { print "Cannot generate $imdName.mparams!\n"; exit(-1); }
249 print OUTPUT "$minL $maxL\n";
250 print OUTPUT "$probF\n";
251 print OUTPUT "$estRSPD\n";
252 print OUTPUT "$B\n";
253 print OUTPUT "$mate_minL $mate_maxL\n";
254 print OUTPUT "$mean $sd\n";
255 print OUTPUT "$L\n";
256 close(OUTPUT);  
257
258 $command = $dir."rsem-run-em $refName $read_type $sampleName $sampleToken -p $nThreads";
259 if ($genBamF) { 
260     $command .= " -b $samInpType $inpF";
261     if ($fn_list ne "") { $command .= " 1 $fn_list"; }
262     else { $command .= " 0"; }
263     if ($sampling) { $command .= " --sampling"; }
264 }
265 if ($calcCI) { $command .= " --gibbs-out"; }
266 if ($quiet) { $command .= " -q"; }
267
268 &runCommand($command);
269
270 if ($genBamF) {
271     $command = $dir."sam/samtools sort $sampleName.transcript.bam $sampleName.transcript.sorted";
272     &runCommand($command);
273     $command = $dir."sam/samtools index $sampleName.transcript.sorted.bam";
274     &runCommand($command);
275
276     if ($genGenomeBamF) {
277         $command = $dir."rsem-tbam2gbam $refName $sampleName.transcript.bam $sampleName.genome.bam";
278         &runCommand($command);
279         $command = $dir."sam/samtools sort $sampleName.genome.bam $sampleName.genome.sorted";
280         &runCommand($command);
281         $command = $dir."sam/samtools index $sampleName.genome.sorted.bam";
282         &runCommand($command);
283     }
284 }
285
286 &collectResults("$imdName.iso_res", "$sampleName.isoforms.results"); # isoform level
287 &collectResults("$imdName.gene_res", "$sampleName.genes.results"); # gene level
288
289 if ($mTime) { $time_end = time(); $time_rsem = $time_end - $time_start; }
290
291 if ($mTime) { $time_start = time(); }
292
293 if ($calcCI) {
294     $command = $dir."rsem-run-gibbs $refName $sampleName $sampleToken $BURNIN $CHAINLEN $SAMPLEGAP";
295 #    $command .= " -p $nThreads";
296     if ($quiet) { $command .= " -q"; }
297     &runCommand($command);
298
299     system("mv $sampleName.isoforms.results $imdName.isoforms.results.bak1");
300     system("mv $sampleName.genes.results $imdName.genes.results.bak1");
301     &collectResults("$imdName.iso_res", "$sampleName.isoforms.results"); # isoform level
302     &collectResults("$imdName.gene_res", "$sampleName.genes.results"); # gene level
303
304     $command = $dir."rsem-calculate-credibility-intervals $refName $sampleName $sampleToken $CONFIDENCE $NSPC $NMB";
305     if ($quiet) { $command .= " -q"; }
306     &runCommand($command);
307
308     system("mv $sampleName.isoforms.results $imdName.isoforms.results.bak2");
309     system("mv $sampleName.genes.results $imdName.genes.results.bak2");
310     &collectResults("$imdName.iso_res", "$sampleName.isoforms.results"); # isoform level
311     &collectResults("$imdName.gene_res", "$sampleName.genes.results"); # gene level
312 }
313
314 if ($mTime) { $time_end = time(); $time_ci = $time_end - $time_start; }
315
316 if ($mTime) { $time_start = time(); }
317
318 if (!$keep_intermediate_files) {
319     &runCommand("rm -rf $temp_dir", "Fail to delete the temporary folder!");
320 }
321
322 if ($mTime) { $time_end = time(); }
323
324 if ($mTime) { 
325     open(OUTPUT, ">$sampleName.time");
326     print OUTPUT "Alignment: $time_alignment s.\n";
327     print OUTPUT "RSEM: $time_rsem s.\n";
328     print OUTPUT "CI: $time_ci s.\n";
329     my $time_del = $time_end - $time_start;
330     print OUTPUT "Delete: $time_del s.\n";
331     close(OUTPUT);
332 }
333
334 # command, {err_msg}
335 sub runCommand {
336     print $_[0]."\n";
337     my $status = system($_[0]);
338     if ($status != 0) { 
339         my $errmsg;
340         if (scalar(@_) > 1) { $errmsg = $_[1]; }
341         else { $errmsg = "\"$command\" failed! Plase check if you provide correct parameters/options for the pipeline!"; }
342         print $errmsg."\n";
343         exit(-1);
344     }
345     print "\n";
346 }
347
348 # inpF, outF
349 sub collectResults {
350     my $local_status;
351     my ($inpF, $outF);
352     my (@results, @ids) = ();
353     my $line;
354     my $cnt;
355
356     $inpF = $_[0];
357     $outF = $_[1];
358
359     $local_status = open(INPUT, $inpF);
360     if ($local_status == 0) { print "Fail to open file $inpF!\n"; exit(-1); }
361     
362     $cnt = 0;
363     @results = ();
364     
365     while ($line = <INPUT>) {
366         ++$cnt;
367         chomp($line);
368         my @local_arr = split(/\t/, $line);
369         if ($cnt == 4) { @ids = @local_arr; }
370         else { push(@results, \@local_arr); }
371     }
372     
373     push(@results, \@ids);
374     close(INPUT);
375
376     $local_status = open(OUTPUT, ">$outF");
377     if ($local_status == 0) { print "Fail to create file $outF!\n"; exit(-1); }
378
379     my $n = scalar(@results);
380     my $m = scalar(@{$results[0]});
381     for (my $i = 0; $i < $m; $i++) {
382         my @out_arr = ();
383         for (my $j = 0; $j < $n; $j++) { push(@out_arr, $results[$j][$i]); }
384         $" = "\t";
385         print OUTPUT "@out_arr\n"; 
386     }
387     close(OUTPUT);
388 }
389
390
391 __END__
392
393 =head1 NAME
394
395 rsem-calculate-expression
396
397 =head1 SYNOPSIS
398
399 =over
400
401  rsem-calculate-expression [options] upstream_read_file(s) reference_name sample_name
402  rsem-calculate-expression [options] --paired-end upstream_read_file(s) downstream_read_file(s) reference_name sample_name
403  rsem-calculate-expression [options] --sam/--bam [--paired-end] input reference_name sample_name
404
405 =back
406
407 =head1 ARGUMENTS
408
409 =over
410
411 =item B<upstream_read_files(s)>
412
413 Comma-separated list of files containing single-end reads or upstream reads for paired-end data.  By default, these files are assumed to be in FASTQ format.  If the --no-qualities option is specified, then FASTA format is expected.
414
415 =item B<downstream_read_file(s)>
416
417 Comma-separated list of files containing downstream reads which are paired with the upstream reads.  By default, these files are assumed to be in FASTQ format.  If the --no-qualities option is specified, then FASTA format is expected.
418
419 =item B<input>
420
421 SAM/BAM formatted input file.  If "-" is specified for the filename, SAM/BAM input is instead assumed to come from standard input. RSEM requires all alignments of the same read group together. For paired-end reads, RSEM also requires the two mates of any alignment be adjacent. See Description section for how to make input file obey RSEM's requirements.
422
423 =item B<reference_name>                        
424
425 The name of the reference used.  The user must have run 'rsem-prepare-reference' with this reference_name before running this program.
426
427 =item B<sample_name>
428
429 The name of the sample analyzed. All output files are prefixed by this name (e.g., sample_name.genes.results)
430
431 =back
432
433 =head1 OPTIONS
434
435 =over
436
437 =item B<--paired-end>
438
439 Input reads are paired-end reads. (Default: off)
440
441 =item B<--no-qualities>
442
443 Input reads do not contain quality scores. (Default: off)
444
445 =item B<--strand-specific>
446
447 The RNA-Seq protocol used to generate the reads is strand specific, i.e., all (upstream) reads are derived from the forward strand.  This option is equivalent to --forward-prob=1.0.  With this option set, if RSEM runs the Bowtie aligner, the '--norc' Bowtie option will be used, which disables alignment to the reverse strand of transcripts.  (Default: off)
448
449 =item B<--sam>
450
451 Input file is in SAM format. (Default: off)
452
453 =item B<--bam>
454
455 Input file is in BAM format. (Default: off)
456
457 =item B<--sam-header-info> <file>
458
459 RSEM reads header information from input by default. If this option is on, header information is read from the specified file. For the format of the file, please see SAM official website. (Default: "")
460
461 =item B<-p/--num-threads> <int>
462
463 Number of threads to use. Both Bowtie and expression estimation will use this many threads. (Default: 1)
464
465 =item B<--output-genome-bam>
466
467 Generate a BAM file, 'sample_name.genome.bam', with alignments mapped to genomic coordinates and annotated with their posterior probabilities. In addition, RSEM will call samtools (included in RSEM package) to sort and index the bam file. 'sample_name.genome.sorted.bam' and 'sample_name.genome.sorted.bam.bai' will be generated. (Default: off)
468
469 =item B<--sampling-for-bam>
470
471 When RSEM generates a BAM file, instead of outputing all alignments a read has with their posterior probabilities, one alignment is sampled and outputed according to the posterior probabilities. If the sampling result is that the read comes from the "noise" transcript, nothing is outputed. (Default: off)
472  
473 =item B<--calc-ci>
474
475 Calculate 95% credibility intervals and posterior mean estimates.  (Default: off)
476
477 =item B<--seed-length> <int>
478
479 Seed length used by the read aligner.  Providing the correct value is important for RSEM. If RSEM runs Bowtie, it uses this value for Bowtie's seed length parameter. Any read with its or at least one of its mates' (for paired-end reads) length less than this value will be ignored. If the references are not added poly(A) tails, the minimum allowed value is 5, otherwise, the minimum allowed value is 25. Note that this script will only check if the value >= 5 and give a warning message if the value < 25 but >= 5. (Default: 25)
480
481 =item B<--tag> <string>
482
483 The name of the optional field used in the SAM input for identifying a read with too many valid alignments. The field should have the format <tagName>:i:<value>, where a <value> bigger than 0 indicates a read with too many alignments. (Default: "")
484
485 =item B<--bowtie-path> <path>
486
487 The path to the bowtie executables. (Default: the path to the bowtie executables is assumed to be in the user's PATH environment variable)
488
489 =item B<--bowtie-n> <int>
490
491 (Bowtie parameter) max # of mismatches in the seed. (Range: 0-3, Default: 2)
492
493 =item B<--bowtie-e> <int>
494
495 (Bowtie parameter) max sum of mismatch quality scores across the alignment. (Default: 99999999)
496
497 =item B<--bowtie-m> <int>
498
499 (Bowtie parameter) suppress all alignments for a read if > <int> valid alignments exist. (Default: 200)
500
501 =item B<--bowtie-chunkmbs> <int>
502
503 (Bowtie parameter) memory allocated for best first alignment calculation (Default: 0 - use bowtie's default)
504
505 =item B<--phred33-quals>
506
507 Input quality scores are encoded as Phred+33. (Default: on)
508
509 =item B<--phred64-quals>
510
511 Input quality scores are encoded as Phred+64 (default for GA Pipeline ver. >= 1.3). (Default: off)
512
513 =item B<--solexa-quals>
514
515 Input quality scores are solexa encoded (from GA Pipeline ver. < 1.3). (Default: off)
516
517 =item B<--forward-prob> <double>
518
519 Probability of generating a read from the forward strand of a transcript. Set to 1 for a strand-specific protocol where all (upstream) reads are derived from the forward strand, 0 for a strand-specific protocol where all (upstream) read are derived from the reverse strand, or 0.5 for a non-strand-specific protocol. (Default: 0.5)
520
521 =item B<--fragment-length-min> <int>
522
523 Minimum read/insert length allowed. This is also the value for the bowtie -I option. (Default: 1)
524
525 =item B<--fragment-length-max> <int>
526
527 Maximum read/insert length allowed. This is also the value for the bowtie -X option. (Default: 1000)
528
529 =item B<--fragment-length-mean> <double>
530
531 (single-end data only) The mean of the fragment length distribution, which is assumed to be a Gaussian. (Default: -1, which disables use of the fragment length distribution)
532
533 =item B<--fragment-length-sd> <double>
534
535 (single-end data only) The standard deviation of the fragment length distribution, which is assumed to be a Gaussian.  (Default: 0, which assumes that all fragments are of the same length, given by the rounded value of B<--fragment-length-mean>)
536
537 =item B<--estimate-rspd>
538
539 Set this option if you want to estimate the read start position distribution (RSPD) from data. Otherwise, RSEM will use a uniform RSPD. (Default: off)
540
541 =item B<--num-rspd-bins> <int>
542
543 Number of bins in the RSPD. Only relevant when '--estimate-rspd' is specified.  Use of the default setting is recommended. (Default: 20)
544
545 =item B<--ci-memory> <int>
546
547 Amount of memory (in MB) RSEM is allowed to use for computing credibility intervals. (Default: 1024)
548
549 =item B<--keep-intermediate-files>
550
551 Keep temporary files generated by RSEM.  RSEM creates a temporary directory, 'sample_name.temp', into which it puts all intermediate output files. If this directory already exists, RSEM overwrites all files generated by previous RSEM runs inside of it. By default, after RSEM finishes, the temporary directory is deleted.  Set this option to prevent the deletion of this directory and the intermediate files inside of it. (Default: off)
552
553 =item B<-q/--quiet>
554
555 Suppress the output of logging information. (Default: off)
556
557 =item B<-h/--help>
558
559 Show help information.
560
561 =back
562
563 =head1 DESCRIPTION
564
565 In its default mode, this program aligns input reads against a reference transcriptome with Bowtie and calculates expression values using the alignments.  RSEM assumes the data are single-end reads with quality scores, unless the '--paired-end' or '--no-qualities' options are specified.  Users may use an alternative aligner by specifying one of the --sam and --bam options, and providing an alignment file in the specified format. However, users should make sure that they align against the indices generated by 'rsem-prepare-reference' and the alignment file satisfies the requirements mentioned in ARGUMENTS section. 
566
567 One simple way to make the alignment file satisfying RSEM's requirements (assuming the aligner used put mates in a paired-end read adjacent) is to use 'convert-sam-for-rsem' script. This script only accept SAM format files as input. If a BAM format file is obtained, please use samtools to convert it to a SAM file first. For example, if '/ref/mouse_125' is the 'reference_name' and the SAM file is named 'input.sam', you can run the following command: 
568
569   convert-sam-for-rsem /ref/mouse_125 input.sam -o input_for_rsem.sam  
570
571 For details, please refer to 'convert-sam-for-rsem's documentation page.
572
573 The SAM/BAM format RSEM uses is v1.4. However, it is compatible with old SAM/BAM format. However, RSEM cannot recognize 0x100 in the FLAG field. In addition, RSEM requires SEQ and QUAL are not '*'. 
574
575 The user must run 'rsem-prepare-reference' with the appropriate reference before using this program.
576
577 For single-end data, it is strongly recommended that the user provide the fragment length distribution parameters (--fragment-length-mean and --fragment-length-sd).  For paired-end data, RSEM will automatically learn a fragment length distribution from the data.
578
579 Please note that some of the default values for the Bowtie parameters are not the same as those defined for Bowtie itself.
580
581 The temporary directory and all intermediate files will be removed when RSEM finishes unless '--keep-intermediate-files' is specified.
582
583 With the '--calc-ci' option, 95% credibility intervals and posterior mean estimates will be calculated in addition to maximum likelihood estimates.
584
585 =head1 OUTPUT
586
587 =over
588
589 =item B<sample_name.genes.results> 
590
591 File containing gene level expression estimates. The format of each
592 line in this file is:
593
594 gene_id expected_counts tau_value [pmc_value tau_pme_value tau_ci_lower_bound tau_ci_upper_bound] transcript_id_list
595
596 Fields are separated by the tab character. Fields within "[]" are only
597 presented if '--calc-ci' is set. pme stands for posterior mean
598 estimation. pmc stands for posterior mean counts. ci_lower_bound(l)
599 means the lower bound of the credibility intervals, ci_upper_bound(u)
600 means the upper bound of the credibility intervals. So the credibility
601 interval is [l, u]. 'transcript_id_list' is a space-separated list of
602 transcript_ids belonging to the gene. If no gene information is
603 provided, this file has the same content as
604 'sample_name.isoforms.results'.
605
606 =item B<sample_name.isoforms.results> 
607
608 File containing isoform level expression values. The format of each
609 line in this file is:
610
611 transcript_id expected_counts tau_value [pmc_value tau_pme_value tau_ci_lower_bound tau_ci_upper_bound] gene_id
612
613 Fields are separated by the tab character. 'gene_id' is the gene_id of
614 the gene which this transcript belongs to. If no gene information is
615 provided, 'gene_id' and 'transcript_id' are the same.
616
617 =item B<sample_name.transcript.bam, sample_name.transcript.sorted.bam and sample_name.transcript.sorted.bam.bai>
618
619 'sample_name.transcript.bam' is a BAM-formatted file of read
620 alignments in transcript coordinates. The MAPQ field of each alignment
621 is set to min(100, floor(-10 * log10(1.0 - w) + 0.5)), where w is the
622 posterior probability of that alignment being the true mapping of a
623 read.  In addition, RSEM pads a new tag ZW:f:value, where value is a
624 single precision floating number representing the posterior
625 probability.
626
627 'sample_name.transcript.sorted.bam' and
628 'sample_name.transcript.sorted.bam.bai' are the sorted BAM file and
629 indices generated by samtools (included in RSEM package).
630
631 =item B<sample_name.genome.bam, sample_name.genome.sorted.bam and sample_name.genome.sorted.bam.bai>
632
633 Only generated when --output-genome-bam is specified.
634
635 'sample_name.genome.bam' is a BAM-formatted file of read alignments in
636 genomic coordinates. Alignments of reads that have identical genomic
637 coordinates (i.e., alignments to different isoforms that share the
638 same genomic region) are collapsed into one alignment.  The MAPQ field
639 of each alignment is set to min(100, floor(-10 * log10(1.0 - w) +
640 0.5)), where w is the posterior probability of that alignment being
641 the true mapping of a read.  In addition, RSEM pads a new tag
642 ZW:f:value, where value is a single precision floating number
643 representing the posterior probability. If an alignment is spliced, a
644 XS:A:value tag is also added, where value is either '+' or '-'
645 indicating the strand of the transcript it aligns to.
646
647 'sample_name.genome.sorted.bam' and 'sample_name.genome.sorted.bam.bai' are the
648 sorted BAM file and indices generated by samtools (included in RSEM package).
649
650 =item B<sample_name.stat>
651
652 This is a folder instead of a file. All model related statistics are stored in this folder. Use 'rsem-plot-model' can generate plots using this folder.
653
654 =back
655
656 =head1 EXAMPLES
657
658 Assume the path to the bowtie executables is in the user's PATH environment variable. Reference files are under '/ref' with name 'mouse_125'. 
659
660 1) '/data/mmliver.fq', single-end reads with quality scores. Quality scores are encoded as for 'GA pipeline version >= 1.3'. We want to use 8 threads and generate a genome BAM file:
661
662  rsem-calculate-expression --phred64-quals \
663                            -p 8 \
664                            --output-genome-bam \
665                            /data/mmliver.fq \
666                            /ref/mouse_125 \
667                            mmliver_single_quals
668
669 2) '/data/mmliver_1.fq' and '/data/mmliver_2.fq', paired-end reads with quality scores. Quality scores are in SANGER format. We want to use 8 threads and do not generate a genome BAM file:
670
671  rsem-calculate-expression -p 8 \
672                            --paired-end \
673                            /data/mmliver_1.fq \
674                            /data/mmliver_2.fq \
675                            /ref/mouse_125 \
676                            mmliver_paired_end_quals
677
678 3) '/data/mmliver.fa', single-end reads without quality scores. We want to use 8 threads:
679
680  rsem-calculate-expression -p 8 \
681                            --no-qualities \
682                            /data/mmliver.fa \
683                            /ref/mouse_125 \
684                            mmliver_single_without_quals
685
686 4) Data are the same as 1). We want to take a fragment length distribution into consideration. We set the fragment length mean to 150 and the standard deviation to 35. In addition to a BAM file, we also want to generate credibility intervals.  We allow RSEM to use 1GB of memory for CI calculation:
687
688  rsem-calculate-expression --bowtie-path /sw/bowtie \
689                            --phred64-quals \
690                            --fragment-length-mean 150.0 \
691                            --fragment-length-sd 35.0 \
692                            -p 8 \
693                            --output-genome-bam \
694                            --calc-ci \
695                            --ci-memory 1024 \
696                            /data/mmliver.fq \
697                            /ref/mouse_125 \
698                            mmliver_single_quals
699
700 5) '/data/mmliver_paired_end_quals.bam', paired-end reads with quality scores.  We want to use 8 threads:
701
702  rsem-calculate-expression --paired-end \
703                            --bam \
704                            -p 8 \
705                            /data/mmliver_paired_end_quals.bam \
706                            /ref/mouse_125 \
707                            mmliver_paired_end_quals
708
709 =cut