8be39eded2ca995a387d5c47127f049c2b228932 braney Tue Jun 2 17:26:58 2015 -0700 changes to get NCBI RefSeq track to use the trackVersion table, and to grab Genbank information when available. #13673 diff --git src/hg/hgc/hgc.c src/hg/hgc/hgc.c index 6caacc9..34c7317 100644 --- src/hg/hgc/hgc.c +++ src/hg/hgc/hgc.c @@ -8798,101 +8798,75 @@ if (nonCoding) printf("none (non-coding)
\n"); else printf("%s
", dbUrl, proteinID, proteinID); } freeMem(shortItemName); } void doEnsemblGene(struct trackDb *tdb, char *item, char *itemForUrl) /* Put up Ensembl Gene track info or Ensembl NonCoding track info. */ { char *dupe, *type, *words[16]; int wordCount; int start = cartInt(cart, "o"); -struct sqlConnection *conn = hAllocConn(database); char condStr[256]; -char versionString[256]; -char dateReference[256]; char headerTitle[512]; -/* see if hgFixed.trackVersion exists */ -boolean trackVersionExists = hTableExists("hgFixed", "trackVersion"); -/* assume nothing found */ -versionString[0] = 0; -dateReference[0] = 0; - -if (trackVersionExists) - { - char query[256]; - sqlSafef(query, sizeof(query), "select version,dateReference from hgFixed.trackVersion where db = '%s' AND name = 'ensGene' order by updateTime DESC limit 1", database); - struct sqlResult *sr = sqlGetResult(conn, query); - char **row; - - /* in case of NULL result from the table */ - versionString[0] = 0; - while ((row = sqlNextRow(sr)) != NULL) - { - safef(versionString, sizeof(versionString), "Ensembl %s", - row[0]); - safef(dateReference, sizeof(dateReference), "%s", - row[1]); - } - sqlFreeResult(&sr); - } - if (itemForUrl == NULL) itemForUrl = item; dupe = cloneString(tdb->type); -if (versionString[0]) - safef(headerTitle, sizeof(headerTitle), "%s - %s", item, versionString); + +struct trackVersion *trackVersion = getTrackVersion(database, tdb->track); +if ((trackVersion != NULL) && !isEmpty(trackVersion->version)) + safef(headerTitle, sizeof(headerTitle), "%s - Ensembl %s", item, trackVersion->version); else safef(headerTitle, sizeof(headerTitle), "%s", item); genericHeader(tdb, headerTitle); wordCount = chopLine(dupe, words); char *archive = trackDbSetting(tdb, "ensArchive"); if (archive == NULL) { - if (dateReference[0]) + if ((trackVersion != NULL) && !isEmpty(trackVersion->dateReference)) { - if (differentWord("current", dateReference)) - archive = cloneString(dateReference); + if (differentWord("current", trackVersion->dateReference)) + archive = cloneString(trackVersion->dateReference); } } printEnsemblCustomUrl(tdb, itemForUrl, item == itemForUrl, archive); sqlSafefFrag(condStr, sizeof condStr, "name='%s'", item); +struct sqlConnection *conn = hAllocConn(database); + /* if this is a non-coding gene track, then print the biotype and the external ID */ if (sameWord(tdb->table, "ensGeneNonCoding")) { - struct sqlConnection *conn2 = hAllocConn(database); char query[256]; struct sqlResult *sr = NULL; char **row; sqlSafef(query, sizeof(query), "select biotype, extGeneId from %s where %s", tdb->table, condStr); sr = sqlGetResult(conn, query); if ((row = sqlNextRow(sr)) != NULL) { printf("Gene Type: %s
\n", row[0]); printf("External Gene ID: %s
\n", row[1]); } sqlFreeResult(&sr); - hFreeConn(&conn2); } else { /* print CCDS if this is not a non-coding gene */ printCcdsForSrcDb(conn, item); printf("
\n"); } if (hTableExists(database, "ensInfo")) { struct sqlResult *sr; char query[256], **row; struct ensInfo *info = NULL; sqlSafef(query, sizeof(query), @@ -11297,139 +11271,198 @@ { AllocVar(palInfo); palInfo->chrom = chrom; palInfo->left = left; palInfo->right = right; palInfo->rnaName = rnaName; } geneShowPosAndLinksPal(rl->mrnaAcc, rl->protAcc, tdb, "refPep", "htcTranslatedProtein", "htcRefMrna", "htcGeneInGenome", "mRNA Sequence",palInfo); printTrackHtml(tdb); hFreeConn(&conn); } -void doNcbiRefGene(struct trackDb *tdb, char *rnaName) -/* Process click on a NCBI RefSeq gene. */ +static struct refLink *printRefSeqInfo( struct sqlConnection *conn, struct trackDb *tdb, char *rnaName, char *version) { -struct sqlConnection *conn = hAllocConn(database); struct sqlResult *sr; char **row; char query[256]; char *sqlRnaName = rnaName; -struct ncbiRefLink *rl; -boolean isPredicted = sameString(tdb->table, "ncbiRefPredicted"); +char *summary = NULL; +boolean isXeno = sameString(tdb->table, "xenoRefGene"); +struct refLink *rl; /* Make sure to escape single quotes for DB parseability */ if (strchr(rnaName, '\'')) { sqlRnaName = replaceChars(rnaName, "'", "''"); } /* get refLink entry */ -sqlSafef(query, sizeof(query), "select * from ncbiRefLink where id = '%s'", sqlRnaName); +if (version == NULL) + { + sqlSafef(query, sizeof(query), "select * from refLink where mrnaAcc = '%s'", sqlRnaName); sr = sqlGetResult(conn, query); if ((row = sqlNextRow(sr)) == NULL) - errAbort("Couldn't find %s in ncbiRefLink table.", rnaName); -rl = ncbiRefLinkLoad(row); + errAbort("Couldn't find %s in refLink table - this accession may no longer be available.", rnaName); + rl = refLinkLoad(row); + sqlFreeResult(&sr); + } +else + { + sqlSafef(query, sizeof(query), "select * from refLink r, gbCdnaInfo g where mrnaAcc = '%s' and r.mrnaAcc=g.acc and g.version='%s'", sqlRnaName, version); + sr = sqlGetResult(conn, query); + if ((row = sqlNextRow(sr)) == NULL) + { + sqlFreeResult(&sr); + return NULL; + } + rl = refLinkLoad(row); sqlFreeResult(&sr); + } /* print the first section with info */ -if (isPredicted) - cartWebStart(cart, database, "NCBI Predicted RefSeq Gene"); -else - cartWebStart(cart, database, "NCBI Curated RefSeq Gene"); printf("\n\n"); -prNcbiRefGeneInfo(conn, rnaName, sqlRnaName, rl, isPredicted); +prRefGeneInfo(conn, rnaName, sqlRnaName, rl, isXeno); +addGeneExtra(rl->name); /* adds columns if extra info is available */ printf("\n
\n"); +/* optional summary text */ +summary = getRefSeqSummary(conn, sqlRnaName); +if (summary != NULL) + { + htmlHorizontalLine(); + printf("

