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/inc/sangerGene.h src/hg/inc/sangerGene.h
index 77e1626fe86..4dbd4c39ad1 100644
--- src/hg/inc/sangerGene.h
+++ src/hg/inc/sangerGene.h
@@ -1,70 +1,70 @@
 /* sangerGene.h was originally generated by the autoSql program, which also 
  * generated sangerGene.c and sangerGene.sql.  This header links the database and
  * the RAM representation of objects. */
 
 /* Copyright (C) 2004 The Regents of the University of California 
  * See kent/LICENSE or http://genome.ucsc.edu/license/ for licensing information. */
 
 #ifndef SANGERGENE_H
 #define SANGERGENE_H
 
 #define SANGERGENE_NUM_COLS 11
 
 struct sangerGene
 /* GenePred table with proteinID field for WormBase Genes. */
     {
     struct sangerGene *next;  /* Next in singly linked list. */
     char *name;	/* Name of gene */
     char *chrom;	/* Chromosome name */
     char strand[2];	/* + or - for strand */
     unsigned txStart;	/* Transcription start position */
     unsigned txEnd;	/* Transcription end position */
-    unsigned cdsStart;	/* Coding region start */
-    unsigned cdsEnd;	/* Coding region end */
+    unsigned cdsStart;	/* Coding region start; cdsStart == cdsEnd for non-coding transcripts */
+    unsigned cdsEnd;	/* Coding region end; cdsStart == cdsEnd for non-coding transcripts */
     unsigned exonCount;	/* Number of exons */
     unsigned *exonStarts;	/* Exon start positions */
     unsigned *exonEnds;	/* Exon end positions */
     char *proteinID;	/* Swiss-Prot protein ID */
     };
 
 struct sangerGene *sangerGeneLoad(char **row);
 /* Load a sangerGene from row fetched with select * from sangerGene
  * from database.  Dispose of this with sangerGeneFree(). */
 
 struct sangerGene *sangerGeneLoadAll(char *fileName);
 /* Load all sangerGene from whitespace-separated file.
  * Dispose of this with sangerGeneFreeList(). */
 
 struct sangerGene *sangerGeneLoadAllByChar(char *fileName, char chopper);
 /* Load all sangerGene from chopper separated file.
  * Dispose of this with sangerGeneFreeList(). */
 
 #define sangerGeneLoadAllByTab(a) sangerGeneLoadAllByChar(a, '\t');
 /* Load all sangerGene from tab separated file.
  * Dispose of this with sangerGeneFreeList(). */
 
 struct sangerGene *sangerGeneCommaIn(char **pS, struct sangerGene *ret);
 /* Create a sangerGene out of a comma separated string. 
  * This will fill in ret if non-null, otherwise will
  * return a new sangerGene */
 
 void sangerGeneFree(struct sangerGene **pEl);
 /* Free a single dynamically allocated sangerGene such as created
  * with sangerGeneLoad(). */
 
 void sangerGeneFreeList(struct sangerGene **pList);
 /* Free a list of dynamically allocated sangerGene's */
 
 void sangerGeneOutput(struct sangerGene *el, FILE *f, char sep, char lastSep);
 /* Print out sangerGene.  Separate fields with sep. Follow last field with lastSep. */
 
 #define sangerGeneTabOut(el,f) sangerGeneOutput(el,f,'\t','\n');
 /* Print out sangerGene as a line in a tab-separated file. */
 
 #define sangerGeneCommaOut(el,f) sangerGeneOutput(el,f,',',',');
 /* Print out sangerGene as a comma separated list including final comma. */
 
 /* -------------------------------- End autoSql Generated Code -------------------------------- */
 
 #endif /* SANGERGENE_H */