be36d4231ece7f4965353cc47c5b5fa57a53aea3
markd
  Fri Jul 1 01:08:43 2011 -0700
include transcript and sequence positions and browser links in details page
diff --git src/hg/hgc/gencodeClick.c src/hg/hgc/gencodeClick.c
index 5c7281d..4f02f1f 100644
--- src/hg/hgc/gencodeClick.c
+++ src/hg/hgc/gencodeClick.c
@@ -43,45 +43,65 @@
 {
 const struct genePred *a = *((struct genePred **)va);
 const struct genePred *b = *((struct genePred **)vb);
 if (sameString(a->name, seqName))
     return -1;
 else if (sameString(b->name, seqName))
     return 1;
 else
     return strcmp(a->name, b->name);
 }
 
 static struct genePred *transAnnoLoad(struct sqlConnection *conn, struct trackDb *tdb, char *gencodeId)
 /* load the gencode annotations and sort the one corresponding to the one that was clicked on is
  * first.  Should only have one or two. */
 {
+// must check chrom due to PAR
 char where[256];
-safef(where, sizeof(where), "name=\"%s\"", gencodeId);
+safef(where, sizeof(where), "(chrom = \"%s\") and (name = \"%s\")", seqName, gencodeId);
 struct genePred *transAnno = genePredReaderLoadQuery(conn, tdb->track, where);
 slSort(&transAnno, transAnnoCmp);
 return transAnno;
 }
 
 static struct wgEncodeGencodeAttrs *transAttrsLoad(struct trackDb *tdb, struct sqlConnection *conn, char *gencodeId)
 /* load the gencode class information */
 {
 return sqlQueryObjs(conn, (sqlLoadFunc)wgEncodeGencodeAttrsLoad, sqlQuerySingle|sqlQueryMust,
                     "select * from %s where transcriptId = \"%s\"",
                     getGencodeTable(tdb, "wgEncodeGencodeAttrs"), gencodeId);
 }
 
+static void getGeneBounds(struct trackDb *tdb, struct sqlConnection *conn, struct genePred *transAnno,
+                          int *geneChromStart, int *geneChromEnd)
+/* find bounds for the gene */
+{
+// must check chrom due to PAR
+char where[256];
+safef(where, sizeof(where), "(chrom = \"%s\") and (name2 = \"%s\")", seqName, transAnno->name2);
+struct genePred *geneAnnos = genePredReaderLoadQuery(conn, tdb->track, where);
+struct genePred *geneAnno;
+*geneChromStart = transAnno->txStart;
+*geneChromEnd = transAnno->txEnd;
+for (geneAnno = geneAnnos; geneAnno != NULL; geneAnno = geneAnno->next)
+    {
+    *geneChromStart = min(*geneChromStart, geneAnno->txStart);
+    *geneChromEnd = max(*geneChromEnd, transAnno->txEnd);
+    }
+genePredFreeList(&geneAnnos);
+}
+
 static void *metaDataLoad(struct trackDb *tdb, struct sqlConnection *conn, char *gencodeId, char *tableBase, char *keyCol, unsigned queryOpts, sqlLoadFunc loadFunc)
 /* load autoSql objects for gencode meta data. */
 {
 return sqlQueryObjs(conn, loadFunc, queryOpts, "select * from %s where %s = \"%s\"",
                     getGencodeTable(tdb, tableBase), keyCol, gencodeId);
 }
 
 static int uniProtDatasetCmp(const void *va, const void *vb)
 /* Compare wgEncodeGencodeUniProt by dateset */
 {
 const struct wgEncodeGencodeUniProt *a = *((struct wgEncodeGencodeUniProt **)va);
 const struct wgEncodeGencodeUniProt *b = *((struct wgEncodeGencodeUniProt **)vb);
 return a->dataset - b->dataset;
 }
 
@@ -111,45 +131,61 @@
 static void prExtIdAnchor(struct trackDb *tdb,  char *id, char *settingName)
 /* if an id to an external database is not empty, print an HTML anchor to it */
 {
 char urlBuf[urlBufSize];
 if (!isEmpty(id))
     printf("<a href=\"%s\" target=_blank>%s</a>", mkExtIdUrl(tdb, id, settingName, urlBuf), id);
 }
 
 static void prTdExtIdAnchor(struct trackDb *tdb,  char *id, char *settingName)
 /* print a table data element with an anchor for a id */
 {
 printf("<td>");
 prExtIdAnchor(tdb, id, settingName);
 }
 
