0952cf02dd761d0eae415da7af3914c2b88852af
fanhsu
  Thu Jul 21 14:11:05 2011 -0700
Added functions for COSMIC and updated functions for OMIM.
diff --git src/hg/hgTracks/simpleTracks.c src/hg/hgTracks/simpleTracks.c
index 6dd87f2..6fe09b4 100644
--- src/hg/hgTracks/simpleTracks.c
+++ src/hg/hgTracks/simpleTracks.c
@@ -10842,71 +10842,78 @@
 if (isNotEmpty(ret))
     dyStringAppend(dy, ret);
 
 safef(query,sizeof(query),
         "select distinct description from omimPhenotype, omimGene2 where name='%s' and name=cast(omimId as char) order by description", name);
 char *disorders = collapseRowsFromQuery(query, "; ", 20);
 if (isNotEmpty(disorders))
     {
     dyStringAppend(dy, "; disorder(s): ");
     dyStringAppend(dy, disorders);
     }
 hFreeConn(&conn);
 return(dy->string);
 }
 
+// old name to be changed later
+#define omimPhenotypeClassColName "phenotypeClass"
+// new name to be used later
+//#define omimPhenotypeClassColName "omimPhenoMapKey"
+
 boolean isOmimOtherClass(char *omimId)
 /* check if this omimId belongs to the "Others" phenotype class */
 
 /* NOTE: The definition of Others class is kind of tricky.
 
    The Other class is defined as:
 
 	1. does not have class 1 or 2 or 3, or 4; some may have class '-1'.
 	2. for an entry of omimId that the omimPhenotype table does not even have a row with omimId
 */
 {
 boolean result;
 char answer[255];
 struct sqlConnection *conn = hAllocConn(database);
 char query[256];
 safef(query,sizeof(query),
-      "select phenotypeClass from omimPhenotype where omimId =%s and (phenotypeClass=1 or phenotypeClass=2 or phenotypeClass=3 or phenotypeClass=4)", omimId);
+      "select %s from omimPhenotype where omimId =%s and (%s=1 or %s=2 or %s=3 or %s=4)", 
+      omimPhenotypeClassColName, omimId, omimPhenotypeClassColName, omimPhenotypeClassColName, omimPhenotypeClassColName, 
+      omimPhenotypeClassColName);
 char *ret = sqlQuickQuery(conn, query, answer, sizeof(answer));
 
 if (ret == NULL)
     {
     result = TRUE;
     }
 else
     {
     result = FALSE;
     }
 hFreeConn(&conn);
 return(result);
 }
 
 int hasOmimPhenotypeClass(char *omimId, int targetClass)
 /* Look up phenotypeClass for omimId, for filtering items.  Don't free result! */
 {
 int result;
 char answer[255];
 struct sqlConnection *conn = hAllocConn(database);
 char query[256];
 safef(query,sizeof(query),
-      "select phenotypeClass from omimPhenotype where omimId =%s and phenotypeClass=%d", omimId, 
-      targetClass);
+      "select %s from omimPhenotype where omimId =%s and %s=%d", omimPhenotypeClassColName,omimId,omimPhenotypeClassColName,targetClass);
+
 char *ret = sqlQuickQuery(conn, query, answer, sizeof(answer));
 
 if (ret == NULL)
     {
     if (targetClass == -1)
     	{
 	result = -1;
 	}
     else
     	{
     	result = 0;
 	}
     }
 else
     result = targetClass;
