83ccf1c6b15c91b83723894b882f3af1e340882b
braney
  Sun Jun 1 16:37:23 2025 -0700
exon frames are in transcription strand order so if it's changed during quickLift we need to flip the order in the genePred

diff --git src/hg/hgTracks/bigBedTrack.c src/hg/hgTracks/bigBedTrack.c
index 681ea8be10a..97a741c2431 100644
--- src/hg/hgTracks/bigBedTrack.c
+++ src/hg/hgTracks/bigBedTrack.c
@@ -776,31 +776,38 @@
                 }
             continue; // lf will be NULL, but these items aren't "filtered", they're merged
             }
 	}
 
     if (lf == NULL)
         {
         filtered++;
         continue;
         }
 
     if (lf->label == NULL)
         lf->label = bigBedMakeLabel(track->tdb, track->labelColumns,  bb, chromName);
     if (startsWith("bigGenePred", track->tdb->type) || startsWith("genePred", track->tdb->type))
         {
-        lf->original = genePredFromBedBigGenePred(chromName, bedCopy, bb); 
+        // bedRow[5] has original strand in it, bedCopy has new strand.  If they're different we want to reverse exonFrames
+        boolean changedStrand = FALSE;
+        if (quickLiftFile)
+            {
+            if (*bedRow[5] != *bedCopy->strand)
+                changedStrand = TRUE;
+            }
+        lf->original = genePredFromBedBigGenePred(chromName, bedCopy, bb, changedStrand); 
         }
 
     if (startsWith("bigBed", track->tdb->type))
         {
         // Clone bb so that we'll have access the to extra fields contents.  This is used in
         // alternate display modes for bigBeds (so far just "heatmap", but more are likely to come).
         struct bigBedInterval *bbCopy = CloneVar(bb);
         bbCopy->rest = cloneMem(bbCopy->rest, strlen(bbCopy->rest)+1);
         bbCopy->next = NULL;
         lf->original = bbCopy;
         }
 
     if (lf->mouseOver == NULL)
         {
         if (mouseOverIdx > 0)