1d4663b313f73cf69360c84c3c123821f15cee26
braney
  Sat Aug 9 11:49:49 2025 -0700
some fixes for hgLiftOver using Genark hubs

diff --git src/hg/hgLiftOver/hgLiftOver.c src/hg/hgLiftOver/hgLiftOver.c
index 58c3a21edbc..ce8f0b789d2 100644
--- src/hg/hgLiftOver/hgLiftOver.c
+++ src/hg/hgLiftOver/hgLiftOver.c
@@ -8,30 +8,31 @@
 #include "jksql.h"
 #include "portable.h"
 #include "linefile.h"
 #include "dnautil.h"
 #include "fa.h"
 #include "cheapcgi.h"
 #include "htmshell.h"
 #include "hdb.h"
 #include "hui.h"
 #include "cart.h"
 #include "web.h"
 #include "hash.h"
 #include "liftOver.h"
 #include "liftOverChain.h"
 #include "errCatch.h"
+#include "hgConfig.h"
 
 
 /* CGI Variables */
 #define HGLFT_USERDATA_VAR "hglft_userData"     /* typed/pasted in data */
 #define HGLFT_DATAFILE_VAR "hglft_dataFile"     /* file of data to convert */
 #define HGLFT_FROMORG_VAR "hglft_fromOrg"         /* FROM organism */
 #define HGLFT_FROMDB_VAR "hglft_fromDb"         /* FROM assembly */
 #define HGLFT_TOORG_VAR   "hglft_toOrg"           /* TO organism */
 #define HGLFT_TODB_VAR   "hglft_toDb"           /* TO assembly */
 #define HGLFT_ERRORHELP_VAR "hglft_errorHelp"      /* Print explanatory text */
 #define HGLFT_REFRESHONLY_VAR "hglft_doRefreshOnly"      /* Just refresh drop-down lists */
 #define HGLFT_LAST_CHAIN "hglft_lastChain"
 #define HGLFT_EXTRA_NAME_INFO "hglft_extranameinfo" /* Include input position in output item names */
 
 /* liftOver options: */
@@ -106,31 +107,33 @@
 /* genome */
 cgiSimpleTableFieldStart();
 dbList = hGetLiftOverFromDatabases();
 printSomeGenomeListHtmlNamed(HGLFT_FROMORG_VAR, chain->fromDb, dbList, "change", onChange);
 cgiTableFieldEnd();
 
 /* from assembly */
 cgiSimpleTableFieldStart();
 printAllAssemblyListHtmlParm(chain->fromDb, dbList, HGLFT_FROMDB_VAR, 
 			     TRUE, "change", onChange);
 cgiTableFieldEnd();
 
 /* to assembly */
 
 cgiSimpleTableFieldStart();
-dbDbFreeList(&dbList);
+// Genark is generating some less than fully populated dbDb structures
+// so we don't expect them to free without causing problems.
+//dbDbFreeList(&dbList);   
 dbList = hGetLiftOverToDatabases(chain->fromDb);
 printLiftOverGenomeList(HGLFT_TOORG_VAR, chain->toDb, dbList, "change", onChange);
 cgiTableFieldEnd();
 
 cgiSimpleTableFieldStart();
 printAllAssemblyListHtmlParm(chain->toDb, dbList, HGLFT_TODB_VAR, TRUE, NULL, NULL);
 cgiTableFieldEnd();
 
 cgiTableRowEnd();
 cgiTableEnd();
 
 printf("<br>");
 cgiSimpleTableStart();
 
 cgiSimpleTableRowStart();
@@ -428,42 +431,59 @@
 if (sameWord(fromOrg,"0"))
     fromOrg = NULL;
 if (sameWord(fromDb,"0"))
     fromDb = NULL;
 if (sameWord(toOrg,"0"))
     toOrg = NULL;
 if (sameWord(toDb,"0"))
     toDb = NULL;
 if (sameWord(cartDb,"0"))
     cartDb = NULL;
 if ((fromDb != NULL) && !sameOk(fromOrg, hOrganism(fromDb)))
     fromDb = NULL;
 if ((toDb != NULL) && !sameOk(toOrg, hOrganism(toDb)))
     toDb = NULL;
 
+boolean choiceBestScore = FALSE;
 for (this = chainList; this != NULL; this = this->next)
     {
     if (sameOk(this->fromDb ,fromDb) && sameOk(this->toDb, toDb))
         {
         choice = this;
+        choiceBestScore = FALSE;
         break;
         }
     double score = scoreLiftOverChain(this, fromOrg, fromDb, toOrg, toDb, cartOrg, cartDb, dbRank, dbDbHash);
     if (score > bestScore)
 	{
 	choice = this;
 	bestScore = score;
+        choiceBestScore = TRUE;
+	}
+    }
+
+// the scoring regime is not working correctly with genark assemblies to get
+// the user selected fromDb even if there is a change for it.
+if (cfgOptionBooleanDefault("genarkLiftOver", FALSE) && choiceBestScore && !sameOk(choice->fromDb ,fromDb))
+    {
+    for (this = chainList; this != NULL; this = this->next)
+        {
+        if (sameOk(this->fromDb ,fromDb))
+            {
+            choice = this;
+            break;
+            }
         }
     }
 
 return choice;
 }
 
 
 void doMiddle(struct cart *theCart)
 /* Set up globals and make web page */
 {
 char *userData;
 char *organism;
 char *db;
 float minBlocks, minMatch;
 boolean multiple, fudgeThick;