4344e168885850e053dc245826ab42f2b445c98f angie Wed Aug 24 13:11:01 2011 -0700 Feature #2821 (VCF parser): Fun with flawed input. This file's rows have6 keywords in the format column, but most genotype columns have only 5 pieces of data: ftp://ftp-trace.ncbi.nlm.nih.gov/1000genomes/ftp/release/20100804/supporting/AFR.BI_withr2.20100804.genotypes.vcf.gz This causes many vcfFileErr calls in vcfParseGenotypes. Turned out that vcfFileErr was not stopping after the specified # of errors; and that the warnings are so verbose that I don't think we really need to display them in hgTracks and hgc. So they are now ignored, and we don't segv on missing genotype info. diff --git src/hg/hgTracks/vcfTrack.c src/hg/hgTracks/vcfTrack.c index f09ae03..65088f8 100644 --- src/hg/hgTracks/vcfTrack.c +++ src/hg/hgTracks/vcfTrack.c @@ -626,47 +626,55 @@ struct hvGfx *hvgLL = (hvgSide != NULL) ? hvgSide : hvg; int clipXBak, clipYBak, clipWidthBak, clipHeightBak; hvGfxGetClip(hvgLL, &clipXBak, &clipYBak, &clipWidthBak, &clipHeightBak); hvGfxUnclip(hvgLL); hvGfxSetClip(hvgLL, leftLabelX, yOff, leftLabelWidth, height); // Draw the tree: int x = leftLabelX; struct yFromNodeHelper helper = {0, NULL, NULL}; initYFromNodeHelper(&helper, yOff, height-1, gtHapCount, gtHapOrder); (void)rDrawTreeInLabelArea(ht, hvgLL, yrtMidPoint, x, yFromHapNode, &helper); // Restore the prior clipping: hvGfxUnclip(hvgLL); hvGfxSetClip(hvgLL, clipXBak, clipYBak, clipWidthBak, clipHeightBak); } +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 vcfHapClusterDraw(struct track *tg, int seqStart, int seqEnd, struct hvGfx *hvg, int xOff, int yOff, int width, MgFont *font, Color color, enum trackVisibility vis) /* Split samples' chromosomes (haplotypes), cluster them by center-weighted * alpha similarity, and draw in the order determined by clustering. */ { const struct vcfFile *vcff = tg->extraUiData; if (vcff->records == NULL) return; purple = hvGfxFindColorIx(hvg, 0x99, 0x00, 0xcc); boolean compositeLevel = isNameAtCompositeLevel(tg->tdb, tg->tdb->track); char *colorBy = cartUsualStringClosestToHome(cart, tg->tdb, compositeLevel, VCF_HAP_COLORBY_VAR, VCF_HAP_COLORBY_REFALT); boolean colorByRefAlt = sameString(colorBy, VCF_HAP_COLORBY_REFALT); +pushWarnHandler(ignoreEm); struct vcfRecord *rec; for (rec = vcff->records; rec != NULL; rec = rec->next) vcfParseGenotypes(rec); +popWarnHandler(); unsigned short gtHapCount = 0; int ix, centerIx = getCenterVariantIx(tg, seqStart, seqEnd, vcff->records); struct hacTree *ht = NULL; unsigned short *gtHapOrder = clusterChroms(vcff, centerIx, >HapCount, &ht); struct vcfRecord *centerRec = NULL; for (rec = vcff->records, ix=0; rec != NULL; rec = rec->next, ix++) { if (ix == centerIx) centerRec = rec; else drawOneRec(rec, gtHapOrder, gtHapCount, tg, hvg, xOff, yOff, width, FALSE, colorByRefAlt); } // Draw the center rec on top, outlined with black lines, to make sure it is very visible: drawOneRec(centerRec, gtHapOrder, gtHapCount, tg, hvg, xOff, yOff, width, TRUE, colorByRefAlt); // Draw as much of the tree as can fit in the left label area: @@ -717,31 +725,31 @@ { char *fileOrUrl = NULL; /* Figure out url or file name. */ if (tg->parallelLoading) { /* do not use mysql uring parallel-fetch load */ fileOrUrl = trackDbSetting(tg->tdb, "bigDataUrl"); } else { // TODO: may need to handle per-chrom files like bam, maybe fold bamFileNameFromTable into this: struct sqlConnection *conn = hAllocConnTrack(database, tg->tdb); fileOrUrl = bbiNameFromSettingOrTable(tg->tdb, conn, tg->table); hFreeConn(&conn); } -int vcfMaxErr = 100; +int vcfMaxErr = -1; struct vcfFile *vcff = NULL; boolean compositeLevel = isNameAtCompositeLevel(tg->tdb, tg->tdb->track); boolean hapClustEnabled = cartUsualBooleanClosestToHome(cart, tg->tdb, compositeLevel, VCF_HAP_ENABLED_VAR, TRUE); /* protect against temporary network error */ struct errCatch *errCatch = errCatchNew(); if (errCatchStart(errCatch)) { vcff = vcfTabixFileMayOpen(fileOrUrl, chromName, winStart, winEnd, vcfMaxErr); if (vcff != NULL) { if (hapClustEnabled && vcff->genotypeCount > 1 && vcff->genotypeCount < 3000 && (tg->visibility == tvPack || tg->visibility == tvSquish)) vcfHapClusterOverloadMethods(tg, vcff); else