private static void MergeAndFinalizeBam(List <string> perChromPaths, ISamtoolsWrapper samtoolsWrapper, string outFolder, string outputBamName)
        {
            var finalBams = perChromPaths;
            var mergedBam = Path.Combine(outFolder, outputBamName);

            Logger.WriteToLog($"Calling samtools cat on {perChromPaths.Count} files to create {mergedBam}.");

            samtoolsWrapper.SamtoolsCat(mergedBam, finalBams);

            Logger.WriteToLog($"Calling samtools index on {mergedBam}.");
            samtoolsWrapper.SamtoolsIndex(mergedBam);
            Logger.WriteToLog("Done finalizing bam.");
        }
示例#2
0
        public GeminiWorkflow(IGeminiDataSourceFactory dataSourceFactory,
                              IGeminiDataOutputFactory dataOutputFactory, GeminiOptions geminiOptions,
                              GeminiSampleOptions geminiSampleOptions, RealignmentOptions realignmentOptions, StitcherOptions stitcherOptions, string outputDirectory, RealignmentAssessmentOptions realignmentAssessmentOptions, IndelFilteringOptions indelFilteringOptions, ISamtoolsWrapper samtoolsWrapper)
        {
            _dataSourceFactory   = dataSourceFactory;
            _dataOutputFactory   = dataOutputFactory;
            _geminiOptions       = geminiOptions;
            _geminiSampleOptions = geminiSampleOptions;
            _realignmentOptions  = realignmentOptions;
            _samtoolsWrapper     = samtoolsWrapper;
            _stitcherOptions     = stitcherOptions ?? new StitcherOptions();

            _geminiFactory = new GeminiFactory(geminiOptions, indelFilteringOptions);
            var bamRealignmentFactory = new BamRealignmentFactory(geminiOptions,
                                                                  realignmentAssessmentOptions, stitcherOptions, realignmentOptions,
                                                                  outputDirectory);

            _bamRealignmentFactory = bamRealignmentFactory;
        }
示例#3
0
        private static string MergeAndFinalizeBam(List <string> finalBams, ISamtoolsWrapper samtoolsWrapper, string outFolder, string outFileName, bool keepUnmerged = false, bool doIndex = false, bool doSort = true)
        {
            var mergedBam         = Path.Combine(outFolder, outFileName);
            var sortedMerged      = mergedBam + ".sorted";
            var sortedMergedFinal = sortedMerged + ".bam";

            Logger.WriteToLog($"Calling cat on {finalBams.Count} with output at {mergedBam}.");
            foreach (var finalBam in finalBams)
            {
                Logger.WriteToLog($"Intermediate bam: {finalBam}\t{new FileInfo(finalBam).Length}B");
            }
            samtoolsWrapper.SamtoolsCat(mergedBam, finalBams);
            if (doSort)
            {
                Logger.WriteToLog($"Calling samtools sort on {mergedBam}.");
                samtoolsWrapper.SamtoolsSort(mergedBam, sortedMerged, 3, 500);
            }

            if (doIndex)
            {
                Logger.WriteToLog($"Calling samtools index on {sortedMergedFinal}.");
                samtoolsWrapper.SamtoolsIndex(sortedMergedFinal);
            }

            Logger.WriteToLog("Done finalizing bam.");

            if (File.Exists(sortedMergedFinal) && !keepUnmerged)
            {
                Logger.WriteToLog("Deleting intermediate bams.");
                foreach (var finalBam in finalBams)
                {
                    File.Delete(finalBam);
                }
                File.Delete(mergedBam);

                Logger.WriteToLog("Finished deleting intermediate bams.");
            }

            return(sortedMergedFinal);
        }
        public void Execute(ICliTaskManager cliTaskManager, Dictionary <string, int> chromRefIds, List <string> cmdLineList, ISamtoolsWrapper samtoolsWrapper)
        {
            var bamFile      = _options.InputBam;
            var outMultiPath = _options.OutputDirectory;
            var exePath      = _options.ExePath;

            List <string> paths;

            var taskDirectories = new List <string>();
            var taskLogDir      = Path.Combine(outMultiPath, "TaskLogs");


            if (_options.MultiProcess)
            {
                paths = ExecuteChromosomeJobs(cliTaskManager, chromRefIds, cmdLineList, outMultiPath, taskLogDir, exePath, taskDirectories);
            }
            else
            {
                paths = ExecuteChromosomeJobs(chromRefIds, outMultiPath,
                                              taskDirectories);
            }

            var outBamName = Path.GetFileNameWithoutExtension(bamFile) + ".PairRealigned.bam";

            MergeAndFinalizeBam(paths, samtoolsWrapper, outMultiPath,
                                outBamName);

            try
            {
                CleanUp(outMultiPath, taskDirectories, taskLogDir);
            }
            catch (Exception e)
            {
                Logger.WriteExceptionToLog(new Exception($"Error encountered during cleanup step (after analysis completion).", e));
            }
        }
示例#5
0
        private static void MergeAndFinalizeBam(Dictionary <string, Dictionary <PairClassification, List <string> > > categorizedAlignments, ISamtoolsWrapper samtoolsWrapper, string outFolder, bool keepUnmerged = false, bool indexFinalBam = false, bool doSort = true)
        {
            var finalBams = new List <string>();

            if (categorizedAlignments.Keys.Count > 1)
            {
                foreach (var chrom in categorizedAlignments.Keys)
                {
                    var chromFinalBams = categorizedAlignments[chrom].Values;
                    if (!chromFinalBams.Any())
                    {
                        Logger.WriteToLog($"No bams to merge for chromosome {chrom}.");
                        continue;
                    }
                    var sortedMergedChromBam = MergeAndFinalizeBam(chromFinalBams.SelectMany(x => x).ToList(), samtoolsWrapper, outFolder, chrom + "_merged.bam", keepUnmerged: keepUnmerged, doIndex: false, doSort: doSort);
                    finalBams.Add(sortedMergedChromBam);
                }
            }
            else
            {
                if (categorizedAlignments.Keys.Any())
                {
                    var chrom = categorizedAlignments.Keys.First();
                    finalBams = categorizedAlignments[chrom].Values.SelectMany(x => x).ToList();
                }
                else
                {
                    Logger.WriteToLog("No chromosomes with bams to merge.");
                }
            }

            if (finalBams.Any())
            {
                MergeAndFinalizeBam(finalBams, samtoolsWrapper, outFolder, "merged.bam", keepUnmerged, indexFinalBam, doSort: doSort);
            }
        }