public void AssignPoissonQScore()
        {
            //If rounded qScore is above maxQScore, should return maxQScore
            var coverage             = 500;
            var varSupport           = 25;
            var estQuality           = 20;
            var expectedActualQValue = 98;
            var maxQValue            = expectedActualQValue + 1;

            maxQValue = 1000;

            double finalQValue = QualityCalculator.AssignPoissonQScore(varSupport, coverage, estQuality, maxQValue);

            Assert.Equal(expectedActualQValue, finalQValue);

            maxQValue   = expectedActualQValue - 1;
            finalQValue = QualityCalculator.AssignPoissonQScore(varSupport, coverage, estQuality, maxQValue);
            Assert.Equal(maxQValue, finalQValue);
        }
        public void CallSomaticVariants_AssignPValue()
        {
            List <int[]> SampleValues = new List <int[]>() //coverage,var calls}
            {
                new int[] { 100, 0 },
                new int[] { 100, 1 },
                new int[] { 100, 5 },
                new int[] { 200, 10 },
                new int[] { 500, 25 },
                new int[] { 5000, 250 },
            };

            List <double[]> ReturnedValues = new List <double[]>(); { }//p,Q

            foreach (int[] item in SampleValues)
            {
                double   pValue      = QualityCalculator.AssignPValue(item[1], item[0], 20);
                double   Qscore      = MathOperations.PtoQ(pValue);
                double   FinalQValue = QualityCalculator.AssignPoissonQScore(item[1], item[0], 20, 100);
                double[] Result      = new double[] { pValue, Qscore, FinalQValue };
                ReturnedValues.Add(Result);
            }

            Assert.Equal(ReturnedValues[0][0], 1, 4);
            Assert.Equal(ReturnedValues[0][2], 0, 4);

            Assert.Equal(ReturnedValues[1][0], 0.6321, 4);
            Assert.Equal(ReturnedValues[1][2], 2, 4);

            Assert.Equal(ReturnedValues[2][0], 0.003659, 4);
            Assert.Equal(ReturnedValues[2][2], 24, 4);

            Assert.Equal(ReturnedValues[3][0], 4.65 * Math.Pow(10, -5), 5);
            Assert.Equal(ReturnedValues[3][2], 43, 4);

            Assert.Equal(ReturnedValues[4][0], 1.599 * Math.Pow(10, -10), 10);
            Assert.Equal(ReturnedValues[4][2], 98, 4);

            Assert.Equal(ReturnedValues[5][0], 0.0, 10);
            Assert.Equal(ReturnedValues[5][2], 100, 4);
        }
