public static void AddEvidence(PairResult pairResult, int siteWidth, int regionStart,
                                       ConcurrentDictionary <int, uint> allHits, ConcurrentDictionary <int, uint> probableTrueSnvRegionsLookup,
                                       bool isSingleMismatch, int numBins, int refId)
        {
            foreach (var aln in pairResult.Alignments)
            {
                if (aln.RefID != refId)
                {
                    continue;
                }

                var lastBinSpannedByRead = (aln.EndPosition - regionStart) / siteWidth;
                var firstBin             = (aln.Position - regionStart) / siteWidth;

                for (int i = firstBin; i <= Math.Min(lastBinSpannedByRead, numBins - 1); i++)
                {
                    allHits[i]++;

                    if (isSingleMismatch)
                    {
                        probableTrueSnvRegionsLookup[i]++;
                    }
                }
            }
        }
        public int Find(IRawFile reader, int scan)
        {
            PairResult pr;

            if (!map.TryGetValue(reader, out pr) || !reader.FileName.Equals(pr.FileName))
            {
                pr = new PairResult()
                {
                    FileName = reader.FileName,
                    ScanMap  = builder.GetScanLevels(reader).ToDictionary(m => m.Scan)
                };
                map[reader] = pr;
            }

            ScanLevel level;

            if (pr.ScanMap.TryGetValue(scan, out level))
            {
                if (level.Parent != null)
                {
                    return(level.Parent.Scan);
                }
            }

            return(0);
        }
예제 #3
0
        public override PairResult[] GetValueOutput()
        {
            PairResult[] res = new PairResult[3];
            res[0] = new PairResult() { Title = TAG_TITLE + this.Name, Value = Tag };
            res[1] = new PairResult() { Title = LENGTH_TITLE + this.Name, Value = Length.ToString("X2")};
            res[2] = new PairResult() { Title = VALUE_TITLE+ this.Name, Value = Value};

            return res;
        }
 private static void AddMdTagCountsTags(BamAlignment bamAlignment, PairResult pairResult)
 {
     if (pairResult.md1.IsSet)
     {
         bamAlignment.ReplaceOrAddStringTag("XM",
                                            $"A: {pairResult.md1.A},{pairResult.md2.A}; T: {pairResult.md1.T},{pairResult.md2.T}; C: {pairResult.md1.C},{pairResult.md2.C}; G: {pairResult.md1.G},{pairResult.md2.G}; subA: {pairResult.md1.SubA},{pairResult.md2.SubA}; subT: {pairResult.md1.SubT},{pairResult.md2.SubT}; subC: {pairResult.md1.SubC},{pairResult.md2.SubC}; subG: {pairResult.md1.SubG},{pairResult.md2.SubG}; subN: {pairResult.md1.SubN},{pairResult.md2.SubN}; maxRun: {pairResult.md1.RunLength},{pairResult.md2.RunLength}; numRuns: {pairResult.md1.NumInRuns},{pairResult.md2.NumInRuns}");
     }
     else
     {
         bamAlignment.ReplaceOrAddStringTag("XM", $"Not set");
     }
 }
예제 #5
0
        public List <PairResult> GetPairList()
        {
            var result = new List <PairResult>();
            var pairs  = EnumUtil.GetValues <FiatCurrency>();

            foreach (var pair in pairs)
            {
                var pairResult = new PairResult()
                {
                    Id     = (int)pair,
                    Symbol = pair.ToString()
                };
                result.Add(pairResult);
            }
            return(result);
        }
        private static List <BamAlignment> ExtractReadsFromRealignerAndCombiner(PairResult pair, string refSeq,
                                                                                int refSeqOffset, List <PreIndel> preIndels, bool hasExistingIndels = false)
        {
            var stitchedPairHandler =
                new PairHandler(new Dictionary <int, string>()
            {
                { 1, "chr1" }
            }, new BasicStitcher(0), tryStitch: true);

            var snippetSource = new Mock <IGenomeSnippetSource>();
            var genomeSnippet = new GenomeSnippet()
            {
                Chromosome    = "chr1",
                Sequence      = new string('A', refSeqOffset) + refSeq + new string('T', 1000),
                StartPosition = 0
            };

            snippetSource.Setup(x => x.GetGenomeSnippet(It.IsAny <int>())).Returns(genomeSnippet);
            var mockStatusHandler = new Mock <IStatusHandler>();
            var comparer          = new GemBasicAlignmentComparer(false, false);

            var readRealigner = new GeminiReadRealigner(comparer, remaskSoftclips: false,
                                                        keepProbeSoftclips: false, keepBothSideSoftclips: false,
                                                        trackActualMismatches: false, checkSoftclipsForMismatches: true,
                                                        debug: false, maskNsOnly: false, maskPartialInsertion: false,
                                                        minimumUnanchoredInsertionLength: 1,
                                                        minInsertionSizeToAllowMismatchingBases: 4,
                                                        maxProportionInsertSequenceMismatch: 0.2); // TODO fix // TODO figure out what I was saying to fix here...

            var filterer = new Mock <IRegionFilterer>();

            filterer.Setup(x => x.AnyIndelsNearby(It.IsAny <int>())).Returns(true);

            var indels               = preIndels.Select(x => HashableIndelSource.GetHashableIndel(genomeSnippet, x, 0, false)).ToList();
            var indelSource          = new ChromosomeIndelSource(indels, snippetSource.Object);
            var realignmentEvaluator = new RealignmentEvaluator(indelSource, mockStatusHandler.Object, readRealigner,
                                                                new RealignmentJudger(comparer), "chr1", false, true, true, true, filterer.Object, false);

            var combiner = new ReadPairRealignerAndCombiner(new NonSnowballEvidenceCollector(),
                                                            new PostRealignmentStitcher(stitchedPairHandler, new DebugStatusHandler(new ReadStatusCounter())),
                                                            realignmentEvaluator, new PairSpecificIndelFinder(), "chr1", false, hasExistingIndels: hasExistingIndels);
            var nmCalc = new NmCalculator(snippetSource.Object);

            var result = combiner.ExtractReads(pair, nmCalc);

            return(result);
        }
