b5cbbe9353e85ec653bb18eee381c6989f529289 braney Sun Apr 12 12:21:24 2026 -0700 Show alternative chromosome names from chromAlias on hgTracks position line, refs #29201 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> diff --git src/hg/hgTracks/hgTracks.c src/hg/hgTracks/hgTracks.c index dd30ecafb77..10f38be4c45 100644 --- src/hg/hgTracks/hgTracks.c +++ src/hg/hgTracks/hgTracks.c @@ -8830,42 +8830,61 @@ // put the track download interface behind hg.conf control if (cfgOptionBooleanDefault("showDownloadUi", TRUE)) jsInline("var showDownloadButton = true;\n"); // remove the hg.conf option once this feature is released if (cfgOptionBooleanDefault("showIgv", FALSE)) { puts(" <button id='hgtIgv' type='button' " "title='Add an IGV.js window below the UCSC Browser, to open files from " "your local harddisk or server' >Add IGV Tracks</button>"); //jsInline("document.getElementById('hgtIgv').addEventListener('click', onIgvClick);"); } } -#ifdef NOTNOW -static void printAliases(char *name) -/* Print out the aliases for this sequence. */ +static void printAliases(char *nativeName, char *displayName) +/* Print out the alternative names for this sequence next to the position. */ { -struct slName *names = chromAliasFindAliases(name); +struct slName *aliases = chromAliasFindAliases(nativeName); +if (aliases == NULL) + return; -printf("<div id='aliases'><a title='"); -for(;names; names = names->next) - printf("%s;",names->name); -printf("'>Aliases</a></div>"); +// Build comma-separated list of aliases, skipping the display name and native name +struct dyString *dy = dyStringNew(256); +struct slName *a; +for (a = aliases; a != NULL; a = a->next) + { + if (isEmpty(a->name)) + continue; + if (sameString(a->name, displayName) || sameString(a->name, nativeName)) + continue; + if (dy->stringSize > 0) + dyStringAppend(dy, ", "); + dyStringAppend(dy, a->name); + } + +if (dy->stringSize == 0) + { + dyStringFree(&dy); + return; + } + +printf("<span id='chromAliases' title='Also known as: %s'>" + "<a>ⓘ Aliases</a></span>", dy->string); +dyStringFree(&dy); } -#endif unsigned getParaLoadTimeout() // get the parallel load timeout in seconds (defaults to 90) { char *paraLoadTimeoutStr = cartOptionalString(cart, "parallelFetch.timeout"); if (paraLoadTimeoutStr == NULL) paraLoadTimeoutStr = cfgOptionDefault("parallelFetch.timeout", "90"); // wait up to default 90 seconds. unsigned paraLoadTimeout = sqlUnsigned(paraLoadTimeoutStr); return paraLoadTimeout; } static char *hubPublicEmailFromHubName(char *hubName) @@ -9639,31 +9658,32 @@ pressedClass = "pressed"; showVirtRegions = "show multi-region position ranges and "; } hPrintf("<span class='positionDisplay %s' id='positionDisplay' " "title='click to %s copy chromosome range to input box'>%s</span>", pressedClass, showVirtRegions, addCommasToPos(database, position)); hPrintf("<input type='hidden' name='position' id='position' value='%s'>\n", buf); sprintLongWithCommas(buf, virtWinEnd - virtWinStart); hPrintf(" <span id='size'>%s</span> bp. ", buf); hPrintf("<input class='positionInput' type='text' name='hgt.positionInput' id='positionInput'" " size='%d'>\n", multiRegionButtonTop ? 51 : 61); hWrites(" "); hButton("goButton", "Search"); printSearchHelpLink(); - // printAliases(displayChromName); + if (cfgOptionBooleanDefault("showAliases", FALSE) && sameString(virtModeType, "default")) + printAliases(chromName, virtChromName); printPatchNote(); if (!trackHubDatabase(database)) { jsonObjectAdd(jsonForClient, "assemblySupportsGeneSuggest", newJsonBoolean(assemblySupportsGeneSuggest(database))); if (assemblySupportsGeneSuggest(database)) hPrintf("<input type='hidden' name='hgt.suggestTrack' id='suggestTrack' value='%s'>\n", assemblyGeneSuggestTrack(database)); } // hg.conf controlled links // database-specific link: 2 hg.conf settings, format <db>_TopLink{Label} struct slName *dbLinks = cfgNamesWithPrefix(database);