ee9a6c5c63eba2d963a5d7581185b1004fffe964 angie Mon Apr 15 14:06:10 2013 -0700 Added indentifying name to annoStreamer for output header info and better error messages. refs #6152 diff --git src/lib/annoStreamVcf.c src/lib/annoStreamVcf.c index 146d9d2..f31c7f8 100644 --- src/lib/annoStreamVcf.c +++ src/lib/annoStreamVcf.c @@ -13,31 +13,31 @@ struct dyString *dyGt; // Scratch space for squashing genotype columns int numCols; // Number of columns in autoSql def of VCF. int numFileCols; // Number of columns in VCF file. boolean isTabix; // True if we are accessing compressed VCF via tabix index }; static void asvSetRegion(struct annoStreamer *vSelf, char *chrom, uint regionStart, uint regionEnd) /* Set region -- and free current sqlResult if there is one. */ { annoStreamerSetRegion(vSelf, chrom, regionStart, regionEnd); struct annoStreamVcf *self = (struct annoStreamVcf *)vSelf; if (self->isTabix) lineFileSetTabixRegion(self->vcff->lf, chrom, regionStart, regionEnd); else if (chrom != NULL) - errAbort("annoStreamVcf: setRegion not yet implemented for non-tabix VCF."); + errAbort("annoStreamVcf %s: setRegion not yet implemented for non-tabix VCF.", vSelf->name); } static char *asvGetHeader(struct annoStreamer *vSelf) /* Return VCF header (e.g. for use by formatter) */ { struct annoStreamVcf *self = (struct annoStreamVcf *)vSelf; return cloneString(self->vcff->headerString); } static char **nextRowUnfiltered(struct annoStreamVcf *self) /* Get the next VCF record and put the row text into autoSql words. * Return pointer to self->asWords if we get a row, otherwise NULL. */ { char *words[self->numFileCols]; int wordCount; @@ -96,47 +96,47 @@ rightFail, words, self->numCols, callerLm); } static void asvClose(struct annoStreamer **pVSelf) /* Close VCF file and free self. */ { if (pVSelf == NULL) return; struct annoStreamVcf *self = *(struct annoStreamVcf **)pVSelf; vcfFileFree(&(self->vcff)); // Don't free self->record -- currently it belongs to vcff's localMem dyStringFree(&(self->dyGt)); annoStreamerFree(pVSelf); } -struct annoStreamer *annoStreamVcfNew(char *fileOrUrl, boolean isTabix, - struct annoAssembly *aa, int maxRecords) +struct annoStreamer *annoStreamVcfNew(char *fileOrUrl, boolean isTabix, struct annoAssembly *aa, + int maxRecords) /* Create an annoStreamer (subclass) object from a VCF file, which may * or may not have been compressed and indexed by tabix. */ { int maxErr = -1; // don't errAbort on VCF format warnings/errs struct vcfFile *vcff; if (isTabix) vcff = vcfTabixFileMayOpen(fileOrUrl, NULL, 0, 0, maxErr, maxRecords); else vcff = vcfFileMayOpen(fileOrUrl, maxErr, maxRecords, FALSE); if (vcff == NULL) - errAbort("Unable to open VCF: '%s'", fileOrUrl); + errAbort("annoStreamVcfNew: unable to open VCF: '%s'", fileOrUrl); struct annoStreamVcf *self; AllocVar(self); struct annoStreamer *streamer = &(self->streamer); struct asObject *asObj = vcfAsObj(); -annoStreamerInit(streamer, aa, asObj); +annoStreamerInit(streamer, aa, asObj, fileOrUrl); streamer->rowType = arVcf; streamer->setRegion = asvSetRegion; streamer->getHeader = asvGetHeader; streamer->nextRow = asvNextRow; streamer->close = asvClose; self->vcff = vcff; self->dyGt = dyStringNew(1024); self->isTabix = isTabix; self->numCols = slCount(asObj->columnList); self->numFileCols = 8; if (vcff->genotypeCount > 0) self->numFileCols = 9 + vcff->genotypeCount; return (struct annoStreamer *)self; }