2162be65d294e930dfca338b0a3ef2a054449b36
mspeir
  Sat Aug 15 13:31:58 2026 -0700
Make the singleCellSignalsPeaks metadata check mandatory, refs #38070

Missing facet metadata used to warn and write the .ra anyway, so a stanza file
holding 22 of 925 subtracks produced a short .ra and exit 0. It is now an error,
with --no-meta-check to skip it deliberately and --meta to point elsewhere.

The metadata, palette and manifest are found relative to --stanzas instead of
HUB_BUILD, so pointing --stanzas at another build no longer checks it against
the default build's metadata. Moved the HUB_BUILD default off a personal hive
directory to /hive/data/inside/cells/all-tracks-hub-build, beside the served
hub. Both .ra files regenerate unchanged.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

diff --git src/hg/makeDb/scripts/singleCellSignalsPeaks/copySingleCellSignalsPeaksFiles.py src/hg/makeDb/scripts/singleCellSignalsPeaks/copySingleCellSignalsPeaksFiles.py
index 5b9a839ad63..085dc3586db 100644
--- src/hg/makeDb/scripts/singleCellSignalsPeaks/copySingleCellSignalsPeaksFiles.py
+++ src/hg/makeDb/scripts/singleCellSignalsPeaks/copySingleCellSignalsPeaksFiles.py
@@ -15,31 +15,31 @@
 It also copies the composite's facet metadata to
   <bed>/singleCellSignalsPeaks_metadata.tsv   (the track's metaDataUrl target).
 
 Usage:
   copySingleCellSignalsPeaksFiles.py [--assembly hg38|mm10] [--dry-run]
 """
 import re, os, shutil, argparse
 from urllib.parse import urlparse
 
 # Where the hub build writes manifest.tsv -- its OUTPUT dir, not its code. The build
 # itself lives in the cellBrowser repo (ucsc/allTracksHub):
 #   https://github.com/ucscGenomeBrowser/cellBrowser/tree/develop/ucsc/allTracksHub
 # Its output dir is set there by CBHUB_OUT; keep this default in step with it (or pass
 # --manifest).
 HUB_BUILD = os.environ.get(
-    "HUB_BUILD", "/hive/users/mspeir/claude/cell-browser/all-tracks-hub-build")
+    "HUB_BUILD", "/hive/data/inside/cells/all-tracks-hub-build")
 TRACK = "singleCellSignalsPeaks"
 
 def load_relpath_to_abs(manifest, asm):
     m = {}
     with open(manifest) as fh:
         hdr = fh.readline().rstrip("\n").split("\t")
         ai, ui, asmi = hdr.index("abs_path"), hdr.index("track_url"), hdr.index("assembly")
         for line in fh:
             f = line.rstrip("\n").split("\t")
             if len(f) <= max(ai, ui, asmi) or f[asmi] != asm:
                 continue
             m[urlparse(f[ui]).path.lstrip("/")] = f[ai]
     return m
 
 def main():