Esempio n. 1
0
        private static List <CalledAllele> ProcessMultiAllelicLocus(List <CalledAllele> orderedVariants,
                                                                    RecalibrationResults results)
        {
            RecalibrationResult resultForVariant   = GetModelFromType(orderedVariants[0], results);
            MixtureModelResult  mixtureModelResult = GetModelResult(orderedVariants[0], resultForVariant);

            switch (mixtureModelResult.GenotypeCategory)
            {
            case SimplifiedDiploidGenotype.HomozygousRef:
            case SimplifiedDiploidGenotype.HomozygousAlt:
                var allele = UpdateGenotypeAndQScore(orderedVariants[0], mixtureModelResult);
                return(new List <CalledAllele> {
                    allele
                });

            case SimplifiedDiploidGenotype.HeterozygousAltRef:
                orderedVariants[0].Genotype = Genotype.HeterozygousAlt1Alt2;
                orderedVariants[1].Genotype = Genotype.HeterozygousAlt1Alt2;
                orderedVariants             = UpdateMultiAllelicQScores(orderedVariants, results);
                return(orderedVariants);

            default:
                throw new ArgumentException("Invalid model results");
            }
        }
Esempio n. 2
0
        private static List <CalledAllele> UpdateMultiAllelicQScores(List <CalledAllele> variantList, RecalibrationResults results)
        {
            // Determine model types
            RecalibrationResult model1 = GetModelFromType(variantList[0], results);
            RecalibrationResult model2 = GetModelFromType(variantList[1], results);

            // Calculate posteriors based on multinomial distribution
            int dp = variantList[0].TotalCoverage;

            int[] ad = new int[3];
            ad[2] = variantList[0].AlleleSupport; //temp[1];
            ad[1] = variantList[1].AlleleSupport; //temp[0];
            ad[0] = dp - ad[1] - ad[2];
            if (ad[0] < 0)
            {
                ad[0] = 0;
                dp    = ad[1] + ad[2];
            }

            var mixtureModelResult = MixtureModel.GetMultinomialQScores(ad, dp,
                                                                        new List <double[]> {
                model1.Means, model2.Means
            });

            // Update variant genotypes fields
            variantList[0].GenotypePosteriors = mixtureModelResult.GenotypePosteriors;
            variantList[1].GenotypePosteriors = mixtureModelResult.GenotypePosteriors;

            variantList[0].GenotypeQscore = mixtureModelResult.QScore;
            variantList[1].GenotypeQscore = mixtureModelResult.QScore;

            return(variantList);
        }
Esempio n. 3
0
        private static MixtureModelResult GetModelResult(CalledAllele allele, RecalibrationResult result)
        {
            var recal = new RecalibratedVariantsCollection();

            recal.AddLocus(allele);
            return(MixtureModel.UsePrefitModel(recal.Ad, recal.Dp, result.Means, result.Priors).PrimaryResult);
        }
Esempio n. 4
0
        private static List <CalledAllele> ProcessSingleVariantLocus(CalledAllele allele,
                                                                     RecalibrationResults results)
        {
            RecalibrationResult resultForVariant = GetModelFromType(allele, results);

            return(new List <CalledAllele> {
                UpdateVariant(allele, resultForVariant)
            });
        }
Esempio n. 5
0
        private static CalledAllele UpdateVariant(CalledAllele allele, RecalibrationResult result)
        {
            // Get model results
            string             key = allele.Chromosome + ":" + allele.ReferencePosition.ToString();
            MixtureModelResult mixtureModelResult;

            if (result.Variants.ContainsKey(key))
            {
                mixtureModelResult = result.Variants[key].MixtureModelResult;
            }
            else
            {
                mixtureModelResult = GetModelResult(allele, result);
            }

            return(UpdateGenotypeAndQScore(allele, mixtureModelResult));
        }