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("%s", 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("
");
prExtIdAnchor(tdb, id, settingName);
}
+static void writePosLink(char *chrom, int chromStart, int chromEnd)
+/* write link to a genomic position */
+{
+printf("%s:%d-%d",
+ 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("\n");
printf(" | Transcript | Gene | \n");
printf("\n");
+printf("Position");
+printf(" | ");
+writePosLink(transAnno->chrom, transAnno->txStart, transAnno->txEnd);
+printf(" | ");
+writePosLink(transAnno->chrom, geneChromStart, geneChromEnd);
+printf(" | \n");
+
printf("HAVANA manual");
prTdExtIdAnchor(tdb, transAttrs->havanaTranscriptId, "vegaTranscriptIdUrl");
prTdExtIdAnchor(tdb, transAttrs->havanaGeneId, "vegaGeneIdUrl");
printf(" | \n");
printf("Ensembl automatic");
prTdExtIdAnchor(tdb, transAttrs->transcriptId, "ensemblTranscriptIdUrl");
prTdExtIdAnchor(tdb, transAttrs->geneId, "ensemblGeneIdUrl");
printf(" | \n");
printf("Biotype | %s | %s | \n", transAttrs->transcriptType, transAttrs->geneType);
/* FIXME: add href o */
printf("Status | %s | %s | \n", transAttrs->transcriptStatus, transAttrs->geneStatus);
printf("Method | %s | %s | \n", getMethodDesc(transcriptSource->source), getMethodDesc(geneSource->source));
printf("HUGO gene | %s | \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(" %s\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);
|