4c9ae67ea6e03ec3069cea012398793046e9ff2a
giardine
Tue Sep 21 15:00:29 2010 -0700
Adds new track type bedDetail to custom and resident tracks, also adds pgSnp (personal genome SNPs) as custom track type. bedDetail is bed4 to bed12, with 2 extra fields for an ID and description for hgc clicks.
diff --git src/hg/hgc/hgc.c src/hg/hgc/hgc.c
index 222bbc1..c7df13c 100644
--- src/hg/hgc/hgc.c
+++ src/hg/hgc/hgc.c
@@ -204,6 +204,7 @@
#include "pgPhenoAssoc.h"
#include "pgSiftPred.h"
#include "pgPolyphenPred.h"
+#include "bedDetail.h"
#include "ec.h"
#include "transMapClick.h"
#include "retroClick.h"
@@ -3700,6 +3701,11 @@
{
doAltGraphXDetails(tdb,item);
}
+ //add bedDetail here
+ else if (startsWith("bedDetail", type))
+ {
+ doBedDetail(tdb, NULL, item);
+ }
#ifdef USE_BAM
else if (sameString(type, "bam"))
doBamDetails(tdb, item);
@@ -4387,31 +4393,38 @@
hti->isSplit = FALSE;
hti->hasBin = FALSE;
hti->type = cloneString(ct->tdb->type);
-if (ct->fieldCount >= 3)
+int fieldCount = 3;
+if (sameWord(ct->dbTrackType, "bedDetail"))
+ fieldCount = ct->fieldCount - 2;
+else if (sameWord(ct->dbTrackType, "pgSnp"))
+ fieldCount = 4;
+else
+ fieldCount = ct->fieldCount;
+if (fieldCount >= 3)
{
strncpy(hti->chromField, "chrom", 32);
strncpy(hti->startField, "chromStart", 32);
strncpy(hti->endField, "chromEnd", 32);
}
-if (ct->fieldCount >= 4)
+if (fieldCount >= 4)
{
strncpy(hti->nameField, "name", 32);
}
-if (ct->fieldCount >= 5)
+if (fieldCount >= 5)
{
strncpy(hti->scoreField, "score", 32);
}
-if (ct->fieldCount >= 6)
+if (fieldCount >= 6)
{
strncpy(hti->strandField, "strand", 32);
}
-if (ct->fieldCount >= 8)
+if (fieldCount >= 8)
{
strncpy(hti->cdsStartField, "thickStart", 32);
strncpy(hti->cdsEndField, "thickEnd", 32);
hti->hasCDS = TRUE;
}
-if (ct->fieldCount >= 12)
+if (fieldCount >= 12)
{
strncpy(hti->countField, "blockCount", 32);
strncpy(hti->startsField, "chromStarts", 32);
@@ -18614,6 +18627,14 @@
hFreeConn(&conn2);
hFreeConn(&conn);
}
+else if (ct->dbTrack && sameWord(type, "bedDetail"))
+ {
+ doBedDetail(ct->tdb, ct, itemName);
+ }
+else if (ct->dbTrack && sameWord(type, "pgSnp"))
+ {
+ doPgSnp(ct->tdb, itemName, ct);
+ }
else
{
if (ct->dbTrack)
@@ -21519,15 +21540,26 @@
hFreeConn(&conn);
}
-void doPgSnp(struct trackDb *tdb, char *itemName)
+void doPgSnp(struct trackDb *tdb, char *itemName, struct customTrack *ct)
/* print detail page for personal genome track (pgSnp) */
{
-char *table = tdb->table;
+char *table;
+struct sqlConnection *conn;
char *escName = sqlEscapeString(itemName);
-struct sqlConnection *conn = hAllocConn(database);
struct sqlResult *sr;
char **row;
char query[256];
+if (ct == NULL)
+ {
+ table = tdb->table;
+ conn = hAllocConn(database);
+ }
+else
+ {
+ table = ct->dbTableName;
+ conn = hAllocConn(CUSTOM_TRASH);
+ //ct->tdb
+ }
genericHeader(tdb, itemName);
@@ -21580,6 +21612,31 @@
hFreeConn(&conn);
}
+void doPgPhenoAssoc(struct trackDb *tdb, char *itemName)
+{
+char *table = tdb->table;
+struct pgPhenoAssoc *pheno = NULL;
+struct sqlConnection *conn = hAllocConn(database);
+struct sqlResult *sr;
+char **row;
+struct dyString *query = dyStringNew(512);
+int start = cartInt(cart, "o");
+
+genericHeader(tdb, itemName);
+
+dyStringPrintf(query, "select * from %s where chrom = '%s' and ",
+ table, seqName);
+dyStringPrintf(query, "name = '%s' and chromStart = %d", itemName, start);
+sr = sqlGetResult(conn, query->string);
+while ((row = sqlNextRow(sr)) != NULL)
+ {
+ pheno = pgPhenoAssocLoad(row);
+ bedPrintPos((struct bed *)pheno, 4, tdb);
+ printf("Personal Genome phenotype: link to phenotype source
\n", pheno->srcUrl);
+ }
+printTrackHtml(tdb);
+}
+
void doAllenBrain(struct trackDb *tdb, char *itemName)
/* Put up page for Allen Brain Atlas. */
{
@@ -22268,6 +22325,65 @@
printTrackHtml(tdb);
}
+void doBedDetail(struct trackDb *tdb, struct customTrack *ct, char *itemName)
+/* generate the detail page for a custom track of bedDetail type */
+{
+char *table;
+struct bedDetail *r = NULL;
+struct sqlConnection *conn;
+struct sqlResult *sr;
+char **row;
+char query[256];
+char *chrom = cartString(cart,"c"); /* don't assume name is unique */
+int start = cgiInt("o");
+int end = cgiInt("t");
+int bedPart = 4;
+char *escName = NULL;
+if (ct == NULL)
+ {
+ char *words[3];
+ int cnt = chopLine(cloneString(tdb->type), words);
+ if (cnt > 1)
+ bedPart = atoi(words[1]) - 2;
+ table = tdb->table;
+ conn = hAllocConn(database);
+ genericHeader(tdb, itemName);
+ }
+else
+ {
+ table = ct->dbTableName;
+ conn = hAllocConn(CUSTOM_TRASH);
+ bedPart = ct->fieldCount - 2;
+ /* header handled by custom track handler */
+ }
+
+/* postion, band, genomic size */
+escName = sqlEscapeString(itemName);
+safef(query, sizeof(query),
+ "select * from %s where chrom = '%s' and chromStart = %d and chromEnd = %d and name = '%s'", table, chrom, start, end, escName);
+sr = sqlGetResult(conn, query);
+if ((row = sqlNextRow(sr)) != NULL)
+ {
+ r = bedDetailLoadWithGaps(row, bedPart+2);
+ bedPrintPos((struct bed*)r, bedPart, tdb);
+ //print bedPart using bed routines?
+ //printf("Name: %s
\n", r->name);
+ //print ID as link if have url
+ if (r->id != NULL)
+ {
+ printf("ID: %s
\n", r->id);
+ printCustomUrl(tdb, r->id, TRUE);
+ }
+ //printf("Position: %s:%u-%u
", r->chrom, *(r->chromStart)+1, *(r->chromEnd));
+ if (r->description != NULL)
+ printf("%s
\n", r->description);
+ }
+sqlFreeResult(&sr);
+
+bedDetailFree(&r);
+freeMem(escName);
+hFreeConn(&conn);
+}
struct trackDb *tdbForTableArg()
/* get trackDb for track passed in table arg */
@@ -23474,7 +23590,12 @@
sameString("pgSaqqaqHc", table) ||
sameString("pgTest", table) )
{
- doPgSnp(tdb, item);
+ doPgSnp(tdb, item, NULL);
+ }
+else if (startsWith("pg", table) &&
+ (endsWith(table, "PhenCode") || endsWith(table, "Snpedia") || endsWith(table, "Hgmd")) )
+ {
+ doPgPhenoAssoc(tdb, item);
}
else if (sameString("gvPos", table))
{
@@ -23558,6 +23679,10 @@
{
doT2gDetails(tdb, item);
}
+else if (tdb != NULL && startsWith("bedDetail", tdb->type))
+ {
+ doBedDetail(tdb, NULL, item);
+ }
else if (startsWith("numtS", table))
// && (!sameString("numtSAssembled", table)))
{