]> git.donarmstrong.com Git - rsem.git/blob - rsem-calculate-expression
use if/elsif to replace switch in rsem-calculate-expression
[rsem.git] / rsem-calculate-expression
1 #!/usr/bin/perl
2
3 use Getopt::Long;
4 use Pod::Usage;
5 use File::Basename;
6 use strict;
7
8 #const
9 my $BURNIN = 200;
10 my $NCV = 1000;
11 my $SAMPLEGAP = 1;
12 my $CONFIDENCE = 0.95;
13 my $NSPC = 50;
14
15 my $NMB = 1024; # default
16
17 my $status = 0;
18
19 my $read_type = 1; # default, single end with qual
20
21 my @transcript_title = ("transcript_id", "gene_id", "length", "effective_length", "expected_count", "TPM", "FPKM", "IsoPct", "pme_expected_count", "pme_TPM", "pme_FPKM", "IsoPct_from_pme_TPM", "TPM_ci_lower_bound", "TPM_ci_upper_bound", "FPKM_ci_lower_bound", "FPKM_ci_upper_bound");
22
23 my @gene_title = ("gene_id", "transcript_id(s)", "length", "effective_length", "expected_count", "TPM", "FPKM", "pme_expected_count", "pme_TPM", "pme_FPKM", "TPM_ci_lower_bound", "TPM_ci_upper_bound", "FPKM_ci_lower_bound", "FPKM_ci_upper_bound");
24
25 my $bowtie_path = "";
26 my $C = 2;
27 my $E = 99999999;
28 my $L = 25;
29 my $maxHits = 200;
30 my $chunkMbs = 0;       # 0 = use bowtie default
31 my $phred33 = 0;
32 my $phred64 = 0;
33 my $solexa = 0;
34
35 my $is_sam = 0;
36 my $is_bam = 0;
37 my $fn_list = "";
38 my $tagName = "XM";
39
40 my $probF = 0.5;
41
42 my $minL = 1;
43 my $maxL = 1000;
44 my $mean = -1;
45 my $sd = 0;
46
47 my $estRSPD = 0;
48 my $B = 20;
49
50 my $nThreads = 1;
51 my $genBamF = 1;  # default is generating transcript bam file
52 my $genGenomeBamF = 0;
53 my $sampling = 0;
54 my $calcCI = 0;
55 my $var_opt = 0; # temporarily, only for internal use
56 my $quiet = 0;
57 my $help = 0;
58
59 my $paired_end = 0;
60 my $no_qual = 0;
61 my $keep_intermediate_files = 0;
62
63 my $strand_specific = 0;
64
65 my $mTime = 0;
66 my ($time_start, $time_end, $time_alignment, $time_rsem, $time_ci) = (0, 0, 0, 0, 0);
67
68 my $mate1_list = "";
69 my $mate2_list = "";
70 my $inpF = "";
71
72 my ($refName, $sampleName, $sampleToken, $temp_dir, $stat_dir, $imdName, $statName) = ();
73 my $gap = 32;
74
75 GetOptions("keep-intermediate-files" => \$keep_intermediate_files,
76            "temporary-folder=s" => \$temp_dir,
77            "no-qualities" => \$no_qual,
78            "paired-end" => \$paired_end,
79            "strand-specific" => \$strand_specific,
80            "sam" => \$is_sam,
81            "bam" => \$is_bam,
82            "sam-header-info=s" => \$fn_list,
83            "tag=s" => \$tagName,
84            "seed-length=i" => \$L,
85            "bowtie-path=s" => \$bowtie_path,
86            "bowtie-n=i" => \$C,
87            "bowtie-e=i" => \$E,
88            "bowtie-m=i" => \$maxHits,
89            "bowtie-chunkmbs=i" => \$chunkMbs,
90            "phred33-quals" => \$phred33,
91            "phred64-quals" => \$phred64, #solexa1.3-quals" => \$phred64,
92            "solexa-quals" => \$solexa,
93            "forward-prob=f" => \$probF,
94            "fragment-length-min=i" => \$minL,
95            "fragment-length-max=i" => \$maxL,
96            "fragment-length-mean=f" => \$mean,
97            "fragment-length-sd=f" => \$sd,
98            "estimate-rspd" => \$estRSPD,
99            "num-rspd-bins=i" => \$B,
100            "p|num-threads=i" => \$nThreads,
101            "no-bam-output" => sub { $genBamF = 0; },
102            "output-genome-bam" => \$genGenomeBamF,
103            "sampling-for-bam" => \$sampling,
104            "var" => \$var_opt,
105            "calc-ci" => \$calcCI,
106            "ci-memory=i" => \$NMB,
107            "time" => \$mTime,
108            "q|quiet" => \$quiet,
109            "h|help" => \$help) or pod2usage(-exitval => 2, -verbose => 2);
110
111 pod2usage(-verbose => 2) if ($help == 1);
112
113
114 #check parameters and options
115
116 if ($is_sam || $is_bam) {
117     pod2usage(-msg => "Invalid number of arguments!", -exitval => 2, -verbose => 2) if (scalar(@ARGV) != 3);
118     pod2usage(-msg => "--sam and --bam cannot be active at the same time!", -exitval => 2, -verbose => 2) if ($is_sam == 1&& $is_bam == 1);
119     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);
120 }
121 else {
122     pod2usage(-msg => "Invalid number of arguments!", -exitval => 2, -verbose => 2) if (!$paired_end && scalar(@ARGV) != 3 || $paired_end && scalar(@ARGV) != 4);    
123     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);    
124     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 "");
125 }
126
127 pod2usage(-msg => "Forward probability should be in [0, 1]!", -exitval => 2, -verbose => 2) if ($probF < 0 || $probF > 1);
128 pod2usage(-msg => "Min fragment length should be at least 1!", -exitval => 2, -verbose => 2) if ($minL < 1);
129 pod2usage(-msg => "Min fragment length should be smaller or equal to max fragment length!", -exitval => 2, -verbose => 2) if ($minL > $maxL);
130 pod2usage(-msg => "The memory allocated for calculating credibility intervals should be at least 1 MB!\n", -exitval => 2, -verbose => 2) if ($NMB < 1);
131 pod2usage(-msg => "Number of threads should be at least 1!\n", -exitval => 2, -verbose => 2) if ($nThreads < 1);
132 pod2usage(-msg => "Seed length should be at least 5!\n", -exitval => 2, -verbose => 2) if ($L < 5);
133 pod2usage(-msg => "--sampling-for-bam cannot be specified if --no-bam-output is specified!\n", -exitval => 2, -verbose => 2) if ($sampling && !$genBamF);
134 pod2usage(-msg => "--output-genome-bam cannot be specified if --no-bam-output is specified!\n", -exitval => 2, -verbose => 2) if ($genGenomeBamF && !$genBamF);
135
136 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"; }
137
138 if ($strand_specific) { $probF = 1.0; }
139
140 if ($paired_end) {
141     if ($no_qual) { $read_type = 2; }
142     else { $read_type = 3; }
143 }
144 else {
145     if ($no_qual) { $read_type = 0; }
146     else { $read_type = 1; }
147 }
148
149 if (scalar(@ARGV) == 3) {
150     if ($is_sam || $is_bam) { $inpF = $ARGV[0]; } 
151     else {$mate1_list = $ARGV[0]; }
152     $refName = $ARGV[1];
153     $sampleName = $ARGV[2];
154 }
155 else {
156     $mate1_list = $ARGV[0];
157     $mate2_list = $ARGV[1];
158     $refName = $ARGV[2];
159     $sampleName = $ARGV[3];
160 }
161
162 if ($genGenomeBamF) {
163     open(INPUT, "$refName.ti");
164     my $line = <INPUT>; chomp($line);
165     close(INPUT);
166     my ($M, $type) = split(/ /, $line);
167     pod2usage(-msg => "No genome information provided, so genome bam file cannot be generated!\n", -exitval => 2, -verbose => 2) if ($type != 0);
168 }
169
170 my $pos = rindex($sampleName, '/');
171 if ($pos < 0) { $sampleToken = $sampleName; }
172 else { $sampleToken = substr($sampleName, $pos + 1); }
173
174 if ($temp_dir eq "") { $temp_dir = "$sampleName.temp"; }
175 $stat_dir = "$sampleName.stat";
176
177 if (!(-d $temp_dir) && !mkdir($temp_dir)) { print "Fail to create folder $temp_dir.\n"; exit(-1); }
178 if (!(-d $stat_dir) && !mkdir($stat_dir)) { print "Fail to create folder $stat_dir.\n"; exit(-1); }
179
180 $imdName = "$temp_dir/$sampleToken";
181 $statName = "$stat_dir/$sampleToken";
182
183 if (!$is_sam && !$is_bam && !$no_qual && ($phred33 + $phred64 + $solexa == 0)) { $phred33 = 1; }
184
185 my ($mate_minL, $mate_maxL) = (1, $maxL);
186
187 if ($bowtie_path ne "") { $bowtie_path .= "/"; }
188
189 my ($fn, $dir, $suf) = fileparse($0);
190 my $command = "";
191
192 if (!$is_sam && !$is_bam) {
193     $command = $bowtie_path."bowtie";
194     if ($no_qual) { $command .= " -f"; }
195     else { $command .= " -q"; }
196     
197     if ($phred33) { $command .= " --phred33-quals"; }
198     elsif ($phred64) { $command .= " --phred64-quals"; }
199     elsif ($solexa) { $command .= " --solexa-quals"; }
200     
201     $command .= " -n $C -e $E -l $L";
202     if ($read_type == 2 || $read_type == 3) { $command .= " -I $minL -X $maxL"; }
203     if ($chunkMbs > 0) { $command .= " --chunkmbs $chunkMbs"; }
204     
205     if ($strand_specific || $probF == 1.0) { $command .= " --norc"; }
206     elsif ($probF == 0.0) { $command .= " --nofw"; }
207
208     $command .= " -p $nThreads -a -m $maxHits -S";
209     if ($quiet) { $command .= " --quiet"; }    
210
211     $command .= " $refName";
212     if ($read_type == 0 || $read_type == 1) {
213         $command .= " $mate1_list"; 
214     }
215     else {
216         $command .= " -1 $mate1_list -2 $mate2_list";
217     }
218
219     # pipe to samtools to generate a BAM file
220     $command .= " | $dir\sam/samtools view -S -b -o $imdName.bam -";
221
222     if ($mTime) { $time_start = time(); }
223
224     &runCommand($command);
225
226     if ($mTime) { $time_end = time(); $time_alignment = $time_end - $time_start; }
227
228     $inpF = "$imdName.bam";
229     $is_bam = 1; # alignments are outputed as a BAM file
230 }
231
232 if ($mTime) { $time_start = time(); }
233
234 $command = $dir."rsem-parse-alignments $refName $imdName $statName";
235
236 my $samInpType;
237 if ($is_sam) { $samInpType = "s"; } 
238 elsif ($is_bam) { $samInpType = "b"; }
239
240 $command .= " $samInpType $inpF -t $read_type";
241 if ($fn_list ne "") { $command .= " -l $fn_list"; }
242 if ($tagName ne "") { $command .= " -tag $tagName"; }
243 if ($quiet) { $command .= " -q"; }
244
245 &runCommand($command);
246
247 $command = $dir."rsem-build-read-index $gap"; 
248 if ($read_type == 0) { $command .= " 0 $quiet $imdName\_alignable.fa"; }
249 elsif ($read_type == 1) { $command .= " 1 $quiet $imdName\_alignable.fq"; }
250 elsif ($read_type == 2) { $command .= " 0 $quiet $imdName\_alignable_1.fa $imdName\_alignable_2.fa"; }
251 elsif ($read_type == 3) { $command .= " 1 $quiet $imdName\_alignable_1.fq $imdName\_alignable_2.fq"; }
252 else { print "Impossible! read_type is not in [1,2,3,4]!\n"; exit(-1); }
253 &runCommand($command);
254
255 my $doesOpen = open(OUTPUT, ">$imdName.mparams");
256 if ($doesOpen == 0) { print "Cannot generate $imdName.mparams!\n"; exit(-1); }
257 print OUTPUT "$minL $maxL\n";
258 print OUTPUT "$probF\n";
259 print OUTPUT "$estRSPD\n";
260 print OUTPUT "$B\n";
261 print OUTPUT "$mate_minL $mate_maxL\n";
262 print OUTPUT "$mean $sd\n";
263 print OUTPUT "$L\n";
264 close(OUTPUT);  
265
266 $command = $dir."rsem-run-em $refName $read_type $sampleName $imdName $statName -p $nThreads";
267 if ($genBamF) { 
268     $command .= " -b $samInpType $inpF";
269     if ($fn_list ne "") { $command .= " 1 $fn_list"; }
270     else { $command .= " 0"; }
271     if ($sampling) { $command .= " --sampling"; }
272 }
273 if ($calcCI || $var_opt) { $command .= " --gibbs-out"; }
274 if ($quiet) { $command .= " -q"; }
275
276 &runCommand($command);
277
278 &collectResults("isoform", "$imdName.iso_res", "$sampleName.isoforms.results"); # isoform level
279 &collectResults("gene", "$imdName.gene_res", "$sampleName.genes.results"); # gene level
280
281 if ($genBamF) {
282     $command = $dir."sam/samtools sort $sampleName.transcript.bam $sampleName.transcript.sorted";
283     &runCommand($command);
284     $command = $dir."sam/samtools index $sampleName.transcript.sorted.bam";
285     &runCommand($command);
286
287     if ($genGenomeBamF) {
288         $command = $dir."rsem-tbam2gbam $refName $sampleName.transcript.bam $sampleName.genome.bam";
289         &runCommand($command);
290         $command = $dir."sam/samtools sort $sampleName.genome.bam $sampleName.genome.sorted";
291         &runCommand($command);
292         $command = $dir."sam/samtools index $sampleName.genome.sorted.bam";
293         &runCommand($command);
294     }
295 }
296
297 if ($mTime) { $time_end = time(); $time_rsem = $time_end - $time_start; }
298
299 if ($mTime) { $time_start = time(); }
300
301 if ($calcCI || $var_opt) {
302     $command = $dir."rsem-run-gibbs $refName $imdName $statName $BURNIN $NCV $SAMPLEGAP";
303     $command .= " -p $nThreads";
304     if ($var_opt) { $command .= " --var"; }
305     if ($quiet) { $command .= " -q"; }
306     &runCommand($command);
307 }
308
309 if ($calcCI) {
310     system("mv $sampleName.isoforms.results $imdName.isoforms.results.bak1");
311     system("mv $sampleName.genes.results $imdName.genes.results.bak1");
312     &collectResults("isoform", "$imdName.iso_res", "$sampleName.isoforms.results"); # isoform level
313     &collectResults("gene", "$imdName.gene_res", "$sampleName.genes.results"); # gene level
314
315     $command = $dir."rsem-calculate-credibility-intervals $refName $imdName $statName $CONFIDENCE $NCV $NSPC $NMB";
316     $command .= " -p $nThreads";
317     if ($quiet) { $command .= " -q"; }
318     &runCommand($command);
319
320     system("mv $sampleName.isoforms.results $imdName.isoforms.results.bak2");
321     system("mv $sampleName.genes.results $imdName.genes.results.bak2");
322     &collectResults("isoform", "$imdName.iso_res", "$sampleName.isoforms.results"); # isoform level
323     &collectResults("gene", "$imdName.gene_res", "$sampleName.genes.results"); # gene level
324 }
325
326 if ($mTime) { $time_end = time(); $time_ci = $time_end - $time_start; }
327
328 if ($mTime) { $time_start = time(); }
329
330 if (!$keep_intermediate_files) {
331     &runCommand("rm -rf $temp_dir", "Fail to delete the temporary folder!");
332 }
333
334 if ($mTime) { $time_end = time(); }
335
336 if ($mTime) { 
337     open(OUTPUT, ">$sampleName.time");
338     print OUTPUT "Aligning reads: $time_alignment s.\n";
339     print OUTPUT "Estimating expression levels: $time_rsem s.\n";
340     print OUTPUT "Calculating credibility intervals: $time_ci s.\n";
341     my $time_del = $time_end - $time_start;
342 #    print OUTPUT "Delete: $time_del s.\n";
343     close(OUTPUT);
344 }
345
346 # command, {err_msg}
347 sub runCommand {
348     print $_[0]."\n";
349     my $status = system($_[0]);
350     if ($status != 0) {
351         my $errmsg = "";
352         if (scalar(@_) > 1) { $errmsg .= $_[1]."\n"; }
353         $errmsg .= "\"$_[0]\" failed! Plase check if you provide correct parameters/options for the pipeline!\n";
354         print $errmsg;
355         exit(-1);
356     }
357     print "\n";
358 }
359  
360 # inpF, outF
361 sub collectResults {
362     my $local_status;
363     my ($inpF, $outF);
364     my @results = ();
365     my $line;
366
367     $inpF = $_[1];
368     $outF = $_[2];
369
370     $local_status = open(INPUT, $inpF);
371     if ($local_status == 0) { print "Fail to open file $inpF!\n"; exit(-1); }
372     
373     @results = ();
374     
375     while ($line = <INPUT>) {
376         chomp($line);
377         my @local_arr = split(/\t/, $line);
378         push(@results, \@local_arr); 
379     }
380
381     close(INPUT);
382
383     $local_status = open(OUTPUT, ">$outF");
384     if ($local_status == 0) { print "Fail to create file $outF!\n"; exit(-1); }
385
386     my $n = scalar(@results);
387     my $m = scalar(@{$results[0]});
388
389     $" = "\t";
390
391     my @out_arr = ();
392     for (my $i = 0; $i < $n; $i++) {
393         if ($_[0] eq "isoform") { push(@out_arr, $transcript_title[$i]); }
394         elsif ($_[0] eq "gene") { push(@out_arr, $gene_title[$i]); }
395         else { print "A bug on 'collectResults' is detected!\n"; exit(-1); }
396     }
397     print OUTPUT "@out_arr\n";
398
399     for (my $i = 0; $i < $m; $i++) {
400         @out_arr = ();
401         for (my $j = 0; $j < $n; $j++) { push(@out_arr, $results[$j][$i]); }
402         print OUTPUT "@out_arr\n"; 
403     }
404
405     close(OUTPUT);
406 }
407
408 __END__
409
410 =head1 NAME
411
412 rsem-calculate-expression
413
414 =head1 SYNOPSIS
415
416 =over
417
418  rsem-calculate-expression [options] upstream_read_file(s) reference_name sample_name
419  rsem-calculate-expression [options] --paired-end upstream_read_file(s) downstream_read_file(s) reference_name sample_name
420  rsem-calculate-expression [options] --sam/--bam [--paired-end] input reference_name sample_name
421
422 =back
423
424 =head1 ARGUMENTS
425
426 =over
427
428 =item B<upstream_read_files(s)>
429
430 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.
431
432 =item B<downstream_read_file(s)>
433
434 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.
435
436 =item B<input>
437
438 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.
439
440 =item B<reference_name>                        
441
442 The name of the reference used.  The user must have run 'rsem-prepare-reference' with this reference_name before running this program.
443
444 =item B<sample_name>
445
446 The name of the sample analyzed. All output files are prefixed by this name (e.g., sample_name.genes.results)
447
448 =back
449
450 =head1 OPTIONS
451
452 =over
453
454 =item B<--paired-end>
455
456 Input reads are paired-end reads. (Default: off)
457
458 =item B<--no-qualities>
459
460 Input reads do not contain quality scores. (Default: off)
461
462 =item B<--strand-specific>
463
464 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)
465
466 =item B<--sam>
467
468 Input file is in SAM format. (Default: off)
469
470 =item B<--bam>
471
472 Input file is in BAM format. (Default: off)
473
474 =item B<--sam-header-info> <file>
475
476 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: "")
477
478 =item B<-p/--num-threads> <int>
479
480 Number of threads to use. Both Bowtie and expression estimation will use this many threads. (Default: 1)
481
482 =item B<--no-bam-output>
483
484 Do not output any BAM file. (Default: off)
485
486 =item B<--output-genome-bam>
487
488 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)
489
490 =item B<--sampling-for-bam>
491
492 When RSEM generates a BAM file, instead of outputing all alignments a read has with their posterior probabilities, one alignment is sampled according to the posterior probabilities. The sampling procedure includes the alignment to the "noise" transcript, which does not appear in the BAM file. Only the sampled alignment has a weight of 1. All other alignments have weight 0. If the "noise" transcript is sampled, all alignments appeared in the BAM file should have weight 0. (Default: off)
493
494 =item B<--calc-ci>
495
496 Calculate 95% credibility intervals and posterior mean estimates.  (Default: off)
497
498 =item B<--seed-length> <int>
499
500 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)
501
502 =item B<--tag> <string>
503
504 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: "")
505
506 =item B<--bowtie-path> <path>
507
508 The path to the bowtie executables. (Default: the path to the bowtie executables is assumed to be in the user's PATH environment variable)
509
510 =item B<--bowtie-n> <int>
511
512 (Bowtie parameter) max # of mismatches in the seed. (Range: 0-3, Default: 2)
513
514 =item B<--bowtie-e> <int>
515
516 (Bowtie parameter) max sum of mismatch quality scores across the alignment. (Default: 99999999)
517
518 =item B<--bowtie-m> <int>
519
520 (Bowtie parameter) suppress all alignments for a read if > <int> valid alignments exist. (Default: 200)
521
522 =item B<--bowtie-chunkmbs> <int>
523
524 (Bowtie parameter) memory allocated for best first alignment calculation (Default: 0 - use bowtie's default)
525
526 =item B<--phred33-quals>
527
528 Input quality scores are encoded as Phred+33. (Default: on)
529
530 =item B<--phred64-quals>
531
532 Input quality scores are encoded as Phred+64 (default for GA Pipeline ver. >= 1.3). (Default: off)
533
534 =item B<--solexa-quals>
535
536 Input quality scores are solexa encoded (from GA Pipeline ver. < 1.3). (Default: off)
537
538 =item B<--forward-prob> <double>
539
540 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)
541
542 =item B<--fragment-length-min> <int>
543
544 Minimum read/insert length allowed. This is also the value for the bowtie -I option. (Default: 1)
545
546 =item B<--fragment-length-max> <int>
547
548 Maximum read/insert length allowed. This is also the value for the bowtie -X option. (Default: 1000)
549
550 =item B<--fragment-length-mean> <double>
551
552 (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)
553
554 =item B<--fragment-length-sd> <double>
555
556 (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>)
557
558 =item B<--estimate-rspd>
559
560 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)
561
562 =item B<--num-rspd-bins> <int>
563
564 Number of bins in the RSPD. Only relevant when '--estimate-rspd' is specified.  Use of the default setting is recommended. (Default: 20)
565
566 =item B<--ci-memory> <int>
567
568 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)
569
570 =item B<--keep-intermediate-files>
571
572 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)
573
574 =item B<--temporary-folder> <string>
575
576 Set where to put the temporary files generated by RSEM. If the folder specified does not exist, RSEM will try to create it. (Default: sample_name.temp)
577
578 =item B<--time>
579
580 Output time consumed by each step of RSEM to 'sample_name.time'. (Default: off)
581
582 =item B<-q/--quiet>
583
584 Suppress the output of logging information. (Default: off)
585
586 =item B<-h/--help>
587
588 Show help information.
589
590 =back
591
592 =head1 DESCRIPTION
593
594 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. 
595
596 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: 
597
598   convert-sam-for-rsem /ref/mouse_125 input.sam -o input_for_rsem.sam  
599
600 For details, please refer to 'convert-sam-for-rsem's documentation page.
601
602 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 '*'. 
603
604 The user must run 'rsem-prepare-reference' with the appropriate reference before using this program.
605
606 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.
607
608 Please note that some of the default values for the Bowtie parameters are not the same as those defined for Bowtie itself.
609
610 The temporary directory and all intermediate files will be removed when RSEM finishes unless '--keep-intermediate-files' is specified.
611
612 With the '--calc-ci' option, 95% credibility intervals and posterior mean estimates will be calculated in addition to maximum likelihood estimates.
613
614 =head1 OUTPUT
615
616 =over
617
618 =item B<sample_name.isoforms.results> 
619
620 File containing isoform level expression estimates. The first line
621 contains column names separated by the tab character. The format of
622 each line in the rest of this file is:
623
624 transcript_id gene_id length effective_length expected_count TPM FPKM IsoPct [pme_expected_count pme_TPM pme_FPKM IsoPct_from_pme_TPM TPM_ci_lower_bound TPM_ci_upper_bound FPKM_ci_lower_bound FPKM_ci_upper_bound]
625
626 Fields are separated by the tab character. Fields within "[]" are only
627 presented if '--calc-ci' is set.
628
629 'transcript_id' is the transcript name of this transcript. 'gene_id'
630 is the gene name of the gene which this transcript belongs to (denote
631 this gene as its parent gene). If no gene information is provided,
632 'gene_id' and 'transcript_id' are the same.
633
634 'length' is this transcript's sequence length (poly(A) tail is not
635 counted). 'effective_length' counts only the positions that can
636 generate a valid fragment. If no poly(A) tail is added,
637 'effective_length' is equal to transcript length - mean fragment
638 length + 1. If one transcript's effective length is less than 1, this
639 transcript's both effective length and abundance estimates are set to
640 0.
641
642 'expected_count' is the sum of the posterior probability of each read
643 comes from this transcript over all reads. Because 1) each read
644 aligning to this transcript has a probability of being generated from
645 background noise; 2) RSEM may filter some alignable low quality reads,
646 the sum of expected counts for all transcript are generally less than
647 the total number of reads aligned.
648
649 'TPM' stands for Transcripts Per Million. It is a relative measure of
650 transcript abundance. The sum of all transcripts' TPM is 1
651 million. 'FPKM' stands for Fragments Per Kilobase of transcript per
652 Million mapped reads. It is another relative measure of transcript
653 abundance. If we define l_bar be the mean transcript length in a
654 sample, which can be calculated as
655
656 l_bar = \sum_i TPM_i / 10^6 * effective_length_i (i goes through every transcript), 
657
658 the following equation is hold:
659
660 FPKM_i = 10^3 / l_bar * TPM_i.
661
662 We can see that the sum of FPKM is not a constant across samples.
663
664 'IsoPct' stands for isoform percentage. It is the percentage of this
665 transcript's abandunce over its parent gene's abandunce. If its parent
666 gene has only one isoform or the gene information is not provided,
667 this field will be set to 100.
668
669 'pme_expected_count', 'pme_TPM', 'pme_FPKM' are posterior mean
670 estimates calculated by RSEM's Gibbs sampler. 'IsoPct_from_pme_TPM' is
671 the isoform percentage calculated from 'pme_TPM' values.
672
673 'TPM_ci_lower_bound', 'TPM_ci_upper_bound', 'FPKM_ci_lower_bound' and
674 'FPKM_ci_upper_bound' are lower(l) and upper(u) bounds of 95%
675 credibility intervals for TPM and FPKM values. The bounds are
676 inclusive (i.e. [l, u]).
677
678 =item B<sample_name.genes.results>
679
680 File containing gene level expression estimates. The first line
681 contains column names separated by the tab character. The format of
682 each line in the rest of this file is:
683
684 gene_id transcript_id(s) length effective_length expected_count TPM FPKM [pme_expected_count pme_TPM pme_FPKM TPM_ci_lower_bound TPM_ci_upper_bound FPKM_ci_lower_bound FPKM_ci_upper_bound]
685
686 Fields are separated by the tab character. Fields within "[]" are only
687 presented if '--calc-ci' is set. 
688
689 'transcript_id(s)' is a comma-separated list of transcript_ids
690 belonging to this gene. If no gene information is provided, 'gene_id'
691 and 'transcript_id(s)' are identical (the 'transcript_id').
692
693 A gene's 'length' and 'effective_length' are
694 defined as the weighted average of its transcripts' lengths and
695 effective lengths (weighted by 'IsoPct'). A gene's abundance estimates
696 are just the sum of its transcripts' abundance estimates.
697
698 =item B<sample_name.transcript.bam, sample_name.transcript.sorted.bam and sample_name.transcript.sorted.bam.bai>
699
700 Only generated when --no-bam-output is not specified.
701
702 'sample_name.transcript.bam' is a BAM-formatted file of read
703 alignments in transcript coordinates. The MAPQ field of each alignment
704 is set to min(100, floor(-10 * log10(1.0 - w) + 0.5)), where w is the
705 posterior probability of that alignment being the true mapping of a
706 read.  In addition, RSEM pads a new tag ZW:f:value, where value is a
707 single precision floating number representing the posterior
708 probability. Because this file contains all alignment lines produced
709 by bowtie or user-specified aligners, it can also be used as a
710 replacement of the aligner generated BAM/SAM file. For paired-end
711 reads, if one mate has alignments but the other does not, this file
712 marks the alignable mate as "unmappable" (flag bit 0x4) and appends an
713 optional field "Z0:A:!".
714
715 'sample_name.transcript.sorted.bam' and
716 'sample_name.transcript.sorted.bam.bai' are the sorted BAM file and
717 indices generated by samtools (included in RSEM package).
718
719 =item B<sample_name.genome.bam, sample_name.genome.sorted.bam and sample_name.genome.sorted.bam.bai>
720
721 Only generated when --no-bam-output is not specified and --output-genome-bam is specified.
722
723 'sample_name.genome.bam' is a BAM-formatted file of read alignments in
724 genomic coordinates. Alignments of reads that have identical genomic
725 coordinates (i.e., alignments to different isoforms that share the
726 same genomic region) are collapsed into one alignment.  The MAPQ field
727 of each alignment is set to min(100, floor(-10 * log10(1.0 - w) +
728 0.5)), where w is the posterior probability of that alignment being
729 the true mapping of a read.  In addition, RSEM pads a new tag
730 ZW:f:value, where value is a single precision floating number
731 representing the posterior probability. If an alignment is spliced, a
732 XS:A:value tag is also added, where value is either '+' or '-'
733 indicating the strand of the transcript it aligns to.
734
735 'sample_name.genome.sorted.bam' and 'sample_name.genome.sorted.bam.bai' are the
736 sorted BAM file and indices generated by samtools (included in RSEM package).
737
738 =item B<sample_name.time>
739
740 Only generated when --time is specified.
741
742 It contains time (in seconds) consumed by aligning reads, estimating expression levels and calculating credibility intervals.
743
744 =item B<sample_name.stat>
745
746 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.
747
748 =back
749
750 =head1 EXAMPLES
751
752 Assume the path to the bowtie executables is in the user's PATH environment variable. Reference files are under '/ref' with name 'mouse_125'. 
753
754 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:
755
756  rsem-calculate-expression --phred64-quals \
757                            -p 8 \
758                            --output-genome-bam \
759                            /data/mmliver.fq \
760                            /ref/mouse_125 \
761                            mmliver_single_quals
762
763 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:
764
765  rsem-calculate-expression -p 8 \
766                            --paired-end \
767                            /data/mmliver_1.fq \
768                            /data/mmliver_2.fq \
769                            /ref/mouse_125 \
770                            mmliver_paired_end_quals
771
772 3) '/data/mmliver.fa', single-end reads without quality scores. We want to use 8 threads:
773
774  rsem-calculate-expression -p 8 \
775                            --no-qualities \
776                            /data/mmliver.fa \
777                            /ref/mouse_125 \
778                            mmliver_single_without_quals
779
780 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:
781
782  rsem-calculate-expression --bowtie-path /sw/bowtie \
783                            --phred64-quals \
784                            --fragment-length-mean 150.0 \
785                            --fragment-length-sd 35.0 \
786                            -p 8 \
787                            --output-genome-bam \
788                            --calc-ci \
789                            --ci-memory 1024 \
790                            /data/mmliver.fq \
791                            /ref/mouse_125 \
792                            mmliver_single_quals
793
794 5) '/data/mmliver_paired_end_quals.bam', paired-end reads with quality scores.  We want to use 8 threads:
795
796  rsem-calculate-expression --paired-end \
797                            --bam \
798                            -p 8 \
799                            /data/mmliver_paired_end_quals.bam \
800                            /ref/mouse_125 \
801                            mmliver_paired_end_quals
802
803 =cut