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/sparkWgs45kToVcf.sh src/hg/makeDb/scripts/varFreqs/sparkWgs45kToVcf.sh
new file mode 100644
index 00000000000..729785431d0
--- /dev/null
+++ src/hg/makeDb/scripts/varFreqs/sparkWgs45kToVcf.sh
@@ -0,0 +1,41 @@
+#!/bin/bash
+# Build the SFARI SPARK WGS 45k sites VCF from the release's AF table.
+# Usage: sparkWgs45kToVcf.sh <pvcf_variant_frequencies.tsv> <out.vcf.gz> [threads]
+# Splits the table per chromosome, converts each with sparkWgs45kToVcf.py
+# (AN estimate, AC=round(AF*AN), singletons dropped), left-aligns with
+# bcftools norm, sorts and concatenates into one bgzipped, tabix-indexed VCF.
+set -euo pipefail
+
+inTsv=$1
+outVcf=$2
+threads=${3:-24}
+scriptDir=$(dirname "$(readlink -f "$0")")
+refFa=/hive/data/genomes/hg38/bed/varFreqs/all/hg38.fa
+work=$(dirname "$outVcf")/work
+mkdir -p "$work"
+
+# 1. split by chromosome in one pass (input is already sorted by chrom)
+awk -F'\t' -v d="$work" 'NR>1 {if ($1!=c) {if (f) close(f); c=$1; f=d"/"c".tsv"} print > f}' "$inTsv"
+
+# 2. convert + left-align/trim + sort, per chromosome in parallel
+python3 "$scriptDir/sparkWgs45kToVcf.py" -H /dev/null > "$work/header.vcf" 2>/dev/null
+convertOne() {
+    c=$1; work=$2; scriptDir=$3; refFa=$4
+    (cat "$work/header.vcf"; python3 "$scriptDir/sparkWgs45kToVcf.py" "$work/$c.tsv" 2> "$work/$c.convert.log") \
+      | bcftools norm --check-ref w -f "$refFa" -Ou 2> "$work/$c.norm.log" \
+      | bcftools sort -T "$work/sort.$c" -m 4G -Ob -o "$work/$c.bcf"
+    bcftools index "$work/$c.bcf"
+}
+export -f convertOne
+ls "$work"/chr*.tsv | xargs -n1 basename | sed 's/.tsv$//' \
+    | parallel -j "$threads" convertOne {} "$work" "$scriptDir" "$refFa"
+
+# 3. concatenate in chrom.sizes order
+chroms=$(cut -f1 /hive/data/genomes/hg38/chrom.sizes | grep -v _ | sort -V)
+files=""
+for c in $chroms; do [ -s "$work/$c.bcf" ] && files="$files $work/$c.bcf"; done
+bcftools concat --threads 8 -Oz -o "$outVcf" $files
+tabix -p vcf "$outVcf"
+
+cat "$work"/chr*.convert.log
+grep -h 'Lines' "$work"/chr*.norm.log || true