e9ccb4f7902ee99e47a8d6ffabd55f396bf7ccf7
angie
  Thu Nov 21 09:47:12 2013 -0800
vintage 2005 bug -- genePredNmdTarget was practically guaranteed toreturn FALSE for genes on the - strand because it was comparing a
relative coord to an absolute coord.

diff --git src/hg/lib/genePred.c src/hg/lib/genePred.c
index 7735fca..bc364ea 100644
--- src/hg/lib/genePred.c
+++ src/hg/lib/genePred.c
@@ -1590,57 +1590,57 @@
 /* check each exon */
 for (iExon = 0; iExon < gp->exonCount; iExon++)
     checkExon(desc, gp, iExon);
 
 return gpErrorCnt;
 }
 
 boolean genePredNmdTarget(struct genePred *gp) 
 /* Return TRUE if cds end is more than 50bp upstream of
    last intron. */
 {
 int gpSize = 0;
 int i = 0;
 int startDist = 0, endDist = 0;
 int blockSize = 0;
-if(gp->exonCount < 2)
+if(gp->exonCount < 2 || gp->cdsStart == gp->cdsEnd)
     return FALSE;
 for(i = 0; i < gp->exonCount; i++)
     {
     int blockStart = gp->exonStarts[i];
     int blockEnd = gp->exonEnds[i];
     blockSize = blockEnd - blockStart;
     if( blockStart <= gp->cdsStart && gp->cdsStart <= blockEnd)
 	startDist += blockSize - (blockEnd - gp->cdsStart);
     else if(blockEnd <= gp->cdsStart)
 	startDist += blockSize;
     if( blockStart <= gp->cdsEnd && gp->cdsEnd <= blockEnd)
 	endDist += blockSize - (blockEnd - gp->cdsEnd);
     else if(blockEnd <= gp->cdsEnd)
 	endDist += blockSize;
     gpSize += blockSize;
     }
 /*  xxxxxXXX----XXXXXXXXXXXXX--------XXXXXXX----XXXxxxxxxxx-------xxxxxxxxx  */                                           
 if(sameString(gp->strand, "+"))
     {
     blockSize = gp->exonEnds[gp->exonCount-1] - gp->exonStarts[gp->exonCount-1];
     return endDist < (gpSize - blockSize - 50); 
     }
 else if(sameString(gp->strand, "-"))
     {
     blockSize = gp->exonEnds[0] - gp->exonStarts[0];
-    return startDist > (gp->exonEnds[1] + 50);
+    return startDist > (blockSize + 50);
     }
 else 
     errAbort("genePredNmdsTarget() - Don't recognize strand: %s\n", gp->strand);
 return FALSE;
 }
 
 void genePredAddExonFrames(struct genePred *gp)
 /* Add exonFrames array to a genePred that doesn't have it. Frame is assumed
  * to be contiguous. */
 {
 int iExon, start, end, iBase = 0;
 int iStart, iEnd, iDir;
 
 /* initial array to all -1, for no frame */
 AllocArray(gp->exonFrames, gp->exonCount);