9d6fd6ec96984d7ffb645436ab109b03d5b0b151
markd
  Fri Feb 10 23:12:21 2012 -0800
Fixed various GENCODE hgc layout problems RM: 6872
diff --git src/hg/hgc/gencodeClick.c src/hg/hgc/gencodeClick.c
index c8d6260..6520e75 100644
--- src/hg/hgc/gencodeClick.c
+++ src/hg/hgc/gencodeClick.c
@@ -182,247 +182,248 @@
 }
 
 static void writeBasicInfoHtml(struct trackDb *tdb, char *gencodeId, struct genePred *transAnno, struct wgEncodeGencodeAttrs *transAttrs,
                                int geneChromStart, int geneChromEnd,
                                struct wgEncodeGencodeGeneSource *geneSource, struct wgEncodeGencodeTranscriptSource *transcriptSource,
                                bool haveTsl, struct wgEncodeGencodeTranscriptionSupportLevel *tsl)
 /* write basic HTML info for all genes */
 {
 /*
  * notes:
  *   - According to Steve: `status' is not the same for ensembl and havana.  So either avoid displaying it
  *     or display it as `automatic status' or `manual status'.
  */
 
 // basic gene and transcript information
-printf("<table class=\"hgcCcds\"><thead>\n");
+printf("<table class=\"hgcCcds\" style=\"white-space: nowrap;\"><thead>\n");
 printf("<tr><th><th>Transcript<th>Gene</tr>\n");
 printf("</thead><tbody>\n");
 
 printf("<tr><th>Gencode id");
 prTdExtIdAnchor(tdb, transAttrs->transcriptId, "ensemblTranscriptIdUrl");
 prTdExtIdAnchor(tdb, transAttrs->geneId, "ensemblGeneIdUrl");
 printf("</tr>\n");
 
 printf("<tr><th>HAVANA manual id");
 prTdExtIdAnchor(tdb, transAttrs->havanaTranscriptId, "vegaTranscriptIdUrl");
 prTdExtIdAnchor(tdb, transAttrs->havanaGeneId, "vegaGeneIdUrl");
 printf("</tr>\n");
 
-// FIXME: white-space style should be in CCS, but don't want to risk breaking
-// other things.
 printf("<tr><th>Position");
-printf("<td style=\"white-space: nowrap;\">");
+printf("<td>");
 writePosLink(transAnno->chrom, transAnno->txStart, transAnno->txEnd);
-printf("<td style=\"white-space: nowrap;\">");
+printf("<td>");
 writePosLink(transAnno->chrom, geneChromStart, geneChromEnd);
 printf("</tr>\n");
 
 printf("<tr><th>Strand<td>%s<td></tr>\n", transAnno->strand);
 
 printf("<tr><th><a href=\"http://www.gencodegenes.org/gencode_biotypes.html\">Biotype</a><td>%s<td>%s</tr>\n", transAttrs->transcriptType, transAttrs->geneType);
 /* FIXME: add href o */
 printf("<tr><th>Status<td>%s<td>%s</tr>\n", transAttrs->transcriptStatus, transAttrs->geneStatus);
 printf("<tr><th>Annotation Level<td>%s (%d)<td></tr>\n", getLevelDesc(transAttrs->level), transAttrs->level);
 printf("<tr><th>Annotation Method<td>%s<td>%s</tr>\n", getMethodDesc(transcriptSource->source), getMethodDesc(geneSource->source));
 if (haveTsl)
     {
     char *tslDesc = getSupportLevelDesc(tsl);
     printf("<tr><th><a href=\"#tsl\">Transcription Support Level</a><td><a href=\"#%s\">%s</a><td></tr>\n", tslDesc, tslDesc);
     }
 printf("<tr><th>HUGO gene<td colspan=2>%s</tr>\n", transAttrs->geneName);
 printf("<tr><th>CCDS<td>%s<td></tr>\n", transAttrs->ccdsId);
 // FIXME: add sequence here??
 printf("</tbody></table>\n");
 }
 
 static void writeSequenceHtml(struct trackDb *tdb, char *gencodeId, struct genePred *transAnno)
 /* write links to get sequences */
 {
 printf("<table class=\"hgcCcds\"><thead>\n");
 printf("<tr><th colspan=\"2\">Sequences</tr>\n");
 printf("</thead><tbody>\n");
 if (transAnno->cdsStart < transAnno->cdsEnd)
     {
     // protein coding
-    printf("<tr><td>");
+    printf("<tr><td width=\"50%%\">");
     hgcAnchorSomewhere("htcGeneMrna", gencodeId, tdb->table, seqName);
     printf("Predicted mRNA</a>");
-    printf("<td>");
+    printf("<td width=\"50%%\">");
     hgcAnchorSomewhere("htcTranslatedPredMRna", gencodeId, "translate", seqName);
     printf("Predicted protein</a></tr>\n");
     }
 else
     {
     // non-protein coding
-    printf("<tr><td>");
+    printf("<tr><td width=\"50%%\">");
     hgcAnchorSomewhere("htcGeneMrna", gencodeId, tdb->table, seqName);
-    printf("Predicted mRNA</a><td></tr>\n");
+    printf("Predicted mRNA</a><td width=\"50%%\"></tr>\n");
     }
 printf("</tbody></table>\n");
 }
 
 static void writeAnnotationRemarkHtml(struct wgEncodeGencodeAnnotationRemark *remarks)
 /* write HTML links to remarks */
 {
 printf("<table class=\"hgcCcds\"><thead>\n");
 printf("<tr><th colspan=\"1\">Annotation Remarks</tr>\n");
 printf("</thead><tbody>\n");
+// make sure at least one empty row in printed
+if (remarks == NULL)
+    printf("<tr><td></td></tr>\n");
 struct wgEncodeGencodeAnnotationRemark *remark;
 for (remark = remarks; remark != NULL; remark = remark->next)
     {
     char *encRemark = htmlEncode(remark->remark);
     printf("<tr><td>%s</td></tr>\n", encRemark);
     freeMem(encRemark);
     }
 printf("</tbody></table>\n");
 }
 
 static void writePdbLinkHtml(struct wgEncodeGencodePdb *pdbs)
 /* write HTML links to PDB */
 {
 printf("<table class=\"hgcCcds\"><thead>\n");
 printf("<tr><th colspan=\"3\">Protein Data Bank</tr>\n");
 printf("</thead><tbody>\n");
 struct wgEncodeGencodePdb *pdb = pdbs;
 int i, rowCnt = 0;
 while ((pdb != NULL) || (rowCnt == 0))
     {
     printf("<tr>");
     for (i = 0; i < 3; i++)
         {
-        printf("<td>");
+        printf("<td width=\"33.33%%\">");
         if (pdb != NULL)
             {
             printf("<a href=\"http://www.rcsb.org/pdb/cgi/explore.cgi?job=graphics&pdbId=%s\" target=_blank>%s</a>", pdb->pdbId, pdb->pdbId);
             pdb = pdb->next;
             }
         }
     printf("</tr>\n");
     rowCnt++;
     }
 printf("</tbody></table>\n");
 }
 
 static void writePubMedEntry(struct wgEncodeGencodePubMed *pubMed)
 /* write HTML table entry for a pubMed */
 {
-printf("<td><a href=\"");
+printf("<td width=\"33.33%%\"><a href=\"");
 printEntrezPubMedUidUrl(stdout, pubMed->pubMedId);
 printf("\" target=_blank>%d</a>", pubMed->pubMedId);
 }
 
 static void writePubMedLinkHtml(struct wgEncodeGencodePubMed *pubMeds)
 /* write HTML links to PubMed */
 {
 printf("<table class=\"hgcCcds\"><thead>\n");
 printf("<tr><th colspan=\"3\">PubMed</tr>\n");
 printf("</thead><tbody>\n");
 struct wgEncodeGencodePubMed *pubMed = pubMeds;
 int i, rowCnt = 0;
 while ((pubMed != NULL) || (rowCnt == 0))
     {
     printf("<tr>");
     for (i = 0; i < 3; i++)
         {
         if (pubMed != NULL)
             {
             writePubMedEntry(pubMed);
             pubMed = pubMed->next;
             }
         else
-            printf("<td>");
+            printf("<td width=\"33.33%%\">");
         }
     printf("</tr>\n");
     rowCnt++;
     }
 printf("</tbody></table>\n");
 }
 
 static void writeRefSeqEntry(struct wgEncodeGencodeRefSeq *refSeq)
 /* write HTML table entry for a RefSeq */
 {
-printf("<td><a href=\"");
+printf("<td width=\"50%%\"><a href=\"");
 printEntrezNucleotideUrl(stdout, refSeq->rnaAcc);
 printf("\" target=_blank>%s</a>", refSeq->rnaAcc);
-printf("<td>");
+printf("<td width=\"50%%\">");
 if (!isEmpty(refSeq->pepAcc))
     {
     printf("<a href=\"");
     printEntrezProteinUrl(stdout, refSeq->pepAcc);
     printf("\" target=_blank>%s</a>", refSeq->pepAcc);
     }
 }
 
 static void writeRefSeqLinkHtml(struct wgEncodeGencodeRefSeq *refSeqs)
 /* write HTML links to RefSeq */
 {
 printf("<table class=\"hgcCcds\"><thead>\n");
 printf("<tr><th colspan=\"2\">RefSeq</tr>\n");
-printf("<tr><th>RNA<th>Protein</tr>\n");
+printf("<tr class=\"hgcCcdsSub\"><th>RNA<th>Protein</tr>\n");
 printf("</thead><tbody>\n");
 struct wgEncodeGencodeRefSeq *refSeq = refSeqs;
 int rowCnt = 0;
 while ((refSeq != NULL) || (rowCnt == 0))
     {
     printf("<tr>");
     if (refSeq != NULL)
         {
         writeRefSeqEntry(refSeq);
         refSeq = refSeq->next;
         }
     else
-        printf("<td><td>");
+        printf("<td width=\"50%%\"><td width=\"50%%\">");
     printf("</tr>\n");
     rowCnt++;
     }
 printf("</tbody></table>\n");
 }
 
 static void writeUniProtEntry(struct wgEncodeGencodeUniProt *uniProt)
 /* write HTML table entry for a UniProt */
 {
-printf("<td>%s", (uniProt->dataset == wgEncodeGencodeUniProtSwissProt) ? "SwissProt" : "TrEMBL");
-printf("<td><a href=\"");
+printf("<td width=\"15%%\">%s", (uniProt->dataset == wgEncodeGencodeUniProtSwissProt) ? "SwissProt" : "TrEMBL");
+printf("<td width=\"15%%\"><a href=\"");
 printSwissProtAccUrl(stdout, uniProt->acc);
 printf("\" target=_blank>%s</a>", uniProt->acc);
-printf("<td><a href=\"");
+printf("<td width=\"20%%\"><a href=\"");
 printSwissProtAccUrl(stdout, uniProt->name);
 printf("\" target=_blank>%s</a>", uniProt->name);
 }
 
 static void writeUniProtLinkHtml(struct wgEncodeGencodeUniProt *uniProts)
 /* write HTML links to UniProt */
 {
 printf("<table class=\"hgcCcds\"><thead>\n");
 printf("<tr><th colspan=\"6\">UniProt</tr>\n");
-printf("<tr><th>Data set<th>Accession<th>Name<th>Data set<th>Accession<th>Name</tr>\n");
+printf("<tr class=\"hgcCcdsSub\"><th>Data set<th>Accession<th>Name<th>Data set<th>Accession<th>Name</tr>\n");
 printf("</thead><tbody>\n");
 int i, rowCnt = 0;
 struct wgEncodeGencodeUniProt *uniProt = uniProts;
 while ((uniProt != NULL) || (rowCnt == 0))
     {
     printf("<tr>");
     for (i = 0; i < 2; i++)
         {
         if (uniProt != NULL)
             {
             writeUniProtEntry(uniProt);
             uniProt = uniProt->next;
             }
         else
-            printf("<td colspan=3>");
+            printf("<td width=\"50%%\" colspan=3>");
         }
     printf("</tr>\n");
     rowCnt++;
     }
 printf("</tbody></table>\n");
 }
 
 struct supportEvid
 /* temporary struct for subset of supporting information displayed */
 {
     struct supportEvid *next;
     char *seqId;              /* sequence id (memory not owned) */
     char *seqSrc;             /* evidence source database (memory not owned) */
 };
 
