64d40b9204a60274a49330c6b61d146e5cdc6d87
max
  Wed Sep 9 05:54:34 2026 -0700
Faceted composite: a container's max display mode must clamp a pinned child, not drop it

Selecting only CpG methylation on the Fiber-seq compendium and hitting
submit drew nothing at all, with no message to say why.

Two things combined.  The children of a faceted composite can be pinned
to one display mode with onlyVisibility, and five of the six Fiber-seq
data types are pinned to full because they are signal tracks.  The
container's own "Maximum display mode" is a ceiling over those children,
and it was set to pack.  tdbVisLimitedByAncestors() then took a pinned
child that sat above the ceiling and returned hide for it, so every
pinned-to-full track disappeared and only the peaks, pinned to dense,
came through.  With every data type but peaks unchecked, that left an
empty image.

A ceiling should limit a child, not delete it, so use tvMin the same way
the unpinned case a line below already did.  A bigWig draws the same at
pack as at full, minus the horizontal grid, so nothing is lost here.

The page was also asking for the wrong ceiling.  On a faceted composite
the dropdown is a ceiling rather than a display mode, since each child
carries its own, so taking the container out of hide should ask for full,
the one value that clips nothing.  Pack was chosen on the reasoning that
it suits a mix of signal and feature tracks, which is the right instinct
for a plain composite and the wrong one here.

refs #36210

diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index 41aba5d4191..29ebdd124c6 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -10068,32 +10068,34 @@
     // subtracks without explicit (cart) vis but are selected, should get inherited vis
     else if (!subtrackOverride)
         vis = tvFull;
     // subtracks with checkbox that says no, are stopped cold
     if (checkBoxToo && !fourStateVisible(subtrackFourStateChecked(tdb,cart)))
         vis = tvHide; // Checkbox says no
     }
 if (facetedChild)
     {
     // Note this skips the subtrackOverride shortcut below on purpose: escaping the
     // parent's limit is exactly the behavior a faceted composite doesn't want.
     if (vis == tvHide)
         return tvHide;
     enum trackVisibility maxVis = tdbVisLimitedByAncestors(cart,tdb->parent,checkBoxToo,
                                                            foldersToo);
-    if (onlyVis != NULL)  // A pinned child either fits under the maximum or doesn't draw
-        return (tvCompare(vis,maxVis) >= 0 ? vis : tvHide);
+    // The container's vis is a ceiling, so it limits a pinned child the same way it
+    // limits any other one.  It must not drop the child instead: a container sitting at
+    // pack over children pinned to full then draws nothing at all, with nothing on the
+    // page to say why.
     return tvMin(vis,maxVis);
     }
 if (subtrackOverride)
     return vis;
                                                             // aka superTrack
 if (vis == tvHide || tdb->parent == NULL || (!foldersToo && tdbIsFolder(tdb->parent)))
     return vis; // end of line
 
 return tvMin(vis,tdbVisLimitedByAncestors(cart,tdb->parent,checkBoxToo,foldersToo));
 }
 
 char *compositeViewControlNameFromTdb(struct trackDb *tdb)
 // Returns a string with the composite view control name if one exists
 {
 char *stView   = NULL;