4e5e4b111651337ddd7d36320f1f667d6c035788 kate Tue Jan 28 14:46:42 2014 -0800 1. Bug fix: need section on details page for peak clusters lacking motif. 2. Some code simplification. refs #9092 diff --git src/hg/hgc/peakClusters.c src/hg/hgc/peakClusters.c index 568ef28..e07fdf6 100644 --- src/hg/hgc/peakClusters.c +++ src/hg/hgc/peakClusters.c @@ -414,63 +414,65 @@ 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]); hit->score = sqlFloat(row[rowOffset + 4]); hit->strand[0] = row[rowOffset + 5][0]; slAddHead(&hits, hit); } sqlFreeResult(&sr); } -int hitCount = 0; -if (hits != NULL) +if (hits == NULL) { - hitCount = slCount(hits); + // Maintain table layout + webNewEmptySection(); + return; + } + +int hitCount = 0; if (motifPwmTable != NULL && sqlTableExists(conn, motifPwmTable)) { motif = loadDnaMotif(motifName, motifPwmTable); } - } -if (motif != NULL && hits != NULL) - { struct bed6FloatScore *hit = NULL; int i; seqs = needMem(sizeof(struct dnaSeq *) * slCount(hits)); char posLink[1024]; +hitCount = slCount(hits); + +webNewSection("Canonical Motif in Cluster"); #ifdef SHOW_MAX_SCORE float maxScore = -1; sqlSafef(query, sizeof(query), "select max(score) from %s where name = '%s'", motifTable, motifName); sr = sqlGetResult(conn, query); if ((row = sqlNextRow(sr)) != NULL) { if(!isEmpty(row[0])) { maxScore = sqlFloat(row[0]); } } sqlFreeResult(&sr); #endif - //puts("<p></p>"); - webNewSection("Canonical Motif in Cluster"); for (hit = hits, i = 0; hit != NULL; hit = hit->next, i++) { struct dnaSeq *seq = hDnaFromSeq(database, seqName, hit->chromStart, hit->chromEnd, dnaLower); if(hit->strand[0] == '-') reverseComplement(seq->dna, seq->size); seqs[i] = seq; // TODO: move to hgc.c (with other pos printers) safef(posLink, sizeof(posLink),"<a href=\"%s&db=%s&position=%s%%3A%d-%d\">%s:%d-%d</a>", hgTracksPathAndSettings(), database, cluster->chrom, hit->chromStart+1, hit->chromEnd, cluster->chrom, hit->chromStart+1, hit->chromEnd); printf("<b>Motif Name:</b> %s<br>\n", motifName); printf("<b>Motif Score"); if (hitCount > 1) @@ -483,32 +485,31 @@ printf(":</b> %.2f at %s on <b>%c</font></b> strand<br>", hit->score, posLink, (int)hit->strand[0]); #endif } else { #ifdef SHOW_MAX_SCORE printf(":</b> %.2f (%s max: %.2f)<br>\n", hit->score, cluster->name, maxScore); #else printf(":</b> %.2f<br>\n", hit->score); #endif printf("<b>Motif Position:</b> %s<br>\n", posLink); printf("<b>Motif Strand:</b> %c<br>\n", (int)hit->strand[0]); } } - } -if (seqs != NULL) +if (seqs != NULL && motif != NULL) { motifLogoAndMatrix(seqs, hitCount, motif); } } 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]; sqlSafef(query, sizeof(query), "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d", @@ -548,42 +549,42 @@ * some other way. We'll do this by one of two techniques. */ char *inputTableFieldDisplay = trackDbSetting(tdb, "inputTableFieldDisplay"); if (inputTableFieldDisplay != NULL) { struct slName *fieldList = stringToSlNames(inputTableFieldDisplay); char *vocab = trackDbSetting(tdb, "controlledVocabulary"); /* In a new section put up list of hits. */ webNewSection("Assays for %s in Cluster", cluster->name); webPrintLinkTableStart(); printClusterTableHeader(fieldList, TRUE, FALSE, TRUE); printFactorSourceTableHits(cluster, conn, sourceTable, inputTrackTable, fieldList, FALSE, vocab); webPrintLinkTableEnd(); - webNewSectionHeaderStart(); + webNewSectionHeaderStart(TRUE); char sectionTitle[128]; safef(sectionTitle, sizeof(sectionTitle),"Assays for %s Without Hits in Cluster", cluster->name); jsBeginCollapsibleSectionOldStyle(cart, tdb->track, "cellNoHits", sectionTitle, FALSE); webNewSectionHeaderEnd(); webPrintLinkTableStart(); printClusterTableHeader(fieldList, TRUE, FALSE, FALSE); printFactorSourceTableHits(cluster, conn, sourceTable, inputTrackTable, fieldList, TRUE, vocab); webPrintLinkTableEnd(); jsEndCollapsibleSection(); } else { errAbort("Missing required trackDb setting %s for track %s", "inputTableFieldDisplay", tdb->track); } -webNewSectionHeaderStart(); +webNewSectionHeaderStart(TRUE); jsBeginCollapsibleSectionOldStyle(cart, tdb->track, "cellSources", "Cell Abbreviations", FALSE); webNewSectionHeaderEnd(); hPrintFactorSourceAbbrevTable(conn, tdb); jsEndCollapsibleSection(); doClusterMotifDetails(conn, tdb, cluster); }