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 __ 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 ___ 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 + +set -o pipefail + +outDir=$1 +if [ -z "$outDir" ]; then + echo "usage: $0 " >&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"