1b074613b1c6b7f84953c3f490631b91d844c9a9
galt
  Thu Sep 8 22:40:20 2022 -0700
Adapting Angie's existing variant effects to the new dbSnp that uses SPDI and provided via json formatted data. So users can see variant effects with version 153 or later. refs #29989

diff --git src/hg/hgTrackUi/hgTrackUi.c src/hg/hgTrackUi/hgTrackUi.c
index 3304bc9..e6accf8 100644
--- src/hg/hgTrackUi/hgTrackUi.c
+++ src/hg/hgTrackUi/hgTrackUi.c
@@ -158,49 +158,34 @@
     }
 printf("<BR><B>Variant Types:</B><BR>\n");
 for (snpMapType=0; snpMapType<snpMapTypeCartSize; snpMapType++)
     {
     snpMapTypeCart[snpMapType] =
 	cartUsualString(cart, snpMapTypeStrings[snpMapType], snpMapTypeDefault[snpMapType]);
     snpMapTypeFilterButtons(snpMapTypeStrings[snpMapType], snpMapTypeCart[snpMapType]);
     printf(" - <B>%s</B><BR>\n", snpMapTypeLabels[snpMapType]);
     }
 }
 
 void snp125OfferGeneTracksForFunction(struct trackDb *tdb)
 /* Get a list of genePred tracks and make checkboxes to enable hgc's functional
  * annotations. */
 {
-struct sqlConnection *conn = hAllocConn(database);
-struct slName *genePredTables = hTrackTablesOfType(conn, "genePred%%"), *gt;
-if (genePredTables != NULL)
-    {
 struct trackDb *geneTdbList = NULL, *gTdb;
-    for (gt = genePredTables;  gt != NULL;  gt = gt->next)
-	{
-	gTdb = hashFindVal(trackHash, gt->name);
-	if (gTdb && sameString(gTdb->grp, "genes"))
+geneTdbList = snp125FetchGeneTracks(database, cart);
+if (geneTdbList)
     {
-	    // We are going to overwrite gTdb's next pointer and possibly its priority,
-	    // so make a shallow copy:
-	    gTdb = CloneVar(gTdb);
-	    if (gTdb->parent)
-		gTdb->priority = (gTdb->parent->priority + gTdb->priority/1000);
-	    slAddHead(&geneTdbList, gTdb);
-	    }
-	}
-    slSort(&geneTdbList, trackDbCmp);
     jsBeginCollapsibleSection(cart, tdb->track, "geneTracks",
 			      "Use Gene Tracks for Functional Annotation", FALSE);
     printf("<BR><B>On details page, show function and coding differences relative to: </B>\n");
     char cartVar[256];
     safef(cartVar, sizeof(cartVar), "%s_geneTrack", tdb->track);
     jsMakeCheckboxGroupSetClearButton(cartVar, TRUE);
     jsMakeCheckboxGroupSetClearButton(cartVar, FALSE);
     struct slName *selectedGeneTracks = cartOptionalSlNameList(cart, cartVar);
     if (!cartListVarExists(cart, cartVar))
 	{
 	char *defaultGeneTracks = trackDbSetting(tdb, "defaultGeneTracks");
 	if (isNotEmpty(defaultGeneTracks))
 	    selectedGeneTracks = slNameListFromComma(defaultGeneTracks);
 	}
     int numCols = 4, i;
@@ -215,31 +200,30 @@
 	    struct dyString *dy = dyStringNew(0);
 	    if (gTdb->parent->parent != NULL &&
 		!startsWith(gTdb->parent->parent->shortLabel, gTdb->parent->shortLabel))
 		dyStringPrintf(dy, "%s: ", gTdb->parent->parent->shortLabel);
 	    if (!startsWith(gTdb->parent->shortLabel, gTdb->shortLabel))
 		dyStringPrintf(dy, "%s: ", gTdb->parent->shortLabel);
 	    dyStringPrintf(dy, "%s", gTdb->shortLabel);
 	    labels[i] = dyStringCannibalize(&dy);
 	    }
 	else
 	    labels[i] = gTdb->shortLabel;
 	}
     cgiMakeCheckboxGroupWithVals(cartVar, labels, values, menuSize, selectedGeneTracks, numCols);
     jsEndCollapsibleSection();
     }
-hFreeConn(&conn);
 }
 
 #define SNP125_FILTER_COLUMNS 4
 #define SNP125_DEFAULTS "snp125Defaults"
 
 void snp125PrintFilterControls(char *track, char *attributeLabel, char *attributeVar,
 			       char *labels[], char *values[], int menuSize)
 /* Print two or more rows (attribute name header and row(s) of checkboxes)
  * of a table displaying snp125 attribute filter checkboxes. */
 {
 char anchor[256];
 safecpy(anchor, sizeof(anchor), attributeVar);
 anchor[0] = toupper(anchor[0]);
 printf("<TR><TD><B><A HREF=\"#%s\">%s</A>:</B>&nbsp;\n", anchor, attributeLabel);
 char cartVar[256];