61e5c823d922898c2774dd7de5231b85d61f306f kent Sat Mar 19 10:24:06 2011 -0700 Adding link to antibody page for factor in TFBS details. Adding cell letter abbreviation column. diff --git src/hg/hgc/peakClusters.c src/hg/hgc/peakClusters.c index 3f8eaae..eb1ff69 100644 --- src/hg/hgc/peakClusters.c +++ src/hg/hgc/peakClusters.c @@ -48,36 +48,38 @@ char *val = findGroupTagVal(tdb, tag); if (val == NULL) errAbort("Couldn't find %s in subGroups tag of %s", tag, tdb->track); return val; } char *findGroupLabel(struct trackDb *tdb, char *group) /* Given name of group, ruffle through all subGroupN tags, looking for one that * matches group */ { char *groupId = mustFindGroupTagVal(tdb, group); return compositeGroupLabel(tdb, group, groupId); } static void printClusterTableHeader(struct slName *otherCols, - boolean withDescription, boolean withSignal) + boolean withAbbreviation, boolean withDescription, boolean withSignal) /* Print out header fields table of tracks in cluster */ { webPrintLabelCell("#"); if (withSignal) webPrintLabelCell("signal"); +if (withAbbreviation) + webPrintLabelCell("abr"); struct slName *col; for (col = otherCols; col != NULL; col = col->next) webPrintLabelCell(col->name); if (withDescription) webPrintLabelCell("description"); } static void printTableInfo(struct trackDb *tdb, struct trackDb *clusterTdb, struct slName *displayGroupList) /* Print out info on table. */ { struct slName *displayGroup; for (displayGroup = displayGroupList; displayGroup != NULL; displayGroup = displayGroup->next) { char *label = findGroupLabel(tdb, displayGroup->name); @@ -135,102 +137,107 @@ else { if (peakList) showOnePeakOrMiss(tdb, clusterTdb, peakList, displayGroupList, pRowIx); } sqlFreeResult(&sr); return result; } static void printClusterTableHits(struct bed *cluster, struct sqlConnection *conn, char *sourceTable, char *inputTrackTable, struct slName *fieldList, boolean invert, char *vocab) /* Put out a lines in an html table that shows assayed sources that have hits in this * cluster, or if invert is set, that have misses. */ { +char *vocabFile = NULL; +if (vocab) + vocabFile = cloneFirstWord(vocab); /* Make the monster SQL query to get all assays*/ struct dyString *query = dyStringNew(0); -dyStringPrintf(query, "select %s.id", sourceTable); +dyStringPrintf(query, "select %s.id,%s.name", sourceTable, sourceTable); struct slName *field; for (field = fieldList; field != NULL; field = field->next) dyStringPrintf(query, ",%s.%s", inputTrackTable, field->name); dyStringPrintf(query, " from %s,%s ", inputTrackTable, sourceTable); dyStringPrintf(query, " where %s.source = %s.description", inputTrackTable, sourceTable); dyStringPrintf(query, " and factor='%s' order by %s.source", cluster->name, inputTrackTable); int displayNo = 0; int fieldCount = slCount(fieldList); struct sqlResult *sr = sqlGetResult(conn, query->string); char **row; while ((row = sqlNextRow(sr)) != NULL) { int sourceId = sqlUnsigned(row[0]); double signal = cluster->expScores[sourceId]; boolean hit = (signal > 0); if (hit ^ invert) { printf("</TR><TR>\n"); webPrintIntCell(++displayNo); if (!invert) webPrintDoubleCell(signal); + webPrintLinkCell(row[1]); int i; for (i=0; i<fieldCount; ++i) { - char *fieldVal = row[i+1]; + char *fieldVal = row[i+2]; if (vocab) { - char *file = cloneFirstWord(vocab); - char *link = controlledVocabLink(file, "term", fieldVal, fieldVal, fieldVal, ""); + char *link = controlledVocabLink(vocabFile, "term", + fieldVal, fieldVal, fieldVal, ""); webPrintLinkCell(link); } else webPrintLinkCell(fieldVal); } } } sqlFreeResult(&sr); +freez(&vocabFile); dyStringFree(&query); } static struct slName *findMatchingSubtracks(struct trackDb *tdb) /* Find subtracks that match inputTracks tags. */ { /* Just list look up tableName in inputTrackTable and return the list. */ char *inputTrackTable = trackDbRequiredSetting(tdb, "inputTrackTable"); struct sqlConnection *conn = hAllocConn(database); char query[256]; safef(query, sizeof(query), "select tableName from %s order by source", inputTrackTable); struct slName *matchTrackList = sqlQuickList(conn, query); hFreeConn(&conn); return matchTrackList; } void doPeakClusterListItemsAssayed() /* Put up a page that shows all experiments associated with a cluster track. */ { struct trackDb *clusterTdb = tdbForTableArg(); struct slName *matchTrackList = findMatchingSubtracks(clusterTdb); struct slName *matchTrack; cartWebStart(cart, database, "List of items assayed in %s", clusterTdb->shortLabel); char *inputTracksSubgroupDisplay = trackDbRequiredSetting(clusterTdb, "inputTracksSubgroupDisplay"); struct slName *displayGroupList = stringToSlNames(inputTracksSubgroupDisplay); webPrintLinkTableStart(); -printClusterTableHeader(displayGroupList, TRUE, FALSE); +printClusterTableHeader(displayGroupList, FALSE, TRUE, FALSE); int rowIx = 0; for (matchTrack = matchTrackList; matchTrack != NULL; matchTrack = matchTrack->next) { struct trackDb *tdb = hashFindVal(trackHash, matchTrack->name); showOnePeakOrMiss(tdb, clusterTdb, NULL, displayGroupList, &rowIx); } webPrintLinkTableEnd(); cartWebEnd(); } void doPeakClusters(struct trackDb *tdb, char *item) /* Display detailed info about a cluster of peaks from other tracks. */ { int start = cartInt(cart, "o"); char *table = tdb->table; @@ -257,31 +264,31 @@ char *inputTracksSubgroupDisplay = trackDbRequiredSetting(tdb, "inputTracksSubgroupDisplay"); struct slName *displayGroupList = stringToSlNames(inputTracksSubgroupDisplay); /* Get list of tracks that match criteria. */ struct slName *matchTrackList = findMatchingSubtracks(tdb); struct slName *matchTrack; /* Print out some information about the cluster overall. */ printf("<B>Items in Cluster:</B> %s of %d<BR>\n", cluster->name, slCount(matchTrackList)); printf("<B>Cluster Score (out of 1000):</B> %d<BR>\n", cluster->score); printPos(cluster->chrom, cluster->chromStart, cluster->chromEnd, NULL, TRUE, NULL); /* In a new section put up list of hits. */ webNewSection("List of Items in Cluster"); webPrintLinkTableStart(); - printClusterTableHeader(displayGroupList, TRUE, TRUE); + printClusterTableHeader(displayGroupList, FALSE, TRUE, TRUE); int rowIx = 0; for (matchTrack = matchTrackList; matchTrack != NULL; matchTrack = matchTrack->next) { showMatchingTrack(matchTrack->name, cluster, conn, tdb, displayGroupList, FALSE, &rowIx); } webPrintLinkTableEnd(); } printf("<A HREF=\"%s&g=htcListItemsAssayed&table=%s\" TARGET_blank>", hgcPathAndSettings(), tdb->track); printf("List all items assayed"); printf("</A><BR>\n"); webNewSection("Track Description"); printTrackHtml(tdb); cartWebEnd(); @@ -343,31 +350,38 @@ sr = hRangeQuery(conn, "wgEncodeRegTfbsClusteredMotifs", cluster->chrom, cluster->chromStart, cluster->chromEnd, where, &rowOffset); while ((row = sqlNextRow(sr)) != NULL) { struct bed6FloatScore *hit = NULL; AllocVar(hit); hit->chromStart = sqlUnsigned(row[rowOffset + 1]); hit->chromEnd = sqlUnsigned(row[rowOffset + 2]); hit->score = sqlFloat(row[rowOffset + 4]); hit->strand[0] = row[rowOffset + 5][0]; slAddHead(&hits, hit); } sqlFreeResult(&sr); } - printf("<B>Factor:</B> %s<BR>\n", cluster->name); + char *factorLink = cluster->name; + char *vocab = trackDbSetting(tdb, "controlledVocabulary"); + if (vocab != NULL) + { + char *file = cloneFirstWord(vocab); + factorLink = controlledVocabLink(file, "term", factorLink, factorLink, factorLink, ""); + } + printf("<B>Factor:</B> %s<BR>\n", factorLink); printf("<B>Cluster Score (out of 1000):</B> %d<BR>\n", cluster->score); if(motif != NULL && hits != NULL) { struct bed6FloatScore *hit = NULL; int i; seqs = needMem(sizeof(struct dnaSeq *) * slCount(hits)); for (hit = hits, i = 0; hit != NULL; hit = hit->next, i++) { char query[256]; float maxScore = -1; safef(query, sizeof(query), "select max(score) from %s where name = '%s'", "wgEncodeRegTfbsClusteredMotifs", item); sr = sqlGetResult(conn, query); if ((row = sqlNextRow(sr)) != NULL) { @@ -402,67 +416,67 @@ * cluster->expScores. We need to figure out the sources actually assayed though * some other way. We'll do this by one of two techniques. * If the inputTracksSubgroupDisplay is set, we'll try and figure out what was * assayed by looking at the subgroup stuff in trackDb, which works if everythings * part of a composite. If not, we'll use the inputTrackTable. */ /* Get list of subgroups to display */ char *inputTracksSubgroupDisplay = trackDbSetting(tdb, "inputTracksSubgroupDisplay"); char *inputTableFieldDisplay = trackDbSetting(tdb, "inputTableFieldDisplay"); if (inputTracksSubgroupDisplay != NULL) { struct slName *displayGroupList = stringToSlNames(inputTracksSubgroupDisplay); /* In a new section put up list of hits. */ webNewSection("List of %s Items in Cluster", cluster->name); webPrintLinkTableStart(); - printClusterTableHeader(displayGroupList, TRUE, TRUE); + printClusterTableHeader(displayGroupList, FALSE, TRUE, TRUE); int rowIx = 0; for (matchTrack = matchTrackList; matchTrack != NULL; matchTrack = matchTrack->next) { showMatchingTrack(matchTrack->name, cluster, conn, tdb, displayGroupList, FALSE, &rowIx); } webPrintLinkTableEnd(); webNewSection("List of cells assayed with %s but without hits in cluster", cluster->name); webPrintLinkTableStart(); - printClusterTableHeader(displayGroupList, TRUE, FALSE); + printClusterTableHeader(displayGroupList, FALSE, TRUE, FALSE); rowIx = 0; for (matchTrack = matchTrackList; matchTrack != NULL; matchTrack = matchTrack->next) { showMatchingTrack(matchTrack->name, cluster, conn, tdb, displayGroupList, TRUE, &rowIx); } webPrintLinkTableEnd(); } else if (inputTableFieldDisplay != NULL) { struct slName *fieldList = stringToSlNames(inputTableFieldDisplay); char *vocab = trackDbSetting(tdb, "controlledVocabulary"); /* In a new section put up list of hits. */ webNewSection("List of %s Items in Cluster", cluster->name); webPrintLinkTableStart(); - printClusterTableHeader(fieldList, FALSE, TRUE); + printClusterTableHeader(fieldList, TRUE, FALSE, TRUE); printClusterTableHits(cluster, conn, sourceTable, inputTrackTable, fieldList, FALSE, vocab); webPrintLinkTableEnd(); webNewSection("List of cells assayed with %s but without hits in cluster", cluster->name); webPrintLinkTableStart(); - printClusterTableHeader(fieldList, FALSE, FALSE); + printClusterTableHeader(fieldList, TRUE, FALSE, FALSE); printClusterTableHits(cluster, conn, sourceTable, inputTrackTable, fieldList, TRUE, vocab); webPrintLinkTableEnd(); } else { errAbort("Missing required trackDb setting %s or %s for track %s", "inputTracksSubgroupDisplay", "inputTableFieldDisplay", tdb->track); } webNewSection("Table of abbreviations for cells"); hPrintAbbreviationTable(conn, sourceTable, "Cell Type"); webNewSection("Track Description");