fa5b31d305066e1938953374d80b3782ef87e239
max
  Mon Sep 7 23:23:40 2026 -0700
Position box: accept a bare codon number, and a range of codon numbers

"KAT6A p.495_533" used to land on codon 495 and silently drop the end of the
range, and a bare codon number after a transcript accession was not understood
at all, so "ENST00000265713.8 p.495" fell through the HGVS code and ended up on
an unrelated locus. Nucleotide ranges already worked. The pseudo-HGVS layer now
takes an optional _end on a bare codon number, and accepts a bare codon number
or range after an NM_ or ENST accession as well as after a gene symbol, looking
up the reference amino acids that HGVS wants and the user did not type.

The accession forms require a literal "p", so "NM_006766.5 1483" keeps meaning
what it meant. A hyphen is still not a range separator: c.1483-1599 is the HGVS
intronic position and stays that way.

Also fixes a read past the end of the protein sequence when the codon number
was larger than the protein, and documents codon ranges in query.html.

refs #38285

diff --git src/hg/lib/tests/expected/hgvs/validTerms.txt src/hg/lib/tests/expected/hgvs/validTerms.txt
index 558bfd83035..a29a90f8c10 100644
--- src/hg/lib/tests/expected/hgvs/validTerms.txt
+++ src/hg/lib/tests/expected/hgvs/validTerms.txt
@@ -1,46 +1,56 @@
 # db: hg38
 # inputFile: input/hgvs/validTerms.txt
 # A variant that is famously known as "MTHFR C677T" or "MTHFR 677C>T" -- but the 677 is incorrect (from an old sequence ~1995):
 chr1	11796320	11796321	NM_005957.4:c.665C>T	0	-
 # Same variant in LRG transcript, protein and genomic coords:
 chr1	11796320	11796321	LRG_726t1:c.665C>T	0	-
 chr1	11796319	11796322	LRG_726p1:p.Ala222Val	0	-
 chr1	11796320	11796321	LRG_726:g.14783C>T	0	+
 
 # These three are equivalent (although p. is less specific):
 chr11	112088972	112088973	NM_003002.3:c.276C>A	0	+
 chr11	112088970	112088973	NP_002993.1:p.Asp92Glu	0	+
 chr11	112088970	112088973	NP_002993.1:p.D92E	0	+
 
 # This is not HGVS but seems to be a commonly requested format and is easy to transform into the internal representation of HGVS:
 chr2	29193604	29193607	ALK G1494E	0	-
 
 # More gene symbol HGVS-ish
 chr1	8358598	8358601	RERE:Thr758Serfs	0	-
 chr1	8361232	8361235	RERE:Thr758Serfs	0	-
 chr1	155240657	155240660	GBA1:p.Leu29Alafs*18	0	-
 chr1	155239721	155239724	GBA1:p.Leu29Alafs*18	0	-
 chr1	9262237	9262240	H6PD Val320=	0	+
 chr1	9264518	9264521	H6PD Val320=	0	+
 chr1	9262270	9262273	H6PD Val320=	0	+
 chr1	9262243	9262246	H6PD Val320=	0	+
 chr1	9262249	9262252	H6PD Val320=	0	+
 chr1	11802930	11802936	MTHFR Pro101_Gly102insLeuTyrIleAspValThrTrpHisProAlaGlyAspPro	0	-
 chr1	11801329	11801335	MTHFR Pro101_Gly102insLeuTyrIleAspValThrTrpHisProAlaGlyAspPro	0	-
 chr1	11802933	11802939	MTHFR Pro101_Gly102insLeuTyrIleAspValThrTrpHisProAlaGlyAspPro	0	-
 chr1	11800245	11800251	MTHFR Pro101_Gly102insLeuTyrIleAspValThrTrpHisProAlaGlyAspPro	0	-
 chr1	32781089	32781101	YARS1 p.Val153_Val156del	0	-
 chr1	32806523	32806535	YARS1 p.Val153_Val156del	0	-
 chr1	11964767	11964770	PLOD1 Glu532del	0	+
 chr1	11966259	11966262	PLOD1 Glu532del	0	+
 chr1	40092118	40092136	PPT1 p.Gln91_Cys96delinsPhe	0	-
 chr1	40080426	40080444	PPT1 p.Gln91_Cys96delinsPhe	0	-
 chr1	11964767	11964770	PLOD1:p.532	0	+
 chr1	11966259	11966262	PLOD1:p.532	0	+
 # From a user via b0b:
 chr3	38597785	38597788	NM_198056.3:pAla735Val	0	-
 chr3	38555661	38555664	NM_198056.3:pArg1512Trp	0	-
 
 chr20	33443333	33443334	NM_003098.2:c.287G>C	0	-
 chr17	43093299	43093300	NM_007294.3:c.2231C>A	0	-
 chr17	43093299	43093300	NM_007294.3(BRCA1):c.2231C>A	0	-
+
+# Bare codon numbers and ranges of codon numbers, refs #38285
+chr8	41955408	41955411	KAT6A p.495	0	-
+chr8	41949362	41955411	KAT6A p.495_533	0	-
+chr8	41949362	41955411	KAT6A p.Lys495_Ser533	0	-
+chr8	41955408	41955411	NM_006766.5 p.495	0	-
+chr8	41949362	41955411	NM_006766.5 p.495_533	0	-
+chr8	41955408	41955411	ENST00000265713.8 p.495	0	-
+chr8	41949362	41955411	ENST00000265713.8 p.495_533	0	-
+chr8	41949362	41955411	KAT6A c.1483_1599	0	-