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);