51dfe6b3d4acfb1caafbee15bfdba3ea1f18fd43
braney
  Mon Jun 30 15:55:01 2025 -0700
ongoing work on liftOver

diff --git src/hg/hgConvert/hgConvert.c src/hg/hgConvert/hgConvert.c
index 8ff0c85e9a2..ee94a321d1e 100644
--- src/hg/hgConvert/hgConvert.c
+++ src/hg/hgConvert/hgConvert.c
@@ -39,42 +39,46 @@
 static char *database = NULL;
 
 /* Javascript to support New Assembly pulldown when New Genome changes. */
 /* Copies selected values to a hidden form */
 char *onChangeToOrg = "document.mainForm.submit();";
 
 static struct dbDb *matchingDb(struct dbDb *list, char *name)
 /* Find database of given name in list or die trying. */
 {
 struct dbDb *db;
 for (db = list; db != NULL; db = db->next)
     {
     if (sameString(name, db->name))
         return db;
     }
+
+struct dbDb *toDb =  genarkLiftOverDb(name);
+if (toDb == NULL)
     errAbort("Can't find %s in matchingDb", name);
-return NULL;
+return toDb;
 }
 
 static void askForDestination(struct liftOverChain *liftOver, char *fromPos,
 	struct dbDb *fromDb, struct dbDb *toDb)
 /* set up page for entering data */
 {
 struct dbDb *dbList;
 boolean askAboutQuickLift = FALSE;
+boolean quickLiftChainExists =  (quickLiftGetChain(fromDb->name, toDb->name) != 0);
 
-if (quickLiftEnabled())
+if (quickLiftEnabled() && quickLiftChainExists)
     askAboutQuickLift = TRUE;
 
 cartWebStart(cart, database, "Convert %s to New Assembly", fromPos);
 
 /* create HMTL form */
 puts("<FORM ACTION=\"../cgi-bin/hgConvert\" NAME=\"mainForm\">\n");
 cartSaveSession(cart);
 
 /* create HTML table for layout purposes */
 puts("\n<TABLE WIDTH=\"100%%\">\n");
 
 /* top row -- labels */
 cgiSimpleTableRowStart();
 cgiTableField("Old genome: ");
 cgiTableField("Old assembly: ");
@@ -267,30 +271,36 @@
     next = chain->next;
     chainSubsetOnT(chain, start, end, &subChain, &chainToFree);
     if (subChain != NULL)
 	slAddHead(&chainList, subChain);
     if (chainToFree != NULL)
         chainFree(&chain);
     }
 slSort(&chainList, chainCmpScore);
 return chainList;
 }
 
 static void doConvert(char *fromPos)
 /* Actually do the conversion */
 {
 struct dbDb *fromDb = hDbDb(trackHubSkipHubName(database)), *toDb = hDbDb(cartString(cart, HGLFT_TODB_VAR));
+
+if (fromDb == NULL)
+    fromDb =  genarkLiftOverDbs(database);
+if (toDb == NULL)
+    toDb =  genarkLiftOverDb(cartString(cart, HGLFT_TODB_VAR));
+
 if (!fromDb || !toDb)
     errAbort("Early error - unable to find matching database records in dbDb - please contact support");
 
 cartWebStart(cart, database, "%s %s %s to %s %s", fromDb->organism, fromDb->description,
 	fromPos, toDb->organism, toDb->description);
 
 char *fileName = liftOverChainFile(fromDb->name, toDb->name);
 if (isEmpty(fileName))
     errAbort("Unable to find a chain file from %s to %s - please contact support", fromDb->name, toDb->name);
 
 fileName = hReplaceGbdbMustDownload(fileName);
 char *chrom;
 int start, end;
 int origSize;
 struct chain *chainList, *chain;
@@ -341,65 +351,73 @@
 	    qStart = chain->qStart;
 	    qEnd = chain->qEnd;
 	    }
 	blockSize = chainTotalBlockSize(chain);
         /* Check if the toDb database exists and if the chromosome
            sequence file (of the hgConvert result) exists in the location
            specified in chromInfo for the toDb. */
 
         boolean chromSeqExists = (sqlDatabaseExists(toDb->name) &&
 				  chromSeqFileExists(toDb->name, chain->qName));
         /* Check if the toDb has active set to 1 in dbDb if the toDb
            database exists.
            If these conditions are met then print position link to
            browser for toDb, otherwise just print position without link. */
         boolean startedAnchor = FALSE;
