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); }
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"); } }
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); }
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); }
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)); }
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); }
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); }
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); }