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/hgc/hgc.c src/hg/hgc/hgc.c
index d2ffbf54a87..35db5935b93 100644
--- src/hg/hgc/hgc.c
+++ src/hg/hgc/hgc.c
@@ -3352,38 +3352,30 @@
 struct bbiFile *bbi =  bigBedFileOpenAlias(fileName, chromAliasFindAliases);
 struct lm *lm = lmInit(0);
 int ivStart = start, ivEnd = end;
 
 if (start == end)
     {  
     // item is an insertion; expand the search range from 0 bases to 2 so we catch it:
     ivStart = max(0, start-1);
     ivEnd++;
     }  
 
 if (cfgOptionBooleanDefault("drawDot", FALSE))
     bigPslDotPlot(tdb, bbi, seqName, winStart, winEnd);
 
 boolean showEvery = sameString(item, "PrintAllSequences");
-boolean buildBigPsl = FALSE;
-if (sameString(item, "buildBigPsl"))
-    {
-    buildBigPsl = TRUE;
-    showEvery = TRUE;
-    item = cloneString("PrintAllSequences");
-    }
-
 boolean showAll = trackDbSettingOn(tdb, "showAll");
 unsigned seqTypeField =  bbExtraFieldIndex(bbi, "seqType");
 struct bigBedInterval *bb, *bbList = NULL;
 
 // If showAll is on, show all alignments with this qName, not just the
 // selected one.
 if (showEvery)
     {
     struct bbiChromInfo *chrom, *chromList = bbiChromList(bbi);
     for (chrom = chromList; chrom != NULL; chrom = chrom->next)
         {
         char *chromName = chrom->name;
         int start = 0, end = chrom->size;
         int itemsLeft = 0;  // Zero actually means no limit.... 
         struct bigBedInterval *intervalList = bigBedIntervalQuery(bbi, chromName,
@@ -3422,99 +3414,30 @@
             if (itemForUrl)
                 printIframe(tdb, itemForUrl);
             printPos(seqName, ivStart, ivEnd, strand, FALSE, item);
             int printCount = extraFieldsPrint(tdb,NULL,extraFields, extraFieldCount);
             printCount += 0;
             }
         }
     }
 
 char *bedRow[32];
 char startBuf[16], endBuf[16];
 
 int lastChromId = -1;
 char chromName[bbi->chromBpt->keySize+1];
 
