예제 #1
0
        private void ProcessVariant(IAlleleSource source, CalledAllele variant)
        {
            // determine metrics
            _coverageCalculator.Compute(variant, source);

            if (variant.AlleleSupport > 0)
            {
                if (_config.NoiseModel == NoiseModel.Window)
                {
                    VariantQualityCalculator.Compute(variant, _config.MaxVariantQscore, (int)MathOperations.PtoQ(variant.SumOfBaseQuality / variant.TotalCoverage));
                }
                else
                {
                    VariantQualityCalculator.Compute(variant, _config.MaxVariantQscore, _config.NoiseLevelUsedForQScoring);
                }

                StrandBiasCalculator.Compute(variant, variant.SupportByDirection, _config.NoiseLevelUsedForQScoring, _config.MinFrequency,
                                             _config.StrandBiasFilterThreshold, _config.StrandBiasModel);

                AmpliconBiasCalculator.Compute(variant, _config.MaxVariantQscore, _config.AmpliconBiasFilterThreshold);
            }

            // set genotype, filter, etc
            AlleleProcessor.Process(variant, _config.MinFrequency, _config.LowDepthFilter,
                                    _config.VariantQscoreFilterThreshold, _config.FilterSingleStrandVariants, _config.VariantFreqFilter, _config.LowGTqFilter, _config.IndelRepeatFilter,
                                    _config.RMxNFilterSettings, _config.NoCallFilterThreshold, _config.AmpliconBiasFilterThreshold, _config.ChrReference, source.ExpectStitchedReads);
        }
예제 #2
0
        private BiasResultsAcrossAmplicons ExecuteTest(AmpliconCounts supportForAmplicons,
                                                       AmpliconCounts coverageForAmplicons, bool expectNull = false)
        {
            var variant1 = new CalledAllele(AlleleCategory.Snv)
            {
                SupportByAmplicon  = supportForAmplicons,
                CoverageByAmplicon = coverageForAmplicons
            };

            AmpliconBiasCalculator.Compute(variant1, 100, 0.01F);

            var variant2 = new CalledAllele(AlleleCategory.Snv)
            {
                SupportByAmplicon  = ReverseAmpliconData(supportForAmplicons),
                CoverageByAmplicon = ReverseAmpliconData(coverageForAmplicons)
            };

            AmpliconBiasCalculator.Compute(variant2, 100, 0.01F);

            //sanity check, reversing the input must always give the same result.

            if (expectNull)
            {
                Assert.Null(variant1.AmpliconBiasResults);
                Assert.Null(variant2.AmpliconBiasResults);
            }
            else
            {
                Assert.Equal(variant1.AmpliconBiasResults.BiasDetected, variant2.AmpliconBiasResults.BiasDetected);
            }

            return(variant1.AmpliconBiasResults);
        }
        public void Write()
        {
            var outFolder  = Path.Combine(TestPaths.LocalScratchDirectory, "AmpliconBiasTestOutput");
            var outputFile = Path.Combine(outFolder, "AmpliconBiasWriterTests.txt");

            TestHelper.RecreateDirectory(outFolder);

            //check writing

            var chromosome = "chr1";
            var reference  = "A";
            var alternate  = "T";
            var position   = 123;

            var BaseCalledAlleles = new List <CalledAllele>();
            var variant           = new CalledAllele(AlleleCategory.Snv)
            {
                Chromosome        = chromosome,
                ReferenceAllele   = reference,
                AlternateAllele   = alternate,
                ReferencePosition = position,
                SupportByAmplicon = new Domain.Models.AmpliconCounts
                {
                    AmpliconNames     = new string[] { "Amplicon1", "Amplicon2", "Amplicon3" },
                    CountsForAmplicon = new int[] { 12, 4, 5 }
                },
                CoverageByAmplicon = new Domain.Models.AmpliconCounts
                {
                    AmpliconNames     = new string[] { "Amplicon1", "Amplicon2", "Amplicon3" },
                    CountsForAmplicon = new int[] { 120, 4000, 5000 }
                }
            };

            AmpliconBiasCalculator.Compute(variant, 100, 0.01F);
            BaseCalledAlleles.Add(variant);
            var writer = new AmpliconBiasFileWriter(outputFile);

            writer.WriteHeader();
            writer.Write(BaseCalledAlleles);
            writer.Dispose();


            //check it reads in
            //Chr,Position,Reference,Alternate,Name,freq,obs support, expected support, prob its real, confidence Qscore, bias detected ?, Filter Variant?
            //chr1,123,A,T,Amplicon1,0.1,12,12,1,100,False,True,
            //chr1,123,A,T,Amplicon2,0.001,4,400,2.06343002707725E-165,0,True,True,
            //chr1,123,A,T,Amplicon3,0.001,5,500,1.87406134646469E-206,0,True,True,

            var biasFileContents = File.ReadAllLines(outputFile);

            Assert.True(biasFileContents.Length == 4);

            var header         = biasFileContents.First();
            var expectedHeader = "Chr,Position,Reference,Alternate,Name,freq,obs support, expected support, prob its real, confidence Qscore, bias detected?, Filter Variant?";

            var data         = biasFileContents.Skip(1).First();
            var expectedData = "chr1,123,A,T,Amplicon1,0.1,12,12,1,100,False,True,";


            // Make sure well-formed and populated with the right data
            Assert.Equal(expectedHeader, header);
            Assert.Equal(expectedData, data);

            //check IO
            Assert.Throws <IOException>(() => writer.WriteHeader());
            Assert.Throws <IOException>(() => writer.Write(BaseCalledAlleles));
            writer.Dispose();
        }