7aa59c8f6afbda4c2157d3990b2bbc48a39cac63
max
  Fri Sep 25 02:48:31 2026 -0700
varFreqs: add SFARI SPARK 45k WGS subtracks. sfariSparkWgs45k is built from the release's AF table (AN estimated, singletons dropped); sfariSparkWgs45kAsd is built from the genotype pVCFs with ASD/non-ASD counts, for now only the DSCAM locus while the genome-wide parasol run finishes, refs #38424

diff --git src/hg/makeDb/scripts/varFreqs/sparkWgs45kPvcfRange.sh src/hg/makeDb/scripts/varFreqs/sparkWgs45kPvcfRange.sh
new file mode 100755
index 00000000000..a98baf4212e
--- /dev/null
+++ src/hg/makeDb/scripts/varFreqs/sparkWgs45kPvcfRange.sh
@@ -0,0 +1,36 @@
+#!/bin/bash
+# Convert a position range of one SPARK WGS 2026_08 pVCF chunk to a sites VCF,
+# splitting the range into pieces that run in parallel on this machine.
+# Usage: sparkWgs45kPvcfRange.sh <in.vcf.gz> <groups.txt> <start> <end> <out.vcf.gz> [pieces] [jobs]
+#   start/end: 1-based, [start, end)
+# Each piece is converted by sparkWgs45kPvcfToSites.sh. Left-alignment can move
+# a record a few bases before its piece start, so the pieces are concatenated
+# and then sorted.
+set -euo pipefail
+
+inVcf=$1
+groups=$2
+start=$3
+end=$4
+outVcf=$5
+pieces=${6:-48}
+jobs=${7:-48}
+scriptDir=$(dirname "$(readlink -f "$0")")
+work=$outVcf.work
+mkdir -p "$work"
+
+step=$(( (end - start + pieces - 1) / pieces ))
+for ((i = 0; i < pieces; i++)); do
+    s=$(( start + i * step ))
+    e=$(( s + step < end ? s + step : end ))
+    [ "$s" -lt "$end" ] && printf '%s\t%d\t%d\n' "$(printf 'p%04d' $i)" "$s" "$e"
+done > "$work/pieces.txt"
+
+parallel -j "$jobs" --colsep '\t' \
+    bash "$scriptDir/sparkWgs45kPvcfToSites.sh" "$inVcf" "$groups" "$work/{1}.bcf" {2} {3} \
+    '2>' "$work/{1}.log" < "$work/pieces.txt"
+
+# Concatenate and sort the pieces
+bash "$scriptDir/sparkWgs45kPvcfMerge.sh" "$outVcf" \
+    $(cut -f1 "$work/pieces.txt" | sed "s|^|$work/|; s|$|.bcf|")
+cat "$work"/p*.log | grep -v '^Lines' || true