예제 #7
0
        public static PairResult GetPairResult(int position, int offset          = 0,
                                               string r1Cigar                    = "5M1I5M", string r2Cigar = "5M1I5M",
                                               PairClassification classification = PairClassification.Unknown,
                                               int numMismatchesInSingleton      = 0, int softclipLength = 0, bool hasIndels = false, bool isReputableIndelContaining = false)
        {
            //var read1 = TestHelpers.CreateBamAlignment("ATCGATCG", 125005, 126005, 30, true);
            //var read2 = TestHelpers.CreateBamAlignment("ATCGATCG", 126005, 125005, 30, true);

            //var pair2 = new ReadPair(read1);
            //pair2.AddAlignment(read2);

            var readPair1   = TestHelpers.GetPair(r1Cigar, r2Cigar, read2Offset: offset, read1Position: position);
            var pairResult2 = new PairResult(readPair1.GetAlignments(), readPair1, classification: classification, numMismatchesInSingleton: numMismatchesInSingleton, softclipLengthForIndelRead: softclipLength, hasIndels: hasIndels);

            pairResult2.IsReputableIndelContaining = isReputableIndelContaining;
            return(pairResult2);
        }
예제 #8
0
        public IEnumerable <PairResult> GetPairsMatch([FromUri] int id)
        {
            FishingMatch fishingMatch = Get(id);
            var          pairResults  = new List <PairResult>();

            if (!fishingMatch.IsPairs)
            {
                return(pairResults);
            }

            foreach (MatchEntry matchEntry in fishingMatch.MatchEntries)
            {
                bool toAdd = !pairResults.Any(pair => pair.Peg1 == matchEntry.Peg || pair.Peg2 == matchEntry.Peg);

                if (!toAdd)
                {
                    continue;
                }

                var matchEntryPair = new List <MatchEntry> {
                    matchEntry
                };

                MatchEntry pairedMatchEntry = fishingMatch.MatchEntries.Single(me => me.PairedWithPeg == matchEntry.Peg);
                matchEntryPair.Add(pairedMatchEntry);

                var pairResult = new PairResult
                {
                    Angler1 = matchEntryPair[0].AnglerName,
                    Angler2 = matchEntryPair[1].AnglerName,
                    Peg1    = matchEntryPair[0].Peg,
                    Peg2    = matchEntryPair[1].Peg,
                    Weight  = matchEntryPair[0].Weight + matchEntryPair[1].Weight
                };

                if (pairResult.Peg1 == pairResult.Peg2)
                {
                    pairResult.Peg2    = null;
                    pairResult.Angler2 = "(weight doubled)";
                }

                pairResults.Add(pairResult);
            }

            return(pairResults.OrderByDescending(result => result.Weight));
        }
