bd4501775536afbc74d45e70960872fd6e61d09c braney Fri Sep 11 08:50:38 2026 -0700 hgTracks: a quickLifted container no longer hides the tracks inside it trackDbString writes "superTrack on show" for a container it is lifting, then dumpTdbAndChildren walks the settings hash and writes the source assembly's own superTrack setting after it. That setting reads "on hide" whenever the user has not opened the container, and the later line is the one the hub reader keeps. The container came across hidden and so did every track in it, so a lift of a track that lives in a container produced a page with nothing on it but the chain track. Drop the stale setting before the walk, the way walkTree already drops the copy the children inherit. Lifting JARVIS from hg19 to hg38 used to draw only the quickLift chain track. It now draws all ten tracks in the Constraint scores container. A top level bigWig, a composite of bigWigs and a bigBed all lift as they did before, and the hub file now carries one superTrack line rather than two that disagree. The crash this ticket was opened for is a separate thing and was already fixed by 07ba37612b1 and 5dd36916814. Rechecked on genome-test over eight windows down to 200 bases: no crash, and the lifted bigWig draws. refs #37969 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> diff --git src/hg/lib/trackHub.c src/hg/lib/trackHub.c index c70d92d40de..a64a5e7d4d2 100644 --- src/hg/lib/trackHub.c +++ src/hg/lib/trackHub.c @@ -1920,30 +1920,36 @@ struct dyString *trackDbString(struct cart *cart, struct trackDb *tdb) /* Convert a trackDb entry into a dyString. */ { struct dyString *dy; // add a note that the name based handler shouldn't be used on this track // add a note that this is a quickLifted track so the browser will accept tracks that aren't big* dy = dyStringNew(200); char *track = trackHubSkipHubName(tdb->track); dyStringPrintf(dy, "track %s\nquickLifted on\n", track); if (tdbIsSuperTrack(tdb)) { + // dumpTdbAndChildren walks the settings below, and the source container carries its + // own superTrack setting, which is "on hide" whenever the user has not opened it. + // That line would land after this one and win, hiding the container and every track + // we just lifted into it. Drop it, the way walkTree drops the copy the children + // inherit. + hashRemove(tdb->settingsHash, "superTrack"); dyStringPrintf(dy, "superTrack on show\n"); } if (!isVetted(track)) dyStringPrintf(dy, "avoidHandler on\n"); dumpTdbAndChildren(cart, dy, tdb); return dy; } static boolean isAlignmentType(char *type) /* The alignment types quickLift can lift. These are newer than the rest of quickLift and * are gated in hg.conf, so quickLiftAlignmentsEnabled decides whether one may enter the * hub. This is the only door: quickLiftUrl and quickLiftDb, the pair every lift path