+static void writePosLink(char *chrom, int chromStart, int chromEnd)
+/* write link to a genomic position */
+{
+printf("<a href=\"%s&db=%s&position=%s%%3A%d-%d\" target=_blank>%s:%d-%d</A>",
+       hgTracksPathAndSettings(), database,
+       chrom, chromStart, chromEnd, chrom, chromStart+1, chromEnd);
+}
+
 static void writeBasicInfoHtml(struct trackDb *tdb, char *gencodeId, struct genePred *transAnno, struct wgEncodeGencodeAttrs *transAttrs,
+                               int geneChromStart, int geneChromEnd,
                                struct wgEncodeGencodeGeneSource *geneSource, struct wgEncodeGencodeTranscriptSource *transcriptSource)
 /* 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("<tr><th><th>Transcript<th>Gene</tr>\n");
 printf("</thead><tbody>\n");
 
+printf("<tr><th>Position");
+printf("<td>");
+writePosLink(transAnno->chrom, transAnno->txStart, transAnno->txEnd);
+printf("<td>");
+writePosLink(transAnno->chrom, geneChromStart, geneChromEnd);
+printf("</tr>\n");
+
 printf("<tr><th>HAVANA manual");
 prTdExtIdAnchor(tdb, transAttrs->havanaTranscriptId, "vegaTranscriptIdUrl");
 prTdExtIdAnchor(tdb, transAttrs->havanaGeneId, "vegaGeneIdUrl");
 printf("</tr>\n");
 
 printf("<tr><th>Ensembl automatic");
 prTdExtIdAnchor(tdb, transAttrs->transcriptId, "ensemblTranscriptIdUrl");
 prTdExtIdAnchor(tdb, transAttrs->geneId, "ensemblGeneIdUrl");
 printf("</tr>\n");
 
 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>Method<td>%s<td>%s</tr>\n", getMethodDesc(transcriptSource->source), getMethodDesc(geneSource->source));
 printf("<tr><th>HUGO gene<td colspan=2>%s</tr>\n", transAttrs->geneName);
@@ -451,41 +487,44 @@
 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);
 struct wgEncodeGencodePdb *pdbs = metaDataLoad(tdb, conn, gencodeId, "wgEncodeGencodePdb", "transcriptId", sqlQueryMulti, (sqlLoadFunc)wgEncodeGencodePdbLoad);
 struct wgEncodeGencodePubMed *pubMeds = metaDataLoad(tdb, conn, gencodeId, "wgEncodeGencodePubMed", "transcriptId", sqlQueryMulti, (sqlLoadFunc)wgEncodeGencodePubMedLoad);
 struct wgEncodeGencodeRefSeq *refSeqs = metaDataLoad(tdb, conn, gencodeId, "wgEncodeGencodeRefSeq", "transcriptId", sqlQueryMulti, (sqlLoadFunc)wgEncodeGencodeRefSeqLoad);
 struct wgEncodeGencodeTag *tags = metaDataLoad(tdb, conn, gencodeId, "wgEncodeGencodeTag", "transcriptId", sqlQueryMulti, (sqlLoadFunc)wgEncodeGencodeTagLoad);
 struct wgEncodeGencodeTranscriptSupport *transcriptSupports = metaDataLoad(tdb, conn, gencodeId, "wgEncodeGencodeTranscriptSupport", "transcriptId", sqlQueryMulti, (sqlLoadFunc)wgEncodeGencodeTranscriptSupportLoad);
 struct wgEncodeGencodeExonSupport *exonSupports = metaDataLoad(tdb, conn, gencodeId, "wgEncodeGencodeExonSupport", "transcriptId", sqlQueryMulti, (sqlLoadFunc)wgEncodeGencodeExonSupportLoad);
 struct wgEncodeGencodeUniProt *uniProts = metaDataLoad(tdb, conn, gencodeId, "wgEncodeGencodeUniProt", "transcriptId", sqlQueryMulti, (sqlLoadFunc)wgEncodeGencodeUniProtLoad);
 slSort(&uniProts, uniProtDatasetCmp);
+int geneChromStart, geneChromEnd;
+getGeneBounds(tdb, conn, transAnno, &geneChromStart, &geneChromEnd);
+
 char *title = "GENCODE Transcript Annotation";
 char header[256];
 safef(header, sizeof(header), "%s %s", title, gencodeId);
 if (!isEmpty(transAttrs->geneName))
     safef(header, sizeof(header), "%s %s (%s)", title, gencodeId, transAttrs->geneName);
 else
     safef(header, sizeof(header), "%s %s", title, gencodeId);
 cartWebStart(cart, database, "%s", header);
 printf("<H2> %s</H2>\n", header);
 
-writeBasicInfoHtml(tdb, gencodeId, transAnno, transAttrs, geneSource, transcriptSource);
+writeBasicInfoHtml(tdb, gencodeId, transAnno, transAttrs, geneChromStart, geneChromEnd, geneSource, transcriptSource);
 /* FIXME: sequence links */
 writePdbLinkHtml(pdbs);
 writePubMedLinkHtml(pubMeds);
 writeRefSeqLinkHtml(refSeqs);
 writeUniProtLinkHtml(uniProts);
 writeSupportingEvidenceLinkHtml(transcriptSupports, exonSupports);
 writeTagLinkHtml(tags);
 wgEncodeGencodeAttrsFree(&transAttrs);
 wgEncodeGencodeGeneSourceFreeList(&geneSource);
 wgEncodeGencodeTranscriptSourceFreeList(&transcriptSource);
 wgEncodeGencodePdbFreeList(&pdbs);
 wgEncodeGencodePubMedFreeList(&pubMeds);
 wgEncodeGencodeRefSeqFreeList(&refSeqs);
 wgEncodeGencodeTranscriptSupportFreeList(&transcriptSupports);
 wgEncodeGencodeExonSupportFreeList(&exonSupports);