4dcb41c179c6fae38abffb52dd2b764b74301c7c
angie
  Mon Jul 30 16:39:17 2012 -0700
Feature #8551 (Sequence Ontology terms for predicted functional effects on SNP details pages):at Ensembl's request, instead of displaying dbSNP's predicted function terms, instead show
terms from the Sequence Ontology (SO).  Where possible, terms from Ensembl's list at
http://staging.ensembl.org/info/docs/variation/predicted_data.html are used.

diff --git src/hg/hgTracks/variation.c src/hg/hgTracks/variation.c
index 4fa7427..bd28704 100644
--- src/hg/hgTracks/variation.c
+++ src/hg/hgTracks/variation.c
@@ -277,31 +277,31 @@
 static boolean snp125FuncFilterItem(void *item)
 /* Return TRUE if item passes filter, i.e. has an included property. */
 {
 struct snp125 *el = (struct snp125 *)item;
 if (!snp125FuncFilterOn)
     return TRUE;
 char *words[128];
 int wordCount, i;
 char funcString[4096];
 safecpy(funcString, sizeof(funcString), el->func);
 wordCount = chopCommas(funcString, words);
 for (i = 0;  i < wordCount;  i++)
     {
     char *simpleFunc = (char *)hashMustFindVal(snp125FuncCartNameHash,
 					       words[i]);
-    if (slNameInList(snp125FuncFilter, simpleFunc))
+    if (slNameInList(snp125FuncFilter, simpleFunc) || slNameInList(snp125FuncFilter, words[i]))
 	return TRUE;
     }
 return FALSE;
 }
 
 boolean snpLocTypeFilterItem(struct track *tg, void *item)
 /* Return TRUE if item passes filter, i.e. has no excluded property. */
 {
 struct snp *el = item;
 int    snpLocType = 0;
 
 for (snpLocType=0; snpLocType<snpLocTypeCartSize; snpLocType++)
     if (containsStringNoCase(el->locType,snpLocTypeDataName[snpLocType]))
         if ( sameString(snpLocTypeCart[snpLocType], "exclude") )
             return FALSE;
@@ -634,31 +634,31 @@
 int i;
 for (i=0; i < varCount; i++)
     {
     char cartVar[512];
     safef(cartVar, sizeof(cartVar), "%s.%s%s", track, attribute,
 	  (varsAreOld ? snp125OldColorVarToNew(vars[i], attribute) : vars[i]));
     char *defaultCol = defaults[i];
     if (varsAreOld)
 	defaultCol = cartUsualString(cart, vars[i], defaultCol);
     char *col = cartUsualString(cart, cartVar, defaultCol);
     cartColors[i] = stringArrayIx(col, snp125ColorLabel, snp125ColorArraySize);
     }
 return cartColors;
 }
 
-static void snp125SetupFiltersAndColorsFromCart(struct trackDb *tdb)
+static void snp125SetupFiltersAndColorsFromCart(struct trackDb *tdb, int version)
 /* Load the controls set by hgTrackUi into global vars. */
 {
 char *track = tdb->track;
 char cartVar[512];
 safef(cartVar, sizeof(cartVar), "%s.minAvHet", track);
 snp125AvHetCutoff = cartUsualDouble(cart, cartVar,
 			     // Check old cart var name:
 			     cartUsualDouble(cart, "snp125AvHetCutoff", SNP125_DEFAULT_MIN_AVHET));
 safef(cartVar, sizeof(cartVar), "%s.maxWeight", track);
 int defaultMaxWeight = SNP125_DEFAULT_MAX_WEIGHT;
 char *setting = trackDbSetting(tdb, "defaultMaxWeight");
 if (isNotEmpty(setting))
     defaultMaxWeight = atoi(setting);
 snp125WeightCutoff = cartUsualInt(cart, cartVar,
 			     // Check old cart var name and tdb default:
@@ -703,30 +703,37 @@
 	  track, snp125OldColorVarToNew(snp125FuncOldColorVars[i], "func"));
     char *cartVal = cartUsualString(cart, cartVar,
 				    cartUsualString(cart, snp125FuncOldColorVars[i],
 						    snp125FuncDefault[i]));
     /* There are many function types, some of which are mapped onto
      * simpler types in snp125Ui.c.  First store the indexes of
      * selected colors of simpler types that we present as coloring
      * choices; then (below) map the more detailed function types'
      * indexes onto the simpler types' indexes. */
     hashAddInt(snp125FuncCartColorHash, snp125FuncDataName[i],
 	       stringArrayIx(cartVal, snp125ColorLabel, snp125ColorArraySize));
     /* Similarly, map names.  Self-mapping here, synonyms below. */
     hashAdd(snp125FuncCartNameHash, snp125FuncDataName[i],
 	    snp125FuncDataName[i]);
     }
+if (version >= 137)
+    {
+    hashAddInt(snp125FuncCartColorHash, "ncRNA",
+	       stringArrayIx("blue", snp125ColorLabel, snp125ColorArraySize));
+    hashAdd(snp125FuncCartNameHash, "ncRNA", "ncRNA");
+    }
+// Map finer-grained func codes in table to simplified filtering/coloring choices.
 int j, k;
 for (j = 0;  snp125FuncDataSynonyms[j] != NULL;  j++)
     {
     char *canonical = snp125FuncDataSynonyms[j][0];
     for (k = 1;  snp125FuncDataSynonyms[j][k] != NULL;  k++)
 	{
 	hashAddInt(snp125FuncCartColorHash, snp125FuncDataSynonyms[j][k],
 		   hashIntVal(snp125FuncCartColorHash, canonical));
 	hashAdd(snp125FuncCartNameHash, snp125FuncDataSynonyms[j][k], canonical);
 	}
     }
 }
 
 Color snp125ColorToMg(enum snpColorEnum thisSnpColor)
 /* Translate full range of snpColorEnum into memgfx MG_<COLOR>. */
@@ -908,31 +915,31 @@
 {
 return snp132AlFreqCmp(vb, va);
 }
 
 void loadSnp125(struct track *tg)
 /* load snps from table, ortho alleles from snpXXXOrthoXXX table, filter and color. */
 {
 int version = snpVersion(tg->table);
 if (version >= 132)
     loadSnp125Basic(tg, version, (void *)(snp132ExtLoad));
 else if (version >= 125)
     loadSnp125Basic(tg, version, (void *)(snp125Load));
 else
     errAbort("How was loadSnp125 called on version < 125? (%d)", version);
 
-snp125SetupFiltersAndColorsFromCart(tg->tdb);
+snp125SetupFiltersAndColorsFromCart(tg->tdb, version);
 filterSnp125Items(tg, version);
 snp125ColorItems(tg, version);
 
 // If in dense or squish mode, sort items by color or allele frequency:
 boolean sortByAF = (snp125ColorSource == snp125ColorSourceAlleleFreq);
 if (tg->visibility == tvDense)
     slSort(&tg->items, sortByAF ? snp132AlFreqCmp : snp125ColorCmp);
 else if (tg->visibility == tvSquish)
     slSort(&tg->items, sortByAF ? snp132AlFreqCmpDesc : snp125ColorCmpDesc);
 else
     {
     slSort(&tg->items, snpOrthoCmp);
     setSnp125ExtendedNameExtra(tg);
     enum trackVisibility newVis = limitVisibility(tg);
     if (newVis == tvDense)