cc23b76a1f2c7dc6a29c227661bfb0ce4d20eb54
lrnassar
Fri Sep 4 13:43:48 2026 -0700
BLAT page polish from QA: Load example button, corrected input limits, wording fixes. refs #37996
Load example is a chip-style button with a mouseover instead of a hyperlink. Removed the
Show input limits modal; corrected the limits in hgTracksHelp.html, stale since 2013 (DNA is
75,000 bases per sequence and 187,500 combined, protein and translated 10,000 and 25,000),
added a #blatLimits anchor and pointed the two over-limit BLAT warnings and the form at it.
Genome selector: section title Target assembly, type-to-search hint in the dropdown,
Shortcuts: label, input and Query type select sized to match. Similar tools sidebar uses
house-style hyphens and corrects the findMotif name and description. Share and rename text
now states link lifetimes accurately (snapshot links last years, only sessions are
permanent). Alignment page buttons match .gbPill, summary strip spacing fixed, New BLAT
search button demoted from primary. Documents blatResultsGroup in ex.hg.conf.
diff --git src/hg/hgBlat/hgBlat.c src/hg/hgBlat/hgBlat.c
index 4b4d345c698..21b70c36e11 100644
--- src/hg/hgBlat/hgBlat.c
+++ src/hg/hgBlat/hgBlat.c
@@ -2354,55 +2354,59 @@
if (dbCount == 0 && issueBotWarning)
{
char *ip = getenv("REMOTE_ADDR");
botDelayMessage(ip, botDelayMillis);
}
if (++seqCount > maxSeqCount)
{
warn("More than %d input sequences, stopping at %s
(see also: cgi-bin/hg.conf hgBlat.maxSequenceCount setting).",
maxSeqCount, seq->name);
break;
}
if (oneSize > maxSingleSize)
{
- warn("Sequence %s is %d letters long (max is %d), skipping",
+ warn("Sequence %s is %d letters long (max is %d), skipping. "
+ "See the "
+ "BLAT input limits for all limits and how to run larger jobs from the command line.",
seq->name, oneSize, maxSingleSize);
continue;
}
if (oneSize < minSuggested)
{
warn("Warning: Sequence %s is only %d letters long (%d is the recommended minimum).
"
"To search for short sequences in the browser window, use the Short Sequence Match track. "
"You can also use our commandline tool findMotifs "
"(see the utilities download page) to "
"search for sequences on the entire genome.
"
"For primers, you can use the In-silico PCR tool. In-silico PCR can search the entire genome or a set of "
"transcripts. In the latter case, it can find matches that straddle exon/intron boundaries.
"
"Contact us for additional help using BLAT or its related tools.",
seq->name, oneSize, minSuggested, cartSessionVarName(), cartSessionId(cart), database, cartSessionVarName(), cartSessionId(cart));
// we could use "continue;" here to actually enforce skipping,
// but let's give the short sequence a chance, it might work.
// minimum possible length = tileSize+stepSize, so mpl=16 for dna stepSize=5, mpl=10 for protein.
if (qIsProt && oneSize < 1) // protein does not tolerate oneSize==0
continue;
}
totalSize += oneSize;
if (totalSize > maxTotalSize)
{
- warn("Sequence %s would take us over the %d letter limit, stopping here.",
+ warn("Sequence %s would take us over the %d letter limit, stopping here. "
+ "See the "
+ "BLAT input limits for all limits and how to run larger jobs from the command line.",
seq->name, maxTotalSize);
break;
}
if (isTx)
{
gvo->reportTargetStrand = TRUE;
if (isTxTx)
{
if (allGenomes)
queryServer(serve->host, serve->port, db, seq, "transQuery", xType, TRUE, FALSE, FALSE, seqNumber,
serve->genomeDataDir);
else
{
gfAlignTransTrans(conn, serve->nibDir, seq, FALSE, 5, tFileCache, gvo, !txTxBoth);
@@ -2786,31 +2790,33 @@
sameString(cfgOptionDefault("blatOldTracks", "keep"), "delete"));
jsonWriteBoolean(jw, "keepResults", cartUsualBoolean(cart, "blatKeepResults", FALSE));
/* "Keep only last search" checkbox (RM #38086): the inverse framing - results accumulate by
* default (the current public behavior) and checking the box opts into removing earlier BLAT
* result tracks on each new search. Gated by its own hg.conf setting, independent of
* blatOldTracks above; hgc.c (buildBigPsl) is what acts on blatOnlyLatest. */
jsonWriteBoolean(jw, "showOnlyLatest",
sameString(cfgOptionDefault("blatOnlyLatestCheckbox", "off"), "on"));
jsonWriteBoolean(jw, "onlyLatest", cartUsualBoolean(cart, "blatOnlyLatest", FALSE));
/* The example is fetched on demand rather than inlined: it is a real 2.5 kb sequence, which would
* otherwise be embedded in every page load of the form just to serve the few users who click
* "Load example". The sequence is a window over two PTP4A3 exons that is also carried by an alt
* haplotype and a fix patch of chr8, so the results table shows the alt/fix rows and their
* explanatory icons rather than a single boring hit. */
jsonWriteString(jw, "exampleUrl", "../goldenPath/help/blatExample.fa");
-jsonWriteString(jw, "exampleLabel", "Load example - human PTP4A3 gene");
+jsonWriteString(jw, "exampleLabel", "Load example");
+jsonWriteString(jw, "exampleTitle", "Fill the box with an example query: "
+ "2.5 kb of the human PTP4A3 gene.");
/* Same "similar tools" links the classic page offered, so the sidebar isn't a set of dead links.
* These carry $DB$ rather than a baked-in db: picking a genome no longer reloads the page, so
* blatFormSetDb() re-expands them against the newly chosen assembly.
*
* Deliberately NOT gated on hgPcrOk() the way the classic form was. That test can only be made for
* the assembly the page happened to load with, so on a page where the genome can be changed without
* a round trip it goes stale immediately: loading on an assembly without a PCR server would hide
* these links for the rest of the session, even after switching to hg38. hgPcr reports an
* unsupported assembly perfectly well itself, so an occasionally-unsupported link beats a link that
* silently disappears. */
jsonWriteString(jw, "pcrUrlTpl", "../cgi-bin/hgPcr?db=$DB$");
jsonWriteStringf(jw, "oligoMatchUrlTpl", "hgTrackUi?%s=%s&db=$DB$&g=oligoMatch&oligoMatch=pack",
cartSessionVarName(), cartSessionId(cart));
/* Link back to the classic form. blatNewForm is a cart variable (defaulting to the hg.conf
* setting), so this is a per-user opt-out rather than a machine-wide switch. */