Exemplo n.º 1
0
        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));
        }
Exemplo n.º 2
0
        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));
        }
Exemplo n.º 3
0
        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")));
        }