814df69886d2dc7c791db10417901a9768931c88 angie Mon Jun 1 17:16:44 2015 -0700 Added support for bigGenePred to anno* libs for hgVai and hgIntegrator. While updating annoFormatVep.c to use column indices from autoSql instead of hardcoding genePred indices, I found that I had been using an incorrect index for strand anyway -- so I removed 3 lines of no-op code. refs #15439 diff --git src/hg/lib/genePred.c src/hg/lib/genePred.c index f13f060..b5d690d 100644 --- src/hg/lib/genePred.c +++ src/hg/lib/genePred.c @@ -2097,15 +2097,60 @@ { gp->exonStarts[ii] += bb->start; gp->exonEnds[ii] += gp->exonStarts[ii]; } gp->name2 = cloneString(row[ 9]); gp->cdsStartStat = parseCdsStat(row[ 10]); gp->cdsEndStat = parseCdsStat(row[ 11]); sqlSignedDynamicArray(row[ 12], &gp->exonFrames, &numBlocks); gp->optFields |= genePredExonFramesFld; assert (numBlocks == gp->exonCount); return gp; } + +static void sqlUnsignedDynamicArrayNoClobber(char *s, unsigned **retArray, int *retSize) +/* Make a copy of s on stack and chop that up so we don't mangle s. */ +{ +char copy[strlen(s)+1]; +safecpy(copy, sizeof(copy), s); +sqlUnsignedDynamicArray(copy, retArray, retSize); +} + +struct genePred *genePredFromBigGenePredRow(char **row) +/* build a genePred from a bigGenePred row */ +{ +struct genePred *gp; +AllocVar(gp); +gp->chrom = cloneString(row[0]); +gp->txStart = sqlUnsigned(row[1]); +gp->txEnd = sqlUnsigned(row[2]); +gp->name = cloneString(row[3]); +gp->strand[0] = row[5][0]; +gp->strand[1] = row[5][1]; +gp->cdsStart = sqlUnsigned(row[6]); +gp->cdsEnd = sqlUnsigned(row[7]); +gp->exonCount = sqlUnsigned(row[9]); +int numBlocks; +sqlUnsignedDynamicArrayNoClobber(row[11], &gp->exonStarts, &numBlocks); +assert (numBlocks == gp->exonCount); +// First put blockSizes in exonEnds: +sqlUnsignedDynamicArrayNoClobber(row[10], &gp->exonEnds, &numBlocks); +assert (numBlocks == gp->exonCount); +// Then add in txStart to relative starts, and add starts to block sizes to get ends: +int ii; +for(ii=0; ii < numBlocks; ii++) + { + gp->exonStarts[ii] += gp->txStart; + gp->exonEnds[ii] += gp->exonStarts[ii]; + } +gp->name2 = cloneString(row[12]); +gp->cdsStartStat = parseCdsStat(row[13]); +gp->cdsEndStat = parseCdsStat(row[14]); +gp->optFields |= genePredCdsStatFld; +sqlSignedDynamicArray(row[15], &gp->exonFrames, &numBlocks); +assert (numBlocks == gp->exonCount); +gp->optFields |= genePredExonFramesFld; +return gp; +}