@@ -11040,31 +11047,33 @@
 
 lightest.r = (1*normal->r + 2*255) / 3;
 lightest.g = (1*normal->g + 2*255) / 3;
 lightest.b = (1*normal->b + 2*255) / 3;
 
 
 struct sqlConnection *conn = hAllocConn(database);
 
 class1Clr = hvGfxFindColorIx(hvg, lightest.r, lightest.g, lightest.b);
 class2Clr = hvGfxFindColorIx(hvg, lighter.r, lighter.g, lighter.b);
 class3Clr = hvGfxFindColorIx(hvg, normal->r, normal->g, normal->b);
 class4Clr = hvGfxFindColorIx(hvg, 105,50,155);
 classOtherClr = hvGfxFindColorIx(hvg, 190, 190, 190);	// light gray
 
 safef(query, sizeof(query),
-      "select omimId, phenotypeClass from omimPhenotype where omimId=%s order by phenotypeClass desc", el->name);
+      "select omimId, %s from omimPhenotype where omimId=%s order by %s desc", 
+      omimPhenotypeClassColName, el->name, omimPhenotypeClassColName);
+
 sr = sqlMustGetResult(conn, query);
 row = sqlNextRow(sr);
 
 hFreeConn(&conn);
 
 if (row == NULL)
     {
     // set to gray if this entry does not have any disorder info
     sqlFreeResult(&sr);
     return classOtherClr;
     }
 else
     {
     omimId    = row[0];
     phenClass = row[1];
@@ -11144,43 +11153,143 @@
     {
     omimId = strdup(el->name);
     if (omimId != NULL)
         {
         dyStringAppend(name, omimId);
         }
     labelStarted = TRUE;
     }
 
 if (useGeneSymbol)
     {
     if (labelStarted) 
     	dyStringAppendC(name, '/');
     else 
     	labelStarted = TRUE;
-    // get gene symbol(s) from omimGeneMap table.
-    // Note: some entries are not in omimGeneMap and/or does not have gene symbol(s)
+    // get appoved gene symbol from omim2gene table first, if not available then get it from omimGeneMap table.
     char query[256];
+    safef(query, sizeof(query), "select approvedGeneSymbol from omim2gene where omimId = %s", el->name);
+    geneSymbol = sqlQuickString(conn, query);
+    if (geneSymbol && differentString(geneSymbol, "-"))
+        dyStringAppend(name, geneSymbol);
+    else
+    	{
+	char *chp;
     safef(query, sizeof(query), "select geneSymbol from omimGeneMap where omimId = %s", el->name);
     geneSymbol = sqlQuickString(conn, query);
     if (geneSymbol && differentString(geneSymbol, "0"))
+            {
+	    // pick the first one, if multiple gene symbols exist
+    	    chp = strstr(geneSymbol, ",");
+	    if (chp != NULL) *chp = '\0';
         dyStringAppend(name, geneSymbol);
     }
+	}
+    }
 
 hFreeConn(&conn);
 return(name->string);
 }
 
