7354383ad1e6cb20625d5203a9593ce5022aa2ea angie Mon Aug 29 16:00:58 2011 -0700 Feature #2823 (VCF track handler): on details page, display allele andgenotype frequencies as percents. When genotypes are given, display Hardy-Weinberg equilibrium genotype probabilities for comparison. diff --git src/hg/hgc/vcfClick.c src/hg/hgc/vcfClick.c index e39854b..62a7fab 100644 --- src/hg/hgc/vcfClick.c +++ src/hg/hgc/vcfClick.c @@ -149,42 +149,49 @@ refs++; else alts++; if (gt->hapIxA == 0 && gt->hapIxB == 0) refRefs++; else if (gt->hapIxA == 1 && gt->hapIxB == 1) altAlts++; else if ((gt->hapIxA == 1 && gt->hapIxB == 0) || (gt->hapIxA == 0 && gt->hapIxB == 1)) refAlts++; else gtOther++; } } printf("Genotype count: %d (%d phased)
\n", vcff->genotypeCount, phasedGts); -printf("Alleles: %s: %d (%.2f); %s: %d (%.2f)
\n", - rec->alleles[0], refs, (double)refs/(2*vcff->genotypeCount), - rec->alleles[1], alts, (double)alts/(2*vcff->genotypeCount)); +double refAf = (double)refs/(2*vcff->genotypeCount); +double altAf = (double)alts/(2*vcff->genotypeCount); +printf("Alleles: %s: %d (%.3f%%); %s: %d (%.3f%%)
\n", + rec->alleles[0], refs, 100*refAf, rec->alleles[1], alts, 100*altAf); if (vcff->genotypeCount > 1) { - printf("Genotypes: %s/%s: %d (%.2f); %s/%s: %d (%.2f); %s/%s: %d (%.2f)", - rec->alleles[0], rec->alleles[0], refRefs, (double)refRefs/vcff->genotypeCount, - rec->alleles[0], rec->alleles[1], refAlts, (double)refAlts/vcff->genotypeCount, - rec->alleles[1], rec->alleles[1], altAlts, (double)altAlts/vcff->genotypeCount); + printf("Genotypes: %s/%s: %d (%.3f%%); %s/%s: %d (%.3f%%); %s/%s: %d (%.3f%%)", + rec->alleles[0], rec->alleles[0], refRefs, 100*(double)refRefs/vcff->genotypeCount, + rec->alleles[0], rec->alleles[1], refAlts, 100*(double)refAlts/vcff->genotypeCount, + rec->alleles[1], rec->alleles[1], altAlts, 100*(double)altAlts/vcff->genotypeCount); if (gtOther > 0) - printf("; other: %d (%.2f)", gtOther, (double)gtOther/vcff->genotypeCount); + printf("; other: %d (%.3f)", gtOther, (double)gtOther/vcff->genotypeCount); printf("
\n"); + if (rec->alleleCount == 2) + printf("Hardy-Weinberg equilibrium: " + "P(%s/%s) = %.3f%%; P(%s/%s) = %.3f%%; P(%s/%s) = %.3f%%
", + rec->alleles[0], rec->alleles[0], 100*refAf*refAf, + rec->alleles[0], rec->alleles[1], 100*2*refAf*altAf, + rec->alleles[1], rec->alleles[1], 100*altAf*altAf); } jsBeginCollapsibleSection(cart, track, "genotypes", "Detailed genotypes", FALSE); dyStringClear(tmp1); dyStringAppend(tmp1, rec->format); enum vcfInfoType formatTypes[256]; char *formatKeys[256]; int formatCount = chopString(tmp1->string, ":", formatKeys, ArraySize(formatKeys)); puts("Genotype info key:
"); for (i = 0; i < formatCount; i++) { if (sameString(formatKeys[i], vcfGtGenotype)) continue; const struct vcfInfoDef *def = vcfInfoDefForGtKey(vcff, formatKeys[i]); char *desc = def ? def->description : "not described in VCF header"; printf("  %s: %s
\n", formatKeys[i], desc);