Esempio n. 1
0
        private static void WriteAlignments(string chrom, IWriterSource writerSource, PairClassification classification,
                                            List <BamAlignment> alignments)
        {
            var idNum                = Thread.CurrentThread.ManagedThreadId;
            var writerHandle         = writerSource.BamWriterHandle(chrom, classification, idNum);
            var numAlignmentsWritten = 0;

            foreach (var alignment in alignments)
            {
                if (alignment == null)
                {
                    continue;
                }

                numAlignmentsWritten++;

                writerHandle.WriteAlignment(alignment);
            }

            alignments.Clear();
            writerSource.DoneWithWriter(chrom, classification, idNum, numAlignmentsWritten, writerHandle);
        }
Esempio n. 2
0
        public ActionBlock <PairResult[]> GetEarlyFlushBlock(PairClassification classification, bool isSingleMismatch)
        {
            var actBlock = new ActionBlock <PairResult[]>((p) =>
            {
                if (_lightDebug)
                {
                    Logger.WriteToLog(
                        $"Started handling {classification} block for region {_chrom}:{_startPosition}-{_endPosition}.");
                }

                var toRemove2 = _allToWaitFor.Keys.Where(x => x.IsCompleted);
                foreach (var task in toRemove2)
                {
                    _allToWaitFor.TryRemove(task, out _);
                }

                if (_debug)
                {
                    Console.WriteLine($"{p.Length} pairs in category {classification} in {_startPosition}-{_endPosition}");
                }

                var idNum        = Thread.CurrentThread.ManagedThreadId;
                var writerHandle = _writerSource.BamWriterHandle(_chrom, classification, _startPosition);

                _categoryLookup.AddOrUpdate(classification, p.Sum(x => x.ReadPair.NumPrimaryReads),
                                            (c, n) => { return(n + p.Sum(x => x.ReadPair.NumPrimaryReads)); });

                if (_filterForProperPairs && _improperTypes.Contains(classification))
                {
                    _progressTracker.AddOrUpdate("Skipped", p.Sum(x => x.ReadPair.NumPrimaryReads),
                                                 (c, n) => { return(n + p.Sum(x => x.ReadPair.NumPrimaryReads)); });
                }
                else
                {
                    var numAlignmentsWritten = 0;

                    var classificationString = classification.ToString();
                    foreach (var pair in p)
                    {
                        if (classification != PairClassification.Duplicate)
                        {
                            // Don't add bin evidence for duplicates, may wash the signal out
                            BinEvidenceHelpers.AddEvidence(pair, _messySiteWidth, _adjustedStartPosition,
                                                           _totalBinCounts,
                                                           _singleMismatchBinCounts, isSingleMismatch, _numBins, _refId);
                        }

                        foreach (var alignment in pair.Alignments)
                        {
                            if (alignment == null)
                            {
                                continue;
                            }

                            alignment.ReplaceOrAddStringTag("XP", classificationString);
                            numAlignmentsWritten++;

                            if (writerHandle == null)
                            {
                                throw new Exception("This is odd, why is the handle null");
                            }

                            writerHandle.WriteAlignment(alignment);
                        }
                    }

                    _progressTracker.AddOrUpdate("Early Flushed", p.Sum(x => x.ReadPair.NumPrimaryReads),
                                                 (s, n) => { return(n + p.Sum(x => x.ReadPair.NumPrimaryReads)); });
                    _progressTracker.AddOrUpdate("Simple Alignments Written", numAlignmentsWritten,
                                                 (s, n) => { return(n + numAlignmentsWritten); });


                    Array.Clear(p, 0, p.Length);
                    _writerSource.DoneWithWriter(_chrom, classification, idNum, numAlignmentsWritten, writerHandle);
                    if (_lightDebug)
                    {
                        Logger.WriteToLog(
                            $"Done handling {classification} block for region {_chrom}:{_startPosition}-{_endPosition}.");
                    }
                }
            }, new ExecutionDataflowBlockOptions()
            {
                MaxDegreeOfParallelism = _maxDegreeOfParallelism, EnsureOrdered = true
            });

            return(actBlock);
        }