예제 #9
0
        public override PairResult[] GetValueOutput()
        {
            PairResult[] res = new PairResult[3];
            res[0] = new PairResult()
            {
                Title = TAG_TITLE + this.Name, Value = Tag
            };
            res[1] = new PairResult()
            {
                Title = LENGTH_TITLE + this.Name, Value = Length.ToString("X2")
            };
            res[2] = new PairResult()
            {
                Title = VALUE_TITLE + this.Name, Value = Value
            };

            return(res);
        }
        private static string ReadTreatment(bool silencedR1, bool silencedR2, PairResult pairResult)
        {
            var silencedStatus = silencedR1 || silencedR2
                ? ($"_Silenced{(silencedR1 ? "R1" : "")}{(silencedR2 ? "R2" : "")}")
                : "";

            var readTreatment =
                (pairResult.ReadPair.RealignedR1 ? "R1Realigned" :
                 pairResult.R1Confirmed ? "R1Confirmed" : "R1Untouched") + "_" +
                (pairResult.ReadPair.RealignedR2 ? "R2Realigned" :
                 pairResult.R2Confirmed ? "R2Confirmed" : "R2Untouched") + "_" +
                (pairResult.ReadPair.Stitched ? "Stitched" :
                 pairResult.ReadPair.BadRestitch ? "BadRestitch" :
                 pairResult.ReadPair.FailForOtherReason ? "FailStitch" :
                 pairResult.ReadPair.Disagree ? "Disagree" :
                 pairResult.TriedStitching ? "GenericFailStitch" : "Unstitch") + silencedStatus;

            return(readTreatment);
        }
        public void AddMessEvidence()
        {
            var read1 = TestHelpers.CreateBamAlignment("ATCGATCG", 123405, 123505, 30, true);
            var read2 = TestHelpers.CreateBamAlignment("ATCGATCG", 123505, 123405, 30, true);

            var pair = new ReadPair(read1);

            pair.AddAlignment(read2);
            var pairResult = new PairResult(pair.GetAlignments(), pair);


            var numBins              = 5000;
            var messyHitNonZeroes    = new Dictionary <int, int>();
            var indelHitNonZeroes    = new Dictionary <int, int>();
            var forwardMessNonZeroes = new Dictionary <int, int>();
            var reverseMessNonZeroes = new Dictionary <int, int>();
            var mapqMessNonZeroes    = new Dictionary <int, int>();

            var forwardMessNonZeroesNotUsed = new Dictionary <int, int>();
            var reverseMessNonZeroesNotUsed = new Dictionary <int, int>();
            var mapqMessNonZeroesNotUsed    = new Dictionary <int, int>();

            var singleMismatchNonZeroes            = new Dictionary <int, int>();
            var allHitsNonZeroes                   = new Dictionary <int, int>();
            var binEvidence                        = new BinEvidence(1, true, numBins, false, 500, 123000, true, true);
            var binEvidenceNoMapqMess              = new BinEvidence(1, true, numBins, false, 500, 123000, true, false);
            var binEvidenceNoDirectional           = new BinEvidence(1, true, numBins, false, 500, 123000, false, true);
            var binEvidenceNoDirectionalOrMapqMess = new BinEvidence(1, true, numBins, false, 500, 123000, false, false);

            // Should add one piece of evidence for each alignment
            // Read1 should be in bin 0, read2 in bin 1
            // First, only messy
            binEvidence.AddMessEvidence(true, pairResult, false, false, false, false, false);
            allHitsNonZeroes[0]  = 1;
            allHitsNonZeroes[1]  = 1;
            messyHitNonZeroes[0] = 1;
            messyHitNonZeroes[1] = 1;
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidence, indelHitNonZeroes, forwardMessNonZeroes, reverseMessNonZeroes, mapqMessNonZeroes, singleMismatchNonZeroes, allHitsNonZeroes);

            // Not using mapq mess
            binEvidenceNoMapqMess.AddMessEvidence(true, pairResult, false, false, false, false, false);
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidenceNoMapqMess, indelHitNonZeroes, forwardMessNonZeroes, reverseMessNonZeroes, mapqMessNonZeroesNotUsed, singleMismatchNonZeroes, allHitsNonZeroes);
            // Not using directional
            binEvidenceNoDirectional.AddMessEvidence(true, pairResult, false, false, false, false, false);
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidenceNoDirectional, indelHitNonZeroes, forwardMessNonZeroesNotUsed, reverseMessNonZeroesNotUsed, mapqMessNonZeroes, singleMismatchNonZeroes, allHitsNonZeroes);
            // Not using directional or mapq mess
            binEvidenceNoDirectionalOrMapqMess.AddMessEvidence(true, pairResult, false, false, false, false, false);
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidenceNoDirectionalOrMapqMess, indelHitNonZeroes, forwardMessNonZeroesNotUsed, reverseMessNonZeroesNotUsed, mapqMessNonZeroesNotUsed, singleMismatchNonZeroes, allHitsNonZeroes);

            // Add indel and mess evidence
            binEvidence.AddMessEvidence(true, pairResult, true, false, false, false, false);
            allHitsNonZeroes[0]  = 2;
            allHitsNonZeroes[1]  = 2;
            messyHitNonZeroes[0] = 2;
            messyHitNonZeroes[1] = 2;
            indelHitNonZeroes[0] = 1;
            indelHitNonZeroes[1] = 1;
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidence, indelHitNonZeroes, forwardMessNonZeroes, reverseMessNonZeroes, mapqMessNonZeroes, singleMismatchNonZeroes, allHitsNonZeroes);

            // Not using mapq mess
            binEvidenceNoMapqMess.AddMessEvidence(true, pairResult, true, false, false, false, false);
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidenceNoMapqMess, indelHitNonZeroes, forwardMessNonZeroes, reverseMessNonZeroes, mapqMessNonZeroesNotUsed, singleMismatchNonZeroes, allHitsNonZeroes);
            // Not using directional
            binEvidenceNoDirectional.AddMessEvidence(true, pairResult, true, false, false, false, false);
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidenceNoDirectional, indelHitNonZeroes, forwardMessNonZeroesNotUsed, reverseMessNonZeroesNotUsed, mapqMessNonZeroes, singleMismatchNonZeroes, allHitsNonZeroes);
            // Not using directional or mapq mess
            binEvidenceNoDirectionalOrMapqMess.AddMessEvidence(true, pairResult, true, false, false, false, false);
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidenceNoDirectionalOrMapqMess, indelHitNonZeroes, forwardMessNonZeroesNotUsed, reverseMessNonZeroesNotUsed, mapqMessNonZeroesNotUsed, singleMismatchNonZeroes, allHitsNonZeroes);

            // Add forward mess (must also be called as mess - TODO perhaps change this)
            binEvidence.AddMessEvidence(true, pairResult, false, false, true, false, false);
            allHitsNonZeroes[0]     = 3;
            allHitsNonZeroes[1]     = 3;
            messyHitNonZeroes[0]    = 3;
            messyHitNonZeroes[1]    = 3;
            forwardMessNonZeroes[0] = 1;
            forwardMessNonZeroes[1] = 1;
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidence, indelHitNonZeroes, forwardMessNonZeroes, reverseMessNonZeroes, mapqMessNonZeroes, singleMismatchNonZeroes, allHitsNonZeroes);

            // Not using mapq mess
            binEvidenceNoMapqMess.AddMessEvidence(true, pairResult, false, false, true, false, false);
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidenceNoMapqMess, indelHitNonZeroes, forwardMessNonZeroes, reverseMessNonZeroes, mapqMessNonZeroesNotUsed, singleMismatchNonZeroes, allHitsNonZeroes);
            // Not using directional
            binEvidenceNoDirectional.AddMessEvidence(true, pairResult, false, false, true, false, false);
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidenceNoDirectional, indelHitNonZeroes, forwardMessNonZeroesNotUsed, reverseMessNonZeroesNotUsed, mapqMessNonZeroes, singleMismatchNonZeroes, allHitsNonZeroes);
            // Not using directional or mapq mess
            binEvidenceNoDirectionalOrMapqMess.AddMessEvidence(true, pairResult, false, false, true, false, false);
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidenceNoDirectionalOrMapqMess, indelHitNonZeroes, forwardMessNonZeroesNotUsed, reverseMessNonZeroesNotUsed, mapqMessNonZeroesNotUsed, singleMismatchNonZeroes, allHitsNonZeroes);

            // Add reverse mess (must also be called as mess - TODO perhaps change this)
            binEvidence.AddMessEvidence(true, pairResult, false, false, false, true, false);
            allHitsNonZeroes[0]     = 4;
            allHitsNonZeroes[1]     = 4;
            messyHitNonZeroes[0]    = 4;
            messyHitNonZeroes[1]    = 4;
            reverseMessNonZeroes[0] = 1;
            reverseMessNonZeroes[1] = 1;
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidence, indelHitNonZeroes, forwardMessNonZeroes, reverseMessNonZeroes, mapqMessNonZeroes, singleMismatchNonZeroes, allHitsNonZeroes);

            // Not using mapq mess
            binEvidenceNoMapqMess.AddMessEvidence(true, pairResult, false, false, false, true, false);
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidenceNoMapqMess, indelHitNonZeroes, forwardMessNonZeroes, reverseMessNonZeroes, mapqMessNonZeroesNotUsed, singleMismatchNonZeroes, allHitsNonZeroes);
            // Not using directional
            binEvidenceNoDirectional.AddMessEvidence(true, pairResult, false, false, false, true, false);
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidenceNoDirectional, indelHitNonZeroes, forwardMessNonZeroesNotUsed, reverseMessNonZeroesNotUsed, mapqMessNonZeroes, singleMismatchNonZeroes, allHitsNonZeroes);
            // Not using directional or mapq mess
            binEvidenceNoDirectionalOrMapqMess.AddMessEvidence(true, pairResult, false, false, false, true, false);
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidenceNoDirectionalOrMapqMess, indelHitNonZeroes, forwardMessNonZeroesNotUsed, reverseMessNonZeroesNotUsed, mapqMessNonZeroesNotUsed, singleMismatchNonZeroes, allHitsNonZeroes);

            // Add mapq mess (must also be called as mess - TODO perhaps change this)
            binEvidence.AddMessEvidence(true, pairResult, false, false, false, false, true);
            allHitsNonZeroes[0]  = 5;
            allHitsNonZeroes[1]  = 5;
            messyHitNonZeroes[0] = 5;
            messyHitNonZeroes[1] = 5;
            mapqMessNonZeroes[0] = 1;
            mapqMessNonZeroes[1] = 1;
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidence, indelHitNonZeroes, forwardMessNonZeroes, reverseMessNonZeroes, mapqMessNonZeroes, singleMismatchNonZeroes, allHitsNonZeroes);

            // Not using mapq mess
            binEvidenceNoMapqMess.AddMessEvidence(true, pairResult, false, false, false, false, true);
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidenceNoMapqMess, indelHitNonZeroes, forwardMessNonZeroes, reverseMessNonZeroes, mapqMessNonZeroesNotUsed, singleMismatchNonZeroes, allHitsNonZeroes);
            // Not using directional
            binEvidenceNoDirectional.AddMessEvidence(true, pairResult, false, false, false, false, true);
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidenceNoDirectional, indelHitNonZeroes, forwardMessNonZeroesNotUsed, reverseMessNonZeroesNotUsed, mapqMessNonZeroes, singleMismatchNonZeroes, allHitsNonZeroes);
            // Not using directional or mapq mess
            binEvidenceNoDirectionalOrMapqMess.AddMessEvidence(true, pairResult, false, false, false, false, true);
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidenceNoDirectionalOrMapqMess, indelHitNonZeroes, forwardMessNonZeroesNotUsed, reverseMessNonZeroesNotUsed, mapqMessNonZeroesNotUsed, singleMismatchNonZeroes, allHitsNonZeroes);

            // Add indel only
            binEvidence.AddMessEvidence(false, pairResult, true, false, false, false, false);
            allHitsNonZeroes[0]  = 6;
            allHitsNonZeroes[1]  = 6;
            indelHitNonZeroes[0] = 2;
            indelHitNonZeroes[1] = 2;
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidence, indelHitNonZeroes, forwardMessNonZeroes, reverseMessNonZeroes, mapqMessNonZeroes, singleMismatchNonZeroes, allHitsNonZeroes);

            // Not using mapq mess
            binEvidenceNoMapqMess.AddMessEvidence(false, pairResult, true, false, false, false, false);
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidenceNoMapqMess, indelHitNonZeroes, forwardMessNonZeroes, reverseMessNonZeroes, mapqMessNonZeroesNotUsed, singleMismatchNonZeroes, allHitsNonZeroes);
            // Not using directional
            binEvidenceNoDirectional.AddMessEvidence(false, pairResult, true, false, false, false, false);
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidenceNoDirectional, indelHitNonZeroes, forwardMessNonZeroesNotUsed, reverseMessNonZeroesNotUsed, mapqMessNonZeroes, singleMismatchNonZeroes, allHitsNonZeroes);
            // Not using directional or mapq mess
            binEvidenceNoDirectionalOrMapqMess.AddMessEvidence(false, pairResult, true, false, false, false, false);
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidenceNoDirectionalOrMapqMess, indelHitNonZeroes, forwardMessNonZeroesNotUsed, reverseMessNonZeroesNotUsed, mapqMessNonZeroesNotUsed, singleMismatchNonZeroes, allHitsNonZeroes);

            var read1_pair2 = TestHelpers.CreateBamAlignment("ATCGATCG", 125005, 126005, 30, true);
            var read2_pair2 = TestHelpers.CreateBamAlignment("ATCGATCG", 126005, 125005, 30, true);

            var pair2 = new ReadPair(read1_pair2);

            pair2.AddAlignment(read2_pair2);
            var pairResult2 = new PairResult(pair2.GetAlignments(), pair2);

            // Add at different region
            binEvidence.AddMessEvidence(false, pairResult2, true, false, false, false, false);
            allHitsNonZeroes[4]  = 1;
            allHitsNonZeroes[6]  = 1;
            indelHitNonZeroes[4] = 1;
            indelHitNonZeroes[6] = 1;
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidence, indelHitNonZeroes, forwardMessNonZeroes, reverseMessNonZeroes, mapqMessNonZeroes, singleMismatchNonZeroes, allHitsNonZeroes);

            // Not using mapq mess
            binEvidenceNoMapqMess.AddMessEvidence(false, pairResult2, true, false, false, false, false);
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidenceNoMapqMess, indelHitNonZeroes, forwardMessNonZeroes, reverseMessNonZeroes, mapqMessNonZeroesNotUsed, singleMismatchNonZeroes, allHitsNonZeroes);
            // Not using directional
            binEvidenceNoDirectional.AddMessEvidence(false, pairResult2, true, false, false, false, false);
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidenceNoDirectional, indelHitNonZeroes, forwardMessNonZeroesNotUsed, reverseMessNonZeroesNotUsed, mapqMessNonZeroes, singleMismatchNonZeroes, allHitsNonZeroes);
            // Not using directional or mapq mess
            binEvidenceNoDirectionalOrMapqMess.AddMessEvidence(false, pairResult2, true, false, false, false, false);
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidenceNoDirectionalOrMapqMess, indelHitNonZeroes, forwardMessNonZeroesNotUsed, reverseMessNonZeroesNotUsed, mapqMessNonZeroesNotUsed, singleMismatchNonZeroes, allHitsNonZeroes);

            // Test on diff chroms - mate on diff chrom shouldn't contribute
            var read1_pair3 = TestHelpers.CreateBamAlignment("ATCGATCG", 125005, 126005, 30, true);
            var read2_pair3 = TestHelpers.CreateBamAlignment("ATCGATCG", 126005, 125005, 30, true);

            read2_pair3.RefID     = 2;
            read1_pair3.MateRefID = 2;

            var pairSplitChrom = new ReadPair(read1_pair3);

            pairSplitChrom.AddAlignment(read2_pair3);
            var pairResultSplitChrom = new PairResult(pairSplitChrom.GetAlignments(), pairSplitChrom);

            binEvidence.AddMessEvidence(false, pairResultSplitChrom, true, false, false, false, false);
            allHitsNonZeroes[4]  = 2;
            indelHitNonZeroes[4] = 2;
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidence, indelHitNonZeroes, forwardMessNonZeroes, reverseMessNonZeroes, mapqMessNonZeroes, singleMismatchNonZeroes, allHitsNonZeroes);

            // Not using mapq mess
            binEvidenceNoMapqMess.AddMessEvidence(false, pairResultSplitChrom, true, false, false, false, false);
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidenceNoMapqMess, indelHitNonZeroes, forwardMessNonZeroes, reverseMessNonZeroes, mapqMessNonZeroesNotUsed, singleMismatchNonZeroes, allHitsNonZeroes);
            // Not using directional
            binEvidenceNoDirectional.AddMessEvidence(false, pairResultSplitChrom, true, false, false, false, false);
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidenceNoDirectional, indelHitNonZeroes, forwardMessNonZeroesNotUsed, reverseMessNonZeroesNotUsed, mapqMessNonZeroes, singleMismatchNonZeroes, allHitsNonZeroes);
            // Not using directional or mapq mess
            binEvidenceNoDirectionalOrMapqMess.AddMessEvidence(false, pairResultSplitChrom, true, false, false, false, false);
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidenceNoDirectionalOrMapqMess, indelHitNonZeroes, forwardMessNonZeroesNotUsed, reverseMessNonZeroesNotUsed, mapqMessNonZeroesNotUsed, singleMismatchNonZeroes, allHitsNonZeroes);

            // Read spans 2 bins (long read, or straddles two). Should increment in both.
            var read1_pair4 = TestHelpers.CreateBamAlignment("ATCGATCG", 125005, 126495, 30, true);
            var read2_pair4 = TestHelpers.CreateBamAlignment("ATCGATCG", 126495, 125005, 30, true);

            var pairRead2Spans2Bins = new ReadPair(read1_pair4);

            pairRead2Spans2Bins.AddAlignment(read2_pair4);
            var pairResultRead2Spans2Bins = new PairResult(pairRead2Spans2Bins.GetAlignments(), pairRead2Spans2Bins);

            binEvidence.AddMessEvidence(false, pairResultRead2Spans2Bins, true, false, false, false, false);
            allHitsNonZeroes[4]  = 3;
            allHitsNonZeroes[6]  = 2;
            allHitsNonZeroes[7]  = 1;
            indelHitNonZeroes[4] = 3;
            indelHitNonZeroes[6] = 2;
            indelHitNonZeroes[7] = 1;

            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidence, indelHitNonZeroes, forwardMessNonZeroes, reverseMessNonZeroes, mapqMessNonZeroes, singleMismatchNonZeroes, allHitsNonZeroes);

            // Not using mapq mess
            binEvidenceNoMapqMess.AddMessEvidence(false, pairResultRead2Spans2Bins, true, false, false, false, false);
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidenceNoMapqMess, indelHitNonZeroes, forwardMessNonZeroes, reverseMessNonZeroes, mapqMessNonZeroesNotUsed, singleMismatchNonZeroes, allHitsNonZeroes);
            // Not using directional
            binEvidenceNoDirectional.AddMessEvidence(false, pairResultRead2Spans2Bins, true, false, false, false, false);
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidenceNoDirectional, indelHitNonZeroes, forwardMessNonZeroesNotUsed, reverseMessNonZeroesNotUsed, mapqMessNonZeroes, singleMismatchNonZeroes, allHitsNonZeroes);
            // Not using directional or mapq mess
            binEvidenceNoDirectionalOrMapqMess.AddMessEvidence(false, pairResultRead2Spans2Bins, true, false, false, false, false);
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidenceNoDirectionalOrMapqMess, indelHitNonZeroes, forwardMessNonZeroesNotUsed, reverseMessNonZeroesNotUsed, mapqMessNonZeroesNotUsed, singleMismatchNonZeroes, allHitsNonZeroes);

            // Test mate goes outside of binEvidence region
            var read1_pair5 = TestHelpers.CreateBamAlignment("ATCGATCG", 125005, 100026495, 30, true);
            var read2_pair5 = TestHelpers.CreateBamAlignment("ATCGATCG", 100026495, 125005, 30, true);

            var pairRead2PastRegion = new ReadPair(read1_pair5);

            pairRead2PastRegion.AddAlignment(read2_pair5);
            var pairResultRead2PastRegion = new PairResult(pairRead2PastRegion.GetAlignments(), pairRead2PastRegion);

            binEvidence.AddMessEvidence(false, pairResultRead2PastRegion, true, false, false, false, false);
            allHitsNonZeroes[4]  = 4;
            indelHitNonZeroes[4] = 4;
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidence, indelHitNonZeroes, forwardMessNonZeroes, reverseMessNonZeroes, mapqMessNonZeroes, singleMismatchNonZeroes, allHitsNonZeroes);
            // Not using mapq mess
            binEvidenceNoMapqMess.AddMessEvidence(false, pairResultRead2PastRegion, true, false, false, false, false);
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidenceNoMapqMess, indelHitNonZeroes, forwardMessNonZeroes, reverseMessNonZeroes, mapqMessNonZeroesNotUsed, singleMismatchNonZeroes, allHitsNonZeroes);
            // Not using directional
            binEvidenceNoDirectional.AddMessEvidence(false, pairResultRead2PastRegion, true, false, false, false, false);
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidenceNoDirectional, indelHitNonZeroes, forwardMessNonZeroesNotUsed, reverseMessNonZeroesNotUsed, mapqMessNonZeroes, singleMismatchNonZeroes, allHitsNonZeroes);
            // Not using directional or mapq mess
            binEvidenceNoDirectionalOrMapqMess.AddMessEvidence(false, pairResultRead2PastRegion, true, false, false, false, false);
            CheckCorrectBinsIncremented(numBins, messyHitNonZeroes, binEvidenceNoDirectionalOrMapqMess, indelHitNonZeroes, forwardMessNonZeroesNotUsed, reverseMessNonZeroesNotUsed, mapqMessNonZeroesNotUsed, singleMismatchNonZeroes, allHitsNonZeroes);
        }
