059927383e72afe59202535b4863fc016463127a
max
  Thu Sep 3 15:04:05 2026 -0700
Document that cdsStart == cdsEnd marks a non-coding transcript in genePred format, refs #38245

This convention was previously only documented indirectly, as a SQL
filtering tip on the Gene tracks FAQ page. Add it next to the
cdsStart/cdsEnd field declarations in genePred.as, genePredExt.as,
sangerGene.as, ensGene.as, knownGene.as, refFlat.as, genePred.h and
sangerGene.h, and mention it in FAQformat.html and bigGenePred.html
(via the equivalent thickStart == thickEnd check).

diff --git src/hg/htdocs/FAQ/FAQformat.html src/hg/htdocs/FAQ/FAQformat.html
index 3c14911faaa..18d33e436d4 100755
--- src/hg/htdocs/FAQ/FAQformat.html
+++ src/hg/htdocs/FAQ/FAQformat.html
@@ -990,67 +990,69 @@
 and amino acids when zoomed in to the base level.</p>
 
 <a name=GenePredictions></a>
 <p><strong>Gene Predictions</strong></p>
 <p> 
 The following definition is used for gene prediction tables. In alternative-splicing situations, each
 transcript has a row in this table.</p>
 <pre><code>table genePred
 "A gene prediction."
     (
     string  name;               "Name of gene"
     string  chrom;              "Chromosome name"
     char[1] strand;             "+ or - for strand"
     uint    txStart;            "Transcription start position"
     uint    txEnd;              "Transcription end position"
-    uint    cdsStart;           "Coding region start"
-    uint    cdsEnd;             "Coding region end"
+    uint    cdsStart;           "Coding region start; cdsStart == cdsEnd for non-coding transcripts"
+    uint    cdsEnd;             "Coding region end; cdsStart == cdsEnd for non-coding transcripts"
     uint    exonCount;          "Number of exons"
     uint[exonCount] exonStarts; "Exon start positions"
     uint[exonCount] exonEnds;   "Exon end positions"
     )
 </code></pre>
 
 <a name=GenePredExt></a>
 <p><strong>Gene Predictions (Extended)</strong></p>
 <p>
 The following definition is used for extended gene prediction tables. In alternative-splicing 
 situations, each transcript has a row in this table. The refGene table is an example of the 
 genePredExt format.</p>
 <pre><code>table genePredExt
 "A gene prediction with some additional info."
     (
     string name;        	"Name of gene (usually transcript_id from GTF)"
     string chrom;       	"Chromosome name"
     char[1] strand;     	"+ or - for strand"
     uint txStart;       	"Transcription start position"
     uint txEnd;         	"Transcription end position"
-    uint cdsStart;      	"Coding region start"
-    uint cdsEnd;        	"Coding region end"
+    uint cdsStart;      	"Coding region start; cdsStart == cdsEnd for non-coding transcripts"
+    uint cdsEnd;        	"Coding region end; cdsStart == cdsEnd for non-coding transcripts"
     uint exonCount;     	"Number of exons"
     uint[exonCount] exonStarts; "Exon start positions"
     uint[exonCount] exonEnds;   "Exon end positions"
     int score;            	"Score"
     string name2;       	"Alternate name (e.g. gene_id from GTF)"
     string cdsStartStat; 	"Status of CDS start annotation (none, unknown, incomplete, or complete)"
     string cdsEndStat;   	"Status of CDS end annotation (none, unknown, incomplete, or complete)"
     lstring exonFrames; 	"Exon frame offsets {0,1,2}"
     )
 </code></pre>
 <p>The fields cdsStartStat and cdsEndStat can have the following values: 'none' = none,
 'unk' = unknown, 'incmpl' = incomplete, and 'cmpl' = complete. However, the values are not used for
-our display and cannot be used to identify which genes are coding or non-coding. For most purposes,
+our display and cannot be used to identify which genes are coding or non-coding. To determine
+whether a transcript is non-coding, check whether <code>cdsStart</code> equals <code>cdsEnd</code>
+(coding transcripts have <code>cdsStart != cdsEnd</code>). For most purposes,
 to get more information about a transcript, other tables will need to be used.
 For instance, in the case of hg38, the tables named wgEncodeGencodeAttrsVxx, where xx is the
 Gencode Version number. See this <a href="../../FAQ/FAQgenes.html#coding"
 target="_blank">coding/non-coding genes FAQ</a> for more information.</p>
 
 <p>
 <b>The exonFrames field:</b> The field <code>exonFrames</code> is a comma-separated list of the numbers
 with the possible values 0, 1, 2 or -1, one per exon, in order of transcription.
 This is different than the exonStarts and exonEnds fields - if the transcript is on the negative strand,
 exonFrames are in the reverse order relative than exonStarts.
 Put differently, it means that the first value for a transcript on the minus (-) strand is
 the exon on the right of the screen on the Genome Browser. 
 A value of zero means that the first codon of the exon starts at the first nucleotide of the
 exon. A value of one means that the first codon starts after the first
 nucleotide and a value of two means that it starts after the second nucleotide. 
@@ -1059,32 +1061,32 @@
 
 <a name=RefFlat></a>
 <p><strong>Gene Predictions and RefSeq Genes with Gene Names</strong></p>
 <p>
 A version of genePred that associates the gene name with the gene prediction information. In 
 alternative-splicing situations, each transcript has a row in this table.</p>
 <pre><code>table refFlat
 "A gene prediction with additional geneName field."
     (
     string  geneName;           "Name of gene as it appears in Genome Browser."
     string  name;               "Name of gene"
     string  chrom;              "Chromosome name"
     char[1] strand;             "+ or - for strand"
     uint    txStart;            "Transcription start position"
     uint    txEnd;              "Transcription end position"
-    uint    cdsStart;           "Coding region start"
-    uint    cdsEnd;             "Coding region end"
+    uint    cdsStart;           "Coding region start; cdsStart == cdsEnd for non-coding transcripts"
+    uint    cdsEnd;             "Coding region end; cdsStart == cdsEnd for non-coding transcripts"
     uint    exonCount;          "Number of exons"
     uint[exonCount] exonStarts; "Exon start positions"
     uint[exonCount] exonEnds;   "Exon end positions"
     )
 </code></pre>
 
 <a name="format10"></a>
 <h2>Personal Genome SNP format</h2>
 <p>
 This format is for displaying SNPs from personal genomes. It is the same as is used for the Genome 
 Variants and Population Variants tracks.</p>
 <ol>
   <li>
   <strong>chrom</strong> - The name of the chromosome (e.g. chr3, chrY, chr2_random) or scaffold 
   (e.g.  scaffold10671).</li>