956500207b58c263485009212f223836152176d3
hiram
  Thu Mar 26 14:58:55 2026 -0700
simplify the gcOnFly track - it does not need to by completely synthetic - it only comes in from trackDb stanzas refs #35958

diff --git src/hg/hgTracks/hgTracks.c src/hg/hgTracks/hgTracks.c
index 5b07c063d0f..b948062dd5c 100644
--- src/hg/hgTracks/hgTracks.c
+++ src/hg/hgTracks/hgTracks.c
@@ -7433,72 +7433,61 @@
  * Best to load custom last. */
 
 // load the track list and check to see if we need to rewrite the cart
 int cartVersionFromTrackDb = loadFromTrackDb(&trackList);
 int cartVersionFromCart = cartGetVersion(cart);
 if (cartVersionFromTrackDb > cartVersionFromCart)
     cartRewrite(cart, cartVersionFromTrackDb, cartVersionFromCart);
 
 if (measureTiming)
     measureTime("Time after trackDbLoad ");
 if (pcrResultParseCart(database, cart, NULL, NULL, NULL))
     slSafeAddHead(&trackList, pcrResultTg());
 if (userSeqString != NULL)
     slSafeAddHead(&trackList, userPslTg());
 slSafeAddHead(&trackList, oligoMatchTg());
-/* gcOnFly track: prefer trackDb entry if present, otherwise
- * build synthetically when gcOnTheFly config is enabled. */
-{
-struct track *gcTg = rFindTrackWithTable(GC_ON_FLY_TRACK_NAME, trackList);
-if (gcTg != NULL)
-    {
-    /* trackDb entry exists - patch in on-the-fly methods */
-    gc5BaseOnTheFlyMethods(gcTg, cart);
-    }
-else if (cfgOptionBooleanDefault("gcOnTheFly", FALSE))
-    {
-    if (cfgOptionBooleanDefault("gcOnTheFlyCoExist", FALSE))
-	{
-	slSafeAddHead(&trackList, gc5BaseOnTheFlyTg(cart));
-	}
-    else
-	{
-	if (rFindTrackWithTable("gc5Base", trackList) == NULL &&
-	    rFindTrackWithTable("gc5BaseBw", trackList) == NULL)
-	    slSafeAddHead(&trackList, gc5BaseOnTheFlyTg(cart));
-	}
-    }
-}
 
 if (restrictionEnzymesOk())
     {
     slSafeAddHead(&trackList, cuttersTg());
     }
 if (wikiTrackEnabled(database, NULL))
     {
     addWikiTrack(&trackList);
     struct sqlConnection *conn = wikiConnect();
     if (sqlTableExists(conn, "variome"))
         addVariomeWikiTrack(&trackList);
     wikiDisconnect(&conn);
     }
 
 struct grp *grpList = NULL;
 if (cartOptionalString(cart, "hgt.trackNameFilter") == NULL)
     { // If a single track was asked for and it is from a hub, then it is already in trackList
     loadTrackHubs(&trackList, &grpList);
     }
+/* gcOnFly track: if a trackDb entry exists (native or hub, possibly
+ * with a hub_#_ prefix on the table name), patch in on-the-fly
+ * computation methods so data comes from genome sequence, not a file.
+ * This must run after loadTrackHubs so assembly hub tracks are present. */
+{
+struct track *t;
+for (t = trackList; t != NULL; t = t->next)
+    {
+    if (sameString(GC_ON_FLY_TRACK_NAME, trackHubSkipHubName(t->table)))
+	gc5BaseOnTheFlyMethods(t, cart);
+    }
+}
 loadCustomTracks(&trackList);
 makeDupeTracks(&trackList);
 groupTracks( &trackList, pGroupList, grpList, vis);
 setSearchedTrackToPackOrFull(trackList);
 char *rtsLoad = cgiOptionalString( "rtsLoad");
 if (rtsLoad)  // load a recommended track set using the merge method
     {
     // store session name and user
     char *otherUserName = cartOptionalString(cart, hgsOtherUserName);
     char *otherUserSessionName = rtsLoad;
 
     // Hide all tracks except custom tracks
     struct hash *excludeHash = newHash(2);
     hashStore(excludeHash, "user");
     changeTrackVisExclude(groupList, NULL, tvHide, excludeHash);