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/genePred.h src/hg/inc/genePred.h
index 12eceb05a9e..1781da3deb4 100644
--- src/hg/inc/genePred.h
+++ src/hg/inc/genePred.h
@@ -66,32 +66,32 @@
     genePredName2Fld      = 0x02,  /* name2 field */
     genePredCdsStatFld    = 0x04,  /* cdsStart/EndStat fields */
     genePredExonFramesFld = 0x08,  /* exonFrames field */
     genePredAllFlds       = 0xFF   /* include all extended fields */
 };
 
 struct genePredExt
 /* A gene prediction, with extended fields. */
 {
     struct genePredExt *next;  /* Next in singly linked list. */
     char *name;	/* Name of loci, transcript, mRNA, etc */
     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 */
 
     /* optional fields */
     unsigned optFields;           /* which optional fields are used (not in
                                    * database) */
     int score;                    /* score */
     char *name2;                  /* Secondary name. (e.g. name of gene), or
                                    * empty if none, NULL if field not
                                    * requested */
     enum cdsStatus cdsStartStat;  /* Status of cdsStart annotation */
     enum cdsStatus cdsEndStat;    /* Status of cdsEnd annotation */
     int *exonFrames;              /* Reading frame of the start of the CDS region
                                    * of the exon, in the direction of transcription
@@ -100,32 +100,32 @@
     char *type;
     char *geneName;  
     char *geneName2;
     char *geneType;
 };
 
 struct genePred
 /* A gene prediction, with optional fields. */
 {
     struct genePred *next;  /* Next in singly linked list. */
     char *name;	/* Name of loci, transcript, mRNA, etc */
     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 */
 
     /* optional fields */
     unsigned optFields;           /* which optional fields are used (not in
                                    * database) */
     int score;                    /* score */
     char *name2;                  /* Secondary name. (e.g. name of gene), or
                                    * empty if none, NULL if field not
                                    * requested */
     enum cdsStatus cdsStartStat;  /* Status of cdsStart annotation */
     enum cdsStatus cdsEndStat;    /* Status of cdsEnd annotation */
     int *exonFrames;              /* List of frame for each exon, or -1
                                    * if no frame or not known. NULL if not