예제 #12
0
        public List <BamAlignment> ExtractReads(PairResult pairResult, INmCalculator nmCalculator, bool doRealign = true, int readsToSilence = 0)
        {
            var pair = pairResult.ReadPair;

            if (pair.PairStatus == PairStatus.LeaveUntouched)
            {
                return(pair.GetAlignments().ToList());
            }
            var reads = new List <BamAlignment>();

            // TODO clean this up, should really not have two layers (pair result and readpair) here
            if (pairResult.ReadPair.Stitched)
            {
                const bool recalculateNm = true; // Always recalculate NM for stitched reads
                // TODO more explicitly assume/check that there is actually only one here
                foreach (var alignment in pairResult.Alignments)
                {
                    if (doRealign)
                    {
                        var finalReadR1 = RealignSingleAlignment(alignment, out var realignedR1);
                        pair.RealignedR1 = realignedR1;

                        SilenceReads(finalReadR1, null, readsToSilence, realignedR1, false);

                        pair.StitchedNm = UpdateAndAddAlignment(finalReadR1, false, null, reads, nmCalculator, recalculateNm);
                    }
                    else
                    {
                        SilenceReads(alignment, null, readsToSilence, false, false);

                        pair.StitchedNm = UpdateAndAddAlignment(alignment, false, null, reads, nmCalculator, recalculateNm);
                    }
                }

                return(reads);
            }
            if (pair.IsComplete(false) && (pair.PairStatus == PairStatus.Paired || pair.PairStatus == PairStatus.OffTarget))
            {
                var realignedR1 = false;

                var             realignedR2      = false;
                var             forcedSoftclipR1 = false;
                var             forcedSoftclipR2 = false;
                var             sketchy          = false;
                var             origRead1        = pair.Read1;
                var             origRead2        = pair.Read2;
                int?            r1Nm             = pair.Read1.GetIntTag("NM");
                int?            r2Nm             = pair.Read2.GetIntTag("NM");
                List <PreIndel> pairIndels       = null;

                if (pair.PairStatus == PairStatus.Paired)
                {
                    if (doRealign)
                    {
                        List <PreIndel> r1Indels = _hasExistingIndels && pairResult.R1Nm <= 2
                            ? pairResult.OriginalIndelsR1 ?? _indelTargetFinder.FindIndels(origRead1, _chromosome)
                            : _emptyList;
                        List <PreIndel> r2Indels = _hasExistingIndels && pairResult.R2Nm <= 2
                            ? pairResult.OriginalIndelsR2 ?? _indelTargetFinder.FindIndels(origRead2, _chromosome)
                            : _emptyList;

                        if (_pairAware && _hasExistingIndels && (r1Indels.Any() || r2Indels.Any()))
                        {
                            pairIndels = _finder.GetPairSpecificIndels(pair, r1Indels, r2Indels, ref r1Nm, ref r2Nm);
                        }

                        var confirmedAccepted = new List <HashableIndel>();

                        bool confirmedR1;
                        bool confirmedR2;


                        // TODO should we pay attention to whether one already has an indel and one doesn't, and realign/confirm the one that does, or that has the better one, first?
                        var try1Read1 = _evaluator.GetFinalAlignment(origRead1,
                                                                     out realignedR1, out forcedSoftclipR1, out confirmedR1, out sketchy, selectedIndels: pairIndels,
                                                                     existingIndels: r1Indels, confirmedAccepteds: confirmedAccepted, mateIndels: r2Indels);

                        pair.Read1 = try1Read1;
                        if ((realignedR1 || confirmedR1) && confirmedAccepted.Any())
                        {
                            pair.Read2 = _evaluator.GetFinalAlignment(origRead2,
                                                                      out realignedR2, out forcedSoftclipR2, out confirmedR2, out sketchy, selectedIndels: pairIndels,
                                                                      existingIndels: r2Indels, confirmedAccepteds: confirmedAccepted);
                        }
                        else
                        {
                            confirmedAccepted.Clear();
                            var try1Read2 = _evaluator.GetFinalAlignment(origRead2,
                                                                         out realignedR2, out forcedSoftclipR2, out confirmedR2, out sketchy, selectedIndels: pairIndels,
                                                                         existingIndels: r2Indels, confirmedAccepteds: confirmedAccepted, mateIndels: r1Indels);
                            pair.Read2 = try1Read2;

                            if ((realignedR2 || confirmedR2) && confirmedAccepted.Any())
                            {
                                pair.Read1 = _evaluator.GetFinalAlignment(origRead1,
                                                                          out realignedR1, out forcedSoftclipR1, out confirmedR1, out sketchy, selectedIndels: pairIndels,
                                                                          existingIndels: r1Indels, confirmedAccepteds: confirmedAccepted);
                            }
                        }

                        pairResult.R1Confirmed = confirmedR1;
                        pairResult.R2Confirmed = confirmedR2;
                    }

                    if (realignedR1 || realignedR2)
                    {
                        pair.Realigned = true;
                    }
                }

                pair.RealignedR1 = realignedR1;
                pair.RealignedR2 = realignedR2;

                // Silence realigned pair if needed
                SilenceReads(pair.Read1, pair.Read2, readsToSilence, realignedR1, realignedR2);
                // Silence original reads in case needed
                SilenceReads(origRead1, origRead2, readsToSilence, false, false);

                if (_allowedToStitch && !(forcedSoftclipR1 || forcedSoftclipR2) && (!_skipRestitchIfNothingChanged || (realignedR1 || realignedR2)))
                {
                    reads = _restitcher.GetRestitchedReads(pair, origRead1, origRead2, r1Nm, r2Nm, pairIndels != null, nmCalculator,
                                                           realignedR1 || realignedR2 || (r1Nm + r2Nm > 0), sketchy);

                    var isStitched = reads.Count == 1;
                    pair.Stitched             = isStitched;
                    pairResult.TriedStitching = true;

                    if (!isStitched)
                    {
                        reads.Clear();
                        // TODO looks like we are passing through EC twice - here and in the below foreach
                        HandleUnstitchedReads(pair, reads, realignedR1, realignedR2, nmCalculator);
                    }
                    foreach (var bamAlignment in reads)
                    {
                        _evidenceCollector.CollectEvidence(bamAlignment, true, isStitched, _chromosome);
                    }
                }
                else
                {
                    HandleUnstitchedReads(pair, reads, realignedR1, realignedR2, nmCalculator);
                }
            }
            else
            {
                if (doRealign)
                {
                    var finalReadR1 = RealignSingleAlignment(pair.Read1, out var realignedR1);
                    var finalReadR2 = RealignSingleAlignment(pair.Read2, out var realignedR2);
                    pair.RealignedR1 = realignedR1;
                    pair.RealignedR2 = realignedR2;
                    if (realignedR1 || realignedR2)
                    {
                        pair.Realigned = true;
                    }
                    SilenceReads(finalReadR1, finalReadR2, readsToSilence, realignedR1, realignedR2);
                    pair.Nm1 = UpdateAndAddAlignment(finalReadR1, realignedR2, finalReadR2, reads, nmCalculator, realignedR1);
                    pair.Nm2 = UpdateAndAddAlignment(finalReadR2, realignedR1, finalReadR1, reads, nmCalculator, realignedR2);
                }
                else
                {
                    SilenceReads(pair.Read1, pair.Read2, readsToSilence, false, false);

                    pair.Nm1 = UpdateAndAddAlignment(pair.Read1, false, pair.Read2, reads, nmCalculator, false);
                    pair.Nm2 = UpdateAndAddAlignment(pair.Read2, false, pair.Read1, reads, nmCalculator, false);
                }
            }


            return(reads);
        }
