9171b3f661fe87a3bc4f3e02c0593699510cc152
markd
  Wed Jun 24 05:49:12 2015 -0700
add option to gtfToGenePred to include gene and transcript version number that now part of their GTF files in the gene/transcripts ids (no redmine)

diff --git src/hg/lib/genePred.c src/hg/lib/genePred.c
index b5d690d..cb671bb 100644
--- src/hg/lib/genePred.c
+++ src/hg/lib/genePred.c
@@ -842,67 +842,75 @@
 else if (stopCodonStart >= 0)
     {
     /* adjust CDS to include stop codon as in GTF */
     if (group->strand == '+')
         {
         if (stopCodonEnd > cdsEnd)
             cdsEnd = stopCodonEnd;
         }
     else
         {
         if (stopCodonStart < cdsStart)
             cdsStart = stopCodonStart;
         }
     }
 
+/* add in version numbers if requested and available */
+char geneIdToUse[512], transcriptIdToUse[512];
+geneIdToUse[0]= '\0';
+if (options & genePredGxfGeneNameAsName2)
+    {
+    if (group->lineList->geneName != NULL)
+        safecpy(geneIdToUse, sizeof(geneIdToUse), group->lineList->geneName);
+    }
+else if (group->lineList->geneId != NULL)
+    {
+    if (genePredGxfIncludeVersion && (group->lineList->geneVersion != NULL))
+        safef(geneIdToUse, sizeof(geneIdToUse), "%s.%s", group->lineList->geneId, group->lineList->geneVersion);
+    else
+        safecpy(geneIdToUse, sizeof(geneIdToUse), group->lineList->geneId);
+    }
+if (genePredGxfIncludeVersion && (group->lineList->transcriptVersion != NULL))
+    safef(transcriptIdToUse, sizeof(transcriptIdToUse), "%s.%s", name, group->lineList->transcriptVersion);
+else
+    safecpy(transcriptIdToUse, sizeof(transcriptIdToUse), name);
+
+
 /* Allocate genePred and fill in values. */
 AllocVar(gp);
-gp->name = cloneString(name);
+gp->name = cloneString(transcriptIdToUse);
 gp->chrom = cloneString(group->seq);
 gp->strand[0] = group->strand;
 gp->txStart = geneStart;
 gp->txEnd = geneEnd;
 if (cdsStart < cdsEnd)
     {
     gp->cdsStart = cdsStart;
     gp->cdsEnd = cdsEnd;
     }
 else
     {
     // no CDS, set to txEnd
     gp->cdsStart = gp->txEnd;
     gp->cdsEnd = gp->txEnd;
     }
 gp->exonStarts = AllocArray(eStarts, exonCount);
 gp->exonEnds = AllocArray(eEnds, exonCount);
 gp->optFields = optFields;
 
 if (optFields & genePredName2Fld)
-    {
-    if (options & genePredGxfGeneNameAsName2)
-        {
-        if (group->lineList->geneName != NULL)
-            gp->name2 = cloneString(group->lineList->geneName);
-        }
-    else
-        {
-        if (group->lineList->geneId != NULL)
-            gp->name2 = cloneString(group->lineList->geneId);
-        }
-    if (gp->name2 == NULL)
-        gp->name2 = cloneString("");
-    }
+    gp->name2 = cloneString(geneIdToUse);
 if (optFields & genePredCdsStatFld)
     {
     if (cdsStart < cdsEnd)
         {
         if (!useStartStops)
             {
             /* GFF doesn't require start or stop, if not used, assume complete */
             gp->cdsStartStat = cdsComplete;
             gp->cdsEndStat = cdsComplete;
             }
         else if (group->strand == '+')
             {
             gp->cdsStartStat = (haveStartCodon ? cdsComplete : cdsIncomplete);
             gp->cdsEndStat = (haveStopCodon ? cdsComplete : cdsIncomplete);;
             }