483878d23907da9695facf9610aa986208f0a1d7 galt Fri May 9 11:26:36 2025 -0700 Revert "Simplify use of BLAT results by always creating a custom track. fixes #32751" This reverts commit a5a45be7e379b64278e667f80c75cc0cc41d9ea4. diff --git src/hg/hgBlat/hgBlat.c src/hg/hgBlat/hgBlat.c index 691ccbf9cc9..220789493a5 100644 --- src/hg/hgBlat/hgBlat.c +++ src/hg/hgBlat/hgBlat.c @@ -490,40 +490,61 @@ return same; } boolean allDigits(char *s) /* Return TRUE if s is all digits */ { char c; while ((c = *s++) != 0) if (!isdigit(c)) return FALSE; return TRUE; } +void printLuckyRedirect(char *browserUrl, struct psl *psl, char *database, char *pslName, + char *faName, char *uiState, char *unhideTrack) +/* Print out a very short page that redirects us. */ +{ +char url[1024]; +safef(url, sizeof(url), "%s?position=%s:%d-%d&db=%s&ss=%s+%s&%s%s", + browserUrl, psl->tName, psl->tStart + 1, psl->tEnd, database, + pslName, faName, uiState, unhideTrack); +/* htmlStart("Redirecting"); */ +/* Odd it appears that we've already printed the Content-Typ:text/html line + but I can't figure out where... */ +htmStart(stdout, "Redirecting"); +jsInlineF("location.replace('%s');\n", url); +printf("\n", url); +htmlEnd(); + +} + + /* forward declaration to reduce churn */ static void getCustomName(char *database, struct cart *cart, struct psl *psl, char **pName, char **pDescription); void showAliPlaces(char *pslName, char *faName, char *customText, char *database, enum gfType qType, enum gfType tType, char *organism, boolean feelingLucky) /* Show all the places that align. */ { +boolean useBigPsl = cfgOptionBooleanDefault("useBlatBigPsl", TRUE); struct lineFile *lf = pslFileOpen(pslName); struct psl *pslList = NULL, *psl; +char *browserUrl = hgTracksName(); char *hgcUrl = hgcName(); char uiState[64]; char *vis; char unhideTrack[64]; char *sort = cartUsualString(cart, "sort", pslSortList[0]); char *output = cartUsualString(cart, "output", outputList[0]); boolean pslOut = startsWith("psl", output); boolean pslRawOut = sameWord("pslRaw", output); boolean jsonOut = sameWord(output, "json"); sprintf(uiState, "%s=%s", cartSessionVarName(), cartSessionId(cart)); /* If user has hidden BLAT track, add a setting that will unhide the track if user clicks on a browser link. */ vis = cartOptionalString(cart, "hgUserPsl"); @@ -537,84 +558,199 @@ if (psl->match >= minMatchShown) slAddHead(&pslList, psl); } lineFileClose(&lf); if (pslList == NULL && !jsonOut) { printf("
Sorry, no matches found"); if (!allResults) printf(" (with a score of at least %d)", minMatchShown); printf(" |
"); if (!sameString(output, "psl no header")) pslxWriteHead(stdout, qType, tType); for (psl = pslList; psl != NULL; psl = psl->next) pslTabOut(psl, stdout); if (pslRawOut) exit(0); printf("\n"); + webNewSection("Help"); + puts(""); printf(""); } else if (jsonOut) { webStartText(); pslWriteAllJson(pslList, stdout, database, TRUE); exit(0); } else // hyperlink { + printf("BLAT Search Results
"); + char* posStr = cartOptionalString(cart, "position"); + if (posStr != NULL) + printf("Go back to %s on the Genome Browser.
\n", browserUrl, posStr); + if (useBigPsl) + { char *trackName = NULL; char *trackDescription = NULL; getCustomName(database, cart, pslList, &trackName, &trackDescription); psl = pslList; printf( ""); + } - printf("\n", trackName); + printf(""); - jsInline("$(document).ready(function() {\n" - "$(\"input[value='Create custom track']\").trigger('click');\n" - "});\n"); + printf(" ACTIONS QUERY "); + + spaceOut(stdout, maxQChromNameSize - 5); + + printf("SCORE START END QSIZE IDENTITY CHROM "); + spaceOut(stdout, maxTChromNameSize - 5); + + printf(" STRAND START END SPAN\n"); + + printf("----------------------------------------------------------------------------------------------------------"); + repeatCharOut(stdout, '-', maxQChromNameSize - 5); + repeatCharOut(stdout, '-', maxTChromNameSize - 5); + + printf("\n"); + + for (psl = pslList; psl != NULL; psl = psl->next) + { + char *browserHelp = "Open a Genome Browser showing this match"; + char *helpText = "Open a Genome Browser with the BLAT results, but in a new internet browser tab"; + // XX putting SVG into C code like this is ugly. define somewhere? maybe have globals for these? + char *icon = ""; + if (customText) + { + printf("browser ", + browserHelp, browserUrl, psl->tName, psl->tStart + 1, psl->tEnd, database, + customText, uiState, unhideTrack); + printf("new tab%s ", + helpText, browserUrl, psl->tName, psl->tStart + 1, psl->tEnd, database, + customText, unhideTrack, icon); + } + else + { + printf("browser ", + browserHelp, browserUrl, psl->tName, psl->tStart + 1, psl->tEnd, database, + pslName, faName, uiState, unhideTrack); + printf("new tab%s ", + helpText, browserUrl, psl->tName, psl->tStart + 1, psl->tEnd, database, + pslName, faName, unhideTrack, icon); + } + printf("", + hgcUrl, psl->tStart, pslName, cgiEncode(faName), psl->qName, psl->tName, + psl->tStart, psl->tEnd, database, uiState); + printf("details "); + + printf("%s",psl->qName); + spaceOut(stdout, maxQChromNameSize - strlen(psl->qName)); + printf(" %5d %5d %5d %5d %5.1f%% ", + pslScore(psl), psl->qStart+1, psl->qEnd, psl->qSize, + 100.0 - pslCalcMilliBad(psl, TRUE) * 0.1); + char *displayChromName = chromAliasGetDisplayChrom(database, cart, psl->tName); + printf("%s",displayChromName); + spaceOut(stdout, maxTChromNameSize - strlen(displayChromName)); + printf(" %-2s %9d %9d %6d", + psl->strand, psl->tStart+1, psl->tEnd, + psl->tEnd - psl->tStart); + + // if you modify this, also modify hgPcr.c:doQuery, which implements a similar feature + char *seq = psl->tName; + if (endsWith(seq, "_fix")) + printf(" What is chrom_fix?"); + else if (endsWith(seq, "_alt")) + printf(" What is chrom_alt?"); + else if (endsWith(seq, "_random")) + printf(" What is chrom_random?"); + else if (startsWith(seq, "chrUn")) + printf(" What is a chrUn sequence?"); + printf("\n"); + } + printf(""); - printf("\n", trackDescription); + // find maximum query name size for padding calculations and + // find maximum target chrom name size for padding calculations + int maxQChromNameSize = 0; + int maxTChromNameSize = 0; + for (psl = pslList; psl != NULL; psl = psl->next) + { + int qLen = strlen(psl->qName); + maxQChromNameSize = max(maxQChromNameSize,qLen); + int tLen = strlen(psl->tName); + maxTChromNameSize = max(maxTChromNameSize,tLen); + } + maxQChromNameSize = max(maxQChromNameSize,5); + maxTChromNameSize = max(maxTChromNameSize,5); - printf(""); - printf(" \n"); - puts("
Missing a match?
");
+ puts("What is chr_alt & chr_fix?