-if (buildBigPsl)
-    {
-
-    char *browserUrl = hgTracksName();
-    char* posStr = cartOptionalString(cart, "position");
-    if (posStr != NULL)
-        printf("<P>Go back to <A HREF=\"%s\">%s</A> on the Genome Browser.</P>\n", browserUrl, posStr);
-    
-    printf("<FORM ACTION=\"%s?hgsid=%s&db=%s\" NAME=\"MAIN_FORM\" METHOD=%s>\n\n",
-	hgTracksName(), cartSessionId(cart), database, cartUsualString(cart, "formMethod", "POST"));
-
-    cartSaveSession(cart);
-
-    cgiMakeButton(CT_DO_REMOVE_VAR, "Remove custom track");
-    cgiMakeHiddenVar(CT_SELECTED_TABLE_VAR, tdb->track);
-    printf("</FORM>\n");
-
-
-    // new re-submit code with new trackname and decription
-
-    printf("<div id=renameFormItem style='display: block'>\n");
-    printf("<FORM ACTION=>\n");
-    printf("<INPUT TYPE=SUBMIT NAME=Submit id='showRenameForm' VALUE=\"Rename Custom Track\">\n");
-    printf("</FORM>\n");
-    printf("</div>\n");
-
-    printf("<div id=renameForm style='display: none'>\n");
-    char *hgcUrl = hgcName();
-    printf( "<DIV STYLE=\"display:block;\"><FORM ACTION=\"%s\"  METHOD=\"%s\" NAME=\"customTrackForm\">\n", hgcUrl,cartUsualString(cart, "formMethod", "POST"));
-    printf("<INPUT TYPE=\"hidden\" name=\"o\" value=\"%d\" />\n",cgiInt("o"));
-    printf("<INPUT TYPE=\"hidden\" name=\"t\" value=\"%d\" />\n",cgiInt("t"));
-    printf("<INPUT TYPE=\"hidden\" name=\"g\" value=\"%s\" />\n","buildBigPsl");
-    printf("<INPUT TYPE=\"hidden\" name=\"i\" value=\"%s\" />\n",cgiString("i"));
-    printf("<INPUT TYPE=\"hidden\" name=\"c\" value=\"%s\" />\n",cgiString("c")); // orig psl->tName);
-    printf("<INPUT TYPE=\"hidden\" name=\"l\" value=\"%d\" />\n",cgiInt("l"));
-    printf("<INPUT TYPE=\"hidden\" name=\"r\" value=\"%d\" />\n",cgiInt("r"));
-    printf("<INPUT TYPE=\"hidden\" name=\"%s\" value=\"%s\" />\n",  cartSessionVarName(), cartSessionId(cart));
-    if (cgiOptionalString("isProt"))
-	printf("<INPUT TYPE=\"hidden\" name=\"isProt\" value=\"on\" />\n");
-
-    printf("<TABLE><TR><TD>Custom track name: ");
-    cgiMakeTextVar( "trackName", tdb->shortLabel, 30);
-    printf("</TD></TR>");
-
-
-    printf("<TR><TD> Custom track description: ");
-    cgiMakeTextVar( "trackDescription", tdb->longLabel,50);
-    printf("</TD></TR>");
-
-    // remove the current blat ct so we can create a new one.
-    cgiMakeHiddenVar(CT_DO_REMOVE_VAR, "Remove custom track");
-    cgiMakeHiddenVar(CT_SELECTED_TABLE_VAR, tdb->track);
-
-    printf("<TR><TD><INPUT TYPE=SUBMIT NAME=Submit VALUE=\"Submit\">\n");
-    puts("</TD></TR>");
-    printf("</TABLE></FORM></DIV>");
-
-
-    printf("</div>\n");
-
-    jsInline("$('#showRenameForm').click(function(){\n"
-	    "  $('#renameForm')[0].style.display = 'block';\n"
-	    "  $('#renameFormItem')[0].style.display = 'none';\n"
-	    "  $('#showRenameForm')[0].style.display = 'none';\n"
-	    "return false;\n"
-	    "});\n");
-
-    }
-
 boolean firstTime = TRUE;
 struct hash *seqHash = hashNew(0);
 struct dyString *sequencesText = dyStringNew(256);
 int sequencesFound = 0;
 for (bb = bbList; bb != NULL; bb = bb->next)
     {
     bbiCachedChromLookup(bbi, bb->chromId, lastChromId, chromName, sizeof(chromName));
 
     lastChromId=bb->chromId;
     bigBedIntervalToRow(bb, chromName, startBuf, endBuf, bedRow, 4);
     if (showEvery || sameString(bedRow[3], item))
 	{
         char *cdsStr, *seq;
         struct psl *psl= getPslAndSeq(tdb, chromName, bb, seqTypeField, &seq, &cdsStr);
         slAddHead(&pslList, psl);
@@ -6678,178 +6601,82 @@
 if (end != 0 && differentString(chrom,"0") && isNotEmpty(chrom))
     {
     printf("<B>Position:</B> "
            "<A HREF=\"%s&db=%s&position=%s%%3A%d-%d\">",
                   hgTracksPathAndSettings(), database, chrom, start+1, end);
     printf("%s:%d-%d</A><BR>\n", chrom, start+1, end);
     }
 
 gbWarnFree(&gbWarn);
 sqlFreeResult(&sr);
 dyStringFree(&dy);
 hFreeConn(&conn);
 hFreeConn(&conn2);
 }
 
-
-void printLuckyRedirect(char *browserUrl, struct psl *psl, char *database, boolean empty)
-/* Print out a very short page that redirects us. */
-{
-
-char url[1024];
-
-if (empty)
-    safef(url, sizeof(url), "%s?db=%s",
-      browserUrl, database); 
-else
-    safef(url, sizeof(url), "%s?position=%s:%d-%d&db=%s",
-      browserUrl, psl->tName, psl->tStart + 1, psl->tEnd, database); 
-
-/* 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("<noscript>No javascript support:<br>Click <a href='%s'>here</a> for browser.</noscript>\n", url);
-htmlEnd();
-
-}
-
-
 static boolean isPslToPrintByClick(struct psl *psl, int startFirst, boolean isClicked)
 /* Determine if a psl should be printed based on if it was or was not the one that was clicked
  * on.
  */
 {
 return ((psl->tStart == startFirst) && sameString(psl->tName, seqName)) == isClicked;
 }
 
 void printAlignmentsSimple(struct psl *pslList, int startFirst, char *hgcCommand,
                            char *tableName, char *itemIn)
 /* Print list of mRNA alignments, don't add extra textual link when
  * doesn't honor hgcCommand. */
 {
 struct psl *psl;
 int aliCount = slCount(pslList);
 boolean isClicked;
 if (pslList == NULL || tableName == NULL)
     return;
 boolean showEvery = sameString(itemIn, "PrintAllSequences");
 
-
-boolean feelingLucky = cgiOptionalString("feelingLucky") != NULL;
-if (feelingLucky)
-    {
-    // If we found something jump browser to there. 
-    if(slCount(pslList) > 0)
-	printLuckyRedirect(hgTracksPathAndSettings(), pslList, database, FALSE);
-    // Otherwise call ourselves again not feeling lucky to print empty results. 
-    else 
-	{ 
-	printLuckyRedirect(hgTracksPathAndSettings(), pslList, database, TRUE);
-	}
-    }
-
 if (!showEvery && (aliCount > 1))
     printf("The alignment you clicked on is first in the table below.<BR>\n");
 
-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 = "<svg style='height:10px; padding-left:2px' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d='M320 0c-17.7 0-32 14.3-32 32s14.3 32 32 32h82.7L201.4 265.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L448 109.3V192c0 17.7 14.3 32 32 32s32-14.3 32-32V32c0-17.7-14.3-32-32-32H320zM80 32C35.8 32 0 67.8 0 112V432c0 44.2 35.8 80 80 80H400c44.2 0 80-35.8 80-80V320c0-17.7-14.3-32-32-32s-32 14.3-32 32V432c0 8.8-7.2 16-16 16H80c-8.8 0-16-7.2-16-16V112c0-8.8 7.2-16 16-16H192c17.7 0 32-14.3 32-32s-14.3-32-32-32H80z'/></svg>";
 printf("<PRE><TT>");
-
-
-// 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, strlen("QUERY"));
-
-printf("BROWSER           |");
-printf(" SIZE IDENTITY  ");
 if (startsWith("chr", pslList->tName))
-    {
-    maxTChromNameSize = max(maxTChromNameSize, strlen("CHROMOSOME"));
-    spaceOut(stdout, maxTChromNameSize - strlen("CHROMOSOME"));
-    printf("CHROMOSOME");
-    }
+    printf("BROWSER | SIZE IDENTITY CHROMOSOME  STRAND    START     END              QUERY      START  END  TOTAL\n");
 else
-    {
-    maxTChromNameSize = max(maxTChromNameSize, strlen("SCAFFOLD"));
-    spaceOut(stdout, maxTChromNameSize - strlen("SCAFFOLD"));
-    printf("SCAFFOLD");
-    }
-printf(" STRAND     START      END   ");
-spaceOut(stdout, maxQChromNameSize - strlen("QUERY"));
-printf("QUERY");
-printf(" START  END  TOTAL\n");
-
-printf("--------------------------------------------------------------------------------------------");
-repeatCharOut(stdout, '-', maxQChromNameSize - 5);
-repeatCharOut(stdout, '-', maxTChromNameSize - 5);
-printf("\n");
-
-char fmt[256];
-safef(fmt, sizeof fmt, "%%5d  %%5.1f%%%%  %%%ds     %%s %%9d %%9d  %%%ds %%5d %%5d %%5d", maxTChromNameSize, maxQChromNameSize);
-
+    printf("BROWSER | SIZE IDENTITY  SCAFFOLD   STRAND    START     END              QUERY      START  END  TOTAL\n");
+printf("-----------------------------------------------------------------------------------------------------\n");
 for (isClicked = 1; isClicked >= 0; isClicked -= 1)
     {
     for (psl = pslList; psl != NULL; psl = psl->next)
 	{
 	if (isPslToPrintByClick(psl, startFirst, isClicked))
 	    {
             char otherString[512];
             char *qName = itemIn;
             if (sameString(itemIn, "PrintAllSequences"))
                 qName = psl->qName;
 	    safef(otherString, sizeof(otherString), "%d&aliTable=%s", psl->tStart, tableName);
-            printf("<A TITLE='%s' HREF=\"%s&db=%s&position=%s%%3A%d-%d\">browser</A> ",
-                   browserHelp, hgTracksPathAndSettings(), database, psl->tName, psl->tStart+1, psl->tEnd);
-
-            printf("<A TITLE='%s' HREF=\"%s&db=%s&position=%s%%3A%d-%d\" TARGET=_BLANK>new tab%s</A> | ",
-                   helpText, hgTracksPathAndSettings(), database, psl->tName, psl->tStart+1, psl->tEnd, icon);
-
+            printf("<A HREF=\"%s&db=%s&position=%s%%3A%d-%d\">browser</A> | ",
+                   hgTracksPathAndSettings(), database, psl->tName, psl->tStart+1, psl->tEnd);
 	    if (psl->qSize <= MAX_DISPLAY_QUERY_SEQ_SIZE) // Only anchor if small enough 
 		hgcAnchorWindow(hgcCommand, qName, psl->tStart, psl->tEnd, otherString, psl->tName);
             char *displayChromName = chromAliasGetDisplayChrom(database, cart, psl->tName);
-	    printf(fmt,
+	    printf("%5d  %5.1f%%  %9s     %s %9d %9d  %20s %5d %5d %5d",
 		   psl->match + psl->misMatch + psl->repMatch,
 		   100.0 - pslCalcMilliBad(psl, TRUE) * 0.1,
 		   skipChr(displayChromName), psl->strand, psl->tStart + 1, psl->tEnd,
 		   psl->qName, psl->qStart+1, psl->qEnd, psl->qSize);
 	    if (psl->qSize <= MAX_DISPLAY_QUERY_SEQ_SIZE)
 	        printf("</A>");
-	    
-	    // if you modify this, also modify hgPcr.c:doQuery, which implements a similar feature
-	    char *seq = psl->tName;
-	    if (endsWith(seq, "_fix"))
-		printf("   <A target=_blank HREF=\"../FAQ/FAQdownloads.html#downloadFix\">What is chrom_fix?</A>");
-	    else if (endsWith(seq, "_alt"))
-		printf("   <A target=_blank HREF=\"../FAQ/FAQdownloads.html#downloadAlt\">What is chrom_alt?</A>");
-	    else if (endsWith(seq, "_random"))
-		printf("   <A target=_blank HREF=\"../FAQ/FAQdownloads.html#download10\">What is chrom_random?</A>");
-	    else if (startsWith(seq, "chrUn"))
-		printf("   <A target=_blank HREF=\"../FAQ/FAQdownloads.html#download11\">What is a chrUn sequence?</A>");
-
 	    printf("\n");
 	    }
 	}
     }
 printf("</TT></PRE>");
 }
 
 void printAlignmentsExtra(struct psl *pslList, int startFirst, char *hgcCommand, char *hgcCommandInWindow,
 		     char *tableName, char *itemIn)
 /* Print list of mRNA alignments with special "in window" alignment function. */
 {
 if (pslList == NULL || tableName == NULL)
     return;
 printAlignmentsSimple(pslList, startFirst, hgcCommand, tableName, itemIn);
 
@@ -22607,38 +22434,38 @@
     if (wordCount > 1)
 	num = atoi(words[1]);
     if (num < 3) num = 3;
     footPrinterSampleClick(conn, tdb, item, start, num);
     }
 printTrackHtml(tdb);
 freez(&dupe);
 hFreeConn(&conn);
 }
 
 void bigPslHandlingCtAndGeneric(struct sqlConnection *conn, struct trackDb *tdb,
                      char *item, int start, int end)
 /* Special option to show all alignments for blat ct psl */
 {
 
-if (startsWith("ct_blat", tdb->track) && (!(sameString(item,"PrintAllSequences") || sameString(item,"buildBigPsl"))))
+if (startsWith("ct_blat", tdb->track) && !sameString(item,"PrintAllSequences"))
     printf("<A href id='genericPslShowAllLink'>Show All</A>\n");
 
 printf("<div id=genericPslShowItem style='display: block'>\n");
 genericBigPslClick(NULL, tdb, item, start, end);
 printf("</div>\n");
 
-if (startsWith("ct_blat", tdb->track) && (!(sameString(item,"PrintAllSequences") || sameString(item,"buildBigPsl"))))
+if (startsWith("ct_blat", tdb->track) && !sameString(item,"PrintAllSequences"))
     {
     printf("<div id=genericPslShowAll style='display: none'>\n");
     genericBigPslClick(NULL, tdb, "PrintAllSequences", start, end);
 
     printf("</div>\n");
 
     jsInline("$('#genericPslShowAllLink').click(function(){\n"
 	    "  $('#genericPslShowAll')[0].style.display = 'block';\n"
 	    "  $('#genericPslShowItem')[0].style.display = 'none';\n"
 	    "  $('#genericPslShowAllLink')[0].style.display = 'none';\n"
 	    "return false;\n"
 	    "});\n");
     }
 }
 
@@ -22648,31 +22475,31 @@
 char *fileName, *itemName;
 struct customTrack *ctList = getCtList();
 struct customTrack *ct;
 struct bed *bed = (struct bed *)NULL;
 int start = cartInt(cart, "o");
 int end = cartInt(cart, "t");
 char *item = cartString(cart, "i");
 char *type;
 fileName = nextWord(&fileItem);
 for (ct = ctList; ct != NULL; ct = ct->next)
     if (sameString(trackId, ct->tdb->track))
 	break;
 if (ct == NULL)
     errAbort("Couldn't find '%s' in '%s'", trackId, fileName);
 type = ct->tdb->type;
-cartWebStart(cart, database, "Custom Track: %s (%s) %s ",  trackHubSkipHubName(organism), trackHubSkipHubName(database), ct->tdb->shortLabel);
+cartWebStart(cart, database, "Custom Track: %s", ct->tdb->shortLabel);
 itemName = skipLeadingSpaces(fileItem);
 printf("<H2>%s</H2>\n", ct->tdb->longLabel);
 if (sameWord(type, "array"))
     doExpRatio(ct->tdb, fileItem, ct);
 else if ( startsWith( "longTabix", type))
     doLongTabix(ct->tdb, item);
 else if (sameWord(type, "encodePeak"))
     doEncodePeak(ct->tdb, ct, fileName);
 else if (sameWord(type, "bigNarrowPeak"))
     doBigEncodePeak(ct->tdb, NULL, item);
 else if (sameWord(type, "bigWig"))
     bigWigCustomClick(ct->tdb);
 else if (sameWord(type, "bigChain"))
     genericChainClick(NULL, ct->tdb, item, start, "seq");
 else if (sameWord(type, "bigPsl"))
@@ -26761,31 +26588,31 @@
 boolean isProt = cgiOptionalString("isProt") != NULL;
 char *customTextTemplate = "track type=bigPsl indelDoubleInsert=on indelQueryInsert=on pslFile=%s visibility=pack showAll=on htmlUrl=http://%s/goldenPath/help/hgUserPsl.html %s bigDataUrl=%s name=\"%s\" description=\"%s\" colorByStrand=\"0,0,0 0,0,150\" mouseOver=\"${oChromStart}-${oChromEnd} of ${oChromSize} bp, strand ${oStrand}\"\n";  
 char *extraForMismatch = "indelPolyA=on showDiffBasesAllScales=. baseColorUseSequence=lfExtra baseColorDefault=diffBases";
   
 if (isProt)
     extraForMismatch = "";
 char buffer[4096];
 safef(buffer, sizeof buffer, customTextTemplate, bigBedTn.forCgi, host, extraForMismatch, bigBedTn.forCgi, trackName, trackDescription);
 
 struct customTrack *ctList = getCtList();
 struct customTrack *newCts = customFactoryParse(database, buffer, FALSE, NULL, NULL);
 theCtList = customTrackAddToList(ctList, newCts, NULL, FALSE);
 
 customTracksSaveCart(database, cart, theCtList);
 
-cartSetString(cart, "i", "buildBigPsl");
+cartSetString(cart, "i", "PrintAllSequences");
 hgCustom(newCts->tdb->track, NULL);
 }
 
 void doHPRCTable(struct trackDb *tdb, char *itemName)
 /* Put up a generic bigBed details page, with a table of links to turn on related
  *  * chain tracks with visibility toggles */
 {
 int start = cartInt(cart, "o");
 int end = cartInt(cart, "t");
 genericHeader(tdb, itemName);
 genericBigBedClick(NULL, tdb, itemName, start, end, 0);
 printTrackHtml(tdb);
 // tell the javscript to reorganize the column of assemblies:
 jsIncludeFile("hgc.js", NULL);
 jsInlineF("var doHPRCTable = true;\n");