0b9c2a6f9930555f65104385a9edcb00147a5bc6
braney
  Mon Feb 3 09:31:56 2025 -0800
add support for quikLifting mySQL beds.

diff --git src/hg/lib/trackHub.c src/hg/lib/trackHub.c
index 532341b4e2d..4e2b08ef161 100644
--- src/hg/lib/trackHub.c
+++ src/hg/lib/trackHub.c
@@ -966,31 +966,32 @@
     if ((superTrack != NULL) && startsWith("on", superTrack))
 	isSuper = TRUE;
 
     if (!(trackDbSetting(tdb, "compositeTrack") ||
           trackDbSetting(tdb, "container") || 
 	  isSuper))
         {
 	errAbort("Parent track %s is not compositeTrack, container, or superTrack in hub %s genome %s", 
 		tdb->track, hub->url, genome->name);
 	}
     }
 else
     {
     /* Check type field. */
     char *type = requiredSetting(hub, genome, tdb, "type");
-    if (! isCustomComposite(tdb))
+    char *quickLifted = trackDbSetting(tdb, "quickLifted");
+    if (! ( isCustomComposite(tdb) || (quickLifted != NULL)))
         {
         if (startsWithWord("mathWig", type) )
             {
             requiredSetting(hub, genome, tdb, "mathDataUrl");
             }
         else 
             {
             /* RMH: Added bigRmsk to support RepeatMasker data in bigBed track hub format */
             if (!(startsWithWord("wig", type)||  startsWithWord("bedGraph", type)))
                 {
                 if (!(startsWithWord("bigWig", type) ||
                   startsWithWord("bigBed", type) ||
 #ifdef USE_HAL
                   startsWithWord("pslSnake", type) ||
                   startsWithWord("halSnake", type) ||
@@ -1594,63 +1595,67 @@
 
 return vis;
 }
 
 struct dyString *trackDbString(struct trackDb *tdb)
 /* Convert a trackDb entry into a dyString. */
 {
 struct dyString *dy;
 struct hash *existHash = newHash(5);
 struct hashEl *hel;
 
 hel = hashLookup(tdb->settingsHash, "track");
 if (hel == NULL)
     errAbort("can't find track variable in tdb");
 
+// add a prefix to the track name so the special cased loaders aren't used
+// add a note that this is a quickLifted track so the browser will accept tracks that aren't big*
 dy = dyStringNew(200);
-dyStringPrintf(dy, "track %s\n", trackHubSkipHubName((char *)hel->val));
+dyStringPrintf(dy, "track qlft%s\nquickLifted on\n", trackHubSkipHubName((char *)hel->val));
 hashStore(existHash, "track");
     
 dumpTdbAndParents(dy, tdb, existHash, NULL);
 
 return dy;
 }
 
 static void walkTree(FILE *f, struct cart *cart,  struct trackDb *tdb, struct dyString *visDy)
 /* walk tree looking for visible tracks. */
 {
 for(; tdb; tdb = tdb->next)
     {
     if (tdb->subtracks)
         walkTree(f, cart, tdb->subtracks, visDy);
     else 
         {
-        if (!startsWith("big", tdb->type))
+        if (!( startsWith("big", tdb->type) || startsWith("bed ", tdb->type)))
             continue;
         boolean isVisible = FALSE;
         if (tdb->parent == NULL)
             {
             char *cartVis = cartOptionalString(cart, tdb->track);
             if (cartVis != NULL)
                 {
                 tdb->visibility = hTvFromString(cartVis);
                 }
             isVisible =  tdb->visibility != tvHide;
             }
         else if (isParentVisible(cart, tdb) &&  isSubtrackVisible(cart, tdb))
             {
             char *cartVis = cartOptionalString(cart, tdb->parent->track);
+            if ((cartVis == NULL) && tdb->parent->parent)
+                cartVis = cartOptionalString(cart, tdb->parent->parent->track);
             tdb->visibility = hTvFromString(cartVis);
             isVisible = TRUE;
             }
 
         if (isVisible)
             {
             dyStringPrintf(visDy, "&%s=%s", tdb->track,hStringFromTv(tdb->visibility));
             //if (hashLookup(tdb->settingsHash, "customized") == NULL)
                 {
                 hashRemove(tdb->settingsHash, "maxHeightPixels");
                 hashRemove(tdb->settingsHash, "superTrack");
                 hashRemove(tdb->settingsHash, "subGroups");
                 hashRemove(tdb->settingsHash, "polished");
                 hashRemove(tdb->settingsHash, "noInherit");
                 hashRemove(tdb->settingsHash, "group");