1b074613b1c6b7f84953c3f490631b91d844c9a9 galt Thu Sep 8 22:40:20 2022 -0700 Adapting Angie's existing variant effects to the new dbSnp that uses SPDI and provided via json formatted data. So users can see variant effects with version 153 or later. refs #29989 diff --git src/hg/hgc/hgc.c src/hg/hgc/hgc.c index 460d4ad..215b36a 100644 --- src/hg/hgc/hgc.c +++ src/hg/hgc/hgc.c @@ -18699,45 +18699,32 @@ if (gp->exonFrames == NULL) genePredAddExonFrames(gp); } else { gp = genePredLoad(row+hasBin); genePredAddExonFrames(gp); } slAddHead(&gpList, gp); } sqlFreeResult(&sr); hFreeConn(&conn2); return gpList; } -void printSnp125Function(struct trackDb *tdb, struct snp125 *snp) -/* If the user has selected a gene track for functional annotation, - * report how this SNP relates to any nearby genes. */ -{ -char varName[512]; -safef(varName, sizeof(varName), "%s_geneTrack", tdb->track); -struct slName *geneTracks = cartOptionalSlNameList(cart, varName); -if (geneTracks == NULL && !cartListVarExists(cart, varName)) +void printSnp125FunctionShared(struct snp125 *snp, struct slName *geneTracks) { - char *defaultGeneTracks = trackDbSetting(tdb, "defaultGeneTracks"); - if (isNotEmpty(defaultGeneTracks)) - geneTracks = slNameListFromComma(defaultGeneTracks); - else - return; - } struct sqlConnection *conn = hAllocConn(database); struct slName *gt; boolean first = TRUE; for (gt = geneTracks; gt != NULL; gt = gt->next) if (sqlTableExists(conn, gt->name)) { if (first) { printf("<BR><B>UCSC's predicted function relative to selected gene tracks:</B>\n"); printf("<TABLE border=0 cellspacing=0 cellpadding=0>\n"); } struct genePred *geneList = getGPsWithFrames(conn, gt->name, snp->chrom, snp->chromStart, snp->chromEnd); struct genePred *gene; char query[256]; @@ -18745,30 +18732,78 @@ sqlSafef(query, sizeof(query), "select shortLabel from trackDb where tableName='%s'", gt->name); char *shortLabel = sqlQuickQuery(conn, query, buf, sizeof(buf)-1); if (shortLabel == NULL) shortLabel = gt->name; for (gene = geneList; gene != NULL; gene = gene->next) printSnp125FunctionInGene(snp, gt->name, shortLabel, gene); if (geneList == NULL) printSnp125NearGenes(conn, snp, gt->name, shortLabel); first = FALSE; } if (! first) printf("</TABLE>\n"); hFreeConn(&conn); } +void printSnp125Function(struct trackDb *tdb, struct snp125 *snp) +/* If the user has selected a gene track for functional annotation, + * report how this SNP relates to any nearby genes. */ +{ +char varName[512]; +safef(varName, sizeof(varName), "%s_geneTrack", tdb->track); +struct slName *geneTracks = cartOptionalSlNameList(cart, varName); +if (geneTracks == NULL && !cartListVarExists(cart, varName)) + { + char *defaultGeneTracks = trackDbSetting(tdb, "defaultGeneTracks"); + if (isNotEmpty(defaultGeneTracks)) + geneTracks = slNameListFromComma(defaultGeneTracks); + else + return; + } + +printSnp125FunctionShared(snp, geneTracks); +} + +void printSnp153Function(struct trackDb *tdb, struct snp125 *snp) +/* If the user has selected a gene track for functional annotation, + * report how this SNP relates to any nearby genes. */ +{ + +struct slName *geneTracks = NULL; + +struct trackDb *correctTdb = tdbOrAncestorByName(tdb, tdb->track); + +struct slName *defaultGeneTracks = slNameListFromComma(trackDbSetting(tdb, "defaultGeneTracks")); + +struct trackDb *geneTdbList = snp125FetchGeneTracks(database, cart); +struct trackDb *gTdb; +for (gTdb = geneTdbList; gTdb; gTdb=gTdb->next) + { + char *trackName = gTdb->track; + char suffix[512]; + safef(suffix, sizeof(suffix), "geneTrack.%s", trackName); + boolean option = cartUsualBooleanClosestToHome(cart, correctTdb, FALSE, suffix, slNameInList(defaultGeneTracks,trackName)); + if (option) + { + slNameAddHead(&geneTracks, trackName); + } + } + +if (geneTracks) + printSnp125FunctionShared(snp, geneTracks); +} + char *dbSnpFuncFromInt(unsigned char funcCode) /* Translate an integer function code from NCBI into an abbreviated description. * Do not free return value! */ // Might be a good idea to flesh this out with all codes, libify, and share with // snpNcbiToUcsc instead of partially duplicating. { switch (funcCode) { case 3: return "coding-synon"; case 8: return "cds-reference"; case 41: return "nonsense"; case 42: