e04950cc61a7af322811ef1d50013f21867c4c0b kate Fri Dec 6 16:52:45 2013 -0800 Add mapping table to factorSource track (and peakCluster track details) that links factor (HGNC gene ID) to canonical motif in motif table and PWM. refs #9092 diff --git src/hg/hgc/peakClusters.c src/hg/hgc/peakClusters.c index 3bd307f..b039b30 100644 --- src/hg/hgc/peakClusters.c +++ src/hg/hgc/peakClusters.c @@ -363,64 +363,72 @@ printf("", hgcPathAndSettings(), tdb->track); printf("List all items assayed"); printf("
\n"); webNewSection("Track Description"); printTrackHtml(tdb); hFreeConn(&conn); } void doFactorSource(struct sqlConnection *conn, struct trackDb *tdb, char *item, int start) /* Display detailed info about a cluster of TFBS peaks from other tracks. */ { int rowOffset = hOffsetPastBin(database, seqName, tdb->table); char **row; struct sqlResult *sr; -char query[256]; +char query[256], buf[256]; char *motifTable = trackDbSetting(tdb, "motifTable"); // localizations char *motifPwmTable = trackDbSetting(tdb, "motifPwmTable"); // PWM used to draw sequence logo +char *motifMapTable = trackDbSetting(tdb, "motifMapTable"); // map target to motif sqlSafef(query, sizeof(query), "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d", tdb->table, item, seqName, start); sr = sqlGetResult(conn, query); row = sqlNextRow(sr); struct factorSource *cluster = NULL; if (row != NULL) cluster = factorSourceLoad(row + rowOffset); sqlFreeResult(&sr); if (cluster == NULL) errAbort("Error loading cluster from track %s", tdb->track); char *sourceTable = trackDbRequiredSetting(tdb, "sourceTable"); struct dnaMotif *motif = NULL; struct dnaSeq **seqs = NULL; struct bed6FloatScore *hits = NULL; +char *target = item; if (motifTable != NULL && sqlTableExists(conn, motifTable)) { struct sqlResult *sr; int rowOffset; char where[256]; - if (motifPwmTable != NULL && sqlTableExists(conn, motifPwmTable)) - motif = loadDnaMotif(item, motifPwmTable); + if (motifMapTable != NULL && sqlTableExists(conn, motifMapTable)) + { + sqlSafef(query, sizeof(query), + "select motif from %s where target = '%s'", motifMapTable, item); + // TODO: perhaps sqlQuickString ? + target = sqlQuickQuery(conn, query, buf, sizeof(buf)); + } #define HIGHEST_SCORING #ifdef HIGHEST_SCORING - sqlSafefFrag(where, sizeof(where), "name = '%s' order by score desc", item); + //sqlSafefFrag(where, sizeof(where), "name = '%s' order by score desc", item); + sqlSafefFrag(where, sizeof(where), "name = '%s' order by score asc", target); #else sqlSafefFrag(where, sizeof(where), "name = '%s'", item); #endif sr = hRangeQuery(conn, motifTable, cluster->chrom, cluster->chromStart, cluster->chromEnd, where, &rowOffset); #ifdef HIGHEST_SCORING if ((row = sqlNextRow(sr)) != NULL) #else while ((row = sqlNextRow(sr)) != NULL) #endif { struct bed6FloatScore *hit = NULL; AllocVar(hit); hit->chromStart = sqlUnsigned(row[rowOffset + 1]); hit->chromEnd = sqlUnsigned(row[rowOffset + 2]); @@ -432,40 +440,48 @@ } char *factorLink = cluster->name; char *vocab = trackDbSetting(tdb, "controlledVocabulary"); if (vocab != NULL) { char *file = cloneFirstWord(vocab); factorLink = controlledVocabLink(file, "term", factorLink, factorLink, factorLink, ""); } printf("Factor: %s
\n", factorLink); printf("Cluster Score (out of 1000): %d
\n", cluster->score); printPos(cluster->chrom, cluster->chromStart, cluster->chromEnd, NULL, TRUE, NULL); int hitCount = 0; if (hits != NULL) + { hitCount = slCount(hits); + if (motifPwmTable != NULL && sqlTableExists(conn, motifPwmTable)) + { + motif = loadDnaMotif(target, motifPwmTable); + } + } if (motif != NULL && hits != NULL) { struct bed6FloatScore *hit = NULL; int i; seqs = needMem(sizeof(struct dnaSeq *) * slCount(hits)); char posLink[1024]; char query[256]; float maxScore = -1; + + sqlSafef(query, sizeof(query), "select max(score) from %s where name = '%s'", motifTable, item); sr = sqlGetResult(conn, query); if ((row = sqlNextRow(sr)) != NULL) { if(!isEmpty(row[0])) { maxScore = sqlFloat(row[0]); } } sqlFreeResult(&sr); puts("

"); for (hit = hits, i = 0; hit != NULL; hit = hit->next, i++) {