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);