Summary of %s

\n", rl->name); + printf("

%s

\n", summary); + freeMem(summary); + } htmlHorizontalLine(); -struct palInfo *palInfo = NULL; - - -geneShowPosAndLinksPal(rl->id, NULL, tdb, NULL, "htcTranslatedProtein", - "htcGeneMrna", "htcGeneInGenome", "mRNA Sequence",palInfo); - -printTrackHtml(tdb); -hFreeConn(&conn); +return rl; } -void doRefGene(struct trackDb *tdb, char *rnaName) -/* Process click on a known RefSeq gene. */ + +void doNcbiRefGene(struct trackDb *tdb, char *rnaName) +/* Process click on a NCBI RefSeq gene. */ { struct sqlConnection *conn = hAllocConn(database); struct sqlResult *sr; char **row; char query[256]; char *sqlRnaName = rnaName; -char *summary = NULL; -boolean isXeno = sameString(tdb->table, "xenoRefGene"); -struct refLink *rl; -int start = cartInt(cart, "o"); +struct ncbiRefLink *nrl; +boolean isPredicted = sameString(tdb->table, "ncbiRefPredicted"); int left = cartInt(cart, "l"); int right = cartInt(cart, "r"); char *chrom = cartString(cart, "c"); +char noDot[1024]; + +struct dyString *dy = newDyString(1024); +if (isPredicted) + dyStringPrintf(dy, "NCBI Predicted RefSeq Gene"); +else + dyStringPrintf(dy, "NCBI Curated RefSeq Gene"); + +struct trackVersion *trackVersion = getTrackVersion(database, "ncbiRefSeq"); +if ((trackVersion != NULL) && !isEmpty(trackVersion->version)) + dyStringPrintf(dy, "- Release %s\n", trackVersion->version); + +cartWebStart(cart, database, "%s", dy->string); +safecpy(noDot, sizeof noDot, rnaName); +char *ptr = strchr(noDot, '.'); +if (ptr) + *ptr++ = 0; + +// get info from Genbank (if any) +struct refLink *rl = printRefSeqInfo( conn, tdb, noDot, ptr); /* Make sure to escape single quotes for DB parseability */ if (strchr(rnaName, '\'')) { sqlRnaName = replaceChars(rnaName, "'", "''"); } + /* get refLink entry */ -sqlSafef(query, sizeof(query), "select * from refLink where mrnaAcc = '%s'", sqlRnaName); +sqlSafef(query, sizeof(query), "select * from ncbiRefLink where id = '%s'", sqlRnaName); sr = sqlGetResult(conn, query); if ((row = sqlNextRow(sr)) == NULL) - errAbort("Couldn't find %s in refLink table - this accession may no longer be available.", rnaName); -rl = refLinkLoad(row); + errAbort("Couldn't find %s in ncbiRefLink table.", rnaName); +nrl = ncbiRefLinkLoad(row); sqlFreeResult(&sr); /* print the first section with info */ -if (isXeno) - cartWebStart(cart, database, "Non-%s RefSeq Gene", organism); -else - cartWebStart(cart, database, "RefSeq Gene"); printf("\n\n"); -prRefGeneInfo(conn, rnaName, sqlRnaName, rl, isXeno); -addGeneExtra(rl->name); /* adds columns if extra info is available */ +if (rl == NULL) + { + prNcbiRefGeneInfo(conn, rnaName, sqlRnaName, nrl, isPredicted); + htmlHorizontalLine(); + } + +if ((trackVersion != NULL) && !isEmpty(trackVersion->version)) + { + printf("Annotation Release: %s
", trackVersion->comment, trackVersion->version); + htmlHorizontalLine(); + } printf("\n
\n"); -/* optional summary text */ -summary = getRefSeqSummary(conn, sqlRnaName); -if (summary != NULL) +struct palInfo *palInfo = NULL; + +if (genbankIsRefSeqCodingMRnaAcc(rnaName)) { - htmlHorizontalLine(); - printf("

