6031d05b102c1cb34c9e8394a8acf5809a8eca8f
angie
  Mon Jan 31 16:19:37 2011 -0800
Track #34 (dbVar for human): Added new track type gvf with basichandlers in hgTracks and hgc.  dbVar's GVF attributes are recognized,
esp. var_type is used to color items, and items are sorted using
the Parent keyword so that parents appear immediately before their
children, and children are sorted by var_type.  Attributes are
displayed in hgc; need to do a bit better for the Start_range and
End_range (e.g. translate "." to "inner start unknown" etc.).

diff --git src/hg/hgc/gvfClick.c src/hg/hgc/gvfClick.c
new file mode 100644
index 0000000..a402512
--- /dev/null
+++ src/hg/hgc/gvfClick.c
@@ -0,0 +1,55 @@
+/* gvfClick - handler for variants from GVF (http://www.sequenceontology.org/gvf.html) */
+
+#include "common.h"
+#include "htmshell.h"
+#include "hgc.h"
+#include "bed8Attrs.h"
+
+void doGvf(struct trackDb *tdb, char *item)
+/* Show details for variants represented as GVF, stored in a bed8Attrs table */
+{
+struct sqlConnection *conn = hAllocConn(database);
+int start = cartInt(cart, "o");
+char query[1024];
+safef(query, sizeof(query),
+      "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d",
+      tdb->table, item, seqName, start);
+struct sqlResult *sr = sqlGetResult(conn, query);
+char **row;
+if ((row = sqlNextRow(sr)) == NULL)
+    errAbort("doGvfDetails: can't find item '%s' in %s at %s:%d", item, database, seqName, start);
+int rowOffset = hOffsetPastBin(database, seqName, tdb->table);
+struct bed8Attrs *ba = bed8AttrsLoad(row+rowOffset);
+bedPrintPos((struct bed *)ba, 6, tdb);
+int i = 0;
+for (i = 0;  i < ba->attrCount;  i++)
+    {
+    // The ID is the bed8Attrs name and has already been displayed:
+    if (sameString(ba->attrTags[i], "ID"))
+	continue;
+    cgiDecode(ba->attrVals[i], ba->attrVals[i], strlen(ba->attrVals[i]));
+    char *tag = ba->attrTags[i];
+    // User-defined keywords used in dbVar's GVF:
+    if (sameString(tag, "var_type"))
+	tag = "Variant type";
+    else if (sameString(tag, "clinical_int"))
+	tag = "Clinical interpretation";
+    else if (islower(tag[0]))
+	tag[0] = toupper(tag[0]);
+    // GVF standard Start_range and End_range tags:
+//    if (sameString(tag, "Start_range"))
+	{
+	}
+//    else if (sameString(tag, "End_range"))
+	{
+	}
+//    else
+	{
+	subChar(tag, '_', ' ');
+	printf("<B>%s</B>: %s<BR>\n", tag, htmlEncode(ba->attrVals[i]));
+	}
+    }
+sqlFreeResult(&sr);
+hFreeConn(&conn);
+/* printTrackHtml is done in genericClickHandlerPlus. */
+}