]> git.donarmstrong.com Git - rsem.git/blob - rsem-calculate-expression
roll back to original version plus fixed a small bug in calcCI.cpp
[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 $NCV = 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 > $sampleName.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 = "$sampleName.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 $NCV $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 $NCV $NSPC $NMB";
305     $command .= " -p $nThreads";
306     if ($quiet) { $command .= " -q"; }
307     &runCommand($command);
308
309     system("mv $sampleName.isoforms.results $imdName.isoforms.results.bak2");
310     system("mv $sampleName.genes.results $imdName.genes.results.bak2");
311     &collectResults("$imdName.iso_res", "$sampleName.isoforms.results"); # isoform level
312     &collectResults("$imdName.gene_res", "$sampleName.genes.results"); # gene level
313 }
314
315 if ($mTime) { $time_end = time(); $time_ci = $time_end - $time_start; }
316
317 if ($mTime) { $time_start = time(); }
318
319 if (!$keep_intermediate_files) {
320     &runCommand("rm -rf $temp_dir", "Fail to delete the temporary folder!");
321 }
322
323 if ($mTime) { $time_end = time(); }
324
325 if ($mTime) { 
326     open(OUTPUT, ">$sampleName.time");
327     print OUTPUT "Aligning reads: $time_alignment s.\n";
328     print OUTPUT "Estimating expression levels: $time_rsem s.\n";
329     print OUTPUT "Calculating credibility intervals: $time_ci s.\n";
330     my $time_del = $time_end - $time_start;
331 #    print OUTPUT "Delete: $time_del s.\n";
332     close(OUTPUT);
333 }
334
335 # command, {err_msg}
336 sub runCommand {
337     print $_[0]."\n";
338     my $status = system($_[0]);
339     if ($status != 0) { 
340         my $errmsg;
341         if (scalar(@_) > 1) { $errmsg = $_[1]; }
342         else { $errmsg = "\"$command\" failed! Plase check if you provide correct parameters/options for the pipeline!"; }
343         print $errmsg."\n";
344         exit(-1);
345     }
346     print "\n";
347 }
348
349 # inpF, outF
350 sub collectResults {
351     my $local_status;
352     my ($inpF, $outF);
353     my (@results, @ids) = ();
354     my $line;
355     my $cnt;
356
357     $inpF = $_[0];
358     $outF = $_[1];
359
360     $local_status = open(INPUT, $inpF);
361     if ($local_status == 0) { print "Fail to open file $inpF!\n"; exit(-1); }
362     
363     $cnt = 0;
364     @results = ();
365     
366     while ($line = <INPUT>) {
367         ++$cnt;
368         chomp($line);
369         my @local_arr = split(/\t/, $line);
370         if ($cnt == 4) { @ids = @local_arr; }
371         else { push(@results, \@local_arr); }
372     }
373     
374     push(@results, \@ids);
375     close(INPUT);
376
377     $local_status = open(OUTPUT, ">$outF");
378     if ($local_status == 0) { print "Fail to create file $outF!\n"; exit(-1); }
379
380     my $n = scalar(@results);
381     my $m = scalar(@{$results[0]});
382     for (my $i = 0; $i < $m; $i++) {
383         my @out_arr = ();
384         for (my $j = 0; $j < $n; $j++) { push(@out_arr, $results[$j][$i]); }
385         $" = "\t";
386         print OUTPUT "@out_arr\n"; 
387     }
388     close(OUTPUT);
389 }
390
391
392 __END__
393
394 =head1 NAME
395
396 rsem-calculate-expression
397
398 =head1 SYNOPSIS
399
400 =over
401
402  rsem-calculate-expression [options] upstream_read_file(s) reference_name sample_name
403  rsem-calculate-expression [options] --paired-end upstream_read_file(s) downstream_read_file(s) reference_name sample_name
404  rsem-calculate-expression [options] --sam/--bam [--paired-end] input reference_name sample_name
405
406 =back
407
408 =head1 ARGUMENTS
409
410 =over
411
412 =item B<upstream_read_files(s)>
413
414 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.
415
416 =item B<downstream_read_file(s)>
417
418 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.
419
420 =item B<input>
421
422 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.
423
424 =item B<reference_name>                        
425
426 The name of the reference used.  The user must have run 'rsem-prepare-reference' with this reference_name before running this program.
427
428 =item B<sample_name>
429
430 The name of the sample analyzed. All output files are prefixed by this name (e.g., sample_name.genes.results)
431
432 =back
433
434 =head1 OPTIONS
435
436 =over
437
438 =item B<--paired-end>
439
440 Input reads are paired-end reads. (Default: off)
441
442 =item B<--no-qualities>
443
444 Input reads do not contain quality scores. (Default: off)
445
446 =item B<--strand-specific>
447
448 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)
449
450 =item B<--sam>
451
452 Input file is in SAM format. (Default: off)
453
454 =item B<--bam>
455
456 Input file is in BAM format. (Default: off)
457
458 =item B<--sam-header-info> <file>
459
460 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: "")
461
462 =item B<-p/--num-threads> <int>
463
464 Number of threads to use. Both Bowtie and expression estimation will use this many threads. (Default: 1)
465
466 =item B<--output-genome-bam>
467
468 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)
469
470 =item B<--sampling-for-bam>
471
472 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)
473
474 =item B<--calc-ci>
475
476 Calculate 95% credibility intervals and posterior mean estimates.  (Default: off)
477
478 =item B<--seed-length> <int>
479
480 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)
481
482 =item B<--tag> <string>
483
484 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: "")
485
486 =item B<--bowtie-path> <path>
487
488 The path to the bowtie executables. (Default: the path to the bowtie executables is assumed to be in the user's PATH environment variable)
489
490 =item B<--bowtie-n> <int>
491
492 (Bowtie parameter) max # of mismatches in the seed. (Range: 0-3, Default: 2)
493
494 =item B<--bowtie-e> <int>
495
496 (Bowtie parameter) max sum of mismatch quality scores across the alignment. (Default: 99999999)
497
498 =item B<--bowtie-m> <int>
499
500 (Bowtie parameter) suppress all alignments for a read if > <int> valid alignments exist. (Default: 200)
501
502 =item B<--bowtie-chunkmbs> <int>
503
504 (Bowtie parameter) memory allocated for best first alignment calculation (Default: 0 - use bowtie's default)
505
506 =item B<--phred33-quals>
507
508 Input quality scores are encoded as Phred+33. (Default: on)
509
510 =item B<--phred64-quals>
511
512 Input quality scores are encoded as Phred+64 (default for GA Pipeline ver. >= 1.3). (Default: off)
513
514 =item B<--solexa-quals>
515
516 Input quality scores are solexa encoded (from GA Pipeline ver. < 1.3). (Default: off)
517
518 =item B<--forward-prob> <double>
519
520 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)
521
522 =item B<--fragment-length-min> <int>
523
524 Minimum read/insert length allowed. This is also the value for the bowtie -I option. (Default: 1)
525
526 =item B<--fragment-length-max> <int>
527
528 Maximum read/insert length allowed. This is also the value for the bowtie -X option. (Default: 1000)
529
530 =item B<--fragment-length-mean> <double>
531
532 (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)
533
534 =item B<--fragment-length-sd> <double>
535
536 (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>)
537
538 =item B<--estimate-rspd>
539
540 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)
541
542 =item B<--num-rspd-bins> <int>
543
544 Number of bins in the RSPD. Only relevant when '--estimate-rspd' is specified.  Use of the default setting is recommended. (Default: 20)
545
546 =item B<--ci-memory> <int>
547
548 Maximum size (in memory, MB) of the auxiliary buffer used for computing credibility intervals (CI). Set it larger for a faster CI calculation. However, leaving 2 GB memory free for other usage is recommended. (Default: 1024)
549
550 =item B<--keep-intermediate-files>
551
552 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)
553
554 =item B<--time>
555
556 Output time consumed by each step of RSEM to 'sample_name.time'. (Default: off)
557
558 =item B<-q/--quiet>
559
560 Suppress the output of logging information. (Default: off)
561
562 =item B<-h/--help>
563
564 Show help information.
565
566 =back
567
568 =head1 DESCRIPTION
569
570 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. 
571
572 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: 
573
574   convert-sam-for-rsem /ref/mouse_125 input.sam -o input_for_rsem.sam  
575
576 For details, please refer to 'convert-sam-for-rsem's documentation page.
577
578 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 '*'. 
579
580 The user must run 'rsem-prepare-reference' with the appropriate reference before using this program.
581
582 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.
583
584 Please note that some of the default values for the Bowtie parameters are not the same as those defined for Bowtie itself.
585
586 The temporary directory and all intermediate files will be removed when RSEM finishes unless '--keep-intermediate-files' is specified.
587
588 With the '--calc-ci' option, 95% credibility intervals and posterior mean estimates will be calculated in addition to maximum likelihood estimates.
589
590 =head1 OUTPUT
591
592 =over
593
594 =item B<sample_name.genes.results> 
595
596 File containing gene level expression estimates. The format of each
597 line in this file is:
598
599 gene_id expected_counts tau_value [pmc_value tau_pme_value tau_ci_lower_bound tau_ci_upper_bound] transcript_id_list
600
601 Fields are separated by the tab character. Fields within "[]" are only
602 presented if '--calc-ci' is set. pme stands for posterior mean
603 estimation. pmc stands for posterior mean counts. ci_lower_bound(l)
604 means the lower bound of the credibility intervals, ci_upper_bound(u)
605 means the upper bound of the credibility intervals. So the credibility
606 interval is [l, u]. 'transcript_id_list' is a space-separated list of
607 transcript_ids belonging to the gene. If no gene information is
608 provided, this file has the same content as
609 'sample_name.isoforms.results'.
610
611 =item B<sample_name.isoforms.results> 
612
613 File containing isoform level expression values. The format of each
614 line in this file is:
615
616 transcript_id expected_counts tau_value [pmc_value tau_pme_value tau_ci_lower_bound tau_ci_upper_bound] gene_id
617
618 Fields are separated by the tab character. 'gene_id' is the gene_id of
619 the gene which this transcript belongs to. If no gene information is
620 provided, 'gene_id' and 'transcript_id' are the same.
621
622 =item B<sample_name.transcript.bam, sample_name.transcript.sorted.bam and sample_name.transcript.sorted.bam.bai>
623
624 'sample_name.transcript.bam' is a BAM-formatted file of read
625 alignments in transcript coordinates. The MAPQ field of each alignment
626 is set to min(100, floor(-10 * log10(1.0 - w) + 0.5)), where w is the
627 posterior probability of that alignment being the true mapping of a
628 read.  In addition, RSEM pads a new tag ZW:f:value, where value is a
629 single precision floating number representing the posterior
630 probability.
631
632 'sample_name.transcript.sorted.bam' and
633 'sample_name.transcript.sorted.bam.bai' are the sorted BAM file and
634 indices generated by samtools (included in RSEM package).
635
636 =item B<sample_name.genome.bam, sample_name.genome.sorted.bam and sample_name.genome.sorted.bam.bai>
637
638 Only generated when --output-genome-bam is specified.
639
640 'sample_name.genome.bam' is a BAM-formatted file of read alignments in
641 genomic coordinates. Alignments of reads that have identical genomic
642 coordinates (i.e., alignments to different isoforms that share the
643 same genomic region) are collapsed into one alignment.  The MAPQ field
644 of each alignment is set to min(100, floor(-10 * log10(1.0 - w) +
645 0.5)), where w is the posterior probability of that alignment being
646 the true mapping of a read.  In addition, RSEM pads a new tag
647 ZW:f:value, where value is a single precision floating number
648 representing the posterior probability. If an alignment is spliced, a
649 XS:A:value tag is also added, where value is either '+' or '-'
650 indicating the strand of the transcript it aligns to.
651
652 'sample_name.genome.sorted.bam' and 'sample_name.genome.sorted.bam.bai' are the
653 sorted BAM file and indices generated by samtools (included in RSEM package).
654
655 =item B<sample_name.sam.gz>
656
657 Only generated when the input files are raw reads instead of SAM/BAM format files
658
659 It is the gzipped SAM output produced by bowtie aligner.
660
661 =item B<sample_name.time>
662
663 Only generated when --time is specified.
664
665 It contains time (in seconds) consumed by aligning reads, estimating expression levels and calculating credibility intervals.
666
667 =item B<sample_name.stat>
668
669 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.
670
671 =back
672
673 =head1 EXAMPLES
674
675 Assume the path to the bowtie executables is in the user's PATH environment variable. Reference files are under '/ref' with name 'mouse_125'. 
676
677 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:
678
679  rsem-calculate-expression --phred64-quals \
680                            -p 8 \
681                            --output-genome-bam \
682                            /data/mmliver.fq \
683                            /ref/mouse_125 \
684                            mmliver_single_quals
685
686 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:
687
688  rsem-calculate-expression -p 8 \
689                            --paired-end \
690                            /data/mmliver_1.fq \
691                            /data/mmliver_2.fq \
692                            /ref/mouse_125 \
693                            mmliver_paired_end_quals
694
695 3) '/data/mmliver.fa', single-end reads without quality scores. We want to use 8 threads:
696
697  rsem-calculate-expression -p 8 \
698                            --no-qualities \
699                            /data/mmliver.fa \
700                            /ref/mouse_125 \
701                            mmliver_single_without_quals
702
703 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:
704
705  rsem-calculate-expression --bowtie-path /sw/bowtie \
706                            --phred64-quals \
707                            --fragment-length-mean 150.0 \
708                            --fragment-length-sd 35.0 \
709                            -p 8 \
710                            --output-genome-bam \
711                            --calc-ci \
712                            --ci-memory 1024 \
713                            /data/mmliver.fq \
714                            /ref/mouse_125 \
715                            mmliver_single_quals
716
717 5) '/data/mmliver_paired_end_quals.bam', paired-end reads with quality scores.  We want to use 8 threads:
718
719  rsem-calculate-expression --paired-end \
720                            --bam \
721                            -p 8 \
722                            /data/mmliver_paired_end_quals.bam \
723                            /ref/mouse_125 \
724                            mmliver_paired_end_quals
725
726 =cut