d27baba8d7c7c0e779a3d79cb6d17b97055c40bc
angie
Mon Jul 28 16:42:58 2014 -0700
David pointed out that it is inappropriate to show Hardy-Weinberg equilibriumfrequencies on the VCF details page unless the VCF data are from a population
study -- so at this point, pretty much only 1000 Genomes. So I added a new
trackDb setting for vcf/vcfTabix, showHardyWeinberg, and added it to the
1000 Genomes track def.
diff --git src/hg/hgc/vcfClick.c src/hg/hgc/vcfClick.c
index b611796..e366656 100644
--- src/hg/hgc/vcfClick.c
+++ src/hg/hgc/vcfClick.c
@@ -184,31 +184,31 @@
}
printf("");
}
puts("");
}
hTableEnd();
jsEndCollapsibleSection();
}
static void ignoreEm(char *format, va_list args)
/* Ignore warnings from genotype parsing -- when there's one, there
* are usually hundreds more just like it. */
{
}
-static void vcfGenotypesDetails(struct vcfRecord *rec, char *track, char **displayAls)
+static void vcfGenotypesDetails(struct vcfRecord *rec, struct trackDb *tdb, char **displayAls)
/* Print summary of allele and genotype frequency, plus collapsible section
* with table of genotype details. */
{
struct vcfFile *vcff = rec->file;
if (vcff->genotypeCount == 0)
return;
// Wrapper table for collapsible section:
puts("
");
pushWarnHandler(ignoreEm);
vcfParseGenotypes(rec);
popWarnHandler();
// Tally genotypes and alleles for summary:
int refs = 0, alts = 0, unks = 0;
int refRefs = 0, refAlts = 0, altAlts = 0, gtUnk = 0, gtOther = 0, phasedGts = 0;
int i;
@@ -259,37 +259,43 @@
printf("; unknown: %d (%.3f%%)", unks, 100 * (double)unks/totalAlleles);
puts("
");
// Should be a better way to detect haploid chromosomes than comparison with "chrY":
if (vcff->genotypeCount > 1 && differentString(seqName, "chrY"))
{
printf("Genotypes: %s/%s: %d (%.3f%%); %s/%s: %d (%.3f%%); %s/%s: %d (%.3f%%)",
displayAls[0], displayAls[0], refRefs, 100*(double)refRefs/vcff->genotypeCount,
displayAls[0], displayAls[1], refAlts, 100*(double)refAlts/vcff->genotypeCount,
displayAls[1], displayAls[1], altAlts, 100*(double)altAlts/vcff->genotypeCount);
if (gtUnk > 0)
printf("; unknown: %d (%.3f%%)", gtUnk, 100*(double)gtUnk/vcff->genotypeCount);
if (gtOther > 0)
printf("; other: %d (%.3f%%)", gtOther, 100*(double)gtOther/vcff->genotypeCount);
printf("
\n");
if (rec->alleleCount == 2)
- printf("Hardy-Weinberg equilibrium: "
+ {
+ boolean showHW = cartOrTdbBoolean(cart, tdb, VCF_SHOW_HW_VAR, FALSE);
+ if (showHW)
+ printf("Hardy-Weinberg equilibrium: "
"P(%s/%s) = %.3f%%; P(%s/%s) = %.3f%%; P(%s/%s) = %.3f%%
",
displayAls[0], displayAls[0], 100*refAf*refAf,
displayAls[0], displayAls[1], 100*2*refAf*altAf,
displayAls[1], displayAls[1], 100*altAf*altAf);
}
-vcfGenotypeTable(rec, track, displayAls);
+ }
+puts("
");
+vcfGenotypeTable(rec, tdb->track, displayAls);
puts("
");
}
static void pgSnpCodingDetail(struct vcfRecord *rec)
/* Translate rec into pgSnp (with proper chrom name) and call Belinda's
* coding effect predictor from pgSnp details. */
{
char *genePredTable = "knownGene";
if (hTableExists(database, genePredTable))
{
struct pgSnp *pgs = pgSnpFromVcfRecord(rec);
if (!sameString(rec->chrom, seqName))
// rec->chrom might be missing "chr" prefix:
pgs->chrom = seqName;
printSeqCodDisplay(database, pgs, genePredTable);
@@ -369,31 +375,31 @@
}
char leftBase = rec->alleles[0][0];
unsigned int vcfStart = vcfRecordTrimIndelLeftBase(rec);
boolean showLeftBase = (rec->chromStart == vcfStart+1);
(void)vcfRecordTrimAllelesRight(rec);
char *displayAls[rec->alleleCount];
makeDisplayAlleles(rec, showLeftBase, leftBase, 20, TRUE, FALSE, displayAls);
printPosOnChrom(seqName, rec->chromStart, rec->chromEnd, NULL, FALSE, rec->name);
printf("Reference allele: %s
\n", displayAls[0]);
vcfAltAlleleDetails(rec, displayAls);
vcfQualDetails(rec);
vcfFilterDetails(rec);
vcfInfoDetails(rec);
pgSnpCodingDetail(rec);
makeDisplayAlleles(rec, showLeftBase, leftBase, 5, FALSE, TRUE, displayAls);
-vcfGenotypesDetails(rec, tdb->track, displayAls);
+vcfGenotypesDetails(rec, tdb, displayAls);
}
void doVcfDetailsCore(struct trackDb *tdb, char *fileOrUrl, boolean isTabix)
/* Show item details using fileOrUrl. */
{
genericHeader(tdb, NULL);
int start = cartInt(cart, "o");
int end = cartInt(cart, "t");
int vcfMaxErr = -1;
struct vcfFile *vcff = NULL;
/* protect against temporary network or parsing error */
struct errCatch *errCatch = errCatchNew();
if (errCatchStart(errCatch))
{
if (isTabix)