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"); } }
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); }
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); }
private static List <CalledAllele> ProcessSingleVariantLocus(CalledAllele allele, RecalibrationResults results) { RecalibrationResult resultForVariant = GetModelFromType(allele, results); return(new List <CalledAllele> { UpdateVariant(allele, resultForVariant) }); }
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)); }