public void Execute() { var readStatuses = new ReadStatusCounter(); var pairHandler = CreatePairHandler(readStatuses); var stitcherPairFilter = new StitcherPairFilter(_options.FilterDuplicates, _options.FilterForProperPairs, CreateDuplicateIdentifier(), readStatuses, minMapQuality: _options.FilterMinMapQuality); Logger.WriteToLog(string.Format("Beginning execution of {0}.", _inBam + (_chrFilter != null ? ":" + _chrFilter : ""))); using (var bamWriter = CreateBamWriter()) { using (var bamReader = CreateBamReader()) { var rewriter = new BamRewriter(bamReader, bamWriter, stitcherPairFilter, pairHandler, bufferSize: 100000, getUnpaired: _options.KeepUnpairedReads, chrFilter: _chrFilter); rewriter.Execute(); } } foreach (var readStatus in readStatuses.GetReadStatuses()) { Logger.WriteToLog((_chrFilter ?? "") + " STATUSCOUNT " + readStatus.Key + ": " + readStatus.Value); } if (_options.Debug || _options.DebugSummary) { foreach (var readStatus in readStatuses.GetDebugReadStatuses()) { Logger.WriteToLog((_chrFilter ?? "") + " STATUSCOUNT " + readStatus.Key + ": " + readStatus.Value); } } Logger.WriteToLog(string.Format("Done writing filtered bam at '{0}'.", _outBam)); }
public void Execute() { var readStatuses = new ReadStatusCounter(); var pairHandlers = CreatePairHandlers(readStatuses, _options.NumThreads); var stitcherPairFilter = new StitcherPairFilter(_options.FilterDuplicates, _options.FilterForProperPairs, CreateDuplicateIdentifier(), readStatuses, minMapQuality: _options.FilterMinMapQuality, filterPairUnmapped: _options.FilterPairUnmapped, filterPairLowMapQ: _options.FilterPairLowMapQ); BlockingCollection <Task> taskQueue = null; ThreadPool threadPool = null; if (_options.NumThreads > 1) { taskQueue = new BlockingCollection <Task>(4 * _options.NumThreads); threadPool = new ThreadPool(taskQueue, _options.NumThreads); } Logger.WriteToLog(string.Format("Beginning execution of {0}.", _inBam + (_chrFilter != null ? ":" + _chrFilter : ""))); using (var bamWriter = CreateBamWriter()) { using (var bamReader = CreateBamReader()) { var rewriter = new BamRewriter(bamReader, bamWriter, stitcherPairFilter, pairHandlers, taskQueue, getUnpaired: _options.KeepUnpairedReads, chrFilter: _chrFilter); rewriter.Execute(); } threadPool?.RunToCompletion(); foreach (var pairHandler in pairHandlers) { pairHandler.Finish(); } Logger.WriteToLog("Finished stitching. Starting sort and write."); bamWriter.Flush(); } foreach (var readStatus in readStatuses.GetReadStatuses()) { Logger.WriteToLog((_chrFilter ?? "") + " STATUSCOUNT " + readStatus.Key + ": " + readStatus.Value); } if (_options.Debug || _options.DebugSummary) { foreach (var readStatus in readStatuses.GetDebugReadStatuses()) { Logger.WriteToLog((_chrFilter ?? "") + " STATUSCOUNT " + readStatus.Key + ": " + readStatus.Value); } } Logger.WriteToLog(string.Format("Done writing filtered bam at '{0}'.", _outBam)); }
public void ExecuteTest() { var alignmentsToRead = new List <BamAlignment>() { CreateAlignment("pair"), CreateAlignment("pair2"), CreateAlignment("single") }; var writtenAlignments = new List <BamAlignment>(); var unpairedAlignments = new List <BamAlignment>(); var bamWriter = new Mock <IBamWriterMultithreaded>(); bamWriter.Setup(x => x.WriteAlignment(It.IsAny <BamAlignment>())).Callback <BamAlignment>((b) => writtenAlignments.Add(b)); var bamWriterHandle = new Mock <IBamWriterHandle>(); var bamWriterHandleList = new List <IBamWriterHandle>(); bamWriterHandleList.Add(bamWriterHandle.Object); bamWriterHandle.Setup(x => x.WriteAlignment(It.IsAny <BamAlignment>())).Callback <BamAlignment>((b) => writtenAlignments.Add(b)); bamWriter.Setup(x => x.GenerateHandles()).Returns(() => { return(bamWriterHandleList); }); bamWriter.Setup(x => x.Flush()); var alignmentPairFilter = new Mock <IAlignmentPairFilter>(); alignmentPairFilter.Setup(f => f.TryPair(It.IsAny <BamAlignment>())) .Returns <BamAlignment>((b) => { if (b.Name.StartsWith("pair")) { var x = new ReadPair(b); x.AddAlignment(b); return(x); } unpairedAlignments.Add(b); return(null); } ); alignmentPairFilter.Setup(f => f.GetFlushableUnpairedReads()).Returns(unpairedAlignments); BlockingCollection <Task> taskQueue = new BlockingCollection <Task>(); // Create a thread pool with 1 thread. It will execute any tasks // added to the taskQueue by the BamRewriter. ThreadPool threadPool = new ThreadPool(taskQueue, 1); var readPairHandler = new Mock <IReadPairHandler>(); readPairHandler.Setup(h => h.ExtractReads(It.IsAny <ReadPair>())).Returns <ReadPair>( (p) => { var list = new List <BamAlignment>(); list.AddRange(p.Read1Alignments); list.AddRange(p.Read2Alignments); return(list); } ); // Given a list of reads, should try to pair them all // Should flush to bam once the buffer reaches the specified size // If specifying getUnpaired = true, should also flush unpaired reads (as designated by the filter) to the bam var bamRewriter = new BamRewriter(MockBamReader(alignmentsToRead), bamWriter.Object, alignmentPairFilter.Object, new List <IReadPairHandler> { readPairHandler.Object }, taskQueue, true); bamRewriter.Execute(); Assert.Equal(5, writtenAlignments.Count); // Should get all of the reads flushed, regardless of buffer size writtenAlignments.Clear(); unpairedAlignments.Clear(); bamRewriter = new BamRewriter(MockBamReader(alignmentsToRead), bamWriter.Object, alignmentPairFilter.Object, new List <IReadPairHandler> { readPairHandler.Object }, taskQueue, true); bamRewriter.Execute(); Assert.Equal(5, writtenAlignments.Count); writtenAlignments.Clear(); unpairedAlignments.Clear(); bamRewriter = new BamRewriter(MockBamReader(alignmentsToRead), bamWriter.Object, alignmentPairFilter.Object, new List <IReadPairHandler> { readPairHandler.Object }, taskQueue, true); bamRewriter.Execute(); Assert.Equal(5, writtenAlignments.Count); // If getUnpaired = false, should not flush unpaired reads to the bam writtenAlignments.Clear(); unpairedAlignments.Clear(); bamRewriter = new BamRewriter(MockBamReader(alignmentsToRead), bamWriter.Object, alignmentPairFilter.Object, new List <IReadPairHandler> { readPairHandler.Object }, taskQueue, false); bamRewriter.Execute(); Assert.Equal(4, writtenAlignments.Count); Assert.True(writtenAlignments.All(a => a.Name.StartsWith("pair"))); }