예제 #13
0
        public void AddMessEvidence(bool isMessy, PairResult pairResult, bool isIndel, bool isSingleMismatch, bool isForwardOnlyMessy, bool isReverseOnlyMessy, bool isMapqMessy)
        {
            if (!_collectDepth && !isMessy && !isIndel && !isForwardOnlyMessy && !isMapqMessy && !isReverseOnlyMessy && !isSingleMismatch)
            {
                return;
            }

            foreach (var aln in pairResult.Alignments)
            {
                if (aln.RefID != _refId)
                {
                    continue;
                }

                var lastBinSpannedByRead = GetBinId(aln.EndPosition);
                var firstBin             = GetBinId(aln.Position);

                if (lastBinSpannedByRead + 1 > NumBins - 1)
                {
                    Console.WriteLine("LAST BIN SPANNED IS GREATER THAN ALLHITS!!!");
                }

                for (int i = firstBin; i <= Math.Min(lastBinSpannedByRead, NumBins - 1); i++)
                {
                    try
                    {
                        AllHits.AddHit(i);

                        if (isMessy)
                        {
                            AddMessyHit(i);
                            if (isForwardOnlyMessy)
                            {
                                _fwdOnlyMessyHits.AddHit(i);
                            }
                            else if (isReverseOnlyMessy)
                            {
                                _revOnlyMessyHits.AddHit(i);
                            }
                            else if (isMapqMessy)
                            {
                                _mapqMessyHits.AddHit(i);
                            }
                        }

                        if (isIndel)
                        {
                            AddIndelHit(i);
                        }

                        if (isSingleMismatch)
                        {
                            AddSingleMismatchHit(i);
                        }
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine($"FAILED ON {i} ({aln.Position}, {_regionStart})..." + e.Message);
                        throw new Exception($"FAILED ON {i} ({aln.Position}, {_regionStart})", e);
                    }
                }
            }
        }
        private int ReadsToSilence(PairClassification classification, BinConclusions binEvidence, PairResult pairResult)
        {
            if (_geminiOptions.SilenceSuspiciousMdReads && classification == PairClassification.UnstitchMessySuspiciousMd)
            {
                return(3);
            }

            var isForwardMessy      = IsForwardMessy(classification);
            var isReverseMessy      = IsReverseMessy(classification);
            var isSuspiciousMapping = IsSuspiciousMapping(classification);

            if (!isForwardMessy && !isReverseMessy && !isSuspiciousMapping)
            {
                return(0);
            }

            var silenced     = 0;
            var doSilenceFwd = false;
            var doSilenceRev = false;

            var r1IsReverse = pairResult.ReadPair.Read1.IsReverseStrand();

            // This assumes that there is exactly one forward and one reverse read.
            var fwdRead = r1IsReverse ? pairResult.ReadPair.Read2 : pairResult.ReadPair.Read1;
            var revRead = r1IsReverse ? pairResult.ReadPair.Read1 : pairResult.ReadPair.Read2;

            if (isForwardMessy)
            {
                var binId = binEvidence.GetBinId(fwdRead.Position);
                doSilenceFwd = binEvidence.GetFwdMessyStatus(binId) || binEvidence.GetMapqMessyStatus(binId);
            }
            else if (isReverseMessy)
            {
                var binId = binEvidence.GetBinId(revRead.Position);
                doSilenceRev = binEvidence.GetRevMessyStatus(binId) || binEvidence.GetMapqMessyStatus(binId);
            }
            else if (isSuspiciousMapping)
            {
                var binId       = binEvidence.GetBinId(revRead.Position);
                var isMapqMessy = binEvidence.GetMapqMessyStatus(binId);

                doSilenceFwd = isMapqMessy;
                doSilenceRev = isMapqMessy;
            }

            if (doSilenceFwd)
            {
                silenced = r1IsReverse ? 2 : 1;
            }

            if (doSilenceRev)
            {
                silenced = r1IsReverse ? 1 : 2;
            }

            if (doSilenceFwd && doSilenceRev)
            {
                silenced = 3;
            }

            return(silenced);
        }