+        visDy = newDyString(20);
         if ((hDbIsActive(toDb->name) && chromSeqExists) || startsWith("hub:",toDb->nibPath))
             {
             if (quickChain)
                 printf("<A HREF=\"%s?db=%s&position=%s:%d-%d&quickLift.%d.%s=%d\">",
                    hgTracksName(), toDb->name,  chain->qName, qStart+1, qEnd, quickHub, toDb->name, quickChain);
             else
                 printf("<A HREF=\"%s?db=%s&position=%s:%d-%d\">",
 		   hgTracksName(), toDb->name, chain->qName, qStart+1, qEnd);
             startedAnchor = TRUE;
             }
         else if (sameString(toDb->nibPath, "genark"))
             {
             char *hubUrl = genarkUrl(toDb->name);
             if (hubUrl)
                 {
                 startedAnchor = TRUE;
                 if (quickChain)
-                    printf("<A HREF=\"%s?genome=%s&hubUrl=%s&position=%s:%d-%d&quickLift.%d.%s=%d\">",
-                       hgTracksName(), toDb->name, hubUrl, chain->qName, qStart+1, qEnd, quickHub, toDb->name, quickChain);
+                    printf("<A HREF=\"%s?hgsid=%s&genome=%s&hubUrl=%s&position=%s:%d-%d&quickLift.%d.%s=%d\">",
+                       hgTracksName(), cartSessionId(cart), toDb->name, hubUrl, chain->qName, qStart+1, qEnd, quickHub, toDb->name, quickChain);
                 else
-                    printf("<A HREF=\"%s?genome=%s&hubUrl=%s&position=%s:%d-%d\">",
-                       hgTracksName(), toDb->name, hubUrl, chain->qName, qStart+1, qEnd);
+                    printf("<A HREF=\"%s?hgsid=%s&genome=%s&hubUrl=%s&position=%s:%d-%d\">",
+                       hgTracksName(), cartSessionId(cart), toDb->name, hubUrl, chain->qName, qStart+1, qEnd);
                 }
             }
 	printf("%s:%d-%d",  chain->qName, qStart+1, qEnd);
         if (startedAnchor)
 	    printf("</A>");
 	printf(" (%3.1f%% of bases, %3.1f%% of span)<BR>\n",
 	    100.0 * blockSize/origSize,
 	    100.0 * (chain->tEnd - chain->tStart) / origSize);
 	}
     }
 if (badList)
+    {
+    printf("<BR>Some of your tracks failed to lift because the type is not supported by quickLift.<BR><BR>");
+    printf("<TABLE><TR><TD><B>Short label<TD><B>Type</TD></TR>");
     for(; badList; badList = badList->next)
-        printf("%s %s<BR>", badList->track, badList->type);
+        {
+        printf("<TR><TD>%s</TD><TD>%s</TD></TR>", badList->shortLabel, badList->type);
+        }
+    printf("</TABLE>");
+    }
 cartWebEnd();
 }
 
 static struct liftOverChain *cleanLiftOverList(struct liftOverChain *list)
 /* eliminate from the list where toDb doesn't exist in dbDb */
 {
 struct liftOverChain *cleanList = NULL;
 struct hash *dbDbHash = hDbDbHash();
 struct liftOverChain *this = NULL;
 struct liftOverChain *next = NULL;
 for (this = list; this != NULL; this = next)
     {
     next = this->next;
     if (hashLookup(dbDbHash, this->toDb))
         slAddHead(&cleanList, this);