Summary of %s

\n", rl->name); - printf("

%s

\n", summary); - freeMem(summary); + AllocVar(palInfo); + palInfo->chrom = chrom; + palInfo->left = left; + palInfo->right = right; + palInfo->rnaName = rnaName; } -htmlHorizontalLine(); -/* print alignments that track was based on */ +geneShowPosAndLinksPal(nrl->id, NULL, tdb, NULL, "htcTranslatedProtein", + "htcGeneMrna", "htcGeneInGenome", "mRNA Sequence",palInfo); + +printTrackHtml(tdb); +hFreeConn(&conn); +} + +void doRefGene(struct trackDb *tdb, char *rnaName) +/* Process click on a known RefSeq gene. */ { +struct sqlConnection *conn = hAllocConn(database); +int start = cartInt(cart, "o"); +int left = cartInt(cart, "l"); +int right = cartInt(cart, "r"); +char *chrom = cartString(cart, "c"); + +boolean isXeno = sameString(tdb->table, "xenoRefGene"); +if (isXeno) + cartWebStart(cart, database, "Non-%s RefSeq Gene", organism); +else + cartWebStart(cart, database, "RefSeq Gene"); +struct refLink *rl = printRefSeqInfo( conn, tdb, rnaName, NULL); + +/* print alignments that track was based on */ char *aliTbl = (sameString(tdb->table, "refGene") ? "refSeqAli" : "xenoRefSeqAli"); if (hTableExists(database, aliTbl)) { struct psl *pslList = getAlignments(conn, aliTbl, rl->mrnaAcc); printf("

mRNA/Genomic Alignments

"); printAlignments(pslList, start, "htcCdnaAli", aliTbl, rl->mrnaAcc); } else warn("Sequence alignment links not shown below, the table %s.refSeqAli is not installed " "on this server", database); -} htmlHorizontalLine(); struct palInfo *palInfo = NULL; if (genbankIsRefSeqCodingMRnaAcc(rnaName)) { AllocVar(palInfo); palInfo->chrom = chrom; palInfo->left = left; palInfo->right = right; palInfo->rnaName = rnaName; } geneShowPosAndLinksPal(rl->mrnaAcc, rl->protAcc, tdb, "refPep", "htcTranslatedProtein",