b423dda290a9461dd3f41ec127031cc6acfb8c91 Merge parents a8ad5a3 1d7c00a kate Tue Jul 7 11:25:21 2015 -0700 Merge branch 'master' into gtex diff --cc src/hg/hgc/hgc.c index 9848c5d,6b58cb4..dc348fb --- src/hg/hgc/hgc.c +++ src/hg/hgc/hgc.c @@@ -24445,119 -24443,52 +24445,126 @@@ { char *table = cartString(cart, "table"); struct trackDb *tdb = hashFindVal(trackHash, table); if (tdb == NULL) errAbort("no trackDb entry for %s", table); return tdb; } void doQPCRPrimers(struct trackDb *tdb, char *itemName) /* Put up page for QPCRPrimers. */ { genericHeader(tdb, itemName); doBedDetail(tdb, NULL, itemName); } /* end of doQPCRPrimers */ +void doGtexGeneExpr(struct trackDb *tdb, char *item) +/* Details of GTEX gene expression item */ +{ +// Load item from table */ + +// TODO: Get full details from Data table +struct dyString *dy = dyStringNew(0); +//char sampleTable[128]; +//safef(sampleTable, sizeof(able), "%sSampleData", tdb->table); + +struct sqlConnection *conn = hAllocConn(database); +char **row; +struct gtexGeneBed *gtexGene = NULL; +int expCount = 0; +if (sqlTableExists(conn, tdb->table)) + { + char query[512]; + sqlSafef(query, sizeof(query), "select * from %s where name = '%s'", tdb->table, item); + struct sqlResult *sr = sqlGetResult(conn, query); + row = sqlNextRow(sr); + if (row != NULL) + { + gtexGene = gtexGeneBedLoad(row); + expCount = gtexGene->expCount; + } + sqlFreeResult(&sr); + } +hFreeConn(&conn); + +genericHeader(tdb, item); + +if (gtexGene != NULL) + { + printf("<b>Gene name:</b> %s<br>\n", gtexGene->name); + printf("<b>Ensembl gene:</b> %s<br>\n", gtexGene->geneId); + printf("<b>Ensembl transcript:</b> %s<br>\n", gtexGene->transcriptId); + } +printTrackHtml(tdb); + +// Print out tissue table with color assignments +conn = hAllocConn("hgFixed"); +char *tissueTable = "gtexTissue"; +if (sqlTableExists(conn, tissueTable)) + { + dyStringPrintf(dy, "<table>"); + dyStringPrintf(dy, "<tr><td><b>Color<b></td><td><b>Tissue<b></td></tr>\n"); + int i; + double invExpCount = 1.0/expCount; + char query[512]; + sqlSafef(query, sizeof(query), "select * from %s", tissueTable); + struct sqlResult *sr = sqlGetResult(conn, query); + for (i=0; i<expCount; i++) + { + row = sqlNextRow(sr); + if (row == NULL) + break; + struct gtexTissue *tissue = gtexTissueLoad(row); + double colPos = invExpCount * i; + struct rgbColor color = saturatedRainbowAtPos(colPos); + dyStringPrintf(dy, "<tr><td bgcolor='#%02X%02X%02X'></td><td>%s</td></tr>\n", + color.r, color.g, color.b, tissue->description); + } + sqlFreeResult(&sr); + } +hFreeConn(&conn); +dyStringPrintf(dy, "</table>"); +puts(dy->string); + +//cartWebStart(cart, database, "List of items assayed in %s", clusterTdb->shortLabel); + +//genericClickHandlerPlus(tdb, item, item, dy->string); +dyStringFree(&dy); +} + void doSnakeClick(struct trackDb *tdb, char *itemName) /* Put up page for snakes. */ { genericHeader(tdb, itemName); char *otherSpecies = trackHubSkipHubName(tdb->table) + strlen("snake"); char *hubName = cloneString(database); - char *ptr = strchr(hubName + 4, '_'); - *ptr = 0; char otherDb[4096]; char *qName = cartOptionalString(cart, "qName"); int qs = atoi(cartOptionalString(cart, "qs")); int qe = atoi(cartOptionalString(cart, "qe")); int qWidth = atoi(cartOptionalString(cart, "qWidth")); - safef(otherDb, sizeof otherDb, "%s_%s", hubName, otherSpecies); + if(trackHubDatabase(database)) + { + char *ptr = strchr(hubName + 4, '_'); + *ptr = 0; + safef(otherDb, sizeof otherDb, "%s_%s", hubName, otherSpecies); + } + else + { + safef(otherDb, sizeof otherDb, "%s", otherSpecies); + } printf("<A HREF=\"hgTracks?db=%s&position=%s:%d-%d&%s_snake%s=full\" TARGET=_BLANK><B>Link to block in other assembly</A><BR>\n", otherDb, qName, qs, qe,hubName,trackHubSkipHubName(database)); int qCenter = (qs + qe) / 2; int newQs = qCenter - qWidth/2; int newQe = qCenter + qWidth/2; printf("<A HREF=\"hgTracks?db=%s&position=%s:%d-%d&%s_snake%s=full\" TARGET=\"_blank\"><B>Link to same window size in other assembly</A><BR>\n", otherDb, qName, newQs, newQe,hubName,trackHubSkipHubName(database)); } bool vsameWords(char *a, va_list args) /* returns true if a is sameWord as any arg, all args must be char* */ { bool found = FALSE; char *b; while ((b = va_arg(args, char *)) != NULL)