1de43b26fd18d5be3585829158d9b65944979094
lrnassar
  Wed Aug 5 17:19:10 2026 -0700
Harden popEVE build drivers per code review. refs #37950 refs #37791

- Add "set -o pipefail" to both build scripts so a bedToBigBed failure piped to tail is not
masked (runBuildDense.sh reported the previous file's size on failure).
- runBuild.sh (sparse) now writes popEve_sparse.bb instead of popEve.bb, so re-running it
cannot silently clobber the dense popEve.bb produced by runBuildDense.sh. Makedoc updated.

diff --git src/hg/makeDb/scripts/popEve/runBuild.sh src/hg/makeDb/scripts/popEve/runBuild.sh
index 6d73d7ce13e..569f08c9c5c 100755
--- src/hg/makeDb/scripts/popEve/runBuild.sh
+++ src/hg/makeDb/scripts/popEve/runBuild.sh
@@ -1,18 +1,19 @@
 #!/bin/bash
 # popEVE hg38 build — extract, sort, color anchors, convert, bigBed.
 set -e
+set -o pipefail   # do not let a failure in a piped step be masked by the pipe's last command
 export PATH=$PATH:$HOME/bin/x86_64
 cd /hive/data/genomes/hg38/bed/popEve
 
 KS=$HOME/kent/src/hg/makeDb/scripts/popEve
 VCF=input/grch38_popEVE_ukbb_20250715.vcf.gz
 CHROMSIZES=/hive/data/genomes/hg38/chrom.sizes
 
 echo "[$(date +%T)] 1. build NP_->strand map from ncbiRefSeq"
 hgsql hg38 -N -e "select distinct l.protAcc, g.chrom, g.strand from ncbiRefSeqLink l \
   join ncbiRefSeq g on g.name=l.mrnaAcc where l.protAcc like 'NP\_%'" > np_chrom_strand.tsv
 python3 -c "
 prim=set(l.split()[0] for l in open('$CHROMSIZES'))
 best={}
 for line in open('np_chrom_strand.tsv'):
     p,c,s=line.rstrip('\n').split('\t')
@@ -50,23 +51,25 @@
 
 echo "[$(date +%T)] 4. external sort by protein, then genomic position"
 sort -t$'\t' -k1,1 -k4,4n -S 4G -T /hive/data/genomes/hg38/bed/popEve/sorttmp \
   popEve_records.tsv > popEve_sorted.tsv
 
 echo "[$(date +%T)] 5. convert to heatmap BED"
 python3 $KS/vcfToPopEveHeatmap.py popEve_sorted.tsv np_strand.tsv popEve_raw.bed $LO $HI 2> convert.log
 tail -3 convert.log
 
 echo "[$(date +%T)] 6. bedSort + filter to chrom.sizes"
 bedSort popEve_raw.bed popEve_sorted_bed.bed
 awk 'NR==FNR{ok[$1]=1;next} $1 in ok' $CHROMSIZES popEve_sorted_bed.bed > popEve_filtered.bed
 echo "raw $(wc -l < popEve_raw.bed)  filtered $(wc -l < popEve_filtered.bed)"
 
 echo "[$(date +%T)] 7. bedToBigBed"
+# Output is popEve_sparse.bb, not popEve.bb: this sparse build is superseded by runBuildDense.sh
+# (the final track). A distinct name avoids clobbering the dense popEve.bb if this is re-run.
 bedToBigBed -type=bed12+ -tab -as=$KS/popEve_heatmap.as \
-  popEve_filtered.bed $CHROMSIZES popEve.bb
-ls -l popEve.bb
+  popEve_filtered.bed $CHROMSIZES popEve_sparse.bb
+ls -l popEve_sparse.bb
 
 echo "[$(date +%T)] 8. total amino-acid positions (sum of blockCount)"
 awk -F'\t' '{s+=$10} END{print "proteins:",NR,"  AA positions:",s}' popEve_filtered.bed
 
 echo "[$(date +%T)] DONE"