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("\n"); printf("\n"); +printf("\n"); + printf("\n"); printf("\n"); printf("\n", transAttrs->transcriptType, transAttrs->geneType); /* FIXME: add href o */ printf("\n", transAttrs->transcriptStatus, transAttrs->geneStatus); printf("\n", getMethodDesc(transcriptSource->source), getMethodDesc(geneSource->source)); printf("\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);
TranscriptGene
Position"); +printf(""); +writePosLink(transAnno->chrom, transAnno->txStart, transAnno->txEnd); +printf(""); +writePosLink(transAnno->chrom, geneChromStart, geneChromEnd); +printf("
HAVANA manual"); prTdExtIdAnchor(tdb, transAttrs->havanaTranscriptId, "vegaTranscriptIdUrl"); prTdExtIdAnchor(tdb, transAttrs->havanaGeneId, "vegaGeneIdUrl"); printf("
Ensembl automatic"); prTdExtIdAnchor(tdb, transAttrs->transcriptId, "ensemblTranscriptIdUrl"); prTdExtIdAnchor(tdb, transAttrs->geneId, "ensemblGeneIdUrl"); printf("
Biotype%s%s
Status%s%s
Method%s%s
HUGO gene%s