]> git.donarmstrong.com Git - rsem.git/blobdiff - rsem-calculate-expression
Added --seed option to set random number generator seeds in 'rsem-calculate-expression'
[rsem.git] / rsem-calculate-expression
index a9f26c9d47142988d4d7e2fd52022f673f2e2819..d6cb5f2a3f6b989ced2e1f96b3302c8d720ba9b5 100755 (executable)
@@ -2,12 +2,16 @@
 
 use Getopt::Long;
 use Pod::Usage;
-use FindBin;
-use lib $FindBin::Bin;
-use strict;
 
+use FindBin;
+use lib $FindBin::RealBin;
 use rsem_perl_utils qw(runCommand collectResults showVersionInfo);
 
+use Env qw(@PATH);
+@PATH = ($FindBin::RealBin, "$FindBin::RealBin/sam", @PATH);
+
+use strict;
+
 #const
 my $BURNIN = 200;
 my $NCV = 1000;
@@ -69,6 +73,8 @@ my $bowtie2_mismatch_rate = 0.1;
 my $bowtie2_k = 200;
 my $bowtie2_sensitivity_level = "sensitive"; # must be one of "very_fast", "fast", "sensitive", "very_sensitive"
 
+my $seed = "NULL";
+
 my $version = 0;
 
 my $mTime = 0;
@@ -122,15 +128,14 @@ GetOptions("keep-intermediate-files" => \$keep_intermediate_files,
           "calc-ci" => \$calcCI,
           "ci-memory=i" => \$NMB,
           "samtools-sort-mem=s" => \$SortMem,
+          "seed=i" => \$seed,
           "time" => \$mTime,
           "version" => \$version,
           "q|quiet" => \$quiet,
           "h|help" => \$help) or pod2usage(-exitval => 2, -verbose => 2);
 
-my $dir = "$FindBin::Bin/";
-
 pod2usage(-verbose => 2) if ($help == 1);
-&showVersionInfo($dir) if ($version == 1);
+&showVersionInfo($FindBin::RealBin) if ($version == 1);
 
 #check parameters and options
 
@@ -158,6 +163,7 @@ pod2usage(-msg => "Number of threads should be at least 1!\n", -exitval => 2, -v
 pod2usage(-msg => "Seed length should be at least 5!\n", -exitval => 2, -verbose => 2) if ($L < 5);
 pod2usage(-msg => "--sampling-for-bam cannot be specified if --no-bam-output is specified!\n", -exitval => 2, -verbose => 2) if ($sampling && !$genBamF);
 pod2usage(-msg => "--output-genome-bam cannot be specified if --no-bam-output is specified!\n", -exitval => 2, -verbose => 2) if ($genGenomeBamF && !$genBamF);
+pod2usage(-msg => "The seed for random number generator must be a non-negative 32bit integer!\n", -exitval => 2, -verbose => 2) if (($seed ne "NULL") && ($seed < 0 || $seed > 0xffffffff));
 
 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"; }
 
@@ -251,7 +257,7 @@ if (!$is_sam && !$is_bam) {
        }
 
        # pipe to samtools to generate a BAM file
-       $command .= " | $dir\sam/samtools view -S -b -o $imdName.bam -";
+       $command .= " | samtools view -S -b -o $imdName.bam -";
     }
     else {
        $command = $bowtie2_path."bowtie2";
@@ -286,7 +292,7 @@ if (!$is_sam && !$is_bam) {
        }
 
        # pipe to samtools to generate a BAM file
-       $command .= " | $dir\sam/samtools view -S -b -o $imdName.bam -";
+       $command .= " | samtools view -S -b -o $imdName.bam -";
     }
 
     if ($mTime) { $time_start = time(); }