@@ -485,93 +486,93 @@
 static struct supportEvid *loadSupportEvid(struct wgEncodeGencodeTranscriptSupport *transcriptSupports,
                                            struct wgEncodeGencodeExonSupport *exonSupports)
 /* load transcript and supporting evidence into a common structure */
 {
 struct supportEvid *supportEvids = NULL;
 transcriptSupportToSupportEvid(&supportEvids, transcriptSupports);
 exonSupportToSupportEvid(&supportEvids, exonSupports);
 sortUniqSupportExidence(&supportEvids);
 return supportEvids;
 }
 
 static void writeSupportExidenceEntry(struct supportEvid *supportEvid)
 /* write HTML table entry  for a supporting evidence */
 {
 // FIXME: should link to sources when possible
-printf("<td>%s", supportEvid->seqSrc);
-printf("<td>%s", supportEvid->seqId);
+printf("<td width=\"25%%\">%s", supportEvid->seqSrc);
+printf("<td width=\"25%%\">%s", supportEvid->seqId);
 }
 
 static void writeSupportingEvidenceLinkHtml(struct wgEncodeGencodeTranscriptSupport *transcriptSupports,
                                             struct wgEncodeGencodeExonSupport *exonSupports)
 /* write HTML links to supporting evidence */
 {
 struct supportEvid *supportEvids = loadSupportEvid(transcriptSupports, exonSupports);
 
 printf("<table class=\"hgcCcds\"><thead>\n");
 printf("<tr><th colspan=\"4\">Supporting Evidence</tr>\n");
-printf("<tr><th>Source<th>Sequence<th>Source<th>Sequence</tr>\n");
+printf("<tr class=\"hgcCcdsSub\"><th>Source<th>Sequence<th>Source<th>Sequence</tr>\n");
 printf("</thead><tbody>\n");
 struct supportEvid *supportEvid = supportEvids;
 int i, rowCnt = 0;
 while ((supportEvid != NULL) || (rowCnt == 0))
     {
     printf("<tr>");
     for (i = 0; i < 2; i++)
         {
         if (supportEvid != NULL)
             {
             writeSupportExidenceEntry(supportEvid);
             supportEvid = supportEvid->next;
             }
         else
-            printf("<td colspan=\"2\">");
+            printf("<td colspan=\"2\" width=\"50%%\">");
         }
     printf("</tr>\n");
     rowCnt++;
     }
 printf("</tbody></table>\n");
 slFreeList(&supportEvids);
 }
 
 static void writeTagEntry(struct wgEncodeGencodeTag *tag)
 /* write HTML table entry for a Tag */
 {
-// FIXME: link to help
-printf("<td>%s", tag->tag);
+// FIXME: link to help once gencodegenes.org has it
+printf("<td width=\"33.33%%\">%s", tag->tag);
 }
 
 static void writeTagLinkHtml(struct wgEncodeGencodeTag *tags)
 /* write HTML links to Tag */
 {
 printf("<table class=\"hgcCcds\"><thead>\n");
 printf("<tr><th colspan=3>Tags</tr>\n");
 printf("</thead><tbody>\n");
 int i, rowCnt = 0;
 struct wgEncodeGencodeTag *tag = tags;
 while ((tag != NULL) || (rowCnt == 0))
     {
     printf("<tr>");
     for (i = 0; i < 3; i++)
         {
         if (tag != NULL)
             {
             writeTagEntry(tag);
             tag = tag->next;
             }
         else
-            printf("<td>");
+            printf("<td width=\"33.33%%\">");
         }
     printf("</tr>\n");
     rowCnt++;
     }
 printf("</tbody></table>\n");
 }
 
 static void doGencodeGeneTrack(struct trackDb *tdb, char *gencodeId, struct sqlConnection *conn, struct genePred *transAnno)
 /* Process click on a GENCODE gene annotation track. */
 {
 struct wgEncodeGencodeAttrs *transAttrs = transAttrsLoad(tdb, conn, gencodeId);
 char *gencodeGeneId = transAttrs->geneId;
 struct wgEncodeGencodeGeneSource *geneSource = metaDataLoad(tdb, conn, gencodeGeneId, "wgEncodeGencodeGeneSource", "geneId", sqlQueryMust|sqlQuerySingle, (sqlLoadFunc)wgEncodeGencodeGeneSourceLoad);
 struct wgEncodeGencodeTranscriptSource *transcriptSource = metaDataLoad(tdb, conn, gencodeId, "wgEncodeGencodeTranscriptSource", "transcriptId", sqlQueryMust|sqlQuerySingle, (sqlLoadFunc)wgEncodeGencodeTranscriptSourceLoad);
 bool haveRemarks = (trackDbSetting(tdb, "wgEncodeGencodeAnnotationRemark") != NULL);