ce780dd2f1216ce728ab6bb69ac19a39ddc694fd
max
  Tue Sep 8 00:26:39 2026 -0700
hg38: Fiber-seq container with accessibility, FIRE peaks and CpG methylation, 41 samples

Native version of the Stergachis/Vollger lab hub at
https://fiberseq.github.io/UCSC-Fiber-seq-hub/hub.txt, plus the per-sample CpG
methylation Shane Neph asked to have alongside it. Both cover the same 41
samples: 14 cell lines and 27 lymphoblastoid lines from HPRC and GIAB
individuals.

fiberSeq              container, group regulation
fiberSeqAcc         multiWig overlay of 7 common cell lines, on by default
fiberSeqCompendium  faceted composite, dataTypes acc/peaks/hap
fiberSeqMeth        faceted composite, dataTypes comb/hap/diffs, "Methylation"

Both composites use the Methbase faceted-composite machinery. Subtracks are
named <composite>_<accession>_<dataType> with the accession as the only middle
component, because facetedCompositeUi() cuts the data element at the first
underscore and cartDump.c reassembles the name from the pieces; the hub's
<composite>_<sample>_<accession>_<type> names would have resolved to tracks that
do not exist. Sample name and cell type live in the metadata TSV instead. Using
dataTypes also brings onlyVisibility, which is what lets the peaks default to
dense while the signal tracks default to full, the mixed-visibility default
Andrew Stergachis asked for.

397 GB mirrored from the UW Kopah S3 server rather than pointed at over the
network, since a native track should not depend on it.

The FIRE peak bigBeds had to be rebuilt: they carry full narrowPeak data but
their header records a field count of 3, which hides signalValue and qValue
from the browser and would have made hgTracks errAbort in
bigNarrowPeakLoadItems(). The rebuild fixes the header and rounds the two float
columns to 3 decimals, 467 MB to 313 MB. It drops 421 of 9,487,043 peaks called
on chrEBV, the EBV decoy of the GRCh38 analysis set, which hg38 does not have;
9,486,622 remain and every sample reconciles exactly. Reported upstream, along
with GM12878's two haplotype accessibility bigWigs, which are one-base
placeholders at the source.

refs #36210

diff --git src/hg/makeDb/scripts/fiberSeq/fiberSeqCheck.sh src/hg/makeDb/scripts/fiberSeq/fiberSeqCheck.sh
new file mode 100755
index 00000000000..e215444d4a9
--- /dev/null
+++ src/hg/makeDb/scripts/fiberSeq/fiberSeqCheck.sh
@@ -0,0 +1,72 @@
+#!/bin/bash
+# Verify the mirrored Fiber-seq / CpG files: every expected file present, every
+# one readable as a bigWig or bigBed, and report any that hold no data.  The
+# empty-file report matters: at mirror time PM00001 (GM12878)
+# hap1/hap2.percent.accessible.bw were 512-byte stubs on the server, i.e. valid
+# bigWigs with zero bases covered, so a size check alone does not catch them.
+#
+# Usage: fiberSeqCheck.sh <outDir>
+
+set -o pipefail
+
+outDir=$1
+if [ -z "$outDir" ]; then
+    echo "usage: $0 <outDir>" >&2
+    exit 1
+fi
+
+scriptDir=$(dirname "$(readlink -f "$0")")
+sampleList=$scriptDir/fiberSeqSamples.tsv
+
+bigWigs="all.percent.accessible.bw
+hap1.percent.accessible.bw
+hap2.percent.accessible.bw
+cpg.combined.bw
+cpg.hap1.bw
+cpg.hap2.bw
+cpg.diffs_all.bw
+cpg.diffs_p0.01.bw
+cpg.diffs_p0.001.bw
+cpg.diffs_p0.0001.bw"
+bigBeds="fire-peaks.bb
+fire-peaks.ucsc.bb"
+
+missing=0
+broken=0
+empty=0
+
+grep -v '^#' "$sampleList" | while IFS=$'\t' read -r acc sample cellType hash; do
+    [ -z "$acc" ] && continue
+    for f in $bigWigs; do
+        p=$outDir/$acc/$f
+        if [ ! -s "$p" ]; then
+            echo "MISSING $acc/$f"
+            continue
+        fi
+        info=$(bigWigInfo "$p" 2>&1) || { echo "BROKEN $acc/$f"; continue; }
+        bases=$(echo "$info" | awk -F': ' '$1=="basesCovered"{gsub(",","",$2); print $2}')
+        # A placeholder bigWig is not necessarily basesCovered 0: the two bad
+        # files on the server cover exactly one base with a value of zero.  The
+        # smallest legitimate file here covers 4.1 million bases, so anything
+        # under a thousand is a stub, not thin coverage.
+        if [ "${bases:-0}" -lt 1000 ]; then
+            echo "EMPTY $acc/$f (basesCovered ${bases:-0})"
+        fi
+    done
+    for f in $bigBeds; do
+        p=$outDir/$acc/$f
+        if [ ! -s "$p" ]; then
+            echo "MISSING $acc/$f"
+            continue
+        fi
+        info=$(bigBedInfo "$p" 2>&1) || { echo "BROKEN $acc/$f"; continue; }
+        n=$(echo "$info" | awk -F': ' '$1=="itemCount"{gsub(",","",$2); print $2}')
+        if [ "${n:-0}" = "0" ]; then
+            echo "EMPTY $acc/$f (itemCount 0)"
+        fi
+    done
+done | tee "$outDir/fiberSeqCheck.log"
+
+echo
+echo "problems logged to $outDir/fiberSeqCheck.log"
+echo "no lines above means all $(grep -vc '^#' "$sampleList") samples are complete and non-empty"