832926811b278d5c656957e1565acdde48522def kate Mon Apr 27 17:59:12 2020 -0700 Update GTEx gene track click handler and track settings to handle V8 (add Kidney Medulla tissue, support TPM and RPKM). refs #25130 diff --git src/hg/hgc/gtexClick.c src/hg/hgc/gtexClick.c index 4ac2c33..5886fd5 100644 --- src/hg/hgc/gtexClick.c +++ src/hg/hgc/gtexClick.c @@ -1,147 +1,148 @@ /* Details pages for GTEx tracks */ /* Copyright (C) 2015 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "hash.h" #include "hdb.h" #include "hvGfx.h" #include "trashDir.h" #include "hgc.h" #include "hCommon.h" #include "gtexGeneBed.h" #include "gtexTissue.h" #include "gtexUi.h" #include "gtexInfo.h" char *geneClassColorCode(char *geneClass) /* Get HTML color code used by GENCODE for transcript class * WARNING: should share code with gene color handling in hgTracks */ { char *unknown = "#010101"; if (geneClass == NULL) return unknown; if (sameString(geneClass, "coding")) return "#0C0C78"; if (sameString(geneClass, "nonCoding")) return "#006400"; if (sameString(geneClass, "pseudo")) return "#FF33FF"; if (sameString(geneClass, "problem")) return "#FE0000"; return unknown; } static struct gtexGeneBed *getGtexGene(char *item, char *chrom, int start, int end, char *table) /* Retrieve gene info for this item from the main track table. * Item name may be gene name, geneId or name/geneId */ { struct gtexGeneBed *gtexGene = NULL; struct sqlConnection *conn = hAllocConn(database); char **row; char query[512]; struct sqlResult *sr; if (sqlTableExists(conn, table)) { char *geneId = stringIn("ENSG", item); sqlSafef(query, sizeof query, "SELECT * FROM %s WHERE %s = '%s' " "AND chrom = '%s' AND chromStart = %d AND chromEnd = %d", table, geneId ? "geneId" : "name", geneId ? geneId : item, chrom, start, end); sr = sqlGetResult(conn, query); row = sqlNextRow(sr); if (row != NULL) { gtexGene = gtexGeneBedLoad(row); } sqlFreeResult(&sr); } hFreeConn(&conn); return gtexGene; } static char *getGeneDescription(struct gtexGeneBed *gtexGene) /* Get description for gene. Needed because knownGene table semantics have changed in hg38 */ { char query[256]; if (sameString(database, "hg38")) { char *geneId = cloneString(gtexGene->geneId); chopSuffix(geneId); sqlSafef(query, sizeof(query), "SELECT kgXref.description FROM kgXref, knownCanonical WHERE " "knownCanonical.protein LIKE '%%%s%%' AND " "knownCanonical.transcript=kgXref.kgID", geneId); } else { sqlSafef(query, sizeof(query), "SELECT kgXref.description FROM kgXref WHERE geneSymbol='%s'", gtexGene->name); } struct sqlConnection *conn = hAllocConn(database); char *desc = sqlQuickString(conn, query); hFreeConn(&conn); return desc; } void doGtexGeneExpr(struct trackDb *tdb, char *item) /* Details of GTEx gene expression item */ { int start = cartInt(cart, "o"); int end = cartInt(cart, "t"); struct gtexGeneBed *gtexGene = getGtexGene(item, seqName, start, end, tdb->table); if (gtexGene == NULL) errAbort("Can't find gene %s in GTEx gene table %s\n", item, tdb->table); char *version = gtexVersion(tdb->table); genericHeader(tdb, item); printf("Gene: "); char *desc = getGeneDescription(gtexGene); if (desc == NULL) printf("%s
\n", gtexGene->name); else { printf("%s
\n", hgGeneName(), database, gtexGene->name, gtexGene->name); printf("Description: %s
\n", desc); } printf("Ensembl gene ID: %s
\n", gtexGene->geneId); // The actual transcript model is a union, so this identification is approximate // (used just to find a transcript class) char *geneClass = gtexGeneClass(gtexGene); printf("GENCODE biotype: %s
\n", gtexGene->geneType); printf("Gene class: %s
\n", geneClassColorCode(geneClass), geneClass); int tisId; float highLevel = gtexGeneHighestMedianExpression(gtexGene, &tisId); -printf("Highest median expression: %0.2f RPKM in %s
\n", - highLevel, gtexGetTissueDescription(tisId, version)); -printf("Total median expression: %0.2f RPKM
\n", gtexGeneTotalMedianExpression(gtexGene)); +printf("Highest median expression: %0.2f %s in %s
\n", + highLevel, gtexExprUnit(version), gtexGetTissueDescription(tisId, version)); +printf("Total median expression: %0.2f %s
\n", gtexGeneTotalMedianExpression(gtexGene), + gtexExprUnit(version)); printf("Score: %d
\n", gtexGene->score); printf("Genomic position: " "%s %s:%d-%d
\n", database, hgTracksPathAndSettings(), database, gtexGene->chrom, gtexGene->chromStart+1, gtexGene->chromEnd, gtexGene->chrom, gtexGene->chromStart+1, gtexGene->chromEnd); puts("

"); // set gtexDetails (e.g. to 'log') to show log transformed details page // if hgTracks is log-transformed boolean doLogTransform = (trackDbSetting(tdb, "gtexDetails") && cartUsualBooleanClosestToHome(cart, tdb, FALSE, GTEX_LOG_TRANSFORM, GTEX_LOG_TRANSFORM_DEFAULT)); struct tempName pngTn; if (gtexGeneBoxplot(gtexGene->geneId, gtexGene->name, version, doLogTransform, &pngTn)) printf("
\n", pngTn.forHtml); printf("
"); gtexPortalLink(gtexGene->geneId); hPrintf("    "); gtexBodyMapLink(); printTrackHtml(tdb); }