private static void ApplyFilters(CalledAllele allele, int?minCoverageFilter, int?variantQscoreThreshold, bool filterSingleStrandVariants, float?variantFreqFilter, float?lowGenotypeqFilter, int?indelRepeatFilter, RMxNFilterSettings rMxNFilterSettings, float?noCallFilter, bool hasStitchedSource, ChrReference chrReference) { //Reset filters allele.Filters.Clear(); if (minCoverageFilter.HasValue && allele.TotalCoverage < minCoverageFilter) { allele.AddFilter(FilterType.LowDepth); } if (variantQscoreThreshold.HasValue && allele.VariantQscore < variantQscoreThreshold && (allele.TotalCoverage != 0)) { //note we wont flag it for Qscore, if its got zero depth, because in that case, the Q score calc was not made anyway. allele.AddFilter(FilterType.LowVariantQscore); } if (allele.Type != AlleleCategory.Reference) { //No call filter if (noCallFilter.HasValue && allele.FractionNoCalls > noCallFilter) { allele.AddFilter(FilterType.NoCall); } if (!allele.StrandBiasResults.BiasAcceptable || (filterSingleStrandVariants && !allele.StrandBiasResults.VarPresentOnBothStrands)) { allele.AddFilter(FilterType.StrandBias); } if (indelRepeatFilter.HasValue && indelRepeatFilter > 0) { var indelRepeatLength = ComputeIndelRepeatLength(allele, chrReference.Sequence); if (indelRepeatFilter <= indelRepeatLength) { allele.AddFilter(FilterType.IndelRepeatLength); } } if (RMxNCalculator.ShouldFilter(allele, rMxNFilterSettings, chrReference.Sequence)) { allele.AddFilter(FilterType.RMxN); } if (variantFreqFilter.HasValue && allele.Frequency < variantFreqFilter) { allele.AddFilter(FilterType.LowVariantFrequency); } if (hasStitchedSource) //can only happen for insertions and MNVs { if (allele.AlternateAllele.Contains("N")) { allele.AddFilter(FilterType.StrandBias); } } } }
private void ExecuteRMxNTest(string variantBases, string referenceSequence, int expectedRepeatLength, AlleleCategory category, double allelefrequency, int maxRepeatUnitLength) { var alleleCoordinate = referenceSequence.IndexOf('*'); var cleanReferenceSequence = referenceSequence.Replace("*", ""); var refAllele = ""; var altAllele = ""; if (category == AlleleCategory.Insertion) { refAllele = cleanReferenceSequence.Substring(alleleCoordinate - 1, 1); altAllele = refAllele + variantBases; } else if (category == AlleleCategory.Deletion) { altAllele = cleanReferenceSequence.Substring(alleleCoordinate - 1, 1); refAllele = altAllele + variantBases; } else { refAllele = cleanReferenceSequence.Substring(alleleCoordinate - 1, variantBases.Length); altAllele = variantBases; } var allele = new CalledAllele(category) { Reference = refAllele, Alternate = altAllele, Coordinate = alleleCoordinate }; allele.TotalCoverage = 1000; allele.AlleleSupport = (int)(1000.0 * variantFrequncy); RMxNFilterSettings rmxnFilterSettings = new RMxNFilterSettings(); rmxnFilterSettings.RMxNFilterFrequencyLimit = 1.1f; rmxnFilterSettings.RMxNFilterMaxLengthRepeat = maxRepeatUnitLength; rmxnFilterSettings.RMxNFilterMinRepetitions = expectedRepeatLength; // If expected repeats == N, flag Assert.True(RMxNCalculator.ShouldFilter(allele, rmxnFilterSettings, cleanReferenceSequence)); // If expected repeats > N, flag rmxnFilterSettings.RMxNFilterMinRepetitions = expectedRepeatLength - 1; Assert.True(RMxNCalculator.ShouldFilter(allele, rmxnFilterSettings, cleanReferenceSequence)); // If expected repeats < N, flag rmxnFilterSettings.RMxNFilterMinRepetitions = expectedRepeatLength + 1; Assert.False(RMxNCalculator.ShouldFilter(allele, rmxnFilterSettings, cleanReferenceSequence)); // RMxN isn't valid on reference calls rmxnFilterSettings.RMxNFilterMinRepetitions = expectedRepeatLength + 1; Assert.False(RMxNCalculator.ShouldFilter(allele, rmxnFilterSettings, cleanReferenceSequence)); // Even if expected repeats == N, dont flag if VF is too high rmxnFilterSettings.RMxNFilterFrequencyLimit = 0.10f; rmxnFilterSettings.RMxNFilterMinRepetitions = expectedRepeatLength; Assert.False(RMxNCalculator.ShouldFilter(allele, rmxnFilterSettings, cleanReferenceSequence)); // Even if expected repeats > N, flag, dont flag if VF is too high rmxnFilterSettings.RMxNFilterFrequencyLimit = 0.10f; rmxnFilterSettings.RMxNFilterMinRepetitions = expectedRepeatLength - 1; Assert.False(RMxNCalculator.ShouldFilter(allele, rmxnFilterSettings, cleanReferenceSequence)); }