@@ -301,7 +307,7 @@ if (!$is_sam && !$is_bam) {
 
 if ($mTime) { $time_start = time(); }
 
-$command = $dir."rsem-parse-alignments $refName $imdName $statName";
+$command = "rsem-parse-alignments $refName $imdName $statName";
 
 my $samInpType;
 if ($is_sam) { $samInpType = "s"; } 
@@ -314,7 +320,7 @@ if ($quiet) { $command .= " -q"; }
 
 &runCommand($command);
 
-$command = $dir."rsem-build-read-index $gap"; 
+$command = "rsem-build-read-index $gap"; 
 if ($read_type == 0) { $command .= " 0 $quiet $imdName\_alignable.fa"; }
 elsif ($read_type == 1) { $command .= " 1 $quiet $imdName\_alignable.fq"; }
 elsif ($read_type == 2) { $command .= " 0 $quiet $imdName\_alignable_1.fa $imdName\_alignable_2.fa"; }
@@ -333,12 +339,21 @@ print OUTPUT "$mean $sd\n";
 print OUTPUT "$L\n";
 close(OUTPUT);  
 
-$command = $dir."rsem-run-em $refName $read_type $sampleName $imdName $statName -p $nThreads";
+my @seeds = ();
+if ($seed ne "NULL") { 
+    srand($seed); 
+    for (my $i = 0; $i < 3; $i++) {
+       push(@seeds, int(rand(1 << 32))); 
+    }
+}
+
+$command = "rsem-run-em $refName $read_type $sampleName $imdName $statName -p $nThreads";
 if ($genBamF) { 
     $command .= " -b $samInpType $inpF";
     if ($fn_list ne "") { $command .= " 1 $fn_list"; }
     else { $command .= " 0"; }
     if ($sampling) { $command .= " --sampling"; }
+    if ($seed ne "NULL") { $command .= " --seed $seeds[0]"; }
 }
 if ($calcPME || $var_opt || $calcCI) { $command .= " --gibbs-out"; }
 if ($quiet) { $command .= " -q"; }
@@ -356,17 +371,17 @@ else {
 }
 
 if ($genBamF) {
-    $command = $dir."sam/samtools sort -@ $nThreads -m $SortMem $sampleName.transcript.bam $sampleName.transcript.sorted";
+    $command = "samtools sort -@ $nThreads -m $SortMem $sampleName.transcript.bam $sampleName.transcript.sorted";
     &runCommand($command);
-    $command = $dir."sam/samtools index $sampleName.transcript.sorted.bam";
+    $command = "samtools index $sampleName.transcript.sorted.bam";
     &runCommand($command);
 
     if ($genGenomeBamF) {
-       $command = $dir."rsem-tbam2gbam $refName $sampleName.transcript.bam $sampleName.genome.bam";
+       $command = "rsem-tbam2gbam $refName $sampleName.transcript.bam $sampleName.genome.bam";
        &runCommand($command);
-       $command = $dir."sam/samtools sort -@ $nThreads -m $SortMem $sampleName.genome.bam $sampleName.genome.sorted";
+       $command = "samtools sort -@ $nThreads -m $SortMem $sampleName.genome.bam $sampleName.genome.sorted";
        &runCommand($command);
-       $command = $dir."sam/samtools index $sampleName.genome.sorted.bam";
+       $command = "samtools index $sampleName.genome.sorted.bam";
        &runCommand($command);
     }
 }
@@ -376,9 +391,10 @@ if ($mTime) { $time_end = time(); $time_rsem = $time_end - $time_start; }
 if ($mTime) { $time_start = time(); }
 
 if ($calcPME || $var_opt || $calcCI ) {
-    $command = $dir."rsem-run-gibbs $refName $imdName $statName $BURNIN $NCV $SAMPLEGAP";
+    $command = "rsem-run-gibbs $refName $imdName $statName $BURNIN $NCV $SAMPLEGAP";
     $command .= " -p $nThreads";
     if ($var_opt) { $command .= " --var"; }
+    if ($seed ne "NULL") { $command .= " --seed $seeds[1]"; }
     if ($quiet) { $command .= " -q"; }
     &runCommand($command);
 }
@@ -401,8 +417,9 @@ if ($calcPME || $calcCI) {
 }
 
 if ($calcCI) {
-    $command = $dir."rsem-calculate-credibility-intervals $refName $imdName $statName $CONFIDENCE $NCV $NSPC $NMB";
+    $command = "rsem-calculate-credibility-intervals $refName $imdName $statName $CONFIDENCE $NCV $NSPC $NMB";
     $command .= " -p $nThreads";
+    if ($seed ne "NULL") { $command .= " --seed $seeds[2]"; }
     if ($quiet) { $command .= " -q"; }
     &runCommand($command);
 
@@ -524,6 +541,10 @@ Generate a BAM file, 'sample_name.genome.bam', with alignments mapped to genomic
 
 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)
 
+=item B<--seed> <uint32>
+
+Set the seed for the random number generators used in calculating posterior mean estimates and credibility intervals. The seed must be a non-negative 32 bit interger. (Default: off)
+
 =item B<--calc-pme>
 
 Run RSEM's collapsed Gibbs sampler to calculate posterior mean estimates. (Default: off)