+static char *cosmicTissueList(char *name)
+/* Return list of tumor tissues associated with a COSMIC entry.  Do not free result! */
+{
+static struct dyString *dy = NULL;
+struct sqlConnection *conn = hAllocConn(database);
+
+if (dy == NULL)
+    dy = dyStringNew(0);
+dyStringClear(dy);
+
+char query[256];
+safef(query,sizeof(query),
+        "select concat(gene_name,' ',mut_syntax_aa) from cosmicRaw where cosmic_mutation_id ='%s'", name);
+char buf[256];
+char *ret = sqlQuickQuery(conn, query, buf, sizeof(buf));
+
+if (isNotEmpty(ret))
+    dyStringAppend(dy, ret);
+
+safef(query, sizeof(query), 
+      "select sum(mutated_samples) from cosmicRaw where cosmic_mutation_id='%s'",
+      name);
+ret = sqlQuickQuery(conn, query, buf, sizeof(buf));
+if (isNotEmpty(ret))
+    {
+    dyStringAppend(dy, " ");
+    dyStringAppend(dy, ret);
+    }
+
+safef(query, sizeof(query), 
+      "select sum(examined_samples) from cosmicRaw where cosmic_mutation_id='%s'",
+      name);
+ret = sqlQuickQuery(conn, query, buf, sizeof(buf));
+    {
+    dyStringAppend(dy, "/");
+    dyStringAppend(dy, ret);
+    }
+
+safef(query, sizeof(query), 
+      "select sum(mutated_samples)*100/sum(examined_samples) from cosmicRaw where cosmic_mutation_id='%s'",
+      name);
+ret = sqlQuickQuery(conn, query, buf, sizeof(buf));
+
+char *chp = strstr(ret, ".");
+
+if (isNotEmpty(ret))
+    {
+    // cut off digits after .xxx
+    if ((chp != NULL) && (strlen(chp) > 3))
+    	{
+    	chp++;
+    	chp++;
+    	chp++;
+    	chp++;
+    	*chp = '\0';
+    	}
+    dyStringAppend(dy, " (");
+    dyStringAppend(dy, ret);
+    dyStringAppend(dy, "\%)");
+    }
+
+safef(query,sizeof(query),
+        "select tumour_site from cosmicRaw where cosmic_mutation_id ='%s' order by tumour_site", name);
+char *disorders = collapseRowsFromQuery(query, ",", 4);
+if (isNotEmpty(disorders))
+    {
+    dyStringAppend(dy, " ");
+    dyStringAppend(dy, disorders);
+    }
+hFreeConn(&conn);
+return(dy->string);
+}
+
+static void cosmicLoad(struct track *tg)
+/* Load COSMIC items, storing long label from cosmicTissueList */
+{
+bedPlusLabelLoad(tg, cosmicTissueList);
+}
+
+void cosmicMethods (struct track *tg)
+/* Methods for COSMIC track. */
+{
+tg->loadItems	  = cosmicLoad;
+tg->drawItemAt    = bedPlusLabelDrawAt;
+tg->mapItem       = bedPlusLabelMapItem;
+tg->nextPrevExon  = simpleBedNextPrevEdge;
+}
+
 void omimGene2Methods (struct track *tg)
 /* Methods for version 2 of OMIM Genes track. */
 {
 tg->loadItems	  = omimGene2Load;
 tg->itemColor 	  = omimGene2Color;
 tg->itemName	  = omimGene2Name;
 tg->itemNameColor = omimGene2Color;
 tg->drawItemAt    = bedPlusLabelDrawAt;
 tg->mapItem       = bedPlusLabelMapItem;
 tg->nextPrevExon = simpleBedNextPrevEdge;
 }
 
 static char *omimAvSnpAaReplacement(char *name)
 /* Return replacement string associated with a OMIM AV (Allelic Variant) entry */
 {
@@ -11276,31 +11385,31 @@
 lighter.b = (6*normal->b + 4*255) / 10;
 
 lightest.r = (1*normal->r + 2*255) / 3;
 lightest.g = (1*normal->g + 2*255) / 3;
 lightest.b = (1*normal->b + 2*255) / 3;
 
 class1Clr = hvGfxFindColorIx(hvg, lightest.r, lightest.g, lightest.b);
 class2Clr = hvGfxFindColorIx(hvg, lighter.r, lighter.g, lighter.b);
 class3Clr = hvGfxFindColorIx(hvg, normal->r, normal->g, normal->b);
 class4Clr = hvGfxFindColorIx(hvg, 105,50,155);
 classOtherClr = hvGfxFindColorIx(hvg, 190, 190, 190);   // light gray
 
 struct sqlConnection *conn = hAllocConn(database);
 
 safef(query, sizeof(query),
-      "select omimId, phenotypeClass from omimPhenotype where omimId=%s", el->name);
+      "select omimId, %s from omimPhenotype where omimId=%s", omimPhenotypeClassColName, el->name);
 sr = sqlMustGetResult(conn, query);
 row = sqlNextRow(sr);
 
 hFreeConn(&conn);
 
 if (row == NULL)
     {
     // set to gray if this entry does not have any disorder info
     sqlFreeResult(&sr);
     return classOtherClr;
     }
 else
     {
     omimId    = row[0];
     phenClass = row[1];
@@ -12813,30 +12922,31 @@
 transMapRegisterTrackHandlers();
 retroRegisterTrackHandlers();
 registerTrackHandler("retroposons", dbRIPMethods);
 registerTrackHandlerOnFamily("kiddEichlerDisc", kiddEichlerMethods);
 registerTrackHandlerOnFamily("kiddEichlerValid", kiddEichlerMethods);
 registerTrackHandler("dgv", dgvMethods);
 
 registerTrackHandlerOnFamily("hapmapSnps", hapmapMethods);
 registerTrackHandlerOnFamily("hapmapSnpsPhaseII", hapmapMethods);
 registerTrackHandlerOnFamily("omicia", omiciaMethods);
 registerTrackHandler("omimGene", omimGeneMethods);
 registerTrackHandler("omimGene2", omimGene2Methods);
 registerTrackHandler("omimAvSnp", omimAvSnpMethods);
 registerTrackHandler("omimLocation", omimLocationMethods);
 registerTrackHandler("omimComposite", omimGene2Methods);
+registerTrackHandler("cosmic", cosmicMethods);
 registerTrackHandler("rest", restMethods);
 #endif /* GBROWSE */
 }
 
 void createHgFindMatchHash()
 /* Read from the cart the string assocated with matches and
    put the matching items into a hash for highlighting later. */
 {
 char *matchLine = NULL;
 struct slName *nameList = NULL, *name = NULL;
 matchLine = cartOptionalString(cart, "hgFind.matches");
 if(matchLine == NULL)
     return;
 nameList = slNameListFromString(matchLine,',');
 hgFindMatches = newHash(5);