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