Beispiel #3
0
        public void EvaluateVariants()
        {
            var config = new VariantCallerConfig
            {
                MaxVariantQscore         = 100,
                EstimatedBaseCallQuality = 20
            };

            var variantCaller = new AlleleCaller(config);

            var highCoverageCoordinate = 123;
            var lowCoverageCoordinate  = 456;

            var passingVariant = new CandidateAllele("chr1", highCoverageCoordinate, "A", "T", AlleleCategory.Snv)
            {
                SupportByDirection = new [] { 500, 0, 0 } // Freq is 500/1500, q is 100
            };
            var passingVariant2 = new CandidateAllele("chr1", highCoverageCoordinate, "A", "C", AlleleCategory.Snv)
            {
                SupportByDirection = new[] { 500, 0, 0 } // Freq is 500/1500, q is 100
            };
            var lowFreqVariant = new CandidateAllele("chr2", highCoverageCoordinate, "A", "T", AlleleCategory.Snv)
            {
                SupportByDirection = new[] { 1, 0, 0 } // Freq is 1/1500, q is 0
            };
            var lowCoverageVariant = new CandidateAllele("chr3", lowCoverageCoordinate, "A", "T", AlleleCategory.Snv)
            {
                SupportByDirection = new[] { 10, 0, 0 } // Freq is 10/15, q is 100
            };
            var lowqVariant = new CandidateAllele("chr4", highCoverageCoordinate, "A", "T", AlleleCategory.Snv)
            {
                SupportByDirection = new[] { 40, 0, 0 } // Freq is 40/1500, q is 72
            };
            var passingReferenceHigh = new CandidateAllele("chr1", highCoverageCoordinate, "A", "A", AlleleCategory.Reference)
            {
                SupportByDirection = new[] { 500, 0, 0 } // Freq is 500/1500, q is 100
            };
            var passingReferenceLow = new CandidateAllele("chr3", lowCoverageCoordinate, "A", "A", AlleleCategory.Reference)
            {
                SupportByDirection = new[] { 10, 0, 0 } // Freq is 10/15, q is 100
            };
            var candidateVariants = new List <CandidateAllele>
            {
                passingVariant
            };


            //Variants should be correctly mapped
            var mockAlleleCountSource = MockStateManager(highCoverageCoordinate, lowCoverageCoordinate).Object;
            var calledVariants        = variantCaller.Call(new CandidateBatch(candidateVariants), mockAlleleCountSource);
            var calledVariant         = calledVariants.First();

            Assert.Equal(passingVariant.Alternate, calledVariant.Alternate);
            Assert.Equal(passingVariant.Reference, calledVariant.Reference);
            Assert.Equal(passingVariant.Chromosome, calledVariant.Chromosome);
            Assert.Equal(passingVariant.Coordinate, calledVariant.Coordinate);
            Assert.Equal(passingVariant.Support, calledVariant.AlleleSupport);
            Assert.True(calledVariant is CalledVariant);
            Assert.True(((CalledVariant)calledVariant).Type == AlleleCategory.Snv);

            //After the Calculator steps are performed, variants that don't meet
            //our requirements to be callable should drop out

            //High coverage requirement - lowCoverageVariant should drop out.
            config.MinCoverage           = (HighCoverageMultiplier * NumAlleles * NumDirections) - 1;
            config.IncludeReferenceCalls = false;
            config.MinVariantQscore      = 0;
            config.MinFrequency          = 0;

            variantCaller = new AlleleCaller(config);

            candidateVariants = new List <CandidateAllele>
            {
                passingVariant,
                lowFreqVariant,
                lowCoverageVariant
            };

            calledVariants = variantCaller.Call(new CandidateBatch(candidateVariants), mockAlleleCountSource);

            Assert.Equal(2, calledVariants.Count());
            Assert.True(calledVariants.Any(v => MatchVariants(v, passingVariant)));
            Assert.True(calledVariants.Any(v => MatchVariants(v, lowFreqVariant)));
            Assert.False(calledVariants.Any(v => MatchVariants(v, lowCoverageVariant)));

            //High coverage but allow reference calls = nothing should drop out
            config.IncludeReferenceCalls = true;

            variantCaller = new AlleleCaller(config);

            candidateVariants = new List <CandidateAllele>
            {
                passingVariant,
                lowFreqVariant,
                lowCoverageVariant
            };

            calledVariants = variantCaller.Call(new CandidateBatch(candidateVariants), mockAlleleCountSource);
            foreach (var cvar in calledVariants)
            {
                Console.WriteLine(cvar.Qscore);
            }

            Assert.Equal(3, calledVariants.Count());

            //High frequency requirement - low frequency variant should drop out
            config.MinCoverage           = 0;
            config.IncludeReferenceCalls = false;
            config.MinVariantQscore      = 0;
            config.MinFrequency          = ((float)lowCoverageVariant.Support + 1) / (HighCoverageMultiplier * NumAlleles * NumDirections);

            calledVariants = variantCaller.Call(new CandidateBatch(candidateVariants), mockAlleleCountSource);

            Assert.Equal(2, calledVariants.Count());
            Assert.True(calledVariants.Any(v => MatchVariants(v, passingVariant)));
            Assert.False(calledVariants.Any(v => MatchVariants(v, lowFreqVariant)));
            Assert.True(calledVariants.Any(v => MatchVariants(v, lowCoverageVariant)));

            //High q score requirement - low frequency variant should drop out
            config.MinCoverage           = 0;
            config.IncludeReferenceCalls = false;
            config.MinVariantQscore      = 0;
            config.MinFrequency          = 0;
            config.MinVariantQscore      = QualityCalculator.AssignPoissonQScore(lowqVariant.Support,
                                                                                 (HighCoverageMultiplier * Constants.NumCovContributingAlleleTypes * Constants.NumDirectionTypes), config.EstimatedBaseCallQuality,
                                                                                 config.MaxVariantQscore) + 1;

            candidateVariants = new List <CandidateAllele>
            {
                passingVariant,
                passingVariant2,
                lowFreqVariant,
                lowCoverageVariant,
                lowqVariant
            };

            calledVariants = variantCaller.Call(new CandidateBatch(candidateVariants), mockAlleleCountSource);
            Assert.Equal(3, calledVariants.Count());
            Assert.True(calledVariants.Any(v => MatchVariants(v, passingVariant)));
            Assert.True(calledVariants.Any(v => MatchVariants(v, passingVariant2)));
            Assert.False(calledVariants.Any(v => MatchVariants(v, lowFreqVariant)));
            Assert.True(calledVariants.Any(v => MatchVariants(v, lowCoverageVariant)));
            Assert.False(calledVariants.Any(v => MatchVariants(v, lowqVariant)));

            // reference calls included
            candidateVariants = new List <CandidateAllele>
            {
                passingReferenceHigh,
                passingReferenceLow
            };

            calledVariants = variantCaller.Call(new CandidateBatch(candidateVariants), mockAlleleCountSource);
            Assert.Equal(2, calledVariants.Count());
            Assert.True(calledVariants.Any(v => MatchVariants(v, passingReferenceHigh)));
            Assert.True(calledVariants.Any(v => MatchVariants(v, passingReferenceLow)));

            // reference calls only included if no passing variant
            candidateVariants = new List <CandidateAllele>
            {
                passingReferenceHigh,
                passingReferenceLow,
                passingVariant,
                passingVariant2,
                lowFreqVariant,
                lowCoverageVariant,
                lowqVariant
            };

            calledVariants = variantCaller.Call(new CandidateBatch(candidateVariants), mockAlleleCountSource);
            Assert.Equal(3, calledVariants.Count());
            Assert.False(calledVariants.Any(v => MatchVariants(v, passingReferenceHigh)));
            Assert.False(calledVariants.Any(v => MatchVariants(v, passingReferenceLow)));
            Assert.True(calledVariants.Any(v => MatchVariants(v, passingVariant)));
            Assert.True(calledVariants.Any(v => MatchVariants(v, passingVariant2)));
            Assert.False(calledVariants.Any(v => MatchVariants(v, lowFreqVariant)));
            Assert.True(calledVariants.Any(v => MatchVariants(v, lowCoverageVariant)));
            Assert.False(calledVariants.Any(v => MatchVariants(v, lowqVariant)));

            // reference calls only included if no passing variant (lowCoverageVariant fails)

            candidateVariants = new List <CandidateAllele>
            {
                passingReferenceLow,
                lowCoverageVariant,
            };

            config.IncludeReferenceCalls = false;
            config.MinCoverage           = (HighCoverageMultiplier * NumAlleles * NumDirections) - 1;

            variantCaller = new AlleleCaller(config);

            calledVariants = variantCaller.Call(new CandidateBatch(candidateVariants), mockAlleleCountSource);
            Assert.Equal(1, calledVariants.Count());
            Assert.True(calledVariants.Any(v => MatchVariants(v, passingReferenceLow)));
            Assert.False(calledVariants.Any(v => MatchVariants(v, lowCoverageVariant)));

            // candidates outside of intervals are trimmed off

            config.MinCoverage      = 0;
            config.MinVariantQscore = 0;
            config.MinFrequency     = 0;

            variantCaller = new AlleleCaller(config, new ChrIntervalSet(new List <Region>()
            {
                new Region(highCoverageCoordinate, lowCoverageCoordinate)
            }, "chr1"));

            candidateVariants = new List <CandidateAllele>
            {
                passingVariant,
                lowFreqVariant,
                lowCoverageVariant
            };

            calledVariants = variantCaller.Call(new CandidateBatch(candidateVariants), mockAlleleCountSource);

            Assert.Equal(3, calledVariants.Count());
            Assert.True(calledVariants.Any(v => MatchVariants(v, passingVariant)));
            Assert.True(calledVariants.Any(v => MatchVariants(v, lowFreqVariant)));
            Assert.True(calledVariants.Any(v => MatchVariants(v, lowCoverageVariant)));

            variantCaller = new AlleleCaller(config, new ChrIntervalSet(new List <Region>()
            {
                new Region(highCoverageCoordinate, highCoverageCoordinate)
            }, "chr1"));

            calledVariants = variantCaller.Call(new CandidateBatch(candidateVariants), mockAlleleCountSource);

            Assert.Equal(2, calledVariants.Count());
            Assert.True(calledVariants.Any(v => MatchVariants(v, passingVariant)));
            Assert.True(calledVariants.Any(v => MatchVariants(v, lowFreqVariant)));
            Assert.False(calledVariants.Any(v => MatchVariants(v, lowCoverageVariant)));
        }