55a768d2e0ced94dc3ba7ab322b24daa67ea3570
max
  Fri Sep 11 10:09:16 2026 -0700
uniprot otto: resolve the 2bit and chrom.sizes for every kind of assembly

The first GenArk run stopped on hs1 with "expected exactly one chrom.sizes file in
/gbdb/hs1/hubs, found 0". hs1 is served as a hub but keeps its 2bit at
/gbdb/hs1/hs1.2bit and its chrom.sizes at /hive/data/genomes/hs1/chrom.sizes,
exactly where a classic assembly keeps them; only a real GenArk assembly keeps
them in the hub directory.

twoBitFname now keys on isGenArk rather than on being a hub, and a matching
chromSizesFile does the same, so both are resolved the same way everywhere. The
transcript building still uses the bigBed path for any hub assembly, because hs1
has no MySQL tables either, but it asks these two helpers for the supporting files.

Checked that all four resolve to files that exist: hs1 and hg38 to the classic
locations, mPanPan1_v2.0 and GRCz12ab to their hub directories.

Also fixed the README, which documented the option to limit the run as --onlyDbs.
It is --dbs; --onlyDbs is the internal dest name and the run fails with "no such
option".

refs #38300

diff --git src/hg/utils/otto/uniprot/README.txt src/hg/utils/otto/uniprot/README.txt
index 11a2dec2488..3e3f4a11712 100644
--- src/hg/utils/otto/uniprot/README.txt
+++ src/hg/utils/otto/uniprot/README.txt
@@ -68,31 +68,31 @@
 bigBed - one bigBed for every subTrack
 
 Pipeline:
 
 The main driver script is doUniprot. It requires the parameter "run" to do
 anything. It goes through these steps:
 - downloads UniProt XML with lftp. This takes 2-3 days. Skip this step with -l for development.
   [ It's hard to speed this up, as the EBI FTP server does not allow parallel connections, at the time
   of writing. ]
 - converts it to tab-sep and fasta files using uniprotToTab. This takes 3-4 days! Skip this step with
   -p whenever you can for debugging or development.
   [ jIt is hard to speed this up, as there is only a single huge XML file, without an index. The EBI 
   has a pilot where they provide offsets into the XML but it's not a real produce yet. ]
 - for each UniProt taxon ID, find the relevant UCSC db identifiers, adding a few manual overrides,
   e.g. 9606 always uses both hg19 and hg38. wuhCor1 is skipped, etc.
-  You can limit the script to only certain dbs with e.g. --onlyDbs=hg19
+  You can limit the script to only certain dbs with e.g. --dbs=hg19
   You can display the current mapping with 'doUniprot --db'
   This will also show the correct trackDb make command if you want to remake all trackDbs.
 - for each assembly, try to guess a transcript gene track and find transcript
   sequences for it and finds or fakes a transcript.psl file for the transcripts.
   Supported transcript tracks are: ncbiRefSeq, ensembl, augustus.
   They are tried in this order. Hg19 is hardcoded to refGene because CSAG3 NM_001129826.3
   exists only on chrX_jh159150_fix in ncbiRefSeq, Terence confirmed this is an issue.
   hg38 is hardcoded to ncbiRefSeq. see findBestGeneTable()
 - tries to create a UniProtId <-> transcriptId pairs table, if possible (from the UniProt xref fields)
   This massively reduces the false positives, for protein families with a lot of almost
   identical transcripts. There often a small mismatches between this table and
   the actual transcript set, so the file is cleaned up (and later pslSelect is run
   with -qPass, so any alignments that do not appear in the file just go through)
 - aligns the UniProt fasta files against the transcript
   sequences with BLAST, using the script makeUniProtPsl.sh, on the cluster,