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;